Initial revision
This commit is contained in:
parent
c90db01dc8
commit
14a8533f63
123 changed files with 1400 additions and 6082 deletions
339
COPYING
339
COPYING
|
@ -1,339 +0,0 @@
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
||||||
675 Mass Ave, Cambridge, MA 02139, USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
Appendix: How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) 19yy <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Library General
|
|
||||||
Public License instead of this License.
|
|
183
INSTALL
183
INSTALL
|
@ -1,183 +0,0 @@
|
||||||
Basic Installation
|
|
||||||
==================
|
|
||||||
|
|
||||||
These are generic installation instructions.
|
|
||||||
|
|
||||||
The `configure' shell script attempts to guess correct values for
|
|
||||||
various system-dependent variables used during compilation. It uses
|
|
||||||
those values to create a `Makefile' in each directory of the package.
|
|
||||||
It may also create one or more `.h' files containing system-dependent
|
|
||||||
definitions. Finally, it creates a shell script `config.status' that
|
|
||||||
you can run in the future to recreate the current configuration, a file
|
|
||||||
`config.cache' that saves the results of its tests to speed up
|
|
||||||
reconfiguring, and a file `config.log' containing compiler output
|
|
||||||
(useful mainly for debugging `configure').
|
|
||||||
|
|
||||||
If you need to do unusual things to compile the package, please try
|
|
||||||
to figure out how `configure' could check whether to do them, and mail
|
|
||||||
diffs or instructions to the address given in the `README' so they can
|
|
||||||
be considered for the next release. If at some point `config.cache'
|
|
||||||
contains results you don't want to keep, you may remove or edit it.
|
|
||||||
|
|
||||||
The file `configure.in' is used to create `configure' by a program
|
|
||||||
called `autoconf'. You only need `configure.in' if you want to change
|
|
||||||
it or regenerate `configure' using a newer version of `autoconf'.
|
|
||||||
|
|
||||||
The simplest way to compile this package is:
|
|
||||||
|
|
||||||
1. `cd' to the directory containing the package's source code and type
|
|
||||||
`./configure' to configure the package for your system. If you're
|
|
||||||
using `csh' on an old version of System V, you might need to type
|
|
||||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
|
||||||
`configure' itself.
|
|
||||||
|
|
||||||
Running `configure' takes awhile. While running, it prints some
|
|
||||||
messages telling which features it is checking for.
|
|
||||||
|
|
||||||
2. Type `make' to compile the package.
|
|
||||||
|
|
||||||
3. Optionally, type `make check' to run any self-tests that come with
|
|
||||||
the package.
|
|
||||||
|
|
||||||
4. Type `make install' to install the programs and any data files and
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
5. You can remove the program binaries and object files from the
|
|
||||||
source code directory by typing `make clean'. To also remove the
|
|
||||||
files that `configure' created (so you can compile the package for
|
|
||||||
a different kind of computer), type `make distclean'. There is
|
|
||||||
also a `make maintainer-clean' target, but that is intended mainly
|
|
||||||
for the package's developers. If you use it, you may have to get
|
|
||||||
all sorts of other programs in order to regenerate files that came
|
|
||||||
with the distribution.
|
|
||||||
|
|
||||||
Compilers and Options
|
|
||||||
=====================
|
|
||||||
|
|
||||||
Some systems require unusual options for compilation or linking that
|
|
||||||
the `configure' script does not know about. You can give `configure'
|
|
||||||
initial values for variables by setting them in the environment. Using
|
|
||||||
a Bourne-compatible shell, you can do that on the command line like
|
|
||||||
this:
|
|
||||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
|
|
||||||
|
|
||||||
Or on systems that have the `env' program, you can do it like this:
|
|
||||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
|
|
||||||
|
|
||||||
Compiling For Multiple Architectures
|
|
||||||
====================================
|
|
||||||
|
|
||||||
You can compile the package for more than one kind of computer at the
|
|
||||||
same time, by placing the object files for each architecture in their
|
|
||||||
own directory. To do this, you must use a version of `make' that
|
|
||||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
|
||||||
directory where you want the object files and executables to go and run
|
|
||||||
the `configure' script. `configure' automatically checks for the
|
|
||||||
source code in the directory that `configure' is in and in `..'.
|
|
||||||
|
|
||||||
If you have to use a `make' that does not supports the `VPATH'
|
|
||||||
variable, you have to compile the package for one architecture at a time
|
|
||||||
in the source code directory. After you have installed the package for
|
|
||||||
one architecture, use `make distclean' before reconfiguring for another
|
|
||||||
architecture.
|
|
||||||
|
|
||||||
Installation Names
|
|
||||||
==================
|
|
||||||
|
|
||||||
By default, `make install' will install the package's files in
|
|
||||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
|
||||||
installation prefix other than `/usr/local' by giving `configure' the
|
|
||||||
option `--prefix=PATH'.
|
|
||||||
|
|
||||||
You can specify separate installation prefixes for
|
|
||||||
architecture-specific files and architecture-independent files. If you
|
|
||||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
|
||||||
PATH as the prefix for installing programs and libraries.
|
|
||||||
Documentation and other data files will still use the regular prefix.
|
|
||||||
|
|
||||||
In addition, if you use an unusual directory layout you can give
|
|
||||||
options like `--bindir=PATH' to specify different values for particular
|
|
||||||
kinds of files. Run `configure --help' for a list of the directories
|
|
||||||
you can set and what kinds of files go in them.
|
|
||||||
|
|
||||||
If the package supports it, you can cause programs to be installed
|
|
||||||
with an extra prefix or suffix on their names by giving `configure' the
|
|
||||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
|
||||||
|
|
||||||
Optional Features
|
|
||||||
=================
|
|
||||||
|
|
||||||
Some packages pay attention to `--enable-FEATURE' options to
|
|
||||||
`configure', where FEATURE indicates an optional part of the package.
|
|
||||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
|
||||||
is something like `gnu-as' or `x' (for the X Window System). The
|
|
||||||
`README' should mention any `--enable-' and `--with-' options that the
|
|
||||||
package recognizes.
|
|
||||||
|
|
||||||
For packages that use the X Window System, `configure' can usually
|
|
||||||
find the X include and library files automatically, but if it doesn't,
|
|
||||||
you can use the `configure' options `--x-includes=DIR' and
|
|
||||||
`--x-libraries=DIR' to specify their locations.
|
|
||||||
|
|
||||||
Specifying the System Type
|
|
||||||
==========================
|
|
||||||
|
|
||||||
There may be some features `configure' can not figure out
|
|
||||||
automatically, but needs to determine by the type of host the package
|
|
||||||
will run on. Usually `configure' can figure that out, but if it prints
|
|
||||||
a message saying it can not guess the host type, give it the
|
|
||||||
`--host=TYPE' option. TYPE can either be a short name for the system
|
|
||||||
type, such as `sun4', or a canonical name with three fields:
|
|
||||||
CPU-COMPANY-SYSTEM
|
|
||||||
|
|
||||||
See the file `config.sub' for the possible values of each field. If
|
|
||||||
`config.sub' isn't included in this package, then this package doesn't
|
|
||||||
need to know the host type.
|
|
||||||
|
|
||||||
If you are building compiler tools for cross-compiling, you can also
|
|
||||||
use the `--target=TYPE' option to select the type of system they will
|
|
||||||
produce code for and the `--build=TYPE' option to select the type of
|
|
||||||
system on which you are compiling the package.
|
|
||||||
|
|
||||||
Sharing Defaults
|
|
||||||
================
|
|
||||||
|
|
||||||
If you want to set default values for `configure' scripts to share,
|
|
||||||
you can create a site shell script called `config.site' that gives
|
|
||||||
default values for variables like `CC', `cache_file', and `prefix'.
|
|
||||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
|
||||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
|
||||||
`CONFIG_SITE' environment variable to the location of the site script.
|
|
||||||
A warning: not all `configure' scripts look for a site script.
|
|
||||||
|
|
||||||
Operation Controls
|
|
||||||
==================
|
|
||||||
|
|
||||||
`configure' recognizes the following options to control how it
|
|
||||||
operates.
|
|
||||||
|
|
||||||
`--cache-file=FILE'
|
|
||||||
Use and save the results of the tests in FILE instead of
|
|
||||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
|
|
||||||
debugging `configure'.
|
|
||||||
|
|
||||||
`--help'
|
|
||||||
Print a summary of the options to `configure', and exit.
|
|
||||||
|
|
||||||
`--quiet'
|
|
||||||
`--silent'
|
|
||||||
`-q'
|
|
||||||
Do not print messages saying which checks are being made. To
|
|
||||||
suppress all normal output, redirect it to `/dev/null' (any error
|
|
||||||
messages will still be shown).
|
|
||||||
|
|
||||||
`--srcdir=DIR'
|
|
||||||
Look for the package's source code in directory DIR. Usually
|
|
||||||
`configure' can determine that directory automatically.
|
|
||||||
|
|
||||||
`--version'
|
|
||||||
Print the version of Autoconf used to generate the `configure'
|
|
||||||
script, and exit.
|
|
||||||
|
|
||||||
`configure' also accepts some other, not widely useful, options.
|
|
||||||
|
|
103
Makefile.am
103
Makefile.am
|
@ -1,103 +0,0 @@
|
||||||
SUBDIRS = Include Lib Simulator Tools Tests
|
|
||||||
|
|
||||||
EXTRA_DIST = FG-FAQ.v3 README.Unix README.Linux README.MacOS README.Win32 \
|
|
||||||
README.Win32-X README.autoconf README.gfc README.gpc README.plib \
|
|
||||||
README.running Thanks VERSION acsite.m4 acconfig.h irix-hack.pl
|
|
||||||
|
|
||||||
dist-hook:
|
|
||||||
tar cf - Hints | (cd $(distdir); tar xvf -)
|
|
||||||
tar cf - Simulator/FDM/JSBsim/aircraft Simulator/FDM/JSBsim/engine | (cd $(distdir); tar xvf -)
|
|
||||||
|
|
||||||
|
|
||||||
##########################################################################
|
|
||||||
# extra targets to do various things ...
|
|
||||||
#
|
|
||||||
# Use "make <target>"
|
|
||||||
##########################################################################
|
|
||||||
|
|
||||||
|
|
||||||
# make the base distribution with textures, sounds and a bit of
|
|
||||||
# scenery, and all the other associated files
|
|
||||||
|
|
||||||
fgfs-base: fgfs-base-tar fgfs-base-zip
|
|
||||||
|
|
||||||
fgfs-base-tar:
|
|
||||||
(cd $(HOME); \
|
|
||||||
tar czvf fgfs-base-$(VERSION).tar.gz \
|
|
||||||
FlightGear/[A-CE-R]* \
|
|
||||||
FlightGear/Scenery/w120n30/w111n33 \
|
|
||||||
FlightGear/Sounds \
|
|
||||||
FlightGear/Textures FlightGear/Thanks \
|
|
||||||
FlightGear/[m-r]* )
|
|
||||||
|
|
||||||
fgfs-base-zip:
|
|
||||||
(cd $(HOME); \
|
|
||||||
zip -r fgfs-base-$(VERSION).zip \
|
|
||||||
FlightGear/[A-CE-R]* \
|
|
||||||
FlightGear/Scenery/w120n30/w111n33 \
|
|
||||||
FlightGear/Sounds \
|
|
||||||
FlightGear/Textures FlightGear/Thanks \
|
|
||||||
FlightGear/[m-r]* )
|
|
||||||
|
|
||||||
|
|
||||||
# make the documentation distribution
|
|
||||||
|
|
||||||
fgfs-docs: fgfs-docs-tar fgfs-manual-zip
|
|
||||||
|
|
||||||
fgfs-docs-tar:
|
|
||||||
( cd .. ; \
|
|
||||||
tar czvf fgfs-docs-$(VERSION).tar.gz FlightGear/Docs )
|
|
||||||
|
|
||||||
# fgfs-docs-zip:
|
|
||||||
# ( cd .. ; \
|
|
||||||
# zip -r fgfs-docs-$(VERSION).zip FlightGear/Docs )
|
|
||||||
|
|
||||||
fgfs-manual-zip:
|
|
||||||
( cd .. ; \
|
|
||||||
zip -r fgfs-manual-$(VERSION).zip FlightGear/Docs/InstallGuide )
|
|
||||||
|
|
||||||
# make the win32-bin distribution
|
|
||||||
|
|
||||||
fgfs-win32-bin:
|
|
||||||
(cd $(HOME); \
|
|
||||||
zip -r fgfs-win32-bin-$(VERSION).zip FlightGear/bin )
|
|
||||||
|
|
||||||
# make the win32-libs distribution (depricated)
|
|
||||||
win32-libs:
|
|
||||||
( zip -r ../win32-libs-$(VERSION).zip Win32/Makefile \
|
|
||||||
Win32/README.glut Win32/cygwinb1.dll Win32/def \
|
|
||||||
Win32/*.exp Win32/gen-def-from-errors.pl \
|
|
||||||
Win32/glut.dll Win32/glut32.dll Win32/impdef.cpp \
|
|
||||||
Win32/impdef.exe Win32/include \
|
|
||||||
Win32/install.exe \
|
|
||||||
Win32/lib Win32/zlib.lib )
|
|
||||||
|
|
||||||
# make the MacOS (MWCWP3) devel support archive
|
|
||||||
macos-devel:
|
|
||||||
( cd ..; zip -r MWCWP3_Support.zip FlightGear/MWCWP3_Support )
|
|
||||||
|
|
||||||
# clean up dependencies
|
|
||||||
clean-deps:
|
|
||||||
rm -rf .deps \
|
|
||||||
Lib/.deps Simulator/.deps Tools/.deps Test/.deps \
|
|
||||||
Lib/*/.deps Simulator/*/.deps Tools/*/.deps \
|
|
||||||
Lib/*/*/.deps Simulator/*/*/.deps Tools/*/*/.deps \
|
|
||||||
Lib/*/*/*/.deps Lib/*/*/*/*/.deps \
|
|
||||||
Tests/.deps
|
|
||||||
|
|
||||||
# clean up after libtool
|
|
||||||
clean-libs:
|
|
||||||
rm -rf .libs Lib/.libs Simulator/.libs Tools/.libs \
|
|
||||||
Lib/*/.libs Simulator/*/.libs Tools/*/.libs \
|
|
||||||
Lib/*/*/.libs Simulator/*/*/.libs Tools/*/*/.libs
|
|
||||||
rm -f Simulator/*/so_locations Lib/*/so_locations \
|
|
||||||
Simulator/*/*/so_locations Lib/*/*/so_locations
|
|
||||||
|
|
||||||
# clean up after winbloze spews random case for file names :-(
|
|
||||||
clean-winbloze: clean-deps clean-libs
|
|
||||||
rm -f makefile Include/makefile Lib/makefile Simulator/makefile \
|
|
||||||
Tools/makefile \
|
|
||||||
Lib/*/makefile Simulator/*/makefile Tools/*/makefile \
|
|
||||||
Lib/*/*/makefile Simulator/*/*/makefile Tools/*/*/makefile \
|
|
||||||
Tests/makefile
|
|
||||||
rm -f Src/Main/fg.exe Tools/*/*.exe
|
|
32
NEWS
32
NEWS
|
@ -1,35 +1,3 @@
|
||||||
New in 0.6.2
|
|
||||||
* MSVC++ and FreeBSD portability enhancements.
|
|
||||||
* MACos fixes.
|
|
||||||
* JSBsim updates.
|
|
||||||
* c172 updates.
|
|
||||||
|
|
||||||
New in 0.6.1
|
|
||||||
* Tony Peden contributed a c172 flight model replacement for the
|
|
||||||
Navion. Still needs to be debugged a bit before it is usable.
|
|
||||||
* More MacOS portability fixes.
|
|
||||||
* More Borland C++ fixes.
|
|
||||||
* More IRIX fixes.
|
|
||||||
* Fixed a bug in handling windows drive letter, colon "C:" notation.
|
|
||||||
* Minor tweaks to the Astro sub section contributed by Durk Talsma.
|
|
||||||
* GUI updated contributed by Norman Vine.
|
|
||||||
* Fixed a problem with ambiguous constructors in the fgText class.
|
|
||||||
* Updates to JSBsim contributed by Jon Berndt.
|
|
||||||
* Created a tile load queue so that we only load one tile per frame.
|
|
||||||
This isn't entirely satisfactory, but it reduces the length of the
|
|
||||||
pause when crossing a tile boundary with several shorter pauses.
|
|
||||||
* Fixed bug with passing PUI keystrokes on to glut.
|
|
||||||
* Fixed a bug in tilecache size which caused occasional tiles to drop
|
|
||||||
out when more than one row is scheduled "simultaneously".
|
|
||||||
* Changes to scenery building tools to handle sliver detection and
|
|
||||||
resolution.
|
|
||||||
* Fixed several other minor bugs in the scenery creation tools.
|
|
||||||
* Added urban area support to scenery creation tools.
|
|
||||||
* Made the parallel scenery building tools a bit more robust if a
|
|
||||||
requested client machine happens to be offline by pinging it first
|
|
||||||
to see if it is alive.
|
|
||||||
* Added support for libgpc's new hole tracking interface.
|
|
||||||
|
|
||||||
New in 0.6.0
|
New in 0.6.0
|
||||||
* Tons of improvements with scenery creation. Inter-tile gaps have been
|
* Tons of improvements with scenery creation. Inter-tile gaps have been
|
||||||
fixed, distorted textures have been fixed, real coastlines have been added,
|
fixed, distorted textures have been fixed, real coastlines have been added,
|
||||||
|
|
57
README.Linux
57
README.Linux
|
@ -8,9 +8,9 @@ FlightGear up and running under Linux.
|
||||||
|
|
||||||
You need to understand the concepts of 3D acceleration under Linux and
|
You need to understand the concepts of 3D acceleration under Linux and
|
||||||
the needed libraries. An excellent source of information is the "Linux
|
the needed libraries. An excellent source of information is the "Linux
|
||||||
Quake-HOWTO" which can be found at
|
3Dfx HOWTO" which can be found at
|
||||||
|
|
||||||
http://www.linuxquake.com
|
http://www.gamers.org/dEngine/xf3D/howto/3Dfx-HOWTO.html
|
||||||
|
|
||||||
If anything seem to be wrong with your 3D setup, check there first!
|
If anything seem to be wrong with your 3D setup, check there first!
|
||||||
|
|
||||||
|
@ -49,45 +49,6 @@ need"
|
||||||
grabbed the latest version of mesa, you should have everything you
|
grabbed the latest version of mesa, you should have everything you
|
||||||
need.
|
need.
|
||||||
|
|
||||||
Alternatively, you can use the 3D-stuff that came along with your
|
|
||||||
Linux distribution. At least RedHat (5.3 and later) and S.u.S.E. 6.0
|
|
||||||
(or later) contain all the things you need.
|
|
||||||
|
|
||||||
- (optional) the 3DFX kernel module.
|
|
||||||
|
|
||||||
Without this thingy installed, access to your accelerator board
|
|
||||||
needs to be SUID root, which bad practice (and a _huge_ security
|
|
||||||
hole). Get the 3DFX module from
|
|
||||||
|
|
||||||
http://www.xs4all.nl/~carlo17/3dfx/index.html
|
|
||||||
|
|
||||||
and install it:
|
|
||||||
|
|
||||||
mkdir 3dfx
|
|
||||||
cd 3dfx
|
|
||||||
tar xvfz ../Dev3Dfx-2.7.tar.gz
|
|
||||||
make
|
|
||||||
cp 3dfx.o /lib/modules/`uname -r`/misc
|
|
||||||
mknod /dev/3dfx c 107 0
|
|
||||||
insmod 3dfx
|
|
||||||
|
|
||||||
alternatively, you can get the RPM from there ind use rpm for
|
|
||||||
installation.
|
|
||||||
|
|
||||||
- Steve Baker's plib library.
|
|
||||||
|
|
||||||
get it from
|
|
||||||
|
|
||||||
http://www.woodsoup.org/projs/plib/
|
|
||||||
|
|
||||||
and follow the instructions in README.plib.
|
|
||||||
|
|
||||||
- (optional) the gpc and gfc libraries.
|
|
||||||
|
|
||||||
Read the README.g[fp]c files to understand what they are good for
|
|
||||||
and decide whether you need to download them. If you don't want to
|
|
||||||
build your own sceneries, you might not need them.
|
|
||||||
|
|
||||||
2. Build FlightGear:
|
2. Build FlightGear:
|
||||||
|
|
||||||
You will need the following files:
|
You will need the following files:
|
||||||
|
@ -133,9 +94,15 @@ This will install the binaries in /usr/local/bin. Notice that the name
|
||||||
of the FlightGear binary is "fgfs".
|
of the FlightGear binary is "fgfs".
|
||||||
|
|
||||||
Another problem with Linux/Glide is permission-related. All programs
|
Another problem with Linux/Glide is permission-related. All programs
|
||||||
accessing the Accelerator board need root permissions (or the kernel
|
accessing the Accelerator board need root permissions. The solution is
|
||||||
module mentioned above installed). I _strongly_ recommend the latter.
|
either to play as root or make the /usr/local/bin/fgfs binary "setuid
|
||||||
|
root", i.e. when this binary is run root priviledges are given. Do
|
||||||
|
this by issuing (as root)
|
||||||
|
|
||||||
|
chmod +s /usr/local/bin/fgfs
|
||||||
|
|
||||||
|
A solution for this problem is upcoming, keep an eye on the 3Dfx
|
||||||
|
website.
|
||||||
|
|
||||||
3. Install the data files
|
3. Install the data files
|
||||||
|
|
||||||
|
@ -228,6 +195,4 @@ adjusted for your specific architecture:
|
||||||
|
|
||||||
export CFLAGS="-mieee -mcpu=ev56 -Wa,-m21164a -pipe -g"
|
export CFLAGS="-mieee -mcpu=ev56 -Wa,-m21164a -pipe -g"
|
||||||
export CXXFLAGS="-mieee -mcpu=ev56 -Wa,-m21164a -pipe -g"
|
export CXXFLAGS="-mieee -mcpu=ev56 -Wa,-m21164a -pipe -g"
|
||||||
./configure
|
./configure
|
||||||
|
|
||||||
|
|
2
Thanks
2
Thanks
|
@ -136,7 +136,7 @@ Bob Kuehne <rpk@sgi.com>
|
||||||
Redid the Makefile system so it is simpler and more robust.
|
Redid the Makefile system so it is simpler and more robust.
|
||||||
|
|
||||||
|
|
||||||
WoodSoup Project http://www.woodsoup.org
|
Vasily Lewis <vlewis@woodsoup.org> http://www.woodsoup.org
|
||||||
Provided computing resources and services so that the Flight Gear
|
Provided computing resources and services so that the Flight Gear
|
||||||
project could have real home. This includes, web services, ftp services
|
project could have real home. This includes, web services, ftp services
|
||||||
shell accounts, email lists, dns services, etc.
|
shell accounts, email lists, dns services, etc.
|
||||||
|
|
0
config.guess
vendored
Executable file → Normal file
0
config.guess
vendored
Executable file → Normal file
0
config.sub
vendored
Executable file → Normal file
0
config.sub
vendored
Executable file → Normal file
357
configure.in
357
configure.in
|
@ -1,357 +0,0 @@
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
|
||||||
dnl
|
|
||||||
dnl The basis for this file was generated by autoscan(1) [pere 1998-03-19]
|
|
||||||
dnl
|
|
||||||
dnl $Id$
|
|
||||||
|
|
||||||
AC_INIT(Simulator/Aircraft/aircraft.cxx)
|
|
||||||
|
|
||||||
dnl Initialize the automake stuff
|
|
||||||
AM_INIT_AUTOMAKE(FlightGear, 0.6.2)
|
|
||||||
|
|
||||||
dnl configure other independant packages included with flight gear for
|
|
||||||
dnl convenience
|
|
||||||
dnl AC_CONFIG_SUBDIRS( Lib/plib )
|
|
||||||
|
|
||||||
dnl Checks for programs.
|
|
||||||
AC_PROG_MAKE_SET
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_PROG_CXX
|
|
||||||
AC_PROG_RANLIB
|
|
||||||
AC_PROG_INSTALL
|
|
||||||
AC_PROG_LN_S
|
|
||||||
|
|
||||||
dnl Initialize libtool
|
|
||||||
dnl AM_PROG_LIBTOOL
|
|
||||||
|
|
||||||
dnl Initialize maintainer mode
|
|
||||||
dnl AM_MAINTAINER_MODE
|
|
||||||
|
|
||||||
dnl This is needed for AC_TRY_COMPILE later
|
|
||||||
dnl AC_ISC_POSIX
|
|
||||||
|
|
||||||
dnl Check to see if this `configure' is being run in the `Cygwin32' environment
|
|
||||||
dnl AM_CYGWIN32
|
|
||||||
|
|
||||||
dnl Specify if we want logging (testing build) or not (release build)
|
|
||||||
# set logging default value
|
|
||||||
# with_logging=yes
|
|
||||||
AC_ARG_WITH(logging, [ --with-logging Include logging output (default)])
|
|
||||||
if test "x$with_logging" = "xno" ; then
|
|
||||||
AC_DEFINE(FG_NDEBUG)
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
dnl specify if we are building with "checker"
|
|
||||||
AC_ARG_WITH(efence, [ --with-efence Specify if we are building with "electric-fence"])
|
|
||||||
|
|
||||||
if test "x$with_efence" = "xyes" ; then
|
|
||||||
echo "Building with efence"
|
|
||||||
LIBS= "$LIBS -lefence"
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl specify the compiled flight model
|
|
||||||
AC_ARG_WITH(flight-model, [ --with-flight-model=xxx Specify the flight model (navion, c172)])
|
|
||||||
|
|
||||||
if test "x$with_flight_model" = "xc172" ; then
|
|
||||||
echo "Building with c172 flight model"
|
|
||||||
else
|
|
||||||
echo "Building with navion flight model"
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(ENABLE_C172, test "x$with_flight_model" = "xc172")
|
|
||||||
|
|
||||||
dnl Let the Win32 user specify if they want to build with the SGI
|
|
||||||
dnl opengl.dll as opposed to the more standard openg32.dll
|
|
||||||
AC_ARG_WITH(sgi-opengl, [ --with-sgi-opengl Build against SGI's opengl.dll glu.dll and glut.dll])
|
|
||||||
|
|
||||||
dnl Check for MS Windows environment
|
|
||||||
AC_CHECK_HEADER(windows.h)
|
|
||||||
|
|
||||||
dnl extra library and include directories
|
|
||||||
EXTRA_DIRS="/usr/local /usr/X11R6"
|
|
||||||
|
|
||||||
if test -d /opt/X11R6 ; then
|
|
||||||
EXTRA_DIRS="$EXTRA_DIRS /opt/X11R6"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$ac_cv_header_windows_h" = "xyes" ; then
|
|
||||||
EXTRA_DIRS="${EXTRA_DIRS} `pwd`/Win32"
|
|
||||||
# elif test `uname -s` = "SunOS" ; then
|
|
||||||
# EXTRA_DIRS="${EXTRA_DIRS} `pwd`/SunOS"
|
|
||||||
fi
|
|
||||||
wi_EXTRA_DIRS(no, ${EXTRA_DIRS})
|
|
||||||
|
|
||||||
dnl Check for "plib" without which we cannot go on
|
|
||||||
AC_CHECK_HEADER(plib/pu.h)
|
|
||||||
if test "x$ac_cv_header_plib_pu_h" != "xyes"; then
|
|
||||||
echo
|
|
||||||
echo "You *must* have the plib library installed on your system to build"
|
|
||||||
echo "the FGFS simulator!"
|
|
||||||
echo
|
|
||||||
echo "Please see README.plib for more details."
|
|
||||||
echo
|
|
||||||
echo "configure aborted."
|
|
||||||
exit
|
|
||||||
AM_CONDITIONAL(ENABLE_PLIB_JOYSTICK, false )
|
|
||||||
else
|
|
||||||
dnl Use plib joystick lib
|
|
||||||
AM_CONDITIONAL(ENABLE_PLIB_JOYSTICK, true )
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Using AM_CONDITIONAL is a step out of the protected little
|
|
||||||
dnl automake fold so it is potentially dangerous. But, we are
|
|
||||||
dnl beginning to run into cases where the standard checks are not
|
|
||||||
dnl enough. AM_CONDITIONALS are then referenced to conditionally
|
|
||||||
dnl build a Makefile.in from a Makefile.am which lets us define custom
|
|
||||||
dnl includes, compile alternative source files, etc.
|
|
||||||
|
|
||||||
dnl Check for external variables daylight and timezone.
|
|
||||||
AC_EXT_DAYLIGHT
|
|
||||||
AM_CONDITIONAL(HAVE_DAYLIGHT, test "$have_daylight" = yes )
|
|
||||||
|
|
||||||
AC_EXT_TIMEZONE
|
|
||||||
AM_CONDITIONAL(HAVE_TIMEZONE, test "$have_timezone" = yes )
|
|
||||||
|
|
||||||
dnl Check for Linux style audio support
|
|
||||||
AM_CONDITIONAL(ENABLE_AUDIO_SUPPORT, \
|
|
||||||
test -r /usr/include/soundcard.h \
|
|
||||||
-o -r /usr/include/linux/soundcard.h \
|
|
||||||
-o -r /usr/include/machine/soundcard.h \
|
|
||||||
-o -r /usr/include/audio.h \
|
|
||||||
-o "x$ac_cv_header_windows_h" = "xyes" )
|
|
||||||
|
|
||||||
AM_CONDITIONAL(ENABLE_IRIX_AUDIO, test -r /usr/include/audio.h)
|
|
||||||
|
|
||||||
AM_CONDITIONAL(ENABLE_WIN32_AUDIO, test "x$ac_cv_header_windows_h" = "xyes")
|
|
||||||
|
|
||||||
dnl Enable serial support on Unix type systems
|
|
||||||
AM_CONDITIONAL(ENABLE_UNIX_SERIAL, true)
|
|
||||||
|
|
||||||
dnl Check for X11 (fancy)
|
|
||||||
AC_PATH_XTRA
|
|
||||||
|
|
||||||
dnl Checks for libraries.
|
|
||||||
|
|
||||||
null_LIBS="$LIBS"
|
|
||||||
|
|
||||||
AC_CHECK_LIB(m, cos)
|
|
||||||
|
|
||||||
base_LIBS="$LIBS"
|
|
||||||
|
|
||||||
AC_CHECK_LIB(socket, socket)
|
|
||||||
AC_CHECK_LIB(X11, XCreateWindow)
|
|
||||||
AC_CHECK_LIB(Xext, XShmCreateImage)
|
|
||||||
AC_CHECK_LIB(Xi, XGetExtensionVersion)
|
|
||||||
AC_CHECK_LIB(ICE, IceOpenConnection)
|
|
||||||
AC_CHECK_LIB(SM, SmcOpenConnection)
|
|
||||||
AC_CHECK_LIB(Xt, XtMalloc)
|
|
||||||
AC_CHECK_LIB(Xmu, XmuLookupStandardColormap)
|
|
||||||
|
|
||||||
dnl check for OpenGL related libraries
|
|
||||||
|
|
||||||
if test "x$ac_cv_header_windows_h" != "xyes" ; then
|
|
||||||
dnl Reasonable stuff for non-windoze variants ... :-)
|
|
||||||
|
|
||||||
AC_CHECK_LIB(GLcore, glNewList)
|
|
||||||
if test "x$ac_cv_lib_GLcore_glNewList" = "xno" ; then
|
|
||||||
dnl if no GLcore, check for GL
|
|
||||||
AC_CHECK_LIB(GL, glNewList)
|
|
||||||
if test "x$ac_cv_lib_GL_glNewList" = "xno" ; then
|
|
||||||
dnl if no GL, check for MesaGL
|
|
||||||
AC_CHECK_LIB(MesaGL, glNewList)
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
dnl if GLcore found, then also check for GL
|
|
||||||
AC_CHECK_LIB(GL, glXCreateContext)
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl if using mesa, check for xmesa.h
|
|
||||||
if test "x$ac_cv_lib_MesaGL_glNewList" = "xyes" ; then
|
|
||||||
AC_CHECK_HEADER(GL/xmesa.h)
|
|
||||||
AM_CONDITIONAL(ENABLE_XMESA_FX, \
|
|
||||||
test "x$ac_cv_header_GL_xmesa_h" = "xyes")
|
|
||||||
else
|
|
||||||
dnl force a failed check
|
|
||||||
AM_CONDITIONAL(ENABLE_XMESA_FX, test "no" = "yes")
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_LIB(GLU, gluLookAt)
|
|
||||||
if test "x$ac_cv_lib_GLU_gluLookAt" = "xno" ; then
|
|
||||||
dnl if no GLU, check for MesaGLU
|
|
||||||
AC_CHECK_LIB(MesaGLU, gluLookAt)
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl check for glut
|
|
||||||
AC_CHECK_LIB(glut, glutGetModifiers)
|
|
||||||
|
|
||||||
dnl test for glutGameModeString, but avoid adding glut a second time into
|
|
||||||
dnl the list of libraries
|
|
||||||
save_LIBS="$LIBS"
|
|
||||||
AC_CHECK_LIB(glut, glutGameModeString)
|
|
||||||
LIBS="$save_LIBS"
|
|
||||||
else
|
|
||||||
dnl Win32 is a little wierd because it has to try to handle the various
|
|
||||||
dnl winbloze-isms. We'll just do this manually for now.
|
|
||||||
|
|
||||||
echo Win32 specific hacks...
|
|
||||||
AC_DEFINE(WIN32)
|
|
||||||
|
|
||||||
dnl force a failed check since we will be building under windoze
|
|
||||||
AM_CONDITIONAL(ENABLE_XMESA_FX, test "no" = "yes")
|
|
||||||
|
|
||||||
dnl just define these to true and hope for the best
|
|
||||||
ac_cv_lib_glut_glutGetModifiers="yes"
|
|
||||||
ac_cv_lib_glut_glutGameModeString="yes"
|
|
||||||
|
|
||||||
if test "x$with_sgi_opengl" = "xyes" ; then
|
|
||||||
echo "Building with glut.dll, glu.dll, and opengl.dll"
|
|
||||||
WIN32_GLUT=glut
|
|
||||||
WIN32_GLU=glu
|
|
||||||
WIN32_OPENGL=opengl
|
|
||||||
else
|
|
||||||
echo "Building with glut32.dll, glu32.dll, and opengl32.dll"
|
|
||||||
WIN32_GLUT=glut32
|
|
||||||
WIN32_GLU=glu32
|
|
||||||
WIN32_OPENGL=opengl32
|
|
||||||
fi
|
|
||||||
|
|
||||||
LIBS="$LIBS -l${WIN32_GLUT} -l${WIN32_GLU} -l${WIN32_OPENGL}"
|
|
||||||
LIBS="$LIBS -luser32 -lgdi32"
|
|
||||||
echo "Will link apps with $LIBS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$ac_cv_lib_glut_glutGetModifiers" = "xno"; then
|
|
||||||
echo
|
|
||||||
echo "Unable to find the necessary OpenGL or GLUT libraries."
|
|
||||||
echo "See config.log for automated test details and results ..."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$ac_cv_lib_glut_glutGameModeString" = "xno"; then
|
|
||||||
echo
|
|
||||||
echo "Your version of glut doesn't support game mode."
|
|
||||||
echo "You need to fetch and install the latest version of glut from:"
|
|
||||||
echo
|
|
||||||
echo " http://reality.sgi.com/opengl/glut3/glut3.html"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
opengl_LIBS="$LIBS"
|
|
||||||
LIBS="$base_LIBS"
|
|
||||||
|
|
||||||
AC_SUBST(base_LIBS)
|
|
||||||
AC_SUBST(opengl_LIBS)
|
|
||||||
|
|
||||||
AM_CONDITIONAL(HAVE_XWINDOWS, test "x$ac_cv_lib_X11_XCreateWindow" = "xyes" )
|
|
||||||
|
|
||||||
dnl Check if Generic Polygon Clipping library is installed
|
|
||||||
dnl (from http://www.cs.man.ac.uk/aig/staff/alan/software/)
|
|
||||||
AC_CHECK_HEADERS( gpc.h )
|
|
||||||
if test "x$ac_cv_header_gpc_h" != "xyes"; then
|
|
||||||
echo
|
|
||||||
echo "You need to have the GPC library installed on your system to build"
|
|
||||||
echo "some of the scenery generation tools, otherwise you won't be able."
|
|
||||||
echo "to create scenery."
|
|
||||||
echo
|
|
||||||
echo "Please see README.gpc for more details."
|
|
||||||
echo
|
|
||||||
echo "(pausing 5 seconds)"
|
|
||||||
sleep 5
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Check if Geographic Foundation Classes library is installed
|
|
||||||
dnl (from ftp://ftp.flightgear.org/pub/fgfs/Source/)
|
|
||||||
AC_CHECK_HEADERS( gfc/gdbf.h )
|
|
||||||
if test "x$ac_cv_header_gfc_gdbf_h" != "xyes"; then
|
|
||||||
echo
|
|
||||||
echo "You need to have the GFC library installed on your system to build"
|
|
||||||
echo "some of the scenery generation tools, otherwise, they may fail."
|
|
||||||
echo
|
|
||||||
echo "Please see README.gfc for more details."
|
|
||||||
echo
|
|
||||||
echo "(pausing 5 seconds)"
|
|
||||||
sleep 5
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Checks for header files.
|
|
||||||
AC_HEADER_STDC
|
|
||||||
AC_CHECK_HEADERS( \
|
|
||||||
fcntl.h getopt.h malloc.h memory.h stdlib.h sys/stat.h sys/time.h \
|
|
||||||
sys/timeb.h unistd.h windows.h winbase.h values.h )
|
|
||||||
|
|
||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
|
||||||
AC_C_CONST
|
|
||||||
AC_TYPE_SIZE_T
|
|
||||||
AC_HEADER_TIME
|
|
||||||
AC_STRUCT_TM
|
|
||||||
|
|
||||||
dnl Checks for library functions.
|
|
||||||
AC_TYPE_SIGNAL
|
|
||||||
AC_FUNC_VPRINTF
|
|
||||||
AC_CHECK_FUNCS( ftime gettimeofday memcpy bcopy mktime strstr rand random \
|
|
||||||
setitimer getitimer signal GetLocalTime rint getrusage )
|
|
||||||
|
|
||||||
AM_CONFIG_HEADER(Include/config.h)
|
|
||||||
|
|
||||||
AC_OUTPUT( \
|
|
||||||
VERSION \
|
|
||||||
Makefile \
|
|
||||||
Include/Makefile \
|
|
||||||
Lib/Makefile \
|
|
||||||
Lib/Bucket/Makefile \
|
|
||||||
Lib/Debug/Makefile \
|
|
||||||
Lib/Math/Makefile \
|
|
||||||
Lib/Misc/Makefile \
|
|
||||||
Lib/Serial/Makefile \
|
|
||||||
Lib/XGL/Makefile \
|
|
||||||
Lib/zlib/Makefile \
|
|
||||||
Simulator/Makefile \
|
|
||||||
Simulator/Aircraft/Makefile \
|
|
||||||
Simulator/Airports/Makefile \
|
|
||||||
Simulator/Astro/Makefile \
|
|
||||||
Simulator/Autopilot/Makefile \
|
|
||||||
Simulator/Cockpit/Makefile \
|
|
||||||
Simulator/Controls/Makefile \
|
|
||||||
Simulator/FDM/External/Makefile \
|
|
||||||
Simulator/FDM/JSBsim/Makefile \
|
|
||||||
Simulator/FDM/LaRCsim/Makefile \
|
|
||||||
Simulator/FDM/Slew/Makefile \
|
|
||||||
Simulator/FDM/Makefile \
|
|
||||||
Simulator/GUI/Makefile \
|
|
||||||
Simulator/Joystick/Makefile \
|
|
||||||
Simulator/Main/Makefile \
|
|
||||||
Simulator/Main/runfgfs \
|
|
||||||
Simulator/Main/runfgfs.bat \
|
|
||||||
Simulator/Makefile \
|
|
||||||
Simulator/Objects/Makefile \
|
|
||||||
Simulator/Scenery/Makefile \
|
|
||||||
Simulator/Time/Makefile \
|
|
||||||
Simulator/Weather/Makefile \
|
|
||||||
Tools/Makefile \
|
|
||||||
Tools/Construct/Makefile \
|
|
||||||
Tools/Construct/Array/Makefile \
|
|
||||||
Tools/Construct/Clipper/Makefile \
|
|
||||||
Tools/Construct/Combine/Makefile \
|
|
||||||
Tools/Construct/GenOutput/Makefile \
|
|
||||||
Tools/Construct/Match/Makefile \
|
|
||||||
Tools/Construct/Triangulate/Makefile \
|
|
||||||
Tools/Construct/Main/Makefile \
|
|
||||||
Tools/Construct/Parallel/Makefile \
|
|
||||||
Tools/Lib/Makefile \
|
|
||||||
Tools/Lib/DEM/Makefile \
|
|
||||||
Tools/Lib/Polygon/Makefile \
|
|
||||||
Tools/Lib/Triangle/Makefile \
|
|
||||||
Tools/Prep/Makefile \
|
|
||||||
Tools/Prep/DemChop/Makefile \
|
|
||||||
Tools/Prep/DemInfo/Makefile \
|
|
||||||
Tools/Prep/DemRaw2ascii/Makefile \
|
|
||||||
Tools/Prep/GenAirports/Makefile \
|
|
||||||
Tools/Prep/ShapeFile/Makefile \
|
|
||||||
Tools/Utils/Makefile \
|
|
||||||
Tests/Makefile \
|
|
||||||
)
|
|
||||||
|
|
||||||
AC_OUTPUT_COMMANDS([chmod 755 Simulator/Main/runfgfs])
|
|
||||||
|
|
250
install-sh
250
install-sh
|
@ -1,250 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
# This comes from X11R5 (mit/util/scripts/install.sh).
|
|
||||||
#
|
|
||||||
# Copyright 1991 by the Massachusetts Institute of Technology
|
|
||||||
#
|
|
||||||
# Permission to use, copy, modify, distribute, and sell this software and its
|
|
||||||
# documentation for any purpose is hereby granted without fee, provided that
|
|
||||||
# the above copyright notice appear in all copies and that both that
|
|
||||||
# copyright notice and this permission notice appear in supporting
|
|
||||||
# documentation, and that the name of M.I.T. not be used in advertising or
|
|
||||||
# publicity pertaining to distribution of the software without specific,
|
|
||||||
# written prior permission. M.I.T. makes no representations about the
|
|
||||||
# suitability of this software for any purpose. It is provided "as is"
|
|
||||||
# without express or implied warranty.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# `make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch. It can only install one file at a time, a restriction
|
|
||||||
# shared with many OS's install programs.
|
|
||||||
|
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit="${DOITPROG-}"
|
|
||||||
|
|
||||||
|
|
||||||
# put in absolute paths if you don't have them in your path; or use env. vars.
|
|
||||||
|
|
||||||
mvprog="${MVPROG-mv}"
|
|
||||||
cpprog="${CPPROG-cp}"
|
|
||||||
chmodprog="${CHMODPROG-chmod}"
|
|
||||||
chownprog="${CHOWNPROG-chown}"
|
|
||||||
chgrpprog="${CHGRPPROG-chgrp}"
|
|
||||||
stripprog="${STRIPPROG-strip}"
|
|
||||||
rmprog="${RMPROG-rm}"
|
|
||||||
mkdirprog="${MKDIRPROG-mkdir}"
|
|
||||||
|
|
||||||
transformbasename=""
|
|
||||||
transform_arg=""
|
|
||||||
instcmd="$mvprog"
|
|
||||||
chmodcmd="$chmodprog 0755"
|
|
||||||
chowncmd=""
|
|
||||||
chgrpcmd=""
|
|
||||||
stripcmd=""
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
mvcmd="$mvprog"
|
|
||||||
src=""
|
|
||||||
dst=""
|
|
||||||
dir_arg=""
|
|
||||||
|
|
||||||
while [ x"$1" != x ]; do
|
|
||||||
case $1 in
|
|
||||||
-c) instcmd="$cpprog"
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-d) dir_arg=true
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-m) chmodcmd="$chmodprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-s) stripcmd="$stripprog"
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
|
|
||||||
*) if [ x"$src" = x ]
|
|
||||||
then
|
|
||||||
src=$1
|
|
||||||
else
|
|
||||||
# this colon is to work around a 386BSD /bin/sh bug
|
|
||||||
:
|
|
||||||
dst=$1
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
continue;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ x"$src" = x ]
|
|
||||||
then
|
|
||||||
echo "install: no input file specified"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
true
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ x"$dir_arg" != x ]; then
|
|
||||||
dst=$src
|
|
||||||
src=""
|
|
||||||
|
|
||||||
if [ -d $dst ]; then
|
|
||||||
instcmd=:
|
|
||||||
else
|
|
||||||
instcmd=mkdir
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
|
|
||||||
if [ -f $src -o -d $src ]
|
|
||||||
then
|
|
||||||
true
|
|
||||||
else
|
|
||||||
echo "install: $src does not exist"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ x"$dst" = x ]
|
|
||||||
then
|
|
||||||
echo "install: no destination specified"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; if your system
|
|
||||||
# does not like double slashes in filenames, you may need to add some logic
|
|
||||||
|
|
||||||
if [ -d $dst ]
|
|
||||||
then
|
|
||||||
dst="$dst"/`basename $src`
|
|
||||||
else
|
|
||||||
true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
## this sed command emulates the dirname command
|
|
||||||
dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
|
|
||||||
|
|
||||||
# Make sure that the destination directory exists.
|
|
||||||
# this part is taken from Noah Friedman's mkinstalldirs script
|
|
||||||
|
|
||||||
# Skip lots of stat calls in the usual case.
|
|
||||||
if [ ! -d "$dstdir" ]; then
|
|
||||||
defaultIFS='
|
|
||||||
'
|
|
||||||
IFS="${IFS-${defaultIFS}}"
|
|
||||||
|
|
||||||
oIFS="${IFS}"
|
|
||||||
# Some sh's can't handle IFS=/ for some reason.
|
|
||||||
IFS='%'
|
|
||||||
set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
|
|
||||||
IFS="${oIFS}"
|
|
||||||
|
|
||||||
pathcomp=''
|
|
||||||
|
|
||||||
while [ $# -ne 0 ] ; do
|
|
||||||
pathcomp="${pathcomp}${1}"
|
|
||||||
shift
|
|
||||||
|
|
||||||
if [ ! -d "${pathcomp}" ] ;
|
|
||||||
then
|
|
||||||
$mkdirprog "${pathcomp}"
|
|
||||||
else
|
|
||||||
true
|
|
||||||
fi
|
|
||||||
|
|
||||||
pathcomp="${pathcomp}/"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ x"$dir_arg" != x ]
|
|
||||||
then
|
|
||||||
$doit $instcmd $dst &&
|
|
||||||
|
|
||||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
|
|
||||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
|
|
||||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
|
|
||||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
|
|
||||||
else
|
|
||||||
|
|
||||||
# If we're going to rename the final executable, determine the name now.
|
|
||||||
|
|
||||||
if [ x"$transformarg" = x ]
|
|
||||||
then
|
|
||||||
dstfile=`basename $dst`
|
|
||||||
else
|
|
||||||
dstfile=`basename $dst $transformbasename |
|
|
||||||
sed $transformarg`$transformbasename
|
|
||||||
fi
|
|
||||||
|
|
||||||
# don't allow the sed command to completely eliminate the filename
|
|
||||||
|
|
||||||
if [ x"$dstfile" = x ]
|
|
||||||
then
|
|
||||||
dstfile=`basename $dst`
|
|
||||||
else
|
|
||||||
true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Make a temp file name in the proper directory.
|
|
||||||
|
|
||||||
dsttmp=$dstdir/#inst.$$#
|
|
||||||
|
|
||||||
# Move or copy the file name to the temp name
|
|
||||||
|
|
||||||
$doit $instcmd $src $dsttmp &&
|
|
||||||
|
|
||||||
trap "rm -f ${dsttmp}" 0 &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits
|
|
||||||
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $instcmd $src $dsttmp" command.
|
|
||||||
|
|
||||||
if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
|
|
||||||
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
|
|
||||||
if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
|
|
||||||
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
|
|
||||||
$doit $rmcmd -f $dstdir/$dstfile &&
|
|
||||||
$doit $mvcmd $dsttmp $dstdir/$dstfile
|
|
||||||
|
|
||||||
fi &&
|
|
||||||
|
|
||||||
|
|
||||||
exit 0
|
|
16
irix-hack.pl
16
irix-hack.pl
|
@ -1,16 +0,0 @@
|
||||||
#!/usr/bin/perl
|
|
||||||
|
|
||||||
$file = shift(@ARGV);
|
|
||||||
|
|
||||||
print "Fixing $file\n";
|
|
||||||
|
|
||||||
open(IN, "<$file") || die "cannot open $file for reading\n";
|
|
||||||
open(OUT, ">$file.new") || die "cannot open $file.new for writting\n";
|
|
||||||
|
|
||||||
while (<IN>) {
|
|
||||||
s/^AR = ar$/AR = CC -ar/;
|
|
||||||
s/\$\(AR\) cru /\$\(AR\) -o /;
|
|
||||||
print OUT $_;
|
|
||||||
}
|
|
||||||
|
|
||||||
rename("$file.new", "$file") || die "cannot rename $file.new to $file\n";
|
|
134
missing
134
missing
|
@ -1,134 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Common stub for a few missing GNU programs while installing.
|
|
||||||
# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
|
||||||
# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
# 02111-1307, USA.
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
|
|
||||||
-h|--h|--he|--hel|--help)
|
|
||||||
echo "\
|
|
||||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
|
||||||
|
|
||||||
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
|
||||||
error status if there is no known handling for PROGRAM.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help display this help and exit
|
|
||||||
-v, --version output version information and exit
|
|
||||||
|
|
||||||
Supported PROGRAM values:
|
|
||||||
aclocal touch file \`aclocal.m4'
|
|
||||||
autoconf touch file \`configure'
|
|
||||||
autoheader touch file \`config.h.in'
|
|
||||||
automake touch all \`Makefile.in' files
|
|
||||||
bison touch file \`y.tab.c'
|
|
||||||
makeinfo touch the output file
|
|
||||||
yacc touch file \`y.tab.c'"
|
|
||||||
;;
|
|
||||||
|
|
||||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
|
||||||
echo "missing - GNU libit 0.0"
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
echo 1>&2 "$0: Unknown \`$1' option"
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
aclocal)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is missing on your system. You should only need it if
|
|
||||||
you modified \`acinclude.m4' or \`configure.in'. You might want
|
|
||||||
to install the \`Automake' and \`Perl' packages. Grab them from
|
|
||||||
any GNU archive site."
|
|
||||||
touch aclocal.m4
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoconf)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is missing on your system. You should only need it if
|
|
||||||
you modified \`configure.in'. You might want to install the
|
|
||||||
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
|
||||||
archive site."
|
|
||||||
touch configure
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoheader)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is missing on your system. You should only need it if
|
|
||||||
you modified \`acconfig.h' or \`configure.in'. You might want
|
|
||||||
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
|
||||||
from any GNU archive site."
|
|
||||||
touch config.h.in
|
|
||||||
;;
|
|
||||||
|
|
||||||
automake)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is missing on your system. You should only need it if
|
|
||||||
you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
|
|
||||||
You might want to install the \`Automake' and \`Perl' packages.
|
|
||||||
Grab them from any GNU archive site."
|
|
||||||
find . -type f -name Makefile.am -print \
|
|
||||||
| sed 's/^\(.*\).am$/touch \1.in/' \
|
|
||||||
| sh
|
|
||||||
;;
|
|
||||||
|
|
||||||
bison|yacc)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is missing on your system. You should only need it if
|
|
||||||
you modified a \`.y' file. You may need the \`Bison' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Bison' from any GNU archive site."
|
|
||||||
touch y.tab.c
|
|
||||||
;;
|
|
||||||
|
|
||||||
makeinfo)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is missing on your system. You should only need it if
|
|
||||||
you modified a \`.texi' or \`.texinfo' file, or any other file
|
|
||||||
indirectly affecting the aspect of the manual. The spurious
|
|
||||||
call might also be the consequence of using a buggy \`make' (AIX,
|
|
||||||
DU, IRIX). You might want to install the \`Texinfo' package or
|
|
||||||
the \`GNU make' package. Grab either from any GNU archive site."
|
|
||||||
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
|
||||||
if test -z "$file"; then
|
|
||||||
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
|
||||||
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
|
|
||||||
fi
|
|
||||||
touch $file
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, and you do not seem to have it handy on your
|
|
||||||
system. You might have modified some files without having the
|
|
||||||
proper tools for further handling them. Check the \`README' file,
|
|
||||||
it often tells you about the needed prerequirements for installing
|
|
||||||
this package. You may also peek at any GNU archive site, in case
|
|
||||||
some other package would contain this missing \`$1' program."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -1,40 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# mkinstalldirs --- make directory hierarchy
|
|
||||||
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
|
|
||||||
# Created: 1993-05-16
|
|
||||||
# Public domain
|
|
||||||
|
|
||||||
# $Id$
|
|
||||||
|
|
||||||
errstatus=0
|
|
||||||
|
|
||||||
for file
|
|
||||||
do
|
|
||||||
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
|
|
||||||
shift
|
|
||||||
|
|
||||||
pathcomp=
|
|
||||||
for d
|
|
||||||
do
|
|
||||||
pathcomp="$pathcomp$d"
|
|
||||||
case "$pathcomp" in
|
|
||||||
-* ) pathcomp=./$pathcomp ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test ! -d "$pathcomp"; then
|
|
||||||
echo "mkdir $pathcomp" 1>&2
|
|
||||||
|
|
||||||
mkdir "$pathcomp" || lasterr=$?
|
|
||||||
|
|
||||||
if test ! -d "$pathcomp"; then
|
|
||||||
errstatus=$lasterr
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
pathcomp="$pathcomp/"
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
exit $errstatus
|
|
||||||
|
|
||||||
# mkinstalldirs ends here
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include <Include/compiler.h>
|
#include <Include/compiler.h>
|
||||||
|
|
||||||
#include <Debug/logstream.hxx>
|
#include <Debug/logstream.hxx>
|
||||||
#include <Misc/fgpath.hxx>
|
|
||||||
#include <Misc/fgstream.hxx>
|
#include <Misc/fgstream.hxx>
|
||||||
#include <Main/options.hxx>
|
#include <Main/options.hxx>
|
||||||
|
|
||||||
|
@ -47,15 +46,13 @@ int fgAIRPORTS::load( const string& file ) {
|
||||||
fgAIRPORT a;
|
fgAIRPORT a;
|
||||||
|
|
||||||
// build the path name to the airport file
|
// build the path name to the airport file
|
||||||
FGPath path( current_options.get_fg_root() );
|
string path = current_options.get_fg_root() + "/Airports/" + file;
|
||||||
path.append( "Airports" );
|
|
||||||
path.append( file );
|
|
||||||
|
|
||||||
airports.erase( airports.begin(), airports.end() );
|
airports.erase( airports.begin(), airports.end() );
|
||||||
|
|
||||||
fg_gzifstream in( path.str() );
|
fg_gzifstream in( path );
|
||||||
if ( !in.is_open() ) {
|
if ( !in ) {
|
||||||
FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << path.str() );
|
FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << path );
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,29 +65,14 @@ int fgAIRPORTS::load( const string& file ) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// read in each line of the file
|
// read in each line of the file
|
||||||
|
|
||||||
#ifdef __MWERKS__
|
|
||||||
|
|
||||||
in >> skipcomment;
|
in >> skipcomment;
|
||||||
char c = 0;
|
while ( ! in.eof() )
|
||||||
while ( in.get(c) && c != '\0' ) {
|
{
|
||||||
in.putback(c);
|
|
||||||
in >> a;
|
in >> a;
|
||||||
airports.insert(a);
|
airports.insert(a);
|
||||||
in >> skipcomment;
|
in >> skipcomment;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
in >> skipcomment;
|
|
||||||
while ( ! in.eof() ) {
|
|
||||||
in >> a;
|
|
||||||
airports.insert(a);
|
|
||||||
in >> skipcomment;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
noinst_LIBRARIES = libAstro.a
|
|
||||||
|
|
||||||
libAstro_a_SOURCES = \
|
|
||||||
celestialBody.cxx celestialBody.hxx \
|
|
||||||
jupiter.cxx jupiter.hxx \
|
|
||||||
mars.cxx mars.hxx \
|
|
||||||
mercury.cxx mercury.hxx \
|
|
||||||
moon.cxx moon.hxx \
|
|
||||||
neptune.cxx neptune.hxx \
|
|
||||||
pluto.hxx \
|
|
||||||
saturn.cxx saturn.hxx \
|
|
||||||
sky.cxx sky.hxx \
|
|
||||||
solarsystem.cxx solarsystem.hxx \
|
|
||||||
star.cxx star.hxx \
|
|
||||||
stars.cxx stars.hxx \
|
|
||||||
uranus.cxx uranus.hxx \
|
|
||||||
venus.cxx venus.hxx
|
|
||||||
|
|
||||||
INCLUDES += -I$(top_builddir) -I$(top_builddir)/Lib -I$(top_builddir)/Simulator
|
|
|
@ -1,176 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* celestialBody.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
#include "star.hxx"
|
|
||||||
#include <Debug/logstream.hxx>
|
|
||||||
|
|
||||||
#ifdef FG_MATH_EXCEPTION_CLASH
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
* void CelestialBody::updatePosition(fgTIME *t, Star *ourSun)
|
|
||||||
*
|
|
||||||
* Basically, this member function provides a general interface for
|
|
||||||
* calculating the right ascension and declinaion. This function is
|
|
||||||
* used for calculating the planetary positions. For the planets, an
|
|
||||||
* overloaded member function is provided to additionally calculate the
|
|
||||||
* planet's magnitude.
|
|
||||||
* The sun and moon have their own overloaded updatePosition member, as their
|
|
||||||
* position is calculated an a slightly different manner.
|
|
||||||
*
|
|
||||||
* arguments:
|
|
||||||
* fgTIME t: provides the current time.
|
|
||||||
* Star *ourSun: the sun's position is needed to convert heliocentric
|
|
||||||
* coordinates into geocentric coordinates.
|
|
||||||
*
|
|
||||||
* return value: none
|
|
||||||
*
|
|
||||||
*************************************************************************/
|
|
||||||
void CelestialBody::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
{
|
|
||||||
double eccAnom, v, ecl, actTime,
|
|
||||||
xv, yv, xh, yh, zh, xg, yg, zg, xe, ye, ze;
|
|
||||||
|
|
||||||
updateOrbElements(t);
|
|
||||||
actTime = fgCalcActTime(t);
|
|
||||||
|
|
||||||
// calcualate the angle bewteen ecliptic and equatorial coordinate system
|
|
||||||
ecl = DEG_TO_RAD * (23.4393 - 3.563E-7 *actTime);
|
|
||||||
|
|
||||||
eccAnom = fgCalcEccAnom(M, e); //calculate the eccentric anomaly
|
|
||||||
xv = a * (cos(eccAnom) - e);
|
|
||||||
yv = a * (sqrt (1.0 - e*e) * sin(eccAnom));
|
|
||||||
v = atan2(yv, xv); // the planet's true anomaly
|
|
||||||
r = sqrt (xv*xv + yv*yv); // the planet's distance
|
|
||||||
|
|
||||||
// calculate the planet's position in 3D space
|
|
||||||
xh = r * (cos(N) * cos(v+w) - sin(N) * sin(v+w) * cos(i));
|
|
||||||
yh = r * (sin(N) * cos(v+w) + cos(N) * sin(v+w) * cos(i));
|
|
||||||
zh = r * (sin(v+w) * sin(i));
|
|
||||||
|
|
||||||
// calculate the ecliptic longitude and latitude
|
|
||||||
xg = xh + ourSun->getxs();
|
|
||||||
yg = yh + ourSun->getys();
|
|
||||||
zg = zh;
|
|
||||||
|
|
||||||
lonEcl = atan2(yh, xh);
|
|
||||||
latEcl = atan2(zh, sqrt(xh*xh+yh*yh));
|
|
||||||
|
|
||||||
xe = xg;
|
|
||||||
ye = yg * cos(ecl) - zg * sin(ecl);
|
|
||||||
ze = yg * sin(ecl) + zg * cos(ecl);
|
|
||||||
rightAscension = atan2(ye, xe);
|
|
||||||
declination = atan2(ze, sqrt(xe*xe + ye*ye));
|
|
||||||
FG_LOG(FG_GENERAL, FG_INFO, "Planet found at : "
|
|
||||||
<< rightAscension << " (ra), " << declination << " (dec)" );
|
|
||||||
|
|
||||||
//calculate some variables specific to calculating the magnitude
|
|
||||||
//of the planet
|
|
||||||
R = sqrt (xg*xg + yg*yg + zg*zg);
|
|
||||||
s = ourSun->getDistance();
|
|
||||||
|
|
||||||
// It is possible from these calculations for the argument to acos
|
|
||||||
// to exceed the valid range for acos(). So we do a little extra
|
|
||||||
// checking.
|
|
||||||
|
|
||||||
double tmp = (r*r + R*R - s*s) / (2*r*R);
|
|
||||||
if ( tmp > 1.0) {
|
|
||||||
tmp = 1.0;
|
|
||||||
} else if ( tmp < -1.0) {
|
|
||||||
tmp = -1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FV = RAD_TO_DEG * acos( tmp );
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* double CelestialBody::fgCalcEccAnom(double M, double e)
|
|
||||||
* this private member calculates the eccentric anomaly of a celestial body,
|
|
||||||
* given its mean anomaly and eccentricity.
|
|
||||||
*
|
|
||||||
* -Mean anomaly: the approximate angle between the perihelion and the current
|
|
||||||
* position. this angle increases uniformly with time.
|
|
||||||
*
|
|
||||||
* True anomaly: the actual angle between perihelion and current position.
|
|
||||||
*
|
|
||||||
* Eccentric anomaly: this is an auxilary angle, used in calculating the true
|
|
||||||
* anomaly from the mean anomaly.
|
|
||||||
*
|
|
||||||
* -eccentricity. Indicates the amount in which the orbit deviates from a
|
|
||||||
* circle (0 = circle, 0-1, is ellipse, 1 = parabola, > 1 = hyperbola).
|
|
||||||
*
|
|
||||||
* This function is also known as solveKeplersEquation()
|
|
||||||
*
|
|
||||||
* arguments:
|
|
||||||
* M: the mean anomaly
|
|
||||||
* e: the eccentricity
|
|
||||||
*
|
|
||||||
* return value:
|
|
||||||
* the eccentric anomaly
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
double CelestialBody::fgCalcEccAnom(double M, double e)
|
|
||||||
{
|
|
||||||
double
|
|
||||||
eccAnom, E0, E1, diff;
|
|
||||||
|
|
||||||
eccAnom = M + e * sin(M) * (1.0 + e * cos (M));
|
|
||||||
// iterate to achieve a greater precision for larger eccentricities
|
|
||||||
if (e > 0.05)
|
|
||||||
{
|
|
||||||
E0 = eccAnom;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
E1 = E0 - (E0 - e * sin(E0) - M) / (1 - e *cos(E0));
|
|
||||||
diff = fabs(E0 - E1);
|
|
||||||
E0 = E1;
|
|
||||||
}
|
|
||||||
while (diff > (DEG_TO_RAD * 0.001));
|
|
||||||
return E0;
|
|
||||||
}
|
|
||||||
return eccAnom;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,195 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* celestialBody.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _CELESTIALBODY_H_
|
|
||||||
#define _CELESTIALBODY_H_
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
|
||||||
# error This library requires C++
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include <Include/fg_constants.h>
|
|
||||||
|
|
||||||
class Star;
|
|
||||||
|
|
||||||
class CelestialBody
|
|
||||||
{
|
|
||||||
protected: // make the data protected, in order to give the inherited
|
|
||||||
// classes direct access to the data
|
|
||||||
double NFirst; /* longitude of the ascending node first part */
|
|
||||||
double NSec; /* longitude of the ascending node second part */
|
|
||||||
double iFirst; /* inclination to the ecliptic first part */
|
|
||||||
double iSec; /* inclination to the ecliptic second part */
|
|
||||||
double wFirst; /* first part of argument of perihelion */
|
|
||||||
double wSec; /* second part of argument of perihelion */
|
|
||||||
double aFirst; /* semimayor axis first part*/
|
|
||||||
double aSec; /* semimayor axis second part */
|
|
||||||
double eFirst; /* eccentricity first part */
|
|
||||||
double eSec; /* eccentricity second part */
|
|
||||||
double MFirst; /* Mean anomaly first part */
|
|
||||||
double MSec; /* Mean anomaly second part */
|
|
||||||
|
|
||||||
double N, i, w, a, e, M; /* the resulting orbital elements, obtained from the former */
|
|
||||||
|
|
||||||
double rightAscension, declination;
|
|
||||||
double r, R, s, FV;
|
|
||||||
double magnitude;
|
|
||||||
double lonEcl, latEcl;
|
|
||||||
|
|
||||||
double fgCalcEccAnom(double M, double e);
|
|
||||||
double fgCalcActTime(FGTime *t);
|
|
||||||
void updateOrbElements(FGTime *t);
|
|
||||||
|
|
||||||
public:
|
|
||||||
CelestialBody(double Nf, double Ns,
|
|
||||||
double If, double Is,
|
|
||||||
double wf, double ws,
|
|
||||||
double af, double as,
|
|
||||||
double ef, double es,
|
|
||||||
double Mf, double Ms, FGTime *t);
|
|
||||||
void getPos(double *ra, double *dec);
|
|
||||||
void getPos(double *ra, double *dec, double *magnitude);
|
|
||||||
double getLon();
|
|
||||||
double getLat();
|
|
||||||
void updatePosition(FGTime *t, Star *ourSun);
|
|
||||||
};
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* inline CelestialBody::CelestialBody
|
|
||||||
* public constructor for a generic celestialBody object.
|
|
||||||
* initializes the 6 primary orbital elements. The elements are:
|
|
||||||
* N: longitude of the ascending node
|
|
||||||
* i: inclination to the ecliptic
|
|
||||||
* w: argument of perihelion
|
|
||||||
* a: semi-major axis, or mean distance from the sun
|
|
||||||
* e: eccenticity
|
|
||||||
* M: mean anomaly
|
|
||||||
* Each orbital element consists of a constant part and a variable part that
|
|
||||||
* gradually changes over time.
|
|
||||||
*
|
|
||||||
* Argumetns:
|
|
||||||
* the 13 arguments to the constructor constitute the first, constant
|
|
||||||
* ([NiwaeM]f) and the second variable ([NiwaeM]s) part of the orbital
|
|
||||||
* elements. The 13th argument is the current time. Note that the inclination
|
|
||||||
* is written with a capital (If, Is), because 'if' is a reserved word in the
|
|
||||||
* C/C++ programming language.
|
|
||||||
***************************************************************************/
|
|
||||||
inline CelestialBody::CelestialBody(double Nf, double Ns,
|
|
||||||
double If, double Is,
|
|
||||||
double wf, double ws,
|
|
||||||
double af, double as,
|
|
||||||
double ef, double es,
|
|
||||||
double Mf, double Ms, FGTime *t)
|
|
||||||
{
|
|
||||||
NFirst = Nf; NSec = Ns;
|
|
||||||
iFirst = If; iSec = Is;
|
|
||||||
wFirst = wf; wSec = ws;
|
|
||||||
aFirst = af; aSec = as;
|
|
||||||
eFirst = ef; eSec = es;
|
|
||||||
MFirst = Mf; MSec = Ms;
|
|
||||||
updateOrbElements(t);
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* inline void CelestialBody::updateOrbElements(FGTime *t)
|
|
||||||
* given the current time, this private member calculates the actual
|
|
||||||
* orbital elements
|
|
||||||
*
|
|
||||||
* Arguments: FGTime *t: the current time:
|
|
||||||
*
|
|
||||||
* return value: none
|
|
||||||
***************************************************************************/
|
|
||||||
inline void CelestialBody::updateOrbElements(FGTime *t)
|
|
||||||
{
|
|
||||||
double actTime = fgCalcActTime(t);
|
|
||||||
M = DEG_TO_RAD * (MFirst + (MSec * actTime));
|
|
||||||
w = DEG_TO_RAD * (wFirst + (wSec * actTime));
|
|
||||||
N = DEG_TO_RAD * (NFirst + (NSec * actTime));
|
|
||||||
i = DEG_TO_RAD * (iFirst + (iSec * actTime));
|
|
||||||
e = eFirst + (eSec * actTime);
|
|
||||||
a = aFirst + (aSec * actTime);
|
|
||||||
}
|
|
||||||
/*****************************************************************************
|
|
||||||
* inline double CelestialBody::fgCalcActTime(FGTime *t)
|
|
||||||
* this private member function returns the offset in days from the epoch for
|
|
||||||
* wich the orbital elements are calculated (Jan, 1st, 2000).
|
|
||||||
*
|
|
||||||
* Argument: the current time
|
|
||||||
*
|
|
||||||
* return value: the (fractional) number of days until Jan 1, 2000.
|
|
||||||
****************************************************************************/
|
|
||||||
inline double CelestialBody::fgCalcActTime(FGTime *t)
|
|
||||||
{
|
|
||||||
return (t->getMjd() - 36523.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* inline void CelestialBody::getPos(double* ra, double* dec)
|
|
||||||
* gives public access to Right Ascension and declination
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
inline void CelestialBody::getPos(double* ra, double* dec)
|
|
||||||
{
|
|
||||||
*ra = rightAscension;
|
|
||||||
*dec = declination;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* inline void CelestialBody::getPos(double* ra, double* dec, double* magnitude
|
|
||||||
* gives public acces to the current Right ascension, declination, and
|
|
||||||
* magnitude
|
|
||||||
****************************************************************************/
|
|
||||||
inline void CelestialBody::getPos(double* ra, double* dec, double* magn)
|
|
||||||
{
|
|
||||||
*ra = rightAscension;
|
|
||||||
*dec = declination;
|
|
||||||
*magn = magnitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline double CelestialBody::getLon()
|
|
||||||
{
|
|
||||||
return lonEcl;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline double CelestialBody::getLat()
|
|
||||||
{
|
|
||||||
return latEcl;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _CELESTIALBODY_H_
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* jupiter.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "jupiter.hxx"
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Jupiter::Jupiter(FGTime *t)
|
|
||||||
* Public constructor for class Jupiter
|
|
||||||
* Argument: The current time.
|
|
||||||
* the hard coded orbital elements for Jupiter are passed to
|
|
||||||
* CelestialBody::CelestialBody();
|
|
||||||
************************************************************************/
|
|
||||||
Jupiter::Jupiter(FGTime *t) :
|
|
||||||
CelestialBody(100.4542, 2.7685400E-5,
|
|
||||||
1.3030, -1.557E-7,
|
|
||||||
273.8777, 1.6450500E-5,
|
|
||||||
5.2025600, 0.000000,
|
|
||||||
0.048498, 4.469E-9,
|
|
||||||
19.89500, 0.08308530010, t)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* void Jupiter::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
*
|
|
||||||
* calculates the current position of Jupiter, by calling the base class,
|
|
||||||
* CelestialBody::updatePosition(); The current magnitude is calculated using
|
|
||||||
* a Jupiter specific equation
|
|
||||||
*************************************************************************/
|
|
||||||
void Jupiter::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
{
|
|
||||||
CelestialBody::updatePosition(t, ourSun);
|
|
||||||
magnitude = -9.25 + 5*log10( r*R ) + 0.014 * FV;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* jupiter.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _JUPITER_HXX_
|
|
||||||
#define _JUPITER_HXX_
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
#include "star.hxx"
|
|
||||||
|
|
||||||
class Jupiter : public CelestialBody
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Jupiter (FGTime *t);
|
|
||||||
void updatePosition(FGTime *t, Star *ourSun);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _JUPITER_HXX_
|
|
|
@ -1,59 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* mars.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "mars.hxx"
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Mars::Mars(FGTime *t)
|
|
||||||
* Public constructor for class Mars
|
|
||||||
* Argument: The current time.
|
|
||||||
* the hard coded orbital elements for Mars are passed to
|
|
||||||
* CelestialBody::CelestialBody();
|
|
||||||
************************************************************************/
|
|
||||||
Mars::Mars(FGTime *t) :
|
|
||||||
CelestialBody(49.55740, 2.1108100E-5,
|
|
||||||
1.8497, -1.78E-8,
|
|
||||||
286.5016, 2.9296100E-5,
|
|
||||||
1.5236880, 0.000000,
|
|
||||||
0.093405, 2.516E-9,
|
|
||||||
18.60210, 0.52402077660, t)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
/*************************************************************************
|
|
||||||
* void Mars::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
*
|
|
||||||
* calculates the current position of Mars, by calling the base class,
|
|
||||||
* CelestialBody::updatePosition(); The current magnitude is calculated using
|
|
||||||
* a Mars specific equation
|
|
||||||
*************************************************************************/
|
|
||||||
void Mars::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
{
|
|
||||||
CelestialBody::updatePosition(t, ourSun);
|
|
||||||
magnitude = -1.51 + 5*log10( r*R ) + 0.016 * FV;
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* mars.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _MARS_HXX_
|
|
||||||
#define _MARS_HXX_
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
#include "star.hxx"
|
|
||||||
|
|
||||||
class Mars : public CelestialBody
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Mars ( FGTime *t);
|
|
||||||
void updatePosition(FGTime *t, Star *ourSun);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _MARS_HXX_
|
|
|
@ -1,61 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* mercury.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "mercury.hxx"
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Mercury::Mercury(FGTime *t)
|
|
||||||
* Public constructor for class Mercury
|
|
||||||
* Argument: The current time.
|
|
||||||
* the hard coded orbital elements for Mercury are passed to
|
|
||||||
* CelestialBody::CelestialBody();
|
|
||||||
************************************************************************/
|
|
||||||
Mercury::Mercury(FGTime *t) :
|
|
||||||
CelestialBody (48.33130, 3.2458700E-5,
|
|
||||||
7.0047, 5.00E-8,
|
|
||||||
29.12410, 1.0144400E-5,
|
|
||||||
0.3870980, 0.000000,
|
|
||||||
0.205635, 5.59E-10,
|
|
||||||
168.6562, 4.09233443680, t)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
/*************************************************************************
|
|
||||||
* void Mercury::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
*
|
|
||||||
* calculates the current position of Mercury, by calling the base class,
|
|
||||||
* CelestialBody::updatePosition(); The current magnitude is calculated using
|
|
||||||
* a Mercury specific equation
|
|
||||||
*************************************************************************/
|
|
||||||
void Mercury::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
{
|
|
||||||
CelestialBody::updatePosition(t, ourSun);
|
|
||||||
magnitude = -0.36 + 5*log10( r*R ) + 0.027 * FV + 2.2E-13 * pow(FV, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* mercury.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _MERCURY_HXX_
|
|
||||||
#define _MERCURY_HXX_
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
#include "star.hxx"
|
|
||||||
|
|
||||||
class Mercury : public CelestialBody
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Mercury ( FGTime *t);
|
|
||||||
void updatePosition(FGTime *t, Star* ourSun);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _MERURY_HXX_
|
|
|
@ -1,401 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* moon.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#include <FDM/flight.hxx>
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "moon.hxx"
|
|
||||||
|
|
||||||
#include <Debug/logstream.hxx>
|
|
||||||
#include <Main/options.hxx>
|
|
||||||
#include <Misc/fgpath.hxx>
|
|
||||||
#include <Objects/texload.h>
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Moon::Moon(FGTime *t)
|
|
||||||
* Public constructor for class Moon. Initializes the orbital elements and
|
|
||||||
* sets up the moon texture.
|
|
||||||
* Argument: The current time.
|
|
||||||
* the hard coded orbital elements for Moon are passed to
|
|
||||||
* CelestialBody::CelestialBody();
|
|
||||||
************************************************************************/
|
|
||||||
Moon::Moon(FGTime *t) :
|
|
||||||
CelestialBody(125.1228, -0.0529538083,
|
|
||||||
5.1454, 0.00000,
|
|
||||||
318.0634, 0.1643573223,
|
|
||||||
60.266600, 0.000000,
|
|
||||||
0.054900, 0.000000,
|
|
||||||
115.3654, 13.0649929509, t)
|
|
||||||
{
|
|
||||||
int width, height;
|
|
||||||
|
|
||||||
FG_LOG( FG_GENERAL, FG_INFO, "Initializing Moon Texture");
|
|
||||||
#ifdef GL_VERSION_1_1
|
|
||||||
xglGenTextures(1, &moon_texid);
|
|
||||||
xglBindTexture(GL_TEXTURE_2D, moon_texid);
|
|
||||||
#elif GL_EXT_texture_object
|
|
||||||
xglGenTexturesEXT(1, &moon_texid);
|
|
||||||
xglBindTextureEXT(GL_TEXTURE_2D, moon_texid);
|
|
||||||
#else
|
|
||||||
# error port me
|
|
||||||
#endif
|
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
|
|
||||||
// load in the texture data
|
|
||||||
FGPath tpath( current_options.get_fg_root() );
|
|
||||||
tpath.append( "Textures" );
|
|
||||||
tpath.append( "moon.rgb" );
|
|
||||||
|
|
||||||
if ( (moon_texbuf = read_rgb_texture(tpath.c_str(), &width, &height))
|
|
||||||
== NULL )
|
|
||||||
{
|
|
||||||
// Try compressed
|
|
||||||
FGPath fg_tpath = tpath;
|
|
||||||
fg_tpath.append( ".gz" );
|
|
||||||
if ( (moon_texbuf = read_rgb_texture(fg_tpath.c_str(), &width, &height))
|
|
||||||
== NULL )
|
|
||||||
{
|
|
||||||
FG_LOG( FG_GENERAL, FG_ALERT,
|
|
||||||
"Error in loading moon texture " << tpath.str() );
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glTexImage2D( GL_TEXTURE_2D,
|
|
||||||
0,
|
|
||||||
GL_RGB,
|
|
||||||
256, 256,
|
|
||||||
0,
|
|
||||||
GL_RGB, GL_UNSIGNED_BYTE,
|
|
||||||
moon_texbuf);
|
|
||||||
|
|
||||||
// setup the halo texture
|
|
||||||
FG_LOG( FG_GENERAL, FG_INFO, "Initializing Moon Texture");
|
|
||||||
#ifdef GL_VERSION_1_1
|
|
||||||
xglGenTextures(1, &moon_halotexid);
|
|
||||||
xglBindTexture(GL_TEXTURE_2D, moon_halotexid);
|
|
||||||
#elif GL_EXT_texture_object
|
|
||||||
xglGenTexturesEXT(1, &moon_halotexid);
|
|
||||||
xglBindTextureEXT(GL_TEXTURE_2D, moon_halotexid);
|
|
||||||
#else
|
|
||||||
# error port me
|
|
||||||
#endif
|
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
setHalo();
|
|
||||||
glTexImage2D( GL_TEXTURE_2D,
|
|
||||||
0,
|
|
||||||
GL_RGBA,
|
|
||||||
256, 256,
|
|
||||||
0,
|
|
||||||
GL_RGBA, GL_UNSIGNED_BYTE,
|
|
||||||
moon_halotexbuf);
|
|
||||||
moonObject = gluNewQuadric();
|
|
||||||
}
|
|
||||||
|
|
||||||
Moon::~Moon()
|
|
||||||
{
|
|
||||||
//delete moonObject;
|
|
||||||
delete moon_texbuf;
|
|
||||||
delete moon_halotexbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int texWidth = 256; /* 64x64 is plenty */
|
|
||||||
|
|
||||||
void Moon::setHalo()
|
|
||||||
{
|
|
||||||
int texSize;
|
|
||||||
//void *textureBuf;
|
|
||||||
GLubyte *p;
|
|
||||||
int i,j;
|
|
||||||
double radius;
|
|
||||||
|
|
||||||
texSize = texWidth*texWidth;
|
|
||||||
|
|
||||||
moon_halotexbuf = new GLubyte[texSize*4];
|
|
||||||
if (!moon_halotexbuf)
|
|
||||||
return; // Ugly!
|
|
||||||
|
|
||||||
p = moon_halotexbuf;
|
|
||||||
|
|
||||||
radius = (double)(texWidth / 2);
|
|
||||||
|
|
||||||
for (i=0; i < texWidth; i++) {
|
|
||||||
for (j=0; j < texWidth; j++) {
|
|
||||||
double x, y, d;
|
|
||||||
|
|
||||||
x = fabs((double)(i - (texWidth / 2)));
|
|
||||||
y = fabs((double)(j - (texWidth / 2)));
|
|
||||||
|
|
||||||
d = sqrt((x * x) + (y * y));
|
|
||||||
if (d < radius)
|
|
||||||
{
|
|
||||||
double t = 1.0 - (d / radius); // t is 1.0 at center, 0.0 at edge */
|
|
||||||
// inverse square looks nice
|
|
||||||
*p = (int)((double)0xff * (t * t));
|
|
||||||
*(p+1) = (int)((double) 0xff * (t*t));
|
|
||||||
*(p+2) = (int)((double) 0xff * (t*t));
|
|
||||||
*(p+3) = 0x11;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*p = 0x00;
|
|
||||||
*(p+1) = 0x00;
|
|
||||||
*(p+2) = 0x00;
|
|
||||||
*(p+3) = 0x11;
|
|
||||||
}
|
|
||||||
p += 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//gluBuild2DMipmaps(GL_TEXTURE_2D, 1, texWidth, texWidth,
|
|
||||||
// GL_LUMINANCE,
|
|
||||||
// GL_UNSIGNED_BYTE, textureBuf);
|
|
||||||
//free(textureBuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* void Moon::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
* this member function calculates the actual topocentric position (i.e.)
|
|
||||||
* the position of the moon as seen from the current position on the surface
|
|
||||||
* of the moon.
|
|
||||||
****************************************************************************/
|
|
||||||
void Moon::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
{
|
|
||||||
double
|
|
||||||
eccAnom, ecl, actTime,
|
|
||||||
xv, yv, v, r, xh, yh, zh, xg, yg, zg, xe, ye, ze,
|
|
||||||
Ls, Lm, D, F, mpar, gclat, rho, HA, g,
|
|
||||||
geoRa, geoDec;
|
|
||||||
|
|
||||||
fgAIRCRAFT *air;
|
|
||||||
FGInterface *f;
|
|
||||||
|
|
||||||
air = ¤t_aircraft;
|
|
||||||
f = air->fdm_state;
|
|
||||||
|
|
||||||
updateOrbElements(t);
|
|
||||||
actTime = fgCalcActTime(t);
|
|
||||||
|
|
||||||
// calculate the angle between ecliptic and equatorial coordinate system
|
|
||||||
// in Radians
|
|
||||||
ecl = ((DEG_TO_RAD * 23.4393) - (DEG_TO_RAD * 3.563E-7) * actTime);
|
|
||||||
eccAnom = fgCalcEccAnom(M, e); // Calculate the eccentric anomaly
|
|
||||||
xv = a * (cos(eccAnom) - e);
|
|
||||||
yv = a * (sqrt(1.0 - e*e) * sin(eccAnom));
|
|
||||||
v = atan2(yv, xv); // the moon's true anomaly
|
|
||||||
r = sqrt (xv*xv + yv*yv); // and its distance
|
|
||||||
|
|
||||||
// estimate the geocentric rectangular coordinates here
|
|
||||||
xh = r * (cos(N) * cos (v+w) - sin (N) * sin(v+w) * cos(i));
|
|
||||||
yh = r * (sin(N) * cos (v+w) + cos (N) * sin(v+w) * cos(i));
|
|
||||||
zh = r * (sin(v+w) * sin(i));
|
|
||||||
|
|
||||||
// calculate the ecliptic latitude and longitude here
|
|
||||||
lonEcl = atan2 (yh, xh);
|
|
||||||
latEcl = atan2(zh, sqrt(xh*xh + yh*yh));
|
|
||||||
|
|
||||||
/* Calculate a number of perturbatioin, i.e. disturbances caused by the
|
|
||||||
* gravitational infuence of the sun and the other major planets.
|
|
||||||
* The largest of these even have a name */
|
|
||||||
Ls = ourSun->getM() + ourSun->getw();
|
|
||||||
Lm = M + w + N;
|
|
||||||
D = Lm - Ls;
|
|
||||||
F = Lm - N;
|
|
||||||
|
|
||||||
lonEcl += DEG_TO_RAD * (-1.274 * sin (M - 2*D)
|
|
||||||
+0.658 * sin (2*D)
|
|
||||||
-0.186 * sin(ourSun->getM())
|
|
||||||
-0.059 * sin(2*M - 2*D)
|
|
||||||
-0.057 * sin(M - 2*D + ourSun->getM())
|
|
||||||
+0.053 * sin(M + 2*D)
|
|
||||||
+0.046 * sin(2*D - ourSun->getM())
|
|
||||||
+0.041 * sin(M - ourSun->getM())
|
|
||||||
-0.035 * sin(D)
|
|
||||||
-0.031 * sin(M + ourSun->getM())
|
|
||||||
-0.015 * sin(2*F - 2*D)
|
|
||||||
+0.011 * sin(M - 4*D)
|
|
||||||
);
|
|
||||||
latEcl += DEG_TO_RAD * (-0.173 * sin(F-2*D)
|
|
||||||
-0.055 * sin(M - F - 2*D)
|
|
||||||
-0.046 * sin(M + F - 2*D)
|
|
||||||
+0.033 * sin(F + 2*D)
|
|
||||||
+0.017 * sin(2*M + F)
|
|
||||||
);
|
|
||||||
r += (-0.58 * cos(M - 2*D)
|
|
||||||
-0.46 * cos(2*D)
|
|
||||||
);
|
|
||||||
FG_LOG(FG_GENERAL, FG_INFO, "Running moon update");
|
|
||||||
xg = r * cos(lonEcl) * cos(latEcl);
|
|
||||||
yg = r * sin(lonEcl) * cos(latEcl);
|
|
||||||
zg = r * sin(latEcl);
|
|
||||||
|
|
||||||
xe = xg;
|
|
||||||
ye = yg * cos(ecl) -zg * sin(ecl);
|
|
||||||
ze = yg * sin(ecl) +zg * cos(ecl);
|
|
||||||
|
|
||||||
geoRa = atan2(ye, xe);
|
|
||||||
geoDec = atan2(ze, sqrt(xe*xe + ye*ye));
|
|
||||||
|
|
||||||
/* FG_LOG( FG_GENERAL, FG_INFO,
|
|
||||||
"(geocentric) geoRa = (" << (RAD_TO_DEG * geoRa)
|
|
||||||
<< "), geoDec= (" << (RAD_TO_DEG * geoDec) << ")" ); */
|
|
||||||
|
|
||||||
|
|
||||||
// Given the moon's geocentric ra and dec, calculate its
|
|
||||||
// topocentric ra and dec. i.e. the position as seen from the
|
|
||||||
// surface of the earth, instead of the center of the earth
|
|
||||||
|
|
||||||
// First calculate the moon's parrallax, that is, the apparent size of the
|
|
||||||
// (equatorial) radius of the earth, as seen from the moon
|
|
||||||
mpar = asin ( 1 / r);
|
|
||||||
// FG_LOG( FG_GENERAL, FG_INFO, "r = " << r << " mpar = " << mpar );
|
|
||||||
// FG_LOG( FG_GENERAL, FG_INFO, "lat = " << f->get_Latitude() );
|
|
||||||
|
|
||||||
gclat = f->get_Latitude() - 0.003358 *
|
|
||||||
sin (2 * DEG_TO_RAD * f->get_Latitude() );
|
|
||||||
// FG_LOG( FG_GENERAL, FG_INFO, "gclat = " << gclat );
|
|
||||||
|
|
||||||
rho = 0.99883 + 0.00167 * cos(2 * DEG_TO_RAD * f->get_Latitude());
|
|
||||||
// FG_LOG( FG_GENERAL, FG_INFO, "rho = " << rho );
|
|
||||||
|
|
||||||
if (geoRa < 0)
|
|
||||||
geoRa += (2*FG_PI);
|
|
||||||
|
|
||||||
HA = t->getLst() - (3.8197186 * geoRa);
|
|
||||||
/* FG_LOG( FG_GENERAL, FG_INFO, "t->getLst() = " << t->getLst()
|
|
||||||
<< " HA = " << HA ); */
|
|
||||||
|
|
||||||
g = atan (tan(gclat) / cos ((HA / 3.8197186)));
|
|
||||||
// FG_LOG( FG_GENERAL, FG_INFO, "g = " << g );
|
|
||||||
|
|
||||||
rightAscension = geoRa - mpar * rho * cos(gclat) * sin(HA) / cos (geoDec);
|
|
||||||
declination = geoDec - mpar * rho * sin (gclat) * sin (g - geoDec) / sin(g);
|
|
||||||
|
|
||||||
/* FG_LOG( FG_GENERAL, FG_INFO,
|
|
||||||
"Ra = (" << (RAD_TO_DEG *rightAscension)
|
|
||||||
<< "), Dec= (" << (RAD_TO_DEG *declination) << ")" ); */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* void Moon::newImage()
|
|
||||||
*
|
|
||||||
* This function regenerates a new visual image of the moon, which is added to
|
|
||||||
* solarSystem display list.
|
|
||||||
*
|
|
||||||
* Arguments: Right Ascension and declination
|
|
||||||
*
|
|
||||||
* return value: none
|
|
||||||
**************************************************************************/
|
|
||||||
void Moon::newImage()
|
|
||||||
{
|
|
||||||
fgLIGHT *l = &cur_light_params;
|
|
||||||
float moon_angle = l->moon_angle;
|
|
||||||
|
|
||||||
/*double x_2, x_4, x_8, x_10;
|
|
||||||
GLfloat ambient;
|
|
||||||
GLfloat amb[4];*/
|
|
||||||
int moonSize = 750;
|
|
||||||
|
|
||||||
GLfloat moonColor[4] = {0.85, 0.75, 0.35, 1.0};
|
|
||||||
GLfloat black[4] = {0.0, 0.0, 0.0, 1.0};
|
|
||||||
GLfloat white[4] = {1.0, 1.0, 1.0, 0.0};
|
|
||||||
|
|
||||||
if( moon_angle*RAD_TO_DEG < 100 )
|
|
||||||
{
|
|
||||||
FG_LOG( FG_ASTRO, FG_INFO, "Generating Moon Image" );
|
|
||||||
|
|
||||||
xglPushMatrix();
|
|
||||||
{
|
|
||||||
xglRotatef(((RAD_TO_DEG * rightAscension)- 90.0), 0.0, 0.0, 1.0);
|
|
||||||
xglRotatef((RAD_TO_DEG * declination), 1.0, 0.0, 0.0);
|
|
||||||
|
|
||||||
FG_LOG( FG_GENERAL, FG_INFO,
|
|
||||||
"Ra = (" << (RAD_TO_DEG *rightAscension)
|
|
||||||
<< "), Dec= (" << (RAD_TO_DEG *declination) << ")" );
|
|
||||||
xglTranslatef(0.0, 60000.0, 0.0);
|
|
||||||
glEnable(GL_BLEND); // BLEND ENABLED
|
|
||||||
|
|
||||||
// Draw the halo...
|
|
||||||
if (current_options.get_textures())
|
|
||||||
{
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
||||||
glEnable(GL_TEXTURE_2D); // TEXTURE ENABLED
|
|
||||||
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, moon_halotexid);
|
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
|
||||||
glTexCoord2f(0.0f, 0.0f); glVertex3f(-5000, 0.0, -5000);
|
|
||||||
glTexCoord2f(1.0f, 0.0f); glVertex3f( 5000, 0.0, -5000);
|
|
||||||
glTexCoord2f(1.0f, 1.0f); glVertex3f( 5000, 0.0, 5000);
|
|
||||||
glTexCoord2f(0.0f, 1.0f); glVertex3f(-5000, 0.0, 5000);
|
|
||||||
glEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
xglEnable(GL_LIGHTING); // LIGHTING ENABLED
|
|
||||||
xglEnable( GL_LIGHT0 );
|
|
||||||
// set lighting parameters
|
|
||||||
xglLightfv(GL_LIGHT0, GL_AMBIENT, white );
|
|
||||||
xglLightfv(GL_LIGHT0, GL_DIFFUSE, white );
|
|
||||||
// xglEnable( GL_CULL_FACE );
|
|
||||||
xglMaterialfv(GL_FRONT, GL_AMBIENT, black);
|
|
||||||
xglMaterialfv(GL_FRONT, GL_DIFFUSE, moonColor);
|
|
||||||
|
|
||||||
//glEnable(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
glBlendFunc(GL_ONE, GL_ONE);
|
|
||||||
|
|
||||||
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
||||||
// Draw the moon-proper
|
|
||||||
|
|
||||||
if (current_options.get_textures())
|
|
||||||
{
|
|
||||||
glBindTexture(GL_TEXTURE_2D, moon_texid);
|
|
||||||
gluQuadricTexture(moonObject, GL_TRUE );
|
|
||||||
}
|
|
||||||
gluSphere(moonObject, moonSize, 12, 12 );
|
|
||||||
glDisable(GL_TEXTURE_2D); // TEXTURE DISABLED
|
|
||||||
glDisable(GL_BLEND); // BLEND DISABLED
|
|
||||||
}
|
|
||||||
xglPopMatrix();
|
|
||||||
glDisable(GL_LIGHTING); // Lighting Disabled.
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* moon.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _MOON_HXX_
|
|
||||||
#define _MOON_HXX_
|
|
||||||
|
|
||||||
#include <Aircraft/aircraft.hxx>
|
|
||||||
#include <Include/fg_constants.h>
|
|
||||||
#include <Main/views.hxx>
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
#include "star.hxx"
|
|
||||||
|
|
||||||
class Moon : public CelestialBody
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
void TexInit(); // This should move to the constructor eventually.
|
|
||||||
|
|
||||||
GLUquadricObj *moonObject;
|
|
||||||
GLuint Sphere;
|
|
||||||
GLuint moon_texid;
|
|
||||||
GLuint moon_halotexid;
|
|
||||||
GLubyte *moon_texbuf;
|
|
||||||
GLubyte *moon_halotexbuf;
|
|
||||||
|
|
||||||
void setHalo();
|
|
||||||
public:
|
|
||||||
Moon ( FGTime *t);
|
|
||||||
~Moon();
|
|
||||||
void updatePosition(FGTime *t, Star *ourSun);
|
|
||||||
void newImage();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _MOON_HXX_
|
|
|
@ -1,59 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* neptune.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "neptune.hxx"
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Neptune::Neptune(FGTime *t)
|
|
||||||
* Public constructor for class Neptune
|
|
||||||
* Argument: The current time.
|
|
||||||
* the hard coded orbital elements for Neptune are passed to
|
|
||||||
* CelestialBody::CelestialBody();
|
|
||||||
************************************************************************/
|
|
||||||
Neptune::Neptune(FGTime *t) :
|
|
||||||
CelestialBody(131.7806, 3.0173000E-5,
|
|
||||||
1.7700, -2.550E-7,
|
|
||||||
272.8461, -6.027000E-6,
|
|
||||||
30.058260, 3.313E-8,
|
|
||||||
0.008606, 2.150E-9,
|
|
||||||
260.2471, 0.00599514700, t)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
/*************************************************************************
|
|
||||||
* void Neptune::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
*
|
|
||||||
* calculates the current position of Neptune, by calling the base class,
|
|
||||||
* CelestialBody::updatePosition(); The current magnitude is calculated using
|
|
||||||
* a Neptune specific equation
|
|
||||||
*************************************************************************/
|
|
||||||
void Neptune::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
{
|
|
||||||
CelestialBody::updatePosition(t, ourSun);
|
|
||||||
magnitude = -6.90 + 5*log10 (r*R) + 0.001 *FV;
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* neptune.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _NEPTUNE_HXX_
|
|
||||||
#define _NEPTUNE_HXX_
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
#include "star.hxx"
|
|
||||||
|
|
||||||
class Neptune : public CelestialBody
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Neptune ( FGTime *t);
|
|
||||||
void updatePosition(FGTime *t, Star *ourSun);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _NEPTUNE_HXX_
|
|
|
@ -1,36 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* pluto.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _PLUTO_HXX_
|
|
||||||
#define _PLUTO_HXX_
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
|
|
||||||
class Pluto : public CelestialBody
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Pluto ( FGTime t);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _PLUTO_HXX_
|
|
|
@ -1,69 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* saturn.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "saturn.hxx"
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Saturn::Saturn(FGTime *t)
|
|
||||||
* Public constructor for class Saturn
|
|
||||||
* Argument: The current time.
|
|
||||||
* the hard coded orbital elements for Saturn are passed to
|
|
||||||
* CelestialBody::CelestialBody();
|
|
||||||
************************************************************************/
|
|
||||||
Saturn::Saturn(FGTime *t) :
|
|
||||||
CelestialBody(113.6634, 2.3898000E-5,
|
|
||||||
2.4886, -1.081E-7,
|
|
||||||
339.3939, 2.9766100E-5,
|
|
||||||
9.5547500, 0.000000,
|
|
||||||
0.055546, -9.499E-9,
|
|
||||||
316.9670, 0.03344422820, t)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* void Saturn::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
*
|
|
||||||
* calculates the current position of Saturn, by calling the base class,
|
|
||||||
* CelestialBody::updatePosition(); The current magnitude is calculated using
|
|
||||||
* a Saturn specific equation
|
|
||||||
*************************************************************************/
|
|
||||||
void Saturn::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
{
|
|
||||||
CelestialBody::updatePosition(t, ourSun);
|
|
||||||
|
|
||||||
double actTime = fgCalcActTime(t);
|
|
||||||
double ir = 0.4897394;
|
|
||||||
double Nr = 2.9585076 + 6.6672E-7*actTime;
|
|
||||||
double B = asin (sin(declination) * cos(ir) -
|
|
||||||
cos(declination) * sin(ir) *
|
|
||||||
sin(rightAscension - Nr));
|
|
||||||
double ring_magn = -2.6 * sin(fabs(B)) + 1.2 * pow(sin(B), 2);
|
|
||||||
magnitude = -9.0 + 5*log10(r*R) + 0.044 * FV + ring_magn;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* saturn.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _SATURN_HXX_
|
|
||||||
#define _SATURN_HXX_
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
#include "star.hxx"
|
|
||||||
|
|
||||||
class Saturn : public CelestialBody
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Saturn ( FGTime *t);
|
|
||||||
void updatePosition(FGTime *t, Star *ourSun);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _SATURN_HXX_
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,367 +0,0 @@
|
||||||
// sky.cxx -- model sky with an upside down "bowl"
|
|
||||||
//
|
|
||||||
// Written by Curtis Olson, started December 1997.
|
|
||||||
//
|
|
||||||
// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com
|
|
||||||
//
|
|
||||||
// This program is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU General Public License as
|
|
||||||
// published by the Free Software Foundation; either version 2 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but
|
|
||||||
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
// General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
//
|
|
||||||
// $Id$
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_WINDOWS_H
|
|
||||||
# include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include <GL/glut.h>
|
|
||||||
#include <XGL/xgl.h>
|
|
||||||
|
|
||||||
#include <Aircraft/aircraft.hxx>
|
|
||||||
#include <Debug/logstream.hxx>
|
|
||||||
#include <FDM/flight.hxx>
|
|
||||||
#include <Include/fg_constants.h>
|
|
||||||
#include <Main/views.hxx>
|
|
||||||
#include <Math/fg_random.h>
|
|
||||||
#include <Time/event.hxx>
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
|
|
||||||
#include "sky.hxx"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __MWERKS__
|
|
||||||
# pragma global_optimizer off
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// in meters of course
|
|
||||||
#define CENTER_ELEV 25000.0
|
|
||||||
|
|
||||||
#define INNER_RADIUS 50000.0
|
|
||||||
#define INNER_ELEV 20000.0
|
|
||||||
|
|
||||||
#define MIDDLE_RADIUS 70000.0
|
|
||||||
#define MIDDLE_ELEV 8000.0
|
|
||||||
|
|
||||||
#define OUTER_RADIUS 80000.0
|
|
||||||
#define OUTER_ELEV 0.0
|
|
||||||
|
|
||||||
#define BOTTOM_RADIUS 50000.0
|
|
||||||
#define BOTTOM_ELEV -2000.0
|
|
||||||
|
|
||||||
|
|
||||||
static float inner_vertex[12][3];
|
|
||||||
static float middle_vertex[12][3];
|
|
||||||
static float outer_vertex[12][3];
|
|
||||||
static float bottom_vertex[12][3];
|
|
||||||
|
|
||||||
static float inner_color[12][4];
|
|
||||||
static float middle_color[12][4];
|
|
||||||
static float outer_color[12][4];
|
|
||||||
|
|
||||||
|
|
||||||
// Calculate the sky structure vertices
|
|
||||||
void fgSkyVerticesInit( void ) {
|
|
||||||
float theta;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
FG_LOG(FG_ASTRO, FG_INFO, " Generating the sky dome vertices.");
|
|
||||||
|
|
||||||
for ( i = 0; i < 12; i++ ) {
|
|
||||||
theta = (i * 30.0) * DEG_TO_RAD;
|
|
||||||
|
|
||||||
inner_vertex[i][0] = cos(theta) * INNER_RADIUS;
|
|
||||||
inner_vertex[i][1] = sin(theta) * INNER_RADIUS;
|
|
||||||
inner_vertex[i][2] = INNER_ELEV;
|
|
||||||
|
|
||||||
// printf(" %.2f %.2f\n", cos(theta) * INNER_RADIUS,
|
|
||||||
// sin(theta) * INNER_RADIUS);
|
|
||||||
|
|
||||||
middle_vertex[i][0] = cos((double)theta) * MIDDLE_RADIUS;
|
|
||||||
middle_vertex[i][1] = sin((double)theta) * MIDDLE_RADIUS;
|
|
||||||
middle_vertex[i][2] = MIDDLE_ELEV;
|
|
||||||
|
|
||||||
outer_vertex[i][0] = cos((double)theta) * OUTER_RADIUS;
|
|
||||||
outer_vertex[i][1] = sin((double)theta) * OUTER_RADIUS;
|
|
||||||
outer_vertex[i][2] = OUTER_ELEV;
|
|
||||||
|
|
||||||
bottom_vertex[i][0] = cos((double)theta) * BOTTOM_RADIUS;
|
|
||||||
bottom_vertex[i][1] = sin((double)theta) * BOTTOM_RADIUS;
|
|
||||||
bottom_vertex[i][2] = BOTTOM_ELEV;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// (Re)calculate the sky colors at each vertex
|
|
||||||
void fgSkyColorsInit( void ) {
|
|
||||||
fgLIGHT *l;
|
|
||||||
double sun_angle, diff;
|
|
||||||
double outer_param[3], outer_amt[3], outer_diff[3];
|
|
||||||
double middle_param[3], middle_amt[3], middle_diff[3];
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
l = &cur_light_params;
|
|
||||||
|
|
||||||
FG_LOG( FG_ASTRO, FG_INFO,
|
|
||||||
" Generating the sky colors for each vertex." );
|
|
||||||
|
|
||||||
// setup for the possibility of sunset effects
|
|
||||||
sun_angle = l->sun_angle * RAD_TO_DEG;
|
|
||||||
// fgPrintf( FG_ASTRO, FG_INFO,
|
|
||||||
// " Sun angle in degrees = %.2f\n", sun_angle);
|
|
||||||
|
|
||||||
if ( (sun_angle > 80.0) && (sun_angle < 100.0) ) {
|
|
||||||
// 0.0 - 0.4
|
|
||||||
outer_param[0] = (10.0 - fabs(90.0 - sun_angle)) / 20.0;
|
|
||||||
outer_param[1] = (10.0 - fabs(90.0 - sun_angle)) / 40.0;
|
|
||||||
outer_param[2] = -(10.0 - fabs(90.0 - sun_angle)) / 30.0;
|
|
||||||
// outer_param[2] = 0.0;
|
|
||||||
|
|
||||||
middle_param[0] = (10.0 - fabs(90.0 - sun_angle)) / 40.0;
|
|
||||||
middle_param[1] = (10.0 - fabs(90.0 - sun_angle)) / 80.0;
|
|
||||||
middle_param[2] = 0.0;
|
|
||||||
|
|
||||||
outer_diff[0] = outer_param[0] / 6.0;
|
|
||||||
outer_diff[1] = outer_param[1] / 6.0;
|
|
||||||
outer_diff[2] = outer_param[2] / 6.0;
|
|
||||||
|
|
||||||
middle_diff[0] = middle_param[0] / 6.0;
|
|
||||||
middle_diff[1] = middle_param[1] / 6.0;
|
|
||||||
middle_diff[2] = middle_param[2] / 6.0;
|
|
||||||
} else {
|
|
||||||
outer_param[0] = outer_param[1] = outer_param[2] = 0.0;
|
|
||||||
middle_param[0] = middle_param[1] = middle_param[2] = 0.0;
|
|
||||||
|
|
||||||
outer_diff[0] = outer_diff[1] = outer_diff[2] = 0.0;
|
|
||||||
middle_diff[0] = middle_diff[1] = middle_diff[2] = 0.0;
|
|
||||||
}
|
|
||||||
// printf(" outer_red_param = %.2f outer_red_diff = %.2f\n",
|
|
||||||
// outer_red_param, outer_red_diff);
|
|
||||||
|
|
||||||
// calculate transition colors between sky and fog
|
|
||||||
for ( j = 0; j < 3; j++ ) {
|
|
||||||
outer_amt[j] = outer_param[j];
|
|
||||||
middle_amt[j] = middle_param[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( i = 0; i < 6; i++ ) {
|
|
||||||
for ( j = 0; j < 3; j++ ) {
|
|
||||||
diff = l->sky_color[j] - l->fog_color[j];
|
|
||||||
|
|
||||||
// printf("sky = %.2f fog = %.2f diff = %.2f\n",
|
|
||||||
// l->sky_color[j], l->fog_color[j], diff);
|
|
||||||
|
|
||||||
inner_color[i][j] = l->sky_color[j] - diff * 0.3;
|
|
||||||
middle_color[i][j] = l->sky_color[j] - diff * 0.9 + middle_amt[j];
|
|
||||||
outer_color[i][j] = l->fog_color[j] + outer_amt[j];
|
|
||||||
|
|
||||||
if ( inner_color[i][j] > 1.00 ) { inner_color[i][j] = 1.00; }
|
|
||||||
if ( inner_color[i][j] < 0.10 ) { inner_color[i][j] = 0.10; }
|
|
||||||
if ( middle_color[i][j] > 1.00 ) { middle_color[i][j] = 1.00; }
|
|
||||||
if ( middle_color[i][j] < 0.10 ) { middle_color[i][j] = 0.10; }
|
|
||||||
if ( outer_color[i][j] > 1.00 ) { outer_color[i][j] = 1.00; }
|
|
||||||
if ( outer_color[i][j] < 0.10 ) { outer_color[i][j] = 0.10; }
|
|
||||||
}
|
|
||||||
inner_color[i][3] = middle_color[i][3] = outer_color[i][3] =
|
|
||||||
l->sky_color[3];
|
|
||||||
|
|
||||||
for ( j = 0; j < 3; j++ ) {
|
|
||||||
outer_amt[j] -= outer_diff[j];
|
|
||||||
middle_amt[j] -= middle_diff[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
printf("inner_color[%d] = %.2f %.2f %.2f %.2f\n", i, inner_color[i][0],
|
|
||||||
inner_color[i][1], inner_color[i][2], inner_color[i][3]);
|
|
||||||
printf("middle_color[%d] = %.2f %.2f %.2f %.2f\n", i,
|
|
||||||
middle_color[i][0], middle_color[i][1], middle_color[i][2],
|
|
||||||
middle_color[i][3]);
|
|
||||||
printf("outer_color[%d] = %.2f %.2f %.2f %.2f\n", i,
|
|
||||||
outer_color[i][0], outer_color[i][1], outer_color[i][2],
|
|
||||||
outer_color[i][3]);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( j = 0; j < 3; j++ ) {
|
|
||||||
outer_amt[j] = 0.0;
|
|
||||||
middle_amt[j] = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( i = 6; i < 12; i++ ) {
|
|
||||||
|
|
||||||
for ( j = 0; j < 3; j++ ) {
|
|
||||||
diff = l->sky_color[j] - l->fog_color[j];
|
|
||||||
|
|
||||||
// printf("sky = %.2f fog = %.2f diff = %.2f\n",
|
|
||||||
// l->sky_color[j], l->fog_color[j], diff);
|
|
||||||
|
|
||||||
inner_color[i][j] = l->sky_color[j] - diff * 0.3;
|
|
||||||
middle_color[i][j] = l->sky_color[j] - diff * 0.9 + middle_amt[j];
|
|
||||||
outer_color[i][j] = l->fog_color[j] + outer_amt[j];
|
|
||||||
|
|
||||||
if ( inner_color[i][j] > 1.00 ) { inner_color[i][j] = 1.00; }
|
|
||||||
if ( inner_color[i][j] < 0.10 ) { inner_color[i][j] = 0.10; }
|
|
||||||
if ( middle_color[i][j] > 1.00 ) { middle_color[i][j] = 1.00; }
|
|
||||||
if ( middle_color[i][j] < 0.10 ) { middle_color[i][j] = 0.10; }
|
|
||||||
if ( outer_color[i][j] > 1.00 ) { outer_color[i][j] = 1.00; }
|
|
||||||
if ( outer_color[i][j] < 0.15 ) { outer_color[i][j] = 0.15; }
|
|
||||||
}
|
|
||||||
inner_color[i][3] = middle_color[i][3] = outer_color[i][3] =
|
|
||||||
l->sky_color[3];
|
|
||||||
|
|
||||||
for ( j = 0; j < 3; j++ ) {
|
|
||||||
outer_amt[j] += outer_diff[j];
|
|
||||||
middle_amt[j] += middle_diff[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
printf("inner_color[%d] = %.2f %.2f %.2f %.2f\n", i, inner_color[i][0],
|
|
||||||
inner_color[i][1], inner_color[i][2], inner_color[i][3]);
|
|
||||||
printf("middle_color[%d] = %.2f %.2f %.2f %.2f\n", i,
|
|
||||||
middle_color[i][0], middle_color[i][1], middle_color[i][2],
|
|
||||||
middle_color[i][3]);
|
|
||||||
printf("outer_color[%d] = %.2f %.2f %.2f %.2f\n", i,
|
|
||||||
outer_color[i][0], outer_color[i][1], outer_color[i][2],
|
|
||||||
outer_color[i][3]);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Initialize the sky structure and colors
|
|
||||||
void fgSkyInit( void ) {
|
|
||||||
FG_LOG( FG_ASTRO, FG_INFO, "Initializing the sky" );
|
|
||||||
|
|
||||||
fgSkyVerticesInit();
|
|
||||||
|
|
||||||
// regester fgSkyColorsInit() as an event to be run periodically
|
|
||||||
global_events.Register( "fgSkyColorsInit()", fgSkyColorsInit,
|
|
||||||
fgEVENT::FG_EVENT_READY, 30000);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Draw the Sky
|
|
||||||
void fgSkyRender( void ) {
|
|
||||||
FGInterface *f;
|
|
||||||
fgLIGHT *l;
|
|
||||||
float inner_color[4];
|
|
||||||
float middle_color[4];
|
|
||||||
float outer_color[4];
|
|
||||||
double diff;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
f = current_aircraft.fdm_state;
|
|
||||||
l = &cur_light_params;
|
|
||||||
|
|
||||||
// printf("Rendering the sky.\n");
|
|
||||||
|
|
||||||
// calculate the proper colors
|
|
||||||
for ( i = 0; i < 3; i++ ) {
|
|
||||||
diff = l->sky_color[i] - l->adj_fog_color[i];
|
|
||||||
|
|
||||||
// printf("sky = %.2f fog = %.2f diff = %.2f\n",
|
|
||||||
// l->sky_color[j], l->adj_fog_color[j], diff);
|
|
||||||
|
|
||||||
inner_color[i] = l->sky_color[i] - diff * 0.3;
|
|
||||||
middle_color[i] = l->sky_color[i] - diff * 0.9;
|
|
||||||
outer_color[i] = l->adj_fog_color[i];
|
|
||||||
}
|
|
||||||
inner_color[3] = middle_color[3] = outer_color[3] = l->adj_fog_color[3];
|
|
||||||
|
|
||||||
xglPushMatrix();
|
|
||||||
|
|
||||||
// Translate to view position
|
|
||||||
Point3D zero_elev = current_view.get_cur_zero_elev();
|
|
||||||
xglTranslatef( zero_elev.x(), zero_elev.y(), zero_elev.z() );
|
|
||||||
// printf(" Translated to %.2f %.2f %.2f\n",
|
|
||||||
// zero_elev.x, zero_elev.y, zero_elev.z );
|
|
||||||
|
|
||||||
// Rotate to proper orientation
|
|
||||||
// printf(" lon = %.2f lat = %.2f\n", FG_Longitude * RAD_TO_DEG,
|
|
||||||
// FG_Latitude * RAD_TO_DEG);
|
|
||||||
xglRotatef( f->get_Longitude() * RAD_TO_DEG, 0.0, 0.0, 1.0 );
|
|
||||||
xglRotatef( 90.0 - f->get_Latitude() * RAD_TO_DEG, 0.0, 1.0, 0.0 );
|
|
||||||
xglRotatef( l->sun_rotation * RAD_TO_DEG, 0.0, 0.0, 1.0 );
|
|
||||||
|
|
||||||
// Draw inner/center section of sky*/
|
|
||||||
xglBegin( GL_TRIANGLE_FAN );
|
|
||||||
xglColor4fv(l->sky_color);
|
|
||||||
xglVertex3f(0.0, 0.0, CENTER_ELEV);
|
|
||||||
for ( i = 11; i >= 0; i-- ) {
|
|
||||||
xglColor4fv( inner_color );
|
|
||||||
xglVertex3fv( inner_vertex[i] );
|
|
||||||
}
|
|
||||||
xglColor4fv( inner_color );
|
|
||||||
xglVertex3fv( inner_vertex[11] );
|
|
||||||
xglEnd();
|
|
||||||
|
|
||||||
// Draw the middle ring
|
|
||||||
xglBegin( GL_TRIANGLE_STRIP );
|
|
||||||
for ( i = 0; i < 12; i++ ) {
|
|
||||||
xglColor4fv( middle_color );
|
|
||||||
// printf("middle_color[%d] = %.2f %.2f %.2f %.2f\n", i,
|
|
||||||
// middle_color[i][0], middle_color[i][1], middle_color[i][2],
|
|
||||||
// middle_color[i][3]);
|
|
||||||
// xglColor4f(1.0, 0.0, 0.0, 1.0);
|
|
||||||
xglVertex3fv( middle_vertex[i] );
|
|
||||||
xglColor4fv( inner_color );
|
|
||||||
// printf("inner_color[%d] = %.2f %.2f %.2f %.2f\n", i,
|
|
||||||
// inner_color[i][0], inner_color[i][1], inner_color[i][2],
|
|
||||||
// inner_color[i][3]);
|
|
||||||
// xglColor4f(0.0, 0.0, 1.0, 1.0);
|
|
||||||
xglVertex3fv( inner_vertex[i] );
|
|
||||||
}
|
|
||||||
xglColor4fv( middle_color );
|
|
||||||
// xglColor4f(1.0, 0.0, 0.0, 1.0);
|
|
||||||
xglVertex3fv( middle_vertex[0] );
|
|
||||||
xglColor4fv( inner_color );
|
|
||||||
// xglColor4f(0.0, 0.0, 1.0, 1.0);
|
|
||||||
xglVertex3fv( inner_vertex[0] );
|
|
||||||
xglEnd();
|
|
||||||
|
|
||||||
// Draw the outer ring
|
|
||||||
xglBegin( GL_TRIANGLE_STRIP );
|
|
||||||
for ( i = 0; i < 12; i++ ) {
|
|
||||||
xglColor4fv( outer_color );
|
|
||||||
xglVertex3fv( outer_vertex[i] );
|
|
||||||
xglColor4fv( middle_color );
|
|
||||||
xglVertex3fv( middle_vertex[i] );
|
|
||||||
}
|
|
||||||
xglColor4fv( outer_color );
|
|
||||||
xglVertex3fv( outer_vertex[0] );
|
|
||||||
xglColor4fv( middle_color );
|
|
||||||
xglVertex3fv( middle_vertex[0] );
|
|
||||||
xglEnd();
|
|
||||||
|
|
||||||
// Draw the bottom skirt
|
|
||||||
xglBegin( GL_TRIANGLE_STRIP );
|
|
||||||
xglColor4fv( outer_color );
|
|
||||||
for ( i = 0; i < 12; i++ ) {
|
|
||||||
xglVertex3fv( bottom_vertex[i] );
|
|
||||||
xglVertex3fv( outer_vertex[i] );
|
|
||||||
}
|
|
||||||
xglVertex3fv( bottom_vertex[0] );
|
|
||||||
xglVertex3fv( outer_vertex[0] );
|
|
||||||
xglEnd();
|
|
||||||
|
|
||||||
xglPopMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
// sky.hxx -- model sky with an upside down "bowl"
|
|
||||||
//
|
|
||||||
// Written by Curtis Olson, started December 1997.
|
|
||||||
//
|
|
||||||
// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com
|
|
||||||
//
|
|
||||||
// This program is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU General Public License as
|
|
||||||
// published by the Free Software Foundation; either version 2 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but
|
|
||||||
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
// General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
//
|
|
||||||
// $Id$
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _SKY_HXX
|
|
||||||
#define _SKY_HXX
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
|
||||||
# error This library requires C++
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// (Re)generate the display list
|
|
||||||
void fgSkyInit( void );
|
|
||||||
|
|
||||||
// (Re)calculate the sky colors at each vertex
|
|
||||||
void fgSkyColorsInit( void );
|
|
||||||
|
|
||||||
// Draw the Sky
|
|
||||||
void fgSkyRender( void );
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _SKY_HXX
|
|
||||||
|
|
||||||
|
|
|
@ -1,215 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* solarsystem.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_WINDOWS_H
|
|
||||||
# include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include <GL/glut.h>
|
|
||||||
#include <XGL/xgl.h>
|
|
||||||
#include <Debug/logstream.hxx>
|
|
||||||
#include <Time/sunpos.hxx>
|
|
||||||
#include <Time/moonpos.hxx>
|
|
||||||
#include "solarsystem.hxx"
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
* default constructor for class SolarSystem:
|
|
||||||
* or course there can only be one way to create an entire solar system -:) )
|
|
||||||
* the FGTime argument is needed to properly initialize the the current orbital
|
|
||||||
* elements
|
|
||||||
*************************************************************************/
|
|
||||||
SolarSystem::SolarSystem(FGTime *t)
|
|
||||||
{
|
|
||||||
if (theSolarSystem)
|
|
||||||
{
|
|
||||||
FG_LOG( FG_GENERAL, FG_ALERT, "Error: only one solarsystem allowed" );
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
theSolarSystem = this;
|
|
||||||
ourSun = new Star(t);
|
|
||||||
earthsMoon = new Moon(t);
|
|
||||||
mercury = new Mercury(t);
|
|
||||||
venus = new Venus(t);
|
|
||||||
mars = new Mars(t);
|
|
||||||
jupiter = new Jupiter(t);
|
|
||||||
saturn = new Saturn(t);
|
|
||||||
uranus = new Uranus(t);
|
|
||||||
neptune = new Neptune(t);
|
|
||||||
|
|
||||||
displayList = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
* the destructor for class SolarSystem;
|
|
||||||
**************************************************************************/
|
|
||||||
SolarSystem::~SolarSystem()
|
|
||||||
{
|
|
||||||
delete ourSun;
|
|
||||||
delete earthsMoon;
|
|
||||||
delete mercury;
|
|
||||||
delete venus;
|
|
||||||
delete mars;
|
|
||||||
delete jupiter;
|
|
||||||
delete saturn;
|
|
||||||
delete uranus;
|
|
||||||
delete neptune;
|
|
||||||
}
|
|
||||||
/****************************************************************************
|
|
||||||
* void SolarSystem::rebuild()
|
|
||||||
*
|
|
||||||
* this member function updates the positions for the sun, moon, and planets,
|
|
||||||
* and then rebuilds the display list.
|
|
||||||
*
|
|
||||||
* arguments: none
|
|
||||||
* return value: none
|
|
||||||
***************************************************************************/
|
|
||||||
void SolarSystem::rebuild()
|
|
||||||
{
|
|
||||||
//fgLIGHT *l = &cur_light_params;
|
|
||||||
FGTime *t = FGTime::cur_time_params;
|
|
||||||
//float x, y, z;
|
|
||||||
//double sun_angle;
|
|
||||||
double ra, dec;
|
|
||||||
//double x_2, x_4, x_8, x_10;*/
|
|
||||||
double magnitude;
|
|
||||||
//GLfloat ambient;
|
|
||||||
//GLfloat amb[4];
|
|
||||||
|
|
||||||
glDisable(GL_LIGHTING);
|
|
||||||
|
|
||||||
// Step 1: update all the positions
|
|
||||||
ourSun->updatePosition(t);
|
|
||||||
earthsMoon->updatePosition(t, ourSun);
|
|
||||||
mercury->updatePosition(t, ourSun);
|
|
||||||
venus->updatePosition(t, ourSun);
|
|
||||||
mars->updatePosition(t, ourSun);
|
|
||||||
jupiter->updatePosition(t, ourSun);
|
|
||||||
saturn->updatePosition(t, ourSun);
|
|
||||||
uranus->updatePosition(t, ourSun);
|
|
||||||
neptune->updatePosition(t, ourSun);
|
|
||||||
|
|
||||||
fgUpdateSunPos(); // get the right sun angle (especially important when
|
|
||||||
// running for the first time).
|
|
||||||
fgUpdateMoonPos();
|
|
||||||
|
|
||||||
if (displayList)
|
|
||||||
xglDeleteLists(displayList, 1);
|
|
||||||
|
|
||||||
displayList = xglGenLists(1);
|
|
||||||
|
|
||||||
FG_LOG( FG_ASTRO, FG_INFO, "Rebuilding astro display list" );
|
|
||||||
|
|
||||||
// Step 2: rebuild the display list
|
|
||||||
xglNewList( displayList, GL_COMPILE);
|
|
||||||
{
|
|
||||||
// Step 2a: Add the moon...
|
|
||||||
// Not that it is preferred to draw the moon first, and the sun next, in order to mime a
|
|
||||||
// solar eclipse. This is yet untested though...
|
|
||||||
// Euhh, actually the ecplise doesn't work...
|
|
||||||
|
|
||||||
earthsMoon->newImage();
|
|
||||||
// Step 2b: Add the sun
|
|
||||||
ourSun->newImage();
|
|
||||||
// Step 2c: Add the planets
|
|
||||||
xglBegin(GL_POINTS);
|
|
||||||
mercury->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
|
|
||||||
venus ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
|
|
||||||
mars ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
|
|
||||||
jupiter->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
|
|
||||||
saturn ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
|
|
||||||
uranus ->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
|
|
||||||
neptune->getPos(&ra, &dec, &magnitude);addPlanetToList(ra, dec, magnitude);
|
|
||||||
xglEnd();
|
|
||||||
xglEnable(GL_LIGHTING);
|
|
||||||
}
|
|
||||||
xglEndList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* double SolarSystem::scaleMagnitude(double magn)
|
|
||||||
* This private member function rescales the original magnitude, as used in the
|
|
||||||
* astronomical sense of the word, into a value used by OpenGL to draw a
|
|
||||||
* convincing Star or planet
|
|
||||||
*
|
|
||||||
* Argument: the astronomical magnitude
|
|
||||||
*
|
|
||||||
* return value: the rescaled magnitude
|
|
||||||
****************************************************************************/
|
|
||||||
double SolarSystem::scaleMagnitude(double magn)
|
|
||||||
{
|
|
||||||
double magnitude = (0.0 - magn) / 5.0 + 1.0;
|
|
||||||
magnitude = magnitude * 0.7 + (3 * 0.1);
|
|
||||||
if (magnitude > 1.0) magnitude = 1.0;
|
|
||||||
if (magnitude < 0.0) magnitude = 0.0;
|
|
||||||
return magnitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
* void SolarSytem::addPlanetToList(double ra, double dec, double magn);
|
|
||||||
*
|
|
||||||
* This private member function first causes the magnitude to be properly
|
|
||||||
* rescaled, and then adds the planet to the display list.
|
|
||||||
*
|
|
||||||
* arguments: Right Ascension, declination, and magnitude
|
|
||||||
*
|
|
||||||
* return value: none
|
|
||||||
**************************************************************************/
|
|
||||||
void SolarSystem::addPlanetToList(double ra, double dec, double magn)
|
|
||||||
{
|
|
||||||
double
|
|
||||||
magnitude = scaleMagnitude ( magn );
|
|
||||||
|
|
||||||
fgLIGHT *l = &cur_light_params;
|
|
||||||
|
|
||||||
if ((double) (l->sun_angle - FG_PI_2) >
|
|
||||||
((magnitude - 1.0) * - 20 * DEG_TO_RAD))
|
|
||||||
{
|
|
||||||
xglColor3f (magnitude, magnitude, magnitude);
|
|
||||||
xglVertex3f( 50000.0 * cos (ra) * cos (dec),
|
|
||||||
50000.0 * sin (ra) * cos (dec),
|
|
||||||
50000.0 * sin (dec));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SolarSystem* SolarSystem::theSolarSystem = 0;
|
|
||||||
|
|
||||||
/******************************************************************************
|
|
||||||
* void solarSystemRebuild()
|
|
||||||
* this a just a wrapper function, provided for use as an interface to the
|
|
||||||
* event manager
|
|
||||||
*****************************************************************************/
|
|
||||||
void solarSystemRebuild()
|
|
||||||
{
|
|
||||||
SolarSystem::theSolarSystem->rebuild();
|
|
||||||
}
|
|
|
@ -1,91 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* solarsystem.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _SOLARSYSTEM_H_
|
|
||||||
#define _SOLARSYSTEM_H_
|
|
||||||
|
|
||||||
#include <Time/light.hxx>
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include <Main/views.hxx>
|
|
||||||
|
|
||||||
#include "star.hxx"
|
|
||||||
#include "moon.hxx"
|
|
||||||
#include "mercury.hxx"
|
|
||||||
#include "venus.hxx"
|
|
||||||
#include "mars.hxx"
|
|
||||||
#include "jupiter.hxx"
|
|
||||||
#include "saturn.hxx"
|
|
||||||
#include "uranus.hxx"
|
|
||||||
#include "neptune.hxx"
|
|
||||||
#include "pluto.hxx"
|
|
||||||
|
|
||||||
|
|
||||||
class SolarSystem
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
Star* ourSun;
|
|
||||||
Moon* earthsMoon;
|
|
||||||
Mercury* mercury;
|
|
||||||
Venus* venus;
|
|
||||||
Mars* mars;
|
|
||||||
Jupiter* jupiter;
|
|
||||||
Saturn* saturn;
|
|
||||||
Uranus* uranus;
|
|
||||||
Neptune* neptune;
|
|
||||||
//Pluto* pluto;
|
|
||||||
|
|
||||||
GLint displayList;
|
|
||||||
double scaleMagnitude(double magn);
|
|
||||||
void addPlanetToList(double ra, double dec, double magn);
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
SolarSystem(FGTime *t);
|
|
||||||
CelestialBody *getSun();
|
|
||||||
CelestialBody *getMoon();
|
|
||||||
~SolarSystem();
|
|
||||||
|
|
||||||
static SolarSystem *theSolarSystem; // thanks to Bernie Bright!
|
|
||||||
void rebuild();
|
|
||||||
friend void solarSystemRebuild();
|
|
||||||
void draw();
|
|
||||||
};
|
|
||||||
|
|
||||||
inline CelestialBody* SolarSystem::getSun()
|
|
||||||
{
|
|
||||||
return ourSun;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline CelestialBody* SolarSystem::getMoon()
|
|
||||||
{
|
|
||||||
return earthsMoon;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void SolarSystem::draw()
|
|
||||||
{
|
|
||||||
xglCallList(displayList);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void solarSystemRebuild();
|
|
||||||
|
|
||||||
#endif // _SOLARSYSTEM_H_
|
|
|
@ -1,271 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* star.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
#include <Time/sunpos.hxx>
|
|
||||||
#include <Debug/logstream.hxx>
|
|
||||||
#include <Time/light.hxx>
|
|
||||||
#include <Main/options.hxx>
|
|
||||||
#include "star.hxx"
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Star::Star(FGTime *t)
|
|
||||||
* Public constructor for class Star
|
|
||||||
* Argument: The current time.
|
|
||||||
* the hard coded orbital elements our sun are passed to
|
|
||||||
* CelestialBody::CelestialBody();
|
|
||||||
* note that the word sun is avoided, in order to prevent some compilation
|
|
||||||
* problems on sun systems
|
|
||||||
************************************************************************/
|
|
||||||
Star::Star(FGTime *t) :
|
|
||||||
CelestialBody (0.000000, 0.0000000000,
|
|
||||||
0.0000, 0.00000,
|
|
||||||
282.9404, 4.7093500E-5,
|
|
||||||
1.0000000, 0.000000,
|
|
||||||
0.016709, -1.151E-9,
|
|
||||||
356.0470, 0.98560025850, t)
|
|
||||||
{
|
|
||||||
|
|
||||||
FG_LOG( FG_GENERAL, FG_INFO, "Initializing Sun Texture");
|
|
||||||
#ifdef GL_VERSION_1_1
|
|
||||||
xglGenTextures(1, &sun_texid);
|
|
||||||
xglBindTexture(GL_TEXTURE_2D, sun_texid);
|
|
||||||
#elif GL_EXT_texture_object
|
|
||||||
xglGenTexturesEXT(1, &sun_texid);
|
|
||||||
xglBindTextureEXT(GL_TEXTURE_2D, sun_texid);
|
|
||||||
#else
|
|
||||||
# error port me
|
|
||||||
#endif
|
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
||||||
setTexture();
|
|
||||||
glTexImage2D( GL_TEXTURE_2D,
|
|
||||||
0,
|
|
||||||
GL_RGBA,
|
|
||||||
256, 256,
|
|
||||||
0,
|
|
||||||
GL_RGBA, GL_UNSIGNED_BYTE,
|
|
||||||
sun_texbuf);
|
|
||||||
|
|
||||||
SunObject = gluNewQuadric();
|
|
||||||
if(SunObject == NULL)
|
|
||||||
{
|
|
||||||
printf("gluNewQuadric(SunObject) failed !\n");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//SunList = 0;
|
|
||||||
distance = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Star::~Star()
|
|
||||||
{
|
|
||||||
//delete SunObject;
|
|
||||||
delete [] sun_texbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int texWidth = 256; /* 64x64 is plenty */
|
|
||||||
|
|
||||||
void Star::setTexture()
|
|
||||||
{
|
|
||||||
int texSize;
|
|
||||||
//void *textureBuf;
|
|
||||||
GLubyte *p;
|
|
||||||
int i,j;
|
|
||||||
double radius;
|
|
||||||
|
|
||||||
texSize = texWidth*texWidth;
|
|
||||||
|
|
||||||
sun_texbuf = new GLubyte[texSize*4];
|
|
||||||
if (!sun_texbuf)
|
|
||||||
return; // Ugly!
|
|
||||||
|
|
||||||
p = sun_texbuf;
|
|
||||||
|
|
||||||
radius = (double)(texWidth / 2);
|
|
||||||
|
|
||||||
for (i=0; i < texWidth; i++) {
|
|
||||||
for (j=0; j < texWidth; j++) {
|
|
||||||
double x, y, d;
|
|
||||||
|
|
||||||
x = fabs((double)(i - (texWidth / 2)));
|
|
||||||
y = fabs((double)(j - (texWidth / 2)));
|
|
||||||
|
|
||||||
d = sqrt((x * x) + (y * y));
|
|
||||||
if (d < radius)
|
|
||||||
{
|
|
||||||
double t = 1.0 - (d / radius); // t is 1.0 at center, 0.0 at edge */
|
|
||||||
// inverse square looks nice
|
|
||||||
*p = (int)((double)0xff * (t * t));
|
|
||||||
*(p+1) = (int)((double) 0xff * (t*t));
|
|
||||||
*(p+2) = (int)((double) 0xff * (t*t));
|
|
||||||
*(p+3) = (int)((double) 0xff * (t*t));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*p = 0x00;
|
|
||||||
*(p+1) = 0x00;
|
|
||||||
*(p+2) = 0x00;
|
|
||||||
*(p+3) = 0x00;
|
|
||||||
}
|
|
||||||
p += 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//gluBuild2DMipmaps(GL_TEXTURE_2D, 1, texWidth, texWidth,
|
|
||||||
// GL_LUMINANCE,
|
|
||||||
// GL_UNSIGNED_BYTE, textureBuf);
|
|
||||||
//free(textureBuf);
|
|
||||||
}
|
|
||||||
/*************************************************************************
|
|
||||||
* void Jupiter::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
*
|
|
||||||
* calculates the current position of our sun.
|
|
||||||
*************************************************************************/
|
|
||||||
void Star::updatePosition(FGTime *t)
|
|
||||||
{
|
|
||||||
double
|
|
||||||
actTime, eccAnom,
|
|
||||||
xv, yv, v, r,
|
|
||||||
xe, ye, ze, ecl;
|
|
||||||
|
|
||||||
updateOrbElements(t);
|
|
||||||
|
|
||||||
actTime = fgCalcActTime(t);
|
|
||||||
ecl = DEG_TO_RAD * (23.4393 - 3.563E-7 * actTime); // Angle in Radians
|
|
||||||
eccAnom = fgCalcEccAnom(M, e); // Calculate the eccentric Anomaly (also known as solving Kepler's equation)
|
|
||||||
|
|
||||||
xv = cos(eccAnom) - e;
|
|
||||||
yv = sqrt (1.0 - e*e) * sin(eccAnom);
|
|
||||||
v = atan2 (yv, xv); // the sun's true anomaly
|
|
||||||
distance = r = sqrt (xv*xv + yv*yv); // and its distance
|
|
||||||
|
|
||||||
lonEcl = v + w; // the sun's true longitude
|
|
||||||
latEcl = 0;
|
|
||||||
|
|
||||||
// convert the sun's true longitude to ecliptic rectangular
|
|
||||||
// geocentric coordinates (xs, ys)
|
|
||||||
xs = r * cos (lonEcl);
|
|
||||||
ys = r * sin (lonEcl);
|
|
||||||
|
|
||||||
// convert ecliptic coordinates to equatorial rectangular
|
|
||||||
// geocentric coordinates
|
|
||||||
|
|
||||||
xe = xs;
|
|
||||||
ye = ys * cos (ecl);
|
|
||||||
ze = ys * sin (ecl);
|
|
||||||
|
|
||||||
// And finally, calculate right ascension and declination
|
|
||||||
rightAscension = atan2 (ye, xe);
|
|
||||||
declination = atan2 (ze, sqrt (xe*xe + ye*ye));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Star::newImage(void)
|
|
||||||
{
|
|
||||||
/*static float stars[3];
|
|
||||||
stars[0] = 0.0;
|
|
||||||
stars[1] = 0.0;
|
|
||||||
stars[2] = 1.0;*/
|
|
||||||
|
|
||||||
fgLIGHT *l = &cur_light_params;
|
|
||||||
float sun_angle = l->sun_angle;
|
|
||||||
|
|
||||||
if( sun_angle*RAD_TO_DEG < 100 ) { // else no need to draw sun
|
|
||||||
|
|
||||||
|
|
||||||
double x_2, x_4, x_8, x_10;
|
|
||||||
GLfloat ambient;
|
|
||||||
GLfloat amb[4];
|
|
||||||
int sun_size = 750;
|
|
||||||
|
|
||||||
// daily variation sun gets larger near horizon
|
|
||||||
/*if(sun_angle*RAD_TO_DEG > 84.0 && sun_angle*RAD_TO_DEG < 95)
|
|
||||||
{
|
|
||||||
double sun_grow = 9*fabs(94-sun_angle*RAD_TO_DEG);
|
|
||||||
sun_size = (int)(sun_size + sun_size * cos(sun_grow*DEG_TO_RAD));
|
|
||||||
}*/
|
|
||||||
x_2 = sun_angle * sun_angle;
|
|
||||||
x_4 = x_2 * x_2;
|
|
||||||
x_8 = x_4 * x_4;
|
|
||||||
x_10 = x_8 * x_2;
|
|
||||||
ambient = (float)(0.4 * pow (1.1, - x_10 / 30.0));
|
|
||||||
if (ambient < 0.3) ambient = 0.3;
|
|
||||||
if (ambient > 1.0) ambient = 1.0;
|
|
||||||
|
|
||||||
amb[0] = ((ambient * 6.0) - 1.0); // minimum value = 0.8
|
|
||||||
amb[1] = ((ambient * 11.0) - 3.0); // minimum value = 0.3
|
|
||||||
amb[2] = ((ambient * 12.0) - 3.6); // minimum value = 0.0
|
|
||||||
amb[3] = 1.00;
|
|
||||||
|
|
||||||
if (amb[0] > 1.0) amb[0] = 1.0;
|
|
||||||
if (amb[1] > 1.0) amb[1] = 1.0;
|
|
||||||
if (amb[2] > 1.0) amb[2] = 1.0;
|
|
||||||
xglColor3fv(amb);
|
|
||||||
glPushMatrix();
|
|
||||||
{
|
|
||||||
xglRotatef(((RAD_TO_DEG * rightAscension)- 90.0), 0.0, 0.0, 1.0);
|
|
||||||
xglRotatef((RAD_TO_DEG * declination), 1.0, 0.0, 0.0);
|
|
||||||
xglTranslatef(0,60000,0);
|
|
||||||
if (current_options.get_textures())
|
|
||||||
{
|
|
||||||
glEnable(GL_TEXTURE_2D); // TEXTURE ENABLED
|
|
||||||
glEnable(GL_BLEND); // BLEND ENABLED
|
|
||||||
|
|
||||||
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, sun_texid);
|
|
||||||
|
|
||||||
glBegin(GL_QUADS);
|
|
||||||
glTexCoord2f(0.0f, 0.0f); glVertex3f(-5000, 0.0, -5000);
|
|
||||||
glTexCoord2f(1.0f, 0.0f); glVertex3f( 5000, 0.0, -5000);
|
|
||||||
glTexCoord2f(1.0f, 1.0f); glVertex3f( 5000, 0.0, 5000);
|
|
||||||
glTexCoord2f(0.0f, 1.0f); glVertex3f(-5000, 0.0, 5000);
|
|
||||||
glEnd();
|
|
||||||
}
|
|
||||||
xglDisable(GL_TEXTURE_2D); // TEXTURE DISABLED
|
|
||||||
xglDisable(GL_BLEND); // BLEND DISABLED
|
|
||||||
}
|
|
||||||
|
|
||||||
glPopMatrix();
|
|
||||||
glDisable(GL_LIGHTING); //LIGHTING DISABLED
|
|
||||||
glDisable(GL_BLEND); //BLEND DISABLED
|
|
||||||
glPushMatrix();
|
|
||||||
{
|
|
||||||
xglRotatef(((RAD_TO_DEG * rightAscension)- 90.0), 0.0, 0.0, 1.0);
|
|
||||||
xglRotatef((RAD_TO_DEG * declination), 1.0, 0.0, 0.0);
|
|
||||||
xglColor4fv(amb);
|
|
||||||
xglTranslatef(0,60000,0);
|
|
||||||
gluSphere( SunObject, sun_size, 10, 10 );
|
|
||||||
}
|
|
||||||
glPopMatrix();
|
|
||||||
glDisable(GL_TEXTURE_2D); // TEXTURE DISABLED
|
|
||||||
glDisable(GL_BLEND); // BLEND DISABLED
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,98 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* star.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _STAR_HXX_
|
|
||||||
#define _STAR_HXX_
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
|
|
||||||
|
|
||||||
class Star : public CelestialBody
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
//double longitude; // the sun's true longitude - this is depreciated by
|
|
||||||
// CelestialBody::lonEcl
|
|
||||||
double xs, ys; // the sun's rectangular geocentric coordinates
|
|
||||||
double distance; // the sun's distance to the earth
|
|
||||||
GLUquadricObj *SunObject;
|
|
||||||
GLuint sun_texid;
|
|
||||||
GLubyte *sun_texbuf;
|
|
||||||
|
|
||||||
void setTexture();
|
|
||||||
public:
|
|
||||||
Star (FGTime *t);
|
|
||||||
~Star();
|
|
||||||
void updatePosition(FGTime *t);
|
|
||||||
double getM();
|
|
||||||
double getw();
|
|
||||||
//double getLon();
|
|
||||||
double getxs();
|
|
||||||
double getys();
|
|
||||||
double getDistance();
|
|
||||||
void newImage();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline double Star::getM()
|
|
||||||
{
|
|
||||||
return M;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline double Star::getw()
|
|
||||||
{
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline double Star::getxs()
|
|
||||||
{
|
|
||||||
return xs;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline double Star::getys()
|
|
||||||
{
|
|
||||||
return ys;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline double Star::getDistance()
|
|
||||||
{
|
|
||||||
return distance;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _STAR_HXX_
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,267 +0,0 @@
|
||||||
// stars.cxx -- data structures and routines for managing and rendering stars.
|
|
||||||
//
|
|
||||||
// Written by Curtis Olson, started August 1997.
|
|
||||||
//
|
|
||||||
// Copyright (C) 1997 Curtis L. Olson - curt@me.umn.edu
|
|
||||||
//
|
|
||||||
// This program is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU General Public License as
|
|
||||||
// published by the Free Software Foundation; either version 2 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but
|
|
||||||
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
// General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
//
|
|
||||||
// $Id$
|
|
||||||
//*************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_WINDOWS_H
|
|
||||||
# include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "Include/compiler.h"
|
|
||||||
#ifdef FG_HAVE_STD_INCLUDES
|
|
||||||
# include <cmath>
|
|
||||||
# include <cstdio>
|
|
||||||
# include <cstring>
|
|
||||||
# include <ctime>
|
|
||||||
#else
|
|
||||||
# include <math.h>
|
|
||||||
# include <stdio.h>
|
|
||||||
# include <string.h>
|
|
||||||
# include <time.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include <GL/glut.h>
|
|
||||||
#include <XGL/xgl.h>
|
|
||||||
|
|
||||||
#include <Aircraft/aircraft.hxx>
|
|
||||||
#include <Debug/logstream.hxx>
|
|
||||||
#include <Include/fg_constants.h>
|
|
||||||
#include <Misc/fgpath.hxx>
|
|
||||||
#include <Misc/fgstream.hxx>
|
|
||||||
#include <Misc/stopwatch.hxx>
|
|
||||||
#include <Main/options.hxx>
|
|
||||||
#include <Main/views.hxx>
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "Misc/stopwatch.hxx"
|
|
||||||
|
|
||||||
#include "stars.hxx"
|
|
||||||
|
|
||||||
FG_USING_STD(getline);
|
|
||||||
|
|
||||||
#define EpochStart (631065600)
|
|
||||||
#define DaysSinceEpoch(secs) (((secs)-EpochStart)*(1.0/(24*3600)))
|
|
||||||
#define FG_MAX_STARS 3500
|
|
||||||
|
|
||||||
// Define four structures, each with varying amounts of stars
|
|
||||||
static GLint stars[FG_STAR_LEVELS];
|
|
||||||
|
|
||||||
|
|
||||||
// Initialize the Star Management Subsystem
|
|
||||||
int fgStarsInit( void ) {
|
|
||||||
// -dw- avoid local data > 32k error by dynamic allocation of the
|
|
||||||
// array, problem for some compilers
|
|
||||||
Point3D *starlist = new Point3D[FG_MAX_STARS];
|
|
||||||
// struct CelestialCoord pltPos;
|
|
||||||
double right_ascension, declination, magnitude;
|
|
||||||
double min_magnitude[FG_STAR_LEVELS];
|
|
||||||
// double ra_save, decl_save;
|
|
||||||
// double ra_save1, decl_save1;
|
|
||||||
int i, j, starcount, count;
|
|
||||||
|
|
||||||
FG_LOG( FG_ASTRO, FG_INFO, "Initializing stars" );
|
|
||||||
|
|
||||||
if ( FG_STAR_LEVELS < 4 ) {
|
|
||||||
FG_LOG( FG_ASTRO, FG_ALERT, "Big whups in stars.cxx" );
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// build the full path name to the stars data base file
|
|
||||||
FGPath path ( current_options.get_fg_root() );
|
|
||||||
path.append( "Astro/stars" );
|
|
||||||
FG_LOG( FG_ASTRO, FG_INFO, " Loading stars from " << path.str() );
|
|
||||||
|
|
||||||
fg_gzifstream in( path.str() );
|
|
||||||
if ( ! in ) {
|
|
||||||
FG_LOG( FG_ASTRO, FG_ALERT, "Cannot open star file: " << path.str() );
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
starcount = 0;
|
|
||||||
|
|
||||||
StopWatch timer;
|
|
||||||
timer.start();
|
|
||||||
|
|
||||||
// read in each line of the file
|
|
||||||
while ( ! in.eof() && starcount < FG_MAX_STARS )
|
|
||||||
{
|
|
||||||
in >> skipcomment;
|
|
||||||
string name;
|
|
||||||
getline( in, name, ',' );
|
|
||||||
in >> starlist[starcount];
|
|
||||||
++starcount;
|
|
||||||
}
|
|
||||||
|
|
||||||
timer.stop();
|
|
||||||
FG_LOG( FG_ASTRO, FG_INFO,
|
|
||||||
"Loaded " << starcount << " stars in "
|
|
||||||
<< timer.elapsedSeconds() << " seconds" );
|
|
||||||
|
|
||||||
min_magnitude[0] = 4.2;
|
|
||||||
min_magnitude[1] = 3.6;
|
|
||||||
min_magnitude[2] = 3.0;
|
|
||||||
min_magnitude[3] = 2.4;
|
|
||||||
min_magnitude[4] = 1.8;
|
|
||||||
min_magnitude[5] = 1.2;
|
|
||||||
min_magnitude[6] = 0.6;
|
|
||||||
min_magnitude[7] = 0.0;
|
|
||||||
|
|
||||||
// build the various star display lists
|
|
||||||
for ( i = 0; i < FG_STAR_LEVELS; i++ ) {
|
|
||||||
|
|
||||||
stars[i] = xglGenLists(1);
|
|
||||||
xglNewList( stars[i], GL_COMPILE );
|
|
||||||
xglBegin( GL_POINTS );
|
|
||||||
|
|
||||||
count = 0;
|
|
||||||
|
|
||||||
for ( j = 0; j < starcount; j++ ) {
|
|
||||||
magnitude = starlist[j].z();
|
|
||||||
// printf("magnitude = %.2f\n", magnitude);
|
|
||||||
|
|
||||||
if ( magnitude < min_magnitude[i] ) {
|
|
||||||
right_ascension = starlist[j].x();
|
|
||||||
declination = starlist[j].y();
|
|
||||||
|
|
||||||
count++;
|
|
||||||
|
|
||||||
// scale magnitudes to (0.0 - 1.0)
|
|
||||||
magnitude = (0.0 - magnitude) / 5.0 + 1.0;
|
|
||||||
|
|
||||||
// scale magnitudes again so they look ok
|
|
||||||
if ( magnitude > 1.0 ) { magnitude = 1.0; }
|
|
||||||
if ( magnitude < 0.0 ) { magnitude = 0.0; }
|
|
||||||
// magnitude =
|
|
||||||
// magnitude * 0.7 + (((FG_STAR_LEVELS - 1) - i) * 0.042);
|
|
||||||
|
|
||||||
magnitude = magnitude * 0.9 +
|
|
||||||
(((FG_STAR_LEVELS - 1) - i) * 0.014);
|
|
||||||
// printf(" Found star: %d %s, %.3f %.3f %.3f\n", count,
|
|
||||||
// name, right_ascension, declination, magnitude);
|
|
||||||
|
|
||||||
xglColor3f( magnitude, magnitude, magnitude );
|
|
||||||
//xglColor3f(0,0,0);*/
|
|
||||||
xglVertex3f( 50000.0*cos(right_ascension)*cos(declination),
|
|
||||||
50000.0*sin(right_ascension)*cos(declination),
|
|
||||||
50000.0*sin(declination) );
|
|
||||||
}
|
|
||||||
} // while
|
|
||||||
|
|
||||||
xglEnd();
|
|
||||||
|
|
||||||
/*
|
|
||||||
xglBegin(GL_LINE_LOOP);
|
|
||||||
xglColor3f(1.0, 0.0, 0.0);
|
|
||||||
xglVertex3f( 50000.0 * cos(ra_save-0.2) * cos(decl_save-0.2),
|
|
||||||
50000.0 * sin(ra_save-0.2) * cos(decl_save-0.2),
|
|
||||||
50000.0 * sin(decl_save-0.2) );
|
|
||||||
xglVertex3f( 50000.0 * cos(ra_save+0.2) * cos(decl_save-0.2),
|
|
||||||
50000.0 * sin(ra_save+0.2) * cos(decl_save-0.2),
|
|
||||||
50000.0 * sin(decl_save-0.2) );
|
|
||||||
xglVertex3f( 50000.0 * cos(ra_save+0.2) * cos(decl_save+0.2),
|
|
||||||
50000.0 * sin(ra_save+0.2) * cos(decl_save+0.2),
|
|
||||||
50000.0 * sin(decl_save+0.2) );
|
|
||||||
xglVertex3f( 50000.0 * cos(ra_save-0.2) * cos(decl_save+0.2),
|
|
||||||
50000.0 * sin(ra_save-0.2) * cos(decl_save+0.2),
|
|
||||||
50000.0 * sin(decl_save+0.2) );
|
|
||||||
xglEnd();
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
xglBegin(GL_LINE_LOOP);
|
|
||||||
xglColor3f(0.0, 1.0, 0.0);
|
|
||||||
xglVertex3f( 50000.0 * cos(ra_save1-0.2) * cos(decl_save1-0.2),
|
|
||||||
50000.0 * sin(ra_save1-0.2) * cos(decl_save1-0.2),
|
|
||||||
50000.0 * sin(decl_save1-0.2) );
|
|
||||||
xglVertex3f( 50000.0 * cos(ra_save1+0.2) * cos(decl_save1-0.2),
|
|
||||||
50000.0 * sin(ra_save1+0.2) * cos(decl_save1-0.2),
|
|
||||||
50000.0 * sin(decl_save1-0.2) );
|
|
||||||
xglVertex3f( 50000.0 * cos(ra_save1+0.2) * cos(decl_save1+0.2),
|
|
||||||
50000.0 * sin(ra_save1+0.2) * cos(decl_save1+0.2),
|
|
||||||
50000.0 * sin(decl_save1+0.2) );
|
|
||||||
xglVertex3f( 50000.0 * cos(ra_save1-0.2) * cos(decl_save1+0.2),
|
|
||||||
50000.0 * sin(ra_save1-0.2) * cos(decl_save1+0.2),
|
|
||||||
50000.0 * sin(decl_save1+0.2) );
|
|
||||||
xglEnd();
|
|
||||||
*/
|
|
||||||
|
|
||||||
xglEndList();
|
|
||||||
|
|
||||||
FG_LOG( FG_ASTRO, FG_INFO,
|
|
||||||
" Loading " << count << " stars brighter than "
|
|
||||||
<< min_magnitude[i] );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1; // OK, we got here because initialization worked.
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Draw the Stars
|
|
||||||
void fgStarsRender( void ) {
|
|
||||||
FGInterface *f;
|
|
||||||
fgLIGHT *l;
|
|
||||||
FGTime *t;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
f = current_aircraft.fdm_state;
|
|
||||||
l = &cur_light_params;
|
|
||||||
t = FGTime::cur_time_params;
|
|
||||||
|
|
||||||
// FG_PI_2 + 0.1 is about 6 degrees after sundown and before sunrise
|
|
||||||
|
|
||||||
// t->sun_angle = 3.0; // to force stars to be drawn (for testing)
|
|
||||||
|
|
||||||
// render the stars
|
|
||||||
if ( l->sun_angle > (FG_PI_2 + 5 * DEG_TO_RAD ) ) {
|
|
||||||
// determine which star structure to draw
|
|
||||||
if ( l->sun_angle > (FG_PI_2 + 10.0 * DEG_TO_RAD ) ) {
|
|
||||||
i = 0;
|
|
||||||
} else if ( l->sun_angle > (FG_PI_2 + 8.8 * DEG_TO_RAD ) ) {
|
|
||||||
i = 1;
|
|
||||||
} else if ( l->sun_angle > (FG_PI_2 + 7.5 * DEG_TO_RAD ) ) {
|
|
||||||
i = 2;
|
|
||||||
} else if ( l->sun_angle > (FG_PI_2 + 7.0 * DEG_TO_RAD ) ) {
|
|
||||||
i = 3;
|
|
||||||
} else if ( l->sun_angle > (FG_PI_2 + 6.5 * DEG_TO_RAD ) ) {
|
|
||||||
i = 4;
|
|
||||||
} else if ( l->sun_angle > (FG_PI_2 + 6.0 * DEG_TO_RAD ) ) {
|
|
||||||
i = 5;
|
|
||||||
} else if ( l->sun_angle > (FG_PI_2 + 5.5 * DEG_TO_RAD ) ) {
|
|
||||||
i = 6;
|
|
||||||
} else {
|
|
||||||
i = 7;
|
|
||||||
}
|
|
||||||
|
|
||||||
// printf("RENDERING STARS = %d (night)\n", i);
|
|
||||||
|
|
||||||
xglCallList(stars[i]);
|
|
||||||
} else {
|
|
||||||
// printf("not RENDERING STARS (day)\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
// stars.hxx -- data structures and routines for managing and rendering stars.
|
|
||||||
//
|
|
||||||
// Written by Curtis Olson, started August 1997.
|
|
||||||
//
|
|
||||||
// Copyright (C) 1997 Curtis L. Olson - curt@me.umn.edu
|
|
||||||
//
|
|
||||||
// This program is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU General Public License as
|
|
||||||
// published by the Free Software Foundation; either version 2 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but
|
|
||||||
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
// General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
//
|
|
||||||
// $Id$
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _STARS_HXX
|
|
||||||
#define _STARS_HXX
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
|
||||||
# error This library requires C++
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
|
|
||||||
#define FG_STAR_LEVELS 8 // how many star transitions
|
|
||||||
|
|
||||||
// Initialize the Star Management Subsystem
|
|
||||||
int fgStarsInit( void );
|
|
||||||
|
|
||||||
// Draw the Stars
|
|
||||||
void fgStarsRender( void );
|
|
||||||
|
|
||||||
// [no longer used?] extern FGTime cur_time_params;
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _STARS_HXX
|
|
||||||
|
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* uranus.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "uranus.hxx"
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Uranus::Uranus(FGTime *t)
|
|
||||||
* Public constructor for class Uranus
|
|
||||||
* Argument: The current time.
|
|
||||||
* the hard coded orbital elements for Uranus are passed to
|
|
||||||
* CelestialBody::CelestialBody();
|
|
||||||
************************************************************************/
|
|
||||||
Uranus::Uranus(FGTime *t) :
|
|
||||||
CelestialBody(74.00050, 1.3978000E-5,
|
|
||||||
0.7733, 1.900E-8,
|
|
||||||
96.66120, 3.0565000E-5,
|
|
||||||
19.181710, -1.55E-8,
|
|
||||||
0.047318, 7.450E-9,
|
|
||||||
142.5905, 0.01172580600, t)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* void Uranus::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
*
|
|
||||||
* calculates the current position of Uranus, by calling the base class,
|
|
||||||
* CelestialBody::updatePosition(); The current magnitude is calculated using
|
|
||||||
* a Uranus specific equation
|
|
||||||
*************************************************************************/
|
|
||||||
void Uranus::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
{
|
|
||||||
CelestialBody::updatePosition(t, ourSun);
|
|
||||||
magnitude = -7.15 + 5*log10( r*R) + 0.001 * FV;
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* uranus.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _URANUS_HXX_
|
|
||||||
#define _URANUS_HXX_
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
#include "star.hxx"
|
|
||||||
|
|
||||||
class Uranus : public CelestialBody
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Uranus ( FGTime *t);
|
|
||||||
void updatePosition(FGTime *t, Star *ourSun);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _URANUS_HXX_
|
|
|
@ -1,60 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* venus.cxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "venus.hxx"
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Venus::Venus(FGTime *t)
|
|
||||||
* Public constructor for class Venus
|
|
||||||
* Argument: The current time.
|
|
||||||
* the hard coded orbital elements for Venus are passed to
|
|
||||||
* CelestialBody::CelestialBody();
|
|
||||||
************************************************************************/
|
|
||||||
Venus::Venus(FGTime *t) :
|
|
||||||
CelestialBody(76.67990, 2.4659000E-5,
|
|
||||||
3.3946, 2.75E-8,
|
|
||||||
54.89100, 1.3837400E-5,
|
|
||||||
0.7233300, 0.000000,
|
|
||||||
0.006773, -1.302E-9,
|
|
||||||
48.00520, 1.60213022440, t)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* void Venus::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
*
|
|
||||||
* calculates the current position of Venus, by calling the base class,
|
|
||||||
* CelestialBody::updatePosition(); The current magnitude is calculated using
|
|
||||||
* a Venus specific equation
|
|
||||||
*************************************************************************/
|
|
||||||
void Venus::updatePosition(FGTime *t, Star *ourSun)
|
|
||||||
{
|
|
||||||
CelestialBody::updatePosition(t, ourSun);
|
|
||||||
magnitude = -4.34 + 5*log10( r*R ) + 0.013 * FV + 4.2E-07 * pow(FV,3);
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
/**************************************************************************
|
|
||||||
* venus.hxx
|
|
||||||
* Written by Durk Talsma. Originally started October 1997, for distribution
|
|
||||||
* with the FlightGear project. Version 2 was written in August and
|
|
||||||
* September 1998. This code is based upon algorithms and data kindly
|
|
||||||
* provided by Mr. Paul Schlyter. (pausch@saaf.se).
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*
|
|
||||||
* $Id$
|
|
||||||
**************************************************************************/
|
|
||||||
#ifndef _VENUS_HXX_
|
|
||||||
#define _VENUS_HXX_
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include "celestialBody.hxx"
|
|
||||||
#include "star.hxx"
|
|
||||||
|
|
||||||
class Venus : public CelestialBody
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Venus ( FGTime *t);
|
|
||||||
void updatePosition(FGTime *t, Star *ourSun);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _VENUS_HXX_
|
|
|
@ -1103,7 +1103,7 @@ void fgUpdateHUD( void ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char *gmt_str = get_formated_gmt_time();
|
char *gmt_str = get_formated_gmt_time();
|
||||||
HUD_TextList.add( fgText( 40, 10, gmt_str ) );
|
HUD_TextList.add( fgText( gmt_str, 40, 10) );
|
||||||
|
|
||||||
HUD_TextList.draw();
|
HUD_TextList.draw();
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,6 @@
|
||||||
|
|
||||||
FG_USING_STD(deque);
|
FG_USING_STD(deque);
|
||||||
FG_USING_STD(vector);
|
FG_USING_STD(vector);
|
||||||
FG_USING_NAMESPACE(std);
|
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -234,9 +233,12 @@ extern float HUD_matrix[16];
|
||||||
|
|
||||||
class fgText {
|
class fgText {
|
||||||
private:
|
private:
|
||||||
float x, y;
|
|
||||||
char msg[32];
|
char msg[32];
|
||||||
|
float x, y;
|
||||||
public:
|
public:
|
||||||
|
fgText( char *c = NULL, float x = 0, float y =0 )
|
||||||
|
: x(x), y(y) {strncpy(msg,c,32-1);}
|
||||||
|
|
||||||
fgText( float x = 0, float y = 0, char *c = NULL )
|
fgText( float x = 0, float y = 0, char *c = NULL )
|
||||||
: x(x), y(y) {strncpy(msg,c,32-1);}
|
: x(x), y(y) {strncpy(msg,c,32-1);}
|
||||||
|
|
||||||
|
@ -432,7 +434,7 @@ class instr_item { // An Abstract Base Class (ABC)
|
||||||
}
|
}
|
||||||
void TextString( char *msg, float x, float y )
|
void TextString( char *msg, float x, float y )
|
||||||
{
|
{
|
||||||
HUD_TextList.add(fgText(x, y, msg));
|
HUD_TextList.add(fgText(msg, x, y));
|
||||||
}
|
}
|
||||||
int getStringWidth ( char *str )
|
int getStringWidth ( char *str )
|
||||||
{
|
{
|
||||||
|
|
5
src/FDM/External/Makefile.am
vendored
5
src/FDM/External/Makefile.am
vendored
|
@ -1,5 +0,0 @@
|
||||||
noinst_LIBRARIES = libExternal.a
|
|
||||||
|
|
||||||
libExternal_a_SOURCES = external.cxx external.hxx
|
|
||||||
|
|
||||||
INCLUDES += -I$(top_builddir) -I$(top_builddir)/Simulator
|
|
42
src/FDM/External/external.cxx
vendored
42
src/FDM/External/external.cxx
vendored
|
@ -1,42 +0,0 @@
|
||||||
// external.cxx -- externally driven flight model
|
|
||||||
//
|
|
||||||
// Written by Curtis Olson, started January 1998.
|
|
||||||
//
|
|
||||||
// Copyright (C) 1998 Curtis L. Olson - curt@flightgear.org
|
|
||||||
//
|
|
||||||
// This program is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU General Public License as
|
|
||||||
// published by the Free Software Foundation; either version 2 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but
|
|
||||||
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
// General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
//
|
|
||||||
// $Id$
|
|
||||||
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "external.hxx"
|
|
||||||
|
|
||||||
#include <FDM/flight.hxx>
|
|
||||||
#include <Include/fg_constants.h>
|
|
||||||
|
|
||||||
|
|
||||||
// reset flight params to a specific position
|
|
||||||
void fgExternalInit( FGInterface &f ) {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// update position based on inputs, positions, velocities, etc.
|
|
||||||
void fgExternalUpdate( FGInterface& f, int multiloop ) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
83
src/FDM/External/external.hxx
vendored
83
src/FDM/External/external.hxx
vendored
|
@ -1,83 +0,0 @@
|
||||||
// external.hxx -- the "external" flight model (driven from other
|
|
||||||
// external input)
|
|
||||||
//
|
|
||||||
// Written by Curtis Olson, started December 1998.
|
|
||||||
//
|
|
||||||
// Copyright (C) 1998 Curtis L. Olson - curt@flightgear.org
|
|
||||||
//
|
|
||||||
// This program is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU General Public License as
|
|
||||||
// published by the Free Software Foundation; either version 2 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful, but
|
|
||||||
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
// General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
//
|
|
||||||
// $Id$
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _EXTERNAL_HXX
|
|
||||||
#define _EXTERNAL_HXX
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
|
||||||
# error This library requires C++
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#include <Time/fg_time.hxx>
|
|
||||||
#include <Time/timestamp.hxx>
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
class fgFDM_EXTERNAL {
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Time Stamp
|
|
||||||
|
|
||||||
// The time at which these values are correct (for extrapolating
|
|
||||||
// later frames between position updates)
|
|
||||||
FGTimeStamp t;
|
|
||||||
|
|
||||||
// Positions
|
|
||||||
|
|
||||||
// placement in geodetic coordinates
|
|
||||||
double Latitude;
|
|
||||||
double Longitude;
|
|
||||||
double Altitude;
|
|
||||||
|
|
||||||
// orientation in euler angles relative to local frame (or ground
|
|
||||||
// position)
|
|
||||||
double Phi; // roll
|
|
||||||
double Theta; // pitch
|
|
||||||
double Psi; // heading
|
|
||||||
|
|
||||||
// Velocities
|
|
||||||
|
|
||||||
// velocities in geodetic coordinates
|
|
||||||
double Latitude_dot; // rad/sec
|
|
||||||
double Longitude_dot; // rad/sec
|
|
||||||
double Altitude_dot; // feet/sec
|
|
||||||
|
|
||||||
// rotational rates
|
|
||||||
double Phi_dot;
|
|
||||||
double Theta_dot;
|
|
||||||
double Psi_dot;
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
// reset flight params to a specific position
|
|
||||||
void fgExternalInit( FGInterface& f );
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _EXTERNAL_HXX
|
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ int fgJSBsimInit(double dt) {
|
||||||
FGPath engine_path( current_options.get_fg_root() );
|
FGPath engine_path( current_options.get_fg_root() );
|
||||||
engine_path.append( "Engine" );
|
engine_path.append( "Engine" );
|
||||||
|
|
||||||
FDMExec.GetAircraft()->LoadAircraft(aircraft_path.str(),
|
FDMExec.GetAircraft()->LoadAircraftEx(aircraft_path.str(),
|
||||||
engine_path.str(), "X15");
|
engine_path.str(), "X15");
|
||||||
FG_LOG( FG_FLIGHT, FG_INFO, " loaded aircraft" );
|
FG_LOG( FG_FLIGHT, FG_INFO, " loaded aircraft" );
|
||||||
|
|
|
@ -94,6 +94,43 @@ Control
|
||||||
CnDr - Yaw moment due to rudder
|
CnDr - Yaw moment due to rudder
|
||||||
CnDa - Yaw moment due to aileron
|
CnDa - Yaw moment due to aileron
|
||||||
|
|
||||||
|
This class expects to be run in a directory which contains the subdirectory
|
||||||
|
structure shown below (where example aircraft X-15 is shown):
|
||||||
|
|
||||||
|
aircraft/
|
||||||
|
X-15/
|
||||||
|
X-15.dat reset00 reset01 reset02 ...
|
||||||
|
CDRAG/
|
||||||
|
a0 a M De
|
||||||
|
CSIDE/
|
||||||
|
b r Dr Da
|
||||||
|
CLIFT/
|
||||||
|
a0 a M adt De
|
||||||
|
CROLL/
|
||||||
|
b p r Da Dr
|
||||||
|
CPITCH/
|
||||||
|
a0 a adt q M De
|
||||||
|
CYAW/
|
||||||
|
b p r Dr Da
|
||||||
|
F-16/
|
||||||
|
F-16.dat reset00 reset01 ...
|
||||||
|
CDRAG/
|
||||||
|
a0 a M De
|
||||||
|
...
|
||||||
|
|
||||||
|
The General Idea
|
||||||
|
|
||||||
|
The file structure is arranged so that various modeled aircraft are stored in
|
||||||
|
their own subdirectory. Each aircraft subdirectory is named after the aircraft.
|
||||||
|
There should be a file present in the specific aircraft subdirectory (e.g.
|
||||||
|
aircraft/X-15) with the same name as the directory with a .dat appended. This
|
||||||
|
file contains mass properties information, name of aircraft, etc. for the
|
||||||
|
aircraft. In that same directory are reset files numbered starting from 0 (two
|
||||||
|
digit numbers), e.g. reset03. Within each reset file are values for important
|
||||||
|
state variables for specific flight conditions (altitude, airspeed, etc.). Also
|
||||||
|
within this directory are the directories containing lookup tables for the
|
||||||
|
stability derivatives for the aircraft.
|
||||||
|
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
INCLUDES
|
INCLUDES
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
@ -143,7 +180,7 @@ FGAircraft::~FGAircraft(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FGAircraft::LoadAircraft(string aircraft_path, string engine_path, string fname)
|
bool FGAircraft::LoadAircraftEx(string aircraft_path, string engine_path, string fname)
|
||||||
{
|
{
|
||||||
string path;
|
string path;
|
||||||
string fullpath;
|
string fullpath;
|
||||||
|
@ -153,11 +190,7 @@ bool FGAircraft::LoadAircraft(string aircraft_path, string engine_path, string f
|
||||||
string holding_string;
|
string holding_string;
|
||||||
char scratch[128];
|
char scratch[128];
|
||||||
ifstream coeffInFile;
|
ifstream coeffInFile;
|
||||||
streampos gpos;
|
|
||||||
int axis;
|
|
||||||
string axis_descript;
|
|
||||||
|
|
||||||
axis = -1;
|
|
||||||
aircraftDef = aircraft_path + "/" + fname + "/" + fname + ".cfg";
|
aircraftDef = aircraft_path + "/" + fname + "/" + fname + ".cfg";
|
||||||
ifstream aircraftfile(aircraftDef.c_str());
|
ifstream aircraftfile(aircraftDef.c_str());
|
||||||
cout << "Reading Aircraft Configuration File: " << aircraftDef << endl;
|
cout << "Reading Aircraft Configuration File: " << aircraftDef << endl;
|
||||||
|
@ -168,11 +201,9 @@ bool FGAircraft::LoadAircraft(string aircraft_path, string engine_path, string f
|
||||||
while (!aircraftfile.fail()) {
|
while (!aircraftfile.fail()) {
|
||||||
holding_string.erase();
|
holding_string.erase();
|
||||||
aircraftfile >> holding_string;
|
aircraftfile >> holding_string;
|
||||||
#ifdef __BORLANDC__
|
// if (holding_string.compare("//",0,2) != 0) {
|
||||||
if (holding_string.compare(0, 2, "//") != 0) {
|
if ( !(holding_string.substr(0, 2) == "//") ) {
|
||||||
#else
|
|
||||||
if (holding_string.compare("//",0,2) != 0) {
|
|
||||||
#endif
|
|
||||||
if (holding_string == "AIRCRAFT") {
|
if (holding_string == "AIRCRAFT") {
|
||||||
cout << "Reading in Aircraft parameters ..." << endl;
|
cout << "Reading in Aircraft parameters ..." << endl;
|
||||||
} else if (holding_string == "AERODYNAMICS") {
|
} else if (holding_string == "AERODYNAMICS") {
|
||||||
|
@ -238,63 +269,97 @@ bool FGAircraft::LoadAircraft(string aircraft_path, string engine_path, string f
|
||||||
|
|
||||||
} else if (holding_string == "LIFT") {
|
} else if (holding_string == "LIFT") {
|
||||||
|
|
||||||
axis_descript = " Lift Coefficients ...";
|
cout << " Lift Coefficients ..." << endl;
|
||||||
axis = LiftCoeff;
|
aircraftfile >> tag;
|
||||||
|
streampos gpos = aircraftfile.tellg();
|
||||||
|
aircraftfile >> tag;
|
||||||
|
if ( !(tag == "}") ) {
|
||||||
|
aircraftfile.seekg(gpos);
|
||||||
|
Coeff[LiftCoeff][coeff_ctr[LiftCoeff]] = new FGCoefficient(FDMExec, aircraftfile);
|
||||||
|
coeff_ctr[LiftCoeff]++;
|
||||||
|
} else {
|
||||||
|
cout << " None found ..." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (holding_string == "DRAG") {
|
} else if (holding_string == "DRAG") {
|
||||||
|
|
||||||
axis_descript = " Drag Coefficients ...";
|
cout << " Drag Coefficients ..." << endl;
|
||||||
axis = DragCoeff;
|
aircraftfile >> tag;
|
||||||
|
streampos gpos = aircraftfile.tellg();
|
||||||
|
aircraftfile >> tag;
|
||||||
|
if ( !(tag == "}") ) {
|
||||||
|
aircraftfile.seekg(gpos);
|
||||||
|
Coeff[DragCoeff][coeff_ctr[DragCoeff]] = new FGCoefficient(FDMExec, aircraftfile);
|
||||||
|
coeff_ctr[DragCoeff]++;
|
||||||
|
} else {
|
||||||
|
cout << " None found ..." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (holding_string == "SIDE") {
|
} else if (holding_string == "SIDE") {
|
||||||
|
|
||||||
axis_descript = " Side Coefficients ...";
|
cout << " Side Coefficients ..." << endl;
|
||||||
axis = SideCoeff;
|
aircraftfile >> tag;
|
||||||
|
streampos gpos = aircraftfile.tellg();
|
||||||
|
aircraftfile >> tag;
|
||||||
|
if ( !(tag == "}") ) {
|
||||||
|
aircraftfile.seekg(gpos);
|
||||||
|
Coeff[SideCoeff][coeff_ctr[SideCoeff]] = new FGCoefficient(FDMExec, aircraftfile);
|
||||||
|
coeff_ctr[SideCoeff]++;
|
||||||
|
} else {
|
||||||
|
cout << " None found ..." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (holding_string == "ROLL") {
|
} else if (holding_string == "ROLL") {
|
||||||
|
|
||||||
axis_descript = " Roll Coefficients ...";
|
cout << " Roll Coefficients ..." << endl;
|
||||||
axis = RollCoeff;
|
aircraftfile >> tag;
|
||||||
|
streampos gpos = aircraftfile.tellg();
|
||||||
|
aircraftfile >> tag;
|
||||||
|
if ( !(tag == "}") ) {
|
||||||
|
aircraftfile.seekg(gpos);
|
||||||
|
Coeff[RollCoeff][coeff_ctr[RollCoeff]] = new FGCoefficient(FDMExec, aircraftfile);
|
||||||
|
coeff_ctr[RollCoeff]++;
|
||||||
|
} else {
|
||||||
|
cout << " None found ..." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (holding_string == "PITCH") {
|
} else if (holding_string == "PITCH") {
|
||||||
|
|
||||||
axis_descript = " Pitch Coefficients ...";
|
cout << " Pitch Coefficients ..." << endl;
|
||||||
axis = PitchCoeff;
|
aircraftfile >> tag;
|
||||||
|
streampos gpos = aircraftfile.tellg();
|
||||||
|
aircraftfile >> tag;
|
||||||
|
if ( !(tag == "}") ) {
|
||||||
|
aircraftfile.seekg(gpos);
|
||||||
|
Coeff[PitchCoeff][coeff_ctr[PitchCoeff]] = new FGCoefficient(FDMExec, aircraftfile);
|
||||||
|
coeff_ctr[PitchCoeff]++;
|
||||||
|
} else {
|
||||||
|
cout << " None found ..." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (holding_string == "YAW") {
|
} else if (holding_string == "YAW") {
|
||||||
|
|
||||||
axis_descript = " Yaw Coefficients ...";
|
cout << " Yaw Coefficients ..." << endl;
|
||||||
axis = YawCoeff;
|
aircraftfile >> tag;
|
||||||
|
streampos gpos = aircraftfile.tellg();
|
||||||
|
aircraftfile >> tag;
|
||||||
|
if ( !(tag == "}") ) {
|
||||||
|
aircraftfile.seekg(gpos);
|
||||||
|
Coeff[YawCoeff][coeff_ctr[YawCoeff]] = new FGCoefficient(FDMExec, aircraftfile);
|
||||||
|
coeff_ctr[YawCoeff]++;
|
||||||
|
} else {
|
||||||
|
cout << " None found ..." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (axis >= 0) {
|
|
||||||
cout << axis_descript << endl;
|
|
||||||
aircraftfile >> tag;
|
|
||||||
gpos = aircraftfile.tellg();
|
|
||||||
aircraftfile >> tag;
|
|
||||||
if (tag != "}" ) {
|
|
||||||
while (tag != "}") {
|
|
||||||
aircraftfile.seekg(gpos);
|
|
||||||
Coeff[axis][coeff_ctr[axis]] = new FGCoefficient(FDMExec, aircraftfile);
|
|
||||||
coeff_ctr[axis]++;
|
|
||||||
aircraftfile >> tag;
|
|
||||||
gpos = aircraftfile.tellg();
|
|
||||||
aircraftfile >> tag;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cout << " None found ..." << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
axis = -1;
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
aircraftfile.getline(scratch, 127);
|
aircraftfile.getline(scratch, 127);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cout << "End of Configuration File Parsing." << endl;
|
cout << "End of Configuration File Parsing." << endl;
|
||||||
|
return true;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -385,14 +450,9 @@ void FGAircraft::FAero(void)
|
||||||
for (int ctr=0; ctr < coeff_ctr[axis_ctr]; ctr++)
|
for (int ctr=0; ctr < coeff_ctr[axis_ctr]; ctr++)
|
||||||
F[axis_ctr] += Coeff[axis_ctr][ctr]->TotalValue();
|
F[axis_ctr] += Coeff[axis_ctr][ctr]->TotalValue();
|
||||||
|
|
||||||
Forces[0] += - F[DragCoeff]*cos(alpha)*cos(beta)
|
Forces[0] += F[DragCoeff]*cos(alpha)*cos(beta) - F[SideCoeff]*cos(alpha)*sin(beta) - F[LiftCoeff]*sin(alpha);
|
||||||
- F[SideCoeff]*cos(alpha)*sin(beta)
|
Forces[1] += F[DragCoeff]*sin(beta) + F[SideCoeff]*cos(beta);
|
||||||
+ F[LiftCoeff]*sin(alpha);
|
Forces[2] += F[DragCoeff]*sin(alpha)*cos(beta) - F[SideCoeff]*sin(alpha)*sin(beta) + F[LiftCoeff]*cos(alpha);
|
||||||
Forces[1] += F[DragCoeff]*sin(beta)
|
|
||||||
+ F[SideCoeff]*cos(beta);
|
|
||||||
Forces[2] += - F[DragCoeff]*sin(alpha)*cos(beta)
|
|
||||||
- F[SideCoeff]*sin(alpha)*sin(beta)
|
|
||||||
- F[LiftCoeff]*cos(alpha);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
509
src/FDM/JSBSim/FGAircraft.h
Normal file
509
src/FDM/JSBSim/FGAircraft.h
Normal file
|
@ -0,0 +1,509 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
|
||||||
|
Header: FGAircraft.h
|
||||||
|
Author: Jon S. Berndt
|
||||||
|
Date started: 12/12/98
|
||||||
|
|
||||||
|
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
|
Foundation; either version 2 of the License, or (at your option) any later
|
||||||
|
version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with
|
||||||
|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||||
|
Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Further information about the GNU General Public License can also be found on
|
||||||
|
the world wide web at http://www.gnu.org.
|
||||||
|
|
||||||
|
HISTORY
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
12/12/98 JSB Created
|
||||||
|
|
||||||
|
********************************************************************************
|
||||||
|
SENTRY
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef FGAIRCRAFT_H
|
||||||
|
#define FGAIRCRAFT_H
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
COMMENTS, REFERENCES, and NOTES
|
||||||
|
*******************************************************************************/
|
||||||
|
/**
|
||||||
|
The aerodynamic coefficients used in this model typically are:
|
||||||
|
<PRE>
|
||||||
|
<b>Longitudinal</b>
|
||||||
|
CL0 - Reference lift at zero alpha
|
||||||
|
CD0 - Reference drag at zero alpha
|
||||||
|
CDM - Drag due to Mach
|
||||||
|
CLa - Lift curve slope (w.r.t. alpha)
|
||||||
|
CDa - Drag curve slope (w.r.t. alpha)
|
||||||
|
CLq - Lift due to pitch rate
|
||||||
|
CLM - Lift due to Mach
|
||||||
|
CLadt - Lift due to alpha rate
|
||||||
|
|
||||||
|
Cmadt - Pitching Moment due to alpha rate
|
||||||
|
Cm0 - Reference Pitching moment at zero alpha
|
||||||
|
Cma - Pitching moment slope (w.r.t. alpha)
|
||||||
|
Cmq - Pitch damping (pitch moment due to pitch rate)
|
||||||
|
CmM - Pitch Moment due to Mach
|
||||||
|
|
||||||
|
<b>Lateral</b>
|
||||||
|
Cyb - Side force due to sideslip
|
||||||
|
Cyr - Side force due to yaw rate
|
||||||
|
|
||||||
|
Clb - Dihedral effect (roll moment due to sideslip)
|
||||||
|
Clp - Roll damping (roll moment due to roll rate)
|
||||||
|
Clr - Roll moment due to yaw rate
|
||||||
|
Cnb - Weathercocking stability (yaw moment due to sideslip)
|
||||||
|
Cnp - Rudder adverse yaw (yaw moment due to roll rate)
|
||||||
|
Cnr - Yaw damping (yaw moment due to yaw rate)
|
||||||
|
|
||||||
|
<b>Control</b>
|
||||||
|
CLDe - Lift due to elevator
|
||||||
|
CDDe - Drag due to elevator
|
||||||
|
CyDr - Side force due to rudder
|
||||||
|
CyDa - Side force due to aileron
|
||||||
|
|
||||||
|
CmDe - Pitch moment due to elevator
|
||||||
|
ClDa - Roll moment due to aileron
|
||||||
|
ClDr - Roll moment due to rudder
|
||||||
|
CnDr - Yaw moment due to rudder
|
||||||
|
CnDa - Yaw moment due to aileron
|
||||||
|
</PRE>
|
||||||
|
This class expects to be run in a directory which contains the subdirectory
|
||||||
|
structure shown below (where example aircraft X-15 is shown):
|
||||||
|
|
||||||
|
<PRE>
|
||||||
|
aircraft/
|
||||||
|
X-15/
|
||||||
|
X-15.dat reset00 reset01 reset02 ...
|
||||||
|
CDRAG/
|
||||||
|
a0 a M De
|
||||||
|
CSIDE/
|
||||||
|
b r Dr Da
|
||||||
|
CLIFT/
|
||||||
|
a0 a M adt De
|
||||||
|
CROLL/
|
||||||
|
b p r Da Dr
|
||||||
|
CPITCH/
|
||||||
|
a0 a adt q M De
|
||||||
|
CYAW/
|
||||||
|
b p r Dr Da
|
||||||
|
F-16/
|
||||||
|
F-16.dat reset00 reset01 ...
|
||||||
|
CDRAG/
|
||||||
|
a0 a M De
|
||||||
|
...
|
||||||
|
</PRE>
|
||||||
|
|
||||||
|
The General Idea
|
||||||
|
|
||||||
|
The file structure is arranged so that various modeled aircraft are stored in
|
||||||
|
their own subdirectory. Each aircraft subdirectory is named after the aircraft.
|
||||||
|
There should be a file present in the specific aircraft subdirectory (e.g.
|
||||||
|
aircraft/X-15) with the same name as the directory with a .dat appended. This
|
||||||
|
file contains mass properties information, name of aircraft, etc. for the
|
||||||
|
aircraft. In that same directory are reset files numbered starting from 0 (two
|
||||||
|
digit numbers), e.g. reset03. Within each reset file are values for important
|
||||||
|
state variables for specific flight conditions (altitude, airspeed, etc.). Also
|
||||||
|
within this directory are the directories containing lookup tables for the
|
||||||
|
stability derivatives for the aircraft.
|
||||||
|
@author Jon S. Berndt
|
||||||
|
@memo Encompasses all aircraft functionality and objects
|
||||||
|
@see <ll>
|
||||||
|
<li>[1] Cooke, Zyda, Pratt, and McGhee, "NPSNET: Flight Simulation Dynamic Modeling
|
||||||
|
Using Quaternions", Presence, Vol. 1, No. 4, pp. 404-420 Naval Postgraduate
|
||||||
|
School, January 1994</li>
|
||||||
|
<li>[2] D. M. Henderson, "Euler Angles, Quaternions, and Transformation Matrices",
|
||||||
|
JSC 12960, July 1977</li>
|
||||||
|
<li>[3] Richard E. McFarland, "A Standard Kinematic Model for Flight Simulation at
|
||||||
|
NASA-Ames", NASA CR-2497, January 1975</li>
|
||||||
|
<li>[4] Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics",
|
||||||
|
Wiley & Sons, 1979 ISBN 0-471-03032-5</li>
|
||||||
|
<li>[5] Bernard Etkin, "Dynamics of Flight, Stability and Control", Wiley & Sons,
|
||||||
|
1982 ISBN 0-471-08936-2</li>
|
||||||
|
</ll>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
INCLUDES
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifdef FGFS
|
||||||
|
# include <Include/compiler.h>
|
||||||
|
# ifdef FG_HAVE_STD_INCLUDES
|
||||||
|
# include <fstream>
|
||||||
|
# else
|
||||||
|
# include <fstream.h>
|
||||||
|
# endif
|
||||||
|
# include STL_STRING
|
||||||
|
FG_USING_STD(string);
|
||||||
|
#else
|
||||||
|
# include <fstream>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "FGModel.h"
|
||||||
|
#include "FGCoefficient.h"
|
||||||
|
#include "FGEngine.h"
|
||||||
|
#include "FGTank.h"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
DEFINITIONS
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef FGFS
|
||||||
|
using namespace std;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
CLASS DECLARATION
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
class FGAircraft : public FGModel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Constructor
|
||||||
|
@param FGFDMExec* - a pointer to the "owning" FDM Executive
|
||||||
|
*/
|
||||||
|
FGAircraft(FGFDMExec*);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** Destructor */
|
||||||
|
~FGAircraft(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** This must be called for each dt to execute the model algorithm */
|
||||||
|
bool Run(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** This function must be called with the name of an aircraft which
|
||||||
|
has an associated .dat file in the appropriate subdirectory. The paths
|
||||||
|
to the appropriate subdirectories are given as the first two parameters.
|
||||||
|
@memo Loads the given aircraft.
|
||||||
|
@param string Path to the aircraft files
|
||||||
|
@param string Path to the engine files
|
||||||
|
@param string The name of the aircraft to be loaded, e.g. "X15".
|
||||||
|
@return True - if successful
|
||||||
|
*/
|
||||||
|
bool LoadAircraft(string, string, string);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** This function must be called with the name of an aircraft which
|
||||||
|
has an associated .dat file in the appropriate subdirectory. The paths
|
||||||
|
to the appropriate subdirectories are given as the first two parameters.
|
||||||
|
@memo Loads the given aircraft.
|
||||||
|
@param string Path to the aircraft files
|
||||||
|
@param string Path to the engine files
|
||||||
|
@param string The name of the aircraft to be loaded, e.g. "X15".
|
||||||
|
@return True - if successful
|
||||||
|
*/
|
||||||
|
bool LoadAircraftEx(string, string, string);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Gets the aircraft name as defined in the aircraft config file.
|
||||||
|
@param
|
||||||
|
@return string Aircraft name.
|
||||||
|
*/
|
||||||
|
inline string GetAircraftName(void) {return AircraftName;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Sets the GearUp flag
|
||||||
|
@param boolean true or false
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline void SetGearUp(bool tt) {GearUp = tt;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Returns the state of the GearUp flag
|
||||||
|
@param
|
||||||
|
@return boolean true or false
|
||||||
|
*/
|
||||||
|
inline bool GetGearUp(void) {return GearUp;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Returns the area of the wing
|
||||||
|
@param
|
||||||
|
@return float wing area S, in square feet
|
||||||
|
*/
|
||||||
|
inline float GetWingArea(void) {return WingArea;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Returns the wing span
|
||||||
|
@param
|
||||||
|
@return float wing span in feet
|
||||||
|
*/
|
||||||
|
inline float GetWingSpan(void) {return WingSpan;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Returns the average wing chord
|
||||||
|
@param
|
||||||
|
@return float wing chord in feet
|
||||||
|
*/
|
||||||
|
inline float Getcbar(void) {return cbar;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Returns an engine object
|
||||||
|
@param int The engine number
|
||||||
|
@return FGEengine* The pointer to the requested engine object.
|
||||||
|
*/
|
||||||
|
inline FGEngine* GetEngine(int tt) {return Engine[tt];}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline FGTank* GetTank(int tt) {return Tank[tt];}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetWeight(void) {return Weight;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetMass(void) {return Mass;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetL(void) {return Moments[0];}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetM(void) {return Moments[1];}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetN(void) {return Moments[2];}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetFx(void) {return Forces[0];}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetFy(void) {return Forces[1];}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetFz(void) {return Forces[2];}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetIxx(void) {return Ixx;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetIyy(void) {return Iyy;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetIzz(void) {return Izz;}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
inline float GetIxz(void) {return Ixz;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void GetState(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void PutState(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void FAero(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void FGear(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void FMass(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void FProp(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void MAero(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void MGear(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void MMass(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void MProp(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
void MassChange(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
float Moments[3];
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
float Forces[3];
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
|
string AircraftName;
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
///
|
||||||
|
float Ixx, Iyy, Izz, Ixz, EmptyMass, Mass;
|
||||||
|
///
|
||||||
|
float Xcg, Ycg, Zcg;
|
||||||
|
///
|
||||||
|
float Xep, Yep, Zep;
|
||||||
|
///
|
||||||
|
float rho, qbar, Vt;
|
||||||
|
///
|
||||||
|
float alpha, beta;
|
||||||
|
///
|
||||||
|
float WingArea, WingSpan, cbar;
|
||||||
|
///
|
||||||
|
float phi, tht, psi;
|
||||||
|
///
|
||||||
|
float Weight, EmptyWeight;
|
||||||
|
///
|
||||||
|
float dt;
|
||||||
|
|
||||||
|
///
|
||||||
|
int numTanks;
|
||||||
|
///
|
||||||
|
int numEngines;
|
||||||
|
///
|
||||||
|
int numSelectedOxiTanks;
|
||||||
|
///
|
||||||
|
int numSelectedFuelTanks;
|
||||||
|
///
|
||||||
|
FGTank* Tank[MAX_TANKS];
|
||||||
|
///
|
||||||
|
FGEngine *Engine[MAX_ENGINES];
|
||||||
|
|
||||||
|
///
|
||||||
|
FGCoefficient *Coeff[6][10];
|
||||||
|
///
|
||||||
|
int coeff_ctr[6];
|
||||||
|
|
||||||
|
///
|
||||||
|
bool GearUp;
|
||||||
|
|
||||||
|
///
|
||||||
|
enum Param {LiftCoeff,
|
||||||
|
DragCoeff,
|
||||||
|
SideCoeff,
|
||||||
|
RollCoeff,
|
||||||
|
PitchCoeff,
|
||||||
|
YawCoeff,
|
||||||
|
numCoeffs};
|
||||||
|
|
||||||
|
///
|
||||||
|
string Axis[6];
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#endif
|
|
@ -71,17 +71,8 @@ bool FGAtmosphere::Run(void)
|
||||||
+ 7.0E-13*State->Geth()*State->Geth()
|
+ 7.0E-13*State->Geth()*State->Geth()
|
||||||
- 2.0E-18*State->Geth()*State->Geth()*State->Geth();
|
- 2.0E-18*State->Geth()*State->Geth()*State->Geth();
|
||||||
|
|
||||||
State->SetMach(State->GetVt()/State->Geta());
|
State->SetMach(State->GetVt()/State->Geta());
|
||||||
} else { // skip Run() execution this time
|
} else { // skip Run() execution this time
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
float FGAtmosphere::CalcRho(float altitude)
|
|
||||||
{
|
|
||||||
return (0.002377 - 7.0E-08*altitude
|
|
||||||
+ 7.0E-13*altitude*altitude
|
|
||||||
- 2.0E-18*altitude*altitude*altitude);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -58,12 +58,26 @@ using namespace std;
|
||||||
class FGAtmosphere : public FGModel
|
class FGAtmosphere : public FGModel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Constructor
|
||||||
|
@param FGFDMExec* - a pointer to the "owning" FDM Executive
|
||||||
|
*/
|
||||||
FGAtmosphere(FGFDMExec*);
|
FGAtmosphere(FGFDMExec*);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Destructor
|
||||||
|
*/
|
||||||
~FGAtmosphere(void);
|
~FGAtmosphere(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** This must be called for each dt to execute the model algorithm */
|
||||||
bool Run(void);
|
bool Run(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo Returns the air density
|
||||||
|
@return float air density in slugs/cubic foot
|
||||||
|
*/
|
||||||
inline float Getrho(void) {return rho;}
|
inline float Getrho(void) {return rho;}
|
||||||
float CalcRho(float altitude);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -30,6 +30,69 @@ FUNCTIONAL DESCRIPTION
|
||||||
This class models the stability derivative coefficient lookup tables or
|
This class models the stability derivative coefficient lookup tables or
|
||||||
equations. Note that the coefficients need not be calculated each delta-t.
|
equations. Note that the coefficients need not be calculated each delta-t.
|
||||||
|
|
||||||
|
The coefficient files are located in the axis subdirectory for each aircraft.
|
||||||
|
For instance, for the X-15, you would find subdirectories under the
|
||||||
|
aircraft/X-15/ directory named CLIFT, CDRAG, CSIDE, CROLL, CPITCH, CYAW. Under
|
||||||
|
each of these directories would be files named a, a0, q, and so on. The file
|
||||||
|
named "a" under the CLIFT directory would contain data for the stability
|
||||||
|
derivative modeling lift due to a change in alpha. See the FGAircraft.cpp file
|
||||||
|
for additional information. The coefficient files have the following format:
|
||||||
|
|
||||||
|
<name of coefficient>
|
||||||
|
<short description of coefficient with no embedded spaces>
|
||||||
|
<method used in calculating the coefficient: TABLE | EQUATION | VECTOR | VALUE>
|
||||||
|
<parameter identifier for table row (if required)>
|
||||||
|
<parameter identifier for table column (if required)>
|
||||||
|
<OR'ed list of parameter identifiers needed to turn this coefficient into a force>
|
||||||
|
<number of rows in table (if required)>
|
||||||
|
<number of columns in table (if required)>
|
||||||
|
|
||||||
|
<value of parameter indexing into the column of a table or vector - or value
|
||||||
|
itself for a VALUE coefficient>
|
||||||
|
<values of parameter indexing into row of a table if TABLE type> <Value of
|
||||||
|
coefficient at this row and column>
|
||||||
|
|
||||||
|
<... repeat above for each column of data in table ...>
|
||||||
|
|
||||||
|
As an example for the X-15, for the lift due to mach:
|
||||||
|
|
||||||
|
CLa0
|
||||||
|
Lift_at_zero_alpha
|
||||||
|
Table 8 3
|
||||||
|
16384
|
||||||
|
32768
|
||||||
|
16387
|
||||||
|
|
||||||
|
0.00
|
||||||
|
0.0 0.0
|
||||||
|
0.5 0.4
|
||||||
|
0.9 0.9
|
||||||
|
1.0 1.6
|
||||||
|
1.1 1.3
|
||||||
|
1.4 1.0
|
||||||
|
2.0 0.5
|
||||||
|
3.0 0.5
|
||||||
|
|
||||||
|
30000.00
|
||||||
|
0.0 0.0
|
||||||
|
0.5 0.5
|
||||||
|
0.9 1.0
|
||||||
|
1.0 1.7
|
||||||
|
1.1 1.4
|
||||||
|
1.4 1.1
|
||||||
|
2.0 0.6
|
||||||
|
3.0 0.6
|
||||||
|
|
||||||
|
70000.00
|
||||||
|
0.0 0.0
|
||||||
|
0.5 0.6
|
||||||
|
0.9 1.1
|
||||||
|
1.0 1.7
|
||||||
|
1.1 1.5
|
||||||
|
1.4 1.2
|
||||||
|
2.0 0.7
|
||||||
|
3.0 0.7
|
||||||
|
|
||||||
Note that the values in a row which index into the table must be the same value
|
Note that the values in a row which index into the table must be the same value
|
||||||
for each column of data, so the first column of numbers for each altitude are
|
for each column of data, so the first column of numbers for each altitude are
|
||||||
seen to be equal, and there are the same number of values for each altitude.
|
seen to be equal, and there are the same number of values for each altitude.
|
||||||
|
@ -62,29 +125,10 @@ INCLUDES
|
||||||
|
|
||||||
FGCoefficient::FGCoefficient(FGFDMExec* fdex, ifstream& coeffDefFile)
|
FGCoefficient::FGCoefficient(FGFDMExec* fdex, ifstream& coeffDefFile)
|
||||||
{
|
{
|
||||||
int r, c, start, end, n;
|
int r, c;
|
||||||
float ftrashcan;
|
float ftrashcan;
|
||||||
string strashcan;
|
string strashcan;
|
||||||
|
|
||||||
coeffdef["FG_QBAR"] = 1;
|
|
||||||
coeffdef["FG_WINGAREA"] = 2;
|
|
||||||
coeffdef["FG_WINGSPAN"] = 4;
|
|
||||||
coeffdef["FG_CBAR"] = 8;
|
|
||||||
coeffdef["FG_ALPHA"] = 16;
|
|
||||||
coeffdef["FG_ALPHADOT"] = 32;
|
|
||||||
coeffdef["FG_BETA"] = 64;
|
|
||||||
coeffdef["FG_BETADOT"] = 128;
|
|
||||||
coeffdef["FG_PITCHRATE"] = 256;
|
|
||||||
coeffdef["FG_ROLLRATE"] = 512;
|
|
||||||
coeffdef["FG_YAWRATE"] = 1024;
|
|
||||||
coeffdef["FG_ELEVATOR"] = 2048;
|
|
||||||
coeffdef["FG_AILERON"] = 4096;
|
|
||||||
coeffdef["FG_RUDDER"] = 8192;
|
|
||||||
coeffdef["FG_MACH"] = 16384;
|
|
||||||
coeffdef["FG_ALTITUDE"] = 32768L;
|
|
||||||
coeffdef["FG_BI2VEL"] = 65536L;
|
|
||||||
coeffdef["FG_CI2VEL"] = 131072L;
|
|
||||||
|
|
||||||
FDMExec = fdex;
|
FDMExec = fdex;
|
||||||
State = FDMExec->GetState();
|
State = FDMExec->GetState();
|
||||||
Atmosphere = FDMExec->GetAtmosphere();
|
Atmosphere = FDMExec->GetAtmosphere();
|
||||||
|
@ -119,51 +163,19 @@ FGCoefficient::FGCoefficient(FGFDMExec* fdex, ifstream& coeffDefFile)
|
||||||
coeffDefFile >> columns;
|
coeffDefFile >> columns;
|
||||||
cout << "Cols: " << columns;
|
cout << "Cols: " << columns;
|
||||||
}
|
}
|
||||||
|
coeffDefFile >> LookupR;
|
||||||
cout << endl;
|
cout << endl;
|
||||||
|
cout << " Row indexing parameter: " << LookupR << endl;
|
||||||
coeffDefFile >> strashcan;
|
|
||||||
if (strashcan.substr(0,1) == "F") {
|
|
||||||
LookupR = coeffdef[strashcan.c_str()];
|
|
||||||
cout << " Row indexing parameter: " << strashcan << endl;
|
|
||||||
} else {
|
|
||||||
LookupR = atoi(strashcan.c_str());
|
|
||||||
cout << " Row indexing parameter: " << LookupR << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == TABLE) {
|
if (type == TABLE) {
|
||||||
coeffDefFile >> strashcan;
|
coeffDefFile >> LookupC;
|
||||||
if (strashcan.substr(0,1) == "F") {
|
cout << " Column indexing parameter: " << LookupC << endl;
|
||||||
LookupC = coeffdef[strashcan.c_str()];
|
|
||||||
cout << " Column indexing parameter: " << strashcan << endl;
|
|
||||||
} else {
|
|
||||||
LookupC = atoi(strashcan.c_str());
|
|
||||||
cout << " Column indexing parameter: " << LookupC << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
coeffDefFile >> strashcan;
|
|
||||||
|
|
||||||
end = strashcan.length();
|
|
||||||
n = strashcan.find("|");
|
|
||||||
start = 0;
|
|
||||||
multipliers = 0;
|
|
||||||
if (strashcan.substr(0,1) == "F") {
|
|
||||||
while(n < end && n >= 0) {
|
|
||||||
n -= start;
|
|
||||||
multipliers += coeffdef[strashcan.substr(start,n).c_str()];
|
|
||||||
start += n+1;
|
|
||||||
n = strashcan.find("|",start);
|
|
||||||
}
|
|
||||||
multipliers += coeffdef[strashcan.substr(start,end).c_str()];
|
|
||||||
} else {
|
|
||||||
multipliers = atoi(strashcan.c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
coeffDefFile >> multipliers;
|
||||||
cout << " Non-Dimensionalized by: ";
|
cout << " Non-Dimensionalized by: ";
|
||||||
|
|
||||||
mult_count = 0;
|
mult_count = 0;
|
||||||
if (multipliers & FG_QBAR) {
|
if (multipliers & FG_QBAR) {
|
||||||
mult_idx[mult_count] = FG_QBAR;
|
mult_idx[mult_count] = FG_QBAR;
|
||||||
|
@ -244,23 +256,12 @@ FGCoefficient::FGCoefficient(FGFDMExec* fdex, ifstream& coeffDefFile)
|
||||||
mult_idx[mult_count] = FG_ALTITUDE;
|
mult_idx[mult_count] = FG_ALTITUDE;
|
||||||
mult_count++;
|
mult_count++;
|
||||||
cout << "h ";
|
cout << "h ";
|
||||||
}
|
|
||||||
if (multipliers & FG_BI2VEL) {
|
|
||||||
mult_idx[mult_count] = FG_BI2VEL;
|
|
||||||
mult_count++;
|
|
||||||
cout << "b /(2*Vt) ";
|
|
||||||
}
|
|
||||||
if (multipliers & FG_CI2VEL) {
|
|
||||||
mult_idx[mult_count] = FG_CI2VEL;
|
|
||||||
mult_count++;
|
|
||||||
cout << "c /(2*Vt) ";
|
|
||||||
}
|
}
|
||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
switch(type) {
|
switch(type) {
|
||||||
case VALUE:
|
case VALUE:
|
||||||
coeffDefFile >> StaticValue;
|
coeffDefFile >> StaticValue;
|
||||||
cout << " Value = " << StaticValue << endl;
|
|
||||||
break;
|
break;
|
||||||
case VECTOR:
|
case VECTOR:
|
||||||
Allocate(rows,2);
|
Allocate(rows,2);
|
||||||
|
@ -282,7 +283,6 @@ FGCoefficient::FGCoefficient(FGFDMExec* fdex, ifstream& coeffDefFile)
|
||||||
case TABLE:
|
case TABLE:
|
||||||
Allocate(rows, columns);
|
Allocate(rows, columns);
|
||||||
|
|
||||||
Table3D[0][0] = 0.0;
|
|
||||||
for (c=1;c<=columns;c++) {
|
for (c=1;c<=columns;c++) {
|
||||||
coeffDefFile >> Table3D[0][c];
|
coeffDefFile >> Table3D[0][c];
|
||||||
for (r=1;r<=rows;r++) {
|
for (r=1;r<=rows;r++) {
|
||||||
|
@ -299,7 +299,7 @@ FGCoefficient::FGCoefficient(FGFDMExec* fdex, ifstream& coeffDefFile)
|
||||||
}
|
}
|
||||||
cout << endl;
|
cout << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -353,11 +353,15 @@ float FGCoefficient::Value(float rVal, float cVal)
|
||||||
col2temp = rFactor*(Table3D[r][c] - Table3D[r-1][c]) + Table3D[r-1][c];
|
col2temp = rFactor*(Table3D[r][c] - Table3D[r-1][c]) + Table3D[r-1][c];
|
||||||
|
|
||||||
Value = col1temp + cFactor*(col2temp - col1temp);
|
Value = col1temp + cFactor*(col2temp - col1temp);
|
||||||
|
|
||||||
|
//cout << "Value for " << description << " is " << Value;
|
||||||
|
|
||||||
for (midx=0;midx<mult_count;midx++) {
|
for (midx=0;midx<mult_count;midx++) {
|
||||||
Value *= GetCoeffVal(mult_idx[midx]);
|
Value *= GetCoeffVal(mult_idx[midx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//cout << " after multipliers it is: " << Value << endl;
|
||||||
|
|
||||||
return Value;
|
return Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,7 +372,7 @@ float FGCoefficient::Value(float Val)
|
||||||
int r, midx;
|
int r, midx;
|
||||||
|
|
||||||
if (rows < 2) return 0.0;
|
if (rows < 2) return 0.0;
|
||||||
|
|
||||||
for (r=1;r<=rows;r++) if (Table3D[r][0] >= Val) break;
|
for (r=1;r<=rows;r++) if (Table3D[r][0] >= Val) break;
|
||||||
r = r < 2 ? 2 : (r > rows ? rows : r);
|
r = r < 2 ? 2 : (r > rows ? rows : r);
|
||||||
|
|
||||||
|
@ -381,10 +385,14 @@ float FGCoefficient::Value(float Val)
|
||||||
|
|
||||||
Value = Factor*(Table3D[r][1] - Table3D[r-1][1]) + Table3D[r-1][1];
|
Value = Factor*(Table3D[r][1] - Table3D[r-1][1]) + Table3D[r-1][1];
|
||||||
|
|
||||||
|
// cout << "Value for " << description << " is " << Value;
|
||||||
|
|
||||||
for (midx=0;midx<mult_count;midx++) {
|
for (midx=0;midx<mult_count;midx++) {
|
||||||
Value *= GetCoeffVal(mult_idx[midx]);
|
Value *= GetCoeffVal(mult_idx[midx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//cout << " after multipliers it is: " << Value << endl;
|
||||||
|
|
||||||
return Value;
|
return Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -396,10 +404,14 @@ float FGCoefficient::Value(void)
|
||||||
|
|
||||||
Value = StaticValue;
|
Value = StaticValue;
|
||||||
|
|
||||||
|
// cout << "Value for " << description << " is " << Value << endl;
|
||||||
|
|
||||||
for (midx=0;midx<mult_count;midx++) {
|
for (midx=0;midx<mult_count;midx++) {
|
||||||
Value *= GetCoeffVal(mult_idx[midx]);
|
Value *= GetCoeffVal(mult_idx[midx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cout << " after multipliers it is: " << Value << endl;
|
||||||
|
|
||||||
return Value;
|
return Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -424,42 +436,53 @@ float FGCoefficient::GetCoeffVal(int val_idx)
|
||||||
{
|
{
|
||||||
switch(val_idx) {
|
switch(val_idx) {
|
||||||
case FG_QBAR:
|
case FG_QBAR:
|
||||||
|
//cout << "Qbar: " << State->Getqbar() << endl;
|
||||||
return State->Getqbar();
|
return State->Getqbar();
|
||||||
case FG_WINGAREA:
|
case FG_WINGAREA:
|
||||||
|
//cout << "S: " << Aircraft->GetWingArea() << endl;
|
||||||
return Aircraft->GetWingArea();
|
return Aircraft->GetWingArea();
|
||||||
case FG_WINGSPAN:
|
case FG_WINGSPAN:
|
||||||
|
//cout << "b: " << Aircraft->GetWingSpan() << endl;
|
||||||
return Aircraft->GetWingSpan();
|
return Aircraft->GetWingSpan();
|
||||||
case FG_CBAR:
|
case FG_CBAR:
|
||||||
|
//cout << "Cbar: " << Aircraft->Getcbar() << endl;
|
||||||
return Aircraft->Getcbar();
|
return Aircraft->Getcbar();
|
||||||
case FG_ALPHA:
|
case FG_ALPHA:
|
||||||
|
//cout << "Alpha: " << Translation->Getalpha() << endl;
|
||||||
return Translation->Getalpha();
|
return Translation->Getalpha();
|
||||||
case FG_ALPHADOT:
|
case FG_ALPHADOT:
|
||||||
|
//cout << "Adot: " << State->Getadot() << endl;
|
||||||
return State->Getadot();
|
return State->Getadot();
|
||||||
case FG_BETA:
|
case FG_BETA:
|
||||||
|
//cout << "Beta: " << Translation->Getbeta() << endl;
|
||||||
return Translation->Getbeta();
|
return Translation->Getbeta();
|
||||||
case FG_BETADOT:
|
case FG_BETADOT:
|
||||||
|
//cout << "Bdot: " << State->Getbdot() << endl;
|
||||||
return State->Getbdot();
|
return State->Getbdot();
|
||||||
case FG_PITCHRATE:
|
case FG_PITCHRATE:
|
||||||
|
//cout << "Q: " << Rotation->GetQ() << endl;
|
||||||
return Rotation->GetQ();
|
return Rotation->GetQ();
|
||||||
case FG_ROLLRATE:
|
case FG_ROLLRATE:
|
||||||
|
//cout << "P: " << Rotation->GetP() << endl;
|
||||||
return Rotation->GetP();
|
return Rotation->GetP();
|
||||||
case FG_YAWRATE:
|
case FG_YAWRATE:
|
||||||
|
//cout << "R: " << Rotation->GetR() << endl;
|
||||||
return Rotation->GetR();
|
return Rotation->GetR();
|
||||||
case FG_ELEVATOR:
|
case FG_ELEVATOR:
|
||||||
|
//cout << "De: " << FCS->GetDe() << endl;
|
||||||
return FCS->GetDe();
|
return FCS->GetDe();
|
||||||
case FG_AILERON:
|
case FG_AILERON:
|
||||||
|
//cout << "Da: " << FCS->GetDa() << endl;
|
||||||
return FCS->GetDa();
|
return FCS->GetDa();
|
||||||
case FG_RUDDER:
|
case FG_RUDDER:
|
||||||
|
//cout << "Dr: " << FCS->GetDr() << endl;
|
||||||
return FCS->GetDr();
|
return FCS->GetDr();
|
||||||
case FG_MACH:
|
case FG_MACH:
|
||||||
|
//cout << "Mach: " << State->GetMach() << endl;
|
||||||
return State->GetMach();
|
return State->GetMach();
|
||||||
case FG_ALTITUDE:
|
case FG_ALTITUDE:
|
||||||
|
//cout << "h: " << State->Geth() << endl;
|
||||||
return State->Geth();
|
return State->Geth();
|
||||||
case FG_BI2VEL:
|
|
||||||
return Aircraft->GetWingSpan()/(2.0 * State->GetVt());
|
|
||||||
case FG_CI2VEL:
|
|
||||||
return Aircraft->Getcbar()/(2.0 * State->GetVt());
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,8 +51,6 @@ INCLUDES
|
||||||
# include <fstream>
|
# include <fstream>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
DEFINES
|
DEFINES
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
@ -75,8 +73,6 @@ using namespace std;
|
||||||
#define FG_RUDDER 8192
|
#define FG_RUDDER 8192
|
||||||
#define FG_MACH 16384
|
#define FG_MACH 16384
|
||||||
#define FG_ALTITUDE 32768L
|
#define FG_ALTITUDE 32768L
|
||||||
#define FG_BI2VEL 65536L
|
|
||||||
#define FG_CI2VEL 131072L
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
FORWARD DECLARATIONS
|
FORWARD DECLARATIONS
|
||||||
|
@ -94,11 +90,81 @@ class FGOutput;
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
COMMENTS, REFERENCES, and NOTES
|
COMMENTS, REFERENCES, and NOTES
|
||||||
********************************************************************************
|
*******************************************************************************/
|
||||||
|
/**
|
||||||
This class models the stability derivative coefficient lookup tables or
|
This class models the stability derivative coefficient lookup tables or
|
||||||
equations. Note that the coefficients need not be calculated each delta-t.
|
equations. Note that the coefficients need not be calculated each delta-t.
|
||||||
|
|
||||||
|
The coefficient files are located in the axis subdirectory for each aircraft.
|
||||||
|
For instance, for the X-15, you would find subdirectories under the
|
||||||
|
aircraft/X-15/ directory named CLIFT, CDRAG, CSIDE, CROLL, CPITCH, CYAW. Under
|
||||||
|
each of these directories would be files named a, a0, q, and so on. The file
|
||||||
|
named "a" under the CLIFT directory would contain data for the stability
|
||||||
|
derivative modeling lift due to a change in alpha. See the FGAircraft.cpp file
|
||||||
|
for additional information. The coefficient files have the following format:
|
||||||
|
|
||||||
|
<name of coefficient>
|
||||||
|
<short description of coefficient with no embedded spaces>
|
||||||
|
<method used in calculating the coefficient: TABLE | EQUATION | VECTOR | VALUE>
|
||||||
|
<parameter identifier for table row (if required)>
|
||||||
|
<parameter identifier for table column (if required)>
|
||||||
|
<OR'ed list of parameter identifiers needed to turn this coefficient into a force>
|
||||||
|
<number of rows in table (if required)>
|
||||||
|
<number of columns in table (if required)>
|
||||||
|
|
||||||
|
<value of parameter indexing into the column of a table or vector - or value
|
||||||
|
itself for a VALUE coefficient>
|
||||||
|
<values of parameter indexing into row of a table if TABLE type> <Value of
|
||||||
|
coefficient at this row and column>
|
||||||
|
|
||||||
|
<... repeat above for each column of data in table ...>
|
||||||
|
|
||||||
|
As an example for the X-15, for the lift due to mach:
|
||||||
|
<PRE>
|
||||||
|
|
||||||
|
CLa0
|
||||||
|
Lift_at_zero_alpha
|
||||||
|
Table 8 3
|
||||||
|
16384
|
||||||
|
32768
|
||||||
|
16387
|
||||||
|
|
||||||
|
0.00
|
||||||
|
0.0 0.0
|
||||||
|
0.5 0.4
|
||||||
|
0.9 0.9
|
||||||
|
1.0 1.6
|
||||||
|
1.1 1.3
|
||||||
|
1.4 1.0
|
||||||
|
2.0 0.5
|
||||||
|
3.0 0.5
|
||||||
|
|
||||||
|
30000.00
|
||||||
|
0.0 0.0
|
||||||
|
0.5 0.5
|
||||||
|
0.9 1.0
|
||||||
|
1.0 1.7
|
||||||
|
1.1 1.4
|
||||||
|
1.4 1.1
|
||||||
|
2.0 0.6
|
||||||
|
3.0 0.6
|
||||||
|
|
||||||
|
70000.00
|
||||||
|
0.0 0.0
|
||||||
|
0.5 0.6
|
||||||
|
0.9 1.1
|
||||||
|
1.0 1.7
|
||||||
|
1.1 1.5
|
||||||
|
1.4 1.2
|
||||||
|
2.0 0.7
|
||||||
|
3.0 0.7
|
||||||
|
</PRE>
|
||||||
|
|
||||||
|
Note that the values in a row which index into the table must be the same value
|
||||||
|
for each column of data, so the first column of numbers for each altitude are
|
||||||
|
seen to be equal, and there are the same number of values for each altitude.
|
||||||
|
|
||||||
|
<PRE>
|
||||||
FG_QBAR 1
|
FG_QBAR 1
|
||||||
FG_WINGAREA 2
|
FG_WINGAREA 2
|
||||||
FG_WINGSPAN 4
|
FG_WINGSPAN 4
|
||||||
|
@ -115,31 +181,83 @@ FG_AILERON 4096
|
||||||
FG_RUDDER 8192
|
FG_RUDDER 8192
|
||||||
FG_MACH 16384
|
FG_MACH 16384
|
||||||
FG_ALTITUDE 32768L
|
FG_ALTITUDE 32768L
|
||||||
FG_BI2VEL 65536L
|
</PRE>
|
||||||
FG_CI2VEL 131072L
|
@author Jon S. Berndt
|
||||||
|
@memo This class models the stability derivative coefficient lookup tables or equations.
|
||||||
********************************************************************************
|
*/
|
||||||
|
/*******************************************************************************
|
||||||
CLASS DECLARATION
|
CLASS DECLARATION
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
class FGCoefficient
|
class FGCoefficient
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
FGCoefficient(FGFDMExec*, ifstream&);
|
FGCoefficient(FGFDMExec*, ifstream&);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
~FGCoefficient(void);
|
~FGCoefficient(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
bool Allocate(int);
|
bool Allocate(int);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
bool Allocate(int, int);
|
bool Allocate(int, int);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
float Value(float, float);
|
float Value(float, float);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
float Value(float);
|
float Value(float);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
float Value(void);
|
float Value(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
float TotalValue(void);
|
float TotalValue(void);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** @memo
|
||||||
|
@param
|
||||||
|
@return
|
||||||
|
*/
|
||||||
enum Type {UNKNOWN, VALUE, VECTOR, TABLE, EQUATION};
|
enum Type {UNKNOWN, VALUE, VECTOR, TABLE, EQUATION};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef map<string, long> CoeffMap;
|
|
||||||
CoeffMap coeffdef;
|
|
||||||
string filename;
|
string filename;
|
||||||
string description;
|
string description;
|
||||||
string name;
|
string name;
|
|
@ -51,8 +51,11 @@ FGControls::~FGControls() {
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $Log$
|
||||||
// Revision 1.6 1999/06/29 15:30:33 curt
|
// Revision 1.1 1999/06/17 18:07:34 curt
|
||||||
// Updated contributed by Jon Berndt.
|
// Initial revision
|
||||||
|
//
|
||||||
|
// Revision 1.3 1999/05/08 03:19:15 curt
|
||||||
|
// Incorporated latest JSBsim updates.
|
||||||
//
|
//
|
||||||
// Revision 1.1 1999/02/13 01:12:03 curt
|
// Revision 1.1 1999/02/13 01:12:03 curt
|
||||||
// Initial Revision.
|
// Initial Revision.
|
|
@ -177,8 +177,11 @@ extern FGControls controls;
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $Log$
|
||||||
// Revision 1.6 1999/06/29 15:30:35 curt
|
// Revision 1.1 1999/06/17 18:07:34 curt
|
||||||
// Updated contributed by Jon Berndt.
|
// Initial revision
|
||||||
|
//
|
||||||
|
// Revision 1.3 1999/05/08 03:19:16 curt
|
||||||
|
// Incorporated latest JSBsim updates.
|
||||||
//
|
//
|
||||||
// Revision 1.1 1999/02/13 01:12:03 curt
|
// Revision 1.1 1999/02/13 01:12:03 curt
|
||||||
// Initial Revision.
|
// Initial Revision.
|
|
@ -76,4 +76,4 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
#endif
|
#endif
|
|
@ -115,7 +115,7 @@ FGFDMExec::FGFDMExec(void)
|
||||||
Schedule(Translation, 1);
|
Schedule(Translation, 1);
|
||||||
Schedule(Position, 1);
|
Schedule(Position, 1);
|
||||||
Schedule(Auxiliary, 1);
|
Schedule(Auxiliary, 1);
|
||||||
Schedule(Output, 1);
|
Schedule(Output, 5);
|
||||||
|
|
||||||
terminate = false;
|
terminate = false;
|
||||||
frozen = false;
|
frozen = false;
|
|
@ -59,8 +59,8 @@ class FGOutput;
|
||||||
class FGFDMExec
|
class FGFDMExec
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FGFDMExec::FGFDMExec(void);
|
FGFDMExec(void);
|
||||||
FGFDMExec::~FGFDMExec(void);
|
~FGFDMExec(void);
|
||||||
|
|
||||||
FGModel* FirstModel;
|
FGModel* FirstModel;
|
||||||
|
|
|
@ -16,8 +16,8 @@ void main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
FGFDMExec* FDMExec;
|
FGFDMExec* FDMExec;
|
||||||
|
|
||||||
// struct timespec short_wait = {0,100000000};
|
struct timespec short_wait = {0,100000000};
|
||||||
// struct timespec no_wait = {0,100000000};
|
struct timespec no_wait = {0,100000000};
|
||||||
|
|
||||||
if (argc != 3) {
|
if (argc != 3) {
|
||||||
cout << endl
|
cout << endl
|
||||||
|
@ -28,7 +28,7 @@ void main(int argc, char** argv)
|
||||||
|
|
||||||
FDMExec = new FGFDMExec();
|
FDMExec = new FGFDMExec();
|
||||||
|
|
||||||
FDMExec->GetAircraft()->LoadAircraft("aircraft", "engine", string(argv[1]));
|
FDMExec->GetAircraft()->LoadAircraftEx("aircraft", "engine", string(argv[1]));
|
||||||
FDMExec->GetState()->Reset("aircraft", string(argv[2]));
|
FDMExec->GetState()->Reset("aircraft", string(argv[2]));
|
||||||
|
|
||||||
while (FDMExec->GetState()->Getsim_time() <= 25.0)
|
while (FDMExec->GetState()->Getsim_time() <= 25.0)
|
||||||
|
@ -38,13 +38,13 @@ void main(int argc, char** argv)
|
||||||
//
|
//
|
||||||
|
|
||||||
if (FDMExec->GetState()->Getsim_time() > 5.0) {
|
if (FDMExec->GetState()->Getsim_time() > 5.0) {
|
||||||
|
FDMExec->GetFCS()->SetDa(0.05);
|
||||||
|
FDMExec->GetFCS()->SetDr(0.05);
|
||||||
FDMExec->GetFCS()->SetDe(0.05);
|
FDMExec->GetFCS()->SetDe(0.05);
|
||||||
// FDMExec->GetFCS()->SetDr(0.05);
|
|
||||||
// FDMExec->GetFCS()->SetDa(0.05);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FDMExec->Run();
|
FDMExec->Run();
|
||||||
// nanosleep(&short_wait,&no_wait);
|
nanosleep(&short_wait,&no_wait);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete FDMExec;
|
delete FDMExec;
|
|
@ -120,8 +120,8 @@ FGMatrix& FGMatrix::operator=(const FGMatrix& A)
|
||||||
data = A.data;
|
data = A.data;
|
||||||
} else {
|
} else {
|
||||||
data = alloc(rows,cols);
|
data = alloc(rows,cols);
|
||||||
for (unsigned int i=0; i<=rows; i++) {
|
for (int i=0; i<=rows; i++) {
|
||||||
for (unsigned int j=0; j<=cols; j++) {
|
for (int j=0; j<=cols; j++) {
|
||||||
data[i][j] = A.data[i][j];
|
data[i][j] = A.data[i][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -161,8 +161,8 @@ void FGMatrix::SetOParams(char delim,int width,int prec,int origin)
|
||||||
void FGMatrix::InitMatrix(double value)
|
void FGMatrix::InitMatrix(double value)
|
||||||
{
|
{
|
||||||
if (data) {
|
if (data) {
|
||||||
for (unsigned int i=0;i<=rows;i++) {
|
for (int i=0;i<=rows;i++) {
|
||||||
for (unsigned int j=0;j<=cols;j++) {
|
for (int j=0;j<=cols;j++) {
|
||||||
operator()(i,j) = value;
|
operator()(i,j) = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,8 +187,8 @@ FGMatrix operator-(FGMatrix& A, FGMatrix& B)
|
||||||
|
|
||||||
FGMatrix Diff(A.Rows(),A.Cols());
|
FGMatrix Diff(A.Rows(),A.Cols());
|
||||||
Diff.keep=true;
|
Diff.keep=true;
|
||||||
for (unsigned int i=1;i<=A.Rows();i++) {
|
for (int i=1;i<=A.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=A.Cols();j++) {
|
for (int j=1;j<=A.Cols();j++) {
|
||||||
Diff(i,j)=A(i,j)-B(i,j);
|
Diff(i,j)=A(i,j)-B(i,j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -205,8 +205,8 @@ void operator-=(FGMatrix &A,FGMatrix &B)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i=1;i<=A.Rows();i++) {
|
for (int i=1;i<=A.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=A.Cols();j++) {
|
for (int j=1;j<=A.Cols();j++) {
|
||||||
A(i,j)-=B(i,j);
|
A(i,j)-=B(i,j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -224,8 +224,8 @@ FGMatrix operator+(FGMatrix& A, FGMatrix& B)
|
||||||
|
|
||||||
FGMatrix Sum(A.Rows(),A.Cols());
|
FGMatrix Sum(A.Rows(),A.Cols());
|
||||||
Sum.keep = true;
|
Sum.keep = true;
|
||||||
for (unsigned int i=1;i<=A.Rows();i++) {
|
for (int i=1;i<=A.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=A.Cols();j++) {
|
for (int j=1;j<=A.Cols();j++) {
|
||||||
Sum(i,j)=A(i,j)+B(i,j);
|
Sum(i,j)=A(i,j)+B(i,j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -241,8 +241,8 @@ void operator+=(FGMatrix &A,FGMatrix &B)
|
||||||
cout << endl;
|
cout << endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
for (unsigned int i=1;i<=A.Rows();i++) {
|
for (int i=1;i<=A.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=A.Cols();j++) {
|
for (int j=1;j<=A.Cols();j++) {
|
||||||
A(i,j)+=B(i,j);
|
A(i,j)+=B(i,j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -253,8 +253,8 @@ FGMatrix operator*(double scalar,FGMatrix &A)
|
||||||
{
|
{
|
||||||
FGMatrix Product(A.Rows(),A.Cols());
|
FGMatrix Product(A.Rows(),A.Cols());
|
||||||
Product.keep = true;
|
Product.keep = true;
|
||||||
for (unsigned int i=1;i<=A.Rows();i++) {
|
for (int i=1;i<=A.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=A.Cols();j++) {
|
for (int j=1;j<=A.Cols();j++) {
|
||||||
Product(i,j) = scalar*A(i,j);
|
Product(i,j) = scalar*A(i,j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -264,8 +264,8 @@ FGMatrix operator*(double scalar,FGMatrix &A)
|
||||||
|
|
||||||
void operator*=(FGMatrix &A,double scalar)
|
void operator*=(FGMatrix &A,double scalar)
|
||||||
{
|
{
|
||||||
for (unsigned int i=1;i<=A.Rows();i++) {
|
for (int i=1;i<=A.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=A.Cols();j++) {
|
for (int j=1;j<=A.Cols();j++) {
|
||||||
A(i,j)*=scalar;
|
A(i,j)*=scalar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -284,10 +284,10 @@ FGMatrix operator*(FGMatrix &Left, FGMatrix &Right)
|
||||||
|
|
||||||
FGMatrix Product(Left.Rows(),Right.Cols());
|
FGMatrix Product(Left.Rows(),Right.Cols());
|
||||||
Product.keep = true;
|
Product.keep = true;
|
||||||
for (unsigned int i=1;i<=Left.Rows();i++) {
|
for (int i=1;i<=Left.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=Right.Cols();j++) {
|
for (int j=1;j<=Right.Cols();j++) {
|
||||||
Product(i,j) = 0;
|
Product(i,j) = 0;
|
||||||
for (unsigned int k=1;k<=Left.Cols();k++) {
|
for (int k=1;k<=Left.Cols();k++) {
|
||||||
Product(i,j)+=Left(i,k)*Right(k,j);
|
Product(i,j)+=Left(i,k)*Right(k,j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -309,10 +309,10 @@ void operator*=(FGMatrix &Left,FGMatrix &Right)
|
||||||
double **prod;
|
double **prod;
|
||||||
|
|
||||||
prod=alloc(Left.Rows(),Right.Cols());
|
prod=alloc(Left.Rows(),Right.Cols());
|
||||||
for (unsigned int i=1;i<=Left.Rows();i++) {
|
for (int i=1;i<=Left.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=Right.Cols();j++) {
|
for (int j=1;j<=Right.Cols();j++) {
|
||||||
prod[i][j] = 0;
|
prod[i][j] = 0;
|
||||||
for (unsigned int k=1;k<=Left.Cols();k++) {
|
for (int k=1;k<=Left.Cols();k++) {
|
||||||
prod[i][j]+=Left(i,k)*Right(k,j);
|
prod[i][j]+=Left(i,k)*Right(k,j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -327,8 +327,8 @@ FGMatrix operator/(FGMatrix& A, double scalar)
|
||||||
{
|
{
|
||||||
FGMatrix Quot(A.Rows(),A.Cols());
|
FGMatrix Quot(A.Rows(),A.Cols());
|
||||||
A.keep = true;
|
A.keep = true;
|
||||||
for (unsigned int i=1;i<=A.Rows();i++) {
|
for (int i=1;i<=A.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=A.Cols();j++) {
|
for (int j=1;j<=A.Cols();j++) {
|
||||||
Quot(i,j)=A(i,j)/scalar;
|
Quot(i,j)=A(i,j)/scalar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -338,8 +338,8 @@ FGMatrix operator/(FGMatrix& A, double scalar)
|
||||||
|
|
||||||
void operator/=(FGMatrix &A,double scalar)
|
void operator/=(FGMatrix &A,double scalar)
|
||||||
{
|
{
|
||||||
for (unsigned int i=1;i<=A.Rows();i++) {
|
for (int i=1;i<=A.Rows();i++) {
|
||||||
for (unsigned int j=1;j<=A.Cols();j++) {
|
for (int j=1;j<=A.Cols();j++) {
|
||||||
A(i,j)/=scalar;
|
A(i,j)/=scalar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -357,8 +357,8 @@ void FGMatrix::T(void)
|
||||||
|
|
||||||
void FGMatrix::TransposeSquare(void)
|
void FGMatrix::TransposeSquare(void)
|
||||||
{
|
{
|
||||||
for (unsigned int i=1;i<=rows;i++) {
|
for (int i=1;i<=rows;i++) {
|
||||||
for (unsigned int j=i+1;j<=cols;j++) {
|
for (int j=i+1;j<=cols;j++) {
|
||||||
double tmp=data[i][j];
|
double tmp=data[i][j];
|
||||||
data[i][j]=data[j][i];
|
data[i][j]=data[j][i];
|
||||||
data[j][i]=tmp;
|
data[j][i]=tmp;
|
||||||
|
@ -372,8 +372,8 @@ void FGMatrix::TransposeNonSquare(void)
|
||||||
double **tran;
|
double **tran;
|
||||||
|
|
||||||
tran=alloc(rows,cols);
|
tran=alloc(rows,cols);
|
||||||
for (unsigned int i=1;i<=rows;i++) {
|
for (int i=1;i<=rows;i++) {
|
||||||
for (unsigned int j=1;j<=cols;j++) {
|
for (int j=1;j<=cols;j++) {
|
||||||
tran[j][i]=data[i][j];
|
tran[j][i]=data[i][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -190,9 +190,9 @@ void FGOutput::DelimitedOutput(void)
|
||||||
cout << "Latitude,";
|
cout << "Latitude,";
|
||||||
cout << "Longitude,";
|
cout << "Longitude,";
|
||||||
cout << "QBar,";
|
cout << "QBar,";
|
||||||
cout << "Alpha,";
|
cout << "Alpha";
|
||||||
cout << "L,";
|
cout << "L";
|
||||||
cout << "M,";
|
cout << "M";
|
||||||
cout << "N";
|
cout << "N";
|
||||||
cout << endl;
|
cout << endl;
|
||||||
FirstPass = false;
|
FirstPass = false;
|
|
@ -130,7 +130,7 @@ bool FGState::Reset(string path, string fname)
|
||||||
FDMExec->GetTranslation()->SetABG(alpha, beta, gamma);
|
FDMExec->GetTranslation()->SetABG(alpha, beta, gamma);
|
||||||
|
|
||||||
Vt = sqrt(U*U + V*V + W*W);
|
Vt = sqrt(U*U + V*V + W*W);
|
||||||
qbar = 0.5*(U*U + V*V + W*W)*FDMExec->GetAtmosphere()->CalcRho(h);
|
qbar = sqrt(U*U + V*V + W*W);
|
||||||
|
|
||||||
Q0 = sin(psi*0.5)*sin(tht*0.5)*sin(phi*0.5) + cos(psi*0.5)*cos(tht*0.5)*cos(phi*0.5);
|
Q0 = sin(psi*0.5)*sin(tht*0.5)*sin(phi*0.5) + cos(psi*0.5)*cos(tht*0.5)*cos(phi*0.5);
|
||||||
Q1 = -sin(psi*0.5)*sin(tht*0.5)*cos(phi*0.5) + cos(psi*0.5)*cos(tht*0.5)*sin(phi*0.5);
|
Q1 = -sin(psi*0.5)*sin(tht*0.5)*cos(phi*0.5) + cos(psi*0.5)*cos(tht*0.5)*sin(phi*0.5);
|
|
@ -76,7 +76,7 @@ FGUtility::~FGUtility()
|
||||||
|
|
||||||
float FGUtility::ToGeodetic()
|
float FGUtility::ToGeodetic()
|
||||||
{
|
{
|
||||||
float Latitude, Radius, Altitude;
|
float GeodeticLat, Latitude, Radius, Altitude;
|
||||||
float tanLat, xAlpha, muAlpha, sinmuAlpha, denom, rhoAlpha, dMu;
|
float tanLat, xAlpha, muAlpha, sinmuAlpha, denom, rhoAlpha, dMu;
|
||||||
float lPoint, lambdaSL, sinlambdaSL, dLambda, rAlpha;
|
float lPoint, lambdaSL, sinlambdaSL, dLambda, rAlpha;
|
||||||
|
|
||||||
|
@ -85,6 +85,8 @@ float FGUtility::ToGeodetic()
|
||||||
|
|
||||||
if (( M_PI_2 - Latitude < ONESECOND) ||
|
if (( M_PI_2 - Latitude < ONESECOND) ||
|
||||||
( M_PI_2 + Latitude < ONESECOND)) { // Near a pole
|
( M_PI_2 + Latitude < ONESECOND)) { // Near a pole
|
||||||
|
GeodeticLat = Latitude;
|
||||||
|
Altitude = Radius - SeaLevelR;
|
||||||
} else {
|
} else {
|
||||||
tanLat = tan(Latitude);
|
tanLat = tan(Latitude);
|
||||||
xAlpha = ECCENT*EARTHRAD /
|
xAlpha = ECCENT*EARTHRAD /
|
||||||
|
@ -102,7 +104,7 @@ float FGUtility::ToGeodetic()
|
||||||
rhoAlpha = EARTHRAD*(1.0 - EPS) / (denom*denom*denom);
|
rhoAlpha = EARTHRAD*(1.0 - EPS) / (denom*denom*denom);
|
||||||
dMu = atan2(lPoint*sin(dLambda),rhoAlpha + Altitude);
|
dMu = atan2(lPoint*sin(dLambda),rhoAlpha + Altitude);
|
||||||
State->SetGeodeticLat(muAlpha - dMu);
|
State->SetGeodeticLat(muAlpha - dMu);
|
||||||
lambdaSL = atan(ECCENTSQRD*tan(muAlpha - dMu));
|
lambdaSL = atan(ECCENTSQRD*tan(GeodeticLat));
|
||||||
sinlambdaSL = sin(lambdaSL);
|
sinlambdaSL = sin(lambdaSL);
|
||||||
SeaLevelR = sqrt(EARTHRADSQRD / (1 + INVECCENTSQRDM1* sinlambdaSL*sinlambdaSL));
|
SeaLevelR = sqrt(EARTHRADSQRD / (1 + INVECCENTSQRDM1* sinlambdaSL*sinlambdaSL));
|
||||||
}
|
}
|
||||||
|
@ -113,9 +115,8 @@ float FGUtility::ToGeodetic()
|
||||||
float FGUtility:: FromGeodetic()
|
float FGUtility:: FromGeodetic()
|
||||||
{
|
{
|
||||||
float lambdaSL, sinlambdaSL, coslambdaSL, sinMu, cosMu, py, px;
|
float lambdaSL, sinlambdaSL, coslambdaSL, sinMu, cosMu, py, px;
|
||||||
float Altitude, SeaLevelR, Radius;
|
float Altitude, SeaLevelR;
|
||||||
|
|
||||||
Radius = State->Geth() + EARTHRAD;
|
|
||||||
lambdaSL = atan(ECCENTSQRD*tan(State->GetGeodeticLat()));
|
lambdaSL = atan(ECCENTSQRD*tan(State->GetGeodeticLat()));
|
||||||
sinlambdaSL = sin(lambdaSL);
|
sinlambdaSL = sin(lambdaSL);
|
||||||
coslambdaSL = cos(lambdaSL);
|
coslambdaSL = cos(lambdaSL);
|
||||||
|
@ -123,7 +124,6 @@ float FGUtility:: FromGeodetic()
|
||||||
cosMu = cos(State->GetGeodeticLat());
|
cosMu = cos(State->GetGeodeticLat());
|
||||||
SeaLevelR = sqrt(EARTHRADSQRD /
|
SeaLevelR = sqrt(EARTHRADSQRD /
|
||||||
(1 + INVECCENTSQRDM1*sinlambdaSL*sinlambdaSL));
|
(1 + INVECCENTSQRDM1*sinlambdaSL*sinlambdaSL));
|
||||||
Altitude = Radius - SeaLevelR;
|
|
||||||
px = SeaLevelR*coslambdaSL + Altitude*cosMu;
|
px = SeaLevelR*coslambdaSL + Altitude*cosMu;
|
||||||
py = SeaLevelR*sinlambdaSL + Altitude*sinMu;
|
py = SeaLevelR*sinlambdaSL + Altitude*sinMu;
|
||||||
State->Setlatitude(atan2(py,px));
|
State->Setlatitude(atan2(py,px));
|
|
@ -42,7 +42,7 @@ INCLUDES
|
||||||
DEFINES
|
DEFINES
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
using namespace std;
|
// FG_USING_STD(std);
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
CLASS DECLARATION
|
CLASS DECLARATION
|
|
@ -1,206 +0,0 @@
|
||||||
/*******************************************************************************
|
|
||||||
|
|
||||||
Header: FGAircraft.h
|
|
||||||
Author: Jon S. Berndt
|
|
||||||
Date started: 12/12/98
|
|
||||||
|
|
||||||
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
|
||||||
Foundation; either version 2 of the License, or (at your option) any later
|
|
||||||
version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
||||||
details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
||||||
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
Further information about the GNU General Public License can also be found on
|
|
||||||
the world wide web at http://www.gnu.org.
|
|
||||||
|
|
||||||
HISTORY
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
12/12/98 JSB Created
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
SENTRY
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef FGAIRCRAFT_H
|
|
||||||
#define FGAIRCRAFT_H
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
COMMENTS, REFERENCES, and NOTES
|
|
||||||
*******************************************************************************/
|
|
||||||
/*
|
|
||||||
The aerodynamic coefficients used in this model typically are:
|
|
||||||
|
|
||||||
Longitudinal
|
|
||||||
CL0 - Reference lift at zero alpha
|
|
||||||
CD0 - Reference drag at zero alpha
|
|
||||||
CDM - Drag due to Mach
|
|
||||||
CLa - Lift curve slope (w.r.t. alpha)
|
|
||||||
CDa - Drag curve slope (w.r.t. alpha)
|
|
||||||
CLq - Lift due to pitch rate
|
|
||||||
CLM - Lift due to Mach
|
|
||||||
CLadt - Lift due to alpha rate
|
|
||||||
|
|
||||||
Cmadt - Pitching Moment due to alpha rate
|
|
||||||
Cm0 - Reference Pitching moment at zero alpha
|
|
||||||
Cma - Pitching moment slope (w.r.t. alpha)
|
|
||||||
Cmq - Pitch damping (pitch moment due to pitch rate)
|
|
||||||
CmM - Pitch Moment due to Mach
|
|
||||||
|
|
||||||
Lateral
|
|
||||||
Cyb - Side force due to sideslip
|
|
||||||
Cyr - Side force due to yaw rate
|
|
||||||
|
|
||||||
Clb - Dihedral effect (roll moment due to sideslip)
|
|
||||||
Clp - Roll damping (roll moment due to roll rate)
|
|
||||||
Clr - Roll moment due to yaw rate
|
|
||||||
Cnb - Weathercocking stability (yaw moment due to sideslip)
|
|
||||||
Cnp - Rudder adverse yaw (yaw moment due to roll rate)
|
|
||||||
Cnr - Yaw damping (yaw moment due to yaw rate)
|
|
||||||
|
|
||||||
Control
|
|
||||||
CLDe - Lift due to elevator
|
|
||||||
CDDe - Drag due to elevator
|
|
||||||
CyDr - Side force due to rudder
|
|
||||||
CyDa - Side force due to aileron
|
|
||||||
|
|
||||||
CmDe - Pitch moment due to elevator
|
|
||||||
ClDa - Roll moment due to aileron
|
|
||||||
ClDr - Roll moment due to rudder
|
|
||||||
CnDr - Yaw moment due to rudder
|
|
||||||
CnDa - Yaw moment due to aileron
|
|
||||||
|
|
||||||
[1] Cooke, Zyda, Pratt, and McGhee, "NPSNET: Flight Simulation Dynamic Modeling
|
|
||||||
Using Quaternions", Presence, Vol. 1, No. 4, pp. 404-420 Naval Postgraduate
|
|
||||||
School, January 1994
|
|
||||||
[2] D. M. Henderson, "Euler Angles, Quaternions, and Transformation Matrices",
|
|
||||||
JSC 12960, July 1977
|
|
||||||
[3] Richard E. McFarland, "A Standard Kinematic Model for Flight Simulation at
|
|
||||||
NASA-Ames", NASA CR-2497, January 1975
|
|
||||||
[4] Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics",
|
|
||||||
Wiley & Sons, 1979 ISBN 0-471-03032-5
|
|
||||||
[5] Bernard Etkin, "Dynamics of Flight, Stability and Control", Wiley & Sons,
|
|
||||||
1982 ISBN 0-471-08936-2
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
INCLUDES
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#ifdef FGFS
|
|
||||||
# include <Include/compiler.h>
|
|
||||||
# ifdef FG_HAVE_STD_INCLUDES
|
|
||||||
# include <fstream>
|
|
||||||
# else
|
|
||||||
# include <fstream.h>
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# include <fstream>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "FGModel.h"
|
|
||||||
#include "FGCoefficient.h"
|
|
||||||
#include "FGEngine.h"
|
|
||||||
#include "FGTank.h"
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
DEFINITIONS
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
CLASS DECLARATION
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
class FGAircraft : public FGModel
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FGAircraft(FGFDMExec*);
|
|
||||||
~FGAircraft(void);
|
|
||||||
|
|
||||||
bool Run(void);
|
|
||||||
bool LoadAircraft(string, string, string);
|
|
||||||
inline string GetAircraftName(void) {return AircraftName;}
|
|
||||||
inline void SetGearUp(bool tt) {GearUp = tt;}
|
|
||||||
inline bool GetGearUp(void) {return GearUp;}
|
|
||||||
inline float GetWingArea(void) {return WingArea;}
|
|
||||||
inline float GetWingSpan(void) {return WingSpan;}
|
|
||||||
inline float Getcbar(void) {return cbar;}
|
|
||||||
inline FGEngine* GetEngine(int tt) {return Engine[tt];}
|
|
||||||
inline FGTank* GetTank(int tt) {return Tank[tt];}
|
|
||||||
inline float GetWeight(void) {return Weight;}
|
|
||||||
inline float GetMass(void) {return Mass;}
|
|
||||||
inline float GetL(void) {return Moments[0];}
|
|
||||||
inline float GetM(void) {return Moments[1];}
|
|
||||||
inline float GetN(void) {return Moments[2];}
|
|
||||||
inline float GetFx(void) {return Forces[0];}
|
|
||||||
inline float GetFy(void) {return Forces[1];}
|
|
||||||
inline float GetFz(void) {return Forces[2];}
|
|
||||||
inline float GetIxx(void) {return Ixx;}
|
|
||||||
inline float GetIyy(void) {return Iyy;}
|
|
||||||
inline float GetIzz(void) {return Izz;}
|
|
||||||
inline float GetIxz(void) {return Ixz;}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void GetState(void);
|
|
||||||
void PutState(void);
|
|
||||||
void FAero(void);
|
|
||||||
void FGear(void);
|
|
||||||
void FMass(void);
|
|
||||||
void FProp(void);
|
|
||||||
void MAero(void);
|
|
||||||
void MGear(void);
|
|
||||||
void MMass(void);
|
|
||||||
void MProp(void);
|
|
||||||
void MassChange(void);
|
|
||||||
float Moments[3];
|
|
||||||
float Forces[3];
|
|
||||||
string AircraftName;
|
|
||||||
float Ixx, Iyy, Izz, Ixz, EmptyMass, Mass;
|
|
||||||
float Xcg, Ycg, Zcg;
|
|
||||||
float Xep, Yep, Zep;
|
|
||||||
float rho, qbar, Vt;
|
|
||||||
float alpha, beta;
|
|
||||||
float WingArea, WingSpan, cbar;
|
|
||||||
float phi, tht, psi;
|
|
||||||
float Weight, EmptyWeight;
|
|
||||||
float dt;
|
|
||||||
|
|
||||||
int numTanks;
|
|
||||||
int numEngines;
|
|
||||||
int numSelectedOxiTanks;
|
|
||||||
int numSelectedFuelTanks;
|
|
||||||
FGTank* Tank[MAX_TANKS];
|
|
||||||
FGEngine *Engine[MAX_ENGINES];
|
|
||||||
|
|
||||||
FGCoefficient *Coeff[6][10];
|
|
||||||
int coeff_ctr[6];
|
|
||||||
|
|
||||||
bool GearUp;
|
|
||||||
|
|
||||||
enum Param {LiftCoeff,
|
|
||||||
DragCoeff,
|
|
||||||
SideCoeff,
|
|
||||||
RollCoeff,
|
|
||||||
PitchCoeff,
|
|
||||||
YawCoeff,
|
|
||||||
numCoeffs};
|
|
||||||
|
|
||||||
string Axis[6];
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
#endif
|
|
|
@ -88,8 +88,6 @@
|
||||||
#include "ls_cockpit.h"
|
#include "ls_cockpit.h"
|
||||||
#include "ls_constants.h"
|
#include "ls_constants.h"
|
||||||
#include "ls_types.h"
|
#include "ls_types.h"
|
||||||
#include "c172_aero.h"
|
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
@ -106,7 +104,7 @@
|
||||||
|
|
||||||
|
|
||||||
extern COCKPIT cockpit_;
|
extern COCKPIT cockpit_;
|
||||||
|
FILE *out;
|
||||||
|
|
||||||
SCALAR interp(SCALAR *y_table, SCALAR *x_table, int Ntable, SCALAR x)
|
SCALAR interp(SCALAR *y_table, SCALAR *x_table, int Ntable, SCALAR x)
|
||||||
{
|
{
|
||||||
|
@ -123,11 +121,9 @@ SCALAR interp(SCALAR *y_table, SCALAR *x_table, int Ntable, SCALAR x)
|
||||||
}
|
}
|
||||||
else if(x >= x_table[Ntable-1])
|
else if(x >= x_table[Ntable-1])
|
||||||
{
|
{
|
||||||
slope=(y_table[Ntable-1]-y_table[Ntable-2])/(x_table[Ntable-1]-x_table[Ntable-2]);
|
y=y_table[Ntable-1];
|
||||||
y=slope*(x-x_table[Ntable-1]) +y_table[Ntable-1];
|
/* printf("x larger than x_table[N]: %g %g %d\n",x,x_table[NCL-1],Ntable-1); */
|
||||||
|
}
|
||||||
/* printf("x larger than x_table[N]: %g %g %d\n",x,x_table[NCL-1],Ntable-1);
|
|
||||||
*/ }
|
|
||||||
else /*x is within the table, interpolate linearly to find y value*/
|
else /*x is within the table, interpolate linearly to find y value*/
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -139,67 +135,97 @@ SCALAR interp(SCALAR *y_table, SCALAR *x_table, int Ntable, SCALAR x)
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void record()
|
||||||
|
{
|
||||||
|
|
||||||
|
fprintf(out,"%g,%g,%g,%g,%g,%g,%g,%g,%g,",Long_control,Lat_control,Rudder_pedal,Aft_trim,Fwd_trim,V_rel_wind,Dynamic_pressure,P_body,R_body);
|
||||||
|
fprintf(out,"%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,",Alpha,Cos_alpha,Sin_alpha,Alpha_dot,Q_body,Theta_dot,Sin_theta,Cos_theta,Beta,Cos_beta,Sin_beta);
|
||||||
|
fprintf(out,"%g,%g,%g,%g,%g,%g,%g,%g\n",Sin_phi,Cos_phi,F_X_aero,F_Y_aero,F_Z_aero,M_l_aero,M_m_aero,M_n_aero);
|
||||||
|
fflush(out);
|
||||||
|
}
|
||||||
|
|
||||||
void aero( SCALAR dt, int Initialize ) {
|
void aero( SCALAR dt, int Initialize ) {
|
||||||
|
|
||||||
|
|
||||||
static int init = 0;
|
static int init = 0;
|
||||||
|
|
||||||
|
|
||||||
static SCALAR trim_inc = 0.0002;
|
static SCALAR trim_inc = 0.0002;
|
||||||
|
SCALAR long_trim;
|
||||||
|
|
||||||
|
|
||||||
|
SCALAR elevator, aileron, rudder;
|
||||||
|
|
||||||
static SCALAR alpha_ind[NCL]={-0.087,0,0.175,0.209,0.24,0.262,0.278,0.303,0.314,0.332,0.367};
|
static SCALAR alpha_ind[NCL]={-0.087,0,0.175,0.209,0.24,0.262,0.278,0.303,0.314,0.332,0.367};
|
||||||
static SCALAR CLtable[NCL]={-0.14,0.31,1.21,1.376,1.51249,1.591,1.63,1.60878,1.53712,1.376,1.142};
|
static SCALAR CLtable[NCL]={-0.14,0.31,1.21,1.376,1.51249,1.591,1.63,1.60878,1.53712,1.376,1.142};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*Note that CLo,Cdo,Cmo will likely change with flap setting so
|
||||||
|
they may not be declared static in the future */
|
||||||
|
|
||||||
|
|
||||||
|
static SCALAR CLadot=1.7;
|
||||||
|
static SCALAR CLq=3.9;
|
||||||
|
static SCALAR CLde=0.43;
|
||||||
|
static SCALAR CLo=0;
|
||||||
|
|
||||||
|
|
||||||
|
static SCALAR Cdo=0.031;
|
||||||
|
static SCALAR Cda=0.13; /*Not used*/
|
||||||
|
static SCALAR Cdde=0.06;
|
||||||
|
|
||||||
|
static SCALAR Cma=-0.89;
|
||||||
|
static SCALAR Cmadot=-5.2;
|
||||||
|
static SCALAR Cmq=-12.4;
|
||||||
|
static SCALAR Cmo=-0.062;
|
||||||
|
static SCALAR Cmde=-1.28;
|
||||||
|
|
||||||
|
static SCALAR Clbeta=-0.089;
|
||||||
|
static SCALAR Clp=-0.47;
|
||||||
|
static SCALAR Clr=0.096;
|
||||||
|
static SCALAR Clda=0.178;
|
||||||
|
static SCALAR Cldr=0.0147;
|
||||||
|
|
||||||
|
static SCALAR Cnbeta=0.065;
|
||||||
|
static SCALAR Cnp=-0.03;
|
||||||
|
static SCALAR Cnr=-0.099;
|
||||||
|
static SCALAR Cnda=-0.053;
|
||||||
|
static SCALAR Cndr=-0.0657;
|
||||||
|
|
||||||
|
static SCALAR Cybeta=-0.31;
|
||||||
|
static SCALAR Cyp=-0.037;
|
||||||
|
static SCALAR Cyr=0.21;
|
||||||
|
static SCALAR Cyda=0.0;
|
||||||
|
static SCALAR Cydr=0.187;
|
||||||
|
|
||||||
|
/*nondimensionalization quantities*/
|
||||||
|
/*units here are ft and lbs */
|
||||||
|
static SCALAR cbar=4.9; /*mean aero chord ft*/
|
||||||
|
static SCALAR b=35.8; /*wing span ft */
|
||||||
|
static SCALAR Sw=174; /*wing planform surface area ft^2*/
|
||||||
|
static SCALAR rPiARe=0.054; /*reciprocal of Pi*AR*e*/
|
||||||
|
|
||||||
|
SCALAR W=Mass/INVG;
|
||||||
|
|
||||||
|
SCALAR CLwbh,CL,cm,cd,cn,cy,croll,cbar_2V,b_2V,qS,qScbar,qSb,ps,rs;
|
||||||
|
|
||||||
|
SCALAR F_X_wind,F_Y_wind,F_Z_wind,W_X,W_Y,W_Z;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* printf("Initialize= %d\n",Initialize); */
|
if (Initialize != 0)
|
||||||
/* printf("Initializing aero model...Initialize= %d\n", Initialize);
|
{
|
||||||
*/ CLadot=1.7;
|
|
||||||
CLq=3.9;
|
|
||||||
CLde=0.43;
|
|
||||||
CLo=0;
|
|
||||||
|
|
||||||
|
out=fopen("flight.csv","w");
|
||||||
|
/* Initialize aero coefficients */
|
||||||
|
|
||||||
Cdo=0.031;
|
|
||||||
Cda=0.13; /*Not used*/
|
}
|
||||||
Cdde=0.06;
|
|
||||||
|
record();
|
||||||
Cma=-0.89;
|
|
||||||
Cmadot=-5.2;
|
|
||||||
Cmq=-12.4;
|
|
||||||
Cmo=-0.015;
|
|
||||||
Cmde=-1.28;
|
|
||||||
|
|
||||||
Clbeta=-0.089;
|
|
||||||
Clp=-0.47;
|
|
||||||
Clr=0.096;
|
|
||||||
Clda=-0.178;
|
|
||||||
Cldr=0.0147;
|
|
||||||
|
|
||||||
Cnbeta=0.065;
|
|
||||||
Cnp=-0.03;
|
|
||||||
Cnr=-0.099;
|
|
||||||
Cnda=-0.053;
|
|
||||||
Cndr=-0.0657;
|
|
||||||
|
|
||||||
Cybeta=-0.31;
|
|
||||||
Cyp=-0.037;
|
|
||||||
Cyr=0.21;
|
|
||||||
Cyda=0.0;
|
|
||||||
Cydr=0.187;
|
|
||||||
|
|
||||||
/*nondimensionalization quantities*/
|
|
||||||
/*units here are ft and lbs */
|
|
||||||
cbar=4.9; /*mean aero chord ft*/
|
|
||||||
b=35.8; /*wing span ft */
|
|
||||||
Sw=174; /*wing planform surface area ft^2*/
|
|
||||||
rPiARe=0.054; /*reciprocal of Pi*AR*e*/
|
|
||||||
|
|
||||||
MaxTakeoffWeight=2550;
|
|
||||||
EmptyWeight=1500;
|
|
||||||
|
|
||||||
Zcg=0.51;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
LaRCsim uses:
|
LaRCsim uses:
|
||||||
|
@ -212,47 +238,38 @@ void aero( SCALAR dt, int Initialize ) {
|
||||||
rudder > 0 => ANL
|
rudder > 0 => ANL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*do weight & balance here since there is no better place*/
|
|
||||||
Weight=Mass / INVG;
|
|
||||||
|
|
||||||
if(Weight > 2550)
|
|
||||||
{ Weight=2550; }
|
|
||||||
else if(Weight < 1500)
|
|
||||||
{ Weight=1500; }
|
|
||||||
|
|
||||||
|
|
||||||
if(Dx_cg > 0.5586)
|
|
||||||
{ Dx_cg = 0.5586; }
|
|
||||||
else if(Dx_cg < -0.4655)
|
|
||||||
{ Dx_cg = -0.4655; }
|
|
||||||
|
|
||||||
Cg=Dx_cg/cbar +0.25;
|
|
||||||
|
|
||||||
Dz_cg=Zcg*cbar;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
long_trim=0;
|
|
||||||
if(Aft_trim) long_trim = long_trim - trim_inc;
|
if(Aft_trim) long_trim = long_trim - trim_inc;
|
||||||
if(Fwd_trim) long_trim = long_trim + trim_inc;
|
if(Fwd_trim) long_trim = long_trim + trim_inc;
|
||||||
|
|
||||||
/* printf("Long_control: %7.4f, long_trim: %7.4f,DEG_TO_RAD: %7.4f, RAD_TO_DEG: %7.4f\n",Long_control,long_trim,DEG_TO_RAD,RAD_TO_DEG);
|
/*scale pct control to degrees deflection*/
|
||||||
*/ /*scale pct control to degrees deflection*/
|
|
||||||
if ((Long_control+long_trim) <= 0)
|
if ((Long_control+long_trim) <= 0)
|
||||||
elevator=(Long_control+long_trim)*28*DEG_TO_RAD;
|
elevator=(Long_control+long_trim)*-28*DEG_TO_RAD;
|
||||||
else
|
else
|
||||||
elevator=(Long_control+long_trim)*23*DEG_TO_RAD;
|
elevator=(Long_control+long_trim)*23*DEG_TO_RAD;
|
||||||
|
|
||||||
aileron = -1*Lat_control*17.5*DEG_TO_RAD;
|
aileron = Lat_control*17.5*DEG_TO_RAD;
|
||||||
rudder = -1*Rudder_pedal*16*DEG_TO_RAD;
|
rudder = Rudder_pedal*16*DEG_TO_RAD;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*check control surface travel limits*/
|
||||||
|
/* if((elevator+long_trim) > 23)
|
||||||
|
elevator=23;
|
||||||
|
else if((elevator+long_trim) < -28)
|
||||||
|
elevator=-23; */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The aileron travel limits are 20 deg. TEU and 15 deg TED
|
The aileron travel limits are 20 deg. TEU and 15 deg TED
|
||||||
but since we don't distinguish between left and right we'll
|
but since we don't distinguish between left and right we'll
|
||||||
use the average here (17.5 deg)
|
use the average here (17.5 deg)
|
||||||
*/
|
*/
|
||||||
|
/* if(fabs(aileron) > 17.5)
|
||||||
|
aileron = 17.5;
|
||||||
|
if(fabs(rudder) > 16)
|
||||||
|
rudder = 16; */
|
||||||
|
|
||||||
/*calculate rate derivative nondimensionalization (is that a word?) factors */
|
/*calculate rate derivative nondimensionalization (is that a word?) factors */
|
||||||
/*hack to avoid divide by zero*/
|
/*hack to avoid divide by zero*/
|
||||||
|
@ -269,55 +286,50 @@ void aero( SCALAR dt, int Initialize ) {
|
||||||
b_2V=0;
|
b_2V=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*calcuate the qS nondimensionalization factors*/
|
/*calcuate the qS nondimensionalization factors*/
|
||||||
|
|
||||||
qS=Dynamic_pressure*Sw;
|
qS=Dynamic_pressure*Sw;
|
||||||
qScbar=qS*cbar;
|
qScbar=qS*cbar;
|
||||||
qSb=qS*b;
|
qSb=qS*b;
|
||||||
|
|
||||||
|
/*transform the aircraft rotation rates*/
|
||||||
|
ps=-P_body*Cos_alpha + R_body*Sin_alpha;
|
||||||
|
rs=-P_body*Sin_alpha + R_body*Cos_alpha;
|
||||||
|
|
||||||
/* printf("aero: Wb: %7.4f, Ub: %7.4f, Alpha: %7.4f, elev: %7.4f, ail: %7.4f, rud: %7.4f, long_trim: %7.4f\n",W_body,U_body,Alpha*RAD_TO_DEG,elevator*RAD_TO_DEG,aileron*RAD_TO_DEG,rudder*RAD_TO_DEG,long_trim*RAD_TO_DEG);
|
|
||||||
*/ //printf("Theta: %7.4f, Gamma: %7.4f, Beta: %7.4f, Phi: %7.4f, Psi: %7.4f\n",Theta*RAD_TO_DEG,Gamma_vert_rad*RAD_TO_DEG,Beta*RAD_TO_DEG,Phi*RAD_TO_DEG,Psi*RAD_TO_DEG);
|
|
||||||
|
|
||||||
|
|
||||||
/* sum coefficients */
|
/* sum coefficients */
|
||||||
CLwbh = interp(CLtable,alpha_ind,NCL,Alpha);
|
CLwbh = interp(CLtable,alpha_ind,NCL,Alpha);
|
||||||
CL = CLo + CLwbh + (CLadot*Alpha_dot + CLq*Theta_dot)*cbar_2V + CLde*elevator;
|
CL = CLo + CLwbh + (CLadot*Alpha_dot + CLq*Theta_dot)*cbar_2V + CLde*elevator;
|
||||||
cd = Cdo + rPiARe*CL*CL + Cdde*elevator;
|
cd = Cdo + rPiARe*CL*CL + Cdde*elevator;
|
||||||
cy = Cybeta*Beta + (Cyp*P_body + Cyr*R_body)*b_2V + Cyda*aileron + Cydr*rudder;
|
cy = Cybeta*Beta + (Cyp*ps + Cyr*rs)*b_2V + Cyda*aileron + Cydr*rudder;
|
||||||
|
|
||||||
cm = Cmo + Cma*Alpha + (Cmq*Q_body + Cmadot*Alpha_dot)*cbar_2V + Cmde*(elevator+long_trim);
|
cm = Cmo + Cma*Alpha + (Cmq*Theta_dot + Cmadot*Alpha_dot)*cbar_2V + Cmde*(elevator+long_trim);
|
||||||
cn = Cnbeta*Beta + (Cnp*P_body + Cnr*R_body)*b_2V + Cnda*aileron + Cndr*rudder;
|
cn = Cnbeta*Beta + (Cnp*ps + Cnr*rs)*b_2V + Cnda*aileron + Cndr*rudder;
|
||||||
croll=Clbeta*Beta + (Clp*P_body + Clr*R_body)*b_2V + Clda*aileron + Cldr*rudder;
|
croll=Clbeta*Beta + (Clp*ps + Clr*rs)*b_2V + Clda*aileron + Cldr*rudder;
|
||||||
|
|
||||||
/* printf("aero: CL: %7.4f, Cd: %7.4f, Cm: %7.4f, Cy: %7.4f, Cn: %7.4f, Cl: %7.4f\n",CL,cd,cm,cy,cn,croll);
|
/*calculate wind axes forces*/
|
||||||
*/ /*calculate wind axes forces*/
|
|
||||||
F_X_wind=-1*cd*qS;
|
F_X_wind=-1*cd*qS;
|
||||||
F_Y_wind=cy*qS;
|
F_Y_wind=cy*qS;
|
||||||
F_Z_wind=-1*CL*qS;
|
F_Z_wind=-1*CL*qS;
|
||||||
|
|
||||||
/* printf("V_rel_wind: %7.4f, Fxwind: %7.4f Fywind: %7.4f Fzwind: %7.4f\n",V_rel_wind,F_X_wind,F_Y_wind,F_Z_wind);
|
|
||||||
*/
|
|
||||||
/*calculate moments and body axis forces */
|
/*calculate moments and body axis forces */
|
||||||
|
|
||||||
|
/*find body-axis components of weight*/
|
||||||
|
/*with earth axis to body axis transform */
|
||||||
|
W_X=-1*W*Sin_theta;
|
||||||
|
W_Y=W*Sin_phi*Cos_theta;
|
||||||
|
W_Z=W*Cos_phi*Cos_theta;
|
||||||
|
|
||||||
/* requires ugly wind-axes to body-axes transform */
|
/* requires ugly wind-axes to body-axes transform */
|
||||||
F_X_aero = F_X_wind*Cos_alpha*Cos_beta - F_Y_wind*Cos_alpha*Sin_beta - F_Z_wind*Sin_alpha;
|
F_X_aero = W_X + F_X_wind*Cos_alpha*Cos_beta - F_Y_wind*Cos_alpha*Sin_beta - F_Z_wind*Sin_alpha;
|
||||||
F_Y_aero = F_X_wind*Sin_beta + F_Y_wind*Cos_beta;
|
F_Y_aero = W_Y + F_X_wind*Sin_beta + F_Z_wind*Cos_beta;
|
||||||
F_Z_aero = F_X_wind*Sin_alpha*Cos_beta - F_Y_wind*Sin_alpha*Sin_beta + F_Z_wind*Cos_alpha;
|
F_Z_aero = W_Z*NZ + F_X_wind*Sin_alpha*Cos_beta - F_Y_wind*Sin_alpha*Sin_beta + F_Z_wind*Cos_alpha;
|
||||||
|
|
||||||
/*no axes transform here */
|
/*no axes transform here */
|
||||||
M_l_aero = croll*qSb;
|
M_l_aero = I_xx*croll*qSb;
|
||||||
M_m_aero = cm*qScbar;
|
M_m_aero = I_yy*cm*qScbar;
|
||||||
M_n_aero = cn*qSb;
|
M_n_aero = I_zz*cn*qSb;
|
||||||
|
|
||||||
/* printf("I_yy: %7.4f, qScbar: %7.4f, qbar: %7.4f, Sw: %7.4f, cbar: %7.4f, 0.5*rho*V^2: %7.4f\n",I_yy,qScbar,Dynamic_pressure,Sw,cbar,0.5*0.0023081*V_rel_wind*V_rel_wind);
|
|
||||||
*/
|
|
||||||
/* printf("Fxaero: %7.4f Fyaero: %7.4f Fzaero: %7.4f Weight: %7.4f\n",F_X_aero,F_Y_aero,F_Z_aero,W);
|
|
||||||
*//* printf("Maero: %7.4f Naero: %7.4f Raero: %7.4f\n",M_m_aero,M_n_aero,M_l_aero);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,6 @@ $Header$
|
||||||
#include "ls_generic.h"
|
#include "ls_generic.h"
|
||||||
#include "ls_sim_control.h"
|
#include "ls_sim_control.h"
|
||||||
#include "ls_cockpit.h"
|
#include "ls_cockpit.h"
|
||||||
#include "c172_aero.h"
|
|
||||||
|
|
||||||
extern SIM_CONTROL sim_control_;
|
extern SIM_CONTROL sim_control_;
|
||||||
|
|
||||||
|
@ -76,10 +75,8 @@ void engine( SCALAR dt, int init ) {
|
||||||
|
|
||||||
/* F_X_engine = Throttle[3]*813.4/0.2; */ /* original code */
|
/* F_X_engine = Throttle[3]*813.4/0.2; */ /* original code */
|
||||||
/* F_Z_engine = Throttle[3]*11.36/0.2; */ /* original code */
|
/* F_Z_engine = Throttle[3]*11.36/0.2; */ /* original code */
|
||||||
F_X_engine = Throttle[3]*350/0.83;
|
F_X_engine = Throttle[3]*813.4/0.83;
|
||||||
F_Z_engine = Throttle[3]*4.9/0.83;
|
F_Z_engine = Throttle[3]*11.36/0.83;
|
||||||
M_m_engine = F_X_engine*0.734*cbar;
|
|
||||||
/* 0.734 - estimated (WAGged) location of thrust line in the z-axis*/
|
|
||||||
|
|
||||||
Throttle_pct = Throttle[3];
|
Throttle_pct = Throttle[3];
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,8 @@
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
GENEALOGY: Created 931012 by E. B. Jackson
|
GENEALOGY: Renamed navion_gear.c originally created 931012 by E. B. Jackson
|
||||||
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -36,8 +37,36 @@
|
||||||
|
|
||||||
$Header$
|
$Header$
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 1999/08/19 21:24:03 curt
|
Revision 1.1 1999/06/17 18:07:34 curt
|
||||||
Updated Tony's c172 model code.
|
Initial revision
|
||||||
|
|
||||||
|
Revision 1.1 1999/06/15 20:05:27 curt
|
||||||
|
Added c172 model from Tony Peden.
|
||||||
|
|
||||||
|
Revision 1.1.1.1 1999/04/05 21:32:45 curt
|
||||||
|
Start of 0.6.x branch.
|
||||||
|
|
||||||
|
Revision 1.6 1998/10/17 01:34:16 curt
|
||||||
|
C++ ifying ...
|
||||||
|
|
||||||
|
Revision 1.5 1998/09/29 02:03:00 curt
|
||||||
|
Added a brake + autopilot mods.
|
||||||
|
|
||||||
|
Revision 1.4 1998/08/06 12:46:40 curt
|
||||||
|
Header change.
|
||||||
|
|
||||||
|
Revision 1.3 1998/02/03 23:20:18 curt
|
||||||
|
Lots of little tweaks to fix various consistency problems discovered by
|
||||||
|
Solaris' CC. Fixed a bug in fg_debug.c with how the fgPrintf() wrapper
|
||||||
|
passed arguments along to the real printf(). Also incorporated HUD changes
|
||||||
|
by Michele America.
|
||||||
|
|
||||||
|
Revision 1.2 1998/01/19 18:40:29 curt
|
||||||
|
Tons of little changes to clean up the code and to remove fatal errors
|
||||||
|
when building with the c++ compiler.
|
||||||
|
|
||||||
|
Revision 1.1 1997/05/29 00:10:02 curt
|
||||||
|
Initial Flight Gear revision.
|
||||||
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
@ -68,48 +97,47 @@ Updated Tony's c172 model code.
|
||||||
#include "ls_cockpit.h"
|
#include "ls_cockpit.h"
|
||||||
|
|
||||||
|
|
||||||
sub3( DATA v1[], DATA v2[], DATA result[] )
|
void sub3( DATA v1[], DATA v2[], DATA result[] )
|
||||||
{
|
{
|
||||||
result[0] = v1[0] - v2[0];
|
result[0] = v1[0] - v2[0];
|
||||||
result[1] = v1[1] - v2[1];
|
result[1] = v1[1] - v2[1];
|
||||||
result[2] = v1[2] - v2[2];
|
result[2] = v1[2] - v2[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
add3( DATA v1[], DATA v2[], DATA result[] )
|
void add3( DATA v1[], DATA v2[], DATA result[] )
|
||||||
{
|
{
|
||||||
result[0] = v1[0] + v2[0];
|
result[0] = v1[0] + v2[0];
|
||||||
result[1] = v1[1] + v2[1];
|
result[1] = v1[1] + v2[1];
|
||||||
result[2] = v1[2] + v2[2];
|
result[2] = v1[2] + v2[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
cross3( DATA v1[], DATA v2[], DATA result[] )
|
void cross3( DATA v1[], DATA v2[], DATA result[] )
|
||||||
{
|
{
|
||||||
result[0] = v1[1]*v2[2] - v1[2]*v2[1];
|
result[0] = v1[1]*v2[2] - v1[2]*v2[1];
|
||||||
result[1] = v1[2]*v2[0] - v1[0]*v2[2];
|
result[1] = v1[2]*v2[0] - v1[0]*v2[2];
|
||||||
result[2] = v1[0]*v2[1] - v1[1]*v2[0];
|
result[2] = v1[0]*v2[1] - v1[1]*v2[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
multtrans3x3by3( DATA m[][3], DATA v[], DATA result[] )
|
void multtrans3x3by3( DATA m[][3], DATA v[], DATA result[] )
|
||||||
{
|
{
|
||||||
result[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2];
|
result[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2];
|
||||||
result[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2];
|
result[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2];
|
||||||
result[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2];
|
result[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
mult3x3by3( DATA m[][3], DATA v[], DATA result[] )
|
void mult3x3by3( DATA m[][3], DATA v[], DATA result[] )
|
||||||
{
|
{
|
||||||
result[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];
|
result[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];
|
||||||
result[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];
|
result[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];
|
||||||
result[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];
|
result[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
clear3( DATA v[] )
|
void clear3( DATA v[] )
|
||||||
{
|
{
|
||||||
v[0] = 0.; v[1] = 0.; v[2] = 0.;
|
v[0] = 0.; v[1] = 0.; v[2] = 0.;
|
||||||
}
|
}
|
||||||
|
|
||||||
gear()
|
void gear( SCALAR dt, int Initialize ) {
|
||||||
{
|
|
||||||
char rcsid[] = "$Id$";
|
char rcsid[] = "$Id$";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -195,7 +223,8 @@ char rcsid[] = "$Id$";
|
||||||
* Put aircraft specific executable code here
|
* Put aircraft specific executable code here
|
||||||
*/
|
*/
|
||||||
|
|
||||||
percent_brake[1] = 0.; /* replace with cockpit brake handle connection code */
|
/* replace with cockpit brake handle connection code */
|
||||||
|
percent_brake[1] = Brake_pct;
|
||||||
percent_brake[2] = percent_brake[1];
|
percent_brake[2] = percent_brake[1];
|
||||||
|
|
||||||
caster_angle_rad[0] = 0.03*Rudder_pedal;
|
caster_angle_rad[0] = 0.03*Rudder_pedal;
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
|
|
||||||
void model_init( void ) {
|
void model_init( void ) {
|
||||||
|
|
||||||
Throttle[3] = 0.2;
|
Throttle[3] = 0.2; Rudder_pedal = 0; Lat_control = 0; Long_control = 0;
|
||||||
|
|
||||||
Dx_pilot = 0; Dy_pilot = 0; Dz_pilot = 0;
|
Dx_pilot = 0; Dy_pilot = 0; Dz_pilot = 0;
|
||||||
Mass=2300*INVG;
|
Mass=2300*INVG;
|
||||||
|
|
|
@ -28,423 +28,7 @@
|
||||||
#include <FDM/LaRCsim/ls_generic.h>
|
#include <FDM/LaRCsim/ls_generic.h>
|
||||||
#include <FDM/LaRCsim/ls_interface.h>
|
#include <FDM/LaRCsim/ls_interface.h>
|
||||||
#include <FDM/LaRCsim/ls_constants.h>
|
#include <FDM/LaRCsim/ls_constants.h>
|
||||||
#include <FDM/LaRCsim/atmos_62.h>
|
|
||||||
/* #include <FDM/LaRCsim/ls_trim_fs.h> */
|
|
||||||
#include <FDM/LaRCsim/c172_aero.h>
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
|
|
||||||
//simple "one-at-a-time" longitudinal trimming routine
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
double latitude,longitude,altitude;
|
|
||||||
double vc,alpha,beta,gamma;
|
|
||||||
double theta,phi,psi;
|
|
||||||
double weight,cg;
|
|
||||||
int use_gamma_tmg;
|
|
||||||
}InitialConditions;
|
|
||||||
|
|
||||||
// Units for setIC
|
|
||||||
// vc knots (calibrated airspeed, close to indicated)
|
|
||||||
// altitude ft
|
|
||||||
// all angles in degrees
|
|
||||||
// weight lbs
|
|
||||||
// cg %MAC
|
|
||||||
// if use_gamma_tmg =1 then theta will be computed
|
|
||||||
// from theta=alpha+gamma and the value given will
|
|
||||||
// be ignored. Otherwise gamma is computed from
|
|
||||||
// gamma=theta-alpha
|
|
||||||
void setIC(InitialConditions IC)
|
|
||||||
{
|
|
||||||
SCALAR vtfps,u,v,w,vt_east;
|
|
||||||
SCALAR vnu,vnv,vnw,vteu,vtev,vtew,vdu,vdv,vdw;
|
|
||||||
SCALAR alphar,betar,thetar,phir,psir,gammar;
|
|
||||||
SCALAR sigma,ps,Ts,a;
|
|
||||||
|
|
||||||
Mass=IC.weight*INVG;
|
|
||||||
Dx_cg=(IC.cg-0.25)*4.9;
|
|
||||||
|
|
||||||
Latitude=IC.latitude*DEG_TO_RAD;
|
|
||||||
Longitude=IC.longitude*DEG_TO_RAD;
|
|
||||||
Altitude=IC.altitude;
|
|
||||||
ls_geod_to_geoc( Latitude, Altitude, &Sea_level_radius, &Lat_geocentric);
|
|
||||||
|
|
||||||
ls_atmos(IC.altitude,&sigma,&a,&Ts,&ps);
|
|
||||||
vtfps=sqrt(1/sigma*IC.vc*IC.vc)*1.68781;
|
|
||||||
alphar=IC.alpha*DEG_TO_RAD;
|
|
||||||
betar=IC.beta*DEG_TO_RAD;
|
|
||||||
gammar=IC.gamma*DEG_TO_RAD;
|
|
||||||
|
|
||||||
|
|
||||||
phir=IC.phi*DEG_TO_RAD;
|
|
||||||
psir=IC.psi*DEG_TO_RAD;
|
|
||||||
|
|
||||||
if(IC.use_gamma_tmg == 1)
|
|
||||||
{
|
|
||||||
thetar=alphar+gammar;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
thetar=IC.theta*DEG_TO_RAD;
|
|
||||||
gammar=thetar-alphar;
|
|
||||||
}
|
|
||||||
|
|
||||||
u=vtfps*cos(alphar)*cos(betar);
|
|
||||||
v=vtfps*sin(betar);
|
|
||||||
w=vtfps*sin(alphar)*cos(betar);
|
|
||||||
|
|
||||||
vnu=u*cos(thetar)*cos(psir);
|
|
||||||
vnv=v*(-sin(psir)*cos(phir)+sin(phir)*sin(thetar)*cos(psir));
|
|
||||||
vnw=w*(sin(phir)*sin(psir)+cos(phir)*sin(thetar)*cos(psir));
|
|
||||||
|
|
||||||
V_north=vnu+vnv+vnw;
|
|
||||||
|
|
||||||
vteu=u*cos(thetar)*sin(psir);
|
|
||||||
vtev=v*(cos(phir)*cos(psir)+sin(phir)*sin(thetar)*sin(psir));
|
|
||||||
vtew=w*(-sin(phir)*cos(psir)+cos(phir)*sin(thetar)*sin(psir));
|
|
||||||
|
|
||||||
vt_east=vteu+vtev+vtew;
|
|
||||||
V_east=vt_east+ OMEGA_EARTH*Sea_level_radius*cos(Lat_geocentric);
|
|
||||||
|
|
||||||
vdu=u*-sin(thetar);
|
|
||||||
vdv=v*cos(thetar)*sin(phir);
|
|
||||||
vdw=w*cos(thetar)*cos(phir);
|
|
||||||
|
|
||||||
V_down=vdu+vdv+vdw;
|
|
||||||
|
|
||||||
Theta=thetar;
|
|
||||||
Phi=phir;
|
|
||||||
Psi=psir;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int trim_long(int kmax, InitialConditions IC)
|
|
||||||
{
|
|
||||||
double elevator,alpha;
|
|
||||||
double tol=1E-3;
|
|
||||||
double a_tol=tol/10;
|
|
||||||
double alpha_step=0.001;
|
|
||||||
int k=0,i,j=0,jmax=10,sum=0;
|
|
||||||
ls_loop(0.0,-1);
|
|
||||||
do{
|
|
||||||
//printf("k: %d\n",k);
|
|
||||||
while((fabs(W_dot_body) > tol) && (j < jmax))
|
|
||||||
{
|
|
||||||
|
|
||||||
IC.alpha+=W_dot_body*0.05;
|
|
||||||
if((IC.alpha < -5) || (IC.alpha > 21))
|
|
||||||
j=jmax;
|
|
||||||
setIC(IC);
|
|
||||||
ls_loop(0.0,-1);
|
|
||||||
/* printf("IC.alpha: %g, Alpha: %g, wdot: %g\n",IC.alpha,Alpha*RAD_TO_DEG,W_dot_body);
|
|
||||||
*/ j++;
|
|
||||||
}
|
|
||||||
sum+=j;
|
|
||||||
/* printf("\tTheta: %7.4f, Alpha: %7.4f, wdot: %10.6f, j: %d\n",Theta*RAD_TO_DEG,Alpha*RAD_TO_DEG,W_dot_body,j);
|
|
||||||
*/ j=0;
|
|
||||||
while((fabs(U_dot_body) > tol) && (j < jmax))
|
|
||||||
{
|
|
||||||
|
|
||||||
Throttle_pct-=U_dot_body*0.005;
|
|
||||||
if((Throttle_pct < 0) || (Throttle_pct > 1))
|
|
||||||
Throttle_pct=0.2;
|
|
||||||
setIC(IC);
|
|
||||||
ls_loop(0.0,-1);
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
sum+=j;
|
|
||||||
/* printf("\tThrottle_pct: %7.4f, udot: %10.6f, j: %d\n",Throttle_pct,U_dot_body,j);
|
|
||||||
*/ j=0;
|
|
||||||
while((fabs(Q_dot_body) > a_tol) && (j < jmax))
|
|
||||||
{
|
|
||||||
|
|
||||||
Long_control+=Q_dot_body*0.001;
|
|
||||||
if((Long_control < -1) || (Long_control > 1))
|
|
||||||
j=jmax;
|
|
||||||
setIC(IC);
|
|
||||||
ls_loop(0.0,-1);
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
sum+=j;
|
|
||||||
if(Long_control >= 0)
|
|
||||||
elevator=Long_control*23;
|
|
||||||
else
|
|
||||||
elevator=Long_control*28;
|
|
||||||
/* printf("\televator: %7.4f, qdot: %10.6f, j: %d\n",elevator,Q_dot_body,j);
|
|
||||||
*/ k++;j=0;
|
|
||||||
}while(((fabs(W_dot_body) > tol) || (fabs(U_dot_body) > tol) || (fabs(Q_dot_body) > tol)) && (k < kmax));
|
|
||||||
/* printf("Total Iterations: %d\n",sum); */
|
|
||||||
return k;
|
|
||||||
}
|
|
||||||
|
|
||||||
int trim_ground(int kmax, InitialConditions IC)
|
|
||||||
{
|
|
||||||
double elevator,alpha,qdot_prev,alt_prev,step;
|
|
||||||
double tol=1E-3;
|
|
||||||
double a_tol=tol/10;
|
|
||||||
double alpha_step=0.001;
|
|
||||||
int k=0,i,j=0,jmax=40,sum=0,m=0;
|
|
||||||
Throttle_pct=0;
|
|
||||||
Brake_pct=1;
|
|
||||||
Theta=5*DEG_TO_RAD;
|
|
||||||
IC.altitude=Runway_altitude;
|
|
||||||
printf("udot: %g\n",U_dot_body);
|
|
||||||
setIC(IC);
|
|
||||||
printf("Altitude: %g, Runway_altitude: %g\n",Altitude,Runway_altitude);
|
|
||||||
qdot_prev=1.0E6;
|
|
||||||
|
|
||||||
ls_loop(0.0,-1);
|
|
||||||
|
|
||||||
do{
|
|
||||||
//printf("k: %d\n",k);
|
|
||||||
step=1;
|
|
||||||
printf("IC.altitude: %g, Altitude: %g, Runway_altitude: %g,wdot: %g,F_Z_gear: %g, M_m_gear: %g,F_Z: %g\n",IC.altitude,Altitude,Runway_altitude,W_dot_body,F_Z_gear,M_m_gear,F_Z);
|
|
||||||
|
|
||||||
m=0;
|
|
||||||
while((fabs(W_dot_body) > tol) && (m < 10))
|
|
||||||
{
|
|
||||||
|
|
||||||
j=0;
|
|
||||||
|
|
||||||
do{
|
|
||||||
alt_prev=IC.altitude;
|
|
||||||
IC.altitude+=step;
|
|
||||||
setIC(IC);
|
|
||||||
ls_loop(0.0,-1);
|
|
||||||
printf("IC.altitude: %g, Altitude: %g, Runway_altitude: %g,wdot: %g,F_Z: %g\n",IC.altitude,Altitude,Runway_altitude,W_dot_body,F_Z);
|
|
||||||
j++;
|
|
||||||
}while((W_dot_body < 0) && (j < jmax));
|
|
||||||
IC.altitude-=step;
|
|
||||||
step/=10;
|
|
||||||
printf("step: %g\n",step);
|
|
||||||
m++;
|
|
||||||
|
|
||||||
}
|
|
||||||
sum+=j;
|
|
||||||
printf("IC.altitude: %g, Altitude: %g, Runway_altitude: %g,wdot: %g,F_Z_gear: %g, M_m_gear: %g,F_Z: %g\n",IC.altitude,Altitude,Runway_altitude,W_dot_body,F_Z_gear,M_m_gear,F_Z);
|
|
||||||
|
|
||||||
j=0;
|
|
||||||
|
|
||||||
while((Q_dot_body <= qdot_prev) && (j < jmax))
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
qdot_prev=Q_dot_body;
|
|
||||||
IC.theta+=Q_dot_body;
|
|
||||||
setIC(IC);
|
|
||||||
ls_loop(0.0,-1);
|
|
||||||
j++;
|
|
||||||
|
|
||||||
printf("\tTheta: %7.4f, qdot: %10.6f, qdot_prev: %10.6f, j: %d\n",Theta*RAD_TO_DEG,Q_dot_body,qdot_prev,j);
|
|
||||||
}
|
|
||||||
IC.theta-=qdot_prev;
|
|
||||||
sum+=j;
|
|
||||||
|
|
||||||
printf("\tTheta: %7.4f, qdot: %10.6f, W_dot_body: %g\n",Theta,Q_dot_body,W_dot_body);
|
|
||||||
j=0;
|
|
||||||
if(W_dot_body > tol)
|
|
||||||
{
|
|
||||||
step=1;
|
|
||||||
while((W_dot_body > 0) && (j <jmax))
|
|
||||||
{
|
|
||||||
IC.altitude-=step;
|
|
||||||
setIC(IC);
|
|
||||||
ls_loop(0.0,-1);
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
k++;j=0;
|
|
||||||
}while(((fabs(W_dot_body) > tol) || (fabs(Q_dot_body) > tol)) && (k < kmax));
|
|
||||||
printf("Total Iterations: %d\n",sum);
|
|
||||||
return k;
|
|
||||||
}
|
|
||||||
void do_trims(int kmax,FILE *out,InitialConditions IC)
|
|
||||||
{
|
|
||||||
int k=0,i;
|
|
||||||
double speed,elevator,cmcl;
|
|
||||||
out=fopen("trims.out","w");
|
|
||||||
speed=55;
|
|
||||||
|
|
||||||
for(i=1;i<=5;i++)
|
|
||||||
{
|
|
||||||
switch(i)
|
|
||||||
{
|
|
||||||
case 1: IC.weight=1500;IC.cg=0.155;break;
|
|
||||||
case 2: IC.weight=1500;IC.cg=0.364;break;
|
|
||||||
case 3: IC.weight=1950;IC.cg=0.155;break;
|
|
||||||
case 4: IC.weight=2550;IC.cg=0.257;break;
|
|
||||||
case 5: IC.weight=2550;IC.cg=0.364;break;
|
|
||||||
}
|
|
||||||
|
|
||||||
speed=50;
|
|
||||||
while(speed <= 150)
|
|
||||||
{
|
|
||||||
IC.vc=speed;
|
|
||||||
Long_control=0;Theta=0;Throttle_pct=0.0;
|
|
||||||
|
|
||||||
k=trim_long(kmax,IC);
|
|
||||||
if(Long_control <= 0)
|
|
||||||
elevator=Long_control*28;
|
|
||||||
else
|
|
||||||
elevator=Long_control*23;
|
|
||||||
if(fabs(CL) > 1E-3)
|
|
||||||
{
|
|
||||||
cmcl=cm / CL;
|
|
||||||
}
|
|
||||||
if(k < kmax)
|
|
||||||
{
|
|
||||||
fprintf(out,"%g,%g,%g,%g,%g,%d",V_calibrated_kts,Alpha*RAD_TO_DEG,Long_control,Throttle_pct,Gamma_vert_rad,k);
|
|
||||||
fprintf(out,",%g,%g,%g,%g,%g\n",CL,cm,cmcl,Weight,Cg);
|
|
||||||
/* printf("%g,%g,%g,%g,%g,%g,%g,%g,%g,%g\n",V_calibrated_kts,Alpha*RAD_TO_DEG,elevator,CL,cm,Cmo,Cma,Cmde,Mass*32.174,Dx_cg);
|
|
||||||
*/ }
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("kmax exceeded at: %g knots, %g lbs, %g %%MAC\n",V_calibrated_kts,Weight,Cg);
|
|
||||||
printf("wdot: %g, udot: %g, qdot: %g\n\n",W_dot_body,U_dot_body,Q_dot_body);
|
|
||||||
|
|
||||||
}
|
|
||||||
speed+=10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_stick_pull(int kmax, SCALAR tmax,FILE *out,InitialConditions IC)
|
|
||||||
{
|
|
||||||
|
|
||||||
SCALAR htarget,hgain,hdiffgain,herr,herr_diff,herrprev;
|
|
||||||
SCALAR theta_trim,elev_trim,time;
|
|
||||||
int k;
|
|
||||||
k=trim_long(kmax,IC);
|
|
||||||
printf("Trim:\n\tAlpha: %10.6f, elev: %10.6f, Throttle: %10.6f\n\twdot: %10.6f, qdot: %10.6f, udot: %10.6f\n",Alpha*RAD_TO_DEG,Long_control,Throttle_pct,W_dot_body,U_dot_body,Q_dot_body);
|
|
||||||
|
|
||||||
|
|
||||||
htarget=0;
|
|
||||||
|
|
||||||
hgain=1;
|
|
||||||
hdiffgain=1;
|
|
||||||
elev_trim=Long_control;
|
|
||||||
out=fopen("stick_pull.out","w");
|
|
||||||
herr=Q_body-htarget;
|
|
||||||
|
|
||||||
//fly steady-level for 2 seconds, well, zero pitch rate anyway
|
|
||||||
while(time < 2.0)
|
|
||||||
{
|
|
||||||
herrprev=herr;
|
|
||||||
ls_update(1);
|
|
||||||
herr=Q_body-htarget;
|
|
||||||
herr_diff=herr-herrprev;
|
|
||||||
Long_control=elev_trim+(hgain*herr + hdiffgain*herr_diff);
|
|
||||||
time+=0.01;
|
|
||||||
/* printf("Time: %7.4f, Alt: %7.4f, Alpha: %7.4f, pelev: %7.4f, qdot: %7.4f, udot: %7.4f, Phi: %7.4f, Psi: %7.4f\n",time,Altitude,Alpha*RAD_TO_DEG,Long_control*100,Q_body*RAD_TO_DEG,U_dot_body,Phi,Psi);
|
|
||||||
printf("Mcg: %7.4f, Mrp: %7.4f, Maero: %7.4f, Meng: %7.4f, Mgear: %7.4f, Dx_cg: %7.4f, Dz_cg: %7.4f\n\n",M_m_cg,M_m_rp,M_m_aero,M_m_engine,M_m_gear,Dx_cg,Dz_cg);
|
|
||||||
*/ fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,",time,V_true_kts,Theta*RAD_TO_DEG,Alpha*RAD_TO_DEG,Q_body*RAD_TO_DEG,Alpha_dot*RAD_TO_DEG,Q_dot_body*RAD_TO_DEG,Throttle_pct,elevator*RAD_TO_DEG);
|
|
||||||
fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f\n",CL,CLwbh,cm,cd,Altitude);
|
|
||||||
}
|
|
||||||
|
|
||||||
//begin untrimmed climb at theta_trim + 2 degrees
|
|
||||||
hgain=4;
|
|
||||||
hdiffgain=2;
|
|
||||||
theta_trim=Theta;
|
|
||||||
htarget=theta_trim;
|
|
||||||
herr=Theta-htarget;
|
|
||||||
while(time < tmax)
|
|
||||||
{
|
|
||||||
//ramp in the target theta
|
|
||||||
if(htarget < (theta_trim + 2*DEG_TO_RAD))
|
|
||||||
{
|
|
||||||
htarget+= 0.01*DEG_TO_RAD;
|
|
||||||
}
|
|
||||||
herrprev=herr;
|
|
||||||
ls_update(1);
|
|
||||||
herr=Theta-htarget;
|
|
||||||
herr_diff=herr-herrprev;
|
|
||||||
Long_control=elev_trim+(hgain*herr + hdiffgain*herr_diff);
|
|
||||||
time+=0.01;
|
|
||||||
/* printf("Time: %7.4f, Alt: %7.4f, Alpha: %7.4f, pelev: %7.4f, qdot: %7.4f, udot: %7.4f, Phi: %7.4f, Psi: %7.4f\n",time,Altitude,Alpha*RAD_TO_DEG,Long_control*100,Q_body*RAD_TO_DEG,U_dot_body,Phi,Psi);
|
|
||||||
printf("Mcg: %7.4f, Mrp: %7.4f, Maero: %7.4f, Meng: %7.4f, Mgear: %7.4f, Dx_cg: %7.4f, Dz_cg: %7.4f\n\n",M_m_cg,M_m_rp,M_m_aero,M_m_engine,M_m_gear,Dx_cg,Dz_cg);
|
|
||||||
*/ fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,",time,V_true_kts,Theta*RAD_TO_DEG,Alpha*RAD_TO_DEG,Q_body*RAD_TO_DEG,Alpha_dot*RAD_TO_DEG,Q_dot_body*RAD_TO_DEG,Throttle_pct,elevator*RAD_TO_DEG);
|
|
||||||
fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f\n",CL,CLwbh,cm,cd,Altitude);
|
|
||||||
}
|
|
||||||
printf("%g,%g\n",theta_trim*RAD_TO_DEG,htarget*RAD_TO_DEG);
|
|
||||||
fclose(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_takeoff(FILE *out)
|
|
||||||
{
|
|
||||||
SCALAR htarget,hgain,hdiffgain,elev_trim,elev_trim_save,herr;
|
|
||||||
SCALAR time,herrprev,herr_diff;
|
|
||||||
|
|
||||||
htarget=0;
|
|
||||||
|
|
||||||
hgain=1;
|
|
||||||
hdiffgain=1;
|
|
||||||
elev_trim=Long_control;
|
|
||||||
elev_trim_save=elev_trim;
|
|
||||||
|
|
||||||
|
|
||||||
out=fopen("takeoff.out","w");
|
|
||||||
herr=Q_body-htarget;
|
|
||||||
|
|
||||||
//attempt to maintain zero pitch rate during the roll
|
|
||||||
while((V_calibrated_kts < 61) && (time < 30.0))
|
|
||||||
{
|
|
||||||
/* herrprev=herr;*/
|
|
||||||
ls_update(1);
|
|
||||||
/*herr=Q_body-htarget;
|
|
||||||
herr_diff=herr-herrprev;
|
|
||||||
Long_control=elev_trim+(hgain*herr + hdiffgain*herr_diff); */
|
|
||||||
time+=0.01;
|
|
||||||
printf("Time: %7.4f, Vc: %7.4f, Alpha: %7.4f, pelev: %7.4f, qdot: %7.4f, udot: %7.4f, U: %7.4f, W: %7.4f\n",time,V_calibrated_kts,Alpha*RAD_TO_DEG,Long_control*100,Q_body*RAD_TO_DEG,U_dot_body,U_body,W_body);
|
|
||||||
// printf("Mcg: %7.4f, Mrp: %7.4f, Maero: %7.4f, Meng: %7.4f, Mgear: %7.4f, Dx_cg: %7.4f, Dz_cg: %7.4f\n\n",M_m_cg,M_m_rp,M_m_aero,M_m_engine,M_m_gear,Dx_cg,Dz_cg);
|
|
||||||
// fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,",time,V_calibrated_kts,Theta*RAD_TO_DEG,Alpha*RAD_TO_DEG,Q_body*RAD_TO_DEG,Alpha_dot*RAD_TO_DEG,Q_dot_body*RAD_TO_DEG,Throttle_pct,elevator*RAD_TO_DEG);
|
|
||||||
fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f\n",CL,CLwbh,cm,cd,Altitude);
|
|
||||||
|
|
||||||
}
|
|
||||||
//At Vr, ramp in 10% nose up elevator in 0.5 seconds
|
|
||||||
elev_trim_save=0;
|
|
||||||
printf("At Vr, rotate...\n");
|
|
||||||
while((Q_body < 3.0*RAD_TO_DEG) && (time < 30.0))
|
|
||||||
{
|
|
||||||
Long_control-=0.01;
|
|
||||||
ls_update(1);
|
|
||||||
printf("Time: %7.4f, Vc: %7.4f, Alpha: %7.4f, pelev: %7.4f, q: %7.4f, cm: %7.4f, U: %7.4f, W: %7.4f\n",time,V_calibrated_kts,Alpha*RAD_TO_DEG,Long_control*100,Q_body*RAD_TO_DEG,cm,U_body,W_body);
|
|
||||||
|
|
||||||
fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,",time,V_calibrated_kts,Theta*RAD_TO_DEG,Alpha*RAD_TO_DEG,Q_body*RAD_TO_DEG,Alpha_dot*RAD_TO_DEG,Q_dot_body*RAD_TO_DEG,Throttle_pct,elevator*RAD_TO_DEG);
|
|
||||||
fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f\n",CL,CLwbh,cm,cd,Altitude);
|
|
||||||
time +=0.01;
|
|
||||||
|
|
||||||
}
|
|
||||||
//Maintain 15 degrees theta for the climbout
|
|
||||||
htarget=15*DEG_TO_RAD;
|
|
||||||
herr=Theta-htarget;
|
|
||||||
hgain=10;
|
|
||||||
hdiffgain=1;
|
|
||||||
elev_trim=Long_control;
|
|
||||||
while(time < 30.0)
|
|
||||||
{
|
|
||||||
herrprev=herr;
|
|
||||||
ls_update(1);
|
|
||||||
herr=Theta-htarget;
|
|
||||||
herr_diff=herr-herrprev;
|
|
||||||
Long_control=elev_trim+(hgain*herr + hdiffgain*herr_diff);
|
|
||||||
time+=0.01;
|
|
||||||
printf("Time: %7.4f, Alt: %7.4f, Speed: %7.4f, Theta: %7.4f\n",time,Altitude,V_calibrated_kts,Theta*RAD_TO_DEG);
|
|
||||||
fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,%20.8f,",time,V_calibrated_kts,Theta*RAD_TO_DEG,Alpha*RAD_TO_DEG,Q_body*RAD_TO_DEG,Alpha_dot*RAD_TO_DEG,Q_dot_body*RAD_TO_DEG,Throttle_pct,elevator*RAD_TO_DEG);
|
|
||||||
fprintf(out,"%20.8f,%20.8f,%20.8f,%20.8f,%20.8f\n",CL,CLwbh,cm,cd,Altitude);
|
|
||||||
}
|
|
||||||
fclose(out);
|
|
||||||
printf("Speed: %7.4f, Alt: %7.4f, Alpha: %7.4f, pelev: %7.4f, q: %7.4f, udot: %7.4f\n",V_true_kts,Altitude,Alpha*RAD_TO_DEG,Long_control,Q_body*RAD_TO_DEG,U_dot_body);
|
|
||||||
printf("F_down_total: %7.4f, F_Z_aero: %7.4f, F_X: %7.4f, M_m_cg: %7.4f\n\n",F_down+Mass*Gravity,F_Z_aero,F_X,M_m_cg);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the LaRCsim flight model, dt is the time increment for
|
// Initialize the LaRCsim flight model, dt is the time increment for
|
||||||
// each subsequent iteration through the EOM
|
// each subsequent iteration through the EOM
|
||||||
|
@ -455,85 +39,60 @@ int fgLaRCsimInit(double dt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Run an iteration of the EOM (equations of motion)
|
// Run an iteration of the EOM (equations of motion)
|
||||||
int main(int argc, char *argv[]) {
|
int main() {
|
||||||
|
|
||||||
|
|
||||||
double save_alt = 0.0;
|
double save_alt = 0.0;
|
||||||
int multiloop=1,k=0,i;
|
int multiloop=1;
|
||||||
double time=0,elev_trim,elev_trim_save,elevator,speed,cmcl;
|
double time=0;
|
||||||
FILE *out;
|
|
||||||
double hgain,hdiffgain,herr,herrprev,herr_diff,htarget;
|
|
||||||
InitialConditions IC;
|
|
||||||
|
|
||||||
if(argc < 6)
|
Altitude=1000; /*BFI as given by airnav*/
|
||||||
{
|
Latitude=47.5299892;
|
||||||
printf("Need args: $c172 speed alt alpha elev throttle\n");
|
Longitude=122.3019561;
|
||||||
exit(1);
|
Lat_geocentric=Latitude;
|
||||||
}
|
Lon_geocentric=Longitude;
|
||||||
|
Radius_to_vehicle=Altitude+EQUATORIAL_RADIUS;
|
||||||
|
Lat_control = 0;
|
||||||
|
Long_control = 0;
|
||||||
|
Long_trim = 0;
|
||||||
|
Rudder_pedal = 0;
|
||||||
|
Throttle_pct = 0.0;
|
||||||
|
Brake_pct = 1.0;
|
||||||
|
V_north=200;
|
||||||
|
V_east=0;
|
||||||
|
V_down=0;
|
||||||
|
|
||||||
IC.latitude=47.5299892; //BFI
|
printf("Calling init...\n");
|
||||||
IC.longitude=122.3019561;
|
fgLaRCsimInit(0.05);
|
||||||
Runway_altitude = 18.0;
|
|
||||||
IC.altitude=strtod(argv[2],NULL);
|
|
||||||
IC.vc=strtod(argv[1],NULL);
|
|
||||||
IC.alpha=10;
|
|
||||||
IC.beta=0;
|
|
||||||
IC.theta=strtod(argv[3],NULL);
|
|
||||||
IC.use_gamma_tmg=0;
|
|
||||||
IC.phi=0;
|
|
||||||
IC.psi=0;
|
|
||||||
IC.weight=1500;
|
|
||||||
IC.cg=0.155;
|
|
||||||
Long_control=strtod(argv[4],NULL);
|
|
||||||
setIC(IC);
|
|
||||||
printf("Out setIC\n");
|
|
||||||
ls_ForceAltitude(IC.altitude);
|
|
||||||
fgLaRCsimInit(0.01);
|
|
||||||
|
|
||||||
while(IC.alpha < 30.0)
|
/* copy control positions into the LaRCsim structure */
|
||||||
{
|
|
||||||
setIC(IC);
|
|
||||||
ls_loop(0.0,-1);
|
|
||||||
printf("CL: %g ,Alpha: %g\n",CL,IC.alpha);
|
|
||||||
IC.alpha+=1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*trim_ground(10,IC);*/
|
|
||||||
/* printf("%g,%g\n",Theta,Gamma_vert_rad);
|
|
||||||
printf("trim_long():\n");
|
|
||||||
k=trim_long(200,IC);
|
|
||||||
Throttle_pct=Throttle_pct-0.2;
|
|
||||||
printf("%g,%g\n",Theta,Gamma_vert_rad);
|
|
||||||
out=fopen("dive.out","w");
|
|
||||||
time=0;
|
|
||||||
while(time < 30.0)
|
|
||||||
{
|
|
||||||
ls_update(1);
|
|
||||||
|
|
||||||
cmcl=cm/CL;
|
|
||||||
fprintf(out,"%g,%g,%g,%g,%g,%d",V_calibrated_kts,Alpha*RAD_TO_DEG,Long_control,Throttle_pct,Gamma_vert_rad,k);
|
|
||||||
fprintf(out,",%g,%g,%g\n",CL,cm,cmcl);
|
|
||||||
time+=0.01;
|
|
||||||
}
|
|
||||||
fclose(out);
|
|
||||||
printf("V_rel_wind: %8.2f, Alpha: %8.2f, Beta: %8.2f\n",V_rel_wind,Alpha*RAD_TO_DEG,Beta*RAD_TO_DEG);
|
|
||||||
printf("Theta: %8.2f, Gamma: %8.2f, Alpha_tmg: %8.2f\n",Theta*RAD_TO_DEG,Gamma_vert_rad*RAD_TO_DEG,Theta*RAD_TO_DEG-Gamma_vert_rad*RAD_TO_DEG);
|
|
||||||
printf("V_north: %8.2f, V_east_rel_ground: %8.2f, V_east: %8.2f, V_down: %8.2f\n",V_north,V_east_rel_ground,V_east,V_down);
|
|
||||||
printf("Long_control: %8.2f, Throttle_pct: %8.2f\n",Long_control,Throttle_pct);
|
|
||||||
printf("k: %d, udot: %8.4f, wdot: %8.4f, qdot: %8.5f\n",k,U_dot_body,W_dot_body,Q_dot_body);
|
|
||||||
|
|
||||||
printf("\nls_update():\n");
|
|
||||||
ls_update(1);
|
|
||||||
printf("V_rel_wind: %8.2f, Alpha: %8.2f, Beta: %8.2f\n",V_rel_wind,Alpha*RAD_TO_DEG,Beta*RAD_TO_DEG);
|
|
||||||
printf("Theta: %8.2f, Gamma: %8.2f, Alpha_tmg: %8.2f\n",Theta*RAD_TO_DEG,Gamma_vert_rad*RAD_TO_DEG,Theta*RAD_TO_DEG-Gamma_vert_rad*RAD_TO_DEG);
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Inform LaRCsim of the local terrain altitude */
|
/* Inform LaRCsim of the local terrain altitude */
|
||||||
|
Runway_altitude = 18.0;
|
||||||
|
printf("Entering Loop\n");
|
||||||
|
printf("Speed: %7.4f, Lat: %7.4f, Long: %7.4f, Alt: %7.4f\n\n",V_true_kts,Latitude,Longitude,Altitude);
|
||||||
|
|
||||||
|
while (time < 0.2)
|
||||||
|
{
|
||||||
|
time=time+0.05;
|
||||||
|
ls_update(multiloop);
|
||||||
|
printf("Speed: %7.4f, Fxeng: %7.4f, Fxaero: %7.4f, Fxgear: %7.4f Alt: %7.4f\n\n",V_true_kts,F_X_engine,F_X_aero,F_X_gear,Altitude);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
/* // printf("%d FG_Altitude = %.2f\n", i, FG_Altitude * 0.3048);
|
||||||
|
// printf("%d Altitude = %.2f\n", i, Altitude * 0.3048);
|
||||||
|
|
||||||
|
// translate LaRCsim back to FG structure so that the
|
||||||
|
// autopilot (and the rest of the sim can use the updated
|
||||||
|
// values
|
||||||
|
//fgLaRCsim_2_FGInterface(f); */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -713,7 +272,142 @@ int FGInterface_2_LaRCsim (FGInterface& f) {
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
// Convert from the LaRCsim generic_ struct to the FGInterface struct
|
||||||
|
int fgLaRCsim_2_FGInterface (FGInterface& f) {
|
||||||
|
|
||||||
|
// Mass properties and geometry values
|
||||||
|
f.set_Inertias( Mass, I_xx, I_yy, I_zz, I_xz );
|
||||||
|
// f.set_Pilot_Location( Dx_pilot, Dy_pilot, Dz_pilot );
|
||||||
|
f.set_CG_Position( Dx_cg, Dy_cg, Dz_cg );
|
||||||
|
|
||||||
|
// Forces
|
||||||
|
// f.set_Forces_Body_Total( F_X, F_Y, F_Z );
|
||||||
|
// f.set_Forces_Local_Total( F_north, F_east, F_down );
|
||||||
|
// f.set_Forces_Aero( F_X_aero, F_Y_aero, F_Z_aero );
|
||||||
|
// f.set_Forces_Engine( F_X_engine, F_Y_engine, F_Z_engine );
|
||||||
|
// f.set_Forces_Gear( F_X_gear, F_Y_gear, F_Z_gear );
|
||||||
|
|
||||||
|
// Moments
|
||||||
|
// f.set_Moments_Total_RP( M_l_rp, M_m_rp, M_n_rp );
|
||||||
|
// f.set_Moments_Total_CG( M_l_cg, M_m_cg, M_n_cg );
|
||||||
|
// f.set_Moments_Aero( M_l_aero, M_m_aero, M_n_aero );
|
||||||
|
// f.set_Moments_Engine( M_l_engine, M_m_engine, M_n_engine );
|
||||||
|
// f.set_Moments_Gear( M_l_gear, M_m_gear, M_n_gear );
|
||||||
|
|
||||||
|
// Accelerations
|
||||||
|
// f.set_Accels_Local( V_dot_north, V_dot_east, V_dot_down );
|
||||||
|
// f.set_Accels_Body( U_dot_body, V_dot_body, W_dot_body );
|
||||||
|
// f.set_Accels_CG_Body( A_X_cg, A_Y_cg, A_Z_cg );
|
||||||
|
// f.set_Accels_Pilot_Body( A_X_pilot, A_Y_pilot, A_Z_pilot );
|
||||||
|
// f.set_Accels_CG_Body_N( N_X_cg, N_Y_cg, N_Z_cg );
|
||||||
|
// f.set_Accels_Pilot_Body_N( N_X_pilot, N_Y_pilot, N_Z_pilot );
|
||||||
|
// f.set_Accels_Omega( P_dot_body, Q_dot_body, R_dot_body );
|
||||||
|
|
||||||
|
// Velocities
|
||||||
|
f.set_Velocities_Local( V_north, V_east, V_down );
|
||||||
|
// f.set_Velocities_Ground( V_north_rel_ground, V_east_rel_ground,
|
||||||
|
// V_down_rel_ground );
|
||||||
|
// f.set_Velocities_Local_Airmass( V_north_airmass, V_east_airmass,
|
||||||
|
// V_down_airmass );
|
||||||
|
// f.set_Velocities_Local_Rel_Airmass( V_north_rel_airmass,
|
||||||
|
// V_east_rel_airmass, V_down_rel_airmass );
|
||||||
|
// f.set_Velocities_Gust( U_gust, V_gust, W_gust );
|
||||||
|
// f.set_Velocities_Wind_Body( U_body, V_body, W_body );
|
||||||
|
|
||||||
|
// f.set_V_rel_wind( V_rel_wind );
|
||||||
|
// f.set_V_true_kts( V_true_kts );
|
||||||
|
// f.set_V_rel_ground( V_rel_ground );
|
||||||
|
// f.set_V_inertial( V_inertial );
|
||||||
|
// f.set_V_ground_speed( V_ground_speed );
|
||||||
|
// f.set_V_equiv( V_equiv );
|
||||||
|
f.set_V_equiv_kts( V_equiv_kts );
|
||||||
|
// f.set_V_calibrated( V_calibrated );
|
||||||
|
// f.set_V_calibrated_kts( V_calibrated_kts );
|
||||||
|
|
||||||
|
f.set_Omega_Body( P_body, Q_body, R_body );
|
||||||
|
// f.set_Omega_Local( P_local, Q_local, R_local );
|
||||||
|
// f.set_Omega_Total( P_total, Q_total, R_total );
|
||||||
|
|
||||||
|
// f.set_Euler_Rates( Phi_dot, Theta_dot, Psi_dot );
|
||||||
|
f.set_Geocentric_Rates( Latitude_dot, Longitude_dot, Radius_dot );
|
||||||
|
|
||||||
|
FG_LOG( FG_FLIGHT, FG_DEBUG, "lon = " << Longitude
|
||||||
|
<< " lat_geoc = " << Lat_geocentric << " lat_geod = " << Latitude
|
||||||
|
<< " alt = " << Altitude << " sl_radius = " << Sea_level_radius
|
||||||
|
<< " radius_to_vehicle = " << Radius_to_vehicle );
|
||||||
|
|
||||||
|
// Positions
|
||||||
|
f.set_Geocentric_Position( Lat_geocentric, Lon_geocentric,
|
||||||
|
Radius_to_vehicle );
|
||||||
|
f.set_Geodetic_Position( Latitude, Longitude, Altitude );
|
||||||
|
f.set_Euler_Angles( Phi, Theta, Psi );
|
||||||
|
|
||||||
|
// Miscellaneous quantities
|
||||||
|
f.set_T_Local_to_Body(T_local_to_body_m);
|
||||||
|
// f.set_Gravity( Gravity );
|
||||||
|
// f.set_Centrifugal_relief( Centrifugal_relief );
|
||||||
|
|
||||||
|
f.set_Alpha( Alpha );
|
||||||
|
f.set_Beta( Beta );
|
||||||
|
// f.set_Alpha_dot( Alpha_dot );
|
||||||
|
// f.set_Beta_dot( Beta_dot );
|
||||||
|
|
||||||
|
// f.set_Cos_alpha( Cos_alpha );
|
||||||
|
// f.set_Sin_alpha( Sin_alpha );
|
||||||
|
// f.set_Cos_beta( Cos_beta );
|
||||||
|
// f.set_Sin_beta( Sin_beta );
|
||||||
|
|
||||||
|
// f.set_Cos_phi( Cos_phi );
|
||||||
|
// f.set_Sin_phi( Sin_phi );
|
||||||
|
// f.set_Cos_theta( Cos_theta );
|
||||||
|
// f.set_Sin_theta( Sin_theta );
|
||||||
|
// f.set_Cos_psi( Cos_psi );
|
||||||
|
// f.set_Sin_psi( Sin_psi );
|
||||||
|
|
||||||
|
f.set_Gamma_vert_rad( Gamma_vert_rad );
|
||||||
|
// f.set_Gamma_horiz_rad( Gamma_horiz_rad );
|
||||||
|
|
||||||
|
// f.set_Sigma( Sigma );
|
||||||
|
// f.set_Density( Density );
|
||||||
|
// f.set_V_sound( V_sound );
|
||||||
|
// f.set_Mach_number( Mach_number );
|
||||||
|
|
||||||
|
// f.set_Static_pressure( Static_pressure );
|
||||||
|
// f.set_Total_pressure( Total_pressure );
|
||||||
|
// f.set_Impact_pressure( Impact_pressure );
|
||||||
|
// f.set_Dynamic_pressure( Dynamic_pressure );
|
||||||
|
|
||||||
|
// f.set_Static_temperature( Static_temperature );
|
||||||
|
// f.set_Total_temperature( Total_temperature );
|
||||||
|
|
||||||
|
f.set_Sea_level_radius( Sea_level_radius );
|
||||||
|
f.set_Earth_position_angle( Earth_position_angle );
|
||||||
|
|
||||||
|
f.set_Runway_altitude( Runway_altitude );
|
||||||
|
// f.set_Runway_latitude( Runway_latitude );
|
||||||
|
// f.set_Runway_longitude( Runway_longitude );
|
||||||
|
// f.set_Runway_heading( Runway_heading );
|
||||||
|
// f.set_Radius_to_rwy( Radius_to_rwy );
|
||||||
|
|
||||||
|
// f.set_CG_Rwy_Local( D_cg_north_of_rwy, D_cg_east_of_rwy, D_cg_above_rwy);
|
||||||
|
// f.set_CG_Rwy_Rwy( X_cg_rwy, Y_cg_rwy, H_cg_rwy );
|
||||||
|
// f.set_Pilot_Rwy_Local( D_pilot_north_of_rwy, D_pilot_east_of_rwy,
|
||||||
|
// D_pilot_above_rwy );
|
||||||
|
// f.set_Pilot_Rwy_Rwy( X_pilot_rwy, Y_pilot_rwy, H_pilot_rwy );
|
||||||
|
|
||||||
|
f.set_sin_lat_geocentric(Lat_geocentric);
|
||||||
|
f.set_cos_lat_geocentric(Lat_geocentric);
|
||||||
|
f.set_sin_cos_longitude(Longitude);
|
||||||
|
f.set_sin_cos_latitude(Latitude);
|
||||||
|
|
||||||
|
// printf("sin_lat_geo %f cos_lat_geo %f\n", sin_Lat_geoc, cos_Lat_geoc);
|
||||||
|
// printf("sin_lat %f cos_lat %f\n",
|
||||||
|
// f.get_sin_latitude(), f.get_cos_latitude());
|
||||||
|
// printf("sin_lon %f cos_lon %f\n",
|
||||||
|
// f.get_sin_longitude(), f.get_cos_longitude());
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
} */
|
||||||
|
|
||||||
|
|
|
@ -36,9 +36,12 @@
|
||||||
|
|
||||||
$Header$
|
$Header$
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1999/04/05 21:32:45 curt
|
Revision 1.1 1999/06/17 18:07:34 curt
|
||||||
Initial revision
|
Initial revision
|
||||||
|
|
||||||
|
Revision 1.1.1.1 1999/04/05 21:32:45 curt
|
||||||
|
Start of 0.6.x branch.
|
||||||
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -33,9 +33,12 @@
|
||||||
$Header$
|
$Header$
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1999/04/05 21:32:45 curt
|
Revision 1.1 1999/06/17 18:07:33 curt
|
||||||
Initial revision
|
Initial revision
|
||||||
|
|
||||||
|
Revision 1.1.1.1 1999/04/05 21:32:45 curt
|
||||||
|
Start of 0.6.x branch.
|
||||||
|
|
||||||
Revision 1.3 1998/08/06 12:46:37 curt
|
Revision 1.3 1998/08/06 12:46:37 curt
|
||||||
Header change.
|
Header change.
|
||||||
|
|
||||||
|
|
|
@ -38,9 +38,12 @@
|
||||||
|
|
||||||
$Header$
|
$Header$
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1999/04/05 21:32:45 curt
|
Revision 1.1 1999/06/17 18:07:33 curt
|
||||||
Initial revision
|
Initial revision
|
||||||
|
|
||||||
|
Revision 1.1.1.1 1999/04/05 21:32:45 curt
|
||||||
|
Start of 0.6.x branch.
|
||||||
|
|
||||||
Revision 1.4 1998/08/24 20:09:26 curt
|
Revision 1.4 1998/08/24 20:09:26 curt
|
||||||
Code optimization tweaks from Norman Vine.
|
Code optimization tweaks from Norman Vine.
|
||||||
|
|
||||||
|
|
|
@ -47,9 +47,12 @@
|
||||||
|
|
||||||
$Header$
|
$Header$
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1999/04/05 21:32:45 curt
|
Revision 1.1 1999/06/17 18:07:33 curt
|
||||||
Initial revision
|
Initial revision
|
||||||
|
|
||||||
|
Revision 1.1.1.1 1999/04/05 21:32:45 curt
|
||||||
|
Start of 0.6.x branch.
|
||||||
|
|
||||||
Revision 1.4 1998/08/24 20:09:26 curt
|
Revision 1.4 1998/08/24 20:09:26 curt
|
||||||
Code optimization tweaks from Norman Vine.
|
Code optimization tweaks from Norman Vine.
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,9 @@
|
||||||
|
|
||||||
$Header$
|
$Header$
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.1 1999/06/17 18:07:34 curt
|
||||||
|
Initial revision
|
||||||
|
|
||||||
Revision 1.2 1999/04/22 18:47:25 curt
|
Revision 1.2 1999/04/22 18:47:25 curt
|
||||||
Wrap with extern "C" { } if building with __cplusplus compiler.
|
Wrap with extern "C" { } if building with __cplusplus compiler.
|
||||||
|
|
||||||
|
|
|
@ -40,9 +40,12 @@
|
||||||
|
|
||||||
$Header$
|
$Header$
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1999/04/05 21:32:45 curt
|
Revision 1.1 1999/06/17 18:07:34 curt
|
||||||
Initial revision
|
Initial revision
|
||||||
|
|
||||||
|
Revision 1.1.1.1 1999/04/05 21:32:45 curt
|
||||||
|
Start of 0.6.x branch.
|
||||||
|
|
||||||
Revision 1.3 1998/07/08 14:41:37 curt
|
Revision 1.3 1998/07/08 14:41:37 curt
|
||||||
.
|
.
|
||||||
|
|
||||||
|
|
|
@ -35,9 +35,12 @@
|
||||||
|
|
||||||
$Header$
|
$Header$
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1999/04/05 21:32:45 curt
|
Revision 1.1 1999/06/17 18:07:34 curt
|
||||||
Initial revision
|
Initial revision
|
||||||
|
|
||||||
|
Revision 1.1.1.1 1999/04/05 21:32:45 curt
|
||||||
|
Start of 0.6.x branch.
|
||||||
|
|
||||||
Revision 1.3 1998/08/06 12:46:39 curt
|
Revision 1.3 1998/08/06 12:46:39 curt
|
||||||
Header change.
|
Header change.
|
||||||
|
|
||||||
|
|
|
@ -34,9 +34,12 @@
|
||||||
|
|
||||||
$Header$
|
$Header$
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 1999/04/05 21:32:45 curt
|
Revision 1.1 1999/06/17 18:07:34 curt
|
||||||
Initial revision
|
Initial revision
|
||||||
|
|
||||||
|
Revision 1.1.1.1 1999/04/05 21:32:45 curt
|
||||||
|
Start of 0.6.x branch.
|
||||||
|
|
||||||
Revision 1.5 1998/07/12 03:11:03 curt
|
Revision 1.5 1998/07/12 03:11:03 curt
|
||||||
Removed some printf()'s.
|
Removed some printf()'s.
|
||||||
Fixed the autopilot integration so it should be able to update it's control
|
Fixed the autopilot integration so it should be able to update it's control
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue