<?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=Servo</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=Servo"/>
	<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/Special:Contributions/Servo"/>
	<updated>2026-05-30T02:06:06Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto_talk:Start_core_development&amp;diff=144765</id>
		<title>Howto talk:Start core development</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto_talk:Start_core_development&amp;diff=144765"/>
		<updated>2026-05-28T14:19:02Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* Duplicating docs.flightgear.org */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Open questions ==&lt;br /&gt;
* merge requests (post follow-up to mailing list and file review via issue tracker)&lt;br /&gt;
{{unsigned|12:46, 6 May 2012‎|Hooray}}&lt;br /&gt;
&lt;br /&gt;
== Planned improvements ==&lt;br /&gt;
* navigating the source trees (FG + SG)&lt;br /&gt;
* FG entry point (bootstrap.cxx)&lt;br /&gt;
* the FG main loop&lt;br /&gt;
* FG subsystems&lt;br /&gt;
* adding new fgcommands&lt;br /&gt;
* adding new network protocols&lt;br /&gt;
* adding new telnet/props commands&lt;br /&gt;
* adding new startup options (options.cxx)&lt;br /&gt;
* adding new subsystems&lt;br /&gt;
* networking&lt;br /&gt;
* scripting&lt;br /&gt;
* GUI code&lt;br /&gt;
* instruments&lt;br /&gt;
* list of FG related projects (URLs, type of software)&lt;br /&gt;
* list of FG related websites&lt;br /&gt;
* list of FG related people (i.e. developers)&lt;br /&gt;
* gdb, valgrind, gprof, gcov&lt;br /&gt;
{{unsigned|15:48, 3 January - 01:27, 7 January 2012‎|Hooray}}&lt;br /&gt;
&lt;br /&gt;
== Use of &amp;quot;repo&amp;quot; links in wiki pages. ==&lt;br /&gt;
&lt;br /&gt;
I'm not sure there's much advantage to using the &amp;quot;repo&amp;quot; link system. It's an abstraction that protects us against something that happens extremely rarely (changing of the main git repositories) at the cost of an obscure macro-like thing in the wiki text. Personally i'm with the Python philosophy of &amp;quot;Explicit is better than implicit&amp;quot; in this case. Apart from anything else, the most likely change to repositories is not a simple move to different location, but a merging of flightgear and simgear into a single repository, for which the repo macro is useless. [[User:Cgdae|Cgdae]] ([[User talk:Cgdae|talk]]) 10:34, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
: It was agreed on by the people involved in updating the wiki after the last migration, and given that another migration is currently being discussed, it might not be such a bad idea. I do think that the existing macros could be adapted to reflect a merged repository (if the need arises). If in doubt, Johan and bugman were primarily involved in establishing these &amp;quot;link templates&amp;quot;, but it seemed other wiki admins were also convinced it's a good idea, here's the original context: http://wiki.flightgear.org/index.php?title=FlightGear_wiki:Village_pump&amp;amp;oldid=87148#Repository_link_templates  --[[User:Hooray|Hooray]] ([[User talk:Hooray|talk]]) 11:09, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
:: I manually did the large part of that migration myself.  The pain is insane!  The changes could not be scripted - my attempts ended in a large proportion of dead links.  There is too much variability and redundancy in the PHP query strings.  I dealt with something like 5000 dead gitorious links manually, one by one.  It took me weeks, and innumerable hours of work.  If there is another infrastructure change, now with the {{tl|repo link}} family of templates I can migrate all of those 5000 links within seconds.  Or if SourceForge, GitHub, GitLab, or the Gitorious archive change their URLs or PHP query string interface, I can fix all links within a single location.  In 20 years we will still have the wiki and we would probably have gone through one or two infrastructure migrations, just as we have been through 3 different infrastructures in the previous 20 years (Curt's CVS server, Gitorious, and SourceForge).  So there is a very big advantage for the long term viability of the wiki.&lt;br /&gt;
&lt;br /&gt;
:: A merged repository is also no problem for these templates.  Just as I experimented with creating that merged repository, I also looked into what is required for the templates, and this is trivial (either for a merged repository, a submodule, or a subtree).&lt;br /&gt;
&lt;br /&gt;
:: [[User:Bugman|Bugman]] ([[User talk:Bugman|talk]]) 16:32, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
::: Agreed, I am entirely with bugman on this ...wiki admins (and hosting providers) come and go, but we don't really have many people interested in doing such tedious work. In fact, I wish there were more people with the privileges that Simon and Gijs have, so this mediawiki installation itself could be better maintained here. For instance, these template are enormously helpful, but obviously it could really go a long way if such helper templates were properly integrated in the WYSIWYG editor/interface - this, and many similar requests have been made over the years, but were rarely implemented by our server admins. Thus, templates like these are a compromise obviously, but I'd rather use these than have no option at all. So, thank you bugman for all your work here !! (to be fair, {{Usr|Red Leader}} did have an instrumental role in the development of the original idea. --[[User:Hooray|Hooray]] ([[User talk:Hooray|talk]]) 16:40, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
:::: To be fair, you'd need to have seen it or looked at the {{tl|repo link}} history to know that I did some major work on that template. From its history it is clear that {{usr|Red Leader}} started these templates.  I only extended the family and the dealt with the direct and dead link Gitorious mess.&lt;br /&gt;
&lt;br /&gt;
:::: [[User:Bugman|Bugman]] ([[User talk:Bugman|talk]]) 16:55, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
Ok, fair enough, thanks everyone for explaining things.&lt;br /&gt;
&lt;br /&gt;
Is there more information about the repository links system somewhere? I couldn't see anything in [[Special:SpecialPages]] for example?&lt;br /&gt;
&lt;br /&gt;
[[User:Cgdae|Cgdae]] ([[User talk:Cgdae|talk]]) 05:22, 23 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
: Everything is reachable from [[:Category:Repository_link_templates]], and each template is documented.  Maybe the table in {{tl|Repo link/doc related}} could be better documented?&lt;br /&gt;
&lt;br /&gt;
: [[User:Bugman|Bugman]] ([[User talk:Bugman|talk]]) 05:27, 23 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
== YouTube playlist link not working ==&lt;br /&gt;
&lt;br /&gt;
Hi, I just found out that the link to the YouTube tutorial playlist doesn't work any more, as YouTube changed their playlist links and ID's: http://www.youtube.com/view_play_list?p=1D6727247CA35794. I also wasn't able to find the playlist on YouTube.&lt;br /&gt;
[[User:The FL3dd0x|The FL3dd0x]] ([[User talk:The FL3dd0x|talk]]) 13:12, 9 May 2021 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Duplicating docs.flightgear.org ==&lt;br /&gt;
&lt;br /&gt;
Hi Servo,&lt;br /&gt;
&lt;br /&gt;
Thanks for all the hard work you're doing on the wiki!&lt;br /&gt;
&lt;br /&gt;
In this case, I'd strongly discourage copying content from docs.flightgear.org to the wiki. The whole idea is that documentation like this is moved/rewritten to docs.flightgear.org, not the other way around. Having to maintain it in two places is a nightmare and undermines the goal of having a central docs repo.&lt;br /&gt;
&lt;br /&gt;
[[User:Gijs|Gijs]] ([[User talk:Gijs|talk]]) 12:50, 28 May 2026 (UTC)&lt;br /&gt;
&lt;br /&gt;
: oh, thanks. I just want to replace the out-of-date content.&lt;br /&gt;
&lt;br /&gt;
: [[User:Servo|Servo]] ([[User talk:Servo|talk]]) 14:18, 28 May 2026 (UTC)&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto_talk:Start_core_development&amp;diff=144764</id>
		<title>Howto talk:Start core development</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto_talk:Start_core_development&amp;diff=144764"/>
		<updated>2026-05-28T14:18:25Z</updated>

		<summary type="html">&lt;p&gt;Servo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Open questions ==&lt;br /&gt;
* merge requests (post follow-up to mailing list and file review via issue tracker)&lt;br /&gt;
{{unsigned|12:46, 6 May 2012‎|Hooray}}&lt;br /&gt;
&lt;br /&gt;
== Planned improvements ==&lt;br /&gt;
* navigating the source trees (FG + SG)&lt;br /&gt;
* FG entry point (bootstrap.cxx)&lt;br /&gt;
* the FG main loop&lt;br /&gt;
* FG subsystems&lt;br /&gt;
* adding new fgcommands&lt;br /&gt;
* adding new network protocols&lt;br /&gt;
* adding new telnet/props commands&lt;br /&gt;
* adding new startup options (options.cxx)&lt;br /&gt;
* adding new subsystems&lt;br /&gt;
* networking&lt;br /&gt;
* scripting&lt;br /&gt;
* GUI code&lt;br /&gt;
* instruments&lt;br /&gt;
* list of FG related projects (URLs, type of software)&lt;br /&gt;
* list of FG related websites&lt;br /&gt;
* list of FG related people (i.e. developers)&lt;br /&gt;
* gdb, valgrind, gprof, gcov&lt;br /&gt;
{{unsigned|15:48, 3 January - 01:27, 7 January 2012‎|Hooray}}&lt;br /&gt;
&lt;br /&gt;
== Use of &amp;quot;repo&amp;quot; links in wiki pages. ==&lt;br /&gt;
&lt;br /&gt;
I'm not sure there's much advantage to using the &amp;quot;repo&amp;quot; link system. It's an abstraction that protects us against something that happens extremely rarely (changing of the main git repositories) at the cost of an obscure macro-like thing in the wiki text. Personally i'm with the Python philosophy of &amp;quot;Explicit is better than implicit&amp;quot; in this case. Apart from anything else, the most likely change to repositories is not a simple move to different location, but a merging of flightgear and simgear into a single repository, for which the repo macro is useless. [[User:Cgdae|Cgdae]] ([[User talk:Cgdae|talk]]) 10:34, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
: It was agreed on by the people involved in updating the wiki after the last migration, and given that another migration is currently being discussed, it might not be such a bad idea. I do think that the existing macros could be adapted to reflect a merged repository (if the need arises). If in doubt, Johan and bugman were primarily involved in establishing these &amp;quot;link templates&amp;quot;, but it seemed other wiki admins were also convinced it's a good idea, here's the original context: http://wiki.flightgear.org/index.php?title=FlightGear_wiki:Village_pump&amp;amp;oldid=87148#Repository_link_templates  --[[User:Hooray|Hooray]] ([[User talk:Hooray|talk]]) 11:09, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
:: I manually did the large part of that migration myself.  The pain is insane!  The changes could not be scripted - my attempts ended in a large proportion of dead links.  There is too much variability and redundancy in the PHP query strings.  I dealt with something like 5000 dead gitorious links manually, one by one.  It took me weeks, and innumerable hours of work.  If there is another infrastructure change, now with the {{tl|repo link}} family of templates I can migrate all of those 5000 links within seconds.  Or if SourceForge, GitHub, GitLab, or the Gitorious archive change their URLs or PHP query string interface, I can fix all links within a single location.  In 20 years we will still have the wiki and we would probably have gone through one or two infrastructure migrations, just as we have been through 3 different infrastructures in the previous 20 years (Curt's CVS server, Gitorious, and SourceForge).  So there is a very big advantage for the long term viability of the wiki.&lt;br /&gt;
&lt;br /&gt;
:: A merged repository is also no problem for these templates.  Just as I experimented with creating that merged repository, I also looked into what is required for the templates, and this is trivial (either for a merged repository, a submodule, or a subtree).&lt;br /&gt;
&lt;br /&gt;
:: [[User:Bugman|Bugman]] ([[User talk:Bugman|talk]]) 16:32, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
::: Agreed, I am entirely with bugman on this ...wiki admins (and hosting providers) come and go, but we don't really have many people interested in doing such tedious work. In fact, I wish there were more people with the privileges that Simon and Gijs have, so this mediawiki installation itself could be better maintained here. For instance, these template are enormously helpful, but obviously it could really go a long way if such helper templates were properly integrated in the WYSIWYG editor/interface - this, and many similar requests have been made over the years, but were rarely implemented by our server admins. Thus, templates like these are a compromise obviously, but I'd rather use these than have no option at all. So, thank you bugman for all your work here !! (to be fair, {{Usr|Red Leader}} did have an instrumental role in the development of the original idea. --[[User:Hooray|Hooray]] ([[User talk:Hooray|talk]]) 16:40, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
:::: To be fair, you'd need to have seen it or looked at the {{tl|repo link}} history to know that I did some major work on that template. From its history it is clear that {{usr|Red Leader}} started these templates.  I only extended the family and the dealt with the direct and dead link Gitorious mess.&lt;br /&gt;
&lt;br /&gt;
:::: [[User:Bugman|Bugman]] ([[User talk:Bugman|talk]]) 16:55, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
Ok, fair enough, thanks everyone for explaining things.&lt;br /&gt;
&lt;br /&gt;
Is there more information about the repository links system somewhere? I couldn't see anything in [[Special:SpecialPages]] for example?&lt;br /&gt;
&lt;br /&gt;
[[User:Cgdae|Cgdae]] ([[User talk:Cgdae|talk]]) 05:22, 23 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
: Everything is reachable from [[:Category:Repository_link_templates]], and each template is documented.  Maybe the table in {{tl|Repo link/doc related}} could be better documented?&lt;br /&gt;
&lt;br /&gt;
: [[User:Bugman|Bugman]] ([[User talk:Bugman|talk]]) 05:27, 23 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
== YouTube playlist link not working ==&lt;br /&gt;
&lt;br /&gt;
Hi, I just found out that the link to the YouTube tutorial playlist doesn't work any more, as YouTube changed their playlist links and ID's: http://www.youtube.com/view_play_list?p=1D6727247CA35794. I also wasn't able to find the playlist on YouTube.&lt;br /&gt;
[[User:The FL3dd0x|The FL3dd0x]] ([[User talk:The FL3dd0x|talk]]) 13:12, 9 May 2021 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Duplicating docs.flightgear.org ==&lt;br /&gt;
&lt;br /&gt;
Hi Servo,&lt;br /&gt;
&lt;br /&gt;
Thanks for all the hard work you're doing on the wiki!&lt;br /&gt;
&lt;br /&gt;
In this case, I'd strongly discourage copying content from docs.flightgear.org to the wiki. The whole idea is that documentation like this is moved/rewritten to docs.flightgear.org, not the other way around. Having to maintain it in two places is a nightmare and undermines the goal of having a central docs repo.&lt;br /&gt;
&lt;br /&gt;
[[User:Gijs|Gijs]] ([[User talk:Gijs|talk]]) 12:50, 28 May 2026 (UTC)&lt;br /&gt;
&lt;br /&gt;
: oh, thanks. I just want to replace the out-of-date content.&lt;br /&gt;
&lt;br /&gt;
: 14:18, 28 May 2026 (UTC)&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto_talk:Start_core_development&amp;diff=144763</id>
		<title>Howto talk:Start core development</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto_talk:Start_core_development&amp;diff=144763"/>
		<updated>2026-05-28T14:09:18Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* Duplicating docs.flightgear.org */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Open questions ==&lt;br /&gt;
* merge requests (post follow-up to mailing list and file review via issue tracker)&lt;br /&gt;
{{unsigned|12:46, 6 May 2012‎|Hooray}}&lt;br /&gt;
&lt;br /&gt;
== Planned improvements ==&lt;br /&gt;
* navigating the source trees (FG + SG)&lt;br /&gt;
* FG entry point (bootstrap.cxx)&lt;br /&gt;
* the FG main loop&lt;br /&gt;
* FG subsystems&lt;br /&gt;
* adding new fgcommands&lt;br /&gt;
* adding new network protocols&lt;br /&gt;
* adding new telnet/props commands&lt;br /&gt;
* adding new startup options (options.cxx)&lt;br /&gt;
* adding new subsystems&lt;br /&gt;
* networking&lt;br /&gt;
* scripting&lt;br /&gt;
* GUI code&lt;br /&gt;
* instruments&lt;br /&gt;
* list of FG related projects (URLs, type of software)&lt;br /&gt;
* list of FG related websites&lt;br /&gt;
* list of FG related people (i.e. developers)&lt;br /&gt;
* gdb, valgrind, gprof, gcov&lt;br /&gt;
{{unsigned|15:48, 3 January - 01:27, 7 January 2012‎|Hooray}}&lt;br /&gt;
&lt;br /&gt;
== Use of &amp;quot;repo&amp;quot; links in wiki pages. ==&lt;br /&gt;
&lt;br /&gt;
I'm not sure there's much advantage to using the &amp;quot;repo&amp;quot; link system. It's an abstraction that protects us against something that happens extremely rarely (changing of the main git repositories) at the cost of an obscure macro-like thing in the wiki text. Personally i'm with the Python philosophy of &amp;quot;Explicit is better than implicit&amp;quot; in this case. Apart from anything else, the most likely change to repositories is not a simple move to different location, but a merging of flightgear and simgear into a single repository, for which the repo macro is useless. [[User:Cgdae|Cgdae]] ([[User talk:Cgdae|talk]]) 10:34, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
: It was agreed on by the people involved in updating the wiki after the last migration, and given that another migration is currently being discussed, it might not be such a bad idea. I do think that the existing macros could be adapted to reflect a merged repository (if the need arises). If in doubt, Johan and bugman were primarily involved in establishing these &amp;quot;link templates&amp;quot;, but it seemed other wiki admins were also convinced it's a good idea, here's the original context: http://wiki.flightgear.org/index.php?title=FlightGear_wiki:Village_pump&amp;amp;oldid=87148#Repository_link_templates  --[[User:Hooray|Hooray]] ([[User talk:Hooray|talk]]) 11:09, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
:: I manually did the large part of that migration myself.  The pain is insane!  The changes could not be scripted - my attempts ended in a large proportion of dead links.  There is too much variability and redundancy in the PHP query strings.  I dealt with something like 5000 dead gitorious links manually, one by one.  It took me weeks, and innumerable hours of work.  If there is another infrastructure change, now with the {{tl|repo link}} family of templates I can migrate all of those 5000 links within seconds.  Or if SourceForge, GitHub, GitLab, or the Gitorious archive change their URLs or PHP query string interface, I can fix all links within a single location.  In 20 years we will still have the wiki and we would probably have gone through one or two infrastructure migrations, just as we have been through 3 different infrastructures in the previous 20 years (Curt's CVS server, Gitorious, and SourceForge).  So there is a very big advantage for the long term viability of the wiki.&lt;br /&gt;
&lt;br /&gt;
:: A merged repository is also no problem for these templates.  Just as I experimented with creating that merged repository, I also looked into what is required for the templates, and this is trivial (either for a merged repository, a submodule, or a subtree).&lt;br /&gt;
&lt;br /&gt;
:: [[User:Bugman|Bugman]] ([[User talk:Bugman|talk]]) 16:32, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
::: Agreed, I am entirely with bugman on this ...wiki admins (and hosting providers) come and go, but we don't really have many people interested in doing such tedious work. In fact, I wish there were more people with the privileges that Simon and Gijs have, so this mediawiki installation itself could be better maintained here. For instance, these template are enormously helpful, but obviously it could really go a long way if such helper templates were properly integrated in the WYSIWYG editor/interface - this, and many similar requests have been made over the years, but were rarely implemented by our server admins. Thus, templates like these are a compromise obviously, but I'd rather use these than have no option at all. So, thank you bugman for all your work here !! (to be fair, {{Usr|Red Leader}} did have an instrumental role in the development of the original idea. --[[User:Hooray|Hooray]] ([[User talk:Hooray|talk]]) 16:40, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
:::: To be fair, you'd need to have seen it or looked at the {{tl|repo link}} history to know that I did some major work on that template. From its history it is clear that {{usr|Red Leader}} started these templates.  I only extended the family and the dealt with the direct and dead link Gitorious mess.&lt;br /&gt;
&lt;br /&gt;
:::: [[User:Bugman|Bugman]] ([[User talk:Bugman|talk]]) 16:55, 22 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
Ok, fair enough, thanks everyone for explaining things.&lt;br /&gt;
&lt;br /&gt;
Is there more information about the repository links system somewhere? I couldn't see anything in [[Special:SpecialPages]] for example?&lt;br /&gt;
&lt;br /&gt;
[[User:Cgdae|Cgdae]] ([[User talk:Cgdae|talk]]) 05:22, 23 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
: Everything is reachable from [[:Category:Repository_link_templates]], and each template is documented.  Maybe the table in {{tl|Repo link/doc related}} could be better documented?&lt;br /&gt;
&lt;br /&gt;
: [[User:Bugman|Bugman]] ([[User talk:Bugman|talk]]) 05:27, 23 November 2020 (EST)&lt;br /&gt;
&lt;br /&gt;
== YouTube playlist link not working ==&lt;br /&gt;
&lt;br /&gt;
Hi, I just found out that the link to the YouTube tutorial playlist doesn't work any more, as YouTube changed their playlist links and ID's: http://www.youtube.com/view_play_list?p=1D6727247CA35794. I also wasn't able to find the playlist on YouTube.&lt;br /&gt;
[[User:The FL3dd0x|The FL3dd0x]] ([[User talk:The FL3dd0x|talk]]) 13:12, 9 May 2021 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Duplicating docs.flightgear.org ==&lt;br /&gt;
&lt;br /&gt;
Hi Servo,&lt;br /&gt;
&lt;br /&gt;
Thanks for all the hard work you're doing on the wiki!&lt;br /&gt;
&lt;br /&gt;
In this case, I'd strongly discourage copying content from docs.flightgear.org to the wiki. The whole idea is that documentation like this is moved/rewritten to docs.flightgear.org, not the other way around. Having to maintain it in two places is a nightmare and undermines the goal of having a central docs repo.&lt;br /&gt;
&lt;br /&gt;
[[User:Gijs|Gijs]] ([[User talk:Gijs|talk]]) 12:50, 28 May 2026 (UTC)&lt;br /&gt;
&lt;br /&gt;
oh, thanks. I just want to replace the out-of-date content.&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Volunteer&amp;diff=144760</id>
		<title>Volunteer</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Volunteer&amp;diff=144760"/>
		<updated>2026-05-28T08:05:13Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* Check out the Discord server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Volunteer Intro}}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
=== Screenshots ===&lt;br /&gt;
Another easy way for getting started contributing is to create nice FlightGear screenshots. You can upload these to the wiki where they can then be used to illustrate articles and to highlight articles via the [[:Category:Picture of the week|picture of the week]] on the main page.&lt;br /&gt;
&lt;br /&gt;
[[Howto: Make nice screenshots]] provides some tips on how to create stunning shots, while [[Help:Upload]] discusses how to upload screenshots to the wiki.&lt;br /&gt;
&lt;br /&gt;
=== Videos ===&lt;br /&gt;
Many users like to capture their flights in FlightGear as a video, [[YouTube channels|YouTube]] for example is an excellent way for sharing such videos with fellow FlightGear users. YouTube videos can also be directly embedded in forum postings and wiki articles.&lt;br /&gt;
&lt;br /&gt;
=== Screencasts (video tutorials) ===&lt;br /&gt;
Creating FlightGear related video tutorials is another excellent way for getting started contributing. &lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
{{forum|72|FlightGear Documentation}}&lt;br /&gt;
&lt;br /&gt;
=== FAQ-Maintainers ===&lt;br /&gt;
The FlightGear project is looking for people who are willing to help maintain the FAQ which, given the constant development of the project, is chronically out of date. If you you would like to get involved, follow the {{forum link|text=forum}} to stay current on the latest news, problems, and of course on what questions are asked more frequently, and simply start editing the [[FAQ|wiki FAQ]].&lt;br /&gt;
&lt;br /&gt;
=== Maintaining the wiki ===&lt;br /&gt;
You can easily [[Special:UserLogin|register an account]] and help [[Portal:Wiki|improve the wiki]], and provide your help in reviewing articles, fixing their look and readability, updating them and adding what you think is missing, for example many articles could be greatly improved just by adding a handful of relevant screenshots for illustration purposes. Proof reading of existing articles is also greatly appreciated. &lt;br /&gt;
&lt;br /&gt;
Registering takes less than a minute. After registration, you'll have to confirm your registration by clicking on the link sent to you by email.&lt;br /&gt;
&lt;br /&gt;
=== Translating the wiki and FlightGear ===&lt;br /&gt;
You can also help localize the wiki by [[Help:Translate|translating]] important articles into different languages. Please see the [[translation requests]].&lt;br /&gt;
&lt;br /&gt;
Also, FlightGear itself can be easily translated by updating the files in [[$FG_ROOT]]/Translations. For details please see [[Howto: Translate FlightGear|Translating FlightGear]].&lt;br /&gt;
&lt;br /&gt;
=== Wiki article writers ===&lt;br /&gt;
Various aspects of FlightGear are currently not yet sufficiently documented, and available documentation is often not really suitable to be used by non-developers. This results in users being unaware of the wide range of features and possibilities that FlightGear supports already. &lt;br /&gt;
&lt;br /&gt;
As an &amp;quot;article writer&amp;quot; you should be able to document your own experiences with FlightGear in a clear and concise [[FlightGear wiki:Manual of Style|style]], so that others can easily follow your instructions in order to make use of the less known features of FlightGear. These articles don't need to be very comprehensive, they shall only provide users with easy to follow instructions on how to achieve something, and possibly some caveats and hints.&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Volunteer: Writing]]&lt;br /&gt;
&lt;br /&gt;
=== Contributing to the manual ===&lt;br /&gt;
The wiki is not the only documentation here, of course. FlightGear comes with a set of illustrated documentation, notably [[FlightGear Manual|&amp;quot;The Manual&amp;quot;]]. If you are skilled and a little bit familiar with LaTex, your help would be really welcome. More on this at the [[manual]] wiki page. You'll find the source code in the {{getstart source|text=Getstart repository}}.&lt;br /&gt;
&lt;br /&gt;
=== Documentation Editors/Reviewers ===&lt;br /&gt;
{{Main article|Howto:Write a FlightGear Review}}&lt;br /&gt;
The documentation that comes with FlightGear base package might be inaccurate (outdated) due to the advances in FlightGear's code. You can check the current documentation and identify areas for improvement, by directly making corresponding suggestions for augmentations, or even writing new help documents altogether, while staying current with the mailing list.&lt;br /&gt;
&lt;br /&gt;
Smaller corrections shall be sent by email to the developer mailing list, preferably in unified diff format (for patch to work). Alternatively, small text files can also be sent directly to the mailing list, more complex modifications should be only made available by uploading them to a webpage and linking to the corresponding files from your emails.&lt;br /&gt;
&lt;br /&gt;
If you intend to redo a major part of the current documentation, first discuss this with the developers, to avoid documenting code that may also be under development or deprecation.&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
=== Creating interactive tutorials ===&lt;br /&gt;
FlightGear has a built-in [[Tutorials|tutorial]] system that is based on its scripting language [[Nasal]], this system is very flexible and can be used for creating interactive tutorials (or even missions) for use in FlightGear itself, in other words these tutorials run directly in the simulator. &lt;br /&gt;
&lt;br /&gt;
Creating new tutorials, or updating and improving existing ones, is another great way for getting more familiar with FlightGear. For details please see [[Tutorials]].&lt;br /&gt;
&lt;br /&gt;
=== Providing patches for aircraft's -set.xml status fields ===&lt;br /&gt;
One way you could easily contribute would be to submit patches to HEAD setting the &amp;quot;status&amp;quot; flag on each aircraft accurately. While it will require learning a bit about SCM, and XML, that would be a fine contribution. For a details on how the status should be arrived at see  [[Aircraft status indication]].&lt;br /&gt;
&lt;br /&gt;
=== Creating Scenery Models ===&lt;br /&gt;
The FlightGear project maintains a steadily growing repository of [http://scenemodels.flightgear.org 3D models] for adding some eye-candy to the scenery. The world has always enough room left for your [http://scenemodels.flightgear.org/contribute.php contribution]. Please take the time to investigate what is already there and enjoy populating your favourite area.&lt;br /&gt;
&lt;br /&gt;
Note that you don't have to create any models yourself. You can simply [[Howto: Place 3D objects with the UFO|place existing models using the UFO]]. For example, placing objects in the scenery with the [[UFO]] and submitting them to the database is pretty straightforward and takes very little time. Even an hour spent doing this makes a difference.&lt;br /&gt;
&lt;br /&gt;
If anyway you'd like to [[Modeling - Getting Started|test your modeling skills]], here some suggestions:&lt;br /&gt;
* We need people to go out and take good pictures of all the buildings at their local airports, build models, and create textures (that could be different people for each task).&lt;br /&gt;
* We need people to start modelling identifiable human-made landmarks like bridges, stadiums, and major buildings. Around the San Francisco Bay area, bridges are especially important. Once you have identified some buildings or objects you would like to have (Aircraft carriers, fuel bowsers, cars, towers, ...) you will need to check out the tools for creating and placing these objects. &lt;br /&gt;
&lt;br /&gt;
It would be helpful if people would model the area they are interested in. Generally contributions are going to be from FlightGear users who find scenery lacking in some area and choose to improve it. You are encouraged to research your own area for airport, navaid and scenery information, to contribute the data or dive right in to airport and scenery design.&lt;br /&gt;
&lt;br /&gt;
=== Making airports ===&lt;br /&gt;
Sometimes you'd like to populate your favourite airport with objects, but you find it has a wrong layout or that it doesn't exist at all! So, you'll want to [[Howto:Make an airport|make or improve that layout]], which can be done with [[WED]]. Remember that we're maintaining an open (GPL) airport database in common with X-Plane simulator.&lt;br /&gt;
&lt;br /&gt;
Other than just fix the look, you might want to add interactive details like [[AI Traffic]] and maybe update navaids and comm frequencies. We need people to go over paper lists and airport diagrams for countries that don't publish air navigation data free online (i.e. almost everyone but the U.S.) and fill in the blanks in our navaid and airport databases.&lt;br /&gt;
&lt;br /&gt;
To be sure the airport you're interested in is not already being worked on, check the [[Airports under construction]] article. Also, note that since we switched to a newer format for the airport database, there are many airports that need to be converted from the older (810) format to the newer (850). All the info is in [[Howto:Make an airport]].&lt;br /&gt;
&lt;br /&gt;
=== Contributing to the scenery terrain ===&lt;br /&gt;
We need people to collect geodata to give us more accurate roads, rivers, etc., especially outside the U.S. and Europe. Note that since we're now allowed to use OpenStreetMap data for this, you might consider contributing to that project too. With time, more and more features will be imported from OSM, beginning with roads and rails, and going on with power lines and antennas and whatnot.&lt;br /&gt;
&lt;br /&gt;
The first step into this is learning how to [[Using TerraGear|use TerraGear]]. Remember that all the data you plan to use must be GPL compatible. You might also consider editing some of that source data and contribute it to the Scenery Project that would make good use of it!&lt;br /&gt;
&lt;br /&gt;
=== Core development ===&lt;br /&gt;
{{Main article|Howto:Start core development}}&lt;br /&gt;
If you know Git, consider contributing to the [[Howto:Start core development|core development]] at [https://gitlab.com/flightgear gitlab.com/flightgear]. Apart from the three core repositories (simgear, flightgear and terragear), you don't need to have an in-depth understanding of C++.&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Submitting bugs to the Bug Tracker ===&lt;br /&gt;
Bugs can be reported to {{tickets|the issue tracker}} (select the respective project, or &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt; if unsure). Reporting bugs accurately helps make bug fixing significantly easier for the developers. Another thing that is very helpful, is reviewing posted bug reports and see if you can reproduce/confirm them on your system.&lt;br /&gt;
&lt;br /&gt;
=== Artwork Creators/Contributors ===&lt;br /&gt;
FlightGear itself would not be possible without the contribution of various types of artwork:&lt;br /&gt;
* Aircraft developers need photographs, images and sounds to realistically model a particular aircraft.&lt;br /&gt;
* The splash screen displayed when loading the simulator can be personalized, and you can [[Howto: Create custom splash screens|create one for your favourite aircraft]].&lt;br /&gt;
* Sound recordings of aircraft are also very valuable - particularly engine sounds for unusual aircraft.&lt;br /&gt;
&lt;br /&gt;
In general, you can find requests and post your offers of this kind in the Developers forum, but you can also browse [[:Category:Aircraft by status|existing aircraft projects]] and see if there's anything you'd like to improve.&lt;br /&gt;
&lt;br /&gt;
=== Pre-Release Testers ===&lt;br /&gt;
Prior to a release, release candidates are provided to the community. By directly providing feedback about your experiences with FlightGear's development code, you will become a crucial part of the development process and you will basically serve as quality control for FlightGear, your experiences will determine whether FlightGear's development code is ready for a next official release or not. See the [[Release plan]] to find out when release candidates will be distributed.&lt;br /&gt;
&lt;br /&gt;
Note: If you are interested in actually doing development for FlightGear, make sure to check out the [[Portal:Developer|Developer section]].&lt;br /&gt;
&lt;br /&gt;
=== Hosting a multiplayer server ===&lt;br /&gt;
If you have access to an Unix based server, another good opportunity for contributing would be to set up a multiplayer server for use with FlightGear, for details please check out [[Howto: Set up a multiplayer server]].&lt;br /&gt;
&lt;br /&gt;
=== Tell us if FlightGear works with your hardware ===&lt;br /&gt;
You can help fellow FlightGear users by telling us if FlightGear works with your hardware. Please see [[Hardware Recommendations]].&lt;br /&gt;
&lt;br /&gt;
=== Participate in the FlightGear Forums ===&lt;br /&gt;
If you haven't done so already, please consider registering at the {{forum link|text=FlightGear forum}}, this is a very simple thing to do, but it makes it very easy to obtain and provide help and other support within the FlightGear community.&lt;br /&gt;
&lt;br /&gt;
Taking extra care in your posting to avoid requiring the attention of the moderators is in some ways also a contribution. Doing so helps self-police the forums so that the moderators can spend their time doing constructive development.&lt;br /&gt;
&lt;br /&gt;
=== Check out the Discord server ===&lt;br /&gt;
{{Main article|Discord}}&lt;br /&gt;
To talk to fellow FlightGear users in realtime, you may want to check out our [[Discord]] server (and other unofficial servers). This is also an excellent way for getting and providing community help.&lt;br /&gt;
&lt;br /&gt;
=== Tell us about your own ideas and feature requests for improving FlightGear ===&lt;br /&gt;
If you think you have a good idea or feature request for improving FlightGear, the FlightGear forums and the IRC channel are also an excellent way for getting feedback.&lt;br /&gt;
&lt;br /&gt;
Another new way for posting feature requests and making suggestions is provided at http://flightgear-bugs.googlecode.com&lt;br /&gt;
&lt;br /&gt;
=== Help us write the FlightGear Newsletter ===&lt;br /&gt;
The FlightGear newsletter is a community driven newsletter that is created and edited using the wiki. All FlightGear users are invited to contribute to the newsletter. The only thing that is required is a wiki account, which is free and easy to register.&lt;br /&gt;
&lt;br /&gt;
Please feel free to add news about your own FlightGear related projects, or projects started by others to the newsletter.&lt;br /&gt;
&lt;br /&gt;
You can find the draft of next month's newsletter at: [[Next newsletter]]&lt;br /&gt;
&lt;br /&gt;
Just tracking the forums, mailing lists or the IRC channel should provide you with plenty of opportunities for things that could be added to the newsletter. One simple thing for getting started - even without writing anything - is uploading screen shots showing recent FlightGear developments for use in the FlightGear newsletter.&lt;br /&gt;
&lt;br /&gt;
=== Reviews ===&lt;br /&gt;
Another thing that can be easily done is reviewing FlightGear (or just certain parts of it, like for example scenery and/or aircraft) and submit your reviews to some of the flight simulation portals. Of course, you can also directly write your reviews using the FlightGear wiki, see: [[FlightGear Reviews]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contribution requests]]&lt;br /&gt;
[[Category:Community]]&lt;br /&gt;
&lt;br /&gt;
[[es:Tener a bien]]&lt;br /&gt;
[[fr:Volontaires]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Volunteer&amp;diff=144759</id>
		<title>Volunteer</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Volunteer&amp;diff=144759"/>
		<updated>2026-05-28T08:04:47Z</updated>

		<summary type="html">&lt;p&gt;Servo: minor improvements&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Volunteer Intro}}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
=== Screenshots ===&lt;br /&gt;
Another easy way for getting started contributing is to create nice FlightGear screenshots. You can upload these to the wiki where they can then be used to illustrate articles and to highlight articles via the [[:Category:Picture of the week|picture of the week]] on the main page.&lt;br /&gt;
&lt;br /&gt;
[[Howto: Make nice screenshots]] provides some tips on how to create stunning shots, while [[Help:Upload]] discusses how to upload screenshots to the wiki.&lt;br /&gt;
&lt;br /&gt;
=== Videos ===&lt;br /&gt;
Many users like to capture their flights in FlightGear as a video, [[YouTube channels|YouTube]] for example is an excellent way for sharing such videos with fellow FlightGear users. YouTube videos can also be directly embedded in forum postings and wiki articles.&lt;br /&gt;
&lt;br /&gt;
=== Screencasts (video tutorials) ===&lt;br /&gt;
Creating FlightGear related video tutorials is another excellent way for getting started contributing. &lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
{{forum|72|FlightGear Documentation}}&lt;br /&gt;
&lt;br /&gt;
=== FAQ-Maintainers ===&lt;br /&gt;
The FlightGear project is looking for people who are willing to help maintain the FAQ which, given the constant development of the project, is chronically out of date. If you you would like to get involved, follow the {{forum link|text=forum}} to stay current on the latest news, problems, and of course on what questions are asked more frequently, and simply start editing the [[FAQ|wiki FAQ]].&lt;br /&gt;
&lt;br /&gt;
=== Maintaining the wiki ===&lt;br /&gt;
You can easily [[Special:UserLogin|register an account]] and help [[Portal:Wiki|improve the wiki]], and provide your help in reviewing articles, fixing their look and readability, updating them and adding what you think is missing, for example many articles could be greatly improved just by adding a handful of relevant screenshots for illustration purposes. Proof reading of existing articles is also greatly appreciated. &lt;br /&gt;
&lt;br /&gt;
Registering takes less than a minute. After registration, you'll have to confirm your registration by clicking on the link sent to you by email.&lt;br /&gt;
&lt;br /&gt;
=== Translating the wiki and FlightGear ===&lt;br /&gt;
You can also help localize the wiki by [[Help:Translate|translating]] important articles into different languages. Please see the [[translation requests]].&lt;br /&gt;
&lt;br /&gt;
Also, FlightGear itself can be easily translated by updating the files in [[$FG_ROOT]]/Translations. For details please see [[Howto: Translate FlightGear|Translating FlightGear]].&lt;br /&gt;
&lt;br /&gt;
=== Wiki article writers ===&lt;br /&gt;
Various aspects of FlightGear are currently not yet sufficiently documented, and available documentation is often not really suitable to be used by non-developers. This results in users being unaware of the wide range of features and possibilities that FlightGear supports already. &lt;br /&gt;
&lt;br /&gt;
As an &amp;quot;article writer&amp;quot; you should be able to document your own experiences with FlightGear in a clear and concise [[FlightGear wiki:Manual of Style|style]], so that others can easily follow your instructions in order to make use of the less known features of FlightGear. These articles don't need to be very comprehensive, they shall only provide users with easy to follow instructions on how to achieve something, and possibly some caveats and hints.&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Volunteer: Writing]]&lt;br /&gt;
&lt;br /&gt;
=== Contributing to the manual ===&lt;br /&gt;
The wiki is not the only documentation here, of course. FlightGear comes with a set of illustrated documentation, notably [[FlightGear Manual|&amp;quot;The Manual&amp;quot;]]. If you are skilled and a little bit familiar with LaTex, your help would be really welcome. More on this at the [[manual]] wiki page. You'll find the source code in the {{getstart source|text=Getstart repository}}.&lt;br /&gt;
&lt;br /&gt;
=== Documentation Editors/Reviewers ===&lt;br /&gt;
{{Main article|Howto:Write a FlightGear Review}}&lt;br /&gt;
The documentation that comes with FlightGear base package might be inaccurate (outdated) due to the advances in FlightGear's code. You can check the current documentation and identify areas for improvement, by directly making corresponding suggestions for augmentations, or even writing new help documents altogether, while staying current with the mailing list.&lt;br /&gt;
&lt;br /&gt;
Smaller corrections shall be sent by email to the developer mailing list, preferably in unified diff format (for patch to work). Alternatively, small text files can also be sent directly to the mailing list, more complex modifications should be only made available by uploading them to a webpage and linking to the corresponding files from your emails.&lt;br /&gt;
&lt;br /&gt;
If you intend to redo a major part of the current documentation, first discuss this with the developers, to avoid documenting code that may also be under development or deprecation.&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
=== Creating interactive tutorials ===&lt;br /&gt;
FlightGear has a built-in [[Tutorials|tutorial]] system that is based on its scripting language [[Nasal]], this system is very flexible and can be used for creating interactive tutorials (or even missions) for use in FlightGear itself, in other words these tutorials run directly in the simulator. &lt;br /&gt;
&lt;br /&gt;
Creating new tutorials, or updating and improving existing ones, is another great way for getting more familiar with FlightGear. For details please see [[Tutorials]].&lt;br /&gt;
&lt;br /&gt;
=== Providing patches for aircraft's -set.xml status fields ===&lt;br /&gt;
One way you could easily contribute would be to submit patches to HEAD setting the &amp;quot;status&amp;quot; flag on each aircraft accurately. While it will require learning a bit about SCM, and XML, that would be a fine contribution. For a details on how the status should be arrived at see  [[Aircraft status indication]].&lt;br /&gt;
&lt;br /&gt;
=== Creating Scenery Models ===&lt;br /&gt;
The FlightGear project maintains a steadily growing repository of [http://scenemodels.flightgear.org 3D models] for adding some eye-candy to the scenery. The world has always enough room left for your [http://scenemodels.flightgear.org/contribute.php contribution]. Please take the time to investigate what is already there and enjoy populating your favourite area.&lt;br /&gt;
&lt;br /&gt;
Note that you don't have to create any models yourself. You can simply [[Howto: Place 3D objects with the UFO|place existing models using the UFO]]. For example, placing objects in the scenery with the [[UFO]] and submitting them to the database is pretty straightforward and takes very little time. Even an hour spent doing this makes a difference.&lt;br /&gt;
&lt;br /&gt;
If anyway you'd like to [[Modeling - Getting Started|test your modeling skills]], here some suggestions:&lt;br /&gt;
* We need people to go out and take good pictures of all the buildings at their local airports, build models, and create textures (that could be different people for each task).&lt;br /&gt;
* We need people to start modelling identifiable human-made landmarks like bridges, stadiums, and major buildings. Around the San Francisco Bay area, bridges are especially important. Once you have identified some buildings or objects you would like to have (Aircraft carriers, fuel bowsers, cars, towers, ...) you will need to check out the tools for creating and placing these objects. &lt;br /&gt;
&lt;br /&gt;
It would be helpful if people would model the area they are interested in. Generally contributions are going to be from FlightGear users who find scenery lacking in some area and choose to improve it. You are encouraged to research your own area for airport, navaid and scenery information, to contribute the data or dive right in to airport and scenery design.&lt;br /&gt;
&lt;br /&gt;
=== Making airports ===&lt;br /&gt;
Sometimes you'd like to populate your favourite airport with objects, but you find it has a wrong layout or that it doesn't exist at all! So, you'll want to [[Howto:Make an airport|make or improve that layout]], which can be done with [[WED]]. Remember that we're maintaining an open (GPL) airport database in common with X-Plane simulator.&lt;br /&gt;
&lt;br /&gt;
Other than just fix the look, you might want to add interactive details like [[AI Traffic]] and maybe update navaids and comm frequencies. We need people to go over paper lists and airport diagrams for countries that don't publish air navigation data free online (i.e. almost everyone but the U.S.) and fill in the blanks in our navaid and airport databases.&lt;br /&gt;
&lt;br /&gt;
To be sure the airport you're interested in is not already being worked on, check the [[Airports under construction]] article. Also, note that since we switched to a newer format for the airport database, there are many airports that need to be converted from the older (810) format to the newer (850). All the info is in [[Howto:Make an airport]].&lt;br /&gt;
&lt;br /&gt;
=== Contributing to the scenery terrain ===&lt;br /&gt;
We need people to collect geodata to give us more accurate roads, rivers, etc., especially outside the U.S. and Europe. Note that since we're now allowed to use OpenStreetMap data for this, you might consider contributing to that project too. With time, more and more features will be imported from OSM, beginning with roads and rails, and going on with power lines and antennas and whatnot.&lt;br /&gt;
&lt;br /&gt;
The first step into this is learning how to [[Using TerraGear|use TerraGear]]. Remember that all the data you plan to use must be GPL compatible. You might also consider editing some of that source data and contribute it to the Scenery Project that would make good use of it!&lt;br /&gt;
&lt;br /&gt;
=== Core development ===&lt;br /&gt;
{{Main article|Howto:Start core development}}&lt;br /&gt;
If you know Git, consider contributing to the [[Howto:Start core development|core development]] at [https://gitlab.com/flightgear gitlab.com/flightgear]. Apart from the three core repositories (simgear, flightgear and terragear), you don't need to have an in-depth understanding of C++.&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Submitting bugs to the Bug Tracker ===&lt;br /&gt;
Bugs can be reported to {{tickets|the issue tracker}} (select the respective project, or &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt; if unsure). Reporting bugs accurately helps make bug fixing significantly easier for the developers. Another thing that is very helpful, is reviewing posted bug reports and see if you can reproduce/confirm them on your system.&lt;br /&gt;
&lt;br /&gt;
=== Artwork Creators/Contributors ===&lt;br /&gt;
FlightGear itself would not be possible without the contribution of various types of artwork:&lt;br /&gt;
* Aircraft developers need photographs, images and sounds to realistically model a particular aircraft.&lt;br /&gt;
* The splash screen displayed when loading the simulator can be personalized, and you can [[Howto: Create custom splash screens|create one for your favourite aircraft]].&lt;br /&gt;
* Sound recordings of aircraft are also very valuable - particularly engine sounds for unusual aircraft.&lt;br /&gt;
&lt;br /&gt;
In general, you can find requests and post your offers of this kind in the Developers forum, but you can also browse [[:Category:Aircraft by status|existing aircraft projects]] and see if there's anything you'd like to improve.&lt;br /&gt;
&lt;br /&gt;
=== Pre-Release Testers ===&lt;br /&gt;
Prior to a release, release candidates are provided to the community. By directly providing feedback about your experiences with FlightGear's development code, you will become a crucial part of the development process and you will basically serve as quality control for FlightGear, your experiences will determine whether FlightGear's development code is ready for a next official release or not. See the [[Release plan]] to find out when release candidates will be distributed.&lt;br /&gt;
&lt;br /&gt;
Note: If you are interested in actually doing development for FlightGear, make sure to check out the [[Portal:Developer|Developer section]].&lt;br /&gt;
&lt;br /&gt;
=== Hosting a multiplayer server ===&lt;br /&gt;
If you have access to an Unix based server, another good opportunity for contributing would be to set up a multiplayer server for use with FlightGear, for details please check out [[Howto: Set up a multiplayer server]].&lt;br /&gt;
&lt;br /&gt;
=== Tell us if FlightGear works with your hardware ===&lt;br /&gt;
You can help fellow FlightGear users by telling us if FlightGear works with your hardware. Please see [[Hardware Recommendations]].&lt;br /&gt;
&lt;br /&gt;
=== Participate in the FlightGear Forums ===&lt;br /&gt;
If you haven't done so already, please consider registering at the {{forum link|text=FlightGear forum}}, this is a very simple thing to do, but it makes it very easy to obtain and provide help and other support within the FlightGear community.&lt;br /&gt;
&lt;br /&gt;
Taking extra care in your posting to avoid requiring the attention of the moderators is in some ways also a contribution. Doing so helps self-police the forums so that the moderators can spend their time doing constructive development.&lt;br /&gt;
&lt;br /&gt;
=== Check out the Discord server ===&lt;br /&gt;
{{Main article|Discord}}&lt;br /&gt;
To talk to fellow FlightGear users in realtime, you may want to check out our [[Discord]] server (and other smaller unofficial servers). This is also an excellent way for getting and providing community help.&lt;br /&gt;
&lt;br /&gt;
=== Tell us about your own ideas and feature requests for improving FlightGear ===&lt;br /&gt;
If you think you have a good idea or feature request for improving FlightGear, the FlightGear forums and the IRC channel are also an excellent way for getting feedback.&lt;br /&gt;
&lt;br /&gt;
Another new way for posting feature requests and making suggestions is provided at http://flightgear-bugs.googlecode.com&lt;br /&gt;
&lt;br /&gt;
=== Help us write the FlightGear Newsletter ===&lt;br /&gt;
The FlightGear newsletter is a community driven newsletter that is created and edited using the wiki. All FlightGear users are invited to contribute to the newsletter. The only thing that is required is a wiki account, which is free and easy to register.&lt;br /&gt;
&lt;br /&gt;
Please feel free to add news about your own FlightGear related projects, or projects started by others to the newsletter.&lt;br /&gt;
&lt;br /&gt;
You can find the draft of next month's newsletter at: [[Next newsletter]]&lt;br /&gt;
&lt;br /&gt;
Just tracking the forums, mailing lists or the IRC channel should provide you with plenty of opportunities for things that could be added to the newsletter. One simple thing for getting started - even without writing anything - is uploading screen shots showing recent FlightGear developments for use in the FlightGear newsletter.&lt;br /&gt;
&lt;br /&gt;
=== Reviews ===&lt;br /&gt;
Another thing that can be easily done is reviewing FlightGear (or just certain parts of it, like for example scenery and/or aircraft) and submit your reviews to some of the flight simulation portals. Of course, you can also directly write your reviews using the FlightGear wiki, see: [[FlightGear Reviews]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contribution requests]]&lt;br /&gt;
[[Category:Community]]&lt;br /&gt;
&lt;br /&gt;
[[es:Tener a bien]]&lt;br /&gt;
[[fr:Volontaires]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144758</id>
		<title>Howto:Start core development</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144758"/>
		<updated>2026-05-28T07:19:35Z</updated>

		<summary type="html">&lt;p&gt;Servo: advanced&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|You'll need to familiarize yourself with setting up a development environment and building FlightGear in order to contribute code. See&lt;br /&gt;
[https://docs.flightgear.org/contributors-guide/guidelines/building.html Developing on the codebase] if you do not already&lt;br /&gt;
have a working setup. Some understanding of ''Git'' will also be&lt;br /&gt;
necessary; this free, online [https://git-scm.com/book/en/v2 Git book] is quite useful.}}&lt;br /&gt;
&lt;br /&gt;
This page introduces how to contribute to the core [[FlightGear Git|Git repositories]] of [[FlightGear]].&lt;br /&gt;
&lt;br /&gt;
= Filing pull requests =&lt;br /&gt;
&lt;br /&gt;
The most efficient way to contribute changes to the FlightGear code base is to&lt;br /&gt;
file a merge request (this doesn't apply to [[aircraft]] or [[addon|add-ons]], which are&lt;br /&gt;
managed differently). We'll first give an overview of the process including&lt;br /&gt;
its main prerequisites, then explain each step in more detail.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The basic workflow for first-time contributors to a core [[Git]] repository&lt;br /&gt;
is:&lt;br /&gt;
&lt;br /&gt;
#. '''Fork the repository.'''&lt;br /&gt;
   Fork the relevant FlightGear repository into your GitLab account. You will&lt;br /&gt;
   need to know which repository contains the code you are trying to change.&lt;br /&gt;
   Familiarizing yourself with the code base and the purpose of each&lt;br /&gt;
   repository is strongly recommended.&lt;br /&gt;
&lt;br /&gt;
#. '''Set up a local clone.'''&lt;br /&gt;
   Prepare a clone of the repository on your hard disk that is convenient for&lt;br /&gt;
   getting updates from the upstream repository and pushing changes to your&lt;br /&gt;
   fork. You'll also use this clone to perform test builds.&lt;br /&gt;
&lt;br /&gt;
#. '''Build the project.'''&lt;br /&gt;
   If you haven't already done so, this will be the time to set up your&lt;br /&gt;
   development environment so that you can build FlightGear.&lt;br /&gt;
&lt;br /&gt;
#. '''Create a new branch.'''&lt;br /&gt;
   Create a branch on your clone to isolate your changes. Use a clear and&lt;br /&gt;
   descriptive name for your branch (e.g. &amp;lt;code&amp;gt;fix-menubar-typo&amp;lt;/code&amp;gt; or&lt;br /&gt;
   &amp;lt;code&amp;gt;add-new-joystick-configs&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
#. '''Make changes.'''&lt;br /&gt;
   Make the changes on your branch in small, focused commits. Each commit&lt;br /&gt;
   should be self-contained and represent one logical change.&lt;br /&gt;
&lt;br /&gt;
#. '''Test and double-check.'''&lt;br /&gt;
   Before you submit your changes to the FlightGear team for review,&lt;br /&gt;
   double-check your work. Ensure that your code builds and that tests pass.&lt;br /&gt;
&lt;br /&gt;
#. '''Rebase and push.'''&lt;br /&gt;
   Check if the upstream repository was updated in the meantime. If so, rebase&lt;br /&gt;
   your work on its latest state and perform a final test run to make sure&lt;br /&gt;
   everything still works fine.&lt;br /&gt;
&lt;br /&gt;
#. '''Submit a merge request.'''&lt;br /&gt;
   Open a merge request (MR) to propose your changes for review. Be sure to&lt;br /&gt;
   use the ''Merge Request Template'' to provide necessary context for&lt;br /&gt;
   reviewers. Feel free to ask on the developer mailing list if you're unsure&lt;br /&gt;
   whom to add as a reviewer.&lt;br /&gt;
&lt;br /&gt;
#. '''Code review.'''&lt;br /&gt;
   Once you have created a merge request, other developers will review your&lt;br /&gt;
   work, give feedback, and sometimes request changes be made. This is a&lt;br /&gt;
   crucial part of the development process, as it helps reduce bugs and&lt;br /&gt;
   improves code quality.&lt;br /&gt;
&lt;br /&gt;
#. '''Clean up.'''&lt;br /&gt;
   If your merge request was applied, pull your changes from the upstream&lt;br /&gt;
   branch and delete the local branch you created for the merge request.&lt;br /&gt;
&lt;br /&gt;
In order to present these steps in more detail, we'll now assume that you&lt;br /&gt;
intend to make your first contribution to the [https://gitlab.com/flightgear/simgear SimGear repository] (and thus,&lt;br /&gt;
that you haven't already forked it). Except for the target branch name which&lt;br /&gt;
may differ, the process would be the same for any Git repository of the&lt;br /&gt;
FlightGear project.&lt;br /&gt;
&lt;br /&gt;
== Fork the Repository ==&lt;br /&gt;
&lt;br /&gt;
For what follows, you'll need to create a [https://gitlab.com/ GitLab] account if you don't already&lt;br /&gt;
have one. Once you are logged into your account, go to the repository home&lt;br /&gt;
page ([https://gitlab.com/flightgear/simgear here] in our example) and click on the&lt;br /&gt;
&amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork&amp;lt;/span&amp;gt; button as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;forking-the-upstream-repo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;; after&lt;br /&gt;
filling some information, this will lead to the creation of a copy of the&lt;br /&gt;
upstream repository in your own GitLab namespace under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:01_forking.png|thumb|alt=how to find the Fork button on the main page of the repository|Forking the upstream repository]]&lt;br /&gt;
&lt;br /&gt;
Once you've clicked on the button, a new page is loaded as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;entering-fork-metadata&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;. The ''Project name'' will be prominent but it's&lt;br /&gt;
only a label—choose it as you wish (“My SimGear fork” in the example). For the&lt;br /&gt;
''Project URL'', you'll want to select your GitLab username after the initial&lt;br /&gt;
portion &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:02 project name, URL, slug.png|thumb|alt=dialog that allows one to enter the project name, URL and slug for a fork|Entering the project name, URL and slug for your fork]]&lt;br /&gt;
&lt;br /&gt;
The ''Project slug'' is the final part of the base URL for the fork you're about&lt;br /&gt;
to create; let's choose &amp;lt;code&amp;gt;flightgear-simgear&amp;lt;/code&amp;gt; so that all your forks of&lt;br /&gt;
repositories of the FlightGear project are named &amp;lt;code&amp;gt;flightgear-something&amp;lt;/code&amp;gt;.&lt;br /&gt;
This way, they will be easy to distinguish from non-FlightGear repositories&lt;br /&gt;
you might want to publish under &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Beware&lt;br /&gt;
that if you modify the ''Project name'', the GitLab user interface automatically&lt;br /&gt;
modifies the ''Project slug''; so, better fill them in this order: ''Project name''&lt;br /&gt;
then ''Project slug''.&lt;br /&gt;
&lt;br /&gt;
There are a few fields left to enter. If you choose to include only the&lt;br /&gt;
default branch, you'll save a little amount of space but might have to fetch&lt;br /&gt;
other upstream branches later. Give your fork public visiblity so that reviews&lt;br /&gt;
can take place. When ready, click on the &amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork project&amp;lt;/span&amp;gt; button to&lt;br /&gt;
actually create your fork of the upstream repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;section-Set-up-a-local-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Up a Local Clone ==&lt;br /&gt;
&lt;br /&gt;
Since we want to pull updates from the upstream repository, it is convenient&lt;br /&gt;
to clone it to your hard disk and modify the clone so that pushes go by&lt;br /&gt;
default to your fork (which is online under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;). Cloning the upstream SimGear repository&lt;br /&gt;
can be done with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://gitlab.com/flightgear/simgear.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tip|If you use &amp;lt;code&amp;gt;download_and_compile.sh&amp;lt;/code&amp;gt; and it manages the repository you&lt;br /&gt;
want to contribute to (this is obviously the case for SimGear), there is&lt;br /&gt;
no need to create a new clone: you can simply use the repository clone it&lt;br /&gt;
created on your disk.}}&lt;br /&gt;
&lt;br /&gt;
Now, let's add a Git remote that points to your fork of the upstream&lt;br /&gt;
repository. We configure this remote so that pushing to it uses &amp;lt;abbr title=&amp;quot;Secure Shell&amp;quot;&amp;gt;SSH&amp;lt;/abbr&amp;gt; authentication. We also configure your repository clone so&lt;br /&gt;
that pushes go to your fork by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git remote add flo https://gitlab.com/frougon/flightgear-simgear.git&lt;br /&gt;
git remote set-url --push flo git@gitlab.com:frougon/flightgear-simgear.git&lt;br /&gt;
git config remote.pushDefault flo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above commands, replace &amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; (name of the created remote) with an&lt;br /&gt;
appropriate name of your choice; also replace &amp;lt;code&amp;gt;frougon&amp;lt;/code&amp;gt; with your GitLab&lt;br /&gt;
username.&lt;br /&gt;
&lt;br /&gt;
== Build the Project ==&lt;br /&gt;
&lt;br /&gt;
Make sure you can build FlightGear using the repository clone set up in the&lt;br /&gt;
previous step and that the resulting executables run normally. This way,&lt;br /&gt;
you'll be able to properly test any changes you later make in this clone.&lt;br /&gt;
&lt;br /&gt;
{{note|The following steps will have to be repeated for each&lt;br /&gt;
“self-contained changeset” that you intend to contribute.}}&lt;br /&gt;
&lt;br /&gt;
== Create a New Branch ==&lt;br /&gt;
&lt;br /&gt;
Create a branch based on &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; that tracks &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; and make&lt;br /&gt;
sure it is up-to-date. Instead of &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, choose a name that&lt;br /&gt;
makes it clear what the changes in the created branch are supposed to do.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout -b new-branch-name origin/next&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|Here, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; is a remote that points to the upstream repository&lt;br /&gt;
you cloned from, and &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; is the name of the development branch&lt;br /&gt;
in the [https://gitlab.com/flightgear/simgear SimGear repository] (this is also the case for [https://gitlab.com/flightgear/flightgear FlightGear] and [https://gitlab.com/flightgear/fgdata FGData]). If&lt;br /&gt;
you were to contribute to a different repository such as [https://gitlab.com/flightgear/documentation FlightGear documentation], the branch&lt;br /&gt;
to base your work on might have a different name (e.g., &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
== Make Changes ==&lt;br /&gt;
&lt;br /&gt;
Commit the desired changes to the branch you created in the previous step. If&lt;br /&gt;
you need help with &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, this online [https://git-scm.com/book/en/v2 book] is a great resource.&lt;br /&gt;
&lt;br /&gt;
Each commit message should start with a single, not too long summary line (no&lt;br /&gt;
more than 72—80 characters if possible), then a blank line, then normal&lt;br /&gt;
explanations. Example commit message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HID: allow sending output reports from Nasal&lt;br /&gt;
&lt;br /&gt;
- make watched properties only react on a value change&lt;br /&gt;
- refactor the larger usage enums to their own file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like here, it is useful when the beginning of the first line is short and&lt;br /&gt;
makes it clear to readers which part of the code (subsystem, class, etc.) is&lt;br /&gt;
affected by the changes.&lt;br /&gt;
&lt;br /&gt;
== Test and Double-check ==&lt;br /&gt;
&lt;br /&gt;
Rebuild FlightGear with your changes, carefully test. Build the FlightGear&lt;br /&gt;
test suite and verify that the tests still pass. This can be done by running&lt;br /&gt;
&amp;lt;code&amp;gt;make test_suite&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ninja test_suite&amp;lt;/code&amp;gt; from the FlightGear build directory&lt;br /&gt;
(not the source repository!).&lt;br /&gt;
&lt;br /&gt;
Use commands like:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; to check the state of your working directory and repository;&lt;br /&gt;
* &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt; to proofread your commit diffs and messages;&lt;br /&gt;
* &amp;lt;code&amp;gt;git commit --amend&amp;lt;/code&amp;gt; to modify the most recent commit on the branch;&lt;br /&gt;
* &amp;lt;code&amp;gt;git rebase -i &amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt; to modify commits located further&lt;br /&gt;
  in the ancestry graph (namely, descendants of commit &amp;lt;code&amp;gt;&amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt;; see the&lt;br /&gt;
  &amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt; manual page for explanations).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; program is not essential but can be nice for examining&lt;br /&gt;
commits and visualizing the commit graph. If &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; appears to see&lt;br /&gt;
local changes that really aren't there, run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; then rerun&lt;br /&gt;
&amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; programs are useful to run code quality&lt;br /&gt;
checks and apply the project formatting rules. Some of the configured&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks will for instance check for common mistakes&lt;br /&gt;
including typos, mixed whitespace or line endings, and so on. If you've&lt;br /&gt;
[https://pre-commit.com/#3-install-the-git-hook-scripts installed] the&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks in your repository clone, &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt;&lt;br /&gt;
will be automatically run every time you commit.&lt;br /&gt;
&lt;br /&gt;
{{note|In most cases, the GitLab CI (Continuous Integration) runs&lt;br /&gt;
the &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; checks as part&lt;br /&gt;
of the automatic verifications that need to pass, before a merge request can be applied.}}&lt;br /&gt;
&lt;br /&gt;
== Rebase and Push ==&lt;br /&gt;
&lt;br /&gt;
If the upstream branch you started from has changed in the meantime, your work&lt;br /&gt;
needs to be rebased on top of its latest state. This can be done with the&lt;br /&gt;
following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case someone was working on the same files as you, this may trigger&lt;br /&gt;
conflicts (so it's a good idea to first announce what you're going to work on&lt;br /&gt;
in order to minimize friction and benefit from the insight of experienced&lt;br /&gt;
people). Conflicts don't happen very often and it's not the end of the world&lt;br /&gt;
when they do. Again, this [https://git-scm.com/book/en/v2 Git book] is a very useful resource in such cases.&lt;br /&gt;
&lt;br /&gt;
If the rebasing did grab upstream changes, perform a final build-and-test run&lt;br /&gt;
to be sure everything works fine. Finally, push the branch to your fork:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With no additional arguments, this pushes the current branch to the remote&lt;br /&gt;
specified with the &amp;lt;code&amp;gt;remote.pushDefault&amp;lt;/code&amp;gt; setting, i.e. to your clone if you&lt;br /&gt;
followed the [[#section-Set-up-a-local-clone|above]] instructions. Once&lt;br /&gt;
the push is successful, &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will show a URL; following it will start the next step.&lt;br /&gt;
&lt;br /&gt;
== Submit a Merge Request ==&lt;br /&gt;
&lt;br /&gt;
The web page opened from the URL output by &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; when you pushed to&lt;br /&gt;
your fork allows to create a merge request from the branch that was pushed.&lt;br /&gt;
From this page, select the proper target branch: for development code in&lt;br /&gt;
[https://gitlab.com/flightgear/simgear SimGear], that would be &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Select yourself as&lt;br /&gt;
an ''assignee'' (meaning that ''you'' are going to shape the merge request into&lt;br /&gt;
its final form). Select one or more reviewers to look at it—you can ask on the&lt;br /&gt;
[https://sourceforge.net/p/flightgear/mailman/flightgear-devel/ flightgear-devel mailing-list] if unsure, or just leave the field as&lt;br /&gt;
''Unassigned''. Don't worry too much about the milestone ''(a priori,'' &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
should do unless the merge request is specifically a fix for a release&lt;br /&gt;
branch). Select applicable labels, etc.&lt;br /&gt;
&lt;br /&gt;
Regarding the ''Delete source branch when merge request is accepted'' option, we&lt;br /&gt;
advise you to make sure it is enabled, otherwise your fork will soon have tons&lt;br /&gt;
of branches. What this option does is the following: when the branch from your&lt;br /&gt;
merge request is merged into the upstream branch, GitLab will automatically&lt;br /&gt;
delete the merge request branch (that you pushed) from your fork. This happens&lt;br /&gt;
online at GitLab, not in your local clone. Thus, even after this&lt;br /&gt;
occurs, the branch will still be present locally in your clone, until you&lt;br /&gt;
delete it yourself (cf. [[#local-branch-removal|below]]).&lt;br /&gt;
&lt;br /&gt;
Finally, the ''Squash commits when merge request is accepted'' option can be&lt;br /&gt;
used in case you pushed several commits but would rather have them coalesced&lt;br /&gt;
into a single one when the merge request is applied. This is something that&lt;br /&gt;
can be done locally using &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; before pushing (in particular, with&lt;br /&gt;
&amp;lt;code&amp;gt;git rebase -i&amp;lt;/code&amp;gt;), however the option is still useful in case commits are added&lt;br /&gt;
to the merge request after the initial push, be it by you or by reviewers.&lt;br /&gt;
&lt;br /&gt;
== Code Review ==&lt;br /&gt;
&lt;br /&gt;
After a few minutes, hours or days, you'll receive feedback from the&lt;br /&gt;
FlightGear developers about your merge request. Reviewing merge requests&lt;br /&gt;
requires expertise and takes some time, so please carefully read the remarks&lt;br /&gt;
and suggestions, follow up on the questions and requests for changes.&lt;br /&gt;
&lt;br /&gt;
== Clean Up ==&lt;br /&gt;
&lt;br /&gt;
Once the branch is merged, update the local branch of your clone that tracks&lt;br /&gt;
the upstream branch your merge request went to (this is the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; branch in&lt;br /&gt;
our SimGear example):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout next&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Normally, the &amp;lt;code&amp;gt;--rebase&amp;lt;/code&amp;gt; option shouldn't be necessary here as you&lt;br /&gt;
shouldn't have any local commits on top of the upstream ones in this branch,&lt;br /&gt;
however it doesn't hurt and can make things easier if you've been forgetful.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;local-branch-removal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can now delete the local branch you created earlier to avoid cluttering&lt;br /&gt;
your local clone with legacy, unneeded branches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git branch -d new-branch-name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case this branch hasn't been merged ''exactly as is'' into the upstream&lt;br /&gt;
branch (same commit contents and metadata), &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will warn and&lt;br /&gt;
refuse to delete the branch unless you insist using &amp;lt;code&amp;gt;-D&amp;lt;/code&amp;gt;. If this happens,&lt;br /&gt;
you'll have to evaluate yourself (by using &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt;, by comparing&lt;br /&gt;
files...) if deleting your local branch &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; is really the&lt;br /&gt;
right thing to do. In the likely case that what was merged is a strict&lt;br /&gt;
improvement over what you have in &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, then deleting is the&lt;br /&gt;
way to go.&lt;br /&gt;
&lt;br /&gt;
{{tip|If you really, really messed up and deleted the branch before&lt;br /&gt;
realizing that it was a mistake, &amp;lt;code&amp;gt;git reflog&amp;lt;/code&amp;gt; is likely to save you:&lt;br /&gt;
among other things, it shows the commit hashes corresponding to previous&lt;br /&gt;
positions of the tips of various branches. As long as no garbage collection occurred in the meantime (&amp;lt;code&amp;gt;git gc&amp;lt;/code&amp;gt;), the commit&lt;br /&gt;
hashes are all you need to restore “lost commits”: simply create a&lt;br /&gt;
branch or tag from the desired commit (before doing do, you may want&lt;br /&gt;
to use &amp;lt;code&amp;gt;git show &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to see the commit for a given hash, or &amp;lt;code&amp;gt;git log &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to examine its ancestry).}}&lt;br /&gt;
&lt;br /&gt;
From time to time, you may also want to run &amp;lt;code&amp;gt;git fetch -p flo&amp;lt;/code&amp;gt; (replace&lt;br /&gt;
&amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; with the name of a remote that points to your fork,&lt;br /&gt;
cf. [[#section-Set-up-a-local-clone]]). This removes the &amp;lt;code&amp;gt;flo/...&amp;lt;/code&amp;gt;&lt;br /&gt;
branches from your local clone that have been deleted from your fork at GitLab&lt;br /&gt;
due to the ''Delete source branch when merge request is accepted'' option on the&lt;br /&gt;
merge request page (note that for instance, &amp;lt;code&amp;gt;flo/new-branch-name&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; are different branches in your clone; they'll both clutter&lt;br /&gt;
the display when using &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; until you delete them).&lt;br /&gt;
&lt;br /&gt;
= Advanced =&lt;br /&gt;
A C++ API reference is available at [https://docs.flightgear.org/reference/cpp-reference.html docs.flightgear.org].&lt;br /&gt;
&lt;br /&gt;
= External links =&lt;br /&gt;
* [https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html How to Contribute Code]&lt;br /&gt;
* [https://git-scm.com/book/en/v2 The Git book]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;br /&gt;
[[Category:Core developer documentation]]&lt;br /&gt;
[[ru:Howto:Приступая к разработке ядра]]&lt;br /&gt;
[[Category:Hackathon Materials]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Canvas_GUI&amp;diff=144757</id>
		<title>Canvas GUI</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Canvas_GUI&amp;diff=144757"/>
		<updated>2026-05-28T07:08:49Z</updated>

		<summary type="html">&lt;p&gt;Servo: add 2024.2 content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note| the GUI API documentation can be found here: [[Canvas GUI API]]}}&lt;br /&gt;
{{Canvas Navigation}}&lt;br /&gt;
The '''Canvas GUI''' is going to replace the old [[PUI]] in version 2024.2.&lt;br /&gt;
[[File:Canvas menu 2024.2+.png|thumb|The canvas menu in 2024.2 nightly.]]&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
{{See also|Canvas widget matrix}}&lt;br /&gt;
In order and switch to the [[FlightGear and OpenGL Core Profile|core profile]], the [[PUI]] will be phased out completely. We now have the [[Canvas]] system, and there’s a formal decision to modernize the GUI using the Canvas, and completely replace PUI sooner rather than later.&lt;br /&gt;
&lt;br /&gt;
The shortcomings of PUI in particular, have been repeatedly brought up on the devel list over the years.&lt;br /&gt;
It was a lot of work to get rid of hard-coded PUI dialogs, and we still have a bunch of hard-coded PUI widgets – as long as we have those, getting totally rid of PUI will be increasingly difficult, because each hard-coded widget will either need to be phased out or manually ported.&lt;br /&gt;
&lt;br /&gt;
== Creating canvas widgets ==&lt;br /&gt;
{{Main article|Howto:Creating a Canvas GUI Widget}}&lt;br /&gt;
&lt;br /&gt;
== PUI widgets ==&lt;br /&gt;
{{Main article|pui2canvas}}&lt;br /&gt;
There is a Nasal/Canvas module dynamically &amp;quot;translating&amp;quot; legacy PUI/XML dialogs into Canvas dialogs (at runtime), in {{fgdata file|Nasal/gui/XMLDialog.nas}} &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/fgdata/ci/fe7c87b21a69f88ddb87d89453c48d12b69660e2/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Canvas GUI]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Implementing_new_features_for_FlightGear&amp;diff=144756</id>
		<title>Implementing new features for FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Implementing_new_features_for_FlightGear&amp;diff=144756"/>
		<updated>2026-05-28T06:50:06Z</updated>

		<summary type="html">&lt;p&gt;Servo: shortened the page and removed out-of-date contents&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Working together}}&lt;br /&gt;
&lt;br /&gt;
We've been seeing an increasing number of discussions on the forum started by people who are eager to become potential contributors. Unfortunately, this has caused some friction over time, because people expected their involvement to work differently.&lt;br /&gt;
&lt;br /&gt;
We do appreciate any community involvement, but people who are serious about bringing changes to FlightGear will find that just making suggestions is typically not enough. As contributors, we would also appreciate it if it would suffice to just make a suggestion — but that's not how things work.&lt;br /&gt;
&lt;br /&gt;
We are now documenting how &amp;quot;bootstrapping&amp;quot; a feature works ''conceptually'': from having an idea to turning it into a feature, without having to do all the work on your own. This model has been shown to work for newcomers.&lt;br /&gt;
&lt;br /&gt;
Note that this is not the only way to accomplish something, but it is a tested and proven way that &amp;quot;just works&amp;quot; for contributors.&lt;br /&gt;
&lt;br /&gt;
This article is based on write-ups from contributors who have worked on novel FlightGear features that initially didn't receive much support, including:&lt;br /&gt;
* [[Advanced weather]]&lt;br /&gt;
* [[Atmospheric light scattering|Atmospheric Light Scattering]] (ALS)&lt;br /&gt;
* [[World Scenery 3.0]]&lt;br /&gt;
* [[Procedural Texturing]]&lt;br /&gt;
* [[Canvas]] system&lt;br /&gt;
* [[MapStructure]] framework&lt;br /&gt;
* [[Earthview|Earthview orbital rendering]] engine&lt;br /&gt;
&lt;br /&gt;
None of these were implemented through &amp;quot;core development&amp;quot; alone. Many started as &amp;quot;mods&amp;quot; and later became official parts of FlightGear. The contributors who wrote this are not all core developers — many work on middleware and base package content (XML, scripts, effects, shaders, textures, 3D models).&lt;br /&gt;
&lt;br /&gt;
== What is this about? ==&lt;br /&gt;
&lt;br /&gt;
Like many FG users, you probably reach a point when you think 'Wouldn't it be nice if we had feature XY?' From this point, there are various options:&lt;br /&gt;
&lt;br /&gt;
* Mention it in the forum: Likely outcome: several users agree it's a good idea, a few long-term contributors point out difficulties, and it ends there.&lt;br /&gt;
* Make a formal feature request: Likely outcome: a few comments, then low priority, and not much else.&lt;br /&gt;
* Make it your own project to get XY implemented: This means you actively manage what happens rather than just putting an idea out there. If you're willing to do this, read on.&lt;br /&gt;
&lt;br /&gt;
== Some truths up front ==&lt;br /&gt;
&lt;br /&gt;
# FlightGear relies on a contributor base, not a user base: Unlike a commercial project, FG does not need customers to survive. Development focuses on what contributors want to build. Arguments like &amp;quot;many more users will join&amp;quot; leave developers unimpressed. Arguments like &amp;quot;this enables new contributors to improve the simulator&amp;quot; are more interesting.&lt;br /&gt;
# Developers are free to do what they want: They work in their free time. You need to convince them voluntarily to help you.&lt;br /&gt;
# Development tends to be inclusive: New features are usually implemented in an optional way. Dropping existing features is very difficult.&lt;br /&gt;
# FG is not focused on end-user polish: Usability may lag behind commercial software. However, modern efforts like the [[Canvas]] system have greatly improved accessibility.&lt;br /&gt;
&lt;br /&gt;
== Test the waters ==&lt;br /&gt;
&lt;br /&gt;
If you want your idea to become part of FlightGear (not a fork or addon), test the waters early. Use the forum or [https://sourceforge.net/p/flightgear/mailman/flightgear-devel/ flightgear-devel] mailing list. Announce your project. If your project involves software or the base package, use GitLab to conduct development in the open so others can track your work and provide feedback.&lt;br /&gt;
&lt;br /&gt;
Lessons from past events:&lt;br /&gt;
&lt;br /&gt;
* Beautiful airport scenery could not be committed because it used textures with a &amp;quot;no commercial use&amp;quot; license — incompatible with FG's GPL license. Check licenses early!&lt;br /&gt;
* A large scenery collection was structured incorrectly — scenery data must follow specific formats. Study the project structure.&lt;br /&gt;
* Huge patches announced shortly before a release create workload for others. Use GitLab regularly and communicate early.&lt;br /&gt;
&lt;br /&gt;
== Gather information ==&lt;br /&gt;
&lt;br /&gt;
Find out who inside the project can help you. Learn how the effect framework works, how effects are configured, etc. The Wiki is your friend. Look up who has done related work (e.g., on [[ALS]], [[WS3.0]], [[Canvas]]). Other community members will gladly provide pointers.&lt;br /&gt;
&lt;br /&gt;
== Make a proposal ==&lt;br /&gt;
&lt;br /&gt;
Do:&lt;br /&gt;
* Point out how your idea makes FG a better simulation.&lt;br /&gt;
* Be concrete about what you want changed.&lt;br /&gt;
* Demonstrate you have done your homework.&lt;br /&gt;
* Summarize your ideas on the wiki so they don't get lost.&lt;br /&gt;
&lt;br /&gt;
Don't:&lt;br /&gt;
* Demand anything.&lt;br /&gt;
* Be rude or angry at criticism.&lt;br /&gt;
* Say FG will fail if your idea is not implemented.&lt;br /&gt;
* Say you &amp;quot;can't do anything&amp;quot; because you don't know C++/XML — you can learn.&lt;br /&gt;
&lt;br /&gt;
Compare: &amp;quot;Wouldn't it be cool if we had better clouds like X-Plane?&amp;quot; versus &amp;quot;Would it be possible to extend the ALS shader system to support volumetric cloud shadows? I can provide cloud textures and test data if someone helps with the shader code.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If you have a track record of finishing projects, people are far more likely to support you. If you are new, create a proof of concept — even in Nasal scripting. Once people see you are investing time, you are more likely to get support.&lt;br /&gt;
&lt;br /&gt;
== Getting people involved ==&lt;br /&gt;
&lt;br /&gt;
The most common showstopper is lack of networking and unwillingness to compromise. People want ''their'' idea implemented immediately, expecting others to drop everything. That is not how things work.&lt;br /&gt;
&lt;br /&gt;
To get people involved, you need to get them interested. People are motivated by actions, not just ideas. Find overlapping areas of interest. Very often, people may not work directly toward your final goal, but toward interim milestones that are part of a longer-term roadmap.&lt;br /&gt;
&lt;br /&gt;
This is exactly how recent projects succeeded:&lt;br /&gt;
* The Advanced Weather system started as a Nasal script and later received C++ help once it proved viable.&lt;br /&gt;
* The [[Atmospheric light scattering|Atmospheric Light Scattering]] (ALS) effect was initially a shader prototype that grew into a full rendering option.&lt;br /&gt;
* The [[Canvas]] system took 18 months from wiki introduction to full adoption.&lt;br /&gt;
* The [[MapStructure]] framework unified multiple hard-coded instruments (radar, map dialog) into a single reusable system.&lt;br /&gt;
&lt;br /&gt;
Successful contributors realize that overlapping areas are opportunities to get involved in other projects, learn new skills, and build relationships.&lt;br /&gt;
&lt;br /&gt;
== Be persistent ==&lt;br /&gt;
&lt;br /&gt;
If you fail to get help, revise your proposal. Consider workarounds — Nasal scripting is often a viable alternative to C++, and subsystems can be converted later. Starting with something &amp;quot;good enough&amp;quot; and improving it is more likely to succeed than trying to be perfect up front.&lt;br /&gt;
&lt;br /&gt;
Example: In the beginning, the idea of using Nasal to implement a weather system was not taken seriously. Once written in a working (though inefficient) way, it received C++ help and became Advanced Weather, one of the most sophisticated weather systems in flight simulation.&lt;br /&gt;
&lt;br /&gt;
The perfect is the enemy of the good. Countless good proposals failed because people refused to make concessions, leading to hundreds of forum posts and wasted hours.&lt;br /&gt;
&lt;br /&gt;
== Honor your commitments ==&lt;br /&gt;
&lt;br /&gt;
If someone does work for you because you promised to do XY, and you don't do XY, no one will help you again. If you cannot meet a deadline, be candid about it early.&lt;br /&gt;
&lt;br /&gt;
== Release early, document your efforts ==&lt;br /&gt;
&lt;br /&gt;
Use the forum and wiki to show progress. People need to be aware of what you are doing before they can help.&lt;br /&gt;
&lt;br /&gt;
For long-debated topics (multiplayer improvements, combat support, better threading, scenery improvements), there are often hundreds of posts over many years. It is not effective to start yet another debate. Instead, use the wiki to document ideas, proposals, and status over time. Some wiki articles on these topics get 12k+ views in months, while forum threads get 4k views in years.&lt;br /&gt;
&lt;br /&gt;
Complex ideas often have a shelf life of 12–18 months. The Canvas system took 18 months from introduction to adoption. Use the wiki to let time work for you.&lt;br /&gt;
&lt;br /&gt;
Make your efforts available for testing early. When ready, submit a merge request on GitLab, talk to someone with commit rights, and enjoy your feature being part of a future release.&lt;br /&gt;
&lt;br /&gt;
== Collaboration and consistency ==&lt;br /&gt;
&lt;br /&gt;
Consistency is difficult. It requires looking at other places and potential use-cases that may benefit from your work — including stuff you never use yourself.&lt;br /&gt;
&lt;br /&gt;
Examples of consistency challenges in FlightGear:&lt;br /&gt;
* Multiple competing I/O systems (generic protocol, httpd, telnet, multiplayer) that share similar requirements but are poorly integrated.&lt;br /&gt;
* Aircraft that could support [[AI traffic]], multiplayer [[dual control|dual-pilot]], replay, checklists, weight &amp;amp; balance, and the [[bombable]] addon — but most contributors only scratch their own itch.&lt;br /&gt;
&lt;br /&gt;
The Canvas/MapStructure work is a success story: for over a decade, hard-coded instruments (wxradar, agradar, navdisplay, map dialog) existed separately. Canvas unified them into a framework under 1,000 lines of code, making over 9,000–15,000 lines of C++ obsolete. This took 24 months — but the result is far more accessible and future-proof.&lt;br /&gt;
&lt;br /&gt;
However, this kind of work is not &amp;quot;fun&amp;quot;. It involves refactoring, talking, and coordinating — not just coding. But it is what makes the project sustainable.&lt;br /&gt;
&lt;br /&gt;
== Case study: empowering the masses ==&lt;br /&gt;
&lt;br /&gt;
A common suggestion: &amp;quot;If coders spent time making tools that take the coding out of making stuff, modders would spend time doing the rest.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In practice, this has been tried:&lt;br /&gt;
* The terrain texturing system now has XML-configured regional definitions and documented effects. The actual work (gathering aerial imagery, finding textures, trial and error) requires almost zero coding — just XML. Yet very few people use it.&lt;br /&gt;
* The MapStructure framework is extensively documented (14k+ views in 6 months) and provides a plugin system. Still, few third-party modules have appeared.&lt;br /&gt;
&lt;br /&gt;
The lesson: It is not enough to build tools. Contributors need to show they will actually use them before developers invest time.&lt;br /&gt;
&lt;br /&gt;
== Case study: when is rendering simple? ==&lt;br /&gt;
&lt;br /&gt;
A common question: Why do we not have simple water reflections when we have complex effects like [[ALS]]?&lt;br /&gt;
&lt;br /&gt;
The answer: Graphics cards are optimized for local computations (eye → surface → light). Water reflections require non-local computations (eye → water → reflected object → light). Raytracing solves this but is too slow for real-time. There are approximations (e.g., shadow camera passes in deferred rendering), but they require significant resources.&lt;br /&gt;
&lt;br /&gt;
Many things that look mathematically simple are not simple in real-time rendering. The cost-benefit analysis may be poor — would you work six months and lose half your framerate for water reflections?&lt;br /&gt;
&lt;br /&gt;
(Note: First-person shooters can run fancy effects because movement is restricted to &amp;quot;levels.&amp;quot; FlightGear renders from ground to orbit — a much harder problem.)&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[How the FlightGear project works]]&lt;br /&gt;
* [[Howto:Understand the FlightGear development process]]&lt;br /&gt;
* [[Howto:Start core development]]&lt;br /&gt;
* [[Canvas]]&lt;br /&gt;
* [[MapStructure]]&lt;br /&gt;
* [[Advanced weather]]&lt;br /&gt;
* [[Atmospheric light scattering]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Working together]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144755</id>
		<title>Howto:Start core development</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144755"/>
		<updated>2026-05-28T06:25:55Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|You'll need to familiarize yourself with setting up a development environment and building FlightGear in order to contribute code. See&lt;br /&gt;
[https://docs.flightgear.org/contributors-guide/guidelines/building.html Developing on the codebase] if you do not already&lt;br /&gt;
have a working setup. Some understanding of ''Git'' will also be&lt;br /&gt;
necessary; this free, online [https://git-scm.com/book/en/v2 Git book] is quite useful.}}&lt;br /&gt;
&lt;br /&gt;
This page introduces how to contribute to the core [[FlightGear Git|Git repositories]] of [[FlightGear]].&lt;br /&gt;
&lt;br /&gt;
The most efficient way to contribute changes to the FlightGear code base is to&lt;br /&gt;
file a merge request (this doesn't apply to [[aircraft]] or [[addon|add-ons]], which are&lt;br /&gt;
managed differently). We'll first give an overview of the process including&lt;br /&gt;
its main prerequisites, then explain each step in more detail.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The basic workflow for first-time contributors to a core [[Git]] repository&lt;br /&gt;
is:&lt;br /&gt;
&lt;br /&gt;
#. '''Fork the repository.'''&lt;br /&gt;
   Fork the relevant FlightGear repository into your GitLab account. You will&lt;br /&gt;
   need to know which repository contains the code you are trying to change.&lt;br /&gt;
   Familiarizing yourself with the code base and the purpose of each&lt;br /&gt;
   repository is strongly recommended.&lt;br /&gt;
&lt;br /&gt;
#. '''Set up a local clone.'''&lt;br /&gt;
   Prepare a clone of the repository on your hard disk that is convenient for&lt;br /&gt;
   getting updates from the upstream repository and pushing changes to your&lt;br /&gt;
   fork. You'll also use this clone to perform test builds.&lt;br /&gt;
&lt;br /&gt;
#. '''Build the project.'''&lt;br /&gt;
   If you haven't already done so, this will be the time to set up your&lt;br /&gt;
   development environment so that you can build FlightGear.&lt;br /&gt;
&lt;br /&gt;
#. '''Create a new branch.'''&lt;br /&gt;
   Create a branch on your clone to isolate your changes. Use a clear and&lt;br /&gt;
   descriptive name for your branch (e.g. &amp;lt;code&amp;gt;fix-menubar-typo&amp;lt;/code&amp;gt; or&lt;br /&gt;
   &amp;lt;code&amp;gt;add-new-joystick-configs&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
#. '''Make changes.'''&lt;br /&gt;
   Make the changes on your branch in small, focused commits. Each commit&lt;br /&gt;
   should be self-contained and represent one logical change.&lt;br /&gt;
&lt;br /&gt;
#. '''Test and double-check.'''&lt;br /&gt;
   Before you submit your changes to the FlightGear team for review,&lt;br /&gt;
   double-check your work. Ensure that your code builds and that tests pass.&lt;br /&gt;
&lt;br /&gt;
#. '''Rebase and push.'''&lt;br /&gt;
   Check if the upstream repository was updated in the meantime. If so, rebase&lt;br /&gt;
   your work on its latest state and perform a final test run to make sure&lt;br /&gt;
   everything still works fine.&lt;br /&gt;
&lt;br /&gt;
#. '''Submit a merge request.'''&lt;br /&gt;
   Open a merge request (MR) to propose your changes for review. Be sure to&lt;br /&gt;
   use the ''Merge Request Template'' to provide necessary context for&lt;br /&gt;
   reviewers. Feel free to ask on the developer mailing list if you're unsure&lt;br /&gt;
   whom to add as a reviewer.&lt;br /&gt;
&lt;br /&gt;
#. '''Code review.'''&lt;br /&gt;
   Once you have created a merge request, other developers will review your&lt;br /&gt;
   work, give feedback, and sometimes request changes be made. This is a&lt;br /&gt;
   crucial part of the development process, as it helps reduce bugs and&lt;br /&gt;
   improves code quality.&lt;br /&gt;
&lt;br /&gt;
#. '''Clean up.'''&lt;br /&gt;
   If your merge request was applied, pull your changes from the upstream&lt;br /&gt;
   branch and delete the local branch you created for the merge request.&lt;br /&gt;
&lt;br /&gt;
In order to present these steps in more detail, we'll now assume that you&lt;br /&gt;
intend to make your first contribution to the [https://gitlab.com/flightgear/simgear SimGear repository] (and thus,&lt;br /&gt;
that you haven't already forked it). Except for the target branch name which&lt;br /&gt;
may differ, the process would be the same for any Git repository of the&lt;br /&gt;
FlightGear project.&lt;br /&gt;
&lt;br /&gt;
== Fork the Repository ==&lt;br /&gt;
&lt;br /&gt;
For what follows, you'll need to create a [https://gitlab.com/ GitLab] account if you don't already&lt;br /&gt;
have one. Once you are logged into your account, go to the repository home&lt;br /&gt;
page ([https://gitlab.com/flightgear/simgear here] in our example) and click on the&lt;br /&gt;
&amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork&amp;lt;/span&amp;gt; button as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;forking-the-upstream-repo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;; after&lt;br /&gt;
filling some information, this will lead to the creation of a copy of the&lt;br /&gt;
upstream repository in your own GitLab namespace under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:01_forking.png|thumb|alt=how to find the Fork button on the main page of the repository|Forking the upstream repository]]&lt;br /&gt;
&lt;br /&gt;
Once you've clicked on the button, a new page is loaded as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;entering-fork-metadata&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;. The ''Project name'' will be prominent but it's&lt;br /&gt;
only a label—choose it as you wish (“My SimGear fork” in the example). For the&lt;br /&gt;
''Project URL'', you'll want to select your GitLab username after the initial&lt;br /&gt;
portion &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:02 project name, URL, slug.png|thumb|alt=dialog that allows one to enter the project name, URL and slug for a fork|Entering the project name, URL and slug for your fork]]&lt;br /&gt;
&lt;br /&gt;
The ''Project slug'' is the final part of the base URL for the fork you're about&lt;br /&gt;
to create; let's choose &amp;lt;code&amp;gt;flightgear-simgear&amp;lt;/code&amp;gt; so that all your forks of&lt;br /&gt;
repositories of the FlightGear project are named &amp;lt;code&amp;gt;flightgear-something&amp;lt;/code&amp;gt;.&lt;br /&gt;
This way, they will be easy to distinguish from non-FlightGear repositories&lt;br /&gt;
you might want to publish under &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Beware&lt;br /&gt;
that if you modify the ''Project name'', the GitLab user interface automatically&lt;br /&gt;
modifies the ''Project slug''; so, better fill them in this order: ''Project name''&lt;br /&gt;
then ''Project slug''.&lt;br /&gt;
&lt;br /&gt;
There are a few fields left to enter. If you choose to include only the&lt;br /&gt;
default branch, you'll save a little amount of space but might have to fetch&lt;br /&gt;
other upstream branches later. Give your fork public visiblity so that reviews&lt;br /&gt;
can take place. When ready, click on the &amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork project&amp;lt;/span&amp;gt; button to&lt;br /&gt;
actually create your fork of the upstream repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;section-Set-up-a-local-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Up a Local Clone ==&lt;br /&gt;
&lt;br /&gt;
Since we want to pull updates from the upstream repository, it is convenient&lt;br /&gt;
to clone it to your hard disk and modify the clone so that pushes go by&lt;br /&gt;
default to your fork (which is online under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;). Cloning the upstream SimGear repository&lt;br /&gt;
can be done with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://gitlab.com/flightgear/simgear.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tip|If you use &amp;lt;code&amp;gt;download_and_compile.sh&amp;lt;/code&amp;gt; and it manages the repository you&lt;br /&gt;
want to contribute to (this is obviously the case for SimGear), there is&lt;br /&gt;
no need to create a new clone: you can simply use the repository clone it&lt;br /&gt;
created on your disk.}}&lt;br /&gt;
&lt;br /&gt;
Now, let's add a Git remote that points to your fork of the upstream&lt;br /&gt;
repository. We configure this remote so that pushing to it uses &amp;lt;abbr title=&amp;quot;Secure Shell&amp;quot;&amp;gt;SSH&amp;lt;/abbr&amp;gt; authentication. We also configure your repository clone so&lt;br /&gt;
that pushes go to your fork by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git remote add flo https://gitlab.com/frougon/flightgear-simgear.git&lt;br /&gt;
git remote set-url --push flo git@gitlab.com:frougon/flightgear-simgear.git&lt;br /&gt;
git config remote.pushDefault flo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above commands, replace &amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; (name of the created remote) with an&lt;br /&gt;
appropriate name of your choice; also replace &amp;lt;code&amp;gt;frougon&amp;lt;/code&amp;gt; with your GitLab&lt;br /&gt;
username.&lt;br /&gt;
&lt;br /&gt;
== Build the Project ==&lt;br /&gt;
&lt;br /&gt;
Make sure you can build FlightGear using the repository clone set up in the&lt;br /&gt;
previous step and that the resulting executables run normally. This way,&lt;br /&gt;
you'll be able to properly test any changes you later make in this clone.&lt;br /&gt;
&lt;br /&gt;
{{note|The following steps will have to be repeated for each&lt;br /&gt;
“self-contained changeset” that you intend to contribute.}}&lt;br /&gt;
&lt;br /&gt;
== Create a New Branch ==&lt;br /&gt;
&lt;br /&gt;
Create a branch based on &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; that tracks &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; and make&lt;br /&gt;
sure it is up-to-date. Instead of &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, choose a name that&lt;br /&gt;
makes it clear what the changes in the created branch are supposed to do.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout -b new-branch-name origin/next&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|Here, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; is a remote that points to the upstream repository&lt;br /&gt;
you cloned from, and &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; is the name of the development branch&lt;br /&gt;
in the [https://gitlab.com/flightgear/simgear SimGear repository] (this is also the case for [https://gitlab.com/flightgear/flightgear FlightGear] and [https://gitlab.com/flightgear/fgdata FGData]). If&lt;br /&gt;
you were to contribute to a different repository such as [https://gitlab.com/flightgear/documentation FlightGear documentation], the branch&lt;br /&gt;
to base your work on might have a different name (e.g., &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
== Make Changes ==&lt;br /&gt;
&lt;br /&gt;
Commit the desired changes to the branch you created in the previous step. If&lt;br /&gt;
you need help with &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, this online [https://git-scm.com/book/en/v2 book] is a great resource.&lt;br /&gt;
&lt;br /&gt;
Each commit message should start with a single, not too long summary line (no&lt;br /&gt;
more than 72—80 characters if possible), then a blank line, then normal&lt;br /&gt;
explanations. Example commit message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HID: allow sending output reports from Nasal&lt;br /&gt;
&lt;br /&gt;
- make watched properties only react on a value change&lt;br /&gt;
- refactor the larger usage enums to their own file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like here, it is useful when the beginning of the first line is short and&lt;br /&gt;
makes it clear to readers which part of the code (subsystem, class, etc.) is&lt;br /&gt;
affected by the changes.&lt;br /&gt;
&lt;br /&gt;
== Test and Double-check ==&lt;br /&gt;
&lt;br /&gt;
Rebuild FlightGear with your changes, carefully test. Build the FlightGear&lt;br /&gt;
test suite and verify that the tests still pass. This can be done by running&lt;br /&gt;
&amp;lt;code&amp;gt;make test_suite&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ninja test_suite&amp;lt;/code&amp;gt; from the FlightGear build directory&lt;br /&gt;
(not the source repository!).&lt;br /&gt;
&lt;br /&gt;
Use commands like:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; to check the state of your working directory and repository;&lt;br /&gt;
* &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt; to proofread your commit diffs and messages;&lt;br /&gt;
* &amp;lt;code&amp;gt;git commit --amend&amp;lt;/code&amp;gt; to modify the most recent commit on the branch;&lt;br /&gt;
* &amp;lt;code&amp;gt;git rebase -i &amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt; to modify commits located further&lt;br /&gt;
  in the ancestry graph (namely, descendants of commit &amp;lt;code&amp;gt;&amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt;; see the&lt;br /&gt;
  &amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt; manual page for explanations).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; program is not essential but can be nice for examining&lt;br /&gt;
commits and visualizing the commit graph. If &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; appears to see&lt;br /&gt;
local changes that really aren't there, run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; then rerun&lt;br /&gt;
&amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; programs are useful to run code quality&lt;br /&gt;
checks and apply the project formatting rules. Some of the configured&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks will for instance check for common mistakes&lt;br /&gt;
including typos, mixed whitespace or line endings, and so on. If you've&lt;br /&gt;
[https://pre-commit.com/#3-install-the-git-hook-scripts installed] the&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks in your repository clone, &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt;&lt;br /&gt;
will be automatically run every time you commit.&lt;br /&gt;
&lt;br /&gt;
{{note|In most cases, the GitLab CI (Continuous Integration) runs&lt;br /&gt;
the &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; checks as part&lt;br /&gt;
of the automatic verifications that need to pass, before a merge request can be applied.}}&lt;br /&gt;
&lt;br /&gt;
== Rebase and Push ==&lt;br /&gt;
&lt;br /&gt;
If the upstream branch you started from has changed in the meantime, your work&lt;br /&gt;
needs to be rebased on top of its latest state. This can be done with the&lt;br /&gt;
following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case someone was working on the same files as you, this may trigger&lt;br /&gt;
conflicts (so it's a good idea to first announce what you're going to work on&lt;br /&gt;
in order to minimize friction and benefit from the insight of experienced&lt;br /&gt;
people). Conflicts don't happen very often and it's not the end of the world&lt;br /&gt;
when they do. Again, this [https://git-scm.com/book/en/v2 Git book] is a very useful resource in such cases.&lt;br /&gt;
&lt;br /&gt;
If the rebasing did grab upstream changes, perform a final build-and-test run&lt;br /&gt;
to be sure everything works fine. Finally, push the branch to your fork:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With no additional arguments, this pushes the current branch to the remote&lt;br /&gt;
specified with the &amp;lt;code&amp;gt;remote.pushDefault&amp;lt;/code&amp;gt; setting, i.e. to your clone if you&lt;br /&gt;
followed the [[#section-Set-up-a-local-clone|above]] instructions. Once&lt;br /&gt;
the push is successful, &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will show a URL; following it will start the next step.&lt;br /&gt;
&lt;br /&gt;
== Submit a Merge Request ==&lt;br /&gt;
&lt;br /&gt;
The web page opened from the URL output by &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; when you pushed to&lt;br /&gt;
your fork allows to create a merge request from the branch that was pushed.&lt;br /&gt;
From this page, select the proper target branch: for development code in&lt;br /&gt;
[https://gitlab.com/flightgear/simgear SimGear], that would be &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Select yourself as&lt;br /&gt;
an ''assignee'' (meaning that ''you'' are going to shape the merge request into&lt;br /&gt;
its final form). Select one or more reviewers to look at it—you can ask on the&lt;br /&gt;
[https://sourceforge.net/p/flightgear/mailman/flightgear-devel/ flightgear-devel mailing-list] if unsure, or just leave the field as&lt;br /&gt;
''Unassigned''. Don't worry too much about the milestone ''(a priori,'' &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
should do unless the merge request is specifically a fix for a release&lt;br /&gt;
branch). Select applicable labels, etc.&lt;br /&gt;
&lt;br /&gt;
Regarding the ''Delete source branch when merge request is accepted'' option, we&lt;br /&gt;
advise you to make sure it is enabled, otherwise your fork will soon have tons&lt;br /&gt;
of branches. What this option does is the following: when the branch from your&lt;br /&gt;
merge request is merged into the upstream branch, GitLab will automatically&lt;br /&gt;
delete the merge request branch (that you pushed) from your fork. This happens&lt;br /&gt;
online at GitLab, not in your local clone. Thus, even after this&lt;br /&gt;
occurs, the branch will still be present locally in your clone, until you&lt;br /&gt;
delete it yourself (cf. [[#local-branch-removal|below]]).&lt;br /&gt;
&lt;br /&gt;
Finally, the ''Squash commits when merge request is accepted'' option can be&lt;br /&gt;
used in case you pushed several commits but would rather have them coalesced&lt;br /&gt;
into a single one when the merge request is applied. This is something that&lt;br /&gt;
can be done locally using &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; before pushing (in particular, with&lt;br /&gt;
&amp;lt;code&amp;gt;git rebase -i&amp;lt;/code&amp;gt;), however the option is still useful in case commits are added&lt;br /&gt;
to the merge request after the initial push, be it by you or by reviewers.&lt;br /&gt;
&lt;br /&gt;
== Code Review ==&lt;br /&gt;
&lt;br /&gt;
After a few minutes, hours or days, you'll receive feedback from the&lt;br /&gt;
FlightGear developers about your merge request. Reviewing merge requests&lt;br /&gt;
requires expertise and takes some time, so please carefully read the remarks&lt;br /&gt;
and suggestions, follow up on the questions and requests for changes.&lt;br /&gt;
&lt;br /&gt;
== Clean Up ==&lt;br /&gt;
&lt;br /&gt;
Once the branch is merged, update the local branch of your clone that tracks&lt;br /&gt;
the upstream branch your merge request went to (this is the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; branch in&lt;br /&gt;
our SimGear example):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout next&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Normally, the &amp;lt;code&amp;gt;--rebase&amp;lt;/code&amp;gt; option shouldn't be necessary here as you&lt;br /&gt;
shouldn't have any local commits on top of the upstream ones in this branch,&lt;br /&gt;
however it doesn't hurt and can make things easier if you've been forgetful.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;local-branch-removal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can now delete the local branch you created earlier to avoid cluttering&lt;br /&gt;
your local clone with legacy, unneeded branches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git branch -d new-branch-name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case this branch hasn't been merged ''exactly as is'' into the upstream&lt;br /&gt;
branch (same commit contents and metadata), &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will warn and&lt;br /&gt;
refuse to delete the branch unless you insist using &amp;lt;code&amp;gt;-D&amp;lt;/code&amp;gt;. If this happens,&lt;br /&gt;
you'll have to evaluate yourself (by using &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt;, by comparing&lt;br /&gt;
files...) if deleting your local branch &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; is really the&lt;br /&gt;
right thing to do. In the likely case that what was merged is a strict&lt;br /&gt;
improvement over what you have in &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, then deleting is the&lt;br /&gt;
way to go.&lt;br /&gt;
&lt;br /&gt;
{{tip|If you really, really messed up and deleted the branch before&lt;br /&gt;
realizing that it was a mistake, &amp;lt;code&amp;gt;git reflog&amp;lt;/code&amp;gt; is likely to save you:&lt;br /&gt;
among other things, it shows the commit hashes corresponding to previous&lt;br /&gt;
positions of the tips of various branches. As long as no garbage collection occurred in the meantime (&amp;lt;code&amp;gt;git gc&amp;lt;/code&amp;gt;), the commit&lt;br /&gt;
hashes are all you need to restore “lost commits”: simply create a&lt;br /&gt;
branch or tag from the desired commit (before doing do, you may want&lt;br /&gt;
to use &amp;lt;code&amp;gt;git show &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to see the commit for a given hash, or &amp;lt;code&amp;gt;git log &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to examine its ancestry).}}&lt;br /&gt;
&lt;br /&gt;
From time to time, you may also want to run &amp;lt;code&amp;gt;git fetch -p flo&amp;lt;/code&amp;gt; (replace&lt;br /&gt;
&amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; with the name of a remote that points to your fork,&lt;br /&gt;
cf. [[#section-Set-up-a-local-clone]]). This removes the &amp;lt;code&amp;gt;flo/...&amp;lt;/code&amp;gt;&lt;br /&gt;
branches from your local clone that have been deleted from your fork at GitLab&lt;br /&gt;
due to the ''Delete source branch when merge request is accepted'' option on the&lt;br /&gt;
merge request page (note that for instance, &amp;lt;code&amp;gt;flo/new-branch-name&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; are different branches in your clone; they'll both clutter&lt;br /&gt;
the display when using &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; until you delete them).&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html How to Contribute Code]&lt;br /&gt;
* [https://git-scm.com/book/en/v2 The Git book]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;br /&gt;
[[Category:Core developer documentation]]&lt;br /&gt;
[[ru:Howto:Приступая к разработке ядра]]&lt;br /&gt;
[[Category:Hackathon Materials]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144754</id>
		<title>Howto:Start core development</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144754"/>
		<updated>2026-05-28T06:24:52Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|You'll need to familiarize yourself with setting up a development environment and building FlightGear in order to contribute code. See&lt;br /&gt;
[https://docs.flightgear.org/contributors-guide/guidelines/building.html Developing on the codebase] if you do not already&lt;br /&gt;
have a working setup. Some understanding of ''Git'' will also be&lt;br /&gt;
necessary; this free, online [https://git-scm.com/book/en/v2 Git book] is quite useful.}}&lt;br /&gt;
&lt;br /&gt;
This page introduces how to contribute to the core [[FlightGear Git|Git repositories]] of [[FlightGear]].&lt;br /&gt;
&lt;br /&gt;
The most efficient way to contribute changes to the FlightGear code base is to&lt;br /&gt;
file a merge request (this doesn't apply to [[aircraft]] or [[addon|add-ons]], which are&lt;br /&gt;
managed differently). We'll first give an overview of the process including&lt;br /&gt;
its main prerequisites, then explain each step in more detail.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The basic workflow for first-time contributors to the core Git repository&lt;br /&gt;
is:&lt;br /&gt;
&lt;br /&gt;
#. '''Fork the repository.'''&lt;br /&gt;
   Fork the relevant FlightGear repository into your GitLab account. You will&lt;br /&gt;
   need to know which repository contains the code you are trying to change.&lt;br /&gt;
   Familiarizing yourself with the code base and the purpose of each&lt;br /&gt;
   repository is strongly recommended.&lt;br /&gt;
&lt;br /&gt;
#. '''Set up a local clone.'''&lt;br /&gt;
   Prepare a clone of the repository on your hard disk that is convenient for&lt;br /&gt;
   getting updates from the upstream repository and pushing changes to your&lt;br /&gt;
   fork. You'll also use this clone to perform test builds.&lt;br /&gt;
&lt;br /&gt;
#. '''Build the project.'''&lt;br /&gt;
   If you haven't already done so, this will be the time to set up your&lt;br /&gt;
   development environment so that you can build FlightGear.&lt;br /&gt;
&lt;br /&gt;
#. '''Create a new branch.'''&lt;br /&gt;
   Create a branch on your clone to isolate your changes. Use a clear and&lt;br /&gt;
   descriptive name for your branch (e.g. &amp;lt;code&amp;gt;fix-menubar-typo&amp;lt;/code&amp;gt; or&lt;br /&gt;
   &amp;lt;code&amp;gt;add-new-joystick-configs&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
#. '''Make changes.'''&lt;br /&gt;
   Make the changes on your branch in small, focused commits. Each commit&lt;br /&gt;
   should be self-contained and represent one logical change.&lt;br /&gt;
&lt;br /&gt;
#. '''Test and double-check.'''&lt;br /&gt;
   Before you submit your changes to the FlightGear team for review,&lt;br /&gt;
   double-check your work. Ensure that your code builds and that tests pass.&lt;br /&gt;
&lt;br /&gt;
#. '''Rebase and push.'''&lt;br /&gt;
   Check if the upstream repository was updated in the meantime. If so, rebase&lt;br /&gt;
   your work on its latest state and perform a final test run to make sure&lt;br /&gt;
   everything still works fine.&lt;br /&gt;
&lt;br /&gt;
#. '''Submit a merge request.'''&lt;br /&gt;
   Open a merge request (MR) to propose your changes for review. Be sure to&lt;br /&gt;
   use the ''Merge Request Template'' to provide necessary context for&lt;br /&gt;
   reviewers. Feel free to ask on the developer mailing list if you're unsure&lt;br /&gt;
   whom to add as a reviewer.&lt;br /&gt;
&lt;br /&gt;
#. '''Code review.'''&lt;br /&gt;
   Once you have created a merge request, other developers will review your&lt;br /&gt;
   work, give feedback, and sometimes request changes be made. This is a&lt;br /&gt;
   crucial part of the development process, as it helps reduce bugs and&lt;br /&gt;
   improves code quality.&lt;br /&gt;
&lt;br /&gt;
#. '''Clean up.'''&lt;br /&gt;
   If your merge request was applied, pull your changes from the upstream&lt;br /&gt;
   branch and delete the local branch you created for the merge request.&lt;br /&gt;
&lt;br /&gt;
In order to present these steps in more detail, we'll now assume that you&lt;br /&gt;
intend to make your first contribution to the [https://gitlab.com/flightgear/simgear SimGear repository] (and thus,&lt;br /&gt;
that you haven't already forked it). Except for the target branch name which&lt;br /&gt;
may differ, the process would be the same for any Git repository of the&lt;br /&gt;
FlightGear project.&lt;br /&gt;
&lt;br /&gt;
== Fork the Repository ==&lt;br /&gt;
&lt;br /&gt;
For what follows, you'll need to create a [https://gitlab.com/ GitLab] account if you don't already&lt;br /&gt;
have one. Once you are logged into your account, go to the repository home&lt;br /&gt;
page ([https://gitlab.com/flightgear/simgear here] in our example) and click on the&lt;br /&gt;
&amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork&amp;lt;/span&amp;gt; button as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;forking-the-upstream-repo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;; after&lt;br /&gt;
filling some information, this will lead to the creation of a copy of the&lt;br /&gt;
upstream repository in your own GitLab namespace under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:01_forking.png|thumb|alt=how to find the Fork button on the main page of the repository|Forking the upstream repository]]&lt;br /&gt;
&lt;br /&gt;
Once you've clicked on the button, a new page is loaded as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;entering-fork-metadata&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;. The ''Project name'' will be prominent but it's&lt;br /&gt;
only a label—choose it as you wish (“My SimGear fork” in the example). For the&lt;br /&gt;
''Project URL'', you'll want to select your GitLab username after the initial&lt;br /&gt;
portion &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:02 project name, URL, slug.png|thumb|alt=dialog that allows one to enter the project name, URL and slug for a fork|Entering the project name, URL and slug for your fork]]&lt;br /&gt;
&lt;br /&gt;
The ''Project slug'' is the final part of the base URL for the fork you're about&lt;br /&gt;
to create; let's choose &amp;lt;code&amp;gt;flightgear-simgear&amp;lt;/code&amp;gt; so that all your forks of&lt;br /&gt;
repositories of the FlightGear project are named &amp;lt;code&amp;gt;flightgear-something&amp;lt;/code&amp;gt;.&lt;br /&gt;
This way, they will be easy to distinguish from non-FlightGear repositories&lt;br /&gt;
you might want to publish under &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Beware&lt;br /&gt;
that if you modify the ''Project name'', the GitLab user interface automatically&lt;br /&gt;
modifies the ''Project slug''; so, better fill them in this order: ''Project name''&lt;br /&gt;
then ''Project slug''.&lt;br /&gt;
&lt;br /&gt;
There are a few fields left to enter. If you choose to include only the&lt;br /&gt;
default branch, you'll save a little amount of space but might have to fetch&lt;br /&gt;
other upstream branches later. Give your fork public visiblity so that reviews&lt;br /&gt;
can take place. When ready, click on the &amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork project&amp;lt;/span&amp;gt; button to&lt;br /&gt;
actually create your fork of the upstream repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;section-Set-up-a-local-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Up a Local Clone ==&lt;br /&gt;
&lt;br /&gt;
Since we want to pull updates from the upstream repository, it is convenient&lt;br /&gt;
to clone it to your hard disk and modify the clone so that pushes go by&lt;br /&gt;
default to your fork (which is online under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;). Cloning the upstream SimGear repository&lt;br /&gt;
can be done with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://gitlab.com/flightgear/simgear.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tip|If you use &amp;lt;code&amp;gt;download_and_compile.sh&amp;lt;/code&amp;gt; and it manages the repository you&lt;br /&gt;
want to contribute to (this is obviously the case for SimGear), there is&lt;br /&gt;
no need to create a new clone: you can simply use the repository clone it&lt;br /&gt;
created on your disk.}}&lt;br /&gt;
&lt;br /&gt;
Now, let's add a Git remote that points to your fork of the upstream&lt;br /&gt;
repository. We configure this remote so that pushing to it uses &amp;lt;abbr title=&amp;quot;Secure Shell&amp;quot;&amp;gt;SSH&amp;lt;/abbr&amp;gt; authentication. We also configure your repository clone so&lt;br /&gt;
that pushes go to your fork by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git remote add flo https://gitlab.com/frougon/flightgear-simgear.git&lt;br /&gt;
git remote set-url --push flo git@gitlab.com:frougon/flightgear-simgear.git&lt;br /&gt;
git config remote.pushDefault flo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above commands, replace &amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; (name of the created remote) with an&lt;br /&gt;
appropriate name of your choice; also replace &amp;lt;code&amp;gt;frougon&amp;lt;/code&amp;gt; with your GitLab&lt;br /&gt;
username.&lt;br /&gt;
&lt;br /&gt;
== Build the Project ==&lt;br /&gt;
&lt;br /&gt;
Make sure you can build FlightGear using the repository clone set up in the&lt;br /&gt;
previous step and that the resulting executables run normally. This way,&lt;br /&gt;
you'll be able to properly test any changes you later make in this clone.&lt;br /&gt;
&lt;br /&gt;
{{note|The following steps will have to be repeated for each&lt;br /&gt;
“self-contained changeset” that you intend to contribute.}}&lt;br /&gt;
&lt;br /&gt;
== Create a New Branch ==&lt;br /&gt;
&lt;br /&gt;
Create a branch based on &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; that tracks &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; and make&lt;br /&gt;
sure it is up-to-date. Instead of &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, choose a name that&lt;br /&gt;
makes it clear what the changes in the created branch are supposed to do.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout -b new-branch-name origin/next&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|Here, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; is a remote that points to the upstream repository&lt;br /&gt;
you cloned from, and &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; is the name of the development branch&lt;br /&gt;
in the [https://gitlab.com/flightgear/simgear SimGear repository] (this is also the case for [https://gitlab.com/flightgear/flightgear FlightGear] and [https://gitlab.com/flightgear/fgdata FGData]). If&lt;br /&gt;
you were to contribute to a different repository such as [https://gitlab.com/flightgear/documentation FlightGear documentation], the branch&lt;br /&gt;
to base your work on might have a different name (e.g., &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
== Make Changes ==&lt;br /&gt;
&lt;br /&gt;
Commit the desired changes to the branch you created in the previous step. If&lt;br /&gt;
you need help with &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, this online [https://git-scm.com/book/en/v2 book] is a great resource.&lt;br /&gt;
&lt;br /&gt;
Each commit message should start with a single, not too long summary line (no&lt;br /&gt;
more than 72—80 characters if possible), then a blank line, then normal&lt;br /&gt;
explanations. Example commit message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HID: allow sending output reports from Nasal&lt;br /&gt;
&lt;br /&gt;
- make watched properties only react on a value change&lt;br /&gt;
- refactor the larger usage enums to their own file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like here, it is useful when the beginning of the first line is short and&lt;br /&gt;
makes it clear to readers which part of the code (subsystem, class, etc.) is&lt;br /&gt;
affected by the changes.&lt;br /&gt;
&lt;br /&gt;
== Test and Double-check ==&lt;br /&gt;
&lt;br /&gt;
Rebuild FlightGear with your changes, carefully test. Build the FlightGear&lt;br /&gt;
test suite and verify that the tests still pass. This can be done by running&lt;br /&gt;
&amp;lt;code&amp;gt;make test_suite&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ninja test_suite&amp;lt;/code&amp;gt; from the FlightGear build directory&lt;br /&gt;
(not the source repository!).&lt;br /&gt;
&lt;br /&gt;
Use commands like:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; to check the state of your working directory and repository;&lt;br /&gt;
* &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt; to proofread your commit diffs and messages;&lt;br /&gt;
* &amp;lt;code&amp;gt;git commit --amend&amp;lt;/code&amp;gt; to modify the most recent commit on the branch;&lt;br /&gt;
* &amp;lt;code&amp;gt;git rebase -i &amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt; to modify commits located further&lt;br /&gt;
  in the ancestry graph (namely, descendants of commit &amp;lt;code&amp;gt;&amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt;; see the&lt;br /&gt;
  &amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt; manual page for explanations).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; program is not essential but can be nice for examining&lt;br /&gt;
commits and visualizing the commit graph. If &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; appears to see&lt;br /&gt;
local changes that really aren't there, run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; then rerun&lt;br /&gt;
&amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; programs are useful to run code quality&lt;br /&gt;
checks and apply the project formatting rules. Some of the configured&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks will for instance check for common mistakes&lt;br /&gt;
including typos, mixed whitespace or line endings, and so on. If you've&lt;br /&gt;
[https://pre-commit.com/#3-install-the-git-hook-scripts installed] the&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks in your repository clone, &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt;&lt;br /&gt;
will be automatically run every time you commit.&lt;br /&gt;
&lt;br /&gt;
{{note|In most cases, the GitLab CI (Continuous Integration) runs&lt;br /&gt;
the &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; checks as part&lt;br /&gt;
of the automatic verifications that need to pass, before a merge request can be applied.}}&lt;br /&gt;
&lt;br /&gt;
== Rebase and Push ==&lt;br /&gt;
&lt;br /&gt;
If the upstream branch you started from has changed in the meantime, your work&lt;br /&gt;
needs to be rebased on top of its latest state. This can be done with the&lt;br /&gt;
following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case someone was working on the same files as you, this may trigger&lt;br /&gt;
conflicts (so it's a good idea to first announce what you're going to work on&lt;br /&gt;
in order to minimize friction and benefit from the insight of experienced&lt;br /&gt;
people). Conflicts don't happen very often and it's not the end of the world&lt;br /&gt;
when they do. Again, this [https://git-scm.com/book/en/v2 Git book] is a very useful resource in such cases.&lt;br /&gt;
&lt;br /&gt;
If the rebasing did grab upstream changes, perform a final build-and-test run&lt;br /&gt;
to be sure everything works fine. Finally, push the branch to your fork:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With no additional arguments, this pushes the current branch to the remote&lt;br /&gt;
specified with the &amp;lt;code&amp;gt;remote.pushDefault&amp;lt;/code&amp;gt; setting, i.e. to your clone if you&lt;br /&gt;
followed the [[#section-Set-up-a-local-clone|above]] instructions. Once&lt;br /&gt;
the push is successful, &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will show a URL; following it will start the next step.&lt;br /&gt;
&lt;br /&gt;
== Submit a Merge Request ==&lt;br /&gt;
&lt;br /&gt;
The web page opened from the URL output by &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; when you pushed to&lt;br /&gt;
your fork allows to create a merge request from the branch that was pushed.&lt;br /&gt;
From this page, select the proper target branch: for development code in&lt;br /&gt;
[https://gitlab.com/flightgear/simgear SimGear], that would be &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Select yourself as&lt;br /&gt;
an ''assignee'' (meaning that ''you'' are going to shape the merge request into&lt;br /&gt;
its final form). Select one or more reviewers to look at it—you can ask on the&lt;br /&gt;
[https://sourceforge.net/p/flightgear/mailman/flightgear-devel/ flightgear-devel mailing-list] if unsure, or just leave the field as&lt;br /&gt;
''Unassigned''. Don't worry too much about the milestone ''(a priori,'' &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
should do unless the merge request is specifically a fix for a release&lt;br /&gt;
branch). Select applicable labels, etc.&lt;br /&gt;
&lt;br /&gt;
Regarding the ''Delete source branch when merge request is accepted'' option, we&lt;br /&gt;
advise you to make sure it is enabled, otherwise your fork will soon have tons&lt;br /&gt;
of branches. What this option does is the following: when the branch from your&lt;br /&gt;
merge request is merged into the upstream branch, GitLab will automatically&lt;br /&gt;
delete the merge request branch (that you pushed) from your fork. This happens&lt;br /&gt;
online at GitLab, not in your local clone. Thus, even after this&lt;br /&gt;
occurs, the branch will still be present locally in your clone, until you&lt;br /&gt;
delete it yourself (cf. [[#local-branch-removal|below]]).&lt;br /&gt;
&lt;br /&gt;
Finally, the ''Squash commits when merge request is accepted'' option can be&lt;br /&gt;
used in case you pushed several commits but would rather have them coalesced&lt;br /&gt;
into a single one when the merge request is applied. This is something that&lt;br /&gt;
can be done locally using &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; before pushing (in particular, with&lt;br /&gt;
&amp;lt;code&amp;gt;git rebase -i&amp;lt;/code&amp;gt;), however the option is still useful in case commits are added&lt;br /&gt;
to the merge request after the initial push, be it by you or by reviewers.&lt;br /&gt;
&lt;br /&gt;
== Code Review ==&lt;br /&gt;
&lt;br /&gt;
After a few minutes, hours or days, you'll receive feedback from the&lt;br /&gt;
FlightGear developers about your merge request. Reviewing merge requests&lt;br /&gt;
requires expertise and takes some time, so please carefully read the remarks&lt;br /&gt;
and suggestions, follow up on the questions and requests for changes.&lt;br /&gt;
&lt;br /&gt;
== Clean Up ==&lt;br /&gt;
&lt;br /&gt;
Once the branch is merged, update the local branch of your clone that tracks&lt;br /&gt;
the upstream branch your merge request went to (this is the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; branch in&lt;br /&gt;
our SimGear example):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout next&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Normally, the &amp;lt;code&amp;gt;--rebase&amp;lt;/code&amp;gt; option shouldn't be necessary here as you&lt;br /&gt;
shouldn't have any local commits on top of the upstream ones in this branch,&lt;br /&gt;
however it doesn't hurt and can make things easier if you've been forgetful.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;local-branch-removal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can now delete the local branch you created earlier to avoid cluttering&lt;br /&gt;
your local clone with legacy, unneeded branches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git branch -d new-branch-name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case this branch hasn't been merged ''exactly as is'' into the upstream&lt;br /&gt;
branch (same commit contents and metadata), &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will warn and&lt;br /&gt;
refuse to delete the branch unless you insist using &amp;lt;code&amp;gt;-D&amp;lt;/code&amp;gt;. If this happens,&lt;br /&gt;
you'll have to evaluate yourself (by using &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt;, by comparing&lt;br /&gt;
files...) if deleting your local branch &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; is really the&lt;br /&gt;
right thing to do. In the likely case that what was merged is a strict&lt;br /&gt;
improvement over what you have in &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, then deleting is the&lt;br /&gt;
way to go.&lt;br /&gt;
&lt;br /&gt;
{{tip|If you really, really messed up and deleted the branch before&lt;br /&gt;
realizing that it was a mistake, &amp;lt;code&amp;gt;git reflog&amp;lt;/code&amp;gt; is likely to save you:&lt;br /&gt;
among other things, it shows the commit hashes corresponding to previous&lt;br /&gt;
positions of the tips of various branches. As long as no garbage collection occurred in the meantime (&amp;lt;code&amp;gt;git gc&amp;lt;/code&amp;gt;), the commit&lt;br /&gt;
hashes are all you need to restore “lost commits”: simply create a&lt;br /&gt;
branch or tag from the desired commit (before doing do, you may want&lt;br /&gt;
to use &amp;lt;code&amp;gt;git show &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to see the commit for a given hash, or &amp;lt;code&amp;gt;git log &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to examine its ancestry).}}&lt;br /&gt;
&lt;br /&gt;
From time to time, you may also want to run &amp;lt;code&amp;gt;git fetch -p flo&amp;lt;/code&amp;gt; (replace&lt;br /&gt;
&amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; with the name of a remote that points to your fork,&lt;br /&gt;
cf. [[#section-Set-up-a-local-clone]]). This removes the &amp;lt;code&amp;gt;flo/...&amp;lt;/code&amp;gt;&lt;br /&gt;
branches from your local clone that have been deleted from your fork at GitLab&lt;br /&gt;
due to the ''Delete source branch when merge request is accepted'' option on the&lt;br /&gt;
merge request page (note that for instance, &amp;lt;code&amp;gt;flo/new-branch-name&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; are different branches in your clone; they'll both clutter&lt;br /&gt;
the display when using &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; until you delete them).&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html How to Contribute Code]&lt;br /&gt;
* [https://git-scm.com/book/en/v2 The Git book]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;br /&gt;
[[Category:Core developer documentation]]&lt;br /&gt;
[[ru:Howto:Приступая к разработке ядра]]&lt;br /&gt;
[[Category:Hackathon Materials]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144753</id>
		<title>Howto:Start core development</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144753"/>
		<updated>2026-05-28T06:22:52Z</updated>

		<summary type="html">&lt;p&gt;Servo: top&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|You'll need to familiarize yourself with setting up a development environment and building FlightGear in order to contribute code. See&lt;br /&gt;
[https://docs.flightgear.org/contributors-guide/guidelines/building.html Developing on the codebase] if you do not already&lt;br /&gt;
have a working setup. Some understanding of ''Git'' will also be&lt;br /&gt;
necessary; this free, online [https://git-scm.com/book/en/v2 Git book] is quite useful.}}&lt;br /&gt;
&lt;br /&gt;
This page introduces how to contribute to the core [[FlightGear Git|Git repositories]] of [[FlightGear]].&lt;br /&gt;
&lt;br /&gt;
The most efficient way to contribute changes to the FlightGear code base is to&lt;br /&gt;
file a merge request (this doesn't apply to [[aircraft]] or [[addon|add-ons]], which are&lt;br /&gt;
managed differently). We'll first give an overview of the process including&lt;br /&gt;
its main prerequisites, then explain each step in more detail.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The basic workflow for first-time contributors to a FlightGear Git repository&lt;br /&gt;
is:&lt;br /&gt;
&lt;br /&gt;
#. '''Fork the repository.'''&lt;br /&gt;
   Fork the relevant FlightGear repository into your GitLab account. You will&lt;br /&gt;
   need to know which repository contains the code you are trying to change.&lt;br /&gt;
   Familiarizing yourself with the code base and the purpose of each&lt;br /&gt;
   repository is strongly recommended.&lt;br /&gt;
&lt;br /&gt;
#. '''Set up a local clone.'''&lt;br /&gt;
   Prepare a clone of the repository on your hard disk that is convenient for&lt;br /&gt;
   getting updates from the upstream repository and pushing changes to your&lt;br /&gt;
   fork. You'll also use this clone to perform test builds.&lt;br /&gt;
&lt;br /&gt;
#. '''Build the project.'''&lt;br /&gt;
   If you haven't already done so, this will be the time to set up your&lt;br /&gt;
   development environment so that you can build FlightGear.&lt;br /&gt;
&lt;br /&gt;
#. '''Create a new branch.'''&lt;br /&gt;
   Create a branch on your clone to isolate your changes. Use a clear and&lt;br /&gt;
   descriptive name for your branch (e.g. &amp;lt;code&amp;gt;fix-menubar-typo&amp;lt;/code&amp;gt; or&lt;br /&gt;
   &amp;lt;code&amp;gt;add-new-joystick-configs&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
#. '''Make changes.'''&lt;br /&gt;
   Make the changes on your branch in small, focused commits. Each commit&lt;br /&gt;
   should be self-contained and represent one logical change.&lt;br /&gt;
&lt;br /&gt;
#. '''Test and double-check.'''&lt;br /&gt;
   Before you submit your changes to the FlightGear team for review,&lt;br /&gt;
   double-check your work. Ensure that your code builds and that tests pass.&lt;br /&gt;
&lt;br /&gt;
#. '''Rebase and push.'''&lt;br /&gt;
   Check if the upstream repository was updated in the meantime. If so, rebase&lt;br /&gt;
   your work on its latest state and perform a final test run to make sure&lt;br /&gt;
   everything still works fine.&lt;br /&gt;
&lt;br /&gt;
#. '''Submit a merge request.'''&lt;br /&gt;
   Open a merge request (MR) to propose your changes for review. Be sure to&lt;br /&gt;
   use the ''Merge Request Template'' to provide necessary context for&lt;br /&gt;
   reviewers. Feel free to ask on the developer mailing list if you're unsure&lt;br /&gt;
   whom to add as a reviewer.&lt;br /&gt;
&lt;br /&gt;
#. '''Code review.'''&lt;br /&gt;
   Once you have created a merge request, other developers will review your&lt;br /&gt;
   work, give feedback, and sometimes request changes be made. This is a&lt;br /&gt;
   crucial part of the development process, as it helps reduce bugs and&lt;br /&gt;
   improves code quality.&lt;br /&gt;
&lt;br /&gt;
#. '''Clean up.'''&lt;br /&gt;
   If your merge request was applied, pull your changes from the upstream&lt;br /&gt;
   branch and delete the local branch you created for the merge request.&lt;br /&gt;
&lt;br /&gt;
In order to present these steps in more detail, we'll now assume that you&lt;br /&gt;
intend to make your first contribution to the [https://gitlab.com/flightgear/simgear SimGear repository] (and thus,&lt;br /&gt;
that you haven't already forked it). Except for the target branch name which&lt;br /&gt;
may differ, the process would be the same for any Git repository of the&lt;br /&gt;
FlightGear project.&lt;br /&gt;
&lt;br /&gt;
== Fork the Repository ==&lt;br /&gt;
&lt;br /&gt;
For what follows, you'll need to create a [https://gitlab.com/ GitLab] account if you don't already&lt;br /&gt;
have one. Once you are logged into your account, go to the repository home&lt;br /&gt;
page ([https://gitlab.com/flightgear/simgear here] in our example) and click on the&lt;br /&gt;
&amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork&amp;lt;/span&amp;gt; button as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;forking-the-upstream-repo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;; after&lt;br /&gt;
filling some information, this will lead to the creation of a copy of the&lt;br /&gt;
upstream repository in your own GitLab namespace under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:01_forking.png|thumb|alt=how to find the Fork button on the main page of the repository|Forking the upstream repository]]&lt;br /&gt;
&lt;br /&gt;
Once you've clicked on the button, a new page is loaded as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;entering-fork-metadata&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;. The ''Project name'' will be prominent but it's&lt;br /&gt;
only a label—choose it as you wish (“My SimGear fork” in the example). For the&lt;br /&gt;
''Project URL'', you'll want to select your GitLab username after the initial&lt;br /&gt;
portion &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:02 project name, URL, slug.png|thumb|alt=dialog that allows one to enter the project name, URL and slug for a fork|Entering the project name, URL and slug for your fork]]&lt;br /&gt;
&lt;br /&gt;
The ''Project slug'' is the final part of the base URL for the fork you're about&lt;br /&gt;
to create; let's choose &amp;lt;code&amp;gt;flightgear-simgear&amp;lt;/code&amp;gt; so that all your forks of&lt;br /&gt;
repositories of the FlightGear project are named &amp;lt;code&amp;gt;flightgear-something&amp;lt;/code&amp;gt;.&lt;br /&gt;
This way, they will be easy to distinguish from non-FlightGear repositories&lt;br /&gt;
you might want to publish under &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Beware&lt;br /&gt;
that if you modify the ''Project name'', the GitLab user interface automatically&lt;br /&gt;
modifies the ''Project slug''; so, better fill them in this order: ''Project name''&lt;br /&gt;
then ''Project slug''.&lt;br /&gt;
&lt;br /&gt;
There are a few fields left to enter. If you choose to include only the&lt;br /&gt;
default branch, you'll save a little amount of space but might have to fetch&lt;br /&gt;
other upstream branches later. Give your fork public visiblity so that reviews&lt;br /&gt;
can take place. When ready, click on the &amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork project&amp;lt;/span&amp;gt; button to&lt;br /&gt;
actually create your fork of the upstream repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;section-Set-up-a-local-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Up a Local Clone ==&lt;br /&gt;
&lt;br /&gt;
Since we want to pull updates from the upstream repository, it is convenient&lt;br /&gt;
to clone it to your hard disk and modify the clone so that pushes go by&lt;br /&gt;
default to your fork (which is online under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;). Cloning the upstream SimGear repository&lt;br /&gt;
can be done with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://gitlab.com/flightgear/simgear.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tip|If you use &amp;lt;code&amp;gt;download_and_compile.sh&amp;lt;/code&amp;gt; and it manages the repository you&lt;br /&gt;
want to contribute to (this is obviously the case for SimGear), there is&lt;br /&gt;
no need to create a new clone: you can simply use the repository clone it&lt;br /&gt;
created on your disk.}}&lt;br /&gt;
&lt;br /&gt;
Now, let's add a Git remote that points to your fork of the upstream&lt;br /&gt;
repository. We configure this remote so that pushing to it uses &amp;lt;abbr title=&amp;quot;Secure Shell&amp;quot;&amp;gt;SSH&amp;lt;/abbr&amp;gt; authentication. We also configure your repository clone so&lt;br /&gt;
that pushes go to your fork by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git remote add flo https://gitlab.com/frougon/flightgear-simgear.git&lt;br /&gt;
git remote set-url --push flo git@gitlab.com:frougon/flightgear-simgear.git&lt;br /&gt;
git config remote.pushDefault flo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above commands, replace &amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; (name of the created remote) with an&lt;br /&gt;
appropriate name of your choice; also replace &amp;lt;code&amp;gt;frougon&amp;lt;/code&amp;gt; with your GitLab&lt;br /&gt;
username.&lt;br /&gt;
&lt;br /&gt;
== Build the Project ==&lt;br /&gt;
&lt;br /&gt;
Make sure you can build FlightGear using the repository clone set up in the&lt;br /&gt;
previous step and that the resulting executables run normally. This way,&lt;br /&gt;
you'll be able to properly test any changes you later make in this clone.&lt;br /&gt;
&lt;br /&gt;
{{note|The following steps will have to be repeated for each&lt;br /&gt;
“self-contained changeset” that you intend to contribute.}}&lt;br /&gt;
&lt;br /&gt;
== Create a New Branch ==&lt;br /&gt;
&lt;br /&gt;
Create a branch based on &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; that tracks &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; and make&lt;br /&gt;
sure it is up-to-date. Instead of &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, choose a name that&lt;br /&gt;
makes it clear what the changes in the created branch are supposed to do.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout -b new-branch-name origin/next&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|Here, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; is a remote that points to the upstream repository&lt;br /&gt;
you cloned from, and &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; is the name of the development branch&lt;br /&gt;
in the [https://gitlab.com/flightgear/simgear SimGear repository] (this is also the case for [https://gitlab.com/flightgear/flightgear FlightGear] and [https://gitlab.com/flightgear/fgdata FGData]). If&lt;br /&gt;
you were to contribute to a different repository such as [https://gitlab.com/flightgear/documentation FlightGear documentation], the branch&lt;br /&gt;
to base your work on might have a different name (e.g., &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
== Make Changes ==&lt;br /&gt;
&lt;br /&gt;
Commit the desired changes to the branch you created in the previous step. If&lt;br /&gt;
you need help with &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, this online [https://git-scm.com/book/en/v2 book] is a great resource.&lt;br /&gt;
&lt;br /&gt;
Each commit message should start with a single, not too long summary line (no&lt;br /&gt;
more than 72—80 characters if possible), then a blank line, then normal&lt;br /&gt;
explanations. Example commit message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HID: allow sending output reports from Nasal&lt;br /&gt;
&lt;br /&gt;
- make watched properties only react on a value change&lt;br /&gt;
- refactor the larger usage enums to their own file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like here, it is useful when the beginning of the first line is short and&lt;br /&gt;
makes it clear to readers which part of the code (subsystem, class, etc.) is&lt;br /&gt;
affected by the changes.&lt;br /&gt;
&lt;br /&gt;
== Test and Double-check ==&lt;br /&gt;
&lt;br /&gt;
Rebuild FlightGear with your changes, carefully test. Build the FlightGear&lt;br /&gt;
test suite and verify that the tests still pass. This can be done by running&lt;br /&gt;
&amp;lt;code&amp;gt;make test_suite&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ninja test_suite&amp;lt;/code&amp;gt; from the FlightGear build directory&lt;br /&gt;
(not the source repository!).&lt;br /&gt;
&lt;br /&gt;
Use commands like:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; to check the state of your working directory and repository;&lt;br /&gt;
* &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt; to proofread your commit diffs and messages;&lt;br /&gt;
* &amp;lt;code&amp;gt;git commit --amend&amp;lt;/code&amp;gt; to modify the most recent commit on the branch;&lt;br /&gt;
* &amp;lt;code&amp;gt;git rebase -i &amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt; to modify commits located further&lt;br /&gt;
  in the ancestry graph (namely, descendants of commit &amp;lt;code&amp;gt;&amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt;; see the&lt;br /&gt;
  &amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt; manual page for explanations).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; program is not essential but can be nice for examining&lt;br /&gt;
commits and visualizing the commit graph. If &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; appears to see&lt;br /&gt;
local changes that really aren't there, run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; then rerun&lt;br /&gt;
&amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; programs are useful to run code quality&lt;br /&gt;
checks and apply the project formatting rules. Some of the configured&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks will for instance check for common mistakes&lt;br /&gt;
including typos, mixed whitespace or line endings, and so on. If you've&lt;br /&gt;
[https://pre-commit.com/#3-install-the-git-hook-scripts installed] the&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks in your repository clone, &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt;&lt;br /&gt;
will be automatically run every time you commit.&lt;br /&gt;
&lt;br /&gt;
{{note|In most cases, the GitLab CI (Continuous Integration) runs&lt;br /&gt;
the &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; checks as part&lt;br /&gt;
of the automatic verifications that need to pass, before a merge request can be applied.}}&lt;br /&gt;
&lt;br /&gt;
== Rebase and Push ==&lt;br /&gt;
&lt;br /&gt;
If the upstream branch you started from has changed in the meantime, your work&lt;br /&gt;
needs to be rebased on top of its latest state. This can be done with the&lt;br /&gt;
following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case someone was working on the same files as you, this may trigger&lt;br /&gt;
conflicts (so it's a good idea to first announce what you're going to work on&lt;br /&gt;
in order to minimize friction and benefit from the insight of experienced&lt;br /&gt;
people). Conflicts don't happen very often and it's not the end of the world&lt;br /&gt;
when they do. Again, this [https://git-scm.com/book/en/v2 Git book] is a very useful resource in such cases.&lt;br /&gt;
&lt;br /&gt;
If the rebasing did grab upstream changes, perform a final build-and-test run&lt;br /&gt;
to be sure everything works fine. Finally, push the branch to your fork:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With no additional arguments, this pushes the current branch to the remote&lt;br /&gt;
specified with the &amp;lt;code&amp;gt;remote.pushDefault&amp;lt;/code&amp;gt; setting, i.e. to your clone if you&lt;br /&gt;
followed the [[#section-Set-up-a-local-clone|above]] instructions. Once&lt;br /&gt;
the push is successful, &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will show a URL; following it will start the next step.&lt;br /&gt;
&lt;br /&gt;
== Submit a Merge Request ==&lt;br /&gt;
&lt;br /&gt;
The web page opened from the URL output by &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; when you pushed to&lt;br /&gt;
your fork allows to create a merge request from the branch that was pushed.&lt;br /&gt;
From this page, select the proper target branch: for development code in&lt;br /&gt;
[https://gitlab.com/flightgear/simgear SimGear], that would be &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Select yourself as&lt;br /&gt;
an ''assignee'' (meaning that ''you'' are going to shape the merge request into&lt;br /&gt;
its final form). Select one or more reviewers to look at it—you can ask on the&lt;br /&gt;
[https://sourceforge.net/p/flightgear/mailman/flightgear-devel/ flightgear-devel mailing-list] if unsure, or just leave the field as&lt;br /&gt;
''Unassigned''. Don't worry too much about the milestone ''(a priori,'' &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
should do unless the merge request is specifically a fix for a release&lt;br /&gt;
branch). Select applicable labels, etc.&lt;br /&gt;
&lt;br /&gt;
Regarding the ''Delete source branch when merge request is accepted'' option, we&lt;br /&gt;
advise you to make sure it is enabled, otherwise your fork will soon have tons&lt;br /&gt;
of branches. What this option does is the following: when the branch from your&lt;br /&gt;
merge request is merged into the upstream branch, GitLab will automatically&lt;br /&gt;
delete the merge request branch (that you pushed) from your fork. This happens&lt;br /&gt;
online at GitLab, not in your local clone. Thus, even after this&lt;br /&gt;
occurs, the branch will still be present locally in your clone, until you&lt;br /&gt;
delete it yourself (cf. [[#local-branch-removal|below]]).&lt;br /&gt;
&lt;br /&gt;
Finally, the ''Squash commits when merge request is accepted'' option can be&lt;br /&gt;
used in case you pushed several commits but would rather have them coalesced&lt;br /&gt;
into a single one when the merge request is applied. This is something that&lt;br /&gt;
can be done locally using &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; before pushing (in particular, with&lt;br /&gt;
&amp;lt;code&amp;gt;git rebase -i&amp;lt;/code&amp;gt;), however the option is still useful in case commits are added&lt;br /&gt;
to the merge request after the initial push, be it by you or by reviewers.&lt;br /&gt;
&lt;br /&gt;
== Code Review ==&lt;br /&gt;
&lt;br /&gt;
After a few minutes, hours or days, you'll receive feedback from the&lt;br /&gt;
FlightGear developers about your merge request. Reviewing merge requests&lt;br /&gt;
requires expertise and takes some time, so please carefully read the remarks&lt;br /&gt;
and suggestions, follow up on the questions and requests for changes.&lt;br /&gt;
&lt;br /&gt;
== Clean Up ==&lt;br /&gt;
&lt;br /&gt;
Once the branch is merged, update the local branch of your clone that tracks&lt;br /&gt;
the upstream branch your merge request went to (this is the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; branch in&lt;br /&gt;
our SimGear example):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout next&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Normally, the &amp;lt;code&amp;gt;--rebase&amp;lt;/code&amp;gt; option shouldn't be necessary here as you&lt;br /&gt;
shouldn't have any local commits on top of the upstream ones in this branch,&lt;br /&gt;
however it doesn't hurt and can make things easier if you've been forgetful.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;local-branch-removal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can now delete the local branch you created earlier to avoid cluttering&lt;br /&gt;
your local clone with legacy, unneeded branches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git branch -d new-branch-name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case this branch hasn't been merged ''exactly as is'' into the upstream&lt;br /&gt;
branch (same commit contents and metadata), &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will warn and&lt;br /&gt;
refuse to delete the branch unless you insist using &amp;lt;code&amp;gt;-D&amp;lt;/code&amp;gt;. If this happens,&lt;br /&gt;
you'll have to evaluate yourself (by using &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt;, by comparing&lt;br /&gt;
files...) if deleting your local branch &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; is really the&lt;br /&gt;
right thing to do. In the likely case that what was merged is a strict&lt;br /&gt;
improvement over what you have in &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, then deleting is the&lt;br /&gt;
way to go.&lt;br /&gt;
&lt;br /&gt;
{{tip|If you really, really messed up and deleted the branch before&lt;br /&gt;
realizing that it was a mistake, &amp;lt;code&amp;gt;git reflog&amp;lt;/code&amp;gt; is likely to save you:&lt;br /&gt;
among other things, it shows the commit hashes corresponding to previous&lt;br /&gt;
positions of the tips of various branches. As long as no garbage collection occurred in the meantime (&amp;lt;code&amp;gt;git gc&amp;lt;/code&amp;gt;), the commit&lt;br /&gt;
hashes are all you need to restore “lost commits”: simply create a&lt;br /&gt;
branch or tag from the desired commit (before doing do, you may want&lt;br /&gt;
to use &amp;lt;code&amp;gt;git show &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to see the commit for a given hash, or &amp;lt;code&amp;gt;git log &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to examine its ancestry).}}&lt;br /&gt;
&lt;br /&gt;
From time to time, you may also want to run &amp;lt;code&amp;gt;git fetch -p flo&amp;lt;/code&amp;gt; (replace&lt;br /&gt;
&amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; with the name of a remote that points to your fork,&lt;br /&gt;
cf. [[#section-Set-up-a-local-clone]]). This removes the &amp;lt;code&amp;gt;flo/...&amp;lt;/code&amp;gt;&lt;br /&gt;
branches from your local clone that have been deleted from your fork at GitLab&lt;br /&gt;
due to the ''Delete source branch when merge request is accepted'' option on the&lt;br /&gt;
merge request page (note that for instance, &amp;lt;code&amp;gt;flo/new-branch-name&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; are different branches in your clone; they'll both clutter&lt;br /&gt;
the display when using &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; until you delete them).&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html How to Contribute Code]&lt;br /&gt;
* [https://git-scm.com/book/en/v2 The Git book]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;br /&gt;
[[Category:Core developer documentation]]&lt;br /&gt;
[[ru:Howto:Приступая к разработке ядра]]&lt;br /&gt;
[[Category:Hackathon Materials]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=How_the_FlightGear_project_works&amp;diff=144752</id>
		<title>How the FlightGear project works</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=How_the_FlightGear_project_works&amp;diff=144752"/>
		<updated>2026-05-28T06:20:52Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* Overview */ link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Working together}}&lt;br /&gt;
''See also [[Volunteer|volunteering]].''&lt;br /&gt;
&lt;br /&gt;
As [[FlightGear]] is becoming increasingly popular each year, we've been seeing a number of controversial discussions regarding the inner workings of the FlightGear project recently. Meanwhile, it is a well-known fact among long-time contributors that the FlightGear development model may seem irritating at first and it is known to cause some confusions or even frustration among new contributors who may already have experience contributing in other flight sim communities or even other OSS software. &lt;br /&gt;
&lt;br /&gt;
This page describes the organizational structure and development workflow of the FlightGear open-source flight simulator project. It is intended for newcomers who want to understand how decisions are made, who does what, and how to get involved.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FlightGear is an open-source, multi-platform flight simulator developed by a worldwide community of [[Volunteer|volunteers]]. The project is not owned by any company; it is managed by a group of core contributors who coordinate development, review contributions, and maintain the infrastructure.&lt;br /&gt;
&lt;br /&gt;
The project consists of several [[FlightGear Git|Git repositories]] hosted on [https://gitlab.com/flightgear GitLab], with the main ones being:&lt;br /&gt;
&lt;br /&gt;
* flightgear – the main simulator application&lt;br /&gt;
* simgear – the simulation libraries for FlightGear&lt;br /&gt;
* fgdata – base data package&lt;br /&gt;
* manual – introduction for beginners&lt;br /&gt;
&lt;br /&gt;
== Governance Model ==&lt;br /&gt;
&lt;br /&gt;
FlightGear follows a loosely structured, meritocratic governance model:&lt;br /&gt;
&lt;br /&gt;
* Users – provide feedback, bug reports, and feature requests&lt;br /&gt;
* Contributors – submit code, [[aircraft]], [[scenery]], documentation, or translations&lt;br /&gt;
* Reviewers – experienced contributors who regularly review merge requests&lt;br /&gt;
* Core Developers – a group of long-standing contributors with write access to the main repositories and the authority to merge changes&lt;br /&gt;
&lt;br /&gt;
== Development Model ==&lt;br /&gt;
&lt;br /&gt;
FlightGear uses a GitLab-based workflow very similar to the one described in [[Howto:Start core development]].&lt;br /&gt;
&lt;br /&gt;
=== Branching Strategy ===&lt;br /&gt;
&lt;br /&gt;
Most active repositories (simgear, flightgear, fgdata) use the following branches:&lt;br /&gt;
&lt;br /&gt;
* next – primary development branch; all new features and non-critical fixes go here&lt;br /&gt;
* release/{{current release|full}} – stable release branches (e.g., &amp;lt;code&amp;gt;release/2024.1.6&amp;lt;/code&amp;gt;) used for backporting critical fixes&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; branch is always open for contributions. It is regularly merged into release branches shortly before a new version is published.&lt;br /&gt;
&lt;br /&gt;
=== Release Cycle ===&lt;br /&gt;
{{Main article|release plan}}&lt;br /&gt;
&lt;br /&gt;
== Communication Channels ==&lt;br /&gt;
&lt;br /&gt;
The project uses several communication platforms:&lt;br /&gt;
&lt;br /&gt;
* [[Mailing list]] – [https://sourceforge.net/p/flightgear/mailman/flightgear-devel/ flightgear-devel] for development discussions&lt;br /&gt;
* [https://gitlab.com/groups/flightgear/-/issues GitLab Issues] – bug tracking and feature requests per repository&lt;br /&gt;
* GitLab Merge Requests – code review and contribution integration&lt;br /&gt;
* Forum – [https://forum.flightgear.org/ FlightGear Forum] for user support and aircraft/showcase discussions&lt;br /&gt;
* [[Discord]] – real-time chat&lt;br /&gt;
&lt;br /&gt;
== Roles and Responsibilities ==&lt;br /&gt;
&lt;br /&gt;
=== Contributors ===&lt;br /&gt;
&lt;br /&gt;
Anyone can contribute by:&lt;br /&gt;
&lt;br /&gt;
* Submitting merge requests (code, aircraft, scenery, docs)&lt;br /&gt;
* Reporting bugs with clear steps to reproduce&lt;br /&gt;
* Helping other users on the forum or chat&lt;br /&gt;
* Translating the interface or documentation&lt;br /&gt;
* Donating hardware, hosting, or financial support (via [https://www.flightgear.org/donate/ the official page])&lt;br /&gt;
&lt;br /&gt;
=== Reviewers ===&lt;br /&gt;
&lt;br /&gt;
Reviewers are trusted contributors who:&lt;br /&gt;
&lt;br /&gt;
* Triage issues and merge requests&lt;br /&gt;
* Request changes or approve contributions&lt;br /&gt;
* Ensure code quality, style, and testing standards are met&lt;br /&gt;
* Mentor new contributors&lt;br /&gt;
&lt;br /&gt;
=== Core Team ===&lt;br /&gt;
&lt;br /&gt;
Core team members have:&lt;br /&gt;
&lt;br /&gt;
* Commit access to one or more main repositories&lt;br /&gt;
* Permission to merge approved merge requests&lt;br /&gt;
* Responsibility for release management and infrastructure&lt;br /&gt;
* The ability to vote (informally) on major project decisions&lt;br /&gt;
&lt;br /&gt;
== Getting Involved ==&lt;br /&gt;
&lt;br /&gt;
If you want to contribute to the official repository:&lt;br /&gt;
* See [[Howto:Start core development]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Working together]]&lt;br /&gt;
[[fr:Comment fonctionne le projet Flightgear]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Understand_the_FlightGear_development_process&amp;diff=144751</id>
		<title>Howto:Understand the FlightGear development process</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Understand_the_FlightGear_development_process&amp;diff=144751"/>
		<updated>2026-05-28T06:19:23Z</updated>

		<summary type="html">&lt;p&gt;Servo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
{{Working together}}&lt;br /&gt;
&lt;br /&gt;
The '''[[FlightGear]] development process''' is described below, with an accessible language and lots of links to Wikipedia for terms you might not know. To learn more, see [[Release Plan]].&lt;br /&gt;
&lt;br /&gt;
== Understanding code development ==&lt;br /&gt;
=== Code development for the unaware ===&lt;br /&gt;
Usually, the process of ''compiling a program'' refers to taking its [[wikipedia:source code|source code]] (written in some [[wikipedia:programming language|programming language]] and running it through a so called [[wikipedia:compiler|compiler]], which compiles, assembles and links the human readable source code to come up with the resulting binary and [[wikipedia:executable|executable]] files, which contain the [[wikipedia:machine code|machine code]] that can be run by your computer (CPU).&lt;br /&gt;
&lt;br /&gt;
When you simply download a pre-compiled FlightGear release, you do not have to do this yourself, because other people have already done this for you. These are so called [[wikipedia:release management|release managers]], who often also happen to be software developers themselves.&lt;br /&gt;
&lt;br /&gt;
This is because the process of compiling a piece of software such as FlightGear requires a so called [[wikipedia:build environment|build environment]] which consists of a number of tools (such as a compiler), and custom project configuration settings to turn human readable source code into the machine code that is required for actually running a program.&lt;br /&gt;
&lt;br /&gt;
Programs are usually written in a plain text editor. However, there are very complex &amp;quot;word processors&amp;quot; specifically designed to deal with source code in various programming languages. They are called [[wikipedia:Integrated development environment|Integrated development environment]]s or IDEs, because they usually also provide comprehensive integration with the build environment, including its various tools. For example, an '''IDE''' may provide integrated support for syntax highlighting, as well as support for running certain commands, i.e. to recompile/rebuild parts of the program (or all of it). In addition, IDEs typically provide support for source code management to access a corresponding respository.&lt;br /&gt;
&lt;br /&gt;
==== The repository ====&lt;br /&gt;
{{Main article|FlightGear Git}}&lt;br /&gt;
The human-readable source code is stored on a shared place. It's called generally [[wikipedia:Repository (version control)|repository]], and FlightGear specifically uses [[FlightGear Git|Git]] (once, CVS). Repositories do not only store code, but allow concurrent contributions without stepping on each other's toes. In very simple terms, all changes to a single piece of code are tracked, so that people can easily look up who made a certain change, or if there were any changes made in a certain time frame (e.g. to prevent conflicts between people working with the same files). Imagine it like a revision history on wikipedia or the FlightGear wiki: for any changes there's someone who's responsible for it, and if several people made conflicting changes, the software will show the difference to merge things easily.&lt;br /&gt;
&lt;br /&gt;
This repository does not store only the FlightGear core project, but also other sister ones, like [[TerraGear]], [[SimGear]] and the [[#Understanding the base package|base package]], as well as several related tools.&lt;br /&gt;
&lt;br /&gt;
=== Normal and core developers ===&lt;br /&gt;
People who build FlightGear from source code and make modifications to this source code, are usually called [[wikipedia:programmer|programmer]]s or more generally [[wikipedia:software developer|developers]]. People who have commit rights to the master [[FlightGear Git]] repository, are called ''core developers'' -- because they are the ones who develop the FlightGear &amp;quot;core&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Other programmers/developers may provide patches to the source code, which need to be reviewed, improved and committed by those core developers.&lt;br /&gt;
&lt;br /&gt;
== Understanding the base package ==&lt;br /&gt;
The base package contains the data: scenery, aircraft, sounds, images/textures, configuration files, scripts. It has its own section in the main repository. &lt;br /&gt;
&lt;br /&gt;
Most data kept in the base package does not involve any coding/programming, the only exceptions are [[Nasal]] scripts and GLSL [[Shaders]]. However, none of these require a dedicated build environment, people able to run FlightGear, will automatically have an environment suitable to develop and test Nasal and shaders. &lt;br /&gt;
&lt;br /&gt;
You can contribute to the base package without being a hardcore programmer. See [[Volunteer]].&lt;br /&gt;
&lt;br /&gt;
=== Configuration files ===&lt;br /&gt;
A [[wikipedia:configuration file|configuration file]] provides a convenient interface to customize a program's behavior without having to be a programmer or developer. Similarly, [[wikipedia:command line argument|command line argument]]s are another way for customizing program behavior without having to change a program's source code.&lt;br /&gt;
&lt;br /&gt;
Imagine it like the difference between a carpenter and someone who merely takes a pre-fabricated piece of furniture (like a chair or table) and customizes it by changing its color, or adding/removing some features. Similarly, just because you are able to refuel your car or change your tyres you would not necessarily be referred to as a &amp;quot;car mechanic&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
So, unless you start modifying the source code (logics) of the program (FlightGear) in order to change existing behavior, your changes would normally not qualify as ''developing'', even changing XML files does not fall under ''development'', because [[wikipedia:Xml|XML]] is a markup (i.e. description) language and not a ''programming'' language. To see what's XML used for in FligthGear, visit [[XML|this article]].&lt;br /&gt;
&lt;br /&gt;
{{Note|To be absolutely fair, some FlightGear XML files do support programming related constructs, especially condition handling via SGCondition, but also the state machine stuff, as well as the autopilot system, the latter providing various building blocks to come up with configurable autopilot components like PID controllers and filters.In addition, FDM development itself is often done via XML files and can be an extremely complex topic, despite not necessarily involving programming in the conventional sense.}}&lt;br /&gt;
&lt;br /&gt;
=== Non programming developers ===&lt;br /&gt;
People who do development largely within the confines of the base package (i.e. by creating or modifying aircraft/instruments and/or scenery or other base package resources) are usually also called ''developers'', specifying their area of interest. Terms you'll mostly see here are for example ''aircraft developer'' or ''scenery developer'', both of which imply that their work takes usually place in the base package. Some people may refer to them as ''base package developers'' or as ''[[wikipedia:middlware|middlware]] developers''.&lt;br /&gt;
&lt;br /&gt;
This distinction is largely due to the different set of skills required for producing these resources. While programming and software development in general requires dealing with source code of programs in different programming languages, aircraft or scenery development is no longer primarily about programming. These people don't ''program'' aircraft or scenery, but usually they ''design'' things primarily (i.e. [[wikipedia:3d modeling|3D models, textures]]) and may then add various other resources (such as for example sounds, animations, flight models).&lt;br /&gt;
&lt;br /&gt;
Programming in this context usually refers to tiny scripted programs that are stored in and loaded from the base package, reusable components often provided by others.&lt;br /&gt;
Programs written in such [[wikipedia:scripting language|scripting language]]s are usually not separately compiled, and can be easily created by people new to programming or software development in general.&lt;br /&gt;
&lt;br /&gt;
== Modding ==&lt;br /&gt;
{{Main article|addon}}&lt;br /&gt;
Of course, you can also literally ''compile'' parts (like certain scenery or aircraft) of FlightGear to create a custom version of it. So, someone who simply takes FlightGear, and who creates a custom version of it by downstripping the base package, omitting certain resources and adding new ones or creating custom configurations, would probably not normally be referred to as a &amp;quot;developer&amp;quot; here. The most appropriate term would be [[wikipedia:Modding|modder]] in that case, because you are &amp;quot;modding&amp;quot; FlightGear to come up with a special version for a specific purpose, without doing any actual &amp;quot;development&amp;quot; like for example C++ coding, Nasal scripting or more generally aircraft/scenery development.&lt;br /&gt;
&lt;br /&gt;
Normally, &amp;quot;developing&amp;quot; something implies changing functionality and logics, in the sense of &amp;quot;programming&amp;quot; and &amp;quot;creating&amp;quot; things, features and code. Someone who customizes a piece of software by editing configuration files and by adding or removing such files would usually not be called a developer.&lt;br /&gt;
&lt;br /&gt;
== Developing documentation ==&lt;br /&gt;
There are also documentation developers, including manual writers and wiki editors.&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;br /&gt;
[[Category:Working together]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=TerraGear&amp;diff=144750</id>
		<title>TerraGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=TerraGear&amp;diff=144750"/>
		<updated>2026-05-28T06:14:03Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* Platform specific */ remove dead links&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 FlightGear 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;
=== 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 ====&lt;br /&gt;
* [[Building FlightGear - Debian#TerraGear]]&lt;br /&gt;
==== Gentoo ====&lt;br /&gt;
* emerge -av terragear&amp;lt;/tt&amp;gt;&lt;br /&gt;
See [[Building Flightgear - Gentoo]].&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;
* [[Howto:Use TerraGear without wanting to kill yourself]]&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>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=How_the_FlightGear_project_works&amp;diff=144749</id>
		<title>How the FlightGear project works</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=How_the_FlightGear_project_works&amp;diff=144749"/>
		<updated>2026-05-28T06:10:33Z</updated>

		<summary type="html">&lt;p&gt;Servo: renew the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Working together}}&lt;br /&gt;
''See also [[Volunteer|volunteering]].''&lt;br /&gt;
&lt;br /&gt;
As [[FlightGear]] is becoming increasingly popular each year, we've been seeing a number of controversial discussions regarding the inner workings of the FlightGear project recently. Meanwhile, it is a well-known fact among long-time contributors that the FlightGear development model may seem irritating at first and it is known to cause some confusions or even frustration among new contributors who may already have experience contributing in other flight sim communities or even other OSS software. &lt;br /&gt;
&lt;br /&gt;
This page describes the organizational structure and development workflow of the FlightGear open-source flight simulator project. It is intended for newcomers who want to understand how decisions are made, who does what, and how to get involved.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
FlightGear is an open-source, multi-platform flight simulator developed by a worldwide community of [[Volunteer|volunteers]]. The project is not owned by any company; it is managed by a group of core contributors who coordinate development, review contributions, and maintain the infrastructure.&lt;br /&gt;
&lt;br /&gt;
The project consists of several Git repositories hosted on [https://gitlab.com/flightgear GitLab], with the main ones being:&lt;br /&gt;
&lt;br /&gt;
* flightgear – the main simulator application&lt;br /&gt;
* simgear – the simulation libraries for FlightGear&lt;br /&gt;
* fgdata – base data package&lt;br /&gt;
* manual – introduction for beginners&lt;br /&gt;
&lt;br /&gt;
== Governance Model ==&lt;br /&gt;
&lt;br /&gt;
FlightGear follows a loosely structured, meritocratic governance model:&lt;br /&gt;
&lt;br /&gt;
* Users – provide feedback, bug reports, and feature requests&lt;br /&gt;
* Contributors – submit code, [[aircraft]], [[scenery]], documentation, or translations&lt;br /&gt;
* Reviewers – experienced contributors who regularly review merge requests&lt;br /&gt;
* Core Developers – a group of long-standing contributors with write access to the main repositories and the authority to merge changes&lt;br /&gt;
&lt;br /&gt;
== Development Model ==&lt;br /&gt;
&lt;br /&gt;
FlightGear uses a GitLab-based workflow very similar to the one described in [[Howto:Start core development]].&lt;br /&gt;
&lt;br /&gt;
=== Branching Strategy ===&lt;br /&gt;
&lt;br /&gt;
Most active repositories (simgear, flightgear, fgdata) use the following branches:&lt;br /&gt;
&lt;br /&gt;
* next – primary development branch; all new features and non-critical fixes go here&lt;br /&gt;
* release/{{current release|full}} – stable release branches (e.g., &amp;lt;code&amp;gt;release/2024.1.6&amp;lt;/code&amp;gt;) used for backporting critical fixes&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; branch is always open for contributions. It is regularly merged into release branches shortly before a new version is published.&lt;br /&gt;
&lt;br /&gt;
=== Release Cycle ===&lt;br /&gt;
{{Main article|release plan}}&lt;br /&gt;
&lt;br /&gt;
== Communication Channels ==&lt;br /&gt;
&lt;br /&gt;
The project uses several communication platforms:&lt;br /&gt;
&lt;br /&gt;
* [[Mailing list]] – [https://sourceforge.net/p/flightgear/mailman/flightgear-devel/ flightgear-devel] for development discussions&lt;br /&gt;
* [https://gitlab.com/groups/flightgear/-/issues GitLab Issues] – bug tracking and feature requests per repository&lt;br /&gt;
* GitLab Merge Requests – code review and contribution integration&lt;br /&gt;
* Forum – [https://forum.flightgear.org/ FlightGear Forum] for user support and aircraft/showcase discussions&lt;br /&gt;
* [[Discord]] – real-time chat&lt;br /&gt;
&lt;br /&gt;
== Roles and Responsibilities ==&lt;br /&gt;
&lt;br /&gt;
=== Contributors ===&lt;br /&gt;
&lt;br /&gt;
Anyone can contribute by:&lt;br /&gt;
&lt;br /&gt;
* Submitting merge requests (code, aircraft, scenery, docs)&lt;br /&gt;
* Reporting bugs with clear steps to reproduce&lt;br /&gt;
* Helping other users on the forum or chat&lt;br /&gt;
* Translating the interface or documentation&lt;br /&gt;
* Donating hardware, hosting, or financial support (via [https://www.flightgear.org/donate/ the official page])&lt;br /&gt;
&lt;br /&gt;
=== Reviewers ===&lt;br /&gt;
&lt;br /&gt;
Reviewers are trusted contributors who:&lt;br /&gt;
&lt;br /&gt;
* Triage issues and merge requests&lt;br /&gt;
* Request changes or approve contributions&lt;br /&gt;
* Ensure code quality, style, and testing standards are met&lt;br /&gt;
* Mentor new contributors&lt;br /&gt;
&lt;br /&gt;
=== Core Team ===&lt;br /&gt;
&lt;br /&gt;
Core team members have:&lt;br /&gt;
&lt;br /&gt;
* Commit access to one or more main repositories&lt;br /&gt;
* Permission to merge approved merge requests&lt;br /&gt;
* Responsibility for release management and infrastructure&lt;br /&gt;
* The ability to vote (informally) on major project decisions&lt;br /&gt;
&lt;br /&gt;
== Getting Involved ==&lt;br /&gt;
&lt;br /&gt;
If you want to contribute to the official repository:&lt;br /&gt;
* See [[Howto:Start core development]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Working together]]&lt;br /&gt;
[[fr:Comment fonctionne le projet Flightgear]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144748</id>
		<title>New to FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144748"/>
		<updated>2026-05-28T05:51:13Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* How you can help */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to [[FlightGear]]!''' Here we will try to get you up in the virtual air in the shortest time possible. We will also introduce you to some of the features of this flight simulator and also a few information on its community.&lt;br /&gt;
&lt;br /&gt;
== Installation and setup ==&lt;br /&gt;
=== Hardware requirements ===&lt;br /&gt;
For FlightGear to run smoothly, it requires a video card with OpenGL drivers 4.0 or higher. This is usually not a problem, but take a look at the [[hardware recommendations]] to have a better idea.&lt;br /&gt;
&lt;br /&gt;
=== Getting FlightGear ===&lt;br /&gt;
You may download the latest files from the [https://www.flightgear.org/download/ FlightGear download] page. Choose the source or binary files appropriate for your particular system. {{Wikipedia|AppImage|AppImage}} binary files for Linux are also available with 2020.3 LTS and later. Most Linux users will find that most distributions have a packaged version of FlightGear (the package name could be &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
Depending on your technical expertise you may choose the [[Git]] development version of FlightGear, which typically has more features and can be required by some of the latest developmental aircraft, but can be unstable and is more complicated to get for non-Windows users. In general, the development version is not advised to the average user, but if you are willing to do some testing there is a nightly build available for [https://www.flightgear.org/download/nightly/ download]. If you are using a Git version controlled copy of FlightGear, you may choose to synchronise your aircraft using the version controlled [[FGAddon|FGAddon aircraft development repository]].&lt;br /&gt;
&lt;br /&gt;
=== Installing on Windows ===&lt;br /&gt;
After you downloaded the installer, run it and follow its instructions to install FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen on Windows may block the installation simply because the binary file is not signed with a key that Microsoft respects. Of course, the key is paid. In this case, we need to click on the inconspicuous &amp;quot;More info&amp;quot; link. Only then will the &amp;quot;Run anyway&amp;quot; button appear. You can safely trust that this is not a dangerous application, as long as you have actually downloaded it from official sources.&lt;br /&gt;
&lt;br /&gt;
If you're using third-party antivirus software for some reason, it may be blocking FlightGear from installing. This isn't something we can control, so it's entirely up to you how you want to handle it.&lt;br /&gt;
&lt;br /&gt;
With the Windows installer, you may choose where to install FlightGear. The [[$FG_ROOT]] directory would be &amp;lt;code&amp;gt;&amp;amp;lt;your chosen directory&amp;amp;gt;/data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Installing on macOS ===&lt;br /&gt;
Installing FlightGear on macOS is very simple. Just drag and drop the FlightGear icon to the &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt; folder. That is it. &lt;br /&gt;
&lt;br /&gt;
The first time you launch FlightGear, its icon on the Dock bounces for several seconds while loading aircraft and airport info. When the GUI launcher appears, select the aircraft and airport, then click &amp;quot;Fly!&amp;quot; to launch the simulator. You can configure more options using the GUI launcher. See the [http://flightgear.sourceforge.net/manual/next/en/getstart-ench4.html#takeoff-how-to-start-the-program official manual] for more details.&lt;br /&gt;
&lt;br /&gt;
If you would like to launch FlightGear using command-line, launch the Terminal app and type the following.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options..... &lt;br /&gt;
&lt;br /&gt;
The [[$FG_ROOT]] and [[$FG_SCENERY]] are not set on macOS. If you want to specify these variables yourself for command-line use, run the followings on the Terminal app:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
After launching the GUI launcher, you will have the alias to [[$FG_ROOT]] at &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt; so you can browse the data folder using Finder.&lt;br /&gt;
&lt;br /&gt;
Note: Once you have installed FlightGear, Mac users can locate their [[$FG_ROOT]] folder by opening their applications folder in Finder, right clicking on FlightGear, and clicking &amp;quot;Show Package Contents&amp;quot;. This will take you inside the FlightGear folder. You are now able to access all files including Data/Aircraft to [[Howto: Install aircraft#Macintosh OS X|install new aircraft]].&lt;br /&gt;
&lt;br /&gt;
=== Installing from source ===&lt;br /&gt;
Main article: [[Building FlightGear]]&lt;br /&gt;
&lt;br /&gt;
=== Getting scenery ===&lt;br /&gt;
A limited set of [[scenery]] comes installed with FlightGear. For FlightGear 2024.1 this consists of &lt;br /&gt;
* The area surrounding the featured airport for the release which is [[Keflavik_Airport|Keflavik International Airport]] (BIKF)&lt;br /&gt;
* The tutorial airport for the [[Cessna_172P|Cessna 172P]] which is [[Hilo_International_Airport|Hilo International Airport]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
In FlightGear, scenery is generally stored in you [[$FG_ROOT]] directory, and is divided into three kinds of data:&lt;br /&gt;
* '''Airports''' holds airport data, like runway usage and parking spots.&lt;br /&gt;
* '''Objects''' and '''Models''' are the buildings, bridges and radio towers, etc. that represent three-dimensional structures.&lt;br /&gt;
* '''Terrain''' represents the contours, elevations and type of ground you fly/taxi over.&lt;br /&gt;
&lt;br /&gt;
The current way of &amp;quot;installing&amp;quot; new scenery is enabling [[TerraSync]], which will automatically download and update any place you visit - even on the fly! If you have a slow Internet connection and/or computer you could instead use a scenery manager, for example [[TerraMaster]].  In addition you can also manually download and install new scenery parts, either the official [[World Scenery]] or custom scenery.&lt;br /&gt;
&lt;br /&gt;
The scenery is also available on the [https://www.flightgear.org/download/mirrors/ mirrors page] of the FlightGear website, and can be installed following [[Howto: Install scenery]]. '''This is recommended for users with weak internet connections or weak computers!'''&lt;br /&gt;
&lt;br /&gt;
Custom scenery is available in many places. For example, on the {{forum link|f=5|text=FlightGear forum}} or within repositories. An internet search should be able to find them. See [[Suggested_custom_scenery|suggested custom scenery]] page for a few recent releases.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS and later added an experimental rollout of 3 dimensional buildings, roads, and objects based on OpenStreetMap data for the entire world to automatically downloaded TerraSync data - see [[OSM2City 1st Worldbuild|1st OSM2City world-build]] notes (March 2021).  Some manual downloads of 3d structures for regions or entire countries is available on the [[Areas populated with osm2city scenery|osm2City downloads]] wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Getting aircraft ===&lt;br /&gt;
Additional [[aircraft]] can be downloaded and installed through the [[Qt-launcher|launcher]]. Alternatively, you can go to the FlightGear website and navigate to the [http://www.flightgear.org/download/ download page], then choose the aircraft download link that fits your FlightGear version. In addition there are many third party [[hangars]]. For the installation, see [[Howto: Install aircraft]].&lt;br /&gt;
&lt;br /&gt;
== Running FlightGear ==&lt;br /&gt;
=== Starting FlightGear ===&lt;br /&gt;
The easiest way to start FlightGear is to use the desktop icon. This starts the graphical interface [[FlightGear Qt launcher]] where you can choose aircraft, start position etc.&amp;lt;!-- The following reminder should probably be removed once the launcher makes it clear there is further things to take care of using in-sim menus to get FG set up --&amp;gt; Remember the Qt launcher only has basic options to get you started. A lot of options for graphics, scenery, [[Weather|weather]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ environment], [[Input_device|input devices]] etc. are available from the [[menu]] inside the simulator.&lt;br /&gt;
&lt;br /&gt;
Many users choose however to start FlightGear directly from the command line. The executable name is &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; and can be run without options. If it is &amp;quot;not found&amp;quot;, it is likely not in your [https://en.wikipedia.org/wiki/PATH_(variable) path]. The location depends on your particular system and choices you made during compile and installation. There is a list of [[Command Line Parameters]] which must be used to change many options, like the aircraft you want. The most important:&lt;br /&gt;
 &lt;br /&gt;
 fgfs --launcher             # opens the FlightGear Qt launcher&lt;br /&gt;
 fgfs --show-aircraft        # displays a list of installed aircraft&lt;br /&gt;
 fgfs --aircraft=c172p       # start FG with the aircraft &amp;quot;c172p&amp;quot; (from the list)&lt;br /&gt;
&lt;br /&gt;
The Qt launcher also lets users add command line parameters for options that are normally changed from the menu inside the simulator, as well as quite advanced options that are only available from the command line (as of August 2020).&lt;br /&gt;
&lt;br /&gt;
=== Configuring rendering and UI ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|View &amp;gt; Rendering Options dialog.]]&lt;br /&gt;
If your render quality or framerate is too low, click &amp;quot;View &amp;gt; Rendering Options&amp;quot; to adjust the graphic settings. For newer hardware, it's recommended to set &amp;quot;graphics quality&amp;quot; to high and check &amp;quot;use disk space for faster loading&amp;quot;, &amp;quot;animated jetways&amp;quot; and &amp;quot;satellite photoscenery&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If the menu text appears too small on high DPI or large screens, you can manually [[Menubar#How to Change the Default Menubar Font Size|change the menubar font size]] by editing the data file, or simply click &amp;quot;Debug &amp;gt; Cycle GUI Style&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Using the keyboard and/or mouse ===&lt;br /&gt;
Users with limited access to a [[joystick]] or other controllers sometimes use the keyboard or mouse to control their aircraft. Using the keyboard to fly can be difficult and the mouse is recommended over the keyboard for flying, yet even a cheap joystick would improve the experience so much.&lt;br /&gt;
&lt;br /&gt;
To get help with keyboard commands, with FlightGear running, go to the ''Help'' menu, look under ''Basic Keys'' (for simulator related commands) and ''Common Aircraft Keys'' (for commands universal to all aircraft) and ''Aircraft Help'' (for key commands specific to your aircraft). If the main menu is hidden press {{key press|F10}}. If you come from other simulators, check [[key commands compared to other simulators]] for an overview of the difference between the key commands of that sim and FlightGear.&lt;br /&gt;
&lt;br /&gt;
To use the mouse to fly the aircraft, press {{key press|Tab}} (the cursor should change to a cross) and move the mouse to direct the aircraft. Press {{key press|Tab}} again to look around (cursor should show a two sided arrow), and press {{key press|Tab}} again to return to normal mode, used to click stuff in the cockpit.&lt;br /&gt;
&lt;br /&gt;
For most users lacking a rudder axis control, it’s difficult to manually coordinate [[aileron]] and [[rudder]] movements during a turn. To enable auto-coordination and make flight easier, you may click &amp;quot;Settings&amp;quot;, then click the &amp;quot;Show more&amp;quot; button on the right of &amp;quot;General&amp;quot;, and finally click &amp;quot;Enable auto-coordination&amp;quot; in the launcher.&lt;br /&gt;
&lt;br /&gt;
=== First time in the cockpit ===&lt;br /&gt;
Finding your way around the cockpit can be daunting the first time.&lt;br /&gt;
&lt;br /&gt;
Where is the &amp;quot;virtual cockpit&amp;quot;? Not all FlightGear aircraft come with an interior actually, some research projects may not even come with an exterior model. A 2D panel may display over the 3D cockpit if one exists. You may turn this off through ''Main Menu'' &amp;amp;gt; ''View'' &amp;amp;gt; ''View Options'' and deselecting ''Show 2D panel'' in the ''Display Options'' section, or by pressing {{key press|Shift|P}}. Otherwise, you should be sitting in the virtual cockpit when FlightGear starts, as long as the Cockpit View is selected (if not pressing {{key press|Ctrl|V}} should get you to the pilot view).&lt;br /&gt;
&lt;br /&gt;
You may find it difficult to read some of the displays, dials and gauges on the instrument panel. You can use the ''view'' mode of the mouse (press {{key press|Tab}} until you get a cursor shaped like a double arrow) to pan and the mouse wheel to zoom, or pan with the joystick hat and zoom with {{key press|X}} and {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
One of the first steps that many take on entering an unfamiliar cockpit is to press {{key press|Ctrl|C}} to highlight all the &amp;quot;hotspots&amp;quot;, that is instrument controls, buttons, knobs, etc. Many aircraft also offer a specific help menu.&lt;br /&gt;
&lt;br /&gt;
Some functions, such as starter or magneto, may be difficult to use or simply lack clickable &amp;quot;hotspots&amp;quot;, especially in aircraft models which are in development. In most cases you can go for the equivalent controls on a 2D panel or resort to the keyboard. The keyboard always work according to the assignments listed on the ''Help'' menu, but sometimes these are reassigned by an aircraft or configuration. Again, remember to check all the help dialogs.&lt;br /&gt;
&lt;br /&gt;
=== Starting the engine ===&lt;br /&gt;
You are eager to fly, but the engine is off. Well, turning on the engines is not always easy. Some aircraft have an ''autostart'' entry in their custom menu, but here is a general procedure that should work in many cases:&lt;br /&gt;
&lt;br /&gt;
In general to start the engine on a piston-engine type aircraft, you need (after making sure the game is not paused {{key press|p}}):&lt;br /&gt;
# Fuel: Some aircraft start the simulation with no fuel. You can add it in ''Equipment'' &amp;amp;gt; ''Fuel and Payload''.&lt;br /&gt;
# Correct fuel mixture: This is generally ''rich'', so push the red knob all the way in, or use the key {{key press|m}} to enrich ({{key press|Shift|m}} leans.)&lt;br /&gt;
# Magnetos set on ''both'': Turn the key or press {{key press|&amp;amp;#125;}} ''three times'' to move through ''R'', ''L'', ''Both''.&lt;br /&gt;
# Throttle: Some engines start better with a little gas.&lt;br /&gt;
# Run the starter: Click the ''Start'' position of the key on the panel, or press {{key press|s}}. Hold the starter for sufficient time, even 10 seconds.&lt;br /&gt;
&lt;br /&gt;
Starting all engines in a multi-engine aircraft is similar to the single engine - except you must follow the same start sequence for each and every engine. FlightGear provides a convenient way to do this for all engines at once: Press {{key press|~}} and all the procedure above will work for all the engines. Note though that the default 2D panel is connected to ''only one engine'' and the {{key press|~}} trick might not work. Also, give some gas to be sure that all the engines are on.&lt;br /&gt;
&lt;br /&gt;
These instructions may not work for jet aircraft, helicopters, or other types of aircraft with complex start procedures. Check the instructions in the aircraft help menu (press {{key press|?}}) and/or look at [[Aircraft|the aircraft's article on this wiki]]. In general to start the engine on a jet engine type aircraft, you need to:&lt;br /&gt;
# Set cutoff ''ON'' &lt;br /&gt;
# Engage the starter&lt;br /&gt;
# Once the engines spools up to approximately 5% N1, set cutoff ''OFF''&lt;br /&gt;
# Disengage the starter once the engine has reached operational speed&lt;br /&gt;
&lt;br /&gt;
== Learning to fly ==&lt;br /&gt;
=== FlightGear's Manual ===&lt;br /&gt;
FlightGear has an official [https://www.flightgear.org/support/manual/ manual] that covers the basics of flight. As a beginner, you may want to start with [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/en/HTML/getstart-ench8.html Chapter 8: A Basic Flight Simulator Tutorial].&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
Many aircraft have their own interactive [[tutorials|tutorial]]. With tutorials, you can learn to operate particular aircraft but also learn to fly. You can access tutorials by going to ''Main menu'' &amp;amp;gt; ''Help'' &amp;amp;gt; ''Tutorial''. A great place to start is the tutorial for the [[Cessna 172P]] aircraft, commonly used in real life to learn to fly fixed-winged aircraft.&lt;br /&gt;
&lt;br /&gt;
If the tutorial starts without a runway and surrounded by water, your setup of FlightGear is missing the scenery for the airport at which the tutorial was supposed to run. To get scenery see the [[#Getting scenery]] section above.&lt;br /&gt;
&lt;br /&gt;
== Making your first flight ==&lt;br /&gt;
=== Realism ===&lt;br /&gt;
One of the most frequent questions novice pilots ask about any flight simulator, but more so to FlightGear, is &amp;quot;Why is my aircraft turning left all the time?&amp;quot; Although it could be due to wind gusts crossing the runway, it is more likely due to the [[Understanding Propeller Torque and P-Factor|propeller torque and p-factor]].&lt;br /&gt;
&lt;br /&gt;
In certain other flight simulators, despite marketing slogans to the contrary, some settings are turned down to make the aircraft easier to fly. This reduces effects such as the above. The realism is always turned up in FlightGear.&lt;br /&gt;
&lt;br /&gt;
Here are some of the FlightGear realism points, which may be confusing to first time pilots:&lt;br /&gt;
* &amp;quot;Left turning syndrome&amp;quot; for the previously mentioned reasons.&lt;br /&gt;
* Compass turning error: A compass, when subjected to the forces of flight, tends to turn in the opposite direction for a brief period before settling on the correct heading. This is not a malfunction (see also the Wikipedia article {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* The Vertical Speed Indicator (VSI) is also subject to error.&lt;br /&gt;
* The [[Horizontal Situation Indicator]] (HSI) is driven by a gyroscope (that is why it is sometimes called a Directional Gyroscope), which is subject to ''gyro drift''. The indicator will drift from its current heading and must be periodically (every ~15 minutes) calibrated to agree with the magnetic compass heading.&lt;br /&gt;
* You cannot just cancel a turn or climb by centering the yoke or stick. You must turn or push the stick the other way to get to level and level flight. But even then, the plane will not maintain its altitude or heading by itself. A common mistake is trying to find a hands off yoke position. While with trimming one could leave the plane for a couple of seconds, one must use autopilot or constantly adjust the yoke.&lt;br /&gt;
&lt;br /&gt;
Many forces act on an aircraft in flight as well as on the [[avionics and instruments]] used for control and navigation, and may be counter-intuitive. Pilots must learn to recognize these phenomena and compensate for their effects. ''FlightGear models instrument errors that exist in the real world''.&lt;br /&gt;
&lt;br /&gt;
=== Airports and navigation aids ===&lt;br /&gt;
When you first start FlightGear, whether from the command line or the graphical interface of the launchers, you may wonder how to determine what airports are available. The launcher displays a list of airports, but you will not see details such as tower or [[ILS]] frequencies. You will not find a map showing [[VOR]]s and their frequencies. What can you do? See [[Getting aeronautical charts]].&lt;br /&gt;
&lt;br /&gt;
In-sim, there is a map you can use in ''Main Menu'' &amp;amp;gt; ''Equipment'' &amp;amp;gt; ''Map'', which will allow you to see navigation data and the position of airports and aids. For more help with navigation see [[Understanding navigation]].&lt;br /&gt;
&lt;br /&gt;
=== Flying using the autopilot ===&lt;br /&gt;
Some aircraft require you to use the [[autopilot]] available from the ''Autopilot'' menu, which is the original FlightGear autopilot. This is a ''generic'' autopilot and as such, many aircraft come with their own ''specific'' autopilot, frequently a model of the real life one.&lt;br /&gt;
&lt;br /&gt;
For aircraft that provide their own autopilot, you should use the autopilot controls available in the virtual cockpit. This means clicking on the instrument panel in the virtual cockpit. The Autopilot menu will be grayed out and unavailable when the aircraft supplies its own autopilot in some aircraft, including the Airbuses and the [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
The Cessna 172 comes with a [[Bendix/King KAP140 Autopilot]] in its virtual cockpit. You can use both the autopilot device in the cockpit and the [[Autopilot#Autopilot Settings|autopilot settings]] from the menu.&lt;br /&gt;
&lt;br /&gt;
== Advanced ==&lt;br /&gt;
=== Flying ===&lt;br /&gt;
{{Main article|Aircraft}}&lt;br /&gt;
&lt;br /&gt;
* If you continue to fly light civilian aircraft, [[Cessna 182S]] which is more complex than C172P and [[Piper PA28 Warrior II|PA28]] are good choices.&lt;br /&gt;
* If you are interested in flying airlines, [[Airbus A320 family]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] and [[MD-80]] are suggested.&lt;br /&gt;
* If you are fascinated by fighter aircrafts, choose a highly rated military aircraft (such as [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) from [[Aircraft#Modern military aircraft|here]], and enable multiplayer damage or install [[Bombable]].&lt;br /&gt;
* If you switch to helicopters, it is recommended to fly [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Besides common aircraft, there are also detailed [[Space Shuttle|space shuttles]] available.&lt;br /&gt;
&lt;br /&gt;
=== Scenery ===&lt;br /&gt;
It is fascinating to explore the [[scenery]] (or just test the graphics/frame rate) with [[UFO]]. First of all, [[#Configuring rendering and UI|increase your graphics quality]]. If you don't see buildings initially, keep FG open and wait for a while for [[TerraSync]] to finish downloading and for the buildings to appear.&lt;br /&gt;
There are plenty of [[Suggested airports|well-developed airports]] and scenery areas. You can also explore the scenery objects on the [https://scenery.flightgear.org/map model map].&lt;br /&gt;
&lt;br /&gt;
=== Multiplayer ===&lt;br /&gt;
FlightGear has some multiplayer servers that will let you fly in more lively skies, see [[Howto: Multiplayer]]. There are also [[OpenRadar]] and [[ATC-pie]], standalone programs that will let you be an [[Air traffic control|air traffic controller]].&lt;br /&gt;
&lt;br /&gt;
There is also a [[MPMap|multiplayer map]] that lets you see who is online right now, and even what [[navaids]] are nearby.&lt;br /&gt;
&lt;br /&gt;
=== Menu items ===&lt;br /&gt;
For a quick reference about the usage of each menu item in FlightGear, see [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Addons ===&lt;br /&gt;
FlightGear has a lot of third-party [[Addon|addons]] containing enhancements. For beginners, [[Logbook Add-on|Logbook]] and [[Which Runway Add-on|Which Runway]] may be the most useful addons.&lt;br /&gt;
&lt;br /&gt;
== The FlightGear community ==&lt;br /&gt;
=== Getting help ===&lt;br /&gt;
This page is designed to give the user the essential things they need to know about using FlightGear for the first time. Besides the [[Portal:User|User portal]] of this wiki, there are other pages you may want to read:&lt;br /&gt;
*[[Troubleshooting problems]] to help you with the most common issues;&lt;br /&gt;
*[[Frequently asked questions]];&lt;br /&gt;
...and communication channels that can be used to obtain information or request help:&lt;br /&gt;
*The [[FlightGear Manual]], a ''must read'' for beginners;&lt;br /&gt;
*{{forum link|text=FlightGear Forum}} and its subforums;&lt;br /&gt;
*[[Discord|FlightGear's Discord server]], the quickest way to get help;&lt;br /&gt;
*[[FlightGear IRC channel]];&lt;br /&gt;
*[[Mailing list|FlightGear users mailing list]], biggest chance to get in contact with core developers;&lt;br /&gt;
*Documents bundled with the release package.&lt;br /&gt;
&lt;br /&gt;
=== Customizing FlightGear without compiling it ===&lt;br /&gt;
[https://www.flightgear.org/download/ Our website] offers precompiled binaries for download and install on Windows, macOS and Linux. In addition, most Linux distributions provide a packaged version in their repositories.&lt;br /&gt;
&lt;br /&gt;
Although the install is binary, most of FlightGear's systems are open to configuration through [[XML]] files and [[NASAL scripting]]. You are free ''and encouraged'' to make changes to aircraft flight models, scenery, textures, OpenGL [[shader]]s and any other feature you wish to change for your personal satisfaction or to share with other FlightGear users. If this is what you intend to do, take a look at the [[Portal:Developer|Developer portal]].&lt;br /&gt;
&lt;br /&gt;
=== How you can help ===&lt;br /&gt;
{{Main article|Volunteer}}&lt;br /&gt;
FlightGear is an open source, volunteer based project. That means that whatever you find here comes from passion, spare time and nothing else. This includes the simulator, the scenery, the aircraft, the wiki, the {{forum link|text=forum}} and everything else. Volunteers, in essence ''people that do things'', are fundamental to this project. Without them, it would not make a single step forward. So it is essential that contributors have fun in what they do.&lt;br /&gt;
&lt;br /&gt;
If you plan to contribute to this project, you should take a look at some articles that will give you some hints:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process]]&lt;br /&gt;
*[[Implementing new features for FlightGear]]&lt;br /&gt;
*[[How the FlightGear project works]]&lt;br /&gt;
&lt;br /&gt;
The fields where their help would be appreciated are many:&lt;br /&gt;
;Testing:&lt;br /&gt;
*[[Building FlightGear|Build]] the latest Git code&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues File bug reports]&lt;br /&gt;
*Running FlightGear via valgrind to track down memory leaks&lt;br /&gt;
&lt;br /&gt;
;Support:&lt;br /&gt;
*Help new users with downloading, compiling, installing and running FlightGear ({{forum link|text=on the forum}} or on [[Discord]])&lt;br /&gt;
*Provide ideas &amp;amp; suggestions, see: [[Feature Requests / Proposals / Ideas]]&lt;br /&gt;
*Help [[Portal:Wiki|clean up this wiki]]&lt;br /&gt;
*Help provide new contents for missing wiki pages&lt;br /&gt;
&lt;br /&gt;
;Development:&lt;br /&gt;
*Core codebase:&lt;br /&gt;
**Provide [[Howto:Start core development|source code / data / documentation contributions]]&lt;br /&gt;
**Provide [[Bugs|bug fixes]] or new features&lt;br /&gt;
*Aircraft development (3D modeling, textures, FDMs, scripting)&lt;br /&gt;
*Scenery development (terrain, model, weather)&lt;br /&gt;
*Get involved in any of the other FlightGear-affiliated projects&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pl:Nowy w FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144747</id>
		<title>New to FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144747"/>
		<updated>2026-05-28T05:49:44Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* How you can help */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to [[FlightGear]]!''' Here we will try to get you up in the virtual air in the shortest time possible. We will also introduce you to some of the features of this flight simulator and also a few information on its community.&lt;br /&gt;
&lt;br /&gt;
== Installation and setup ==&lt;br /&gt;
=== Hardware requirements ===&lt;br /&gt;
For FlightGear to run smoothly, it requires a video card with OpenGL drivers 4.0 or higher. This is usually not a problem, but take a look at the [[hardware recommendations]] to have a better idea.&lt;br /&gt;
&lt;br /&gt;
=== Getting FlightGear ===&lt;br /&gt;
You may download the latest files from the [https://www.flightgear.org/download/ FlightGear download] page. Choose the source or binary files appropriate for your particular system. {{Wikipedia|AppImage|AppImage}} binary files for Linux are also available with 2020.3 LTS and later. Most Linux users will find that most distributions have a packaged version of FlightGear (the package name could be &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
Depending on your technical expertise you may choose the [[Git]] development version of FlightGear, which typically has more features and can be required by some of the latest developmental aircraft, but can be unstable and is more complicated to get for non-Windows users. In general, the development version is not advised to the average user, but if you are willing to do some testing there is a nightly build available for [https://www.flightgear.org/download/nightly/ download]. If you are using a Git version controlled copy of FlightGear, you may choose to synchronise your aircraft using the version controlled [[FGAddon|FGAddon aircraft development repository]].&lt;br /&gt;
&lt;br /&gt;
=== Installing on Windows ===&lt;br /&gt;
After you downloaded the installer, run it and follow its instructions to install FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen on Windows may block the installation simply because the binary file is not signed with a key that Microsoft respects. Of course, the key is paid. In this case, we need to click on the inconspicuous &amp;quot;More info&amp;quot; link. Only then will the &amp;quot;Run anyway&amp;quot; button appear. You can safely trust that this is not a dangerous application, as long as you have actually downloaded it from official sources.&lt;br /&gt;
&lt;br /&gt;
If you're using third-party antivirus software for some reason, it may be blocking FlightGear from installing. This isn't something we can control, so it's entirely up to you how you want to handle it.&lt;br /&gt;
&lt;br /&gt;
With the Windows installer, you may choose where to install FlightGear. The [[$FG_ROOT]] directory would be &amp;lt;code&amp;gt;&amp;amp;lt;your chosen directory&amp;amp;gt;/data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Installing on macOS ===&lt;br /&gt;
Installing FlightGear on macOS is very simple. Just drag and drop the FlightGear icon to the &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt; folder. That is it. &lt;br /&gt;
&lt;br /&gt;
The first time you launch FlightGear, its icon on the Dock bounces for several seconds while loading aircraft and airport info. When the GUI launcher appears, select the aircraft and airport, then click &amp;quot;Fly!&amp;quot; to launch the simulator. You can configure more options using the GUI launcher. See the [http://flightgear.sourceforge.net/manual/next/en/getstart-ench4.html#takeoff-how-to-start-the-program official manual] for more details.&lt;br /&gt;
&lt;br /&gt;
If you would like to launch FlightGear using command-line, launch the Terminal app and type the following.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options..... &lt;br /&gt;
&lt;br /&gt;
The [[$FG_ROOT]] and [[$FG_SCENERY]] are not set on macOS. If you want to specify these variables yourself for command-line use, run the followings on the Terminal app:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
After launching the GUI launcher, you will have the alias to [[$FG_ROOT]] at &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt; so you can browse the data folder using Finder.&lt;br /&gt;
&lt;br /&gt;
Note: Once you have installed FlightGear, Mac users can locate their [[$FG_ROOT]] folder by opening their applications folder in Finder, right clicking on FlightGear, and clicking &amp;quot;Show Package Contents&amp;quot;. This will take you inside the FlightGear folder. You are now able to access all files including Data/Aircraft to [[Howto: Install aircraft#Macintosh OS X|install new aircraft]].&lt;br /&gt;
&lt;br /&gt;
=== Installing from source ===&lt;br /&gt;
Main article: [[Building FlightGear]]&lt;br /&gt;
&lt;br /&gt;
=== Getting scenery ===&lt;br /&gt;
A limited set of [[scenery]] comes installed with FlightGear. For FlightGear 2024.1 this consists of &lt;br /&gt;
* The area surrounding the featured airport for the release which is [[Keflavik_Airport|Keflavik International Airport]] (BIKF)&lt;br /&gt;
* The tutorial airport for the [[Cessna_172P|Cessna 172P]] which is [[Hilo_International_Airport|Hilo International Airport]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
In FlightGear, scenery is generally stored in you [[$FG_ROOT]] directory, and is divided into three kinds of data:&lt;br /&gt;
* '''Airports''' holds airport data, like runway usage and parking spots.&lt;br /&gt;
* '''Objects''' and '''Models''' are the buildings, bridges and radio towers, etc. that represent three-dimensional structures.&lt;br /&gt;
* '''Terrain''' represents the contours, elevations and type of ground you fly/taxi over.&lt;br /&gt;
&lt;br /&gt;
The current way of &amp;quot;installing&amp;quot; new scenery is enabling [[TerraSync]], which will automatically download and update any place you visit - even on the fly! If you have a slow Internet connection and/or computer you could instead use a scenery manager, for example [[TerraMaster]].  In addition you can also manually download and install new scenery parts, either the official [[World Scenery]] or custom scenery.&lt;br /&gt;
&lt;br /&gt;
The scenery is also available on the [https://www.flightgear.org/download/mirrors/ mirrors page] of the FlightGear website, and can be installed following [[Howto: Install scenery]]. '''This is recommended for users with weak internet connections or weak computers!'''&lt;br /&gt;
&lt;br /&gt;
Custom scenery is available in many places. For example, on the {{forum link|f=5|text=FlightGear forum}} or within repositories. An internet search should be able to find them. See [[Suggested_custom_scenery|suggested custom scenery]] page for a few recent releases.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS and later added an experimental rollout of 3 dimensional buildings, roads, and objects based on OpenStreetMap data for the entire world to automatically downloaded TerraSync data - see [[OSM2City 1st Worldbuild|1st OSM2City world-build]] notes (March 2021).  Some manual downloads of 3d structures for regions or entire countries is available on the [[Areas populated with osm2city scenery|osm2City downloads]] wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Getting aircraft ===&lt;br /&gt;
Additional [[aircraft]] can be downloaded and installed through the [[Qt-launcher|launcher]]. Alternatively, you can go to the FlightGear website and navigate to the [http://www.flightgear.org/download/ download page], then choose the aircraft download link that fits your FlightGear version. In addition there are many third party [[hangars]]. For the installation, see [[Howto: Install aircraft]].&lt;br /&gt;
&lt;br /&gt;
== Running FlightGear ==&lt;br /&gt;
=== Starting FlightGear ===&lt;br /&gt;
The easiest way to start FlightGear is to use the desktop icon. This starts the graphical interface [[FlightGear Qt launcher]] where you can choose aircraft, start position etc.&amp;lt;!-- The following reminder should probably be removed once the launcher makes it clear there is further things to take care of using in-sim menus to get FG set up --&amp;gt; Remember the Qt launcher only has basic options to get you started. A lot of options for graphics, scenery, [[Weather|weather]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ environment], [[Input_device|input devices]] etc. are available from the [[menu]] inside the simulator.&lt;br /&gt;
&lt;br /&gt;
Many users choose however to start FlightGear directly from the command line. The executable name is &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; and can be run without options. If it is &amp;quot;not found&amp;quot;, it is likely not in your [https://en.wikipedia.org/wiki/PATH_(variable) path]. The location depends on your particular system and choices you made during compile and installation. There is a list of [[Command Line Parameters]] which must be used to change many options, like the aircraft you want. The most important:&lt;br /&gt;
 &lt;br /&gt;
 fgfs --launcher             # opens the FlightGear Qt launcher&lt;br /&gt;
 fgfs --show-aircraft        # displays a list of installed aircraft&lt;br /&gt;
 fgfs --aircraft=c172p       # start FG with the aircraft &amp;quot;c172p&amp;quot; (from the list)&lt;br /&gt;
&lt;br /&gt;
The Qt launcher also lets users add command line parameters for options that are normally changed from the menu inside the simulator, as well as quite advanced options that are only available from the command line (as of August 2020).&lt;br /&gt;
&lt;br /&gt;
=== Configuring rendering and UI ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|View &amp;gt; Rendering Options dialog.]]&lt;br /&gt;
If your render quality or framerate is too low, click &amp;quot;View &amp;gt; Rendering Options&amp;quot; to adjust the graphic settings. For newer hardware, it's recommended to set &amp;quot;graphics quality&amp;quot; to high and check &amp;quot;use disk space for faster loading&amp;quot;, &amp;quot;animated jetways&amp;quot; and &amp;quot;satellite photoscenery&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If the menu text appears too small on high DPI or large screens, you can manually [[Menubar#How to Change the Default Menubar Font Size|change the menubar font size]] by editing the data file, or simply click &amp;quot;Debug &amp;gt; Cycle GUI Style&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Using the keyboard and/or mouse ===&lt;br /&gt;
Users with limited access to a [[joystick]] or other controllers sometimes use the keyboard or mouse to control their aircraft. Using the keyboard to fly can be difficult and the mouse is recommended over the keyboard for flying, yet even a cheap joystick would improve the experience so much.&lt;br /&gt;
&lt;br /&gt;
To get help with keyboard commands, with FlightGear running, go to the ''Help'' menu, look under ''Basic Keys'' (for simulator related commands) and ''Common Aircraft Keys'' (for commands universal to all aircraft) and ''Aircraft Help'' (for key commands specific to your aircraft). If the main menu is hidden press {{key press|F10}}. If you come from other simulators, check [[key commands compared to other simulators]] for an overview of the difference between the key commands of that sim and FlightGear.&lt;br /&gt;
&lt;br /&gt;
To use the mouse to fly the aircraft, press {{key press|Tab}} (the cursor should change to a cross) and move the mouse to direct the aircraft. Press {{key press|Tab}} again to look around (cursor should show a two sided arrow), and press {{key press|Tab}} again to return to normal mode, used to click stuff in the cockpit.&lt;br /&gt;
&lt;br /&gt;
For most users lacking a rudder axis control, it’s difficult to manually coordinate [[aileron]] and [[rudder]] movements during a turn. To enable auto-coordination and make flight easier, you may click &amp;quot;Settings&amp;quot;, then click the &amp;quot;Show more&amp;quot; button on the right of &amp;quot;General&amp;quot;, and finally click &amp;quot;Enable auto-coordination&amp;quot; in the launcher.&lt;br /&gt;
&lt;br /&gt;
=== First time in the cockpit ===&lt;br /&gt;
Finding your way around the cockpit can be daunting the first time.&lt;br /&gt;
&lt;br /&gt;
Where is the &amp;quot;virtual cockpit&amp;quot;? Not all FlightGear aircraft come with an interior actually, some research projects may not even come with an exterior model. A 2D panel may display over the 3D cockpit if one exists. You may turn this off through ''Main Menu'' &amp;amp;gt; ''View'' &amp;amp;gt; ''View Options'' and deselecting ''Show 2D panel'' in the ''Display Options'' section, or by pressing {{key press|Shift|P}}. Otherwise, you should be sitting in the virtual cockpit when FlightGear starts, as long as the Cockpit View is selected (if not pressing {{key press|Ctrl|V}} should get you to the pilot view).&lt;br /&gt;
&lt;br /&gt;
You may find it difficult to read some of the displays, dials and gauges on the instrument panel. You can use the ''view'' mode of the mouse (press {{key press|Tab}} until you get a cursor shaped like a double arrow) to pan and the mouse wheel to zoom, or pan with the joystick hat and zoom with {{key press|X}} and {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
One of the first steps that many take on entering an unfamiliar cockpit is to press {{key press|Ctrl|C}} to highlight all the &amp;quot;hotspots&amp;quot;, that is instrument controls, buttons, knobs, etc. Many aircraft also offer a specific help menu.&lt;br /&gt;
&lt;br /&gt;
Some functions, such as starter or magneto, may be difficult to use or simply lack clickable &amp;quot;hotspots&amp;quot;, especially in aircraft models which are in development. In most cases you can go for the equivalent controls on a 2D panel or resort to the keyboard. The keyboard always work according to the assignments listed on the ''Help'' menu, but sometimes these are reassigned by an aircraft or configuration. Again, remember to check all the help dialogs.&lt;br /&gt;
&lt;br /&gt;
=== Starting the engine ===&lt;br /&gt;
You are eager to fly, but the engine is off. Well, turning on the engines is not always easy. Some aircraft have an ''autostart'' entry in their custom menu, but here is a general procedure that should work in many cases:&lt;br /&gt;
&lt;br /&gt;
In general to start the engine on a piston-engine type aircraft, you need (after making sure the game is not paused {{key press|p}}):&lt;br /&gt;
# Fuel: Some aircraft start the simulation with no fuel. You can add it in ''Equipment'' &amp;amp;gt; ''Fuel and Payload''.&lt;br /&gt;
# Correct fuel mixture: This is generally ''rich'', so push the red knob all the way in, or use the key {{key press|m}} to enrich ({{key press|Shift|m}} leans.)&lt;br /&gt;
# Magnetos set on ''both'': Turn the key or press {{key press|&amp;amp;#125;}} ''three times'' to move through ''R'', ''L'', ''Both''.&lt;br /&gt;
# Throttle: Some engines start better with a little gas.&lt;br /&gt;
# Run the starter: Click the ''Start'' position of the key on the panel, or press {{key press|s}}. Hold the starter for sufficient time, even 10 seconds.&lt;br /&gt;
&lt;br /&gt;
Starting all engines in a multi-engine aircraft is similar to the single engine - except you must follow the same start sequence for each and every engine. FlightGear provides a convenient way to do this for all engines at once: Press {{key press|~}} and all the procedure above will work for all the engines. Note though that the default 2D panel is connected to ''only one engine'' and the {{key press|~}} trick might not work. Also, give some gas to be sure that all the engines are on.&lt;br /&gt;
&lt;br /&gt;
These instructions may not work for jet aircraft, helicopters, or other types of aircraft with complex start procedures. Check the instructions in the aircraft help menu (press {{key press|?}}) and/or look at [[Aircraft|the aircraft's article on this wiki]]. In general to start the engine on a jet engine type aircraft, you need to:&lt;br /&gt;
# Set cutoff ''ON'' &lt;br /&gt;
# Engage the starter&lt;br /&gt;
# Once the engines spools up to approximately 5% N1, set cutoff ''OFF''&lt;br /&gt;
# Disengage the starter once the engine has reached operational speed&lt;br /&gt;
&lt;br /&gt;
== Learning to fly ==&lt;br /&gt;
=== FlightGear's Manual ===&lt;br /&gt;
FlightGear has an official [https://www.flightgear.org/support/manual/ manual] that covers the basics of flight. As a beginner, you may want to start with [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/en/HTML/getstart-ench8.html Chapter 8: A Basic Flight Simulator Tutorial].&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
Many aircraft have their own interactive [[tutorials|tutorial]]. With tutorials, you can learn to operate particular aircraft but also learn to fly. You can access tutorials by going to ''Main menu'' &amp;amp;gt; ''Help'' &amp;amp;gt; ''Tutorial''. A great place to start is the tutorial for the [[Cessna 172P]] aircraft, commonly used in real life to learn to fly fixed-winged aircraft.&lt;br /&gt;
&lt;br /&gt;
If the tutorial starts without a runway and surrounded by water, your setup of FlightGear is missing the scenery for the airport at which the tutorial was supposed to run. To get scenery see the [[#Getting scenery]] section above.&lt;br /&gt;
&lt;br /&gt;
== Making your first flight ==&lt;br /&gt;
=== Realism ===&lt;br /&gt;
One of the most frequent questions novice pilots ask about any flight simulator, but more so to FlightGear, is &amp;quot;Why is my aircraft turning left all the time?&amp;quot; Although it could be due to wind gusts crossing the runway, it is more likely due to the [[Understanding Propeller Torque and P-Factor|propeller torque and p-factor]].&lt;br /&gt;
&lt;br /&gt;
In certain other flight simulators, despite marketing slogans to the contrary, some settings are turned down to make the aircraft easier to fly. This reduces effects such as the above. The realism is always turned up in FlightGear.&lt;br /&gt;
&lt;br /&gt;
Here are some of the FlightGear realism points, which may be confusing to first time pilots:&lt;br /&gt;
* &amp;quot;Left turning syndrome&amp;quot; for the previously mentioned reasons.&lt;br /&gt;
* Compass turning error: A compass, when subjected to the forces of flight, tends to turn in the opposite direction for a brief period before settling on the correct heading. This is not a malfunction (see also the Wikipedia article {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* The Vertical Speed Indicator (VSI) is also subject to error.&lt;br /&gt;
* The [[Horizontal Situation Indicator]] (HSI) is driven by a gyroscope (that is why it is sometimes called a Directional Gyroscope), which is subject to ''gyro drift''. The indicator will drift from its current heading and must be periodically (every ~15 minutes) calibrated to agree with the magnetic compass heading.&lt;br /&gt;
* You cannot just cancel a turn or climb by centering the yoke or stick. You must turn or push the stick the other way to get to level and level flight. But even then, the plane will not maintain its altitude or heading by itself. A common mistake is trying to find a hands off yoke position. While with trimming one could leave the plane for a couple of seconds, one must use autopilot or constantly adjust the yoke.&lt;br /&gt;
&lt;br /&gt;
Many forces act on an aircraft in flight as well as on the [[avionics and instruments]] used for control and navigation, and may be counter-intuitive. Pilots must learn to recognize these phenomena and compensate for their effects. ''FlightGear models instrument errors that exist in the real world''.&lt;br /&gt;
&lt;br /&gt;
=== Airports and navigation aids ===&lt;br /&gt;
When you first start FlightGear, whether from the command line or the graphical interface of the launchers, you may wonder how to determine what airports are available. The launcher displays a list of airports, but you will not see details such as tower or [[ILS]] frequencies. You will not find a map showing [[VOR]]s and their frequencies. What can you do? See [[Getting aeronautical charts]].&lt;br /&gt;
&lt;br /&gt;
In-sim, there is a map you can use in ''Main Menu'' &amp;amp;gt; ''Equipment'' &amp;amp;gt; ''Map'', which will allow you to see navigation data and the position of airports and aids. For more help with navigation see [[Understanding navigation]].&lt;br /&gt;
&lt;br /&gt;
=== Flying using the autopilot ===&lt;br /&gt;
Some aircraft require you to use the [[autopilot]] available from the ''Autopilot'' menu, which is the original FlightGear autopilot. This is a ''generic'' autopilot and as such, many aircraft come with their own ''specific'' autopilot, frequently a model of the real life one.&lt;br /&gt;
&lt;br /&gt;
For aircraft that provide their own autopilot, you should use the autopilot controls available in the virtual cockpit. This means clicking on the instrument panel in the virtual cockpit. The Autopilot menu will be grayed out and unavailable when the aircraft supplies its own autopilot in some aircraft, including the Airbuses and the [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
The Cessna 172 comes with a [[Bendix/King KAP140 Autopilot]] in its virtual cockpit. You can use both the autopilot device in the cockpit and the [[Autopilot#Autopilot Settings|autopilot settings]] from the menu.&lt;br /&gt;
&lt;br /&gt;
== Advanced ==&lt;br /&gt;
=== Flying ===&lt;br /&gt;
{{Main article|Aircraft}}&lt;br /&gt;
&lt;br /&gt;
* If you continue to fly light civilian aircraft, [[Cessna 182S]] which is more complex than C172P and [[Piper PA28 Warrior II|PA28]] are good choices.&lt;br /&gt;
* If you are interested in flying airlines, [[Airbus A320 family]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] and [[MD-80]] are suggested.&lt;br /&gt;
* If you are fascinated by fighter aircrafts, choose a highly rated military aircraft (such as [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) from [[Aircraft#Modern military aircraft|here]], and enable multiplayer damage or install [[Bombable]].&lt;br /&gt;
* If you switch to helicopters, it is recommended to fly [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Besides common aircraft, there are also detailed [[Space Shuttle|space shuttles]] available.&lt;br /&gt;
&lt;br /&gt;
=== Scenery ===&lt;br /&gt;
It is fascinating to explore the [[scenery]] (or just test the graphics/frame rate) with [[UFO]]. First of all, [[#Configuring rendering and UI|increase your graphics quality]]. If you don't see buildings initially, keep FG open and wait for a while for [[TerraSync]] to finish downloading and for the buildings to appear.&lt;br /&gt;
There are plenty of [[Suggested airports|well-developed airports]] and scenery areas. You can also explore the scenery objects on the [https://scenery.flightgear.org/map model map].&lt;br /&gt;
&lt;br /&gt;
=== Multiplayer ===&lt;br /&gt;
FlightGear has some multiplayer servers that will let you fly in more lively skies, see [[Howto: Multiplayer]]. There are also [[OpenRadar]] and [[ATC-pie]], standalone programs that will let you be an [[Air traffic control|air traffic controller]].&lt;br /&gt;
&lt;br /&gt;
There is also a [[MPMap|multiplayer map]] that lets you see who is online right now, and even what [[navaids]] are nearby.&lt;br /&gt;
&lt;br /&gt;
=== Menu items ===&lt;br /&gt;
For a quick reference about the usage of each menu item in FlightGear, see [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Addons ===&lt;br /&gt;
FlightGear has a lot of third-party [[Addon|addons]] containing enhancements. For beginners, [[Logbook Add-on|Logbook]] and [[Which Runway Add-on|Which Runway]] may be the most useful addons.&lt;br /&gt;
&lt;br /&gt;
== The FlightGear community ==&lt;br /&gt;
=== Getting help ===&lt;br /&gt;
This page is designed to give the user the essential things they need to know about using FlightGear for the first time. Besides the [[Portal:User|User portal]] of this wiki, there are other pages you may want to read:&lt;br /&gt;
*[[Troubleshooting problems]] to help you with the most common issues;&lt;br /&gt;
*[[Frequently asked questions]];&lt;br /&gt;
...and communication channels that can be used to obtain information or request help:&lt;br /&gt;
*The [[FlightGear Manual]], a ''must read'' for beginners;&lt;br /&gt;
*{{forum link|text=FlightGear Forum}} and its subforums;&lt;br /&gt;
*[[Discord|FlightGear's Discord server]], the quickest way to get help;&lt;br /&gt;
*[[FlightGear IRC channel]];&lt;br /&gt;
*[[Mailing list|FlightGear users mailing list]], biggest chance to get in contact with core developers;&lt;br /&gt;
*Documents bundled with the release package.&lt;br /&gt;
&lt;br /&gt;
=== Customizing FlightGear without compiling it ===&lt;br /&gt;
[https://www.flightgear.org/download/ Our website] offers precompiled binaries for download and install on Windows, macOS and Linux. In addition, most Linux distributions provide a packaged version in their repositories.&lt;br /&gt;
&lt;br /&gt;
Although the install is binary, most of FlightGear's systems are open to configuration through [[XML]] files and [[NASAL scripting]]. You are free ''and encouraged'' to make changes to aircraft flight models, scenery, textures, OpenGL [[shader]]s and any other feature you wish to change for your personal satisfaction or to share with other FlightGear users. If this is what you intend to do, take a look at the [[Portal:Developer|Developer portal]].&lt;br /&gt;
&lt;br /&gt;
=== How you can help ===&lt;br /&gt;
{{Main article|Volunteer}}&lt;br /&gt;
FlightGear is an open source, volunteer based project. That means that whatever you find here comes from passion, spare time and nothing else. This includes the simulator, the scenery, the aircraft, the wiki, the {{forum link|text=forum}} and everything else. Volunteers, in essence ''people that do things'', are fundamental to this project. Without them, it would not make a single step forward. So it is essential that contributors have fun in what they do.&lt;br /&gt;
&lt;br /&gt;
If you plan to contribute to this project, you should take a look at some articles that will give you some hints:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process]]&lt;br /&gt;
*[[Implementing new features for FlightGear]]&lt;br /&gt;
*[[How the FlightGear project works]]&lt;br /&gt;
&lt;br /&gt;
There are never enough people contributing, and the fields where their help would be appreciated are many:&lt;br /&gt;
;Testing:&lt;br /&gt;
*[[Building FlightGear|Build]] the latest Git code&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues File bug reports]&lt;br /&gt;
*Running FlightGear via valgrind to track down memory leaks&lt;br /&gt;
&lt;br /&gt;
;Support:&lt;br /&gt;
*Help new users with downloading, compiling, installing and running FlightGear ({{forum link|text=on the forum}} or on [[Discord]])&lt;br /&gt;
*Provide ideas &amp;amp; suggestions, see: [[Feature Requests / Proposals / Ideas]]&lt;br /&gt;
*Help [[Portal:Wiki|clean up this wiki]]&lt;br /&gt;
*Help provide new contents for missing wiki pages&lt;br /&gt;
&lt;br /&gt;
;Development:&lt;br /&gt;
*Core codebase:&lt;br /&gt;
**Provide [[Howto:Start core development|source code/data/documentation contributions]]&lt;br /&gt;
**Provide [[Bugs|bug fixes]] or new features&lt;br /&gt;
*Aircraft development (3D modeling, textures, FDMs, scripting)&lt;br /&gt;
*Scenery development (terrain, model, weather)&lt;br /&gt;
*Get involved in any of the other FlightGear-affiliated projects&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pl:Nowy w FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144746</id>
		<title>New to FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144746"/>
		<updated>2026-05-28T05:49:12Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* How you can help */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to [[FlightGear]]!''' Here we will try to get you up in the virtual air in the shortest time possible. We will also introduce you to some of the features of this flight simulator and also a few information on its community.&lt;br /&gt;
&lt;br /&gt;
== Installation and setup ==&lt;br /&gt;
=== Hardware requirements ===&lt;br /&gt;
For FlightGear to run smoothly, it requires a video card with OpenGL drivers 4.0 or higher. This is usually not a problem, but take a look at the [[hardware recommendations]] to have a better idea.&lt;br /&gt;
&lt;br /&gt;
=== Getting FlightGear ===&lt;br /&gt;
You may download the latest files from the [https://www.flightgear.org/download/ FlightGear download] page. Choose the source or binary files appropriate for your particular system. {{Wikipedia|AppImage|AppImage}} binary files for Linux are also available with 2020.3 LTS and later. Most Linux users will find that most distributions have a packaged version of FlightGear (the package name could be &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
Depending on your technical expertise you may choose the [[Git]] development version of FlightGear, which typically has more features and can be required by some of the latest developmental aircraft, but can be unstable and is more complicated to get for non-Windows users. In general, the development version is not advised to the average user, but if you are willing to do some testing there is a nightly build available for [https://www.flightgear.org/download/nightly/ download]. If you are using a Git version controlled copy of FlightGear, you may choose to synchronise your aircraft using the version controlled [[FGAddon|FGAddon aircraft development repository]].&lt;br /&gt;
&lt;br /&gt;
=== Installing on Windows ===&lt;br /&gt;
After you downloaded the installer, run it and follow its instructions to install FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen on Windows may block the installation simply because the binary file is not signed with a key that Microsoft respects. Of course, the key is paid. In this case, we need to click on the inconspicuous &amp;quot;More info&amp;quot; link. Only then will the &amp;quot;Run anyway&amp;quot; button appear. You can safely trust that this is not a dangerous application, as long as you have actually downloaded it from official sources.&lt;br /&gt;
&lt;br /&gt;
If you're using third-party antivirus software for some reason, it may be blocking FlightGear from installing. This isn't something we can control, so it's entirely up to you how you want to handle it.&lt;br /&gt;
&lt;br /&gt;
With the Windows installer, you may choose where to install FlightGear. The [[$FG_ROOT]] directory would be &amp;lt;code&amp;gt;&amp;amp;lt;your chosen directory&amp;amp;gt;/data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Installing on macOS ===&lt;br /&gt;
Installing FlightGear on macOS is very simple. Just drag and drop the FlightGear icon to the &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt; folder. That is it. &lt;br /&gt;
&lt;br /&gt;
The first time you launch FlightGear, its icon on the Dock bounces for several seconds while loading aircraft and airport info. When the GUI launcher appears, select the aircraft and airport, then click &amp;quot;Fly!&amp;quot; to launch the simulator. You can configure more options using the GUI launcher. See the [http://flightgear.sourceforge.net/manual/next/en/getstart-ench4.html#takeoff-how-to-start-the-program official manual] for more details.&lt;br /&gt;
&lt;br /&gt;
If you would like to launch FlightGear using command-line, launch the Terminal app and type the following.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options..... &lt;br /&gt;
&lt;br /&gt;
The [[$FG_ROOT]] and [[$FG_SCENERY]] are not set on macOS. If you want to specify these variables yourself for command-line use, run the followings on the Terminal app:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
After launching the GUI launcher, you will have the alias to [[$FG_ROOT]] at &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt; so you can browse the data folder using Finder.&lt;br /&gt;
&lt;br /&gt;
Note: Once you have installed FlightGear, Mac users can locate their [[$FG_ROOT]] folder by opening their applications folder in Finder, right clicking on FlightGear, and clicking &amp;quot;Show Package Contents&amp;quot;. This will take you inside the FlightGear folder. You are now able to access all files including Data/Aircraft to [[Howto: Install aircraft#Macintosh OS X|install new aircraft]].&lt;br /&gt;
&lt;br /&gt;
=== Installing from source ===&lt;br /&gt;
Main article: [[Building FlightGear]]&lt;br /&gt;
&lt;br /&gt;
=== Getting scenery ===&lt;br /&gt;
A limited set of [[scenery]] comes installed with FlightGear. For FlightGear 2024.1 this consists of &lt;br /&gt;
* The area surrounding the featured airport for the release which is [[Keflavik_Airport|Keflavik International Airport]] (BIKF)&lt;br /&gt;
* The tutorial airport for the [[Cessna_172P|Cessna 172P]] which is [[Hilo_International_Airport|Hilo International Airport]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
In FlightGear, scenery is generally stored in you [[$FG_ROOT]] directory, and is divided into three kinds of data:&lt;br /&gt;
* '''Airports''' holds airport data, like runway usage and parking spots.&lt;br /&gt;
* '''Objects''' and '''Models''' are the buildings, bridges and radio towers, etc. that represent three-dimensional structures.&lt;br /&gt;
* '''Terrain''' represents the contours, elevations and type of ground you fly/taxi over.&lt;br /&gt;
&lt;br /&gt;
The current way of &amp;quot;installing&amp;quot; new scenery is enabling [[TerraSync]], which will automatically download and update any place you visit - even on the fly! If you have a slow Internet connection and/or computer you could instead use a scenery manager, for example [[TerraMaster]].  In addition you can also manually download and install new scenery parts, either the official [[World Scenery]] or custom scenery.&lt;br /&gt;
&lt;br /&gt;
The scenery is also available on the [https://www.flightgear.org/download/mirrors/ mirrors page] of the FlightGear website, and can be installed following [[Howto: Install scenery]]. '''This is recommended for users with weak internet connections or weak computers!'''&lt;br /&gt;
&lt;br /&gt;
Custom scenery is available in many places. For example, on the {{forum link|f=5|text=FlightGear forum}} or within repositories. An internet search should be able to find them. See [[Suggested_custom_scenery|suggested custom scenery]] page for a few recent releases.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS and later added an experimental rollout of 3 dimensional buildings, roads, and objects based on OpenStreetMap data for the entire world to automatically downloaded TerraSync data - see [[OSM2City 1st Worldbuild|1st OSM2City world-build]] notes (March 2021).  Some manual downloads of 3d structures for regions or entire countries is available on the [[Areas populated with osm2city scenery|osm2City downloads]] wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Getting aircraft ===&lt;br /&gt;
Additional [[aircraft]] can be downloaded and installed through the [[Qt-launcher|launcher]]. Alternatively, you can go to the FlightGear website and navigate to the [http://www.flightgear.org/download/ download page], then choose the aircraft download link that fits your FlightGear version. In addition there are many third party [[hangars]]. For the installation, see [[Howto: Install aircraft]].&lt;br /&gt;
&lt;br /&gt;
== Running FlightGear ==&lt;br /&gt;
=== Starting FlightGear ===&lt;br /&gt;
The easiest way to start FlightGear is to use the desktop icon. This starts the graphical interface [[FlightGear Qt launcher]] where you can choose aircraft, start position etc.&amp;lt;!-- The following reminder should probably be removed once the launcher makes it clear there is further things to take care of using in-sim menus to get FG set up --&amp;gt; Remember the Qt launcher only has basic options to get you started. A lot of options for graphics, scenery, [[Weather|weather]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ environment], [[Input_device|input devices]] etc. are available from the [[menu]] inside the simulator.&lt;br /&gt;
&lt;br /&gt;
Many users choose however to start FlightGear directly from the command line. The executable name is &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; and can be run without options. If it is &amp;quot;not found&amp;quot;, it is likely not in your [https://en.wikipedia.org/wiki/PATH_(variable) path]. The location depends on your particular system and choices you made during compile and installation. There is a list of [[Command Line Parameters]] which must be used to change many options, like the aircraft you want. The most important:&lt;br /&gt;
 &lt;br /&gt;
 fgfs --launcher             # opens the FlightGear Qt launcher&lt;br /&gt;
 fgfs --show-aircraft        # displays a list of installed aircraft&lt;br /&gt;
 fgfs --aircraft=c172p       # start FG with the aircraft &amp;quot;c172p&amp;quot; (from the list)&lt;br /&gt;
&lt;br /&gt;
The Qt launcher also lets users add command line parameters for options that are normally changed from the menu inside the simulator, as well as quite advanced options that are only available from the command line (as of August 2020).&lt;br /&gt;
&lt;br /&gt;
=== Configuring rendering and UI ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|View &amp;gt; Rendering Options dialog.]]&lt;br /&gt;
If your render quality or framerate is too low, click &amp;quot;View &amp;gt; Rendering Options&amp;quot; to adjust the graphic settings. For newer hardware, it's recommended to set &amp;quot;graphics quality&amp;quot; to high and check &amp;quot;use disk space for faster loading&amp;quot;, &amp;quot;animated jetways&amp;quot; and &amp;quot;satellite photoscenery&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If the menu text appears too small on high DPI or large screens, you can manually [[Menubar#How to Change the Default Menubar Font Size|change the menubar font size]] by editing the data file, or simply click &amp;quot;Debug &amp;gt; Cycle GUI Style&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Using the keyboard and/or mouse ===&lt;br /&gt;
Users with limited access to a [[joystick]] or other controllers sometimes use the keyboard or mouse to control their aircraft. Using the keyboard to fly can be difficult and the mouse is recommended over the keyboard for flying, yet even a cheap joystick would improve the experience so much.&lt;br /&gt;
&lt;br /&gt;
To get help with keyboard commands, with FlightGear running, go to the ''Help'' menu, look under ''Basic Keys'' (for simulator related commands) and ''Common Aircraft Keys'' (for commands universal to all aircraft) and ''Aircraft Help'' (for key commands specific to your aircraft). If the main menu is hidden press {{key press|F10}}. If you come from other simulators, check [[key commands compared to other simulators]] for an overview of the difference between the key commands of that sim and FlightGear.&lt;br /&gt;
&lt;br /&gt;
To use the mouse to fly the aircraft, press {{key press|Tab}} (the cursor should change to a cross) and move the mouse to direct the aircraft. Press {{key press|Tab}} again to look around (cursor should show a two sided arrow), and press {{key press|Tab}} again to return to normal mode, used to click stuff in the cockpit.&lt;br /&gt;
&lt;br /&gt;
For most users lacking a rudder axis control, it’s difficult to manually coordinate [[aileron]] and [[rudder]] movements during a turn. To enable auto-coordination and make flight easier, you may click &amp;quot;Settings&amp;quot;, then click the &amp;quot;Show more&amp;quot; button on the right of &amp;quot;General&amp;quot;, and finally click &amp;quot;Enable auto-coordination&amp;quot; in the launcher.&lt;br /&gt;
&lt;br /&gt;
=== First time in the cockpit ===&lt;br /&gt;
Finding your way around the cockpit can be daunting the first time.&lt;br /&gt;
&lt;br /&gt;
Where is the &amp;quot;virtual cockpit&amp;quot;? Not all FlightGear aircraft come with an interior actually, some research projects may not even come with an exterior model. A 2D panel may display over the 3D cockpit if one exists. You may turn this off through ''Main Menu'' &amp;amp;gt; ''View'' &amp;amp;gt; ''View Options'' and deselecting ''Show 2D panel'' in the ''Display Options'' section, or by pressing {{key press|Shift|P}}. Otherwise, you should be sitting in the virtual cockpit when FlightGear starts, as long as the Cockpit View is selected (if not pressing {{key press|Ctrl|V}} should get you to the pilot view).&lt;br /&gt;
&lt;br /&gt;
You may find it difficult to read some of the displays, dials and gauges on the instrument panel. You can use the ''view'' mode of the mouse (press {{key press|Tab}} until you get a cursor shaped like a double arrow) to pan and the mouse wheel to zoom, or pan with the joystick hat and zoom with {{key press|X}} and {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
One of the first steps that many take on entering an unfamiliar cockpit is to press {{key press|Ctrl|C}} to highlight all the &amp;quot;hotspots&amp;quot;, that is instrument controls, buttons, knobs, etc. Many aircraft also offer a specific help menu.&lt;br /&gt;
&lt;br /&gt;
Some functions, such as starter or magneto, may be difficult to use or simply lack clickable &amp;quot;hotspots&amp;quot;, especially in aircraft models which are in development. In most cases you can go for the equivalent controls on a 2D panel or resort to the keyboard. The keyboard always work according to the assignments listed on the ''Help'' menu, but sometimes these are reassigned by an aircraft or configuration. Again, remember to check all the help dialogs.&lt;br /&gt;
&lt;br /&gt;
=== Starting the engine ===&lt;br /&gt;
You are eager to fly, but the engine is off. Well, turning on the engines is not always easy. Some aircraft have an ''autostart'' entry in their custom menu, but here is a general procedure that should work in many cases:&lt;br /&gt;
&lt;br /&gt;
In general to start the engine on a piston-engine type aircraft, you need (after making sure the game is not paused {{key press|p}}):&lt;br /&gt;
# Fuel: Some aircraft start the simulation with no fuel. You can add it in ''Equipment'' &amp;amp;gt; ''Fuel and Payload''.&lt;br /&gt;
# Correct fuel mixture: This is generally ''rich'', so push the red knob all the way in, or use the key {{key press|m}} to enrich ({{key press|Shift|m}} leans.)&lt;br /&gt;
# Magnetos set on ''both'': Turn the key or press {{key press|&amp;amp;#125;}} ''three times'' to move through ''R'', ''L'', ''Both''.&lt;br /&gt;
# Throttle: Some engines start better with a little gas.&lt;br /&gt;
# Run the starter: Click the ''Start'' position of the key on the panel, or press {{key press|s}}. Hold the starter for sufficient time, even 10 seconds.&lt;br /&gt;
&lt;br /&gt;
Starting all engines in a multi-engine aircraft is similar to the single engine - except you must follow the same start sequence for each and every engine. FlightGear provides a convenient way to do this for all engines at once: Press {{key press|~}} and all the procedure above will work for all the engines. Note though that the default 2D panel is connected to ''only one engine'' and the {{key press|~}} trick might not work. Also, give some gas to be sure that all the engines are on.&lt;br /&gt;
&lt;br /&gt;
These instructions may not work for jet aircraft, helicopters, or other types of aircraft with complex start procedures. Check the instructions in the aircraft help menu (press {{key press|?}}) and/or look at [[Aircraft|the aircraft's article on this wiki]]. In general to start the engine on a jet engine type aircraft, you need to:&lt;br /&gt;
# Set cutoff ''ON'' &lt;br /&gt;
# Engage the starter&lt;br /&gt;
# Once the engines spools up to approximately 5% N1, set cutoff ''OFF''&lt;br /&gt;
# Disengage the starter once the engine has reached operational speed&lt;br /&gt;
&lt;br /&gt;
== Learning to fly ==&lt;br /&gt;
=== FlightGear's Manual ===&lt;br /&gt;
FlightGear has an official [https://www.flightgear.org/support/manual/ manual] that covers the basics of flight. As a beginner, you may want to start with [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/en/HTML/getstart-ench8.html Chapter 8: A Basic Flight Simulator Tutorial].&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
Many aircraft have their own interactive [[tutorials|tutorial]]. With tutorials, you can learn to operate particular aircraft but also learn to fly. You can access tutorials by going to ''Main menu'' &amp;amp;gt; ''Help'' &amp;amp;gt; ''Tutorial''. A great place to start is the tutorial for the [[Cessna 172P]] aircraft, commonly used in real life to learn to fly fixed-winged aircraft.&lt;br /&gt;
&lt;br /&gt;
If the tutorial starts without a runway and surrounded by water, your setup of FlightGear is missing the scenery for the airport at which the tutorial was supposed to run. To get scenery see the [[#Getting scenery]] section above.&lt;br /&gt;
&lt;br /&gt;
== Making your first flight ==&lt;br /&gt;
=== Realism ===&lt;br /&gt;
One of the most frequent questions novice pilots ask about any flight simulator, but more so to FlightGear, is &amp;quot;Why is my aircraft turning left all the time?&amp;quot; Although it could be due to wind gusts crossing the runway, it is more likely due to the [[Understanding Propeller Torque and P-Factor|propeller torque and p-factor]].&lt;br /&gt;
&lt;br /&gt;
In certain other flight simulators, despite marketing slogans to the contrary, some settings are turned down to make the aircraft easier to fly. This reduces effects such as the above. The realism is always turned up in FlightGear.&lt;br /&gt;
&lt;br /&gt;
Here are some of the FlightGear realism points, which may be confusing to first time pilots:&lt;br /&gt;
* &amp;quot;Left turning syndrome&amp;quot; for the previously mentioned reasons.&lt;br /&gt;
* Compass turning error: A compass, when subjected to the forces of flight, tends to turn in the opposite direction for a brief period before settling on the correct heading. This is not a malfunction (see also the Wikipedia article {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* The Vertical Speed Indicator (VSI) is also subject to error.&lt;br /&gt;
* The [[Horizontal Situation Indicator]] (HSI) is driven by a gyroscope (that is why it is sometimes called a Directional Gyroscope), which is subject to ''gyro drift''. The indicator will drift from its current heading and must be periodically (every ~15 minutes) calibrated to agree with the magnetic compass heading.&lt;br /&gt;
* You cannot just cancel a turn or climb by centering the yoke or stick. You must turn or push the stick the other way to get to level and level flight. But even then, the plane will not maintain its altitude or heading by itself. A common mistake is trying to find a hands off yoke position. While with trimming one could leave the plane for a couple of seconds, one must use autopilot or constantly adjust the yoke.&lt;br /&gt;
&lt;br /&gt;
Many forces act on an aircraft in flight as well as on the [[avionics and instruments]] used for control and navigation, and may be counter-intuitive. Pilots must learn to recognize these phenomena and compensate for their effects. ''FlightGear models instrument errors that exist in the real world''.&lt;br /&gt;
&lt;br /&gt;
=== Airports and navigation aids ===&lt;br /&gt;
When you first start FlightGear, whether from the command line or the graphical interface of the launchers, you may wonder how to determine what airports are available. The launcher displays a list of airports, but you will not see details such as tower or [[ILS]] frequencies. You will not find a map showing [[VOR]]s and their frequencies. What can you do? See [[Getting aeronautical charts]].&lt;br /&gt;
&lt;br /&gt;
In-sim, there is a map you can use in ''Main Menu'' &amp;amp;gt; ''Equipment'' &amp;amp;gt; ''Map'', which will allow you to see navigation data and the position of airports and aids. For more help with navigation see [[Understanding navigation]].&lt;br /&gt;
&lt;br /&gt;
=== Flying using the autopilot ===&lt;br /&gt;
Some aircraft require you to use the [[autopilot]] available from the ''Autopilot'' menu, which is the original FlightGear autopilot. This is a ''generic'' autopilot and as such, many aircraft come with their own ''specific'' autopilot, frequently a model of the real life one.&lt;br /&gt;
&lt;br /&gt;
For aircraft that provide their own autopilot, you should use the autopilot controls available in the virtual cockpit. This means clicking on the instrument panel in the virtual cockpit. The Autopilot menu will be grayed out and unavailable when the aircraft supplies its own autopilot in some aircraft, including the Airbuses and the [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
The Cessna 172 comes with a [[Bendix/King KAP140 Autopilot]] in its virtual cockpit. You can use both the autopilot device in the cockpit and the [[Autopilot#Autopilot Settings|autopilot settings]] from the menu.&lt;br /&gt;
&lt;br /&gt;
== Advanced ==&lt;br /&gt;
=== Flying ===&lt;br /&gt;
{{Main article|Aircraft}}&lt;br /&gt;
&lt;br /&gt;
* If you continue to fly light civilian aircraft, [[Cessna 182S]] which is more complex than C172P and [[Piper PA28 Warrior II|PA28]] are good choices.&lt;br /&gt;
* If you are interested in flying airlines, [[Airbus A320 family]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] and [[MD-80]] are suggested.&lt;br /&gt;
* If you are fascinated by fighter aircrafts, choose a highly rated military aircraft (such as [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) from [[Aircraft#Modern military aircraft|here]], and enable multiplayer damage or install [[Bombable]].&lt;br /&gt;
* If you switch to helicopters, it is recommended to fly [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Besides common aircraft, there are also detailed [[Space Shuttle|space shuttles]] available.&lt;br /&gt;
&lt;br /&gt;
=== Scenery ===&lt;br /&gt;
It is fascinating to explore the [[scenery]] (or just test the graphics/frame rate) with [[UFO]]. First of all, [[#Configuring rendering and UI|increase your graphics quality]]. If you don't see buildings initially, keep FG open and wait for a while for [[TerraSync]] to finish downloading and for the buildings to appear.&lt;br /&gt;
There are plenty of [[Suggested airports|well-developed airports]] and scenery areas. You can also explore the scenery objects on the [https://scenery.flightgear.org/map model map].&lt;br /&gt;
&lt;br /&gt;
=== Multiplayer ===&lt;br /&gt;
FlightGear has some multiplayer servers that will let you fly in more lively skies, see [[Howto: Multiplayer]]. There are also [[OpenRadar]] and [[ATC-pie]], standalone programs that will let you be an [[Air traffic control|air traffic controller]].&lt;br /&gt;
&lt;br /&gt;
There is also a [[MPMap|multiplayer map]] that lets you see who is online right now, and even what [[navaids]] are nearby.&lt;br /&gt;
&lt;br /&gt;
=== Menu items ===&lt;br /&gt;
For a quick reference about the usage of each menu item in FlightGear, see [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Addons ===&lt;br /&gt;
FlightGear has a lot of third-party [[Addon|addons]] containing enhancements. For beginners, [[Logbook Add-on|Logbook]] and [[Which Runway Add-on|Which Runway]] may be the most useful addons.&lt;br /&gt;
&lt;br /&gt;
== The FlightGear community ==&lt;br /&gt;
=== Getting help ===&lt;br /&gt;
This page is designed to give the user the essential things they need to know about using FlightGear for the first time. Besides the [[Portal:User|User portal]] of this wiki, there are other pages you may want to read:&lt;br /&gt;
*[[Troubleshooting problems]] to help you with the most common issues;&lt;br /&gt;
*[[Frequently asked questions]];&lt;br /&gt;
...and communication channels that can be used to obtain information or request help:&lt;br /&gt;
*The [[FlightGear Manual]], a ''must read'' for beginners;&lt;br /&gt;
*{{forum link|text=FlightGear Forum}} and its subforums;&lt;br /&gt;
*[[Discord|FlightGear's Discord server]], the quickest way to get help;&lt;br /&gt;
*[[FlightGear IRC channel]];&lt;br /&gt;
*[[Mailing list|FlightGear users mailing list]], biggest chance to get in contact with core developers;&lt;br /&gt;
*Documents bundled with the release package.&lt;br /&gt;
&lt;br /&gt;
=== Customizing FlightGear without compiling it ===&lt;br /&gt;
[https://www.flightgear.org/download/ Our website] offers precompiled binaries for download and install on Windows, macOS and Linux. In addition, most Linux distributions provide a packaged version in their repositories.&lt;br /&gt;
&lt;br /&gt;
Although the install is binary, most of FlightGear's systems are open to configuration through [[XML]] files and [[NASAL scripting]]. You are free ''and encouraged'' to make changes to aircraft flight models, scenery, textures, OpenGL [[shader]]s and any other feature you wish to change for your personal satisfaction or to share with other FlightGear users. If this is what you intend to do, take a look at the [[Portal:Developer|Developer portal]].&lt;br /&gt;
&lt;br /&gt;
=== How you can help ===&lt;br /&gt;
{{Main article|Volunteer}}&lt;br /&gt;
FlightGear is an open source, volunteer based project. That means that whatever you find here comes from passion, spare time and nothing else. This includes the simulator, the scenery, the aircraft, the wiki, the {{forum link|text=forum}} and everything else. Volunteers, in essence ''people that do things'', are fundamental to this project. Without them, it would not make a single step forward. So it is essential that contributors have fun in what they do.&lt;br /&gt;
&lt;br /&gt;
If you plan to contribute to this project, you should take a look at some articles that will give you some hints:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process]]&lt;br /&gt;
*[[Implementing new features for FlightGear]]&lt;br /&gt;
*[[How the FlightGear project works]]&lt;br /&gt;
&lt;br /&gt;
There are never enough people contributing, and the fields where their help would be appreciated are many:&lt;br /&gt;
;Testing:&lt;br /&gt;
*[[Building FlightGear|Build]] the latest Git code&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues File bug reports]&lt;br /&gt;
*Running FlightGear via valgrind to track down memory leaks&lt;br /&gt;
&lt;br /&gt;
;Support:&lt;br /&gt;
*Help new users with downloading, compiling, installing and running FlightGear ({{forum link|text=on the forum}} or on [[Discord]])&lt;br /&gt;
*Provide ideas &amp;amp; suggestions, see: [[Feature Requests / Proposals / Ideas]]&lt;br /&gt;
*Help [[Portal:Wiki|clean up this wiki]]&lt;br /&gt;
*Help provide new contents for missing wiki pages&lt;br /&gt;
&lt;br /&gt;
;Development:&lt;br /&gt;
*core codebase:&lt;br /&gt;
**Provide [[Howto:Start core development|source code/data/documentation contributions]]&lt;br /&gt;
**Provide [[Bugs|bug fixes]] or new features&lt;br /&gt;
*Aircraft development (3D modeling, textures, FDMs, scripting)&lt;br /&gt;
*Scenery development (terrain, model, weather)&lt;br /&gt;
*Get involved in any of the other FlightGear-affiliated projects&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pl:Nowy w FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144745</id>
		<title>New to FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144745"/>
		<updated>2026-05-28T05:48:45Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* How you can help */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to [[FlightGear]]!''' Here we will try to get you up in the virtual air in the shortest time possible. We will also introduce you to some of the features of this flight simulator and also a few information on its community.&lt;br /&gt;
&lt;br /&gt;
== Installation and setup ==&lt;br /&gt;
=== Hardware requirements ===&lt;br /&gt;
For FlightGear to run smoothly, it requires a video card with OpenGL drivers 4.0 or higher. This is usually not a problem, but take a look at the [[hardware recommendations]] to have a better idea.&lt;br /&gt;
&lt;br /&gt;
=== Getting FlightGear ===&lt;br /&gt;
You may download the latest files from the [https://www.flightgear.org/download/ FlightGear download] page. Choose the source or binary files appropriate for your particular system. {{Wikipedia|AppImage|AppImage}} binary files for Linux are also available with 2020.3 LTS and later. Most Linux users will find that most distributions have a packaged version of FlightGear (the package name could be &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
Depending on your technical expertise you may choose the [[Git]] development version of FlightGear, which typically has more features and can be required by some of the latest developmental aircraft, but can be unstable and is more complicated to get for non-Windows users. In general, the development version is not advised to the average user, but if you are willing to do some testing there is a nightly build available for [https://www.flightgear.org/download/nightly/ download]. If you are using a Git version controlled copy of FlightGear, you may choose to synchronise your aircraft using the version controlled [[FGAddon|FGAddon aircraft development repository]].&lt;br /&gt;
&lt;br /&gt;
=== Installing on Windows ===&lt;br /&gt;
After you downloaded the installer, run it and follow its instructions to install FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen on Windows may block the installation simply because the binary file is not signed with a key that Microsoft respects. Of course, the key is paid. In this case, we need to click on the inconspicuous &amp;quot;More info&amp;quot; link. Only then will the &amp;quot;Run anyway&amp;quot; button appear. You can safely trust that this is not a dangerous application, as long as you have actually downloaded it from official sources.&lt;br /&gt;
&lt;br /&gt;
If you're using third-party antivirus software for some reason, it may be blocking FlightGear from installing. This isn't something we can control, so it's entirely up to you how you want to handle it.&lt;br /&gt;
&lt;br /&gt;
With the Windows installer, you may choose where to install FlightGear. The [[$FG_ROOT]] directory would be &amp;lt;code&amp;gt;&amp;amp;lt;your chosen directory&amp;amp;gt;/data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Installing on macOS ===&lt;br /&gt;
Installing FlightGear on macOS is very simple. Just drag and drop the FlightGear icon to the &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt; folder. That is it. &lt;br /&gt;
&lt;br /&gt;
The first time you launch FlightGear, its icon on the Dock bounces for several seconds while loading aircraft and airport info. When the GUI launcher appears, select the aircraft and airport, then click &amp;quot;Fly!&amp;quot; to launch the simulator. You can configure more options using the GUI launcher. See the [http://flightgear.sourceforge.net/manual/next/en/getstart-ench4.html#takeoff-how-to-start-the-program official manual] for more details.&lt;br /&gt;
&lt;br /&gt;
If you would like to launch FlightGear using command-line, launch the Terminal app and type the following.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options..... &lt;br /&gt;
&lt;br /&gt;
The [[$FG_ROOT]] and [[$FG_SCENERY]] are not set on macOS. If you want to specify these variables yourself for command-line use, run the followings on the Terminal app:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
After launching the GUI launcher, you will have the alias to [[$FG_ROOT]] at &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt; so you can browse the data folder using Finder.&lt;br /&gt;
&lt;br /&gt;
Note: Once you have installed FlightGear, Mac users can locate their [[$FG_ROOT]] folder by opening their applications folder in Finder, right clicking on FlightGear, and clicking &amp;quot;Show Package Contents&amp;quot;. This will take you inside the FlightGear folder. You are now able to access all files including Data/Aircraft to [[Howto: Install aircraft#Macintosh OS X|install new aircraft]].&lt;br /&gt;
&lt;br /&gt;
=== Installing from source ===&lt;br /&gt;
Main article: [[Building FlightGear]]&lt;br /&gt;
&lt;br /&gt;
=== Getting scenery ===&lt;br /&gt;
A limited set of [[scenery]] comes installed with FlightGear. For FlightGear 2024.1 this consists of &lt;br /&gt;
* The area surrounding the featured airport for the release which is [[Keflavik_Airport|Keflavik International Airport]] (BIKF)&lt;br /&gt;
* The tutorial airport for the [[Cessna_172P|Cessna 172P]] which is [[Hilo_International_Airport|Hilo International Airport]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
In FlightGear, scenery is generally stored in you [[$FG_ROOT]] directory, and is divided into three kinds of data:&lt;br /&gt;
* '''Airports''' holds airport data, like runway usage and parking spots.&lt;br /&gt;
* '''Objects''' and '''Models''' are the buildings, bridges and radio towers, etc. that represent three-dimensional structures.&lt;br /&gt;
* '''Terrain''' represents the contours, elevations and type of ground you fly/taxi over.&lt;br /&gt;
&lt;br /&gt;
The current way of &amp;quot;installing&amp;quot; new scenery is enabling [[TerraSync]], which will automatically download and update any place you visit - even on the fly! If you have a slow Internet connection and/or computer you could instead use a scenery manager, for example [[TerraMaster]].  In addition you can also manually download and install new scenery parts, either the official [[World Scenery]] or custom scenery.&lt;br /&gt;
&lt;br /&gt;
The scenery is also available on the [https://www.flightgear.org/download/mirrors/ mirrors page] of the FlightGear website, and can be installed following [[Howto: Install scenery]]. '''This is recommended for users with weak internet connections or weak computers!'''&lt;br /&gt;
&lt;br /&gt;
Custom scenery is available in many places. For example, on the {{forum link|f=5|text=FlightGear forum}} or within repositories. An internet search should be able to find them. See [[Suggested_custom_scenery|suggested custom scenery]] page for a few recent releases.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS and later added an experimental rollout of 3 dimensional buildings, roads, and objects based on OpenStreetMap data for the entire world to automatically downloaded TerraSync data - see [[OSM2City 1st Worldbuild|1st OSM2City world-build]] notes (March 2021).  Some manual downloads of 3d structures for regions or entire countries is available on the [[Areas populated with osm2city scenery|osm2City downloads]] wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Getting aircraft ===&lt;br /&gt;
Additional [[aircraft]] can be downloaded and installed through the [[Qt-launcher|launcher]]. Alternatively, you can go to the FlightGear website and navigate to the [http://www.flightgear.org/download/ download page], then choose the aircraft download link that fits your FlightGear version. In addition there are many third party [[hangars]]. For the installation, see [[Howto: Install aircraft]].&lt;br /&gt;
&lt;br /&gt;
== Running FlightGear ==&lt;br /&gt;
=== Starting FlightGear ===&lt;br /&gt;
The easiest way to start FlightGear is to use the desktop icon. This starts the graphical interface [[FlightGear Qt launcher]] where you can choose aircraft, start position etc.&amp;lt;!-- The following reminder should probably be removed once the launcher makes it clear there is further things to take care of using in-sim menus to get FG set up --&amp;gt; Remember the Qt launcher only has basic options to get you started. A lot of options for graphics, scenery, [[Weather|weather]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ environment], [[Input_device|input devices]] etc. are available from the [[menu]] inside the simulator.&lt;br /&gt;
&lt;br /&gt;
Many users choose however to start FlightGear directly from the command line. The executable name is &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; and can be run without options. If it is &amp;quot;not found&amp;quot;, it is likely not in your [https://en.wikipedia.org/wiki/PATH_(variable) path]. The location depends on your particular system and choices you made during compile and installation. There is a list of [[Command Line Parameters]] which must be used to change many options, like the aircraft you want. The most important:&lt;br /&gt;
 &lt;br /&gt;
 fgfs --launcher             # opens the FlightGear Qt launcher&lt;br /&gt;
 fgfs --show-aircraft        # displays a list of installed aircraft&lt;br /&gt;
 fgfs --aircraft=c172p       # start FG with the aircraft &amp;quot;c172p&amp;quot; (from the list)&lt;br /&gt;
&lt;br /&gt;
The Qt launcher also lets users add command line parameters for options that are normally changed from the menu inside the simulator, as well as quite advanced options that are only available from the command line (as of August 2020).&lt;br /&gt;
&lt;br /&gt;
=== Configuring rendering and UI ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|View &amp;gt; Rendering Options dialog.]]&lt;br /&gt;
If your render quality or framerate is too low, click &amp;quot;View &amp;gt; Rendering Options&amp;quot; to adjust the graphic settings. For newer hardware, it's recommended to set &amp;quot;graphics quality&amp;quot; to high and check &amp;quot;use disk space for faster loading&amp;quot;, &amp;quot;animated jetways&amp;quot; and &amp;quot;satellite photoscenery&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If the menu text appears too small on high DPI or large screens, you can manually [[Menubar#How to Change the Default Menubar Font Size|change the menubar font size]] by editing the data file, or simply click &amp;quot;Debug &amp;gt; Cycle GUI Style&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Using the keyboard and/or mouse ===&lt;br /&gt;
Users with limited access to a [[joystick]] or other controllers sometimes use the keyboard or mouse to control their aircraft. Using the keyboard to fly can be difficult and the mouse is recommended over the keyboard for flying, yet even a cheap joystick would improve the experience so much.&lt;br /&gt;
&lt;br /&gt;
To get help with keyboard commands, with FlightGear running, go to the ''Help'' menu, look under ''Basic Keys'' (for simulator related commands) and ''Common Aircraft Keys'' (for commands universal to all aircraft) and ''Aircraft Help'' (for key commands specific to your aircraft). If the main menu is hidden press {{key press|F10}}. If you come from other simulators, check [[key commands compared to other simulators]] for an overview of the difference between the key commands of that sim and FlightGear.&lt;br /&gt;
&lt;br /&gt;
To use the mouse to fly the aircraft, press {{key press|Tab}} (the cursor should change to a cross) and move the mouse to direct the aircraft. Press {{key press|Tab}} again to look around (cursor should show a two sided arrow), and press {{key press|Tab}} again to return to normal mode, used to click stuff in the cockpit.&lt;br /&gt;
&lt;br /&gt;
For most users lacking a rudder axis control, it’s difficult to manually coordinate [[aileron]] and [[rudder]] movements during a turn. To enable auto-coordination and make flight easier, you may click &amp;quot;Settings&amp;quot;, then click the &amp;quot;Show more&amp;quot; button on the right of &amp;quot;General&amp;quot;, and finally click &amp;quot;Enable auto-coordination&amp;quot; in the launcher.&lt;br /&gt;
&lt;br /&gt;
=== First time in the cockpit ===&lt;br /&gt;
Finding your way around the cockpit can be daunting the first time.&lt;br /&gt;
&lt;br /&gt;
Where is the &amp;quot;virtual cockpit&amp;quot;? Not all FlightGear aircraft come with an interior actually, some research projects may not even come with an exterior model. A 2D panel may display over the 3D cockpit if one exists. You may turn this off through ''Main Menu'' &amp;amp;gt; ''View'' &amp;amp;gt; ''View Options'' and deselecting ''Show 2D panel'' in the ''Display Options'' section, or by pressing {{key press|Shift|P}}. Otherwise, you should be sitting in the virtual cockpit when FlightGear starts, as long as the Cockpit View is selected (if not pressing {{key press|Ctrl|V}} should get you to the pilot view).&lt;br /&gt;
&lt;br /&gt;
You may find it difficult to read some of the displays, dials and gauges on the instrument panel. You can use the ''view'' mode of the mouse (press {{key press|Tab}} until you get a cursor shaped like a double arrow) to pan and the mouse wheel to zoom, or pan with the joystick hat and zoom with {{key press|X}} and {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
One of the first steps that many take on entering an unfamiliar cockpit is to press {{key press|Ctrl|C}} to highlight all the &amp;quot;hotspots&amp;quot;, that is instrument controls, buttons, knobs, etc. Many aircraft also offer a specific help menu.&lt;br /&gt;
&lt;br /&gt;
Some functions, such as starter or magneto, may be difficult to use or simply lack clickable &amp;quot;hotspots&amp;quot;, especially in aircraft models which are in development. In most cases you can go for the equivalent controls on a 2D panel or resort to the keyboard. The keyboard always work according to the assignments listed on the ''Help'' menu, but sometimes these are reassigned by an aircraft or configuration. Again, remember to check all the help dialogs.&lt;br /&gt;
&lt;br /&gt;
=== Starting the engine ===&lt;br /&gt;
You are eager to fly, but the engine is off. Well, turning on the engines is not always easy. Some aircraft have an ''autostart'' entry in their custom menu, but here is a general procedure that should work in many cases:&lt;br /&gt;
&lt;br /&gt;
In general to start the engine on a piston-engine type aircraft, you need (after making sure the game is not paused {{key press|p}}):&lt;br /&gt;
# Fuel: Some aircraft start the simulation with no fuel. You can add it in ''Equipment'' &amp;amp;gt; ''Fuel and Payload''.&lt;br /&gt;
# Correct fuel mixture: This is generally ''rich'', so push the red knob all the way in, or use the key {{key press|m}} to enrich ({{key press|Shift|m}} leans.)&lt;br /&gt;
# Magnetos set on ''both'': Turn the key or press {{key press|&amp;amp;#125;}} ''three times'' to move through ''R'', ''L'', ''Both''.&lt;br /&gt;
# Throttle: Some engines start better with a little gas.&lt;br /&gt;
# Run the starter: Click the ''Start'' position of the key on the panel, or press {{key press|s}}. Hold the starter for sufficient time, even 10 seconds.&lt;br /&gt;
&lt;br /&gt;
Starting all engines in a multi-engine aircraft is similar to the single engine - except you must follow the same start sequence for each and every engine. FlightGear provides a convenient way to do this for all engines at once: Press {{key press|~}} and all the procedure above will work for all the engines. Note though that the default 2D panel is connected to ''only one engine'' and the {{key press|~}} trick might not work. Also, give some gas to be sure that all the engines are on.&lt;br /&gt;
&lt;br /&gt;
These instructions may not work for jet aircraft, helicopters, or other types of aircraft with complex start procedures. Check the instructions in the aircraft help menu (press {{key press|?}}) and/or look at [[Aircraft|the aircraft's article on this wiki]]. In general to start the engine on a jet engine type aircraft, you need to:&lt;br /&gt;
# Set cutoff ''ON'' &lt;br /&gt;
# Engage the starter&lt;br /&gt;
# Once the engines spools up to approximately 5% N1, set cutoff ''OFF''&lt;br /&gt;
# Disengage the starter once the engine has reached operational speed&lt;br /&gt;
&lt;br /&gt;
== Learning to fly ==&lt;br /&gt;
=== FlightGear's Manual ===&lt;br /&gt;
FlightGear has an official [https://www.flightgear.org/support/manual/ manual] that covers the basics of flight. As a beginner, you may want to start with [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/en/HTML/getstart-ench8.html Chapter 8: A Basic Flight Simulator Tutorial].&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
Many aircraft have their own interactive [[tutorials|tutorial]]. With tutorials, you can learn to operate particular aircraft but also learn to fly. You can access tutorials by going to ''Main menu'' &amp;amp;gt; ''Help'' &amp;amp;gt; ''Tutorial''. A great place to start is the tutorial for the [[Cessna 172P]] aircraft, commonly used in real life to learn to fly fixed-winged aircraft.&lt;br /&gt;
&lt;br /&gt;
If the tutorial starts without a runway and surrounded by water, your setup of FlightGear is missing the scenery for the airport at which the tutorial was supposed to run. To get scenery see the [[#Getting scenery]] section above.&lt;br /&gt;
&lt;br /&gt;
== Making your first flight ==&lt;br /&gt;
=== Realism ===&lt;br /&gt;
One of the most frequent questions novice pilots ask about any flight simulator, but more so to FlightGear, is &amp;quot;Why is my aircraft turning left all the time?&amp;quot; Although it could be due to wind gusts crossing the runway, it is more likely due to the [[Understanding Propeller Torque and P-Factor|propeller torque and p-factor]].&lt;br /&gt;
&lt;br /&gt;
In certain other flight simulators, despite marketing slogans to the contrary, some settings are turned down to make the aircraft easier to fly. This reduces effects such as the above. The realism is always turned up in FlightGear.&lt;br /&gt;
&lt;br /&gt;
Here are some of the FlightGear realism points, which may be confusing to first time pilots:&lt;br /&gt;
* &amp;quot;Left turning syndrome&amp;quot; for the previously mentioned reasons.&lt;br /&gt;
* Compass turning error: A compass, when subjected to the forces of flight, tends to turn in the opposite direction for a brief period before settling on the correct heading. This is not a malfunction (see also the Wikipedia article {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* The Vertical Speed Indicator (VSI) is also subject to error.&lt;br /&gt;
* The [[Horizontal Situation Indicator]] (HSI) is driven by a gyroscope (that is why it is sometimes called a Directional Gyroscope), which is subject to ''gyro drift''. The indicator will drift from its current heading and must be periodically (every ~15 minutes) calibrated to agree with the magnetic compass heading.&lt;br /&gt;
* You cannot just cancel a turn or climb by centering the yoke or stick. You must turn or push the stick the other way to get to level and level flight. But even then, the plane will not maintain its altitude or heading by itself. A common mistake is trying to find a hands off yoke position. While with trimming one could leave the plane for a couple of seconds, one must use autopilot or constantly adjust the yoke.&lt;br /&gt;
&lt;br /&gt;
Many forces act on an aircraft in flight as well as on the [[avionics and instruments]] used for control and navigation, and may be counter-intuitive. Pilots must learn to recognize these phenomena and compensate for their effects. ''FlightGear models instrument errors that exist in the real world''.&lt;br /&gt;
&lt;br /&gt;
=== Airports and navigation aids ===&lt;br /&gt;
When you first start FlightGear, whether from the command line or the graphical interface of the launchers, you may wonder how to determine what airports are available. The launcher displays a list of airports, but you will not see details such as tower or [[ILS]] frequencies. You will not find a map showing [[VOR]]s and their frequencies. What can you do? See [[Getting aeronautical charts]].&lt;br /&gt;
&lt;br /&gt;
In-sim, there is a map you can use in ''Main Menu'' &amp;amp;gt; ''Equipment'' &amp;amp;gt; ''Map'', which will allow you to see navigation data and the position of airports and aids. For more help with navigation see [[Understanding navigation]].&lt;br /&gt;
&lt;br /&gt;
=== Flying using the autopilot ===&lt;br /&gt;
Some aircraft require you to use the [[autopilot]] available from the ''Autopilot'' menu, which is the original FlightGear autopilot. This is a ''generic'' autopilot and as such, many aircraft come with their own ''specific'' autopilot, frequently a model of the real life one.&lt;br /&gt;
&lt;br /&gt;
For aircraft that provide their own autopilot, you should use the autopilot controls available in the virtual cockpit. This means clicking on the instrument panel in the virtual cockpit. The Autopilot menu will be grayed out and unavailable when the aircraft supplies its own autopilot in some aircraft, including the Airbuses and the [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
The Cessna 172 comes with a [[Bendix/King KAP140 Autopilot]] in its virtual cockpit. You can use both the autopilot device in the cockpit and the [[Autopilot#Autopilot Settings|autopilot settings]] from the menu.&lt;br /&gt;
&lt;br /&gt;
== Advanced ==&lt;br /&gt;
=== Flying ===&lt;br /&gt;
{{Main article|Aircraft}}&lt;br /&gt;
&lt;br /&gt;
* If you continue to fly light civilian aircraft, [[Cessna 182S]] which is more complex than C172P and [[Piper PA28 Warrior II|PA28]] are good choices.&lt;br /&gt;
* If you are interested in flying airlines, [[Airbus A320 family]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] and [[MD-80]] are suggested.&lt;br /&gt;
* If you are fascinated by fighter aircrafts, choose a highly rated military aircraft (such as [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) from [[Aircraft#Modern military aircraft|here]], and enable multiplayer damage or install [[Bombable]].&lt;br /&gt;
* If you switch to helicopters, it is recommended to fly [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Besides common aircraft, there are also detailed [[Space Shuttle|space shuttles]] available.&lt;br /&gt;
&lt;br /&gt;
=== Scenery ===&lt;br /&gt;
It is fascinating to explore the [[scenery]] (or just test the graphics/frame rate) with [[UFO]]. First of all, [[#Configuring rendering and UI|increase your graphics quality]]. If you don't see buildings initially, keep FG open and wait for a while for [[TerraSync]] to finish downloading and for the buildings to appear.&lt;br /&gt;
There are plenty of [[Suggested airports|well-developed airports]] and scenery areas. You can also explore the scenery objects on the [https://scenery.flightgear.org/map model map].&lt;br /&gt;
&lt;br /&gt;
=== Multiplayer ===&lt;br /&gt;
FlightGear has some multiplayer servers that will let you fly in more lively skies, see [[Howto: Multiplayer]]. There are also [[OpenRadar]] and [[ATC-pie]], standalone programs that will let you be an [[Air traffic control|air traffic controller]].&lt;br /&gt;
&lt;br /&gt;
There is also a [[MPMap|multiplayer map]] that lets you see who is online right now, and even what [[navaids]] are nearby.&lt;br /&gt;
&lt;br /&gt;
=== Menu items ===&lt;br /&gt;
For a quick reference about the usage of each menu item in FlightGear, see [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Addons ===&lt;br /&gt;
FlightGear has a lot of third-party [[Addon|addons]] containing enhancements. For beginners, [[Logbook Add-on|Logbook]] and [[Which Runway Add-on|Which Runway]] may be the most useful addons.&lt;br /&gt;
&lt;br /&gt;
== The FlightGear community ==&lt;br /&gt;
=== Getting help ===&lt;br /&gt;
This page is designed to give the user the essential things they need to know about using FlightGear for the first time. Besides the [[Portal:User|User portal]] of this wiki, there are other pages you may want to read:&lt;br /&gt;
*[[Troubleshooting problems]] to help you with the most common issues;&lt;br /&gt;
*[[Frequently asked questions]];&lt;br /&gt;
...and communication channels that can be used to obtain information or request help:&lt;br /&gt;
*The [[FlightGear Manual]], a ''must read'' for beginners;&lt;br /&gt;
*{{forum link|text=FlightGear Forum}} and its subforums;&lt;br /&gt;
*[[Discord|FlightGear's Discord server]], the quickest way to get help;&lt;br /&gt;
*[[FlightGear IRC channel]];&lt;br /&gt;
*[[Mailing list|FlightGear users mailing list]], biggest chance to get in contact with core developers;&lt;br /&gt;
*Documents bundled with the release package.&lt;br /&gt;
&lt;br /&gt;
=== Customizing FlightGear without compiling it ===&lt;br /&gt;
[https://www.flightgear.org/download/ Our website] offers precompiled binaries for download and install on Windows, macOS and Linux. In addition, most Linux distributions provide a packaged version in their repositories.&lt;br /&gt;
&lt;br /&gt;
Although the install is binary, most of FlightGear's systems are open to configuration through [[XML]] files and [[NASAL scripting]]. You are free ''and encouraged'' to make changes to aircraft flight models, scenery, textures, OpenGL [[shader]]s and any other feature you wish to change for your personal satisfaction or to share with other FlightGear users. If this is what you intend to do, take a look at the [[Portal:Developer|Developer portal]].&lt;br /&gt;
&lt;br /&gt;
=== How you can help ===&lt;br /&gt;
{{Main article|Volunteer}}&lt;br /&gt;
FlightGear is an open source, volunteer based project. That means that whatever you find here comes from passion, spare time and nothing else. This includes the simulator, the scenery, the aircraft, the wiki, the {{forum link|text=forum}} and everything else. Volunteers, in essence ''people that do things'', are fundamental to this project. Without them, it would not make a single step forward. So it is essential that contributors have fun in what they do.&lt;br /&gt;
&lt;br /&gt;
If you plan to contribute to this project, you should take a look at some articles that will give you some hints:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process]]&lt;br /&gt;
*[[Implementing new features for FlightGear]]&lt;br /&gt;
*[[How the FlightGear project works]]&lt;br /&gt;
&lt;br /&gt;
There are never enough people contributing, and the fields where their help would be appreciated are many:&lt;br /&gt;
;Testing:&lt;br /&gt;
*[[Building FlightGear|Build]] the latest Git code&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues File bug reports]&lt;br /&gt;
*Running FlightGear via valgrind to track down memory leaks&lt;br /&gt;
&lt;br /&gt;
;Support:&lt;br /&gt;
*Help new users with downloading, compiling, installing and running FlightGear ({{forum link|text=on the forum}} or on [[Discord]])&lt;br /&gt;
*Provide ideas &amp;amp; suggestions, see: [[Feature Requests / Proposals / Ideas]]&lt;br /&gt;
*Help [[Portal:Wiki|clean up this wiki]]&lt;br /&gt;
*Help provide new contents for missing wiki pages&lt;br /&gt;
&lt;br /&gt;
;Development:&lt;br /&gt;
*core codebase:&lt;br /&gt;
**Provide [[Howto:Start core development|source code/data/documentation contributions]]&lt;br /&gt;
**Provide [[Bugs|bug fixes]] or new features&lt;br /&gt;
**Get involved in any of the other FlightGear-affiliated projects&lt;br /&gt;
*Aircraft development (3D modeling, textures, FDMs, scripting)&lt;br /&gt;
*Scenery development (terrain, model, weather)&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pl:Nowy w FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144744</id>
		<title>New to FlightGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=New_to_FlightGear&amp;diff=144744"/>
		<updated>2026-05-28T05:47:56Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* How you can help */ link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to [[FlightGear]]!''' Here we will try to get you up in the virtual air in the shortest time possible. We will also introduce you to some of the features of this flight simulator and also a few information on its community.&lt;br /&gt;
&lt;br /&gt;
== Installation and setup ==&lt;br /&gt;
=== Hardware requirements ===&lt;br /&gt;
For FlightGear to run smoothly, it requires a video card with OpenGL drivers 4.0 or higher. This is usually not a problem, but take a look at the [[hardware recommendations]] to have a better idea.&lt;br /&gt;
&lt;br /&gt;
=== Getting FlightGear ===&lt;br /&gt;
You may download the latest files from the [https://www.flightgear.org/download/ FlightGear download] page. Choose the source or binary files appropriate for your particular system. {{Wikipedia|AppImage|AppImage}} binary files for Linux are also available with 2020.3 LTS and later. Most Linux users will find that most distributions have a packaged version of FlightGear (the package name could be &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
Depending on your technical expertise you may choose the [[Git]] development version of FlightGear, which typically has more features and can be required by some of the latest developmental aircraft, but can be unstable and is more complicated to get for non-Windows users. In general, the development version is not advised to the average user, but if you are willing to do some testing there is a nightly build available for [https://www.flightgear.org/download/nightly/ download]. If you are using a Git version controlled copy of FlightGear, you may choose to synchronise your aircraft using the version controlled [[FGAddon|FGAddon aircraft development repository]].&lt;br /&gt;
&lt;br /&gt;
=== Installing on Windows ===&lt;br /&gt;
After you downloaded the installer, run it and follow its instructions to install FlightGear.&lt;br /&gt;
&lt;br /&gt;
Defender SmartScreen on Windows may block the installation simply because the binary file is not signed with a key that Microsoft respects. Of course, the key is paid. In this case, we need to click on the inconspicuous &amp;quot;More info&amp;quot; link. Only then will the &amp;quot;Run anyway&amp;quot; button appear. You can safely trust that this is not a dangerous application, as long as you have actually downloaded it from official sources.&lt;br /&gt;
&lt;br /&gt;
If you're using third-party antivirus software for some reason, it may be blocking FlightGear from installing. This isn't something we can control, so it's entirely up to you how you want to handle it.&lt;br /&gt;
&lt;br /&gt;
With the Windows installer, you may choose where to install FlightGear. The [[$FG_ROOT]] directory would be &amp;lt;code&amp;gt;&amp;amp;lt;your chosen directory&amp;amp;gt;/data&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Installing on macOS ===&lt;br /&gt;
Installing FlightGear on macOS is very simple. Just drag and drop the FlightGear icon to the &amp;lt;code&amp;gt;/Applications&amp;lt;/code&amp;gt; folder. That is it. &lt;br /&gt;
&lt;br /&gt;
The first time you launch FlightGear, its icon on the Dock bounces for several seconds while loading aircraft and airport info. When the GUI launcher appears, select the aircraft and airport, then click &amp;quot;Fly!&amp;quot; to launch the simulator. You can configure more options using the GUI launcher. See the [http://flightgear.sourceforge.net/manual/next/en/getstart-ench4.html#takeoff-how-to-start-the-program official manual] for more details.&lt;br /&gt;
&lt;br /&gt;
If you would like to launch FlightGear using command-line, launch the Terminal app and type the following.&lt;br /&gt;
&lt;br /&gt;
 cd /Applications/FlightGear.app/Contents/MacOS&lt;br /&gt;
 ./fgfs --options..... &lt;br /&gt;
&lt;br /&gt;
The [[$FG_ROOT]] and [[$FG_SCENERY]] are not set on macOS. If you want to specify these variables yourself for command-line use, run the followings on the Terminal app:&lt;br /&gt;
&lt;br /&gt;
 FG_ROOT=/Applications/FlightGear.app/Contents/Resources/data&lt;br /&gt;
 FG_SCENERY=[[$FG_ROOT]]/Scenery&lt;br /&gt;
&lt;br /&gt;
After launching the GUI launcher, you will have the alias to [[$FG_ROOT]] at &amp;lt;code&amp;gt;$HOME/Documents/FlightGear/&amp;amp;lt;version&amp;amp;gt;&amp;lt;/code&amp;gt; so you can browse the data folder using Finder.&lt;br /&gt;
&lt;br /&gt;
Note: Once you have installed FlightGear, Mac users can locate their [[$FG_ROOT]] folder by opening their applications folder in Finder, right clicking on FlightGear, and clicking &amp;quot;Show Package Contents&amp;quot;. This will take you inside the FlightGear folder. You are now able to access all files including Data/Aircraft to [[Howto: Install aircraft#Macintosh OS X|install new aircraft]].&lt;br /&gt;
&lt;br /&gt;
=== Installing from source ===&lt;br /&gt;
Main article: [[Building FlightGear]]&lt;br /&gt;
&lt;br /&gt;
=== Getting scenery ===&lt;br /&gt;
A limited set of [[scenery]] comes installed with FlightGear. For FlightGear 2024.1 this consists of &lt;br /&gt;
* The area surrounding the featured airport for the release which is [[Keflavik_Airport|Keflavik International Airport]] (BIKF)&lt;br /&gt;
* The tutorial airport for the [[Cessna_172P|Cessna 172P]] which is [[Hilo_International_Airport|Hilo International Airport]] (PHTO)&lt;br /&gt;
&lt;br /&gt;
In FlightGear, scenery is generally stored in you [[$FG_ROOT]] directory, and is divided into three kinds of data:&lt;br /&gt;
* '''Airports''' holds airport data, like runway usage and parking spots.&lt;br /&gt;
* '''Objects''' and '''Models''' are the buildings, bridges and radio towers, etc. that represent three-dimensional structures.&lt;br /&gt;
* '''Terrain''' represents the contours, elevations and type of ground you fly/taxi over.&lt;br /&gt;
&lt;br /&gt;
The current way of &amp;quot;installing&amp;quot; new scenery is enabling [[TerraSync]], which will automatically download and update any place you visit - even on the fly! If you have a slow Internet connection and/or computer you could instead use a scenery manager, for example [[TerraMaster]].  In addition you can also manually download and install new scenery parts, either the official [[World Scenery]] or custom scenery.&lt;br /&gt;
&lt;br /&gt;
The scenery is also available on the [https://www.flightgear.org/download/mirrors/ mirrors page] of the FlightGear website, and can be installed following [[Howto: Install scenery]]. '''This is recommended for users with weak internet connections or weak computers!'''&lt;br /&gt;
&lt;br /&gt;
Custom scenery is available in many places. For example, on the {{forum link|f=5|text=FlightGear forum}} or within repositories. An internet search should be able to find them. See [[Suggested_custom_scenery|suggested custom scenery]] page for a few recent releases.&lt;br /&gt;
&lt;br /&gt;
FlightGear 2020.3.7 LTS and later added an experimental rollout of 3 dimensional buildings, roads, and objects based on OpenStreetMap data for the entire world to automatically downloaded TerraSync data - see [[OSM2City 1st Worldbuild|1st OSM2City world-build]] notes (March 2021).  Some manual downloads of 3d structures for regions or entire countries is available on the [[Areas populated with osm2city scenery|osm2City downloads]] wiki page.&lt;br /&gt;
&lt;br /&gt;
=== Getting aircraft ===&lt;br /&gt;
Additional [[aircraft]] can be downloaded and installed through the [[Qt-launcher|launcher]]. Alternatively, you can go to the FlightGear website and navigate to the [http://www.flightgear.org/download/ download page], then choose the aircraft download link that fits your FlightGear version. In addition there are many third party [[hangars]]. For the installation, see [[Howto: Install aircraft]].&lt;br /&gt;
&lt;br /&gt;
== Running FlightGear ==&lt;br /&gt;
=== Starting FlightGear ===&lt;br /&gt;
The easiest way to start FlightGear is to use the desktop icon. This starts the graphical interface [[FlightGear Qt launcher]] where you can choose aircraft, start position etc.&amp;lt;!-- The following reminder should probably be removed once the launcher makes it clear there is further things to take care of using in-sim menus to get FG set up --&amp;gt; Remember the Qt launcher only has basic options to get you started. A lot of options for graphics, scenery, [[Weather|weather]], [https://www.flightgear.org/tours/simulating-the-ever-changing-scenery/ environment], [[Input_device|input devices]] etc. are available from the [[menu]] inside the simulator.&lt;br /&gt;
&lt;br /&gt;
Many users choose however to start FlightGear directly from the command line. The executable name is &amp;lt;code&amp;gt;fgfs&amp;lt;/code&amp;gt; and can be run without options. If it is &amp;quot;not found&amp;quot;, it is likely not in your [https://en.wikipedia.org/wiki/PATH_(variable) path]. The location depends on your particular system and choices you made during compile and installation. There is a list of [[Command Line Parameters]] which must be used to change many options, like the aircraft you want. The most important:&lt;br /&gt;
 &lt;br /&gt;
 fgfs --launcher             # opens the FlightGear Qt launcher&lt;br /&gt;
 fgfs --show-aircraft        # displays a list of installed aircraft&lt;br /&gt;
 fgfs --aircraft=c172p       # start FG with the aircraft &amp;quot;c172p&amp;quot; (from the list)&lt;br /&gt;
&lt;br /&gt;
The Qt launcher also lets users add command line parameters for options that are normally changed from the menu inside the simulator, as well as quite advanced options that are only available from the command line (as of August 2020).&lt;br /&gt;
&lt;br /&gt;
=== Configuring rendering and UI ===&lt;br /&gt;
[[File:Rendering options 2024.1.png|thumb|View &amp;gt; Rendering Options dialog.]]&lt;br /&gt;
If your render quality or framerate is too low, click &amp;quot;View &amp;gt; Rendering Options&amp;quot; to adjust the graphic settings. For newer hardware, it's recommended to set &amp;quot;graphics quality&amp;quot; to high and check &amp;quot;use disk space for faster loading&amp;quot;, &amp;quot;animated jetways&amp;quot; and &amp;quot;satellite photoscenery&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
If the menu text appears too small on high DPI or large screens, you can manually [[Menubar#How to Change the Default Menubar Font Size|change the menubar font size]] by editing the data file, or simply click &amp;quot;Debug &amp;gt; Cycle GUI Style&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Using the keyboard and/or mouse ===&lt;br /&gt;
Users with limited access to a [[joystick]] or other controllers sometimes use the keyboard or mouse to control their aircraft. Using the keyboard to fly can be difficult and the mouse is recommended over the keyboard for flying, yet even a cheap joystick would improve the experience so much.&lt;br /&gt;
&lt;br /&gt;
To get help with keyboard commands, with FlightGear running, go to the ''Help'' menu, look under ''Basic Keys'' (for simulator related commands) and ''Common Aircraft Keys'' (for commands universal to all aircraft) and ''Aircraft Help'' (for key commands specific to your aircraft). If the main menu is hidden press {{key press|F10}}. If you come from other simulators, check [[key commands compared to other simulators]] for an overview of the difference between the key commands of that sim and FlightGear.&lt;br /&gt;
&lt;br /&gt;
To use the mouse to fly the aircraft, press {{key press|Tab}} (the cursor should change to a cross) and move the mouse to direct the aircraft. Press {{key press|Tab}} again to look around (cursor should show a two sided arrow), and press {{key press|Tab}} again to return to normal mode, used to click stuff in the cockpit.&lt;br /&gt;
&lt;br /&gt;
For most users lacking a rudder axis control, it’s difficult to manually coordinate [[aileron]] and [[rudder]] movements during a turn. To enable auto-coordination and make flight easier, you may click &amp;quot;Settings&amp;quot;, then click the &amp;quot;Show more&amp;quot; button on the right of &amp;quot;General&amp;quot;, and finally click &amp;quot;Enable auto-coordination&amp;quot; in the launcher.&lt;br /&gt;
&lt;br /&gt;
=== First time in the cockpit ===&lt;br /&gt;
Finding your way around the cockpit can be daunting the first time.&lt;br /&gt;
&lt;br /&gt;
Where is the &amp;quot;virtual cockpit&amp;quot;? Not all FlightGear aircraft come with an interior actually, some research projects may not even come with an exterior model. A 2D panel may display over the 3D cockpit if one exists. You may turn this off through ''Main Menu'' &amp;amp;gt; ''View'' &amp;amp;gt; ''View Options'' and deselecting ''Show 2D panel'' in the ''Display Options'' section, or by pressing {{key press|Shift|P}}. Otherwise, you should be sitting in the virtual cockpit when FlightGear starts, as long as the Cockpit View is selected (if not pressing {{key press|Ctrl|V}} should get you to the pilot view).&lt;br /&gt;
&lt;br /&gt;
You may find it difficult to read some of the displays, dials and gauges on the instrument panel. You can use the ''view'' mode of the mouse (press {{key press|Tab}} until you get a cursor shaped like a double arrow) to pan and the mouse wheel to zoom, or pan with the joystick hat and zoom with {{key press|X}} and {{key press|Shift|X}}.&lt;br /&gt;
&lt;br /&gt;
One of the first steps that many take on entering an unfamiliar cockpit is to press {{key press|Ctrl|C}} to highlight all the &amp;quot;hotspots&amp;quot;, that is instrument controls, buttons, knobs, etc. Many aircraft also offer a specific help menu.&lt;br /&gt;
&lt;br /&gt;
Some functions, such as starter or magneto, may be difficult to use or simply lack clickable &amp;quot;hotspots&amp;quot;, especially in aircraft models which are in development. In most cases you can go for the equivalent controls on a 2D panel or resort to the keyboard. The keyboard always work according to the assignments listed on the ''Help'' menu, but sometimes these are reassigned by an aircraft or configuration. Again, remember to check all the help dialogs.&lt;br /&gt;
&lt;br /&gt;
=== Starting the engine ===&lt;br /&gt;
You are eager to fly, but the engine is off. Well, turning on the engines is not always easy. Some aircraft have an ''autostart'' entry in their custom menu, but here is a general procedure that should work in many cases:&lt;br /&gt;
&lt;br /&gt;
In general to start the engine on a piston-engine type aircraft, you need (after making sure the game is not paused {{key press|p}}):&lt;br /&gt;
# Fuel: Some aircraft start the simulation with no fuel. You can add it in ''Equipment'' &amp;amp;gt; ''Fuel and Payload''.&lt;br /&gt;
# Correct fuel mixture: This is generally ''rich'', so push the red knob all the way in, or use the key {{key press|m}} to enrich ({{key press|Shift|m}} leans.)&lt;br /&gt;
# Magnetos set on ''both'': Turn the key or press {{key press|&amp;amp;#125;}} ''three times'' to move through ''R'', ''L'', ''Both''.&lt;br /&gt;
# Throttle: Some engines start better with a little gas.&lt;br /&gt;
# Run the starter: Click the ''Start'' position of the key on the panel, or press {{key press|s}}. Hold the starter for sufficient time, even 10 seconds.&lt;br /&gt;
&lt;br /&gt;
Starting all engines in a multi-engine aircraft is similar to the single engine - except you must follow the same start sequence for each and every engine. FlightGear provides a convenient way to do this for all engines at once: Press {{key press|~}} and all the procedure above will work for all the engines. Note though that the default 2D panel is connected to ''only one engine'' and the {{key press|~}} trick might not work. Also, give some gas to be sure that all the engines are on.&lt;br /&gt;
&lt;br /&gt;
These instructions may not work for jet aircraft, helicopters, or other types of aircraft with complex start procedures. Check the instructions in the aircraft help menu (press {{key press|?}}) and/or look at [[Aircraft|the aircraft's article on this wiki]]. In general to start the engine on a jet engine type aircraft, you need to:&lt;br /&gt;
# Set cutoff ''ON'' &lt;br /&gt;
# Engage the starter&lt;br /&gt;
# Once the engines spools up to approximately 5% N1, set cutoff ''OFF''&lt;br /&gt;
# Disengage the starter once the engine has reached operational speed&lt;br /&gt;
&lt;br /&gt;
== Learning to fly ==&lt;br /&gt;
=== FlightGear's Manual ===&lt;br /&gt;
FlightGear has an official [https://www.flightgear.org/support/manual/ manual] that covers the basics of flight. As a beginner, you may want to start with [https://flightgear.gitlab.io/getstart/release-{{current release|cr}}/en/HTML/getstart-ench8.html Chapter 8: A Basic Flight Simulator Tutorial].&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
Many aircraft have their own interactive [[tutorials|tutorial]]. With tutorials, you can learn to operate particular aircraft but also learn to fly. You can access tutorials by going to ''Main menu'' &amp;amp;gt; ''Help'' &amp;amp;gt; ''Tutorial''. A great place to start is the tutorial for the [[Cessna 172P]] aircraft, commonly used in real life to learn to fly fixed-winged aircraft.&lt;br /&gt;
&lt;br /&gt;
If the tutorial starts without a runway and surrounded by water, your setup of FlightGear is missing the scenery for the airport at which the tutorial was supposed to run. To get scenery see the [[#Getting scenery]] section above.&lt;br /&gt;
&lt;br /&gt;
== Making your first flight ==&lt;br /&gt;
=== Realism ===&lt;br /&gt;
One of the most frequent questions novice pilots ask about any flight simulator, but more so to FlightGear, is &amp;quot;Why is my aircraft turning left all the time?&amp;quot; Although it could be due to wind gusts crossing the runway, it is more likely due to the [[Understanding Propeller Torque and P-Factor|propeller torque and p-factor]].&lt;br /&gt;
&lt;br /&gt;
In certain other flight simulators, despite marketing slogans to the contrary, some settings are turned down to make the aircraft easier to fly. This reduces effects such as the above. The realism is always turned up in FlightGear.&lt;br /&gt;
&lt;br /&gt;
Here are some of the FlightGear realism points, which may be confusing to first time pilots:&lt;br /&gt;
* &amp;quot;Left turning syndrome&amp;quot; for the previously mentioned reasons.&lt;br /&gt;
* Compass turning error: A compass, when subjected to the forces of flight, tends to turn in the opposite direction for a brief period before settling on the correct heading. This is not a malfunction (see also the Wikipedia article {{wikipedia|Aircraft compass turns}}).&lt;br /&gt;
* The Vertical Speed Indicator (VSI) is also subject to error.&lt;br /&gt;
* The [[Horizontal Situation Indicator]] (HSI) is driven by a gyroscope (that is why it is sometimes called a Directional Gyroscope), which is subject to ''gyro drift''. The indicator will drift from its current heading and must be periodically (every ~15 minutes) calibrated to agree with the magnetic compass heading.&lt;br /&gt;
* You cannot just cancel a turn or climb by centering the yoke or stick. You must turn or push the stick the other way to get to level and level flight. But even then, the plane will not maintain its altitude or heading by itself. A common mistake is trying to find a hands off yoke position. While with trimming one could leave the plane for a couple of seconds, one must use autopilot or constantly adjust the yoke.&lt;br /&gt;
&lt;br /&gt;
Many forces act on an aircraft in flight as well as on the [[avionics and instruments]] used for control and navigation, and may be counter-intuitive. Pilots must learn to recognize these phenomena and compensate for their effects. ''FlightGear models instrument errors that exist in the real world''.&lt;br /&gt;
&lt;br /&gt;
=== Airports and navigation aids ===&lt;br /&gt;
When you first start FlightGear, whether from the command line or the graphical interface of the launchers, you may wonder how to determine what airports are available. The launcher displays a list of airports, but you will not see details such as tower or [[ILS]] frequencies. You will not find a map showing [[VOR]]s and their frequencies. What can you do? See [[Getting aeronautical charts]].&lt;br /&gt;
&lt;br /&gt;
In-sim, there is a map you can use in ''Main Menu'' &amp;amp;gt; ''Equipment'' &amp;amp;gt; ''Map'', which will allow you to see navigation data and the position of airports and aids. For more help with navigation see [[Understanding navigation]].&lt;br /&gt;
&lt;br /&gt;
=== Flying using the autopilot ===&lt;br /&gt;
Some aircraft require you to use the [[autopilot]] available from the ''Autopilot'' menu, which is the original FlightGear autopilot. This is a ''generic'' autopilot and as such, many aircraft come with their own ''specific'' autopilot, frequently a model of the real life one.&lt;br /&gt;
&lt;br /&gt;
For aircraft that provide their own autopilot, you should use the autopilot controls available in the virtual cockpit. This means clicking on the instrument panel in the virtual cockpit. The Autopilot menu will be grayed out and unavailable when the aircraft supplies its own autopilot in some aircraft, including the Airbuses and the [[Cessna 172P|C172P]].&lt;br /&gt;
&lt;br /&gt;
The Cessna 172 comes with a [[Bendix/King KAP140 Autopilot]] in its virtual cockpit. You can use both the autopilot device in the cockpit and the [[Autopilot#Autopilot Settings|autopilot settings]] from the menu.&lt;br /&gt;
&lt;br /&gt;
== Advanced ==&lt;br /&gt;
=== Flying ===&lt;br /&gt;
{{Main article|Aircraft}}&lt;br /&gt;
&lt;br /&gt;
* If you continue to fly light civilian aircraft, [[Cessna 182S]] which is more complex than C172P and [[Piper PA28 Warrior II|PA28]] are good choices.&lt;br /&gt;
* If you are interested in flying airlines, [[Airbus A320 family]], Boeing [[Boeing 777|777]]/[[Boeing 787-8 Dreamliner|787]], [[MD-11]] and [[MD-80]] are suggested.&lt;br /&gt;
* If you are fascinated by fighter aircrafts, choose a highly rated military aircraft (such as [[General Dynamics F-16 Fighting Falcon|F-16]]/[[F-15]]) from [[Aircraft#Modern military aircraft|here]], and enable multiplayer damage or install [[Bombable]].&lt;br /&gt;
* If you switch to helicopters, it is recommended to fly [[Eurocopter EC130 B4]].&lt;br /&gt;
&lt;br /&gt;
Besides common aircraft, there are also detailed [[Space Shuttle|space shuttles]] available.&lt;br /&gt;
&lt;br /&gt;
=== Scenery ===&lt;br /&gt;
It is fascinating to explore the [[scenery]] (or just test the graphics/frame rate) with [[UFO]]. First of all, [[#Configuring rendering and UI|increase your graphics quality]]. If you don't see buildings initially, keep FG open and wait for a while for [[TerraSync]] to finish downloading and for the buildings to appear.&lt;br /&gt;
There are plenty of [[Suggested airports|well-developed airports]] and scenery areas. You can also explore the scenery objects on the [https://scenery.flightgear.org/map model map].&lt;br /&gt;
&lt;br /&gt;
=== Multiplayer ===&lt;br /&gt;
FlightGear has some multiplayer servers that will let you fly in more lively skies, see [[Howto: Multiplayer]]. There are also [[OpenRadar]] and [[ATC-pie]], standalone programs that will let you be an [[Air traffic control|air traffic controller]].&lt;br /&gt;
&lt;br /&gt;
There is also a [[MPMap|multiplayer map]] that lets you see who is online right now, and even what [[navaids]] are nearby.&lt;br /&gt;
&lt;br /&gt;
=== Menu items ===&lt;br /&gt;
For a quick reference about the usage of each menu item in FlightGear, see [[menu]].&lt;br /&gt;
&lt;br /&gt;
=== Addons ===&lt;br /&gt;
FlightGear has a lot of third-party [[Addon|addons]] containing enhancements. For beginners, [[Logbook Add-on|Logbook]] and [[Which Runway Add-on|Which Runway]] may be the most useful addons.&lt;br /&gt;
&lt;br /&gt;
== The FlightGear community ==&lt;br /&gt;
=== Getting help ===&lt;br /&gt;
This page is designed to give the user the essential things they need to know about using FlightGear for the first time. Besides the [[Portal:User|User portal]] of this wiki, there are other pages you may want to read:&lt;br /&gt;
*[[Troubleshooting problems]] to help you with the most common issues;&lt;br /&gt;
*[[Frequently asked questions]];&lt;br /&gt;
...and communication channels that can be used to obtain information or request help:&lt;br /&gt;
*The [[FlightGear Manual]], a ''must read'' for beginners;&lt;br /&gt;
*{{forum link|text=FlightGear Forum}} and its subforums;&lt;br /&gt;
*[[Discord|FlightGear's Discord server]], the quickest way to get help;&lt;br /&gt;
*[[FlightGear IRC channel]];&lt;br /&gt;
*[[Mailing list|FlightGear users mailing list]], biggest chance to get in contact with core developers;&lt;br /&gt;
*Documents bundled with the release package.&lt;br /&gt;
&lt;br /&gt;
=== Customizing FlightGear without compiling it ===&lt;br /&gt;
[https://www.flightgear.org/download/ Our website] offers precompiled binaries for download and install on Windows, macOS and Linux. In addition, most Linux distributions provide a packaged version in their repositories.&lt;br /&gt;
&lt;br /&gt;
Although the install is binary, most of FlightGear's systems are open to configuration through [[XML]] files and [[NASAL scripting]]. You are free ''and encouraged'' to make changes to aircraft flight models, scenery, textures, OpenGL [[shader]]s and any other feature you wish to change for your personal satisfaction or to share with other FlightGear users. If this is what you intend to do, take a look at the [[Portal:Developer|Developer portal]].&lt;br /&gt;
&lt;br /&gt;
=== How you can help ===&lt;br /&gt;
{{Main article|Volunteer}}&lt;br /&gt;
FlightGear is an open source, volunteer based project. That means that whatever you find here comes from passion, spare time and nothing else. This includes the simulator, the scenery, the aircraft, the wiki, the {{forum link|text=forum}} and everything else. Volunteers, in essence ''people that do things'', are fundamental to this project. Without them, it would not make a single step forward. So it is essential that contributors have fun in what they do.&lt;br /&gt;
&lt;br /&gt;
If you plan to contribute to this project, you should take a look at some articles that will give you some hints:&lt;br /&gt;
*[[Howto:Understand the FlightGear development process]]&lt;br /&gt;
*[[Implementing new features for FlightGear]]&lt;br /&gt;
*[[How the FlightGear project works]]&lt;br /&gt;
&lt;br /&gt;
There are never enough people contributing, and the fields where their help would be appreciated are many:&lt;br /&gt;
;Testing:&lt;br /&gt;
*[[Building FlightGear|Build]] the latest Git code&lt;br /&gt;
*[https://gitlab.com/flightgear/flightgear/-/issues File bug reports]&lt;br /&gt;
*Running FlightGear via valgrind to track down memory leaks&lt;br /&gt;
&lt;br /&gt;
;Support:&lt;br /&gt;
*Help new users with downloading, compiling, installing and running FlightGear ({{forum link|text=on the forum}} or on [[Discord]])&lt;br /&gt;
*Provide ideas &amp;amp; suggestions, see: [[Feature Requests / Proposals / Ideas]]&lt;br /&gt;
*Help [[Portal:Wiki|clean up this wiki]]&lt;br /&gt;
*Help provide new contents for missing wiki pages&lt;br /&gt;
&lt;br /&gt;
;Development:&lt;br /&gt;
*C/C++ Coding:&lt;br /&gt;
**Provide [[Howto:Start core development|source code/data/documentation contributions]]&lt;br /&gt;
**Provide [[Bugs|bug fixes]] or new features&lt;br /&gt;
**Get involved in any of the other FlightGear-affiliated projects&lt;br /&gt;
*Aircraft development (3D modeling, textures, FDMs, scripting)&lt;br /&gt;
*Scenery development (terrain, model, weather)&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Nou a FlightGear]]&lt;br /&gt;
[[de:Neu bei FlightGear]]&lt;br /&gt;
[[es:Nuevo en FlightGear]]&lt;br /&gt;
[[fi:Uusi_käyttäjä]]&lt;br /&gt;
[[fr:Nouveau sur flightgear]]&lt;br /&gt;
[[it:Nuovo per FlightGear]]&lt;br /&gt;
[[ja:FlightGear入門]]&lt;br /&gt;
[[nl:Nieuw bij FlightGear]]&lt;br /&gt;
[[pl:Nowy w FlightGear]]&lt;br /&gt;
[[pt:Novo no FlightGear]]&lt;br /&gt;
[[sr:Novi u FlightGear-u]]&lt;br /&gt;
[[th:New to FlightGear]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144743</id>
		<title>Howto:Start core development</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144743"/>
		<updated>2026-05-28T05:25:05Z</updated>

		<summary type="html">&lt;p&gt;Servo: /* Fork the Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|You'll need to familiarize yourself with setting up a development environment and building FlightGear in order to contribute code. See&lt;br /&gt;
[https://docs.flightgear.org/contributors-guide/guidelines/building.html Developing on the codebase] if you do not already&lt;br /&gt;
have a working setup. Some understanding of ''Git'' will also be&lt;br /&gt;
necessary; this free, online [https://git-scm.com/book/en/v2 Git book] is quite useful.}}&lt;br /&gt;
&lt;br /&gt;
The most efficient way to contribute changes to the FlightGear code base is to&lt;br /&gt;
file a merge request (this doesn't apply to [[aircraft]] or [[addon|add-ons]], which are&lt;br /&gt;
managed differently). We'll first give an overview of the process including&lt;br /&gt;
its main prerequisites, then explain each step in more detail.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The basic workflow for first-time contributors to a FlightGear Git repository&lt;br /&gt;
is:&lt;br /&gt;
&lt;br /&gt;
#. '''Fork the repository.'''&lt;br /&gt;
   Fork the relevant FlightGear repository into your GitLab account. You will&lt;br /&gt;
   need to know which repository contains the code you are trying to change.&lt;br /&gt;
   Familiarizing yourself with the code base and the purpose of each&lt;br /&gt;
   repository is strongly recommended.&lt;br /&gt;
&lt;br /&gt;
#. '''Set up a local clone.'''&lt;br /&gt;
   Prepare a clone of the repository on your hard disk that is convenient for&lt;br /&gt;
   getting updates from the upstream repository and pushing changes to your&lt;br /&gt;
   fork. You'll also use this clone to perform test builds.&lt;br /&gt;
&lt;br /&gt;
#. '''Build the project.'''&lt;br /&gt;
   If you haven't already done so, this will be the time to set up your&lt;br /&gt;
   development environment so that you can build FlightGear.&lt;br /&gt;
&lt;br /&gt;
#. '''Create a new branch.'''&lt;br /&gt;
   Create a branch on your clone to isolate your changes. Use a clear and&lt;br /&gt;
   descriptive name for your branch (e.g. &amp;lt;code&amp;gt;fix-menubar-typo&amp;lt;/code&amp;gt; or&lt;br /&gt;
   &amp;lt;code&amp;gt;add-new-joystick-configs&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
#. '''Make changes.'''&lt;br /&gt;
   Make the changes on your branch in small, focused commits. Each commit&lt;br /&gt;
   should be self-contained and represent one logical change.&lt;br /&gt;
&lt;br /&gt;
#. '''Test and double-check.'''&lt;br /&gt;
   Before you submit your changes to the FlightGear team for review,&lt;br /&gt;
   double-check your work. Ensure that your code builds and that tests pass.&lt;br /&gt;
&lt;br /&gt;
#. '''Rebase and push.'''&lt;br /&gt;
   Check if the upstream repository was updated in the meantime. If so, rebase&lt;br /&gt;
   your work on its latest state and perform a final test run to make sure&lt;br /&gt;
   everything still works fine.&lt;br /&gt;
&lt;br /&gt;
#. '''Submit a merge request.'''&lt;br /&gt;
   Open a merge request (MR) to propose your changes for review. Be sure to&lt;br /&gt;
   use the ''Merge Request Template'' to provide necessary context for&lt;br /&gt;
   reviewers. Feel free to ask on the developer mailing list if you're unsure&lt;br /&gt;
   whom to add as a reviewer.&lt;br /&gt;
&lt;br /&gt;
#. '''Code review.'''&lt;br /&gt;
   Once you have created a merge request, other developers will review your&lt;br /&gt;
   work, give feedback, and sometimes request changes be made. This is a&lt;br /&gt;
   crucial part of the development process, as it helps reduce bugs and&lt;br /&gt;
   improves code quality.&lt;br /&gt;
&lt;br /&gt;
#. '''Clean up.'''&lt;br /&gt;
   If your merge request was applied, pull your changes from the upstream&lt;br /&gt;
   branch and delete the local branch you created for the merge request.&lt;br /&gt;
&lt;br /&gt;
In order to present these steps in more detail, we'll now assume that you&lt;br /&gt;
intend to make your first contribution to the [https://gitlab.com/flightgear/simgear SimGear repository] (and thus,&lt;br /&gt;
that you haven't already forked it). Except for the target branch name which&lt;br /&gt;
may differ, the process would be the same for any Git repository of the&lt;br /&gt;
FlightGear project.&lt;br /&gt;
&lt;br /&gt;
== Fork the Repository ==&lt;br /&gt;
&lt;br /&gt;
For what follows, you'll need to create a [https://gitlab.com/ GitLab] account if you don't already&lt;br /&gt;
have one. Once you are logged into your account, go to the repository home&lt;br /&gt;
page ([https://gitlab.com/flightgear/simgear here] in our example) and click on the&lt;br /&gt;
&amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork&amp;lt;/span&amp;gt; button as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;forking-the-upstream-repo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;; after&lt;br /&gt;
filling some information, this will lead to the creation of a copy of the&lt;br /&gt;
upstream repository in your own GitLab namespace under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:01_forking.png|thumb|alt=how to find the Fork button on the main page of the repository|Forking the upstream repository]]&lt;br /&gt;
&lt;br /&gt;
Once you've clicked on the button, a new page is loaded as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;entering-fork-metadata&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;. The ''Project name'' will be prominent but it's&lt;br /&gt;
only a label—choose it as you wish (“My SimGear fork” in the example). For the&lt;br /&gt;
''Project URL'', you'll want to select your GitLab username after the initial&lt;br /&gt;
portion &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:02 project name, URL, slug.png|thumb|alt=dialog that allows one to enter the project name, URL and slug for a fork|Entering the project name, URL and slug for your fork]]&lt;br /&gt;
&lt;br /&gt;
The ''Project slug'' is the final part of the base URL for the fork you're about&lt;br /&gt;
to create; let's choose &amp;lt;code&amp;gt;flightgear-simgear&amp;lt;/code&amp;gt; so that all your forks of&lt;br /&gt;
repositories of the FlightGear project are named &amp;lt;code&amp;gt;flightgear-something&amp;lt;/code&amp;gt;.&lt;br /&gt;
This way, they will be easy to distinguish from non-FlightGear repositories&lt;br /&gt;
you might want to publish under &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Beware&lt;br /&gt;
that if you modify the ''Project name'', the GitLab user interface automatically&lt;br /&gt;
modifies the ''Project slug''; so, better fill them in this order: ''Project name''&lt;br /&gt;
then ''Project slug''.&lt;br /&gt;
&lt;br /&gt;
There are a few fields left to enter. If you choose to include only the&lt;br /&gt;
default branch, you'll save a little amount of space but might have to fetch&lt;br /&gt;
other upstream branches later. Give your fork public visiblity so that reviews&lt;br /&gt;
can take place. When ready, click on the &amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork project&amp;lt;/span&amp;gt; button to&lt;br /&gt;
actually create your fork of the upstream repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;section-Set-up-a-local-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Up a Local Clone ==&lt;br /&gt;
&lt;br /&gt;
Since we want to pull updates from the upstream repository, it is convenient&lt;br /&gt;
to clone it to your hard disk and modify the clone so that pushes go by&lt;br /&gt;
default to your fork (which is online under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;). Cloning the upstream SimGear repository&lt;br /&gt;
can be done with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://gitlab.com/flightgear/simgear.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tip|If you use &amp;lt;code&amp;gt;download_and_compile.sh&amp;lt;/code&amp;gt; and it manages the repository you&lt;br /&gt;
want to contribute to (this is obviously the case for SimGear), there is&lt;br /&gt;
no need to create a new clone: you can simply use the repository clone it&lt;br /&gt;
created on your disk.}}&lt;br /&gt;
&lt;br /&gt;
Now, let's add a Git remote that points to your fork of the upstream&lt;br /&gt;
repository. We configure this remote so that pushing to it uses &amp;lt;abbr title=&amp;quot;Secure Shell&amp;quot;&amp;gt;SSH&amp;lt;/abbr&amp;gt; authentication. We also configure your repository clone so&lt;br /&gt;
that pushes go to your fork by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git remote add flo https://gitlab.com/frougon/flightgear-simgear.git&lt;br /&gt;
git remote set-url --push flo git@gitlab.com:frougon/flightgear-simgear.git&lt;br /&gt;
git config remote.pushDefault flo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above commands, replace &amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; (name of the created remote) with an&lt;br /&gt;
appropriate name of your choice; also replace &amp;lt;code&amp;gt;frougon&amp;lt;/code&amp;gt; with your GitLab&lt;br /&gt;
username.&lt;br /&gt;
&lt;br /&gt;
== Build the Project ==&lt;br /&gt;
&lt;br /&gt;
Make sure you can build FlightGear using the repository clone set up in the&lt;br /&gt;
previous step and that the resulting executables run normally. This way,&lt;br /&gt;
you'll be able to properly test any changes you later make in this clone.&lt;br /&gt;
&lt;br /&gt;
{{note|The following steps will have to be repeated for each&lt;br /&gt;
“self-contained changeset” that you intend to contribute.}}&lt;br /&gt;
&lt;br /&gt;
== Create a New Branch ==&lt;br /&gt;
&lt;br /&gt;
Create a branch based on &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; that tracks &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; and make&lt;br /&gt;
sure it is up-to-date. Instead of &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, choose a name that&lt;br /&gt;
makes it clear what the changes in the created branch are supposed to do.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout -b new-branch-name origin/next&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|Here, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; is a remote that points to the upstream repository&lt;br /&gt;
you cloned from, and &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; is the name of the development branch&lt;br /&gt;
in the [https://gitlab.com/flightgear/simgear SimGear repository] (this is also the case for [https://gitlab.com/flightgear/flightgear FlightGear] and [https://gitlab.com/flightgear/fgdata FGData]). If&lt;br /&gt;
you were to contribute to a different repository such as [https://gitlab.com/flightgear/documentation FlightGear documentation], the branch&lt;br /&gt;
to base your work on might have a different name (e.g., &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
== Make Changes ==&lt;br /&gt;
&lt;br /&gt;
Commit the desired changes to the branch you created in the previous step. If&lt;br /&gt;
you need help with &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, this online [https://git-scm.com/book/en/v2 book] is a great resource.&lt;br /&gt;
&lt;br /&gt;
Each commit message should start with a single, not too long summary line (no&lt;br /&gt;
more than 72—80 characters if possible), then a blank line, then normal&lt;br /&gt;
explanations. Example commit message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HID: allow sending output reports from Nasal&lt;br /&gt;
&lt;br /&gt;
- make watched properties only react on a value change&lt;br /&gt;
- refactor the larger usage enums to their own file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like here, it is useful when the beginning of the first line is short and&lt;br /&gt;
makes it clear to readers which part of the code (subsystem, class, etc.) is&lt;br /&gt;
affected by the changes.&lt;br /&gt;
&lt;br /&gt;
== Test and Double-check ==&lt;br /&gt;
&lt;br /&gt;
Rebuild FlightGear with your changes, carefully test. Build the FlightGear&lt;br /&gt;
test suite and verify that the tests still pass. This can be done by running&lt;br /&gt;
&amp;lt;code&amp;gt;make test_suite&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ninja test_suite&amp;lt;/code&amp;gt; from the FlightGear build directory&lt;br /&gt;
(not the source repository!).&lt;br /&gt;
&lt;br /&gt;
Use commands like:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; to check the state of your working directory and repository;&lt;br /&gt;
* &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt; to proofread your commit diffs and messages;&lt;br /&gt;
* &amp;lt;code&amp;gt;git commit --amend&amp;lt;/code&amp;gt; to modify the most recent commit on the branch;&lt;br /&gt;
* &amp;lt;code&amp;gt;git rebase -i &amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt; to modify commits located further&lt;br /&gt;
  in the ancestry graph (namely, descendants of commit &amp;lt;code&amp;gt;&amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt;; see the&lt;br /&gt;
  &amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt; manual page for explanations).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; program is not essential but can be nice for examining&lt;br /&gt;
commits and visualizing the commit graph. If &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; appears to see&lt;br /&gt;
local changes that really aren't there, run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; then rerun&lt;br /&gt;
&amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; programs are useful to run code quality&lt;br /&gt;
checks and apply the project formatting rules. Some of the configured&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks will for instance check for common mistakes&lt;br /&gt;
including typos, mixed whitespace or line endings, and so on. If you've&lt;br /&gt;
[https://pre-commit.com/#3-install-the-git-hook-scripts installed] the&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks in your repository clone, &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt;&lt;br /&gt;
will be automatically run every time you commit.&lt;br /&gt;
&lt;br /&gt;
{{note|In most cases, the GitLab CI (Continuous Integration) runs&lt;br /&gt;
the &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; checks as part&lt;br /&gt;
of the automatic verifications that need to pass, before a merge request can be applied.}}&lt;br /&gt;
&lt;br /&gt;
== Rebase and Push ==&lt;br /&gt;
&lt;br /&gt;
If the upstream branch you started from has changed in the meantime, your work&lt;br /&gt;
needs to be rebased on top of its latest state. This can be done with the&lt;br /&gt;
following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case someone was working on the same files as you, this may trigger&lt;br /&gt;
conflicts (so it's a good idea to first announce what you're going to work on&lt;br /&gt;
in order to minimize friction and benefit from the insight of experienced&lt;br /&gt;
people). Conflicts don't happen very often and it's not the end of the world&lt;br /&gt;
when they do. Again, this [https://git-scm.com/book/en/v2 Git book] is a very useful resource in such cases.&lt;br /&gt;
&lt;br /&gt;
If the rebasing did grab upstream changes, perform a final build-and-test run&lt;br /&gt;
to be sure everything works fine. Finally, push the branch to your fork:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With no additional arguments, this pushes the current branch to the remote&lt;br /&gt;
specified with the &amp;lt;code&amp;gt;remote.pushDefault&amp;lt;/code&amp;gt; setting, i.e. to your clone if you&lt;br /&gt;
followed the [[#section-Set-up-a-local-clone|above]] instructions. Once&lt;br /&gt;
the push is successful, &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will show a URL; following it will start the next step.&lt;br /&gt;
&lt;br /&gt;
== Submit a Merge Request ==&lt;br /&gt;
&lt;br /&gt;
The web page opened from the URL output by &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; when you pushed to&lt;br /&gt;
your fork allows to create a merge request from the branch that was pushed.&lt;br /&gt;
From this page, select the proper target branch: for development code in&lt;br /&gt;
[https://gitlab.com/flightgear/simgear SimGear], that would be &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Select yourself as&lt;br /&gt;
an ''assignee'' (meaning that ''you'' are going to shape the merge request into&lt;br /&gt;
its final form). Select one or more reviewers to look at it—you can ask on the&lt;br /&gt;
[https://sourceforge.net/p/flightgear/mailman/flightgear-devel/ flightgear-devel mailing-list] if unsure, or just leave the field as&lt;br /&gt;
''Unassigned''. Don't worry too much about the milestone ''(a priori,'' &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
should do unless the merge request is specifically a fix for a release&lt;br /&gt;
branch). Select applicable labels, etc.&lt;br /&gt;
&lt;br /&gt;
Regarding the ''Delete source branch when merge request is accepted'' option, we&lt;br /&gt;
advise you to make sure it is enabled, otherwise your fork will soon have tons&lt;br /&gt;
of branches. What this option does is the following: when the branch from your&lt;br /&gt;
merge request is merged into the upstream branch, GitLab will automatically&lt;br /&gt;
delete the merge request branch (that you pushed) from your fork. This happens&lt;br /&gt;
online at GitLab, not in your local clone. Thus, even after this&lt;br /&gt;
occurs, the branch will still be present locally in your clone, until you&lt;br /&gt;
delete it yourself (cf. [[#local-branch-removal|below]]).&lt;br /&gt;
&lt;br /&gt;
Finally, the ''Squash commits when merge request is accepted'' option can be&lt;br /&gt;
used in case you pushed several commits but would rather have them coalesced&lt;br /&gt;
into a single one when the merge request is applied. This is something that&lt;br /&gt;
can be done locally using &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; before pushing (in particular, with&lt;br /&gt;
&amp;lt;code&amp;gt;git rebase -i&amp;lt;/code&amp;gt;), however the option is still useful in case commits are added&lt;br /&gt;
to the merge request after the initial push, be it by you or by reviewers.&lt;br /&gt;
&lt;br /&gt;
== Code Review ==&lt;br /&gt;
&lt;br /&gt;
After a few minutes, hours or days, you'll receive feedback from the&lt;br /&gt;
FlightGear developers about your merge request. Reviewing merge requests&lt;br /&gt;
requires expertise and takes some time, so please carefully read the remarks&lt;br /&gt;
and suggestions, follow up on the questions and requests for changes.&lt;br /&gt;
&lt;br /&gt;
== Clean Up ==&lt;br /&gt;
&lt;br /&gt;
Once the branch is merged, update the local branch of your clone that tracks&lt;br /&gt;
the upstream branch your merge request went to (this is the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; branch in&lt;br /&gt;
our SimGear example):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout next&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Normally, the &amp;lt;code&amp;gt;--rebase&amp;lt;/code&amp;gt; option shouldn't be necessary here as you&lt;br /&gt;
shouldn't have any local commits on top of the upstream ones in this branch,&lt;br /&gt;
however it doesn't hurt and can make things easier if you've been forgetful.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;local-branch-removal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can now delete the local branch you created earlier to avoid cluttering&lt;br /&gt;
your local clone with legacy, unneeded branches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git branch -d new-branch-name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case this branch hasn't been merged ''exactly as is'' into the upstream&lt;br /&gt;
branch (same commit contents and metadata), &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will warn and&lt;br /&gt;
refuse to delete the branch unless you insist using &amp;lt;code&amp;gt;-D&amp;lt;/code&amp;gt;. If this happens,&lt;br /&gt;
you'll have to evaluate yourself (by using &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt;, by comparing&lt;br /&gt;
files...) if deleting your local branch &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; is really the&lt;br /&gt;
right thing to do. In the likely case that what was merged is a strict&lt;br /&gt;
improvement over what you have in &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, then deleting is the&lt;br /&gt;
way to go.&lt;br /&gt;
&lt;br /&gt;
{{tip|If you really, really messed up and deleted the branch before&lt;br /&gt;
realizing that it was a mistake, &amp;lt;code&amp;gt;git reflog&amp;lt;/code&amp;gt; is likely to save you:&lt;br /&gt;
among other things, it shows the commit hashes corresponding to previous&lt;br /&gt;
positions of the tips of various branches. As long as no garbage collection occurred in the meantime (&amp;lt;code&amp;gt;git gc&amp;lt;/code&amp;gt;), the commit&lt;br /&gt;
hashes are all you need to restore “lost commits”: simply create a&lt;br /&gt;
branch or tag from the desired commit (before doing do, you may want&lt;br /&gt;
to use &amp;lt;code&amp;gt;git show &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to see the commit for a given hash, or &amp;lt;code&amp;gt;git log &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to examine its ancestry).}}&lt;br /&gt;
&lt;br /&gt;
From time to time, you may also want to run &amp;lt;code&amp;gt;git fetch -p flo&amp;lt;/code&amp;gt; (replace&lt;br /&gt;
&amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; with the name of a remote that points to your fork,&lt;br /&gt;
cf. [[#section-Set-up-a-local-clone]]). This removes the &amp;lt;code&amp;gt;flo/...&amp;lt;/code&amp;gt;&lt;br /&gt;
branches from your local clone that have been deleted from your fork at GitLab&lt;br /&gt;
due to the ''Delete source branch when merge request is accepted'' option on the&lt;br /&gt;
merge request page (note that for instance, &amp;lt;code&amp;gt;flo/new-branch-name&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; are different branches in your clone; they'll both clutter&lt;br /&gt;
the display when using &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; until you delete them).&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html How to Contribute Code]&lt;br /&gt;
* [https://git-scm.com/book/en/v2 The Git book]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;br /&gt;
[[Category:Core developer documentation]]&lt;br /&gt;
[[ru:Howto:Приступая к разработке ядра]]&lt;br /&gt;
[[Category:Hackathon Materials]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=File:01_forking.png&amp;diff=144742</id>
		<title>File:01 forking.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=File:01_forking.png&amp;diff=144742"/>
		<updated>2026-05-28T05:23:41Z</updated>

		<summary type="html">&lt;p&gt;Servo: Uploaded a work by fg contributors from https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=01 forking}}&lt;br /&gt;
|date=2026-05-28&lt;br /&gt;
|source=https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html&lt;br /&gt;
|author=fg contributors&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{subst:Custom license marker added by UW}}&lt;br /&gt;
GPLv2+&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=File:02_project_name,_URL,_slug.png&amp;diff=144741</id>
		<title>File:02 project name, URL, slug.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=File:02_project_name,_URL,_slug.png&amp;diff=144741"/>
		<updated>2026-05-28T05:22:49Z</updated>

		<summary type="html">&lt;p&gt;Servo: Uploaded a work by fg contributors from https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=02 project name, URL, slug}}&lt;br /&gt;
|date=2026-05-28&lt;br /&gt;
|source=https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html&lt;br /&gt;
|author=fg contributors&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{subst:Custom license marker added by UW}}&lt;br /&gt;
GPLv2+&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Template:Volunteer_Intro&amp;diff=144740</id>
		<title>Template:Volunteer Intro</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Template:Volunteer_Intro&amp;diff=144740"/>
		<updated>2026-05-28T05:14:01Z</updated>

		<summary type="html">&lt;p&gt;Servo: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many people think that contributing to the [[FlightGear]] project requires writing C++ code or doing [[Portal:Developer/3D Modelers|3D modeling]] and that it takes lots of time, and therefore feel that they cannot contribute directly. Not so. There's a whole variety of ways to make a valuable and satisfying contribution to FlightGear without being a developer.&lt;br /&gt;
&lt;br /&gt;
The '''[[Volunteer]]''' page is intended to provide a starting point for those wanting to contribute, but who don't know how. Of course, these are just suggestions. So if you have already a specific idea in mind, please do get in touch with the community to ask for feedback, using the [https://gitlab.com/groups/flightgear/-/issues issue tracker], [[mailing list]]s, {{forum link|text=forum}} or the [[Discord]] (chat).&lt;br /&gt;
&lt;br /&gt;
Remember that work in non-development areas will be appreciated as much as developer contributions (or more!), because generally more visible to the end user.&lt;br /&gt;
&lt;br /&gt;
If you'd like to learn more about getting your own ideas and features into FlightGear, check out [[Implementing new features for FlightGear]].&lt;br /&gt;
&lt;br /&gt;
If you are '''contributing to the core simulator''', or an aircraft in the '''master repository''', you should be part of the FlightGear-devel mailing list, which is the primary point of contact for all discussions regarding the development of the simulator. You may want to check out also [[Howto: Understand the FlightGear development process]] and [[Howto: Starting core development]].&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Undocumented templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Template:Volunteer_Intro&amp;diff=144739</id>
		<title>Template:Volunteer Intro</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Template:Volunteer_Intro&amp;diff=144739"/>
		<updated>2026-05-28T05:13:26Z</updated>

		<summary type="html">&lt;p&gt;Servo: add issue tracker&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many people think that contributing to the [[FlightGear]] project requires writing C++ code or doing [[Portal:Developer/3D Modelers|3D modeling]] and that it takes lots of time, and therefore feel that they cannot contribute directly. Not so. There's a whole variety of ways to make a valuable and satisfying contribution to FlightGear without being a developer.&lt;br /&gt;
&lt;br /&gt;
The '''[[Volunteer]]''' page is intended to provide a starting point for those wanting to contribute, but who don't know how. Of course, these are just suggestions. So if you have already a specific idea in mind, please do get in touch with the community to ask for feedback, using the [[https://gitlab.com/groups/flightgear/-/issues issue tracker], [[mailing list]]s, {{forum link|text=forum}} or the [[Discord]] (chat).&lt;br /&gt;
&lt;br /&gt;
Remember that work in non-development areas will be appreciated as much as developer contributions (or more!), because generally more visible to the end user.&lt;br /&gt;
&lt;br /&gt;
If you'd like to learn more about getting your own ideas and features into FlightGear, check out [[Implementing new features for FlightGear]].&lt;br /&gt;
&lt;br /&gt;
If you are '''contributing to the core simulator''', or an aircraft in the '''master repository''', you should be part of the FlightGear-devel mailing list, which is the primary point of contact for all discussions regarding the development of the simulator. You may want to check out also [[Howto: Understand the FlightGear development process]] and [[Howto: Starting core development]].&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Undocumented templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Volunteer&amp;diff=144738</id>
		<title>Volunteer</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Volunteer&amp;diff=144738"/>
		<updated>2026-05-28T05:13:15Z</updated>

		<summary type="html">&lt;p&gt;Servo: removed cppbind ideas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Volunteer Intro}}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
=== Screenshots ===&lt;br /&gt;
Another easy way for getting started contributing is to create nice FlightGear screenshots. You can upload these to the wiki where they can then be used to illustrate articles and to highlight articles via the [[:Category:Picture of the week|picture of the week]] on the main page.&lt;br /&gt;
&lt;br /&gt;
[[Howto: Make nice screenshots]] provides some tips on how to create stunning shots, while [[Help:Upload]] discusses how to upload screenshots to the wiki.&lt;br /&gt;
&lt;br /&gt;
=== Videos ===&lt;br /&gt;
Many users like to capture their flights in FlightGear as a video, YouTube for example is an excellent way for sharing such videos with fellow FlightGear users. YouTube videos can also be directly embedded in forum postings and wiki articles.&lt;br /&gt;
&lt;br /&gt;
=== Screencasts (video tutorials) ===&lt;br /&gt;
Creating FlightGear related video tutorials is another excellent way for getting started contributing. &lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
{{forum|72|FlightGear Documentation}}&lt;br /&gt;
&lt;br /&gt;
=== FAQ-Maintainers ===&lt;br /&gt;
The FlightGear project is looking for people who are willing to help maintain the FAQ which, given the constant development of the project, is chronically out of date. If you you would like to get involved, follow the {{forum link|text=forum}} to stay current on the latest news, problems, and of course on what questions are asked more frequently, and simply start editing the [[FAQ|wiki FAQ]].&lt;br /&gt;
&lt;br /&gt;
=== Maintaining the wiki ===&lt;br /&gt;
You can easily [[Special:UserLogin|register an account]] and help [[Portal:Wiki|improve the wiki]], and provide your help in reviewing articles, fixing their look and readability, updating them and adding what you think is missing, for example many articles could be greatly improved just by adding a handful of relevant screenshots for illustration purposes. Proof reading of existing articles is also greatly appreciated. &lt;br /&gt;
&lt;br /&gt;
Registering takes less than 10 seconds. After registration, you'll have to confirm your registration by clicking on the link sent to you by email.&lt;br /&gt;
&lt;br /&gt;
=== Translating the wiki and FlightGear ===&lt;br /&gt;
You can also help localize the wiki by [[Help:Translate|translating]] important articles into different languages. Please see the [[translation requests]].&lt;br /&gt;
&lt;br /&gt;
Also, FlightGear itself can be easily translated by updating the files in [[$FG_ROOT]]/Translations. For details please see [[Howto: Translate FlightGear|Translating FlightGear]].&lt;br /&gt;
&lt;br /&gt;
=== Wiki article writers ===&lt;br /&gt;
Various aspects of FlightGear are currently not yet sufficiently documented, and available documentation is often not really suitable to be used by non-developers. This results in users being unaware of the wide range of features and possibilities that FlightGear supports already. &lt;br /&gt;
&lt;br /&gt;
As an &amp;quot;article writer&amp;quot; you should be able to document your own experiences with FlightGear in a clear and concise style, so that others can easily follow your instructions in order to make use of the less known features of FlightGear. These articles don't need to be very comprehensive, they shall only provide users with easy to follow instructions on how to achieve something, and possibly some caveats and hints.&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Volunteer: Writing]]&lt;br /&gt;
&lt;br /&gt;
=== Contributing to &amp;quot;The Manual&amp;quot; ===&lt;br /&gt;
The wiki is not the only documentation here, of course. FlightGear comes with a set of illustrated documentation, notably [[FlightGear Manual|&amp;quot;The Manual&amp;quot;]]. If you are a skilled writer and a little bit familiar with LaTex, your help would be really welcome. More on this at &amp;quot;The Manual&amp;quot; wiki page. You'll find the source code in the {{getstart source|text=Getstart repository}}.&lt;br /&gt;
&lt;br /&gt;
=== Documentation Editors/Reviewers ===&lt;br /&gt;
{{Main article|Howto:Write a FlightGear Review}}&lt;br /&gt;
The documentation that comes with FlightGear base package is lacking, terse or simply inaccurate (outdated), due to the advances in FlightGear's code. You should check the current documentation and identify areas for improvement, by directly making corresponding suggestions for augmentations, or even writing new help documents altogether, while staying current with the mailing list.&lt;br /&gt;
&lt;br /&gt;
Smaller corrections shall be sent by email to the developer mailing list, preferably in unified diff format (for patch to work). Alternatively, small text files can also be sent directly to the mailing list, more complex modifications should be only made available by uploading them to a webpage and linking to the corresponding files from your emails. Please consider trying [http://kdiff3.sourceforge.net/ KDiff3], a GUI frontend to the diff and patch utilities that works on several platforms (also Windows).&lt;br /&gt;
&lt;br /&gt;
If you intend to redo a major part of the current documentation, first discuss this with the developers, to avoid documenting code that may also be under development or deprecation.&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
=== Creating interactive tutorials ===&lt;br /&gt;
FlightGear has a built-in [[Tutorials|tutorial]] system that is based on its scripting language [[Nasal]], this system is very flexible and can be used for creating interactive tutorials (or even missions) for use in FlightGear itself, in other words these tutorials run directly in the simulator. &lt;br /&gt;
&lt;br /&gt;
Creating new tutorials, or updating and improving existing ones, is another great way for getting more familiar with FlightGear. For details please see [[Tutorials]].&lt;br /&gt;
&lt;br /&gt;
=== Providing patches for aircraft's -set.xml status fields ===&lt;br /&gt;
One way you could easily contribute would be to submit patches to HEAD setting the &amp;quot;status&amp;quot; flag on each aircraft accurately. While it will require learning a bit about SCM, and XML, that would be a fine contribution. For a details on how the status should be arrived at see  [[Aircraft status indication]].&lt;br /&gt;
&lt;br /&gt;
=== Creating Scenery Models ===&lt;br /&gt;
The FlightGear project maintains a steadily growing repository of [http://scenemodels.flightgear.org 3D models] for adding some eye-candy to the scenery. The world has always enough room left for your [http://scenemodels.flightgear.org/contribute.php contribution]. Please take the time to investigate what is already there and enjoy populating your favourite area.&lt;br /&gt;
&lt;br /&gt;
Note that you don't have to create any models yourself. You can simply [[Howto: Place 3D objects with the UFO|place existing models using the UFO]]. For example, placing objects in the scenery with the [[UFO]] and submitting them to the database is pretty straightforward and takes very little time. Even an hour spent doing this makes a difference.&lt;br /&gt;
&lt;br /&gt;
If anyway you'd like to [[Modeling - Getting Started|test your modeling skills]], here some suggestions:&lt;br /&gt;
* We need people to go out and take good pictures of all the buildings at their local airports, build models, and create textures (that could be different people for each task).&lt;br /&gt;
* We need people to start modelling identifiable human-made landmarks like bridges, stadiums, and major buildings. Around the San Francisco Bay area, bridges are especially important. Once you have identified some buildings or objects you would like to have (Aircraft carriers, fuel bowsers, cars, towers, ...) you will need to check out the tools for creating and placing these objects. &lt;br /&gt;
&lt;br /&gt;
It would be helpful if people would model the area they are interested in. Generally contributions are going to be from FlightGear users who find scenery lacking in some area and choose to improve it. You are encouraged to research your own area for airport, navaid and scenery information, to contribute the data or dive right in to airport and scenery design.&lt;br /&gt;
&lt;br /&gt;
=== Making airports ===&lt;br /&gt;
Sometimes you'd like to populate your favourite airport with objects, but you find it has a wrong layout or that it doesn't exist at all! So, you'll want to [[Howto:Make an airport|make or improve that layout]], which can be done with [[WED]]. Remember that we're maintaining an open (GPL) airport database in common with X-Plane simulator.&lt;br /&gt;
&lt;br /&gt;
Other than just fix the look, you might want to add interactive details like [[AI Traffic]] and maybe update navaids and comm frequencies. We need people to go over paper lists and airport diagrams for countries that don't publish air navigation data free online (i.e. almost everyone but the U.S.) and fill in the blanks in our navaid and airport databases (''note: especially for the last part, see the website of the current maintainer: [https://gateway.x-plane.com/ X-Plane Scenery Gateway]''.)&lt;br /&gt;
&lt;br /&gt;
To be sure the airport you're interested in is not already being worked on, check the [[Airports under construction]] article. Also, note that since we switched to a newer format for the airport database, there are many airports that need to be converted from the older (810) format to the newer (850). All the info is in [[Howto:Make an airport]].&lt;br /&gt;
&lt;br /&gt;
=== Contributing to the scenery terrain ===&lt;br /&gt;
We need people to collect geodata to give us more accurate roads, rivers, etc., especially outside the U.S. and Europe. Note that since we're now allowed to use OpenStreetMap data for this, you might consider contributing to that project too. With time, more and more features will be imported from OSM, beginning with roads and rails, and going on with power lines and antennas and whatnot.&lt;br /&gt;
&lt;br /&gt;
The first step into this is learning how to [[Using TerraGear|use TerraGear]]. Remember that all the data you plan to use must be GPL compatible. You might also consider editing some of that source data and contribute it to the Scenery Project that would make good use of it!&lt;br /&gt;
&lt;br /&gt;
=== Core development ===&lt;br /&gt;
{{Main article|Howto:Start core development}}&lt;br /&gt;
If you actually happen to be a C++ programmer and know Git, consider contributing to [[Howto:Start core development|core development]].&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
=== Submitting bugs to the Bug Tracker ===&lt;br /&gt;
Bugs can be reported to {{tickets|the issue tracker}} (select the respective project, or &amp;lt;code&amp;gt;flightgear&amp;lt;/code&amp;gt; if unsure). Reporting bugs accurately helps make bug fixing significantly easier for the developers. Another thing that is very helpful, is reviewing posted bug reports and see if you can reproduce/confirm them on your system.&lt;br /&gt;
&lt;br /&gt;
=== Artwork Creators/Contributors ===&lt;br /&gt;
FlightGear itself would not be possible without the contribution of various types of artwork:&lt;br /&gt;
* Aircraft developers need photographs, images and sounds to realistically model a particular aircraft.&lt;br /&gt;
* The splash screen displayed when loading the simulator can be personalized, and you can [[Howto: Create custom splash screens|create one for your favourite aircraft]].&lt;br /&gt;
* Sound recordings of aircraft are also very valuable - particularly engine sounds for unusual aircraft.&lt;br /&gt;
&lt;br /&gt;
In general, you can find requests and post your offers of this kind in the Developers forum, but you can also browse [[:Category:Aircraft by status|existing aircraft projects]] and see if there's anything you'd like to improve.&lt;br /&gt;
&lt;br /&gt;
=== Pre-Release Testers ===&lt;br /&gt;
Prior to a release, release candidates are provided to the community. By directly providing feedback about your experiences with FlightGear's development code, you will become a crucial part of the development process and you will basically serve as quality control for FlightGear, your experiences will determine whether FlightGear's development code is ready for a next official release or not. See the [[Release plan]] to find out when release candidates will be distributed.&lt;br /&gt;
&lt;br /&gt;
Note: If you are interested in actually doing development for FlightGear, make sure to check out the [[Portal:Developer|Developer section]].&lt;br /&gt;
&lt;br /&gt;
=== Hosting a multiplayer server ===&lt;br /&gt;
If you have access to an Unix based server, another good opportunity for contributing would be to set up a multiplayer server for use with FlightGear, for details please check out [[Howto: Set up a multiplayer server]].&lt;br /&gt;
&lt;br /&gt;
=== Tell us if FlightGear works with your hardware ===&lt;br /&gt;
You can help fellow FlightGear users by telling us if FlightGear works with your hardware. Please see [[FlightGear Hardware Recommendations]], [[Problematic Video Cards]] and [[Notebooks known to run FlightGear]].&lt;br /&gt;
&lt;br /&gt;
=== Participate in the FlightGear Forums ===&lt;br /&gt;
If you haven't done so already, please consider registering at the {{forum link|text=FlightGear forum}}, this is a very simple thing to do, but it makes it very easy to obtain and provide help and other support within the FlightGear community.&lt;br /&gt;
&lt;br /&gt;
Taking extra care in your posting to avoid requiring the attention of the moderators is in some ways also a contribution. Doing so helps self-police the forums so that the moderators can spend their time doing constructive development.&lt;br /&gt;
&lt;br /&gt;
=== Check out the FlightGear Chat channel ===&lt;br /&gt;
{{Main article|FlightGear IRC channel}}&lt;br /&gt;
To talk to fellow FlightGear users in realtime, you may want to check out the IRC chat channel.&lt;br /&gt;
This is also an excellent way for getting and providing community help, or for getting the latest news about FlightGear.&lt;br /&gt;
&lt;br /&gt;
=== Tell us about your own ideas and feature requests for improving FlightGear ===&lt;br /&gt;
If you think you have a good idea or feature request for improving FlightGear, the FlightGear forums and the IRC channel are also an excellent way for getting feedback.&lt;br /&gt;
&lt;br /&gt;
Another new way for posting feature requests and making suggestions is provided at http://flightgear-bugs.googlecode.com&lt;br /&gt;
&lt;br /&gt;
=== Help us write the FlightGear Newsletter ===&lt;br /&gt;
The FlightGear newsletter is a community driven newsletter that is created and edited using the wiki. All FlightGear users are invited to contribute to the newsletter. The only thing that is required is a wiki account, which is free and easy to register.&lt;br /&gt;
&lt;br /&gt;
Please feel free to add news about your own FlightGear related projects, or projects started by others to the newsletter.&lt;br /&gt;
&lt;br /&gt;
You can find the draft of next month's newsletter at: [[Next newsletter]]&lt;br /&gt;
&lt;br /&gt;
Just tracking the forums, mailing lists or the IRC channel should provide you with plenty of opportunities for things that could be added to the newsletter. One simple thing for getting started - even without writing anything - is uploading screen shots showing recent FlightGear developments for use in the FlightGear newsletter.&lt;br /&gt;
&lt;br /&gt;
=== Reviews ===&lt;br /&gt;
Another thing that can be easily done is reviewing FlightGear (or just certain parts of it, like for example scenery and/or aircraft) and submit your reviews to some of the flight simulation portals. Of course, you can also directly write your reviews using the FlightGear wiki, see: [[FlightGear Reviews]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Contribution requests]]&lt;br /&gt;
[[Category:Community]]&lt;br /&gt;
&lt;br /&gt;
[[es:Tener a bien]]&lt;br /&gt;
[[fr:Volontaires]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Mailing_lists&amp;diff=144737</id>
		<title>Mailing lists</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Mailing_lists&amp;diff=144737"/>
		<updated>2026-05-28T05:07:18Z</updated>

		<summary type="html">&lt;p&gt;Servo: issue tracker note&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|Bugs should preferably be {{create ticket|reported to the issue tracker}} instead of posting them to a mailing list.&lt;br /&gt;
You may have to register a GitLab account first.}}&lt;br /&gt;
'''Mailing lists''' are used for some of the FlightGear community's communications, in particular among the core developers who are working on the flight simulator itself.&lt;br /&gt;
&lt;br /&gt;
Some questions are better asked on the mailing list instead of the forum, especially those related to core development or project infrastructure, but you do not strictly have to be a core developer to subscribe and/or post to the mailing lists.&lt;br /&gt;
&lt;br /&gt;
== Overview of mailing lists==&lt;br /&gt;
&lt;br /&gt;
===Discussion lists===&lt;br /&gt;
Discussion lists are used by the FlightGear contributor community to discuss work on the FlightGear project. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!List&lt;br /&gt;
!Status&lt;br /&gt;
!Contents&lt;br /&gt;
&amp;lt;!-- ! Status --&amp;gt;&lt;br /&gt;
!Archive&lt;br /&gt;
&lt;br /&gt;
!Subscribe&lt;br /&gt;
!E-mail address&lt;br /&gt;
!Remarks&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #33cf83; color: black; vertical-align: middle; text-align: center;&amp;quot; | Active&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ffe344; color: black; vertical-align: middle; text-align: center;&amp;quot; | Quiet&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ff6e67; color: black; vertical-align: middle; text-align: center;&amp;quot; | Inactive&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: green; color: black; vertical-align: middle;&amp;quot; |flightgear-devel&lt;br /&gt;
|Active&lt;br /&gt;
|FlightGear developer discussions&lt;br /&gt;
|{{Mailing list archive|flightgear-devel}}&lt;br /&gt;
|{{Mailing list subscription link|flightgear-devel}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-devel}}&lt;br /&gt;
|Most active list (primary)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ff6e67; color: black; vertical-align: middle;&amp;quot; |flightgear-announce&lt;br /&gt;
|Inactive &lt;br /&gt;
|FlightGear announcements&lt;br /&gt;
&lt;br /&gt;
|{{Mailing list archive|flightgear-announce}}&lt;br /&gt;
|&lt;br /&gt;
{{Mailing list subscription link|flightgear-announce}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-announce}}&lt;br /&gt;
| Last post 2015&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ff6e67; color: black; vertical-align: middle;&amp;quot; |flightgear-bugs&lt;br /&gt;
|Inactive&lt;br /&gt;
| Bug tracker messages '''(no longer for reporting bugs)''' &lt;br /&gt;
|{{Mailing list archive|flightgear-bugs}}&lt;br /&gt;
|{{Mailing list subscription link|flightgear-bugs}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-bugs}}&lt;br /&gt;
|'''Deprecated in favor of the {{Create ticket|issue tracker}}.'''&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ff6e67; color: black; vertical-align: middle;&amp;quot; | flightgear-flightmodel&lt;br /&gt;
|Inactive&lt;br /&gt;
|Flight model discussions&lt;br /&gt;
|{{Mailing list archive|flightgear-flightmodel}}&lt;br /&gt;
|{{Mailing list subscription link|flightgear-flightmodel}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-flightmodel}}&lt;br /&gt;
| Last post 2017.&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ff6e67; color: black; vertical-align: middle;&amp;quot; |flightgear-newsletter&lt;br /&gt;
|Inactive&lt;br /&gt;
|[[FlightGear Newsletter|Newsletter]] announcements and discussions&lt;br /&gt;
|{{Mailing list archive|flightgear-newsletter}}&lt;br /&gt;
|{{Mailing list subscription link|flightgear-newsletter}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-newsletter}}&lt;br /&gt;
|Last post 2012&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ff6e67; color: black; vertical-align: middle;&amp;quot; |flightgear-scenery&lt;br /&gt;
|Inactive &lt;br /&gt;
|Discussion of scenery development: code, tools, GIS data, models, etc.&lt;br /&gt;
|{{Mailing list archive|flightgear-scenery}}&lt;br /&gt;
|{{Mailing list subscription link|flightgear-scenery}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-scenery}}&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ff6e67; color: black; vertical-align: middle;&amp;quot; |flightgear-users&lt;br /&gt;
| Inactive&lt;br /&gt;
| FlightGear user discussions&lt;br /&gt;
|{{Mailing list archive|flightgear-users}}&lt;br /&gt;
|{{Mailing list subscription link|flightgear-users}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-users}}&lt;br /&gt;
|Mostly replaced by [http://forum.flightgear.org the forum]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Automated lists===&lt;br /&gt;
These mailing lists are not used for discussion, but are intended to provide information for developers about the status of builds and commit activity.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!List&lt;br /&gt;
!Status&lt;br /&gt;
!Contents&lt;br /&gt;
&amp;lt;!-- ! Status --&amp;gt;&lt;br /&gt;
!Archive&lt;br /&gt;
&lt;br /&gt;
!Subscribe &lt;br /&gt;
!E-mail address&lt;br /&gt;
!Remarks&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #33cf83; color: black; vertical-align: middle; text-align: center;&amp;quot; | Active&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ffe344; color: black; vertical-align: middle; text-align: center;&amp;quot; | Quiet&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ff6e67; color: black; vertical-align: middle; text-align: center;&amp;quot; | Inactive&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: green; color: black; vertical-align: middle;&amp;quot; |flightgear-builds&lt;br /&gt;
|Active&lt;br /&gt;
|Chatter from the FlightGear build servers&lt;br /&gt;
|{{Mailing list archive|flightgear-builds}}&lt;br /&gt;
|{{Mailing list subscription link|flightgear-builds}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-builds}}&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: green; color: black; vertical-align: middle;&amp;quot; |flightgear-commitlogs&lt;br /&gt;
|Active&lt;br /&gt;
|Source code change commit logs&lt;br /&gt;
| {{Mailing list archive|flightgear-commitlogs}}&lt;br /&gt;
|{{Mailing list subscription link|flightgear-commitlogs}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-commmitlogs}} &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: green; color: black; vertical-align: middle;&amp;quot; |flightgear-fgaddon-commitlogs&lt;br /&gt;
|Active &lt;br /&gt;
|Commit logs for the [[FGAddon]] repository (content developers)&lt;br /&gt;
|{{Mailing list archive|flightgear-fgaddon-commitlogs}}&lt;br /&gt;
|{{Mailing list subscription link|flightgear-fgaddon-commitlogs}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-fgaddon-commitlogs}}&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;1&amp;quot; style=&amp;quot;background: #ff6e67; color: black; vertical-align: middle;&amp;quot; |flightgear-cvslogs&lt;br /&gt;
|Inactive&lt;br /&gt;
|CVS commit logs&lt;br /&gt;
&lt;br /&gt;
|{{Mailing list archive|flightgear-cvslogs}}&lt;br /&gt;
|&lt;br /&gt;
{{Mailing list subscription link|flightgear-cvslogs}}&lt;br /&gt;
|{{Mailing list e-mail address|flightgear-cvslogs}} &lt;br /&gt;
|Apparently dismissed. Last post 2010.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Subscribing to a mailing list==&lt;br /&gt;
To sign up for one of the above mailing lists, follow these steps:  &lt;br /&gt;
# Click a '''Subscribe''' link in the list above to get to the mailing list subscription form.[[File:SourceForge_Mailing_List_Signup_Page.png|none|thumb|795x795px]]&lt;br /&gt;
#Enter your e-mail address in the '''Email''' field.&lt;br /&gt;
#Select your country in the '''Country''' field.&lt;br /&gt;
#Select whether you wish to receive '''SourceForge Newsletters.'''&lt;br /&gt;
#Agree to the '''SourceForge''' '''Privacy Policy.''' &lt;br /&gt;
&amp;lt;ol start=&amp;quot;3&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;li&amp;gt; Click the {{button|Subscribe}} button. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; You will be sent a confirmation e-mail, go to your email client and open the confirmation email (check your Spam folder if necessary). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Click on '''Confirm Your Subscription.''' [[File:Mailing_List_Email_Confirmation.png|none|thumb|813x813px]] &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;This will take you to a SourceForge page confirming that you have successfully joined the mailing list. You can close this tab.[[File:Mailing_list_confirmation_complete.png|none|thumb|815x815px]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Afterwards, you will receive a welcome email from SourceForge summarizing the details of your subscription.{{warning|SourceForge will send you an auto-generated password in cleartext in the welcome email. This has certain security implications, and it is strongly recommended that you should not re-use this password anywhere else.}}&lt;br /&gt;
[[File:Mailing_list_welcome_message.png|frameless|819x819px]]&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Posting to mailing lists==&lt;br /&gt;
To protect list subscribers from spam, you are allowed to post there only after you have subscribed, and to send e-mails from the address you are subscribed with.&amp;lt;ref name=&amp;quot;MLPolicy&amp;quot;&amp;gt;{{cite web&lt;br /&gt;
|url    = https://forum.flightgear.org/viewtopic.php?p=244916&lt;br /&gt;
|title  = &amp;lt;nowiki&amp;gt;Re: Why is my post rejected from devel list?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|author = &amp;lt;nowiki&amp;gt;curt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|date   = May 31st, 2015&lt;br /&gt;
|added  = May 5th, 2016&lt;br /&gt;
|script_version = 0.32&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ref&amp;gt; For the same reason, first posts are subject to moderator approval to catch the cases where people sign up for the sole purpose of posting spam.&amp;lt;ref name=&amp;quot;MLPolicy&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When posting to the lists, discuss your problem laying it out in as much detail you can and show that you are interested in the problem. If you are willing to work on it will also help, even if it is not related to coding itself. If your discussion is more than just asking for features to be added you have a better chance of getting help and you may find people there who can give you pointers on how to approach your problem. Also, be civil - avoid bringing conflicts or noise.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that getting a response from the lists is usually slower than the forum and that responses may take several days. Should it take more than a week, you might want to probe the interest by responding to your own message; sometimes, there might be no reply as there is none.&lt;br /&gt;
&lt;br /&gt;
== Mailing list archives==&lt;br /&gt;
Searchable archives are available at [https://marc.info/?l=flightgear-devel&amp;amp;r=1&amp;amp;w=2 '''marc.info''']. This site allows searching by topic name, searching by content of mailing list posts, browsing each month's topics, and searching by author. It doesn't have a thread view, but it has links to the next and previous posts in each topic thread.&lt;br /&gt;
&lt;br /&gt;
The archives are useful if you want to check or confirm details of some aspect of FG, as there will likely be relevant discussion from when a feature was implemented as well as surrounding design considerations/constraints. They can also be useful for new comers, or to check for information from long ago.&lt;br /&gt;
&lt;br /&gt;
The mailing lists are also searchable from the [https://sourceforge.net/p/flightgear/mailman/search/?q= sourceforge website]. Tips: Try searching the relevant mailing list e.g. 'fg-devel', increasing number of results, and click on the post date column to change sorting order from newest to oldest. Each results contains a view entire thread link down the bottom, but as of writing this (April 2021), the thread view is a broken or inconsistent.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
*[http://www.flightgear.org/mail.html FlightGear mailing list details]&lt;br /&gt;
*[[sourceforge:p/flightgear/mailman/|List of all project mailing lists on SourceForge]]&lt;br /&gt;
&lt;br /&gt;
{{appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
[[Category:Community]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144736</id>
		<title>Howto:Start core development</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Start_core_development&amp;diff=144736"/>
		<updated>2026-05-28T05:06:45Z</updated>

		<summary type="html">&lt;p&gt;Servo: replaced with https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{note|You'll need to familiarize yourself with setting up a development environment and building FlightGear in order to contribute code. See&lt;br /&gt;
[https://docs.flightgear.org/contributors-guide/guidelines/building.html Developing on the codebase] if you do not already&lt;br /&gt;
have a working setup. Some understanding of ''Git'' will also be&lt;br /&gt;
necessary; this free, online [https://git-scm.com/book/en/v2 Git book] is quite useful.}}&lt;br /&gt;
&lt;br /&gt;
The most efficient way to contribute changes to the FlightGear code base is to&lt;br /&gt;
file a merge request (this doesn't apply to [[aircraft]] or [[addon|add-ons]], which are&lt;br /&gt;
managed differently). We'll first give an overview of the process including&lt;br /&gt;
its main prerequisites, then explain each step in more detail.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
The basic workflow for first-time contributors to a FlightGear Git repository&lt;br /&gt;
is:&lt;br /&gt;
&lt;br /&gt;
#. '''Fork the repository.'''&lt;br /&gt;
   Fork the relevant FlightGear repository into your GitLab account. You will&lt;br /&gt;
   need to know which repository contains the code you are trying to change.&lt;br /&gt;
   Familiarizing yourself with the code base and the purpose of each&lt;br /&gt;
   repository is strongly recommended.&lt;br /&gt;
&lt;br /&gt;
#. '''Set up a local clone.'''&lt;br /&gt;
   Prepare a clone of the repository on your hard disk that is convenient for&lt;br /&gt;
   getting updates from the upstream repository and pushing changes to your&lt;br /&gt;
   fork. You'll also use this clone to perform test builds.&lt;br /&gt;
&lt;br /&gt;
#. '''Build the project.'''&lt;br /&gt;
   If you haven't already done so, this will be the time to set up your&lt;br /&gt;
   development environment so that you can build FlightGear.&lt;br /&gt;
&lt;br /&gt;
#. '''Create a new branch.'''&lt;br /&gt;
   Create a branch on your clone to isolate your changes. Use a clear and&lt;br /&gt;
   descriptive name for your branch (e.g. &amp;lt;code&amp;gt;fix-menubar-typo&amp;lt;/code&amp;gt; or&lt;br /&gt;
   &amp;lt;code&amp;gt;add-new-joystick-configs&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
#. '''Make changes.'''&lt;br /&gt;
   Make the changes on your branch in small, focused commits. Each commit&lt;br /&gt;
   should be self-contained and represent one logical change.&lt;br /&gt;
&lt;br /&gt;
#. '''Test and double-check.'''&lt;br /&gt;
   Before you submit your changes to the FlightGear team for review,&lt;br /&gt;
   double-check your work. Ensure that your code builds and that tests pass.&lt;br /&gt;
&lt;br /&gt;
#. '''Rebase and push.'''&lt;br /&gt;
   Check if the upstream repository was updated in the meantime. If so, rebase&lt;br /&gt;
   your work on its latest state and perform a final test run to make sure&lt;br /&gt;
   everything still works fine.&lt;br /&gt;
&lt;br /&gt;
#. '''Submit a merge request.'''&lt;br /&gt;
   Open a merge request (MR) to propose your changes for review. Be sure to&lt;br /&gt;
   use the ''Merge Request Template'' to provide necessary context for&lt;br /&gt;
   reviewers. Feel free to ask on the developer mailing list if you're unsure&lt;br /&gt;
   whom to add as a reviewer.&lt;br /&gt;
&lt;br /&gt;
#. '''Code review.'''&lt;br /&gt;
   Once you have created a merge request, other developers will review your&lt;br /&gt;
   work, give feedback, and sometimes request changes be made. This is a&lt;br /&gt;
   crucial part of the development process, as it helps reduce bugs and&lt;br /&gt;
   improves code quality.&lt;br /&gt;
&lt;br /&gt;
#. '''Clean up.'''&lt;br /&gt;
   If your merge request was applied, pull your changes from the upstream&lt;br /&gt;
   branch and delete the local branch you created for the merge request.&lt;br /&gt;
&lt;br /&gt;
In order to present these steps in more detail, we'll now assume that you&lt;br /&gt;
intend to make your first contribution to the [https://gitlab.com/flightgear/simgear SimGear repository] (and thus,&lt;br /&gt;
that you haven't already forked it). Except for the target branch name which&lt;br /&gt;
may differ, the process would be the same for any Git repository of the&lt;br /&gt;
FlightGear project.&lt;br /&gt;
&lt;br /&gt;
== Fork the Repository ==&lt;br /&gt;
&lt;br /&gt;
For what follows, you'll need to create a [https://gitlab.com/ GitLab] account if you don't already&lt;br /&gt;
have one. Once you are logged into your account, go to the repository home&lt;br /&gt;
page ([https://gitlab.com/flightgear/simgear here] in our example) and click on the&lt;br /&gt;
&amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork&amp;lt;/span&amp;gt; button as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;forking-the-upstream-repo&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;; after&lt;br /&gt;
filling some information, this will lead to the creation of a copy of the&lt;br /&gt;
upstream repository in your own GitLab namespace under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:01_forking.png|thumb|alt=how to find the Fork button on the main page of the repository|Forking the upstream repository]]&lt;br /&gt;
&lt;br /&gt;
Once you've clicked on the button, a new page is loaded as shown in&lt;br /&gt;
&amp;lt;span id=&amp;quot;entering-fork-metadata&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;. The ''Project name'' will be prominent but it's&lt;br /&gt;
only a label—choose it as you wish (“My SimGear fork” in the example). For the&lt;br /&gt;
''Project URL'', you'll want to select your GitLab username after the initial&lt;br /&gt;
portion &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:02_project_name_URL_slug.png|thumb|alt=dialog that allows one to enter the project name, URL and slug for a fork|Entering the project name, URL and slug for your fork]]&lt;br /&gt;
&lt;br /&gt;
The ''Project slug'' is the final part of the base URL for the fork you're about&lt;br /&gt;
to create; let's choose &amp;lt;code&amp;gt;flightgear-simgear&amp;lt;/code&amp;gt; so that all your forks of&lt;br /&gt;
repositories of the FlightGear project are named &amp;lt;code&amp;gt;flightgear-something&amp;lt;/code&amp;gt;.&lt;br /&gt;
This way, they will be easy to distinguish from non-FlightGear repositories&lt;br /&gt;
you might want to publish under &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Beware&lt;br /&gt;
that if you modify the ''Project name'', the GitLab user interface automatically&lt;br /&gt;
modifies the ''Project slug''; so, better fill them in this order: ''Project name''&lt;br /&gt;
then ''Project slug''.&lt;br /&gt;
&lt;br /&gt;
There are a few fields left to enter. If you choose to include only the&lt;br /&gt;
default branch, you'll save a little amount of space but might have to fetch&lt;br /&gt;
other upstream branches later. Give your fork public visiblity so that reviews&lt;br /&gt;
can take place. When ready, click on the &amp;lt;span class=&amp;quot;guilabel&amp;quot;&amp;gt;Fork project&amp;lt;/span&amp;gt; button to&lt;br /&gt;
actually create your fork of the upstream repository.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;section-Set-up-a-local-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Set Up a Local Clone ==&lt;br /&gt;
&lt;br /&gt;
Since we want to pull updates from the upstream repository, it is convenient&lt;br /&gt;
to clone it to your hard disk and modify the clone so that pushes go by&lt;br /&gt;
default to your fork (which is online under&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://gitlab.com/YourUserName/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;). Cloning the upstream SimGear repository&lt;br /&gt;
can be done with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://gitlab.com/flightgear/simgear.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tip|If you use &amp;lt;code&amp;gt;download_and_compile.sh&amp;lt;/code&amp;gt; and it manages the repository you&lt;br /&gt;
want to contribute to (this is obviously the case for SimGear), there is&lt;br /&gt;
no need to create a new clone: you can simply use the repository clone it&lt;br /&gt;
created on your disk.}}&lt;br /&gt;
&lt;br /&gt;
Now, let's add a Git remote that points to your fork of the upstream&lt;br /&gt;
repository. We configure this remote so that pushing to it uses &amp;lt;abbr title=&amp;quot;Secure Shell&amp;quot;&amp;gt;SSH&amp;lt;/abbr&amp;gt; authentication. We also configure your repository clone so&lt;br /&gt;
that pushes go to your fork by default.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git remote add flo https://gitlab.com/frougon/flightgear-simgear.git&lt;br /&gt;
git remote set-url --push flo git@gitlab.com:frougon/flightgear-simgear.git&lt;br /&gt;
git config remote.pushDefault flo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above commands, replace &amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; (name of the created remote) with an&lt;br /&gt;
appropriate name of your choice; also replace &amp;lt;code&amp;gt;frougon&amp;lt;/code&amp;gt; with your GitLab&lt;br /&gt;
username.&lt;br /&gt;
&lt;br /&gt;
== Build the Project ==&lt;br /&gt;
&lt;br /&gt;
Make sure you can build FlightGear using the repository clone set up in the&lt;br /&gt;
previous step and that the resulting executables run normally. This way,&lt;br /&gt;
you'll be able to properly test any changes you later make in this clone.&lt;br /&gt;
&lt;br /&gt;
{{note|The following steps will have to be repeated for each&lt;br /&gt;
“self-contained changeset” that you intend to contribute.}}&lt;br /&gt;
&lt;br /&gt;
== Create a New Branch ==&lt;br /&gt;
&lt;br /&gt;
Create a branch based on &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; that tracks &amp;lt;code&amp;gt;origin/next&amp;lt;/code&amp;gt; and make&lt;br /&gt;
sure it is up-to-date. Instead of &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, choose a name that&lt;br /&gt;
makes it clear what the changes in the created branch are supposed to do.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout -b new-branch-name origin/next&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|Here, &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; is a remote that points to the upstream repository&lt;br /&gt;
you cloned from, and &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; is the name of the development branch&lt;br /&gt;
in the [https://gitlab.com/flightgear/simgear SimGear repository] (this is also the case for [https://gitlab.com/flightgear/flightgear FlightGear] and [https://gitlab.com/flightgear/fgdata FGData]). If&lt;br /&gt;
you were to contribute to a different repository such as [https://gitlab.com/flightgear/documentation FlightGear documentation], the branch&lt;br /&gt;
to base your work on might have a different name (e.g., &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
== Make Changes ==&lt;br /&gt;
&lt;br /&gt;
Commit the desired changes to the branch you created in the previous step. If&lt;br /&gt;
you need help with &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;, this online [https://git-scm.com/book/en/v2 book] is a great resource.&lt;br /&gt;
&lt;br /&gt;
Each commit message should start with a single, not too long summary line (no&lt;br /&gt;
more than 72—80 characters if possible), then a blank line, then normal&lt;br /&gt;
explanations. Example commit message:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HID: allow sending output reports from Nasal&lt;br /&gt;
&lt;br /&gt;
- make watched properties only react on a value change&lt;br /&gt;
- refactor the larger usage enums to their own file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like here, it is useful when the beginning of the first line is short and&lt;br /&gt;
makes it clear to readers which part of the code (subsystem, class, etc.) is&lt;br /&gt;
affected by the changes.&lt;br /&gt;
&lt;br /&gt;
== Test and Double-check ==&lt;br /&gt;
&lt;br /&gt;
Rebuild FlightGear with your changes, carefully test. Build the FlightGear&lt;br /&gt;
test suite and verify that the tests still pass. This can be done by running&lt;br /&gt;
&amp;lt;code&amp;gt;make test_suite&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ninja test_suite&amp;lt;/code&amp;gt; from the FlightGear build directory&lt;br /&gt;
(not the source repository!).&lt;br /&gt;
&lt;br /&gt;
Use commands like:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; to check the state of your working directory and repository;&lt;br /&gt;
* &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt; to proofread your commit diffs and messages;&lt;br /&gt;
* &amp;lt;code&amp;gt;git commit --amend&amp;lt;/code&amp;gt; to modify the most recent commit on the branch;&lt;br /&gt;
* &amp;lt;code&amp;gt;git rebase -i &amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt; to modify commits located further&lt;br /&gt;
  in the ancestry graph (namely, descendants of commit &amp;lt;code&amp;gt;&amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt;; see the&lt;br /&gt;
  &amp;lt;code&amp;gt;git rebase&amp;lt;/code&amp;gt; manual page for explanations).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; program is not essential but can be nice for examining&lt;br /&gt;
commits and visualizing the commit graph. If &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; appears to see&lt;br /&gt;
local changes that really aren't there, run &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; then rerun&lt;br /&gt;
&amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; programs are useful to run code quality&lt;br /&gt;
checks and apply the project formatting rules. Some of the configured&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks will for instance check for common mistakes&lt;br /&gt;
including typos, mixed whitespace or line endings, and so on. If you've&lt;br /&gt;
[https://pre-commit.com/#3-install-the-git-hook-scripts installed] the&lt;br /&gt;
&amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; hooks in your repository clone, &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt;&lt;br /&gt;
will be automatically run every time you commit.&lt;br /&gt;
&lt;br /&gt;
{{note|In most cases, the GitLab CI (Continuous Integration) runs&lt;br /&gt;
the &amp;lt;code&amp;gt;pre-commit&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;clang-format&amp;lt;/code&amp;gt; checks as part&lt;br /&gt;
of the automatic verifications that need to pass, before a merge request can be applied.}}&lt;br /&gt;
&lt;br /&gt;
== Rebase and Push ==&lt;br /&gt;
&lt;br /&gt;
If the upstream branch you started from has changed in the meantime, your work&lt;br /&gt;
needs to be rebased on top of its latest state. This can be done with the&lt;br /&gt;
following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case someone was working on the same files as you, this may trigger&lt;br /&gt;
conflicts (so it's a good idea to first announce what you're going to work on&lt;br /&gt;
in order to minimize friction and benefit from the insight of experienced&lt;br /&gt;
people). Conflicts don't happen very often and it's not the end of the world&lt;br /&gt;
when they do. Again, this [https://git-scm.com/book/en/v2 Git book] is a very useful resource in such cases.&lt;br /&gt;
&lt;br /&gt;
If the rebasing did grab upstream changes, perform a final build-and-test run&lt;br /&gt;
to be sure everything works fine. Finally, push the branch to your fork:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git push&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With no additional arguments, this pushes the current branch to the remote&lt;br /&gt;
specified with the &amp;lt;code&amp;gt;remote.pushDefault&amp;lt;/code&amp;gt; setting, i.e. to your clone if you&lt;br /&gt;
followed the [[#section-Set-up-a-local-clone|above]] instructions. Once&lt;br /&gt;
the push is successful, &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will show a URL; following it will start the next step.&lt;br /&gt;
&lt;br /&gt;
== Submit a Merge Request ==&lt;br /&gt;
&lt;br /&gt;
The web page opened from the URL output by &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; when you pushed to&lt;br /&gt;
your fork allows to create a merge request from the branch that was pushed.&lt;br /&gt;
From this page, select the proper target branch: for development code in&lt;br /&gt;
[https://gitlab.com/flightgear/simgear SimGear], that would be &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;. Select yourself as&lt;br /&gt;
an ''assignee'' (meaning that ''you'' are going to shape the merge request into&lt;br /&gt;
its final form). Select one or more reviewers to look at it—you can ask on the&lt;br /&gt;
[https://sourceforge.net/p/flightgear/mailman/flightgear-devel/ flightgear-devel mailing-list] if unsure, or just leave the field as&lt;br /&gt;
''Unassigned''. Don't worry too much about the milestone ''(a priori,'' &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt;&lt;br /&gt;
should do unless the merge request is specifically a fix for a release&lt;br /&gt;
branch). Select applicable labels, etc.&lt;br /&gt;
&lt;br /&gt;
Regarding the ''Delete source branch when merge request is accepted'' option, we&lt;br /&gt;
advise you to make sure it is enabled, otherwise your fork will soon have tons&lt;br /&gt;
of branches. What this option does is the following: when the branch from your&lt;br /&gt;
merge request is merged into the upstream branch, GitLab will automatically&lt;br /&gt;
delete the merge request branch (that you pushed) from your fork. This happens&lt;br /&gt;
online at GitLab, not in your local clone. Thus, even after this&lt;br /&gt;
occurs, the branch will still be present locally in your clone, until you&lt;br /&gt;
delete it yourself (cf. [[#local-branch-removal|below]]).&lt;br /&gt;
&lt;br /&gt;
Finally, the ''Squash commits when merge request is accepted'' option can be&lt;br /&gt;
used in case you pushed several commits but would rather have them coalesced&lt;br /&gt;
into a single one when the merge request is applied. This is something that&lt;br /&gt;
can be done locally using &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; before pushing (in particular, with&lt;br /&gt;
&amp;lt;code&amp;gt;git rebase -i&amp;lt;/code&amp;gt;), however the option is still useful in case commits are added&lt;br /&gt;
to the merge request after the initial push, be it by you or by reviewers.&lt;br /&gt;
&lt;br /&gt;
== Code Review ==&lt;br /&gt;
&lt;br /&gt;
After a few minutes, hours or days, you'll receive feedback from the&lt;br /&gt;
FlightGear developers about your merge request. Reviewing merge requests&lt;br /&gt;
requires expertise and takes some time, so please carefully read the remarks&lt;br /&gt;
and suggestions, follow up on the questions and requests for changes.&lt;br /&gt;
&lt;br /&gt;
== Clean Up ==&lt;br /&gt;
&lt;br /&gt;
Once the branch is merged, update the local branch of your clone that tracks&lt;br /&gt;
the upstream branch your merge request went to (this is the &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; branch in&lt;br /&gt;
our SimGear example):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git checkout next&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Normally, the &amp;lt;code&amp;gt;--rebase&amp;lt;/code&amp;gt; option shouldn't be necessary here as you&lt;br /&gt;
shouldn't have any local commits on top of the upstream ones in this branch,&lt;br /&gt;
however it doesn't hurt and can make things easier if you've been forgetful.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;local-branch-removal&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can now delete the local branch you created earlier to avoid cluttering&lt;br /&gt;
your local clone with legacy, unneeded branches:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git branch -d new-branch-name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case this branch hasn't been merged ''exactly as is'' into the upstream&lt;br /&gt;
branch (same commit contents and metadata), &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; will warn and&lt;br /&gt;
refuse to delete the branch unless you insist using &amp;lt;code&amp;gt;-D&amp;lt;/code&amp;gt;. If this happens,&lt;br /&gt;
you'll have to evaluate yourself (by using &amp;lt;code&amp;gt;git log -p&amp;lt;/code&amp;gt;, by comparing&lt;br /&gt;
files...) if deleting your local branch &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; is really the&lt;br /&gt;
right thing to do. In the likely case that what was merged is a strict&lt;br /&gt;
improvement over what you have in &amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt;, then deleting is the&lt;br /&gt;
way to go.&lt;br /&gt;
&lt;br /&gt;
{{tip|If you really, really messed up and deleted the branch before&lt;br /&gt;
realizing that it was a mistake, &amp;lt;code&amp;gt;git reflog&amp;lt;/code&amp;gt; is likely to save you:&lt;br /&gt;
among other things, it shows the commit hashes corresponding to previous&lt;br /&gt;
positions of the tips of various branches. As long as no garbage collection occurred in the meantime (&amp;lt;code&amp;gt;git gc&amp;lt;/code&amp;gt;), the commit&lt;br /&gt;
hashes are all you need to restore “lost commits”: simply create a&lt;br /&gt;
branch or tag from the desired commit (before doing do, you may want&lt;br /&gt;
to use &amp;lt;code&amp;gt;git show &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to see the commit for a given hash, or &amp;lt;code&amp;gt;git log &amp;amp;lt;hash&amp;amp;gt;&amp;lt;/code&amp;gt; to examine its ancestry).}}&lt;br /&gt;
&lt;br /&gt;
From time to time, you may also want to run &amp;lt;code&amp;gt;git fetch -p flo&amp;lt;/code&amp;gt; (replace&lt;br /&gt;
&amp;lt;code&amp;gt;flo&amp;lt;/code&amp;gt; with the name of a remote that points to your fork,&lt;br /&gt;
cf. [[#section-Set-up-a-local-clone]]). This removes the &amp;lt;code&amp;gt;flo/...&amp;lt;/code&amp;gt;&lt;br /&gt;
branches from your local clone that have been deleted from your fork at GitLab&lt;br /&gt;
due to the ''Delete source branch when merge request is accepted'' option on the&lt;br /&gt;
merge request page (note that for instance, &amp;lt;code&amp;gt;flo/new-branch-name&amp;lt;/code&amp;gt; and&lt;br /&gt;
&amp;lt;code&amp;gt;new-branch-name&amp;lt;/code&amp;gt; are different branches in your clone; they'll both clutter&lt;br /&gt;
the display when using &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;gitk&amp;lt;/code&amp;gt; until you delete them).&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [https://docs.flightgear.org/contributors-guide/core-developers-guide/git-workflow.html How to Contribute Code]&lt;br /&gt;
* [https://git-scm.com/book/en/v2 The Git book]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;br /&gt;
[[Category:Core developer documentation]]&lt;br /&gt;
[[ru:Howto:Приступая к разработке ядра]]&lt;br /&gt;
[[Category:Hackathon Materials]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Optimizing_FlightGear_for_mobile_devices&amp;diff=144594</id>
		<title>Howto:Optimizing FlightGear for mobile devices</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Optimizing_FlightGear_for_mobile_devices&amp;diff=144594"/>
		<updated>2026-05-24T03:21:07Z</updated>

		<summary type="html">&lt;p&gt;Servo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{out of date}}&lt;br /&gt;
{{Portability Navbar}}&lt;br /&gt;
== Background ==&lt;br /&gt;
Also see: [[Flightgear On Android]].&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |There are a few users wanting to run FlightGear on mobile devices or gaming consoles - others want to use it for UAV stuff, and even others want to run it in &amp;quot;headless&amp;quot; mode, without displaying any graphics at all (certainly not Rembrandt/ALS or other effect/shader stuff) - all of those are valid use-cases, as is running FlightGear on an outdated OS, including even on 10-year old hardware with a nvidia 7600  GPU - ideally, FlightGear should &amp;quot;just work&amp;quot;, using what's available - analogous to installing a modern Linux 3.0 distro on a 586 PC with 133 mhz and 32 mb of RAM - give it a try, it actually works reasonably well&lt;br /&gt;
  |{{cite web |url={{forum url|p=237545}}&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: Cloning fgdata with GIT submodules&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;Wed Apr 01&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
Increasingly, people want to try running FlightGear on mobile devices, like the Apple IPhone/IPad, Android phones or Nokia Maemo devices. FlightGear isn't currently optimized for such devices, so that it would require a fair amount of customizations to make this happen, not just optimization-wise, but also related to the user-interface, i.e. lack of keyboard/mouse/yoke and screen space.&lt;br /&gt;
&lt;br /&gt;
== Status (09/2013) ==&lt;br /&gt;
{{cquote|&amp;lt;nowiki&amp;gt;far more useful would be to get ARM &lt;br /&gt;
working so we can run parts of the stack on Pis, Pandaboards and so on. This  would be materially useful for various add-on functions, especially the canvas &lt;br /&gt;
and fgcom. &lt;br /&gt;
&lt;br /&gt;
(I spend an increasing amount of my work time on OpenGL on ARM platforms, they have plenty of power to run graphics, depending on which GPU is on the SoC)&amp;lt;/nowiki&amp;gt;&amp;lt;ref&amp;gt;{{cite web |url=http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg40713.html|title=&amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] portability of simgear&amp;lt;/nowiki&amp;gt;|author=&amp;lt;nowiki&amp;gt;James Turner&amp;lt;/nowiki&amp;gt;|date=&amp;lt;nowiki&amp;gt;Sun, 08 Sep 2013 22:30:54 -0700&amp;lt;/nowiki&amp;gt;}}&amp;lt;/ref&amp;gt;|&amp;lt;nowiki&amp;gt;James Turner&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{cquote|&amp;lt;nowiki&amp;gt;I'm currently busy on other areas but it will be either Raspbian or a custom buildroot Linux deployment. Although, since my current buildroot uses ulibc, that would mean discovering all the places in SG+FG where we've assumed glibc. Note we can't run FG itself without major work, since these platforms only support GLES1 or GLES2, and there's many legacy areas of the renderer which would not work.&lt;br /&gt;
&lt;br /&gt;
(BTW I believe OSG compiles out of the box on ARM targets now, Android at least, but I didn't try it myself yet)&amp;lt;/nowiki&amp;gt;&amp;lt;ref&amp;gt;{{cite web |url=http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg40738.html|title=&amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] portability of simgear&amp;lt;/nowiki&amp;gt;|author=&amp;lt;nowiki&amp;gt;James Turner&amp;lt;/nowiki&amp;gt;|date=&amp;lt;nowiki&amp;gt;Thu, 12 Sep 2013 23:14:47 -0700&amp;lt;/nowiki&amp;gt;}}&amp;lt;/ref&amp;gt;|&amp;lt;nowiki&amp;gt;James Turner&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
This an interesting concept. Such a version would have the potential to greatly expand the ability to use FG, and increase public awareness of the project. However, it would would require a well coordinated project with people who really understand both flightgear and mobile devices.&lt;br /&gt;
&lt;br /&gt;
Thats a good point about the publicity that an app would give FG, however about the graphics, I don't know what specs an iPhone has butit is obviously very limited, so maybe the graphics can't be improved, or any better than the XPlane app.&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
Basically, it doesn't really matter if you want to run FG on an IPhone, Android device or on Maemo - there are certain shared challenges and issues for each target. In fact, FlightGear isn't currently too well suited for less powerful systems, like netbooks or old computers.&lt;br /&gt;
&lt;br /&gt;
Currently flightgear development results in software oriented towards high performance desktops/graphics cards and increased simulation accuracy. Given the limited resources of the project, I think the bigger issue would be finding people interesting in working on such a 'mobile flightgear', or iphone specific one.&lt;br /&gt;
&lt;br /&gt;
I would be interested in running such a mobile version on my laptop as well, as the regular versions system requirements leave me unable to run it. There is a very large gap in hardware between fg 1 and the iphone though, and I think even very old late 90s versions would be too high. &lt;br /&gt;
&lt;br /&gt;
They key to orchestrating a version of FG for mobile devices would be finding a technically skilled person with a interest in the concept, who could evaluate how a mobile versions could be written and what direction to take.&lt;br /&gt;
&lt;br /&gt;
Some educated guesses about would be required would be a stripped down FDM, and limited terrain data. With the original FG, the there was NASA laRCsim for the FDM, and OpenGL. However, FG is written in C/C++.&lt;br /&gt;
&lt;br /&gt;
Also, the system requirement of mobile devices are very low compared to PC and also very narrow. Someone with more technical expertise would have to evaluate how feasible a mobile fg would be.&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
* For instance, maybe for the interface have the 3d cockpit buttons be clickable with a touch screen directly.&lt;br /&gt;
* The idea is good - but immensely surrealistic. It's a phone, not a PC. And I don't even want to imagine the interface (keyboard and mouse wise) such a version of FG would need.&lt;br /&gt;
* Wouldn't that be waaaaaaay complicated for the controls though? flaps, magnetos, etc. Unless you're putting out a simplified version.&lt;br /&gt;
* Flight simulators are kinda hard to play with small screens. I currently play Leo's flight simulator on my pocketPC and it works pretty well, some of the controls are a bit hard to manage, but it's still quite the feat they accomplished.&lt;br /&gt;
*  if you can delete the extra goodies such as HIGH detailed models, HIGH detailed textures and things like that it would cut those high specs down i am trying to make an iphone app so im not sure if ill pursue this as my friend is a developer for the iphone and from his personal experience porting 3d into iphone and ipod touch and or ipad is a helluva job and requires ALOT of patience&lt;br /&gt;
&lt;br /&gt;
== Linux-based Targets (Android, Maemo etc) ==&lt;br /&gt;
Now, Android/Maemo support should be easier to implement than Playstation, Nintendo Wii, IPhone and all the other platforms that people keep asking about - simply, because Android/Maemo is basically a downstripped Linux version, so compiling/building FG would certainly be possible. However, running would still be &amp;quot;interesting&amp;quot;, there are MANY potential issues here, even on a &amp;quot;full&amp;quot; Linux-System like Android: http://stackoverflow.com/questions/653453/how-would-i-go-about-making-a-flight-gear-port-for-wiibrew&lt;br /&gt;
&lt;br /&gt;
Cross-compiling FlightGear for Android devices is not that problematic. However, running FlightGear on an Android device, requires a fair share of customizations, i.e. a downstripped base package, and custom aircraft modifications (key bindings, mouse vs. touch screen support etc). Also, many FlightGear defaults would be unnecessarily high and would not work &amp;quot;as is&amp;quot;, these could be reduced (scenery complexity, shaders, rendering settings).&lt;br /&gt;
&lt;br /&gt;
== OpenGL vs. OpenGL ES ==&lt;br /&gt;
If FG could be made to run with opengl ES (supported by OSG), it could potentially run on mobile devices that support it and have high enough resources, so long as the rest of the FDM, terrain, and models would work too. However, how to compile the code would depend on the OS, and it seems the iphone uses a cut-down embedded version of OS X. Regular FG can work with regular OS X, so it seems plausible that it could be compiled for the modified OSX (maybe the iphone sdk would help here).&lt;br /&gt;
&lt;br /&gt;
I have hope this is possible if we can find somone with more expertise in programming. I mean, we know FG can run on OS X, and that it needs Open GL. The iphone can use OpenGl ES and seems to use a cut down OS X. &lt;br /&gt;
If the differences between them can be over come, then it would be a matter of getting FG system requirements low enough. There is enough hard drive space for even the full version, so its a matter of running it (if the software issues can be overcome). 128 mb memory and the processor seems low, but rendering hvga or qvga is less demanding too.&lt;br /&gt;
&lt;br /&gt;
Also see: http://forum.flightgear.org/viewtopic.php?f=71&amp;amp;t=21964&lt;br /&gt;
&lt;br /&gt;
== Embedded Platforms ==&lt;br /&gt;
Anybody interested in this could just as well start out by optimizing FlightGear for smaller devices, like netbooks, or older computers. That work would also be useful for any other/future mobile/embedded target platforms and wouldn't be specific to just a certain target.&lt;br /&gt;
&lt;br /&gt;
Keep in mind that the processing power of modern mobile devices and many other &amp;quot;phones&amp;quot; are more advanced then PCs of some time ago, and the platform is not as different as it once was. The current generation Iphone supports Open GL ES and runs a stripped down/modified OS X- it is foreseeable (or at least plausible) that a future phone with greater hardware specifications could run fg 1.0. &lt;br /&gt;
&lt;br /&gt;
These days, a mobile platform may have multi-core CPUs running at 1-2 ghz with 512+ MB of RAM and hardware-accelerated rendering using OpenGL/OpenGL ES. These platforms are probably at least as powerful as PCs were a decade ago.&lt;br /&gt;
&lt;br /&gt;
Embedded technology has come a lot further. But still, this is a 3D game which even runs with limited fps (80 without 3D clouds) on my rather modern PC (quadcore 2.5GHz, Radeon HD 3650, 4GB ram). The iPhone doesn't nearly have these specifications - especially the video ram is going to be a *big* problem. Maybe in a few years this concept will become interesting, but for now the hardware won't be able to keep up. And like I said earlier, I don't even want to imagine the kind of tiny micro movements I'd need to turn left without crashing. The current generation of phones won't be able to do this - open this topic again in a year or two.&lt;br /&gt;
&lt;br /&gt;
My earlier thoughts about mobile FG were if its hardware demands could be radically reduced by the lower resolution, lower textures, lower vector on terrain, and perhaps simpler FDM it was plausible- in essence taking it back to lower hardware requirements of past versions (less video memory).&lt;br /&gt;
&lt;br /&gt;
== Base Package ==&lt;br /&gt;
&lt;br /&gt;
There are lots of useful customizations that can be done at the base package-level, which won't require any coding experience at all. If you are familiar with developing FlightGear resources (textures, aircraft, scenery) or just editing XML files, you can get involved in helping with this part of the effort.&lt;br /&gt;
&lt;br /&gt;
=== GUI ===&lt;br /&gt;
However, the challenges remain - you could just as well try running FG on a netbook with Intel GMA graphics, while it works, there are certain challenges: my IPhone has about 1/5 of the screen estate that my netbook has ...&lt;br /&gt;
&lt;br /&gt;
Then, a custom FG package for Android could probably just as well need its own custom set of GUI dialogs, because most of the default dialogs are not intended to work on small screens - just try running FG with low settings, i.e. 800x600 or even 640x480, and you'll see for yourself that there are many issues here.&lt;br /&gt;
Many of these issues also affect other devices, like netbooks for example - so it would be great to come up with a solution here.&lt;br /&gt;
&lt;br /&gt;
Until FlightGear 2.8, the GUI is PUI-based and thus cannot be scaled dynamically. However, the new upcoming [[Canvas Widgets]] based GUI will use a vector-driven approach, so that the GUI can be fully scaled as required.&lt;br /&gt;
&lt;br /&gt;
=== Textures ===&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |The original structure/design was in support of video cards that could&amp;lt;br/&amp;gt;&lt;br /&gt;
only do 256x256 max texture sizes (or video cards with limited memory that&amp;lt;br/&amp;gt;&lt;br /&gt;
couldn't handle a complete set of textures with higher resolutions.)  We&amp;lt;br/&amp;gt;&lt;br /&gt;
are easily a decade beyond those days, so if this causes anyone a problem,&amp;lt;br/&amp;gt;&lt;br /&gt;
maybe they are trying to run flightgear on a phone?&lt;br /&gt;
  |{{cite web |url=http://sourceforge.net/p/flightgear/mailman/message/32768042/&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] Textures/ vs Textures.high/ (was Unused and/or sourceless textures‏)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Curtis Olson&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;2014-08-27&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Scenery ===&lt;br /&gt;
To learn more about creating a customized and downstripped materials.xml file, see {{forum link|p=165319}}.&lt;br /&gt;
&lt;br /&gt;
It might even be an option to come up with a custom scenery build for Android devices, specifically aimed at low resource usage - i.e. just the KSFO region, and some basic aircraft, which can be easily adapted for non-PC devices, such as the ufo.&lt;br /&gt;
&lt;br /&gt;
Yes, it's worth pointing out that even the X-Plane &amp;quot;IPhone App&amp;quot; is a significantly customized and down-stripped version of the original program and of the original data sets (scenery and aircraft-wise).&lt;br /&gt;
While it would be trivial to come up with custom GUI dialogs and simple aircraft like the ufo, creating custom scenery tiles using TerraGear is a little more involved.&lt;br /&gt;
&lt;br /&gt;
As memory space is limited on an Android, perhaps there should be a basic landform with a detuned visual scenery just showing mountain ranges, savanah, forest and desert, basicaly like a semi 3d world map. then downloads of airports for continents ie Africa divided by three with ten airports per sector. The reason I suggest this is because lets face it most people like to fly in specific areas ie Africa or North America etc. Lets face it are we flying or looking at scenery? the average android screen, while a lot bigger then a cell phone is still not a desktop. Personaly I only want to fly and scenery is secondary, besides having some auto generated mountains and hills around would suffice for low and slow, just suggestions mind you, probably impractical as I dont know enough about the program and I am just talking off the top of my head. At the end of the day this idea will send Flightgear where FS never really went&lt;br /&gt;
&lt;br /&gt;
In fact the perfect scenery for your phone (and FG in general) is NO SCENERY, i.e. OCEAN TILES &lt;br /&gt;
You could reduce the CPU/GPU load by customizing the scenery tile, using custom resolutions and textures.&lt;br /&gt;
&lt;br /&gt;
=== XML/Property Tree level optimizations ===&lt;br /&gt;
Just so that you know: I just finished building and running FG 2.8 on an old (5 years) computer, and the default settings left FG basically unusable (even when using just the ufo), the largest impact had disabling the AI traffic/model system (which was causing severe stutter, which also showed up in the system monitor) and ALL the shader support. Starting FlightGear in a no-scenery location gives me about 350 fps in 800x600, starting at KSFO is well above 60 fps (frame throttling disabled), usually between 50-90 fps and frame spacing between 35-45 ms.&lt;br /&gt;
&lt;br /&gt;
So, I'd suggest to customize your FG version accordingly and keep these settings disabled for starters.&lt;br /&gt;
There are probably a number of other opportunities to customize FG without touching the C++ code (even though optimizing the C++ code would definitely seem like a good idea in my opinion). Custom texture packs and custom-built scenery tiles were already mentioned. Making use of frame throttling and adjusting the FDM update interval (model-hz) would also seem to make sense.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I didn't check the specs of the Android phones, but I'd also make sure to set up the threading mode properly.&lt;br /&gt;
&lt;br /&gt;
In other words, even if you don't have access to an Android phone, there are certain things that can be done, and which would help (using an Android emulator via VirtualBox would be another option). Just customizing FG for limited targets like netbooks would also help, and if you have an old computer with an nvidia 6x/7x generation card, you could just as well try running FG.&lt;br /&gt;
&lt;br /&gt;
=== Minimal Startup Profile ===&lt;br /&gt;
Basically, the point of the following settings is to disable EVERYTHING that could have an effect on performance, to ensure that we get a working FlightGear window up and running with no eye candy at all, and maximum frame rate. &lt;br /&gt;
&lt;br /&gt;
Once that is working, features can be re-enabled step by step. Features should only be re-enabled after evaluating their impact on performance, using the frame rate counter, frame spacing indicator, the built-in system monitor (can be inspected via telnet/http using --telnet5900) and the OSG on-screen stats.&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]].&lt;br /&gt;
&lt;br /&gt;
&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;
* --bpp=16&lt;br /&gt;
* --enable-wireframe&lt;br /&gt;
* --disable-random-objects&lt;br /&gt;
* --prop:/sim/rendering/quality-level=0&lt;br /&gt;
* --prop:/sim/rendering/shaders/quality-level=0&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-skyblend&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;
&lt;br /&gt;
Using these settings, I am getting frame rates between 400-500 fps and a steady frame spacing (latency) of 3-11 ms, on a notebook from 2007 (1024x768). Disabling wireframe mode lowers the framerate by about 50-80 fps.&lt;br /&gt;
&lt;br /&gt;
[[File:Fgfs28-bare-bones.png|thumb 200px|FlightGear bare bones]]&lt;br /&gt;
&lt;br /&gt;
Additional resources can be freed by flying in areas without scenery (ocean tiles), and by using simple aircraft like the ufo. And by using a HUD instead of a 2D/3D cockpit panel. &lt;br /&gt;
In addition, custom texture packs may help to reduce the memory footprint. Further memory savings can be achieved by reducing the size of the NavDB in $FG_ROOT&lt;br /&gt;
&lt;br /&gt;
Also, it helps not to use subsystems like instruments and/or the autopilot system, by not loading the via the aircraft-set.xml&lt;br /&gt;
&lt;br /&gt;
So, custom scenery/aircraft packs, with customized textures or rebuilding scenery via TerraGear may help.&lt;br /&gt;
&lt;br /&gt;
=== Disabling Nasal modules ===&lt;br /&gt;
Nasal sub modules like [[local weather]] can be &amp;quot;disabled&amp;quot; by removing the sub folders in $FG_ROOT/Nasal.&lt;br /&gt;
Individual Nasal modules in $FG_ROOT/Nasal can be disabled by changing the *.nas file extension.&lt;br /&gt;
&lt;br /&gt;
=== Customizing and Disabling Effects/Shaders ===&lt;br /&gt;
&lt;br /&gt;
Currently, all shaders are disabled by default.&lt;br /&gt;
However, shaders may actually help improve performance, i.e. using the stencil test to discard geometry that's invisible or by using a dynamic LOD algorithm: http://rastergrid.com/blog/2010/10/gpu-based-dynamic-geometry-lod/&lt;br /&gt;
&lt;br /&gt;
Overall, some shaders could probably be ported to [http://www.khronos.org/files/opengles_shading_language.pdf OpenGL ES GLSL], while others should remain disabled. Some new shaders with optimizations may help reduce the runtime footprint even further.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Effects and shaders could be used to simplify and optimize the FG scenery, such that there's less complexity, and simpler textures used - to reduce the total runtime footprint of FG.&lt;br /&gt;
The idea is to use really simple graphics, like in the early 90s of flight simulators - so that FG can also be run on old hardware, such as for example [http://server.faia.upm.es/flight/gallery/dayrunway.jpg shown here].&lt;br /&gt;
&lt;br /&gt;
Fred said: &amp;quot;You may want to use the same shader for all materials and proceed like Thorsten did for the procedural shading. Then you put the complexity you want in that shader. The geometry is here to stay anyhow.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Optimizing 3D Models and Textures ===&lt;br /&gt;
&lt;br /&gt;
Please see [http://code.google.com/p/flightgear-bugs/issues/detail?id=733] for reference on how to optimize 3D models.&lt;br /&gt;
* http://support.strata.com/index.php?action=artikel&amp;amp;cat=20&amp;amp;id=101&amp;amp;artlang=en&lt;br /&gt;
* http://www.openscenegraph.org/documentation/OpenSceneGraphReferenceDocs/a01494.html&lt;br /&gt;
* http://stackoverflow.com/questions/tagged/opengl-es-2.0&lt;br /&gt;
&lt;br /&gt;
== Optimizing at the Source Code Level ==&lt;br /&gt;
Preparing FlightGear to be run on mobile platforms will require some heavy customizations, not just at the XML/property tree level, but also the source code level.&lt;br /&gt;
&lt;br /&gt;
That being said, it would make sense for people to team up with other FlightGear users who are interested in running FlightGear on such devices (mobile phones, netbooks, game consoles), if we manage to cooperate, we could actually make this work, regardless of the target platform - simply because these customizations will be useful for all related efforts. &lt;br /&gt;
&lt;br /&gt;
First of all, this is about reducing the FlightGear resource footprint (CPU, GPU, RAM, disk space), but also targeting FlightGear for devices which may not have a real screen, or keyboard/mouse support will be necessary. &lt;br /&gt;
&lt;br /&gt;
Obviously, you will need to be able to build FG from source, probably using a cross compiler.&lt;br /&gt;
Ideally, you would be familiar with using Virtualization (e.g via VirtualBox or VMWare) or emulators, so that you can actually run the binaries yourself. Obviously, having access to real hardware would be just as good.&lt;br /&gt;
&lt;br /&gt;
So if you know C++, and especially OpenGL/OSG, you could definitely help optimize FlightGear such that it's less resource hungry.&lt;br /&gt;
As was said in the Android thread, there are a number of resource-hungry subsystems that could be simply disabled individually, such as the AI traffic system, or shader support. &lt;br /&gt;
&lt;br /&gt;
Being able to disable subsystems individually will be useful for the whole simulator, not just for this effort: [[FlightGear Run Levels]].&lt;br /&gt;
&lt;br /&gt;
There are many other subsystems which are started by default and which cannot be currently disabled, so more CPU/RAM resources can be saved by editing {{flightgear source|path=src/Main/fg_init.cxx|line=1043|pre=$FG_SRC}} and by making more subsystems optional there, using a property to decide if the subsystem shall be started or not, e.g.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::string target_mode = fgGetString(&amp;quot;/startup/target&amp;quot;, &amp;quot;default&amp;quot;);&lt;br /&gt;
if (target_mode == &amp;quot;default&amp;quot;) {&lt;br /&gt;
 // default code&lt;br /&gt;
}&lt;br /&gt;
else if (target_mode ==&amp;quot;android&amp;quot;) {&lt;br /&gt;
 // android-specific code&lt;br /&gt;
}&lt;br /&gt;
else if (target_mode ==&amp;quot;maemo&amp;quot;) {&lt;br /&gt;
 // maemo-specific code&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To test the non-default code path, just start up with something like --prop:/startup/target=android&lt;br /&gt;
&lt;br /&gt;
This is really just intended to get us started. Ideally, subsystem-specific switches would be added, so that all subsystems can be individually disabled or customized, analogous to how other subsystems like the AI traffic system can already be disabled purely from the command line using a --prop:/foo/feature=true/false switch.&lt;br /&gt;
&lt;br /&gt;
Some possible candidates include:&lt;br /&gt;
* {{flightgear source|path=src/Main/fg_init.cxx|line=1052|text=the sounds system}}&lt;br /&gt;
* {{flightgear source|path=src/Main/fg_init.cxx|line=1081|text=the performance monitor}} (during development this should definitely be useful, especially once customized)&lt;br /&gt;
* {{flightgear source|path=src/Main/fg_init.cxx|line=1133|text=the autopilot/route manager systems}}&lt;br /&gt;
* {{flightgear source|path=src/Main/fg_init.cxx|line=1178|text=the ATC system}}&lt;br /&gt;
* {{flightgear source|path=src/Main/fg_init.cxx|line=1196|text=the traffic manager}}&lt;br /&gt;
* {{flightgear source|path=src/Main/fg_init.cxx|line=1225|text=the replay system}}&lt;br /&gt;
* {{flightgear source|path=src/Main/fg_init.cxx|line=1230|text=the voice system}}&lt;br /&gt;
&lt;br /&gt;
To check what else is initialized, see the &amp;quot;globals&amp;quot; files in $FG_SRC/Main:&lt;br /&gt;
* {{flightgear url|src/Main/globals.cxx}}&lt;br /&gt;
* {{flightgear url|src/Main/globals.hxx}}&lt;br /&gt;
&lt;br /&gt;
While disabling these systems can be fairly easily accomplished using ifdefs, care must be taken that FlightGear still builds properly and that no other systems are trying to access disabled subsystems at runtime, so this will involve repeated edit/build/debugging sessions using gdb. But that doesn't need to be done on the target device, it could just as well be completed on a conventional PC.&lt;br /&gt;
&lt;br /&gt;
To see how this can be done using a class template and listeners, please have a look at [[FlightGear Run Levels]]&lt;br /&gt;
&lt;br /&gt;
Potential pitfalls are also discussed at [[FGCanvas#Open Issues]].&lt;br /&gt;
&lt;br /&gt;
== Tracking Memory Utilization at the Subsystem-level ==&lt;br /&gt;
In order to help reduce the memory footprint of FlightGear, it might be beneficial to extend the built-in [[Howto:Use the system monitor|performance monitor system]] such that it also supports tracking memory consumption per subsystem. &lt;br /&gt;
&lt;br /&gt;
The performance monitor is initialized in fg_init.cxx: {{flightgear url|src/Main/fg_init.cxx|line=1083}}&lt;br /&gt;
The performance monitor is implemented as part of SimGear, &amp;lt;simgear/structure/SGPerfMon.hxx&amp;gt;&lt;br /&gt;
As can be seen, it hooks into the [http://simgear.sourceforge.net/doxygen/classSGSubsystem.html SGSubsystem] code, so that it gets invoked by all subsystems in order to create runtime samples.&lt;br /&gt;
&lt;br /&gt;
The commits implementing the performance monitor are these: &lt;br /&gt;
* {{simgear commit|27a1c02|text=SimGear commit}}&lt;br /&gt;
* {{flightgear commit|4b2506d|text=FlightGear commit}}&lt;br /&gt;
&lt;br /&gt;
The performance monitor dialog reads all data from the property tree and it is created dynamically using a Nasal module in {{fgdata source|Nasal/performance_monitor/monitor.nas|pre=$FG_ROOT}}&lt;br /&gt;
&lt;br /&gt;
It would probably suffice to use &amp;quot;placement new&amp;quot; (i.e. pool memory) here, and overload the new operator at the SGSubsystem level (i.e. in SimGear), so that all subsystems use the overloaded new operator automatically and write allocation reports to the performance monitor. &lt;br /&gt;
&lt;br /&gt;
This would allow us to keep track of the number of memory allocations per subsystem, and also the amount of total RAM allocated by single subsystems. In addition, we could also track freeing via delete, too. And publish all the info to the property tree.&lt;br /&gt;
&lt;br /&gt;
We could even provide a facility to register our own new/malloc operator for SimGear code, so that also non-FG/SG (subsystem) code, such as the Nasal GC, could be tracked memory-wise.&lt;br /&gt;
&lt;br /&gt;
Once the performance monitor is extended like that, it should become obvious how much memory is used by each subsystem, so that it will be easier to do further optimizations, i.e. possibly using a lazy allocation scheme or by optimizing the underlying data structures.&lt;br /&gt;
&lt;br /&gt;
== Related ==&lt;br /&gt;
* {{forum url|t=21964}}&lt;br /&gt;
* {{forum url|p=160255}}&lt;br /&gt;
* {{forum url|t=17091}}&lt;br /&gt;
* {{forum url|t=6337}}&lt;br /&gt;
* {{forum url|t=8251}}&lt;br /&gt;
* {{forum url|t=1833}}&lt;br /&gt;
* http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg27635.html&lt;br /&gt;
* http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg30391.html&lt;br /&gt;
* http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg32369.html&lt;br /&gt;
&lt;br /&gt;
[[Category: Core development projects]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FGCanvas&amp;diff=144593</id>
		<title>FGCanvas</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FGCanvas&amp;diff=144593"/>
		<updated>2026-05-24T02:57:41Z</updated>

		<summary type="html">&lt;p&gt;Servo: already been implemented&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Canvas]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Initializing_Nasal_early&amp;diff=144592</id>
		<title>Initializing Nasal early</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Initializing_Nasal_early&amp;diff=144592"/>
		<updated>2026-05-24T02:53:22Z</updated>

		<summary type="html">&lt;p&gt;Servo: redirect outdated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[Nasal Initialization]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Reset_%26_re-init&amp;diff=144591</id>
		<title>Reset &amp; re-init</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Reset_%26_re-init&amp;diff=144591"/>
		<updated>2026-05-24T02:50:34Z</updated>

		<summary type="html">&lt;p&gt;Servo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Portability Navbar}}&lt;br /&gt;
: ''See also [[Initializing Nasal early]], [[Aircraft Center]] and [[FGCanvas]].''&lt;br /&gt;
&lt;br /&gt;
[[FlightGear]] has a reset feature accessed via &amp;quot;File &amp;gt; Reset&amp;quot;, which is useful after your plane crashes.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
* The init / shutdown code, including FGGlobals, needs to be adjusted to do the actual deletion and run init again. Most of the other init steps (configuration options) are already re-factored in this direction anyway.&lt;br /&gt;
* Any subsystems which should be retained, such as tile-manager or renderer, need to be checked very carefully.&lt;br /&gt;
** This likely requires some new SGSubsystemGroup hooks to extract the subsystems from their owning groups so they escape shutdown and deletion.&lt;br /&gt;
* Any systems with other threads need to be inerted during the reset. In particular any osgDB paged loaders, or TerraSync threads, need to be paused or audited for safety. TerraSync should be relatively simple (since it's a regular subsystem), osgDB interactions, especially with properties, will be harder.&lt;br /&gt;
** All animations and effects will need to be destroyed for sure, since they have [[property tree]] references.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Plans]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Reset_%26_re-init&amp;diff=144590</id>
		<title>Reset &amp; re-init</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Reset_%26_re-init&amp;diff=144590"/>
		<updated>2026-05-24T02:50:07Z</updated>

		<summary type="html">&lt;p&gt;Servo: Replaced content with &amp;quot;{{infobox subsystem |name = Reset &amp;amp; Re-init |started= 01/2013 |description = Fixing reset &amp;amp; re-init |status = merged (under active development as of 01/2013) |maintainers  = {{Usr|Zakalawe}} |developers = User:Zakalawe (since 01/2013),  }}  {{Portability Navbar}}  File:Patching-fg-3.2-to-make-more-subsystems-optional.png|450px|thumb|Screen shot showing a the performance monitor in a patched version of FlightGear 3.2  where subsystem initialization is made bette...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{infobox subsystem&lt;br /&gt;
|name = Reset &amp;amp; Re-init&lt;br /&gt;
|started= 01/2013&lt;br /&gt;
|description = Fixing reset &amp;amp; re-init&lt;br /&gt;
|status = merged (under active development as of 01/2013)&lt;br /&gt;
|maintainers  = {{Usr|Zakalawe}}&lt;br /&gt;
|developers = [[User:Zakalawe]] (since 01/2013), &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Portability Navbar}}&lt;br /&gt;
&lt;br /&gt;
[[File:Patching-fg-3.2-to-make-more-subsystems-optional.png|450px|thumb|Screen shot showing a the performance monitor in a patched version of FlightGear 3.2  where subsystem initialization is made better configurable and increasingly optional by allowing subsystems to be explicitly disabled/enabled during startup. Decoupling internal subsystem dependencies means that we can more easily provide support for [[FlightGear Benchmark|benchmarking]], but also [[FlightGear Headless|headless]] regression testing - and eventually, also a standalone [[FGCanvas]] startup mode.]]&lt;br /&gt;
&lt;br /&gt;
: ''See also [[Initializing Nasal early]], [[Aircraft Center]] and [[FGCanvas]].''&lt;br /&gt;
&lt;br /&gt;
[[FlightGear]] has a reset feature accessed via &amp;quot;File &amp;gt; Reset&amp;quot;, which is useful after your plane crashes.&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
* The init / shutdown code, including FGGlobals, needs to be adjusted to do the actual deletion and run init again. Most of the other init steps (configuration options) are already re-factored in this direction anyway.&lt;br /&gt;
* Any subsystems which should be retained, such as tile-manager or renderer, need to be checked very carefully.&lt;br /&gt;
** This likely requires some new SGSubsystemGroup hooks to extract the subsystems from their owning groups so they escape shutdown and deletion.&lt;br /&gt;
* Any systems with other threads need to be inerted during the reset. In particular any osgDB paged loaders, or TerraSync threads, need to be paused or audited for safety. TerraSync should be relatively simple (since it's a regular subsystem), osgDB interactions, especially with properties, will be harder.&lt;br /&gt;
** All animations and effects will need to be destroyed for sure, since they have [[property tree]] references.&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Plans]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=How_the_Nasal_GC_works&amp;diff=144589</id>
		<title>How the Nasal GC works</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=How_the_Nasal_GC_works&amp;diff=144589"/>
		<updated>2026-05-24T02:44:01Z</updated>

		<summary type="html">&lt;p&gt;Servo: remove outdated quotes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Nasal Internals}}&lt;br /&gt;
{{Multicore}}&lt;br /&gt;
&lt;br /&gt;
This page explains how the Nasal GC works.&lt;br /&gt;
&lt;br /&gt;
= High Level Architecture =&lt;br /&gt;
{{Main article|High-Level Architecture}}&lt;br /&gt;
{{FGCquote&lt;br /&gt;
|1= Regarding Nasal as a scripting language and AW, I'm hopeful that the work I'm doing on HLA will allow us to run Nasal in a separate thread from the FDM and display, so Nasal GC no-longer can impact frame-rates.  It would also allow for writing a weather simulation completely external to the FlightGear instance, which could be quite neat.&lt;br /&gt;
|2= {{cite web&lt;br /&gt;
  | url    = http://forum.flightgear.org/viewtopic.php?p=265721#p265721&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: the real cost of the Nasal Garbage Collector&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;stuart&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Nov 24th, 2015&lt;br /&gt;
  | added   = Nov 24th, 2015&lt;br /&gt;
  | script_version = 0.23&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
|1= I do like the idea of a stand-alone script interpreter communicating via HLA or some similar IPC, but we still have to consider fragments of script code embedded in models to create or enhance fancy animations.  Not all script fragments make sense to run externally.&lt;br /&gt;
|2= {{cite web&lt;br /&gt;
  | url    = http://forum.flightgear.org/viewtopic.php?p=270412#p270412&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;curt&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Dec 28th, 2015&lt;br /&gt;
  | added   = Dec 28th, 2015&lt;br /&gt;
  | script_version = 0.23&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
|1= if scripting is a major performance hog, off-load it to a different thread. I don't think we have many situation where it is, but that's what HLA is going to do. &lt;br /&gt;
|2= {{cite web&lt;br /&gt;
  | url    = http://forum.flightgear.org/viewtopic.php?p=270463#p270463&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;Thorsten&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Dec 29th, 2015&lt;br /&gt;
  | added   = Dec 29th, 2015&lt;br /&gt;
  | script_version = 0.23&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
|1= haven't made too many tests with Nasal active as anyone can do that (adjust paths to have no terrain if necessary).&lt;br /&gt;
But most of this becomes less relevant with the HLA changes that Stuart's working on. &lt;br /&gt;
|2= {{cite web&lt;br /&gt;
  | url    = http://forum.flightgear.org/viewtopic.php?p=265726#p265726&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: the real cost of the Nasal Garbage Collector&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Nov 24th, 2015&lt;br /&gt;
  | added   = Nov 24th, 2015&lt;br /&gt;
  | script_version = 0.23&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Mark/Sweep =&lt;br /&gt;
&lt;br /&gt;
When using a mark-and-sweep collector, unreachable objects are not immediately reclaimed. Instead, garbage is allowed to accumulate until all available memory has been exhausted. When that happens, the execution of the program is suspended temporarily while the mark-and-sweep algorithm collects all the garbage. Once all unreferenced objects have been reclaimed, the normal execution of the program can resume.&lt;br /&gt;
&lt;br /&gt;
Obviously, the main disadvantage of the mark-and-sweep approach is the fact that that normal program execution is suspended while the garbage collection algorithm runs. In particular, this can be a problem in a program that must satisfy real-time execution constraints (like a flight simulator). For example, an interactive application that uses mark-and-sweep garbage collection becomes unresponsive periodically.&lt;br /&gt;
&lt;br /&gt;
The mark-and-sweep algorithm is called a tracing garbage collector because is traces out the entire collection of objects that are directly or indirectly accessible by the program. The objects that a program can access directly are those objects which are referenced by local variables on the processor stack as well as by any static variables that refer to objects. In the context of garbage collection, these variables are called the roots . An object is indirectly accessible if it is referenced by a field in some other (directly or indirectly) accessible object. An accessible object is said to be live . Conversely, an object which is not live is garbage.&lt;br /&gt;
&lt;br /&gt;
The mark-and-sweep algorithm consists of two phases: In the first phase, it finds and marks all accessible objects. The first phase is called the mark phase. In the second phase, the garbage collection algorithm scans through the heap and reclaims all the unmarked objects. The second phase is called the sweep phase.&lt;br /&gt;
&lt;br /&gt;
The mark/sweep algorithm can also be easily expressed using pseudo code, i.e. in Nasal itself:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 var garbageCollect = func (roots) {&lt;br /&gt;
 foreach(var root; roots) {&lt;br /&gt;
   mark(root);&lt;br /&gt;
  }&lt;br /&gt;
  sweep();&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The mark() function would just recursively check (i.e. calling itself) if the &amp;quot;marked&amp;quot; flag is set or not, and make sure to set the mark bit for all referenced objects:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 var mark = func (obj) {&lt;br /&gt;
  if (!obj.marked) {&lt;br /&gt;
   obj.marked=1;&lt;br /&gt;
   foreach( var referenced; referenced_by(obj) )&lt;br /&gt;
     mark(referenced);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally, the sweep() function (reap() in the Nasal GC), will free all unreachable objects and reclaim the memory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 var sweep = func {&lt;br /&gt;
  foreach(var obj; allocated_objects) {&lt;br /&gt;
   if (obj.marked) obj.marked=0;&lt;br /&gt;
   else reclaim(obj);&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nasal's implementation of sweep() ( called reap() ) works such that it is always executed for a handful of different type-specific memory pools. In addition, it also makes sure to allocate new memory if required.&lt;br /&gt;
&lt;br /&gt;
= Pool storage =&lt;br /&gt;
A [http://en.wikipedia.org/wiki/Memory_pool memory pool] is basically a preallocated region of memory, which is dynamically resized. The Nasal GC works such that it manages a handful of global memory pools for all native Nasal types (strings, functions, vectors, hashes etc). At the moment, the hard coded defaults ensure that 25-50% of additional object &amp;quot;slots&amp;quot; (memory blocks) are kept available during each execution of reap() [{{simgear source|path=simgear/nasal/gc.c|line=287|full=1}}].&lt;br /&gt;
&lt;br /&gt;
Whenever new memory is requested to create a new type (such as a vector or a string), the available memory in the corresponding pool will be checked, reachable objects will be marked, and dead objects will be removed from all pools using a mark/sweep collector, new memory blocks will be allocated if necessary. All of this happens atomically, i.e. single-threaded, in  a &amp;quot;stop-the-world&amp;quot; fashion.&lt;br /&gt;
&lt;br /&gt;
== Memory blocks ==&lt;br /&gt;
&lt;br /&gt;
[[File:NasalBlockStruct.png|thumb|450px|Nasal Block structure]]&lt;br /&gt;
&lt;br /&gt;
A Nasal memory pool consists of memory blocks.&lt;br /&gt;
&lt;br /&gt;
A memory block is a [http://en.wikipedia.org/wiki/Linked_list#Linear_and_circular_lists singly linked list]: {{simgear source|path=simgear/nasal/gc.c|line=10}}.&lt;br /&gt;
&lt;br /&gt;
[[File:NasalNewBlockCallgraph.png|thumb|400px|Callgraph for newBlock()]]&lt;br /&gt;
&lt;br /&gt;
Each block contains a field to store its size, a pointer to the allocated memory, and another pointer to the next block.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct Block {&lt;br /&gt;
    int   size; // size of the block &lt;br /&gt;
    char* block; // pointer to the memory region&lt;br /&gt;
    struct Block* next;	// pointer to the next block&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
New memory blocks are allocated using newBlock() and the memory is initialized with 0: {{simgear source|path=simgear/nasal/gc.c|line=167}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
static void newBlock(struct naPool* p, int need)	&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    struct Block* newb;&lt;br /&gt;
    if(need &amp;lt; MIN_BLOCK_SIZE) need = MIN_BLOCK_SIZE;&lt;br /&gt;
    // allocate a new Block&lt;br /&gt;
    newb = naAlloc(sizeof(struct Block));&lt;br /&gt;
    // initialize the Block&lt;br /&gt;
    newb-&amp;gt;block = naAlloc(need * p-&amp;gt;elemsz); // number of elements * size of element&lt;br /&gt;
    newb-&amp;gt;size = need; // set block size &lt;br /&gt;
    // memory blocks are circular linked lists: &lt;br /&gt;
    newb-&amp;gt;next = p-&amp;gt;blocks;&lt;br /&gt;
    p-&amp;gt;blocks = newb;&lt;br /&gt;
    naBZero(newb-&amp;gt;block, need * p-&amp;gt;elemsz);&lt;br /&gt;
&lt;br /&gt;
    if(need &amp;gt; p-&amp;gt;freesz - p-&amp;gt;freetop) need = p-&amp;gt;freesz - p-&amp;gt;freetop;&lt;br /&gt;
    p-&amp;gt;nfree = 0;&lt;br /&gt;
    p-&amp;gt;free = p-&amp;gt;free0 + p-&amp;gt;freetop;&lt;br /&gt;
    // mark all new blocks as unreachable and add them to the pool's free list&lt;br /&gt;
    for(i=0; i &amp;lt; need; i++) {&lt;br /&gt;
        // initialize each new new memory blocks by setting up an naRef (the container for all Nasal references) &lt;br /&gt;
        struct naObj* o = (struct naObj*)(newb-&amp;gt;block + i*p-&amp;gt;elemsz);&lt;br /&gt;
        o-&amp;gt;mark = 0;&lt;br /&gt;
        p-&amp;gt;free[p-&amp;gt;nfree++] = o;	&lt;br /&gt;
    }&lt;br /&gt;
    p-&amp;gt;freetop += need;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nasal memory pools ==&lt;br /&gt;
&lt;br /&gt;
For each of the 7 Nasal data types, there is a separate storage pool available, declared as part of the &amp;quot;Globals&amp;quot; structure.&lt;br /&gt;
&lt;br /&gt;
As can be seen, each storage pool is addressed by its enum index (0..6): {{simgear source|path=simgear/nasal/data.h|line=65}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
enum { T_STR, T_VEC, T_HASH, T_CODE, T_FUNC, T_CCODE, T_GHOST, NUM_NASAL_TYPES }; // V. important that this come last!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, '''globals-&amp;gt;pools[T_VEC]''' refers to the storage pools  for vectors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
globals-&amp;gt;pools[T_VEC];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The 7 storage pools are declared in code.h as part of the &amp;quot;Globals&amp;quot; structure: {{simgear source|path=simgear/nasal/code.h|line=40}}&lt;br /&gt;
&lt;br /&gt;
The relevant part is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct Globals {	&lt;br /&gt;
    // Garbage collecting allocators:&lt;br /&gt;
    struct naPool pools[NUM_NASAL_TYPES];&lt;br /&gt;
    int allocCount;&lt;br /&gt;
    // Dead blocks waiting to be freed when it is safe&lt;br /&gt;
    void** deadBlocks;&lt;br /&gt;
    int deadsz;&lt;br /&gt;
    int ndead;&lt;br /&gt;
//...&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, we have these pools:&lt;br /&gt;
&lt;br /&gt;
* globals-&amp;gt;pools[T_STR]&lt;br /&gt;
* globals-&amp;gt;pools[T_VEC]&lt;br /&gt;
* globals-&amp;gt;pools[T_HASH]&lt;br /&gt;
* globals-&amp;gt;pools[T_CODE]&lt;br /&gt;
* globals-&amp;gt;pools[T_FUNC]&lt;br /&gt;
* globals-&amp;gt;pools[T_CCODE]&lt;br /&gt;
* globals-&amp;gt;pools[T_GHOST]&lt;br /&gt;
&lt;br /&gt;
== The Globals structure ==&lt;br /&gt;
&lt;br /&gt;
[[File:NasalGlobalsStruct.png|thumb|500px|Nasal Globals structure]]&lt;br /&gt;
&lt;br /&gt;
The complete Globals structure looks like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct Globals {	&lt;br /&gt;
    // Garbage collecting allocators:&lt;br /&gt;
    struct naPool pools[NUM_NASAL_TYPES];&lt;br /&gt;
    int allocCount;&lt;br /&gt;
    // Dead blocks waiting to be freed when it is safe&lt;br /&gt;
    void** deadBlocks;&lt;br /&gt;
    int deadsz;&lt;br /&gt;
    int ndead;&lt;br /&gt;
&lt;br /&gt;
    // Threading stuff&lt;br /&gt;
	&lt;br /&gt;
    int nThreads;&lt;br /&gt;
	&lt;br /&gt;
    int waitCount;&lt;br /&gt;
	&lt;br /&gt;
    int needGC;&lt;br /&gt;
	&lt;br /&gt;
    int bottleneck;&lt;br /&gt;
	&lt;br /&gt;
    void* sem;&lt;br /&gt;
	&lt;br /&gt;
    void* lock;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    // Constants&lt;br /&gt;
	&lt;br /&gt;
    naRef meRef;&lt;br /&gt;
	&lt;br /&gt;
    naRef argRef;&lt;br /&gt;
&lt;br /&gt;
    naRef parentsRef;&lt;br /&gt;
&lt;br /&gt;
    // A hash of symbol names&lt;br /&gt;
    naRef symbols;&lt;br /&gt;
    naRef save;&lt;br /&gt;
    struct Context* freeContexts;&lt;br /&gt;
    struct Context* allContexts;	&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The naPool structure ==&lt;br /&gt;
&lt;br /&gt;
[[File:NasalnaPoolStruct.png|thumb|400px|Nasal naPool structure]]&lt;br /&gt;
&lt;br /&gt;
The structure keeping all pool-related information is named &amp;quot;naPool&amp;quot;, the layout of the naPool structure can be seen in data.h: {{simgear source|path=simgear/nasal/data.h|line=181}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct naPool {&lt;br /&gt;
    int           type; // one of T_STR, T_VEC, T_HASH etc&lt;br /&gt;
    int           elemsz; // size of each element - determined via naTypeSize(T_*)&lt;br /&gt;
    struct Block* blocks;&lt;br /&gt;
    void**   free0; // pointer to the alloced buffer&lt;br /&gt;
    int     freesz; // size of the alloced buffer&lt;br /&gt;
    void**    free; // current &amp;quot;free frame&amp;quot;&lt;br /&gt;
    int      nfree; // down-counting index within the free frame&lt;br /&gt;
    int    freetop; // curr. top of the free list&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each memory pool is initialized using naGC_init(): {{simgear source|path=simgear/nasal/gc.c|line=192}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void naGC_init(struct naPool* p, int type)&lt;br /&gt;
{&lt;br /&gt;
    p-&amp;gt;type = type;&lt;br /&gt;
    p-&amp;gt;elemsz = naTypeSize(type);&lt;br /&gt;
    p-&amp;gt;blocks = 0;&lt;br /&gt;
    p-&amp;gt;free0 = p-&amp;gt;free = 0;&lt;br /&gt;
    p-&amp;gt;nfree = p-&amp;gt;freesz = p-&amp;gt;freetop = 0;&lt;br /&gt;
    reap(p);	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As can be seen, &amp;quot;elemsz&amp;quot;  just stores the size of each type-specific structure, so that it can be used for new allocations.&lt;br /&gt;
&lt;br /&gt;
naGC_init is called in initGlobals() in code.c for each Nasal type (T_STR, T_VEC etc): {{simgear source|path=simgear/nasal/code.c|line=172}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
for(i=0; i&amp;lt;NUM_NASAL_TYPES; i++)&lt;br /&gt;
        naGC_init(&amp;amp;(globals-&amp;gt;pools[i]), i);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The size of a memory pool is determined using poolsize(): {{simgear source|path=simgear/nasal/gc.c|line=203}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
static int poolsize(struct naPool* p)&lt;br /&gt;
{&lt;br /&gt;
    int total = 0;&lt;br /&gt;
    struct Block* b = p-&amp;gt;blocks;&lt;br /&gt;
    while(b) { total += b-&amp;gt;size; b = b-&amp;gt;next; }&lt;br /&gt;
    return total;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function poolsize() just iterates over all memory blocks in the pool, and computes the total size of the pool by adding up the &amp;quot;size&amp;quot; field of all blocks in the linked list.&lt;br /&gt;
&lt;br /&gt;
= Allocating Nasal types =&lt;br /&gt;
&lt;br /&gt;
All Nasal types (scalars, vectors, hashes, funcs, ghosts) are allocated via wrappers in {{simgear source|path=simgear/nasal/misc.c|text=misc.c}}.&lt;br /&gt;
&lt;br /&gt;
These wrappers are:&lt;br /&gt;
* naNewString(): {{simgear source|path=simgear/nasal/misc.c|line=77}}&lt;br /&gt;
* naNewVector(): {{simgear source|path=simgear/nasal/misc.c|line=87}}&lt;br /&gt;
* naNewHash(): {{simgear source|path=simgear/nasal/misc.c|line=94}}&lt;br /&gt;
* naNewCode(): {{simgear source|path=simgear/nasal/misc.c|line=101}}&lt;br /&gt;
* naNewCCode(): {{simgear source|path=simgear/nasal/misc.c|line=106}}&lt;br /&gt;
* naNewFunc(): {{simgear source|path=simgear/nasal/misc.c|line=131}}&lt;br /&gt;
* naNewGhost(): {{simgear source|path=simgear/nasal/misc.c|line=140}}&lt;br /&gt;
* naNewGhost2(): {{simgear source|path=simgear/nasal/misc.c|line=154}}&lt;br /&gt;
&lt;br /&gt;
All of these wrappers are really just helpers on top of naNew(), they just set up type-specific information and initialize each Nasal type properly.&lt;br /&gt;
For instance, first naNew() is called for the given context, along with the type info (to set up the size properly)- and then each type is initialized:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// The naNew* helpers are just wrappers to set up type-specific structures, after allocating the memory using naNew()&lt;br /&gt;
naRef naNewString(struct Context* c)	&lt;br /&gt;
{&lt;br /&gt;
    naRef s = naNew(c, T_STR);&lt;br /&gt;
    PTR(s).str-&amp;gt;emblen = 0;&lt;br /&gt;
    PTR(s).str-&amp;gt;data.ref.len = 0;&lt;br /&gt;
    PTR(s).str-&amp;gt;data.ref.ptr = 0;&lt;br /&gt;
    PTR(s).str-&amp;gt;hashcode = 0;&lt;br /&gt;
    return s;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= naNew() =&lt;br /&gt;
&lt;br /&gt;
As can be seen, the key allocator function is {{simgear source|path=simgear/nasal/misc.c|line=66|text=naNew()}}.&lt;br /&gt;
All memory allocations done via the naNew*() helpers will first of all set up memory using naNew().&lt;br /&gt;
&lt;br /&gt;
naNew() is really just a fancy malloc() replacement, i.e. it's just getting passed the Nasal execution context, and the nasal type (which is mapped to the size of the requested memory region using naTypeSize()).&lt;br /&gt;
&lt;br /&gt;
{{FGCquote|1= New nasal objects are added to a temporary bin when they are created, because further allocation might cause a garbage collection to happen before the code that created the object can store a reference to it where the garbage collector can find it. For performance and simplicity, this list is stored per-context. When the context next executes code, it clears this list. Here's the problem: we do a lot of our naNewXX() calls in FlightGear using the old &amp;quot;global context&amp;quot; object that is created at startup. But this context is no longer used to execute scripts* at runtime, so as Csaba discovered, it's temporaries are never flushed. That essentially causes a resource leak: those allocations (mostly listener nodes) will never be freed. And all the extra &amp;quot;reachable&amp;quot; Nasal data floating around causes the garbage collector to take longer and longer to do a full collection as time goes on, causing &amp;quot;stutter&amp;quot;. And scripts that use listeners extensively (the cmdarg() they use was one of the affected allocations) will see the problem more seriously.|2= {{cite web  | url    = http://sourceforge.net/p/flightgear/mailman/message/15645369/  | title  = &amp;lt;nowiki&amp;gt;[Flightgear-devel] Stutter/Nasal issue resolved (was: FlightGear/Plib periodic stutter notes)&amp;lt;/nowiki&amp;gt;  | author = &amp;lt;nowiki&amp;gt;Andy Ross&amp;lt;/nowiki&amp;gt;  | date   = Oct 24th, 2007  }}}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote|1= Once listeners were added, scripts could be recursive: (script A sets property X which causes listener L to fire and cause script B to run) We need two or more contexts on the stack to handle that; a single global one won't work. I didn't like the fix though. Exposing the temporary bin as part of the Nasal public API is ugly; it's an internal design feature, not something users should tune. Instead, I just hacked at the FlightGear code to reinitialie this context every frame, thus cleaning it up. A &amp;quot;proper&amp;quot; fix would be to remove the global context entirely, but that would touch a bunch of code.|2= {{cite web  | url    = http://sourceforge.net/p/flightgear/mailman/message/15645369/  | title  = &amp;lt;nowiki&amp;gt;[Flightgear-devel] Stutter/Nasal issue resolved (was: FlightGear/Plib periodic stutter notes)&amp;lt;/nowiki&amp;gt;  | author = &amp;lt;nowiki&amp;gt;Andy Ross&amp;lt;/nowiki&amp;gt;  | date   = Oct 24th, 2007  }}}}&lt;br /&gt;
&lt;br /&gt;
The naNew() function is also implemented in misc.c, see {{simgear source|path=simgear/nasal/misc.c|line=66}}:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
naRef naNew(struct Context* c, int type)	&lt;br /&gt;
{&lt;br /&gt;
    naRef result;&lt;br /&gt;
    if(c-&amp;gt;nfree[type] == 0)&lt;br /&gt;
        c-&amp;gt;free[type] = naGC_get(&amp;amp;globals-&amp;gt;pools[type],&lt;br /&gt;
                                 OBJ_CACHE_SZ, &amp;amp;c-&amp;gt;nfree[type]);&lt;br /&gt;
    result = naObj(type, c-&amp;gt;free[type][--c-&amp;gt;nfree[type]]);&lt;br /&gt;
    naTempSave(c, result);&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First, the conditional checks if there's any free memory in the Nasal storage pools  for the requested Nasal data type, if there isn't any free memory left, new memory is assigned to the contexts-&amp;gt;free[type] pool via naGC_get().&lt;br /&gt;
&lt;br /&gt;
'''Note:''' naGC_get() is the only function which really manages all memory pools and which triggers the GC. Allocations via naNew()* will end up calling naNew() and naNew() ends up calling naGC_get() '''always'''.&lt;br /&gt;
&lt;br /&gt;
For the time being, OBJ_CACHE_SZ can be ignored, it's defined in code.h: {{simgear source|path=simgear/nasal/code.h|line=12}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// Number of objects (per pool per thread) asked for using naGC_get().&lt;br /&gt;
// The idea is that contexts can &amp;quot;cache&amp;quot; allocations to prevent thread&lt;br /&gt;
// contention on the global pools.  But in practice this interacts&lt;br /&gt;
// very badly with small subcontext calls, which grab huge numbers of&lt;br /&gt;
// cached objects and don't use them, causing far more collections&lt;br /&gt;
// than necessary.  Just leave it at 1 pending a rework of the&lt;br /&gt;
// collector synchronization.&lt;br /&gt;
#define OBJ_CACHE_SZ 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The final argument to the naGC_get() function is a pointer to to the context's nfree[type] member which is updated by the function.&lt;br /&gt;
&lt;br /&gt;
Next, a new naRef structure is set up using the allocated naObj memory and the type info: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
result = naObj(type, c-&amp;gt;free[type][--c-&amp;gt;nfree[type]]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
naRef naObj(int type, struct naObj* o)	&lt;br /&gt;
{&lt;br /&gt;
    naRef r;&lt;br /&gt;
    SETPTR(r, o);&lt;br /&gt;
    o-&amp;gt;type = type;&lt;br /&gt;
    return r;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= The GC interface =&lt;br /&gt;
&lt;br /&gt;
[[File:Nasal-gc.png|thumb|650px|Nasal GC]]&lt;br /&gt;
TODO: {{simgear source|path=simgear/nasal/data.h|line=204}}&lt;br /&gt;
&lt;br /&gt;
* void naGC_init(struct naPool* p, int type);&lt;br /&gt;
* struct naObj** naGC_get(struct naPool* p, int n, int* nout);	&lt;br /&gt;
* void naGC_swapfree(void** target, void* val); (used for vector/hash resizing)&lt;br /&gt;
* void naGC_freedead();&lt;br /&gt;
* void naiGCMark(naRef r);&lt;br /&gt;
* void naiGCMarkHash(naRef h);&lt;br /&gt;
&lt;br /&gt;
= The pool manager =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:NasalNaGetCallgraph.png|thumb|550px|Callgraph for naGC_get()]]&lt;br /&gt;
&lt;br /&gt;
All high level type allocators (naNewString, naNewVector, naNewHash etc) make use of the naNew() call introduced earlier.&lt;br /&gt;
&lt;br /&gt;
naNew() doesn't directly allocate new memory from the heap using naAlloc(), but instead uses the naGC_get() helper which manages memory from the global pools (i.e. preallocated memory for each type).&lt;br /&gt;
&lt;br /&gt;
For each native Nasal data type (scalars, vectors, hashes, funcs etc) , there are separate memory pools in globals-&amp;gt;pools[n]. The index (n) is one of T_VEC, T_HASH, T_FUNC etc.&lt;br /&gt;
&lt;br /&gt;
The naGC_get() pool &amp;quot;manager&amp;quot; is located in gc.nas: {{simgear source|path=simgear/nasal/gc.c|line=211}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct naObj** naGC_get(struct naPool* p, int n, int* nout)&lt;br /&gt;
{&lt;br /&gt;
    struct naObj** result;&lt;br /&gt;
    naCheckBottleneck();&lt;br /&gt;
    LOCK();&lt;br /&gt;
    while(globals-&amp;gt;allocCount &amp;lt; 0 || (p-&amp;gt;nfree == 0 &amp;amp;&amp;amp; p-&amp;gt;freetop &amp;gt;= p-&amp;gt;freesz)) {&lt;br /&gt;
        globals-&amp;gt;needGC = 1;&lt;br /&gt;
        bottleneck();	&lt;br /&gt;
    }&lt;br /&gt;
    if(p-&amp;gt;nfree == 0)&lt;br /&gt;
        newBlock(p, poolsize(p)/8);&lt;br /&gt;
    n = p-&amp;gt;nfree &amp;lt; n ? p-&amp;gt;nfree : n;&lt;br /&gt;
    *nout = n;&lt;br /&gt;
    p-&amp;gt;nfree -= n;&lt;br /&gt;
    globals-&amp;gt;allocCount -= n;&lt;br /&gt;
    result = (struct naObj**)(p-&amp;gt;free + p-&amp;gt;nfree);&lt;br /&gt;
    UNLOCK();&lt;br /&gt;
    return result;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As can be seen, the garbage collector itself is triggered by setting the global &amp;quot;needGC&amp;quot; flag to 1 in the globals structure and then calling the bottleneck() function: {{simgear source|path=simgear/nasal/gc.c|line=105}}.&lt;br /&gt;
&lt;br /&gt;
The memory region from the global pool is cast back to a pointer (struct naObj**): {{simgear source|path=simgear/nasal/gc.c|line=226}}&lt;br /&gt;
the &amp;quot;nout&amp;quot; parameter is just there to update c-&amp;gt;nfree[type] with the amount of free memory.&lt;br /&gt;
&lt;br /&gt;
In other words, whenever new Nasal types are allocated, new memory from one of the 7 Nasal pools is requested. All of these allocation requests are channeled through naNew() and finally naGC_get(). naGC_get() is the de facto memory manager in Nasal, all memory management is triggered here - new memory block allocations for each pool, as well as garbage collection via the bottleneck() call.&lt;br /&gt;
&lt;br /&gt;
This also means that we basically just need to provide an alternate naGC_get() function, next to the existing one, to add support for alternate GC schemes.&lt;br /&gt;
&lt;br /&gt;
= Supporting additional GC implementations =&lt;br /&gt;
It would probably make sense to change the pool manager interface/signature such that additional implementations can be easily provided and registered, so that merely a GC_CALLBACK pointer must be set during initialization in order to use a different GC scheme:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;diff&amp;quot;&amp;gt;&lt;br /&gt;
diff --git a/simgear/nasal/data.h b/simgear/nasal/data.h&lt;br /&gt;
index deb4fbd..f3fcaa1 100644&lt;br /&gt;
--- a/simgear/nasal/data.h&lt;br /&gt;
+++ b/simgear/nasal/data.h&lt;br /&gt;
@@ -202,7 +202,7 @@ int naiHash_sym(struct naHash* h, struct naStr* sym, naRef* out);&lt;br /&gt;
 void naiHash_newsym(struct naHash* h, naRef* sym, naRef* val);&lt;br /&gt;
 &lt;br /&gt;
 void naGC_init(struct naPool* p, int type);&lt;br /&gt;
-struct naObj** naGC_get(struct naPool* p, int n, int* nout);&lt;br /&gt;
+void naGC_alloc(struct Context* c, int type, int n);&lt;br /&gt;
 void naGC_swapfree(void** target, void* val);&lt;br /&gt;
 void naGC_freedead();&lt;br /&gt;
 void naiGCMark(naRef r);&lt;br /&gt;
diff --git a/simgear/nasal/gc.c b/simgear/nasal/gc.c&lt;br /&gt;
index e9d9b7b..3bae313 100644&lt;br /&gt;
--- a/simgear/nasal/gc.c&lt;br /&gt;
+++ b/simgear/nasal/gc.c&lt;br /&gt;
@@ -191,8 +191,10 @@ static int poolsize(struct naPool* p)&lt;br /&gt;
     return total;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
-struct naObj** naGC_get(struct naPool* p, int n, int* nout)&lt;br /&gt;
+void naGC_alloc(struct Context* c, int type, int n)&lt;br /&gt;
 {&lt;br /&gt;
+    struct naPool* p = &amp;amp;globals-&amp;gt;pools[type]; // type-specific memory pool&lt;br /&gt;
+    int* nout = &amp;amp;c-&amp;gt;nfree[type];		// &lt;br /&gt;
     struct naObj** result;&lt;br /&gt;
     naCheckBottleneck();&lt;br /&gt;
     LOCK();&lt;br /&gt;
@@ -208,7 +210,7 @@ struct naObj** naGC_get(struct naPool* p, int n, int* nout)&lt;br /&gt;
     globals-&amp;gt;allocCount -= n;&lt;br /&gt;
     result = (struct naObj**)(p-&amp;gt;free + p-&amp;gt;nfree);&lt;br /&gt;
     UNLOCK();&lt;br /&gt;
-    return result;&lt;br /&gt;
+    c-&amp;gt;free[type]=result;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static void markvec(naRef r)&lt;br /&gt;
diff --git a/simgear/nasal/misc.c b/simgear/nasal/misc.c&lt;br /&gt;
index dae0bfe..5caeb76 100644&lt;br /&gt;
--- a/simgear/nasal/misc.c&lt;br /&gt;
+++ b/simgear/nasal/misc.c&lt;br /&gt;
@@ -66,9 +66,7 @@ naRef naStringValue(naContext c, naRef r)&lt;br /&gt;
 naRef naNew(struct Context* c, int type)&lt;br /&gt;
 {&lt;br /&gt;
     naRef result;&lt;br /&gt;
-    if(c-&amp;gt;nfree[type] == 0)&lt;br /&gt;
-        c-&amp;gt;free[type] = naGC_get(&amp;amp;globals-&amp;gt;pools[type],&lt;br /&gt;
-                                 OBJ_CACHE_SZ, &amp;amp;c-&amp;gt;nfree[type]);&lt;br /&gt;
+    if(! c-&amp;gt;nfree[type] ) naGC_alloc(c, type, OBJ_CACHE_SZ);&lt;br /&gt;
     result = naObj(type, c-&amp;gt;free[type][--c-&amp;gt;nfree[type]]);&lt;br /&gt;
     naTempSave(c, result);&lt;br /&gt;
     return result;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disabling the current GC =&lt;br /&gt;
&lt;br /&gt;
The overhead caused by managing the memory pools and constantly scanning the  heap (mark/reap) can be examined by modifying the naGC_get() function such that it no longer uses any pool memory, but directly allocates via malloc()/naAlloc() - without ever freeing any memory (i.e. leaking). While the fgfs process will eventually get killed this way, the GC will be basically switched off.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct naObj** naGC_get(struct naPool* p, int n, int* nout)&lt;br /&gt;
{&lt;br /&gt;
    struct naObj** result;&lt;br /&gt;
    naCheckBottleneck();&lt;br /&gt;
    LOCK();&lt;br /&gt;
#define LEAKY &lt;br /&gt;
#ifndef LEAKY&lt;br /&gt;
    while(globals-&amp;gt;allocCount &amp;lt; 0 || (p-&amp;gt;nfree == 0 &amp;amp;&amp;amp; p-&amp;gt;freetop &amp;gt;= p-&amp;gt;freesz)) {&lt;br /&gt;
        globals-&amp;gt;needGC = 1;&lt;br /&gt;
        bottleneck();	&lt;br /&gt;
    }&lt;br /&gt;
    if(p-&amp;gt;nfree == 0)&lt;br /&gt;
        newBlock(p, poolsize(p)/8);&lt;br /&gt;
    n = p-&amp;gt;nfree &amp;lt; n ? p-&amp;gt;nfree : n;&lt;br /&gt;
    *nout = n;&lt;br /&gt;
    p-&amp;gt;nfree -= n;&lt;br /&gt;
    globals-&amp;gt;allocCount -= n;&lt;br /&gt;
    result = (struct naObj**)(p-&amp;gt;free + p-&amp;gt;nfree);&lt;br /&gt;
#else&lt;br /&gt;
    result = (struct naObj**) naAlloc( naTypeSize(n) );&lt;br /&gt;
#endif&lt;br /&gt;
    UNLOCK();&lt;br /&gt;
    return result;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= bottleneck() =&lt;br /&gt;
&lt;br /&gt;
[[File:NasalCheckBottleneckCallerGraph.png|thumb|450px|Callergraph of naCheckBottleneck()]]&lt;br /&gt;
[[File:NasalCheckBottleneckCallgraph.png|thumb|400px|Callgraph of naCheckBottleneck()]]&lt;br /&gt;
&lt;br /&gt;
Whenever new memory from one of the global pools is being requested via naGC_get(), naCheckBottleneck() will also be invoked:&lt;br /&gt;
&lt;br /&gt;
{{simgear source|path=simgear/nasal/gc.c|line=131}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void naCheckBottleneck()	&lt;br /&gt;
{&lt;br /&gt;
    if(globals-&amp;gt;bottleneck) { LOCK(); bottleneck(); UNLOCK(); }	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This checks if globals-&amp;gt;bottleneck is true, and if it is, it makes sure that the bottleneck() function is only invoked after acquiring a lock.&lt;br /&gt;
&lt;br /&gt;
[[File:NasalBottleneckCallgraph.png|thumb|550px|Callgraph of bottleneck()]]&lt;br /&gt;
&lt;br /&gt;
{{simgear source|path=simgear/nasal/gc.c|line=100}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// Must be called with the main lock.  Engages the &amp;quot;bottleneck&amp;quot;, where&lt;br /&gt;
// all threads will block so that one (the last one to call this&lt;br /&gt;
// function) can run alone.  This is done for GC, and also to free the&lt;br /&gt;
// list of &amp;quot;dead&amp;quot; blocks when it gets full (which is part of GC, if&lt;br /&gt;
// you think about it).&lt;br /&gt;
static void bottleneck()	&lt;br /&gt;
{&lt;br /&gt;
    struct Globals* g = globals;&lt;br /&gt;
    g-&amp;gt;bottleneck = 1;&lt;br /&gt;
    while(g-&amp;gt;bottleneck &amp;amp;&amp;amp; g-&amp;gt;waitCount &amp;lt; g-&amp;gt;nThreads - 1) {&lt;br /&gt;
        g-&amp;gt;waitCount++;&lt;br /&gt;
        UNLOCK(); naSemDown(g-&amp;gt;sem); LOCK();&lt;br /&gt;
        g-&amp;gt;waitCount--;	&lt;br /&gt;
    }&lt;br /&gt;
    if(g-&amp;gt;waitCount &amp;gt;= g-&amp;gt;nThreads - 1) {&lt;br /&gt;
        freeDead();&lt;br /&gt;
        if(g-&amp;gt;needGC) garbageCollect();&lt;br /&gt;
        if(g-&amp;gt;waitCount) naSemUp(g-&amp;gt;sem, g-&amp;gt;waitCount);&lt;br /&gt;
        g-&amp;gt;bottleneck = 0;	&lt;br /&gt;
    }	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The actual garbage collection takes place in {{simgear source|path=simgear/nasal/gc.c|line=114|text=line 114}} where dead objects from the memory pool are freed, and the garbageCollect() function is called if globals.needGC is true.&lt;br /&gt;
&lt;br /&gt;
= garbageCollect() =&lt;br /&gt;
&lt;br /&gt;
[[File:NasalGarbageCollectCallgraph.png|thumb|550px|Callgraph of garbageCollect()]]&lt;br /&gt;
&lt;br /&gt;
This is the function that does the mark/sweep part using mark() to recursively mark reachable objects, and reap() to collect unreachable objects.&lt;br /&gt;
&lt;br /&gt;
{{simgear source|path=simgear/nasal/gc.c|line=35}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// Must be called with the big lock!&lt;br /&gt;
static void garbageCollect()	&lt;br /&gt;
{&lt;br /&gt;
    int i;&lt;br /&gt;
    struct Context* c;&lt;br /&gt;
    globals-&amp;gt;allocCount = 0;&lt;br /&gt;
    c = globals-&amp;gt;allContexts;&lt;br /&gt;
    while(c) {&lt;br /&gt;
        for(i=0; i&amp;lt;NUM_NASAL_TYPES; i++)&lt;br /&gt;
            c-&amp;gt;nfree[i] = 0;&lt;br /&gt;
        for(i=0; i &amp;lt; c-&amp;gt;fTop; i++) {&lt;br /&gt;
            mark(c-&amp;gt;fStack[i].func);&lt;br /&gt;
            mark(c-&amp;gt;fStack[i].locals);&lt;br /&gt;
        }&lt;br /&gt;
        for(i=0; i &amp;lt; c-&amp;gt;opTop; i++)&lt;br /&gt;
            mark(c-&amp;gt;opStack[i]);&lt;br /&gt;
        mark(c-&amp;gt;dieArg);&lt;br /&gt;
        marktemps(c);&lt;br /&gt;
        c = c-&amp;gt;nextAll;	&lt;br /&gt;
    }&lt;br /&gt;
    mark(globals-&amp;gt;save);&lt;br /&gt;
    mark(globals-&amp;gt;symbols);&lt;br /&gt;
    mark(globals-&amp;gt;meRef);&lt;br /&gt;
    mark(globals-&amp;gt;argRef);&lt;br /&gt;
    mark(globals-&amp;gt;parentsRef);&lt;br /&gt;
    // Finally collect all the freed objects&lt;br /&gt;
    for(i=0; i&amp;lt;NUM_NASAL_TYPES; i++)&lt;br /&gt;
        reap(&amp;amp;(globals-&amp;gt;pools[i]));&lt;br /&gt;
    // Make enough space for the dead blocks we need to free during&lt;br /&gt;
    // execution.  This works out to 1 spot for every 2 live objects,&lt;br /&gt;
    // which should be limit the number of bottleneck operations&lt;br /&gt;
    // without imposing an undue burden of extra &amp;quot;freeable&amp;quot; memory.&lt;br /&gt;
    if(globals-&amp;gt;deadsz &amp;lt; globals-&amp;gt;allocCount) {&lt;br /&gt;
        globals-&amp;gt;deadsz = globals-&amp;gt;allocCount;&lt;br /&gt;
        if(globals-&amp;gt;deadsz &amp;lt; 256) globals-&amp;gt;deadsz = 256;&lt;br /&gt;
        naFree(globals-&amp;gt;deadBlocks);&lt;br /&gt;
        globals-&amp;gt;deadBlocks = naAlloc(sizeof(void*) * globals-&amp;gt;deadsz);	&lt;br /&gt;
    }&lt;br /&gt;
    globals-&amp;gt;needGC = 0;	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For each invocation of garbageCollect(), the following takes place:&lt;br /&gt;
* For each context:&lt;br /&gt;
** The counter for each type-specific pool will be reset to 0: {{simgear source|path=simgear/nasal/gc.c|line=43}}&lt;br /&gt;
** for each stack frame of the given context, all reachable locals and functions will be marked as reachable: {{simgear source|path=simgear/nasal/gc.c|line=45}}&lt;br /&gt;
** All instructions in the opcode stack will be marked as reachable from top to bottom: {{simgear source|path=simgear/nasal/gc.c|line=49}}&lt;br /&gt;
** mark(die-&amp;gt;Arg)&lt;br /&gt;
** temporary variables are marked reachable&lt;br /&gt;
* root references (constants) are marked reachable:  {{simgear source|path=simgear/nasal/gc.c|line=56}}&lt;br /&gt;
* foreach Nasal data type:&lt;br /&gt;
** unreachable objects are then collected: {{simgear source|path=simgear/nasal/gc.c|line=63}}&lt;br /&gt;
* dead blocks are freed and new memory is allocated: {{simgear source|path=simgear/nasal/gc.c|line=67}}&lt;br /&gt;
* the needGC flag is set to 0&lt;br /&gt;
&lt;br /&gt;
= mark() =&lt;br /&gt;
&lt;br /&gt;
[[File:NasalMarkCallgraph.png|thumb|400px|Callgraph of mark()]]&lt;br /&gt;
&lt;br /&gt;
All reachable objects are recursively marked using tagged naRef structures {{simgear source|path=simgear/nasal/data.h|line=50}}, so that unreachable objects can be collected (i.e. because the reftag bit is not set) and freed.&lt;br /&gt;
&lt;br /&gt;
TODO: {{simgear source|path=simgear/nasal/gc.c|line=223}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= reap() =&lt;br /&gt;
&lt;br /&gt;
[[File:NasalReapCallgraph.png|thumb|450px|Callgraph for reap()]]&lt;br /&gt;
&lt;br /&gt;
This is the collector function called by garbageCollect() which also frees elements and allocates new blocks for the specified pool:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// Collects all the unreachable objects into a free list, and&lt;br /&gt;
// allocates more space if needed.&lt;br /&gt;
static void reap(struct naPool* p)&lt;br /&gt;
{&lt;br /&gt;
    struct Block* b;&lt;br /&gt;
    int elem, freesz, total = poolsize(p);&lt;br /&gt;
    freesz = total &amp;lt; MIN_BLOCK_SIZE ? MIN_BLOCK_SIZE : total;&lt;br /&gt;
    freesz = (3 * freesz / 2) + (globals-&amp;gt;nThreads * OBJ_CACHE_SZ);&lt;br /&gt;
    if(p-&amp;gt;freesz &amp;lt; freesz) {&lt;br /&gt;
        naFree(p-&amp;gt;free0);&lt;br /&gt;
        p-&amp;gt;freesz = freesz;&lt;br /&gt;
        p-&amp;gt;free = p-&amp;gt;free0 = naAlloc(sizeof(void*) * p-&amp;gt;freesz);&lt;br /&gt;
    }&lt;br /&gt;
    p-&amp;gt;nfree = 0;&lt;br /&gt;
    p-&amp;gt;free = p-&amp;gt;free0;&lt;br /&gt;
    for(b = p-&amp;gt;blocks; b; b = b-&amp;gt;next)&lt;br /&gt;
        for(elem=0; elem &amp;lt; b-&amp;gt;size; elem++) {&lt;br /&gt;
            struct naObj* o = (struct naObj*)(b-&amp;gt;block + elem * p-&amp;gt;elemsz);&lt;br /&gt;
            if(o-&amp;gt;mark == 0)&lt;br /&gt;
                freeelem(p, o);&lt;br /&gt;
            o-&amp;gt;mark = 0;&lt;br /&gt;
        }&lt;br /&gt;
    p-&amp;gt;freetop = p-&amp;gt;nfree;&lt;br /&gt;
    // allocs of this type until the next collection&lt;br /&gt;
    globals-&amp;gt;allocCount += total/2;&lt;br /&gt;
    // Allocate more if necessary (try to keep 25-50% of the objects&lt;br /&gt;
    // available)&lt;br /&gt;
    if(p-&amp;gt;nfree &amp;lt; total/4) {&lt;br /&gt;
        int used = total - p-&amp;gt;nfree;&lt;br /&gt;
        int avail = total - used;&lt;br /&gt;
        int need = used/2 - avail;&lt;br /&gt;
        if(need &amp;gt; 0)&lt;br /&gt;
            newBlock(p, need);&lt;br /&gt;
    }	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=swapfree() =&lt;br /&gt;
[[File:NasalGC swapfreeCallgraph.png|thumb|450px|Callgraph of swapfree()]]&lt;br /&gt;
&lt;br /&gt;
= freeelem() =&lt;br /&gt;
&lt;br /&gt;
[[File:NasalFreeelemCallgraph.png|thumb|Callgraph of freeelem()]]&lt;br /&gt;
&lt;br /&gt;
Frees individual elements and adds freed pointers to the globals free list, implemented in gc.c: {{simgear source|path=simgear/nasal/gc.c|line=153}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
static void freeelem(struct naPool* p, struct naObj* o)&lt;br /&gt;
{&lt;br /&gt;
    // Clean up any intrinsic storage the object might have...&lt;br /&gt;
    switch(p-&amp;gt;type) {&lt;br /&gt;
    case T_STR:   naStr_gcclean  ((struct naStr*)  o); break;&lt;br /&gt;
    case T_VEC:   naVec_gcclean  ((struct naVec*)  o); break;&lt;br /&gt;
    case T_HASH:  naiGCHashClean ((struct naHash*) o); break;&lt;br /&gt;
    case T_CODE:  naCode_gcclean ((struct naCode*) o); break;&lt;br /&gt;
    case T_GHOST: naGhost_gcclean((struct naGhost*)o); break;	&lt;br /&gt;
    }&lt;br /&gt;
    p-&amp;gt;free[p-&amp;gt;nfree++] = o;  // ...and add it to the free list	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Type destructors =&lt;br /&gt;
Will be called by freelem(), implemented for all native Nasal types:&lt;br /&gt;
&lt;br /&gt;
* strings (T_STR):   naStr_gcclean {{simgear source|path=simgear/nasal/string.c|line=113}}&lt;br /&gt;
* vectors (T_VEC):   naVec_gcclean {{simgear source|path=simgear/nasal/vector.c|line=22}}&lt;br /&gt;
* hashes (T_HASH):  naiGCHashClean {{simgear source|path=simgear/nasal/hash.c|line=221}}&lt;br /&gt;
* code   (T_CODE):  naCode_gcclean {{simgear source|path=simgear/nasal/gc.c|line=136}}&lt;br /&gt;
* ghosts (T_GHOST): naGhost_gcclean {{simgear source|path=simgear/nasal/gc.c|line=147}}&lt;br /&gt;
&lt;br /&gt;
= Contexts =&lt;br /&gt;
&lt;br /&gt;
{{cquote|&amp;lt;nowiki&amp;gt;New nasal objects are added to a temporary&lt;br /&gt;
bin when they are created, because further allocation might cause a&lt;br /&gt;
garbage collection to happen before the code that created the object&lt;br /&gt;
can store a reference to it where the garbage collector can find it.&lt;br /&gt;
For performance and simplicity, this list is stored per-context.  When&lt;br /&gt;
the context next executes code, it clears this list.&lt;br /&gt;
&lt;br /&gt;
Here's the problem: we do a lot of our naNewXX() calls in FlightGear&lt;br /&gt;
using the old &amp;quot;global context&amp;quot; object that is created at startup.  But&lt;br /&gt;
this context is no longer used to execute scripts* at runtime, so as&lt;br /&gt;
Csaba discovered, it's temporaries are never flushed.  That&lt;br /&gt;
essentially causes a resource leak: those allocations (mostly listener&lt;br /&gt;
nodes) will never be freed.  And all the extra &amp;quot;reachable&amp;quot; Nasal data&lt;br /&gt;
floating around causes the garbage collector to take longer and longer&lt;br /&gt;
to do a full collection as time goes on, causing &amp;quot;stutter&amp;quot;.  And&lt;br /&gt;
scripts that use listeners extensively (the cmdarg() they use was one&lt;br /&gt;
of the affected allocations) will see the problem more seriously.&lt;br /&gt;
&lt;br /&gt;
(That's a feature, not a bug.  Once listeners were added, scripts &lt;br /&gt;
could be recursive: (script A sets property X which causes listener &lt;br /&gt;
L to fire and cause script B to run) We need two or more contexts on &lt;br /&gt;
the stack to handle that; a single global one won't work.)&lt;br /&gt;
&lt;br /&gt;
I didn't like the fix though.  Exposing the temporary bin as part of&lt;br /&gt;
the Nasal public API is ugly; it's an internal design feature, not&lt;br /&gt;
something users should tune.  Instead, I just hacked at the FlightGear&lt;br /&gt;
code to reinitialize this context every frame, thus cleaning it up.  A&lt;br /&gt;
&amp;quot;proper&amp;quot; fix would be to remove the global context entirely, but that&lt;br /&gt;
would touch a bunch of code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;ref&amp;gt;{{cite web |url=http://www.mail-archive.com/flightgear-devel@lists.sourceforge.net/msg13028.html|title=&amp;lt;nowiki&amp;gt;[Flightgear-devel] Stutter/Nasal issue resolved (was: FlightGear/Plib periodic stutter notes)&amp;lt;/nowiki&amp;gt;|author=&amp;lt;nowiki&amp;gt;Andy Ross&amp;lt;/nowiki&amp;gt;|date=&amp;lt;nowiki&amp;gt;Wed, 24 Oct 2007 11:33:36 -0700&amp;lt;/nowiki&amp;gt;}}&amp;lt;/ref&amp;gt;|&amp;lt;nowiki&amp;gt;Andy Ross&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{cquote|&amp;lt;nowiki&amp;gt;&lt;br /&gt;
The problem is the fact that Nasal recycles context objects - it keeps a pool of freed contexts around. At the point we shutdown Nasal, all contexts should be inactive, i.e in the free list (and they are, phew). Free-ed contexts are still considered for GC however, and there seems to be an issue that the opStack (part of the stack machine which implements the core bytecode interpreter of Nasal) doesn’t end up empty in some situations.&lt;br /&gt;
&lt;br /&gt;
So my work around is to clear the opStack (and frameStack) to zero, inside naFreeContext. This then matches the state for a new (non-recycled) context, and ensures that on the next GC cycle, items referenced by the opStack aren’t marked as in-use. (At least to me it makes sense, that a freed context - which is therefore inaccessible - shouldn’t be retaining items in its opStack into its next re-use)&lt;br /&gt;
&lt;br /&gt;
The ideal fix would be to find out *why* the opStack doesn’t return to empty ‘naturally’ before the context is freed&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;ref&amp;gt;{{cite web |url=https://sourceforge.net/p/flightgear/mailman/message/36765215/|title=&amp;lt;nowiki&amp;gt;[Flightgear-devel] Resetting Nasal (was Re: Implementing aircraft.nas in C++)&amp;lt;/nowiki&amp;gt;|author=&amp;lt;nowiki&amp;gt;James Turner&amp;lt;/nowiki&amp;gt;|date=&amp;lt;nowiki&amp;gt;2019-09-17 17:43:53&amp;lt;/nowiki&amp;gt;}}&amp;lt;/ref&amp;gt;|&amp;lt;nowiki&amp;gt;James Turner&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also see: {{flightgear source|path=src/Scripting/NasalSys.cxx}} (in FGNasalSys::update)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    // The global context is a legacy thing.  We use dynamically&lt;br /&gt;
    // created contexts for naCall() now, so that we can call them&lt;br /&gt;
    // recursively.  But there are still spots that want to use it for&lt;br /&gt;
    // naNew*() calls, which end up leaking memory because the context&lt;br /&gt;
    // only clears out its temporary vector when it's *used*.  So just&lt;br /&gt;
    // junk it and fetch a new/reinitialized one every frame.  This is&lt;br /&gt;
    // clumsy: the right solution would use the dynamic context in all&lt;br /&gt;
    // cases and eliminate _context entirely.  But that's more work,&lt;br /&gt;
    // and this works fine (yes, they say &amp;quot;New&amp;quot; and &amp;quot;Free&amp;quot;, but&lt;br /&gt;
    // they're very fast, just trust me). -Andy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Consider using coccinelle here to rewrite naContext handling in all places at once'''&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Plans]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:NasalContextStruct.png|thumb|500px|Nasal Context structure]]&lt;br /&gt;
&lt;br /&gt;
{{simgear source|path=simgear/nasal/code.h|line=76}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct Context {&lt;br /&gt;
	&lt;br /&gt;
    // Stack(s)&lt;br /&gt;
	&lt;br /&gt;
    struct Frame fStack[MAX_RECURSION];&lt;br /&gt;
	&lt;br /&gt;
    int fTop;&lt;br /&gt;
	&lt;br /&gt;
    naRef opStack[MAX_STACK_DEPTH];&lt;br /&gt;
	&lt;br /&gt;
    int opFrame; // like Frame::bp, but for C functions&lt;br /&gt;
	&lt;br /&gt;
    int opTop;&lt;br /&gt;
	&lt;br /&gt;
    int markStack[MAX_MARK_DEPTH];&lt;br /&gt;
	&lt;br /&gt;
    int markTop;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    // Free object lists, cached from the global GC&lt;br /&gt;
	&lt;br /&gt;
    struct naObj** free[NUM_NASAL_TYPES];&lt;br /&gt;
	&lt;br /&gt;
    int nfree[NUM_NASAL_TYPES];&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    // GC-findable reference point for objects that may live on the&lt;br /&gt;
	&lt;br /&gt;
    // processor (&amp;quot;real&amp;quot;) stack during execution.  naNew() places them&lt;br /&gt;
	&lt;br /&gt;
    // here, and clears the array each instruction&lt;br /&gt;
	&lt;br /&gt;
    struct naObj** temps;&lt;br /&gt;
	&lt;br /&gt;
    int ntemps;&lt;br /&gt;
	&lt;br /&gt;
    int tempsz;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    // Error handling&lt;br /&gt;
	&lt;br /&gt;
    jmp_buf jumpHandle;&lt;br /&gt;
	&lt;br /&gt;
    char error[128];&lt;br /&gt;
	&lt;br /&gt;
    naRef dieArg;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    // Sub-call lists&lt;br /&gt;
	&lt;br /&gt;
    struct Context* callParent;&lt;br /&gt;
	&lt;br /&gt;
    struct Context* callChild;&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
    // Linked list pointers in globals&lt;br /&gt;
	&lt;br /&gt;
    struct Context* nextFree;&lt;br /&gt;
	&lt;br /&gt;
    struct Context* nextAll;&lt;br /&gt;
&lt;br /&gt;
    void* userData;&lt;br /&gt;
	&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Stack frames =&lt;br /&gt;
{{simgear source|path=simgear/nasal/code.h|line=33}}&lt;br /&gt;
&lt;br /&gt;
= Tagged structures =&lt;br /&gt;
{{simgear source|path=simgear/nasal/data.h|line=84}}&lt;br /&gt;
&lt;br /&gt;
= Core allocations =&lt;br /&gt;
All core memory allocation takes place via wrappers in {{simgear source|path=simgear/nasal/misc.c|line=8|text=misc.c}}:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void naFree(void* m) { free(m); }	&lt;br /&gt;
void* naAlloc(int n) { return malloc(n); }&lt;br /&gt;
void* naRealloc(void* b, int n) { return realloc(b, n); }&lt;br /&gt;
void naBZero(void* m, int n) { memset(m, 0, n); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Core developer documentation]]&lt;br /&gt;
[[Category:Core development projects]] &lt;br /&gt;
[[Category:Nasal]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Nasal Garbage Collection]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Chat_menu&amp;diff=144564</id>
		<title>Chat menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Chat_menu&amp;diff=144564"/>
		<updated>2026-05-23T06:56:45Z</updated>

		<summary type="html">&lt;p&gt;Servo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There's a '''chat menu''' in [[FlightGear]] since v1.0.0. In this special menu are some prefabricated messages stored. They're ready to use. You don't have to write them first, just choose a message and press the corresponding number. The message is send like a normal chat messages, so all the pilots and [[ATC]]s will see it.&lt;br /&gt;
&lt;br /&gt;
You can find the Chat Menu in the [[menu|menubar]] under &amp;lt;tt&amp;gt;Multiplayer &amp;gt; Chat Menu&amp;lt;/tt&amp;gt;. The Chat Menu can also be opened with a shortcut: {{key press|-}} (minus).&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
|1= Users can type messages that are displayed to all users within MP range. The messages are displayed within a dialog box, and optionally to the screen using the current Nasal message system. This allows the messages to be TTS'd by festival.&lt;br /&gt;
|2= {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/13968945/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;[Flightgear-devel] Multiplayer chat patch&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Buchanan, Stuart&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Sep 23rd, 2006&lt;br /&gt;
  | added   = Sep 23rd, 2006&lt;br /&gt;
  | script_version = 0.23&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Editing entries ==&lt;br /&gt;
To edit the entries in the Chat Menu you've to change this file: &amp;lt;tt&amp;gt;[[$FG_ROOT]]/ATC/chat-menu-entries.xml&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
With these symbols you could add information that depends on the moment. So things like altitude, direction and aircraft type are automatically filled in at the places of the symbols.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function&lt;br /&gt;
! Symbol&lt;br /&gt;
! Discription&lt;br /&gt;
|-&lt;br /&gt;
| Airport direction&lt;br /&gt;
| !&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Airport distance&lt;br /&gt;
| ^&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Aircraft type&lt;br /&gt;
|%&lt;br /&gt;
| First word from /sim/description&lt;br /&gt;
|-&lt;br /&gt;
| Callsign&lt;br /&gt;
| #&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Current Altitude&lt;br /&gt;
| $&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Airport ID&lt;br /&gt;
| *&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Current runway&lt;br /&gt;
| (&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Here's an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;menu&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;* Ground, #, request taxi instructions for departure.&amp;lt;/name&amp;gt;    &lt;br /&gt;
  &amp;lt;/menu&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It'll looks something like this when using FlightGear:&lt;br /&gt;
&lt;br /&gt;
 '''KSFO''' Ground, '''F-WWDD''', request taxi instructions for departure.&lt;br /&gt;
&lt;br /&gt;
As you noticed in the example above I've placed some extra stuff. Every entry has to start with the &amp;lt;tt&amp;gt;&amp;lt;name&amp;gt;&amp;lt;/tt&amp;gt; tag and close with &amp;lt;tt&amp;gt;&amp;lt;/name&amp;gt;&amp;lt;/tt&amp;gt;. One row in FlightGear is one &amp;lt;menu&amp;gt;...&amp;lt;/menu&amp;gt; tag. Here's an example of the Formation menu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;menu&amp;gt;&lt;br /&gt;
     &amp;lt;name&amp;gt;[Formation]&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;menu&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Form up on my wing.&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/menu&amp;gt;&lt;br /&gt;
    &amp;lt;menu&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Break left.&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/menu&amp;gt;&lt;br /&gt;
    &amp;lt;menu&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Break right.&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/menu&amp;gt;&lt;br /&gt;
  &amp;lt;/menu&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A row extra could be formed with two &amp;lt;menu&amp;gt; tags. It'll looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;menu&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;[ATC]&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;menu&amp;gt; &lt;br /&gt;
      &amp;lt;name&amp;gt;[Ground]&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;menu&amp;gt; &lt;br /&gt;
        &amp;lt;name&amp;gt;* Ground, #, request taxi instructions for departure.&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;/menu&amp;gt;&lt;br /&gt;
    &amp;lt;/menu&amp;gt;&lt;br /&gt;
  &amp;lt;/menu&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the two examples above you see things like this &amp;lt;tt&amp;gt;[ATC]&amp;lt;/tt&amp;gt;. The [ and ] are there to indicate that the text should not be included in the messages.&lt;br /&gt;
&lt;br /&gt;
[[Category:Menubar]]&lt;br /&gt;
[[Category:FlightGear feature]]&lt;br /&gt;
[[Category:Multiplayer]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Aircraft_rating_system&amp;diff=144563</id>
		<title>Aircraft rating system</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Aircraft_rating_system&amp;diff=144563"/>
		<updated>2026-05-23T06:53:50Z</updated>

		<summary type="html">&lt;p&gt;Servo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''aircraft rating system''' is an attempt to help you find the aircraft you're looking for among the thousands of [[aircraft]] available for [[FlightGear]].&lt;br /&gt;
&lt;br /&gt;
The rating system gives an aircraft a 0–5 score in four areas - ''[[FDM]]'', ''systems'', ''cockpit'' and ''external model''.  These ratings can then be encoded in the &amp;lt;code&amp;gt;aircraft-set.xml&amp;lt;/code&amp;gt; file from where they can be picked up by launchers, web pages etc.  The sum of the scores in the four criteria provides an overall 0–20 score, which can be mapped to a textual overall aircraft status. &lt;br /&gt;
&lt;br /&gt;
{{Package Management}}&lt;br /&gt;
== Who rates an aircraft? ==&lt;br /&gt;
It is the responsibility of the aircraft maintainer/developer if there is an active one. The rating system was specifically setup to be easy for the aircraft maintainer/developer to do because it assumes that the person doing the rating is very familiar with both the real-life aircraft specifications and systems and knows how close the model is to those. The procedure is very brief, more so any update.&lt;br /&gt;
&lt;br /&gt;
It is possible for the third party to do the rating but it is a nontrivial undertaking for someone who is not intimately familiar with the real-life aircraft specifications and the FDM that would require a lot of time and effort at least for any aircraft that was at a somewhat advanced state of development. Of course early development phase aircraft would be easier to rate since the criteria for those levels does not require so much aircraft specific knowledge. Most of the unrated aircraft are probably unmaintained and many of them are probably aircraft that will end up with lower ratings if they are rated.&lt;br /&gt;
&lt;br /&gt;
If one plans to add ratings to an aircraft, a good plan is the following:&lt;br /&gt;
#Try to locate the maintainer by pinging the devel [[mailing list]] and also asking on the forum. If there is a maintainer nicely ask them to rate their aircraft.&lt;br /&gt;
#If there is a maintainer but he/she is unable or unwilling to rate the aircraft ask permission to do the work. If you get permission then make the change and ask for it to be merged into the base package.&lt;br /&gt;
#If a maintainer can not be located or the aircraft is known to be abandoned do the rating and ask for the change to be merged into the base package.&lt;br /&gt;
&lt;br /&gt;
See [[#Considerations on the rating procedure|below]] for some considerations on this rating procedure.&lt;br /&gt;
&lt;br /&gt;
== Rating criteria ==&lt;br /&gt;
=== Flight Dynamics Model (FDM) ===&lt;br /&gt;
* 0: None, or using FDM from other aircraft&lt;br /&gt;
* 1: JSBSim Aeromatic or YASim geometric model used without tuning. Flaps modeled.&lt;br /&gt;
* 2: FDM tuned for cruise configuration.&lt;br /&gt;
* 3: FDM tuned for rate of climb and cruise Pilot Operating Handbook (PoH) performance numbers&lt;br /&gt;
* 4: FDM matches PoH in 90% of configurations&lt;br /&gt;
* 5: FDM matches PoH and most known test data.&lt;br /&gt;
&lt;br /&gt;
=== Systems ===&lt;br /&gt;
* 0: No controllable systems: engine is always on, generic radio,&lt;br /&gt;
* 1: Generic engine start/stop (}}s), correct size/number of fuel tanks,  generic (untuned) autopilot, working flaps/gear&lt;br /&gt;
* 2: Working electrical system, fuel feed cockpit controls, stable autopilot&lt;br /&gt;
* 3: Accurate startup procedure, tuned autopilot with cockpit controls matching real aircraft systems, generic failure modelling (Vne, +ve/-ve G, gear limits). No unrealistic systems.&lt;br /&gt;
* 4: Primary aircraft-specific systems modelled (aero-tow, radar, GPWS, weapons, external stores). User able to follow normal PoH checklists (e.g. startup, shutdown) in entirety&lt;br /&gt;
* 5: Some aircraft-specific failure modes implemented (e.g. flame-out, inverted engine limitations). Some emergency procedures implemented (RAT, emergency gear release), able to follow some emergency PoH checklists in entirety.&lt;br /&gt;
&lt;br /&gt;
Obviously some aircraft (e.g. glider) have fewer systems than other (e.g. and airliner). If your aircraft does not have a given system, ignore it for the purposes of rating. E.g. a glider does not need a stable autopilot for a 2 rating.&lt;br /&gt;
&lt;br /&gt;
Furthermore, for a 3 or above, the aircraft should not implement systems not present in the real aircraft (e.g. flaps if none present IRL). The exception to this is an autopilot accessed through the menu (considered useful for flight testing purposes).&lt;br /&gt;
&lt;br /&gt;
=== Cockpit ===&lt;br /&gt;
* 0: No cockpit&lt;br /&gt;
* 1: 2D panel, no cockpit.&lt;br /&gt;
* 2: 2D panel in 3D cockpit, or incomplete 3D panel&lt;br /&gt;
* 3: 3D panel and cockpit&lt;br /&gt;
* 4: 3D panel and accurately modelled 3D cockpit, plain texturing. Hotspots for majority of controls.&lt;br /&gt;
* 5: 3D panel and accurately modelled 3D cockpit with photo-realistic texturing.&lt;br /&gt;
&lt;br /&gt;
=== External Model ===&lt;br /&gt;
* 0: None&lt;br /&gt;
* 1: Simple 3D model, no animations&lt;br /&gt;
* 2: Accurate 3D model with animated control surfaces (elevator, aileron, rudder, flaps)&lt;br /&gt;
* 3: Accurate 3D model with animated control surfaces, gear detailing (retraction, rotation), prop&lt;br /&gt;
* 4: Accurate 3D model with animated control surfaces, gear, prop, livery support (if applicable).&lt;br /&gt;
* 5: Highly accurate 3D model (down to minor components such as control rods), with animated control surfaces, gear, prop, livery support, tyre smoke, shader effects. &lt;br /&gt;
&lt;br /&gt;
Objectively differentiating between a 4 and a 5 is very difficult. As a guideline, a &amp;quot;5&amp;quot; model is as realistic as possible given the available rendering technology.&lt;br /&gt;
{{note | The difference between a 3 and a 4 seems to be just the livery support. I propose to add &amp;quot;detailed parts (realistic lights, exhausts, airing)&amp;quot; for a 4&lt;br /&gt;
(you are free to remove this NOTE after reviewed this proposition)}}&lt;br /&gt;
&lt;br /&gt;
== Overall status ==&lt;br /&gt;
Sum the ratings of the 4 criteria, to produce an overall score from 0 to 20.&lt;br /&gt;
&lt;br /&gt;
This maps to overall status as follows:&lt;br /&gt;
&lt;br /&gt;
* 18 or higher: [[:Category:Aircraft status: Advanced production|advanced-production]] (minimum 4 in each rating)&lt;br /&gt;
* 16 to 17: [[:Category:Aircraft status: Production|production]] (minimum 4 in each rating)&lt;br /&gt;
* 12 to 15: [[:Category:Aircraft status: Early production|early-production]] (minimum 3 in each rating)&lt;br /&gt;
* 9 to 11: [[:Category:Aircraft status: Beta|beta]]&lt;br /&gt;
* 8 or lower:[[:Category:Aircraft status: Alpha|alpha]]&lt;br /&gt;
&lt;br /&gt;
== Encoding the rating ==&lt;br /&gt;
=== In the -set.xml file ===&lt;br /&gt;
The ratings should be encoded in the -set.xml file for the aircraft, under &amp;lt;sim&amp;gt; as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;status&amp;gt;early-production&amp;lt;/status&amp;gt;&lt;br /&gt;
&amp;lt;rating&amp;gt;&lt;br /&gt;
 &amp;lt;FDM type=&amp;quot;int&amp;quot;&amp;gt;5&amp;lt;/FDM&amp;gt;&lt;br /&gt;
 &amp;lt;systems type=&amp;quot;int&amp;quot;&amp;gt;4&amp;lt;/systems&amp;gt;&lt;br /&gt;
 &amp;lt;cockpit type=&amp;quot;int&amp;quot;&amp;gt;3&amp;lt;/cockpit&amp;gt;&lt;br /&gt;
 &amp;lt;model type=&amp;quot;int&amp;quot;&amp;gt;3&amp;lt;/model&amp;gt;&lt;br /&gt;
&amp;lt;/rating&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== In aircraft articles on the wiki ===&lt;br /&gt;
Status ratings can be (optionally) included in an aircraft's wiki article. '''Please note that those posted on the wiki are only used by the wiki itself and do not substitue the rating in -set.xml, as described above!'''&lt;br /&gt;
&lt;br /&gt;
The overall status is auto-calculated and will be displayed. Remove the &amp;lt;tt&amp;gt;|status =&amp;lt;/tt&amp;gt; line if you use the official system and add the following lines, each with a rating on a scale of 0 to 5. See [[Template:Infobox Aircraft]] for more info.&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 | status-fdm     = 5&lt;br /&gt;
 | status-systems = 4&lt;br /&gt;
 | status-cockpit = 3&lt;br /&gt;
 | status-model   = 3&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
You can find the current wiki aircraft pages within each status level via the [[:Category:Aircraft by status|aircraft status category]] page.&lt;br /&gt;
&lt;br /&gt;
== Considerations on the rating procedure ==&lt;br /&gt;
Is it right that aircraft are only rated by their respective developers? Many lack a rating, and in many cases the maintainer is absent or just doesn't care. If, as originally, the rating is intended open to everyone, should unrated aircraft be rated by users? It would be reasonable for alpha development versions (they're easy to rate), but could lead to wrong ratings for the more developed ones. Yet this might incentivize their maintainers (hardly a well developed project is not maintained) to fix those, so far, unused ratings. Some insights on this were examined in the forum thread on this topic: see [http://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=12193&amp;amp;p=211086#p211086 this forum post].&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Catalog metadata]]&lt;br /&gt;
&lt;br /&gt;
=== Forum topics ===&lt;br /&gt;
Some topics on the FlightGear forum related to the background behind the aircraft rating system:&lt;br /&gt;
* [http://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=12193 Aircraft Rating System] (First post dated Thu May 26, 2011)&lt;br /&gt;
* [http://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=10080 Aircraft model/cockpit rating (see first post)] (First post dated Mon Nov 15, 2010)&lt;br /&gt;
* [http://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=9680 Discussing aircraft status's] (First post dated Sat Oct 02, 2010)&lt;br /&gt;
* [http://forum.flightgear.org/viewtopic.php?f=6&amp;amp;t=4999 Aircraft ranking on wiki] (First post dated Sat May 30, 2009)&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
[[Category:Aircraft enhancement]]&lt;br /&gt;
&lt;br /&gt;
[[ca:Sistema de qualificació d'aeronaus]]&lt;br /&gt;
[[de:Flugzeugbewertung]]&lt;br /&gt;
[[fr:Aircraft status indication]]&lt;/div&gt;</summary>
		<author><name>Servo</name></author>
	</entry>
</feed>