Compare commits

..

823 Commits

Author SHA1 Message Date
ThorstenB
3fa835d74c Bump version to 2.8.0
since "next" is already frozen for 2.8 and is prepared for building the
first release candidate.
For details on versions see http://wiki.flightgear.org/Release_plan
2012-06-26 23:17:07 +02:00
ThorstenB
035ff3e1ea Update README/INSTALL documentation. 2012-06-26 22:43:48 +02:00
Frederic Bouvier
2c54237fe5 Don't render ocean tiles in the light pass 2012-06-25 17:55:46 +02:00
Frederic Bouvier
00c61204a4 Fix a typo 2012-06-25 11:58:49 +02:00
Frederic Bouvier
284aa3a444 Add header file to the cmake project 2012-06-25 11:58:22 +02:00
Frederic Bouvier
f0b7a27fd4 Duplicate light effect when animation is requested. Make dimmed lights work in multiplayer 2012-06-24 23:06:12 +02:00
ThorstenB
a781eea10e #744: Raise warning level when reporting missing svn library.
Status message are almost invisible - use warning message instead, so
builders/packagers actually notice a missing dependency.
Also add some useful hints.
2012-06-24 20:04:26 +02:00
ThorstenB
8e42e5bdba Fix error handling in SGSampleGroup::stop
Move error check to correct location: needs to be done immediately after
the alSourceStop call - and only if it was called at all.
2012-06-24 19:18:47 +02:00
James Turner
ad4a9eeaa5 Remove (un-maintained) MSVC projects from the tree prior to the next release. 2012-06-23 10:26:28 +02:00
Christian Schmitt
190e6b3958 Taxiway signs: print out more meaningful error messages on wrong size
settings and fall back to the default value in such cases.
2012-06-22 14:39:45 +02:00
James Turner
8a33223483 Use standard version of FindPackageStandardArgs, no need to copy it. 2012-06-21 10:21:26 +02:00
James Turner
0e4eab1569 Improve ALUT framework detection (for Mac)
Latest Xcode no longer searches /Library/Frameworks by default which exposed an issue here. Search for the header by the correct name to trigger special -F handling in cmake.
2012-06-20 19:44:16 +02:00
Stuart Buchanan
9d6e27c85c Do not attempt to reposition non-existant clouds.
Defensive workaround to Issue 678.
2012-06-19 22:04:17 +01:00
ThorstenB
9720f8ca16 Patch clean-up 2012-06-19 22:15:33 +02:00
Harald JOHNSEN
5b3dccc1f7 - stop sounds when removing a sound group 2012-06-19 22:14:14 +02:00
Markus Pargmann
e0df014acf Signs change <= to < 2012-06-18 20:47:05 +02:00
Markus Pargmann
de3d433ead Airport sign size 3 bugfix 2012-06-18 20:47:05 +02:00
Frederic Bouvier
3407db3dd6 Avoid an annoying OSG warning 2012-06-17 17:52:17 +02:00
Christian Schmitt
b10a40ff8d Taxiway signs: support all variants from the apt.dat 850 spec and
read size values from the optional stg column
2012-06-13 19:45:13 +02:00
Christian Schmitt
ec22623f1c Add helper method for optional stg values
Anders Gidenstam: Style and indentation.
2012-06-12 21:04:22 +02:00
Frederic Bouvier
7e8fb16507 Static or shared objects are not light volumes (but can include some) 2012-06-11 09:12:47 +02:00
Frederic Bouvier
a634d7c361 Terrain tiles are not light volumes 2012-06-11 09:11:52 +02:00
Harald JOHNSEN
aae77a7983 remove some warnings for MSVC
don't start to play sounds that are out of range of the listener
2012-06-08 15:23:54 +02:00
ThorstenB
3f6f34e7e1 Drop obsolete TODO 2012-06-08 13:53:15 +02:00
ThorstenB
eff1541ba3 Add INSTALL and README.cmake files. 2012-06-08 13:20:03 +02:00
Frederic Bouvier
e7e06c89e1 Fix lights when added as submodels 2012-05-31 20:22:40 +02:00
Frederic Bouvier
a41d5b1609 Restore lights in the Rembrandt renderer 2012-05-30 22:18:57 +02:00
James Turner
edbea633f3 Merge a tweak from Tat to keep Mac 10.5 from crashing on realpath 2012-05-30 11:08:11 +01:00
James Turner
950af5375c KIll of SimGear route code, it's no longer used by anything. 2012-05-30 11:07:36 +01:00
Stuart Buchanan
c6d2e32f05 Add logging for the total number of random buildings generated. 2012-05-25 19:47:45 +01:00
Mathias Froehlich
3796ce4d86 Runway signs: avoid adding empty group without signs. 2012-05-21 07:25:14 +02:00
Anders Gidenstam
ffb67f4014 Clement de l'Hamaide: Add support for pitch and roll for OBJECT_SHARED and OBJECT_STATIC in .stg files.
Pitch and roll behave the same as pitch-deg and roll-deg offsets in
model XML files.
2012-05-20 22:21:38 +02:00
Frederic Bouvier
d479686804 Try to exclude unwanted geometry in the additional light pass 2012-05-20 15:42:55 +02:00
Frederic Bouvier
1387f47a79 Remove redundant inclusion of SGMath.hxx 2012-05-20 11:49:31 +02:00
Frederic Bouvier
65784896e1 Revert "Hack to avoid redrawing the whole scene another time when only light volume are requested"
This reverts commit e692e7c119.
2012-05-19 20:41:58 +02:00
Frederic Bouvier
e692e7c119 Hack to avoid redrawing the whole scene another time when only light volume are requested 2012-05-19 19:39:38 +02:00
Mathias Froehlich
23d4628d88 ReaderWriterSPT: Cull out tiles that we look at from downside.
Add a cull callback that culls away complete tile areas that
we look at from the far away downside.
2012-05-19 16:09:58 +02:00
Frederic Bouvier
38c335c339 Allow to change texture buffer name on the fly 2012-05-18 12:27:08 +02:00
ThorstenB
e69d1b5a82 #767 related: fix sound resource management
Use _smgr->release_buffer instead of direct alDeleteBuffers.
2012-05-12 23:35:10 +02:00
Frederic Bouvier
6695b918ea Allow to specify buffer name from parameters in effects 2012-05-12 00:16:19 +02:00
Frederic Bouvier
2b9072417b Use names to identify deferred buffers
Change effect syntax for buffers
2012-05-12 00:16:17 +02:00
James Turner
6cf2224146 Updated sign case UV calculation from Christian. 2012-05-11 10:00:35 +01:00
James Turner
a1f74729ab build signs for an STG into single geometry. 2012-05-11 09:50:26 +01:00
James Turner
71443d1c9a Phase 1 - single geometry per material 2012-05-11 09:50:26 +01:00
Stuart Buchanan
a83f5deaac Updates to buildings and trees
1) Clean up after ourselves - remove memory leak
2) Face buildings the right way
2012-05-10 23:03:38 +01:00
Christian Schmitt
234e778e8f Add support for double-sided taxiway signs and create 3D models for them 2012-05-05 13:39:07 +02:00
Christian Schmitt
0bdeaeb4e2 Remove unused SGMakeRunwaySign function. 2012-05-05 13:39:07 +02:00
Frederic Bouvier
cc37713a66 Remove redundant inclusion of math/SGMath.hxx 2012-05-05 11:19:20 +02:00
ThorstenB
6129de31f0 Fix C compiler warning.
"no-overloaded-virtual" warnings are a CXX-compiler feature
2012-05-05 09:46:11 +02:00
ThorstenB
0908f86714 Fix rpmlint/Linux packager complaints
about outdated/invalid FSF address in some license headers.
2012-05-05 01:41:45 +02:00
ThorstenB
31ed79fe43 Fix rpmlint/Linux packager complaints
about outdated/invalid FSF address in some license headers.
2012-05-05 00:30:16 +02:00
ThorstenB
1af2ad12bf openSUSE "more architectures" patch
(Alpha anyone? ;-) )
2012-05-05 00:18:26 +02:00
ThorstenB
44db6d9e44 Move vector property templates to separate header file.
Fixes the "weirdness" with MSVC complaining about incomplete class specs,
since forward declarations (SGMathFwd.hxx) are used in props.hxx only.
Only the few extended (vector) property templates require including the
full SGMath.hxx (with MSVC) - and these are used in few places.
2012-05-05 00:07:07 +02:00
ThorstenB
6e662fe4d6 Ganael Laplanche: fix include dependencies for FreeBSD support 2012-05-04 23:24:10 +02:00
ThorstenB
067ff4f8ed Fix signed vs unsigned compiler warnings 2012-05-04 23:13:54 +02:00
Stuart Buchanan
91cf3d4def Fixes to Random Buildings:
1) Correct texture mapping so textures aren't flipped!
2) Add constraints to medium buildings (not taller than they are wide)
2012-05-04 21:12:41 +01:00
Frederic Bouvier
1eb846a93a Revert "Temporary hack to make the new version of expat build under windows"
A proper fix has been provided

This reverts commit 655971208f.
2012-05-04 20:48:04 +02:00
James Turner
56661afc05 Change how HAVE_EXPAT_CONFIG_H is defined, to hopefully fix MSVC properly. 2012-05-04 10:10:46 +01:00
Frederic Bouvier
655971208f Temporary hack to make the new version of expat build under windows 2012-05-04 09:09:11 +02:00
James Turner
d3ab2d3fbc Missed files from previous commit, needed for Windows. 2012-05-03 18:55:13 +01:00
James Turner
65aca6607e Update to latest expat for improved BOM / encoding handling.
(Related to http://code.google.com/p/flightgear-bugs/issues/detail?id=635)
2012-05-03 17:29:16 +01:00
Stuart Buchanan
e44eb39046 Emissive lighting for random buildings. Requires up to date fgdata. 2012-05-01 22:35:42 +01:00
ThorstenB
ab7d2a4bcc Allow "texture-path" XML entries to be present but empty.
This had worked with previous FG versions and is used by many models -
so it shouldn't be treated as an error now.
2012-04-30 18:29:44 +02:00
Frederic Bouvier
87c744b88b Use observer_ptr to cache light effects 2012-04-29 13:25:15 +02:00
Frederic Bouvier
dfc4b1564f Nasal is C code, not C++ 2012-04-29 00:17:38 +02:00
Stuart Buchanan
db6e99f885 Use Effects system for random buildings. 2012-04-28 23:11:52 +01:00
James Turner
35681e3adf Strange, somehow missed this file in last commit. 2012-04-28 23:08:05 +01:00
James Turner
a5ca531aac Nasal Ghosts can optionally specify member get/set functions. 2012-04-28 22:25:57 +01:00
Stuart Buchanan
2daf895d00 Reduce the number of Drawables generated by the random buildings by reducing the number of levels of the quad tree, and reducing the number of different
fade-out distances generated.
2012-04-28 20:02:42 +01:00
Stuart Buchanan
1041445a22 Change random object placement to a grid-like scheme to reduce building overlap. 2012-04-28 19:58:09 +01:00
Christian Schmitt
f712bc9294 Implement blinking hold-short line lights
This is supported by the apt.dat 850 format and latest TG
2012-04-26 15:02:33 +01:00
James Turner
2d174d0b14 Convert random buildings to avoid use of BIND_PER_PRIMITVE.
(which pushes me to a slow OSG path)
2012-04-26 00:18:47 +01:00
ThorstenB
dd54f6938e #717: Disabling advanced weather crashes the sim
Protect from a NULL-pointer segfault in SGCloudField::removeCloudFromTree
when disabling advanced weather (may just fix a symptom).
2012-04-25 21:08:37 +02:00
Frederic Bouvier
6e0e74a7d9 No round function for MSVC (forgot the template argument) 2012-04-25 08:59:04 +02:00
Frederic Bouvier
6a90696820 No round function for MSVC 2012-04-25 08:54:57 +02:00
Stuart Buchanan
f9bf403fc0 Random buildings - initial commit. 2012-04-24 22:00:35 +01:00
James Turner
0c13fb7ae4 Fix latent bug in Nasal hash cget / cset functions, where the embedded string length
was set to an incorrect marker value.
2012-04-23 22:29:54 +01:00
ThorstenB
9a113bdb44 Revert "Add virtual destructor to SGReferenced."
As suggested by Mathias, will use different solution.
This reverts commit 4abcf3215f.
2012-04-23 19:41:09 +02:00
James Turner
69ef461e6d Merge commit 'refs/merge-requests/22' of git://gitorious.org/fg/simgear into merge-requests/22 2012-04-23 12:21:50 +01:00
ThorstenB
4abcf3215f Add virtual destructor to SGReferenced. 2012-04-21 20:50:07 +02:00
Frederic Bouvier
4b607d6484 Revert "Remove ambient component of additional lights" because this was Yet Another Bad Idea
Ambient light is attenuated so it is possible to achieve smooth edges with it

This reverts commit fe8ba57c94.
2012-04-18 19:56:31 +02:00
Frederic Bouvier
fe8ba57c94 Remove ambient component of additional lights
It creates artifacts at edges of light volumes and should come from the main light source (sun and moon) anyway
2012-04-16 08:25:59 +02:00
Frederic Bouvier
de191107a9 light animation: avoid that similar effects are merged 2012-04-14 23:16:23 +02:00
Frederic Bouvier
77b8b278ea Ensure uniform are there before trying to use them 2012-04-14 18:00:42 +02:00
Frederic Bouvier
4758447370 Add a <dim-factor> parameter in the light animation
<dim-factor> contains a <property> element, and optionally <factor>,
<offset>, <expression>, <interpolation>, <min> and <max>
2012-04-14 09:57:20 +02:00
ThorstenB
77909577e4 Error messages when installing property aliases fails. 2012-04-05 20:03:07 +02:00
ThorstenB
1a835a2e1b performance monitor: start measurement interval with a fresh timestamp. 2012-04-05 19:30:00 +02:00
James Turner
8d0330675a Set the filename as the OSG object name on shaders - should have done this years ago :) 2012-04-04 16:44:23 +01:00
Frederic Bouvier
95a9d7a229 Revert "Disable LOD when rendering to the shadow map."
This reverts commit b95fb48a16.
2012-04-02 23:37:18 +02:00
ThorstenB
2fed46e222 performance monitor improvement
Record cumulative time consumed (all time) and current total time (current
measurement only) for subsystems.
2012-04-02 20:47:27 +02:00
ThorstenB
9ad070871a Use observer_ptr::lock for thread-safe pointer retrieval.
Also revert to using ref_ptr for the top-level EffectMap, since it holds
elements no one else references (and don't affect memory much).
2012-04-02 20:47:27 +02:00
Frederic Bouvier
b95fb48a16 Disable LOD when rendering to the shadow map.
Produce few NaNs at start
2012-04-01 23:06:32 +02:00
Mathias Froehlich
29462005b7 Fix typo in SGGeodesy.
Pointed out by Carl Godkin.
Thanks!
2012-04-01 17:50:49 +02:00
Frederic Bouvier
4de05629ee Shadow map now available in effects 2012-03-31 22:40:39 +02:00
ThorstenB
2b62411a78 Remove dead code. 2012-03-28 22:55:40 +02:00
ThorstenB
6fa4c7e138 Add file name to error message. 2012-03-28 22:54:27 +02:00
ThorstenB
ece38a6dbf Fix growing memory consumption issues
References in simgear's cache maps prevented effects, textures, clouds,
trees and lights from being unloaded at run-time (ref-counter could never
reach 0). Changed cache maps to use OSG 'observer' pointers instead, so
reference counters aren't influenced, though cache maps still hold an
(observing) pointer. Also take care when finding a cache entry with empty
content (i.e. texture was unloaded).
2012-03-28 22:53:30 +02:00
Mathias Froehlich
a592488f3e scenery: Remove redundant setting the property root.
The same value was extracted out of the same options value
in the code above. So, skip resetting to the same value.
2012-03-28 07:47:31 +02:00
Mathias Froehlich
191675cc79 scenery: Only run SGModelData in the topmost model.
It looks like that we loose the nasal script stored
in the property tree when this callback is issued
multiple times.

This should fix
 http://code.google.com/p/flightgear-bugs/issues/detail?id=714
2012-03-28 07:44:41 +02:00
Mathias Froehlich
df2e5bf39f Revert "scenery: Use correct property root in xml loading."
This helps for one symptom but it does not fix the
underlying problem. So ...

This reverts commit 986d2cc42a.
2012-03-28 07:34:36 +02:00
ThorstenB
ac29faf3bb osg::Uniform::get does not return a value on error.
Fixes "usage of uninitialized data" errors reported by valgrind.
2012-03-26 21:00:10 +02:00
Frederic Bouvier
94eabf6220 Merge Specular and Emission buffers 2012-03-25 14:14:14 +02:00
Frederic Bouvier
40bc0cbd48 Compile under MSVC 9 2012-03-25 14:14:12 +02:00
ThorstenB
b55e9df70a Don't crash when "avionics == NULL". 2012-03-22 23:54:01 +01:00
Mathias Froehlich
986d2cc42a scenery: Use correct property root in xml loading.
Really query for the root node when loading xml files.
This should fix
 http://code.google.com/p/flightgear-bugs/issues/detail?id=714
2012-03-22 08:38:16 +01:00
ThorstenB
0b8bfd9ed8 More checks/error messages for missing files,
checking return value of findDataFile.
2012-03-17 10:15:31 +01:00
ThorstenB
eff0c610e2 More consistent indentation. 2012-03-17 10:02:43 +01:00
ThorstenB
ca97e67511 Avoid segfault when a texture file is missing.
Always check the return value of "findDataFile". If it's empty, always
provide the _original_ path being searched in an error message. Otherwise
we eventually just get useless 'Can't find file "".' error messages
(and also a segfault here, since osgDB::readImageFile("") returns NULL).
2012-03-17 10:02:13 +01:00
James Goppert
47c2dce26d Removed include breaking headless build. 2012-03-16 23:04:24 +01:00
James Goppert
619163d40e Fixed mingw build. 2012-03-16 23:04:24 +01:00
Mathias Froehlich
b11c13fb9f scenery: Really, most people don't care for the noise. 2012-03-16 07:27:44 +01:00
Mathias Froehlich
a5435b7d8c scenery: Make stg loader files members of the loader. 2012-03-16 07:22:16 +01:00
Mathias Froehlich
b5fb829468 scenery: TileEntry and TileCache have moved back to flightgear. 2012-03-15 20:43:31 +01:00
Mathias Froehlich
43fceaf3a4 scenery: Move the stg read code.
Move the code reading the stg files
into ReaderWriterSTG.cxx.
2012-03-15 20:33:12 +01:00
Mathias Froehlich
8cb8395a24 scenery: ModelLoadHelper is no longer needed. 2012-03-15 20:08:38 +01:00
Mathias Froehlich
2a2be51b8f scenery: move static ReaderWriter proxies around.
Not yet sure where they end, but make sure they are currently pulled.
... now watching jenkins.
2012-03-15 19:45:51 +01:00
Mathias Froehlich
5a5d65134e scenery: Accumulate stg files until we find an OBJECT_BASE.
This should recover most of the old scenery loading behavior
before the last change. The z-fighting due to model duplication
does not happen over solid ground. Sea tiles are still broken.
2012-03-15 08:02:35 +01:00
Mathias Froehlich
0a96f4e145 scenery: Allow switching off particle systems on scenery load. 2012-03-11 14:20:33 +01:00
Mathias Froehlich
ba21713329 scenery: Allow switching off bvh generation. 2012-03-11 14:20:07 +01:00
Mathias Froehlich
32ef925a79 hla: Add convenience function to set version by string. 2012-03-11 09:21:47 +01:00
Mathias Froehlich
c62c778c88 hla: Enalble creating object instances without object class.
This enables creating HLAObjectInstance instances without
valid initial object class pointer. This is useful for local
implemented object instances.
2012-03-10 14:26:19 +01:00
Mathias Froehlich
2f0a6fdb67 hla: Remove old comment. 2012-03-10 08:30:02 +01:00
Torsten Dreyer
70ec13e10b Make the sky disable cutoff distance configurable 2012-03-09 20:58:24 +01:00
Mathias Froehlich
3693e3600c scenery: rework stg loading code.
This change reworks the code block loading the stg files.
It fixes a long standing problem where we end up loading
similar models from different entries of the scenery
path at the same geographic location. This usually results
in models that appear to have z figting, even if the isolated
model does not show z fighting at all.
As a result the lookup sequence for models and scenery has
changed a bit. This should be closer to what it supposed to
be and did not show any problems on the areas and sceneries
I tested.
2012-03-08 07:15:14 +01:00
Frederic Bouvier
69debc6777 Revert "Put airport lights in RenderBin to enable glow"
This reverts commit 1fa27f2d19.
2012-03-07 20:48:53 +01:00
Frederic Bouvier
84d7488061 Revert commit 7864516... Increase point sprite size for runway lights 2012-03-07 20:16:14 +01:00
Mathias Froehlich
fbb7c84409 scenery: Remove unused argument from runway signs. 2012-03-07 06:36:27 +01:00
Frederic Bouvier
a7379c88f4 Revert "Allow the not operator in expressions" - this is not required for
effects

This reverts commit 92074f0d3c.
2012-03-06 23:15:18 +01:00
Mathias Froehlich
cc8977b83d hla: include config.h and compiler.h in implementation files. 2012-03-05 06:59:37 +01:00
Mathias Froehlich
50380bc6c5 hla: Provide access to the parent federate. 2012-03-04 21:35:16 +01:00
Frederic Bouvier
92074f0d3c Allow the not operator in expressions 2012-03-04 21:24:54 +01:00
Frederic Bouvier
1e889c4d07 Implement point light 2012-03-04 20:21:52 +01:00
Frederic Bouvier
617a09d89a Fix path in include directive 2012-03-04 20:21:51 +01:00
Frederic Bouvier
2af409f54d Save work on shadows 2012-03-04 20:21:49 +01:00
Frederic Bouvier
6d3766e913 Move noise functions from scene/material to scene/util 2012-03-04 20:21:47 +01:00
Frederic Bouvier
9b130f099f Move Noise from scene/material to scene/util 2012-03-04 20:21:46 +01:00
Frederic Bouvier
20414e6ef4 Smaller point light for vasi 2012-03-04 20:21:44 +01:00
Frederic Bouvier
78645169bf Increase point sprite size for runway lights 2012-03-04 20:21:42 +01:00
Frederic Bouvier
a276e7e379 Remove now useless StateAttributeFactory::getNoiseNormalMap() 2012-03-04 20:21:41 +01:00
Frederic Bouvier
1dfde64ac2 Use bigger point sprites for airport lighting 2012-03-04 20:21:39 +01:00
Frederic Bouvier
1fa27f2d19 Put airport lights in RenderBin to enable glow 2012-03-04 20:21:37 +01:00
Frederic Bouvier
2822006d01 New buffer types for effects 2012-03-04 20:21:36 +01:00
Frederic Bouvier
288e63f0d8 Add noise texture and noise normal map to StateAttributeFactory 2012-03-04 20:21:34 +01:00
Frederic Bouvier
66c9187c95 Boolean uniforms are now updatable by properties 2012-03-04 20:21:32 +01:00
Frederic Bouvier
cbf8687e3d Add bloom buffer to effects 2012-03-04 20:21:31 +01:00
Frederic Bouvier
c9a80caff5 Create new buffer type : emission 2012-03-04 20:21:29 +01:00
Frederic Bouvier
f9857235fc Add new texture type in effects : lighting-buffer 2012-03-04 20:21:27 +01:00
Frederic Bouvier
c595a276a0 Include the light volume in the model 2012-03-04 20:21:26 +01:00
Frederic Bouvier
b582cd230e Implement a cache of light effects 2012-03-04 20:21:24 +01:00
Frederic Bouvier
ad6c04489c Add the light animation to the cmake system 2012-03-04 20:21:22 +01:00
Frederic Bouvier
ec7e59eda1 Full implementation of the spotlight by Effects 2012-03-04 20:21:21 +01:00
Frederic Bouvier
d929323e93 Add light animation to msvc9 project 2012-03-04 20:21:19 +01:00
Frederic Bouvier
5a96b283f6 Add preliminary spot light animation 2012-03-04 20:21:18 +01:00
Frederic Bouvier
d393e4a019 Add positioned uniforms and G-buffer textures to Effects 2012-03-04 20:21:16 +01:00
Mathias Froehlich
9700e46e47 spt: Make use of newly provided earth texture. 2012-03-04 20:10:22 +01:00
Mathias Froehlich
036c0034c3 hla: Fix the way derived classes accumulate attributes. 2012-03-04 19:56:43 +01:00
Mathias Froehlich
f5067b058c scenery: Do not use a seperate set of options for loading the model.
This fixes a problem introduced in commit
4e24095d8b.
Also this should fix Bug #698.
2012-03-04 17:09:24 +01:00
Mathias Froehlich
0d9b247da1 scenery: Only add trasnform matrices on successful loaded models. 2012-03-04 13:07:41 +01:00
Frederic Bouvier
a2b75e0d7a Compile SGReaderWriterOptions.cxx under Windows 2012-03-04 10:36:31 +01:00
Mathias Froehlich
c9165a565b Use an implementation file for SGReaderWriterOptions. 2012-03-04 08:40:56 +01:00
Mathias Froehlich
49d8b96768 Centralize osgDB::Option handling in SGReaderWriterOptions. 2012-03-04 08:33:21 +01:00
Mathias Froehlich
5ad6eb937b Make use of SGReaderWriterOptions::copyOrCreate in SGModelLib 2012-03-04 08:17:10 +01:00
Mathias Froehlich
f66e023ea8 Make use of SGReaderWriterOptions::copyOrCreate in SGMaterial. 2012-03-04 08:15:00 +01:00
Mathias Froehlich
72f1538ac2 Make use of SGReaderWriterOptions::copyOrCreate in ReaderWriterSTG. 2012-03-04 07:50:05 +01:00
Mathias Froehlich
4e24095d8b Make use of SGReaderWriterOptions::copyOrCreate in SGReaderWriterXML. 2012-03-04 07:42:31 +01:00
Mathias Froehlich
1473eabc7c Provide SGReaderWriterOptions::copyOrCreate(const osgDB::Options*).
This functions tries to preserve the database options as much
as possible and guarantees to return a non zero options
pointer.
2012-03-04 07:42:31 +01:00
Mathias Froehlich
11fd888ed8 Replace osgDB::ReaderWriter::Options to osgDB::Options.
This has changed in osg, so reflect that here.
2012-03-04 07:07:42 +01:00
Mathias Froehlich
8c78588ee1 Untangle osg singleton dependencies.
Take two. The ModelRegistry's are already derived from osg::Referenced.
So also introduce the osg dependent version in simgear/scene/util.
2012-03-03 18:57:48 +01:00
Mathias Froehlich
c74e212494 Revert "Use simgear internal stuff for the singleton class."
This reverts commit 80274596df.
2012-03-03 18:21:49 +01:00
ThorstenB
13f96cdcc9 Dir::tempDir not working on some systems.
Only worked when TMPDIR environment variable had a trailing slash (i.e.
"/tmp/" worked, but not "/tmp").
(Problem shown by simgear's "test suite". It's good to have tests!)
2012-03-03 17:06:51 +01:00
Mathias Froehlich
86e32035d7 Remove left over from osg/core dependencies.
This file should be obsolete doe to the latest changes.
2012-03-03 16:06:51 +01:00
Mathias Froehlich
80274596df Use simgear internal stuff for the singleton class.
This removes the other still present dependency on osg
in the future sgcore library.
It also remove the need for the NO_OPENSCENEGRAPH_INTERFACE
compile time definition.
2012-03-03 14:39:39 +01:00
Mathias Froehlich
2cc5e776b3 math: Remove SGMath osg dependency.
Move osg dependent stuff from SGMath into simgear/scene/util/OsgMath.hxx.
Update includes in simgear to reflect this change.
Note that this change also requires an updated flightgear version.
2012-03-03 13:35:20 +01:00
Mathias Froehlich
57a3b0fd1e math: Move lerp function into SGMisc. 2012-03-03 12:03:09 +01:00
Mathias Froehlich
9414874e1d scenery: inline SGGenTile into its single caller. 2012-03-03 12:03:09 +01:00
Mathias Froehlich
9e46820c57 scenery: Route loader options through the btg loader. 2012-03-03 12:03:09 +01:00
Stuart Buchanan
3020990121 Evaluate <condition> statements in materials.xml at tile loading time
rather than on startup.  This will allow changing between winter and
summer textures in-sim, and also allow more interesting regional
textures to be defined.
2012-03-02 23:04:18 +00:00
Mathias Froehlich
27219e0f58 hla: Fix timeAdvanceAvailable handling when no federate is regulating. 2012-03-02 22:25:47 +01:00
Mathias Froehlich
098441f5fb hla: Add propper attribute dirty handling. 2012-03-02 21:51:59 +01:00
Mathias Froehlich
a07ca86207 hla: Timestamp support down to the DataElements. 2012-03-02 21:36:08 +01:00
Stuart Buchanan
e4e3760b3d Fix masked rotation so that it's clockwise from above. 2012-02-28 21:05:54 +00:00
ThorstenB
811147d08e Fix string comparison 2012-02-28 08:39:19 +01:00
Mathias Froehlich
a563cfd0f2 hla: Fix buffer overrun in SGMath vector types. 2012-02-28 07:19:21 +01:00
Mathias Froehlich
92f7445bb9 hla: Rework toplevel HLA classes.
Better seperation between the rti and the hla level
of classes. Decouple object model setup from the
need to connect at a federate. Fix alignment computations
for the standard hla data types. Work towards an
interaction class abstraction. Add more flexibility in
deriving from the base classes and adding callbacks.
2012-02-28 07:16:11 +01:00
Stuart Buchanan
a72d858034 More robust checking of file extensions courtesy of the SGPath. Thanks to Mathias FROHLICH. 2012-02-27 21:27:27 +00:00
Stuart Buchanan
39d45e9e0a Handle dds object masks properly:
1) Only flip the object-mask if the texture xor the object mask is dds
2) Handle NTFS file systems where the extension may be .DDS rather than .dds.
2012-02-26 22:38:38 +00:00
Stuart Buchanan
4fae9039c1 Correct spacing between buildings. 2012-02-26 22:38:04 +00:00
Mathias Froehlich
124db3da8e hla: Introduce backend factory infrastructure.
Not finally ready, but provide a factory infrastructure
to improove plugability of different rti backend implementations.
2012-02-26 08:50:06 +01:00
ThorstenB
4bf4091ef7 Remove obsolete comment... 2012-02-24 22:47:18 +01:00
ThorstenB
b7fa1d4f02 #537 linker issues due to clock_gettime/librt dependencies
Simplify dependency check and make it work for Debian.
2012-02-24 22:20:37 +01:00
ThorstenB
f1c2afacc4 Revert "Try to fix MSVC template instantiation issue with SGVec dependencies."
This reverts commit 8aed0e75df.
2012-02-24 22:00:58 +01:00
ThorstenB
8aed0e75df Try to fix MSVC template instantiation issue with SGVec dependencies. 2012-02-24 21:47:00 +01:00
Stuart Buchanan
cf2619613d Stop objects from overlapping the edge of the triangle in which they are placed. This should stop buildings encroaching roads etc. 2012-02-23 20:10:02 +00:00
ThorstenB
2a9d39f201 Allow (ab)using findDataFile to also search directories again. 2012-02-19 14:39:19 +01:00
ThorstenB
ae0b8eb3b3 Make tsync part of libSimGearCore when building shared libraries 2012-02-19 14:39:19 +01:00
Mathias Froehlich
63081c94a1 hla: Add new header containing some enums. 2012-02-18 17:13:45 +01:00
Mathias Froehlich
c39926dd72 hla: Rename AttributePathPair to StringPathPair.
This way of addressing attribute data elements
should also be used for parameters. So, name it a little
more neutral.
2012-02-18 16:49:17 +01:00
Mathias Froehlich
4683e7e9c9 hla: Do not introduce an empty enumerated data type.
This fixes a bogous enumerated data type that is
up to now introduced into the data type map.
2012-02-18 13:20:25 +01:00
Mathias Froehlich
dc9163f801 hla: rename HLAVariantData* to HLAVariantRecordData*
Rename to the true name that is used in the standard.
2012-02-18 11:44:00 +01:00
Mathias Froehlich
42cc699263 HLAFederate: introduce read*ObjectModelTemplate.
Introduce read{RTI13,RTI1516,RTI1516E}ObjectModelTemplate
methods. Deprecate the current readObjectModelTemplate method
and provide a short term upgrade path.
2012-02-18 11:00:28 +01:00
ThorstenB
37457fcb33 Remove obsolete ignore pattern for automake generated headers. 2012-02-17 23:46:06 +01:00
Torsten Dreyer
441dc41715 Don't untie a property when loading from xml
executing the fgcommand loadxml implicitely untied every previously
tied property if a property type was given in the property element.
That made it impossible to autosave aircraft data for tied properties.
This patch should fix this. It adds an inconsitency, though:
if a property with a given type is read in which has been tied to
before and the property types do not match, the property type in the
xml file will be ignored.
2012-02-15 14:54:02 +01:00
ThorstenB
811f156ad1 #658: better bugfix for findDataFile issue
Fixes the more basic probelm of "SGModelLib::findDataFile" resolving an
empty file name to the fgdata (directory) path. findData_File_ should
never return a _directory_ path, only valid _file_ names.
2012-02-11 10:55:13 +01:00
ThorstenB
2a0e9d31e1 #658: avoid crash when Textures.high is missing
Don't resolve the empty file name, which would result in the fgdata
directory path (instead of a path to a file). Eventually this resulted in
a segfault, partly due to a bug in "osgDB::readImageFile", which reports
"success" when given a directory (instead of a file) path, though it
doesn't return a valid image object.
2012-02-11 10:00:03 +01:00
Stuart Buchanan
c473cd7213 Fall back to taking tree textures from Terrain/ if they are not found under
Terrain.high, consistent with the other textures in materials.xml.

Also fix comment.
2012-02-10 22:49:20 +00:00
Olaf Flebbe
1af8aacd1d disable annoying clang warning 2012-02-10 22:42:27 +01:00
ThorstenB
5eb9acd8b6 Olaf Flebbe: Avoid infinite recursion in simgear::Dir::create
when using it with a relative path.
2012-02-10 22:42:27 +01:00
Stuart Buchanan
6bc9eb950f Retire tree-density and wood-size, as they have been superseded by object masking. 2012-02-07 21:12:41 +00:00
Stuart Buchanan
593c884f14 Random object and vegetation masking based on bitmap file.
Also adds a property controlling vegetation density.
2012-02-05 23:05:57 +00:00
ThorstenB
9d20de068c Move JPEG dependency
Alas, JPEG_FACTORY is in SimGearScene, not SimGearCore...
2012-01-29 14:39:48 +01:00
ThorstenB
96c2e4d3ab Correct dependency of shared simgear libraries with enabled JPEG_FACTORY. 2012-01-29 14:28:49 +01:00
Mathias Froehlich
165d2ea978 Improve the compressed texture message. 2012-01-19 07:34:47 +01:00
Stuart Buchanan
0702272097 Switch Impostors off by default, set reasonabl LOD and Impostor ranges. 2012-01-17 22:15:14 +00:00
Stuart Buchanan
965c8ccfd2 Improved 3D clouds
1) Impostors
2) One drawable per cloud rather than a single drawable shared by all clouds.
2012-01-17 22:14:57 +00:00
Torsten Dreyer
b20a49b018 bump version number to 2.7.0 2012-01-17 08:35:57 +01:00
Torsten Dreyer
5a6b760847 bump version number to 2.6.0 2012-01-17 07:46:13 +01:00
Mathias Froehlich
7e2dc443ec Use the original filename for the compressed image message. 2012-01-15 13:07:35 +01:00
ThorstenB
21f2e1f250 #599: Don't crash when a path does not exist. 2012-01-13 19:58:45 +01:00
ThorstenB
cee8c5b5c7 #199: ADd method to return the absolute (real) path. 2012-01-12 21:44:15 +01:00
Mathias Froehlich
7ee2633164 Do not disable the portability warnings on mac/win.
Since the message should help people doing textures to
provide texture files that run everywhere, do not omit
the messages just because the build platform did not
know these.
2012-01-12 18:49:54 +01:00
James Turner
6c31a721b8 #ifdefs for option GL texture compression constants - should fix Windows as well as Mac 2012-01-11 23:41:02 +00:00
Mathias Froehlich
8fc97ea1ce Log images containing data depending on an extension.
Print a descriptive warning on images that are given
in a texture format that do only work in presence of an
extension that might not be there at runtime.
2012-01-11 18:38:06 +01:00
ThorstenB
423eba3733 Alas. Fix #pragma magic for GCC <= 4.5.
push/pop was introduced for GCC4.6 only - so avoid it.
Also, properly fix the fgets warning.
2012-01-09 22:18:17 +01:00
ThorstenB
49a23fdc2e Fix final simgear GCC warnings. 2012-01-09 21:51:09 +01:00
ThorstenB
fddac2443d More #pragma magic.
Same magic as for SGSphere.
2012-01-09 21:49:34 +01:00
ThorstenB
182037ad67 Slightly better error message for invalid taxiway signs. 2012-01-09 20:27:27 +01:00
ThorstenB
5923956045 #587: don't crash on negative sizes 2012-01-09 20:21:28 +01:00
ThorstenB
a89b9f6158 #581, invalid gcc pragma syntax
Thanks to Olaf Flebbe.
2012-01-09 20:19:26 +01:00
Frederic Bouvier
d7931a28ce MSVC: don't try to compile unknown pragma 2012-01-03 21:20:37 +01:00
Stuart Buchanan
cc47d33b32 Adjust LoD ranges for 3D clouds so that they become visible at maximum range, taking into account the current cloud visibility range, and the possible size of the clouds themselves. 2012-01-02 23:10:20 +00:00
ThorstenB
68625e48b9 Fix compiler warning / test issue. 2012-01-02 23:04:40 +01:00
Erik Hofman
3496d64a52 sounds tied to listeners are never out of range 2011-12-30 11:16:58 +01:00
ThorstenB
f97ced2240 Add version suffix when building shared objects 2011-12-29 14:45:29 +01:00
Torsten Dreyer
3d44f1c825 Revert changes to xmlparse.[ch]
These files are copies from libexpat and should not be touched.
Thanks to Mathias for pointing this one out.
2011-12-26 11:40:57 +01:00
Torsten Dreyer
306c58e7ed Some more trivial warning fixes 2011-12-25 20:28:38 +01:00
Torsten Dreyer
82588b0daf Remove stray ';' 2011-12-25 20:12:48 +01:00
Torsten Dreyer
aef8f13290 Use of copy-constructors
explicitly initialize the base class in a copy-constructor instead
of implicitly calling the default constructor.
2011-12-25 20:11:06 +01:00
Torsten Dreyer
4ae7c90d49 Small warning fixes, mostly unused variables 2011-12-25 14:40:07 +01:00
Erik Hofman
cc2234bf54 Degarde lack of free sounds message from alert to bulk for this release. 2011-12-24 11:13:49 +01:00
Erik Hofman
368d280da2 surpress unitialized variuable warning for SGSphere() only 2011-12-20 10:08:20 +01:00
Erik Hofman
4faf727f1b Do not initialize _center to save unneeded initialization time. 2011-12-20 10:00:33 +01:00
Erik Hofman
f28e472f59 Throw a warning even is NDEBUG is defined 2011-12-19 15:34:11 +01:00
Erik Hofman
69c5d5c86e Intialize to prevent a 'may be used uninitialized' warning 2011-12-19 15:29:25 +01:00
Erik Hofman
f9332b813e Intialize to prevent a 'may be used uninitialized' warning 2011-12-19 15:28:11 +01:00
Erik Hofman
052ce499c9 Intialize the center to prevent a 'may be used uninitialized' warning 2011-12-19 15:25:58 +01:00
ThorstenB
54db2e0ab1 #479: avoid issues due to trailing path separators
Cut trailing separators when converting from string to sgpath.
Also, SGPath::fix does NOT replace ":". It only replaces "\" with "/",
so the "i!=1" check for Windows made no sense (rule #9: never believe
a source code comment).
2011-12-18 17:04:31 +01:00
ThorstenB
b261836f71 #512: fix compatibility issue with boost 1.48.0
Thanks to handigehansje.
2011-12-18 14:06:27 +01:00
Mathias Froehlich
a0290954d6 Return ReadResult::FILE_NOT_HANDLED for unknown extensions.
This fixes a problem with fonts no longer being correctly
loaded as a side effect of the spt meta object loader.
The readObject slot is obviously being called for several
unrelated file extensions. To make sure the search continues,
osgDB::ReaderWriter::ReadResult::FILE_NOT_HANDLED needs to
be returned in this case.
2011-12-17 19:11:26 +01:00
Frederic Bouvier
112eb04079 Add new files in the MSVC project 2011-12-17 16:45:19 +01:00
Mathias Froehlich
057cbe7cc3 Correct scenery load path extension. 2011-12-16 07:39:25 +01:00
Mathias Froehlich
945a9e0ac2 Implement osg native scenery paging.
Add an in memory osg scenery loader that provides
paged scenery loading using PagedLOD nodes.
2011-12-16 07:39:25 +01:00
Erik Hofman
a92ea7f822 No need to start non looping samples automatically when getting in-range. 2011-12-13 11:40:08 +01:00
Erik Hofman
b57b223a59 Add an out_of_range property to sound samples. If set the sound is set to non playing (which allows the OpenAL sound the be free'd) 2011-12-13 11:09:12 +01:00
Erik Hofman
f377c75dbd Add vi(m) .swp files and a [Bb]uild directory 2011-12-12 13:20:49 +01:00
Erik Hofman
8d3de8dee5 Free OpenAL sounds of objects that are farther away than the max_distance. 2011-12-12 13:19:43 +01:00
ThorstenB
cfdf992600 Improve logging classes.
Replace SG_GENERAL by more specific log classes in many places.
2011-12-11 13:57:54 +01:00
Frederic Bouvier
fd8c677b87 Update MSVC 90 project (moved files) 2011-12-10 18:50:08 +01:00
Erik Hofman
ff2eb6d2d3 Properly handle stereo wav files; remove data buffer and set buffer to FAILED_BUFFER 2011-12-07 10:41:57 +01:00
ThorstenB
97fcf48caa fix sound buffer resource leak
Openal doesn't remove buffers unless they were disconnected form
their source.
2011-12-04 21:25:42 +01:00
ThorstenB
e17b3a753e sound: fix "source" resource leak
Sound resources were eaten up when a sample could not be loaded.
Restores sound for aircraft attempting to use stereo files for sound effects.
However, when loading fails, sound code still tries to load the same file
again and again (always resulting in the same "stereo files not supported"
error), which slows down simulation.
2011-12-04 20:16:36 +01:00
ThorstenB
865b0a3e56 sound manager: report a few more errors 2011-12-04 17:10:58 +01:00
Frederic Bouvier
0d1ddc5f44 Fix a copy/paste typo in Effect depth attributes 2011-12-01 19:45:18 +01:00
ThorstenB
6780a0c8d4 Fixed lib64 auto-detection (again)
Reverting the "LIB_SUFFIX" change.
Assuming recent change was unintentional (otherwise let me know James! :) ).
2011-11-30 19:50:09 +01:00
James Turner
fee652d54a Fix header installation for shared build 2011-11-30 09:45:32 +00:00
James Turner
42b7c48671 Move some OSG-dependant code into scene/util. 2011-11-29 10:23:09 +00:00
James Turner
75afee59c3 Get all the tests linking with shared-simgear, and duplicate the awkward core functions into a new file, pending a proper cleanup. 2011-11-28 23:22:43 +00:00
James Turner
ae3f718fe3 Fix naming of core library, get IO tests linking shared, and exclude OSG symbols from the core lib by setting headless mode. 2011-11-28 23:05:05 +00:00
James Turner
4b02335637 Build system tweaks to support SIMGEAR_SHARED building two libraries. Work in progress, does not link yet. 2011-11-28 22:43:57 +00:00
ThorstenB
7a52c2fa71 cmake: add option to disable building tests 2011-11-26 16:39:40 +01:00
ThorstenB
ec5d067d28 CMake: Proper support for lib vs lib64 installation
Determine name of library installation directory, i.e. "lib" vs "lib64",
which differs between all Debian-based vs all other Linux distros.
See cmake bug #11964, http://cmake.org/gitweb?p=cmake.git;a=commit;h=126c993d
Also provide a script for older (<=2.8.4) cmake
2011-11-25 12:06:54 +01:00
Erik Hofman
3c9fec78fa Slightly rearrange the buffer removing code. This should make sure the source is always stopped (required by the OpenAL spec) before a buffer is removed and added to the free source list. 2011-11-23 09:41:13 +01:00
Erik Hofman
0a08ee836c Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-11-20 19:08:04 +01:00
ThorstenB
5f804cb0eb Add another subsystem group.
Sound subsystem wants to be the last in processing - so use a
separate group.
2011-11-20 15:50:56 +01:00
Erik Hofman
a0fd942048 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-11-20 10:19:52 +01:00
Frederic Bouvier
dad1577fe3 Update VS2008 project 2011-11-19 21:19:08 +01:00
ThorstenB
338f2311d4 Merge commit 'refs/merge-requests/17' of git://gitorious.org/fg/simgear into merge-requests/17 2011-11-19 15:25:22 +01:00
ThorstenB
27a1c0288b Separate module to monitor (subsystem-)performance.
Move some code from the subsystem manager to a separate module.
Add module to evaluate performance and expose statistics to properties.
2011-11-19 15:24:43 +01:00
ThorstenB
dd45be518f Improve error messages, report file name. 2011-11-17 21:26:02 +01:00
Christian Schmitt
a9c058ba9d Allow 6-lights VASI as well (2 bars a 3 lights). 2011-11-17 17:19:58 +01:00
James Turner
3e07423778 Fix a std:: namespace issue on Windows. 2011-11-13 21:27:15 +00:00
James Turner
63ccb3df4c std:: namespace fixes, and sink some code from the subsystem header into the implementation. (Hopefully more to follow) 2011-11-13 20:34:39 +00:00
James Turner
906ef85d90 using std:: fix 2011-11-13 20:33:25 +00:00
Frederic Bouvier
895edf4f17 Fix MSVC build 2011-11-13 20:06:39 +01:00
Mathias Froehlich
ff1c035d42 Use osgDB::read*File instead of dereferencing the osgDB Registry instance. 2011-11-13 18:35:18 +01:00
Mathias Froehlich
f61fe80f60 Consolidate the different ReaderWriterOptions classes. 2011-11-13 18:35:18 +01:00
ThorstenB
dfbdcc1bf0 Replace OpenThreads with SGThread to avoid useless OSG dependency.
Untangle SG subsystems by replacing direct TileCache call with callback.
2011-11-13 15:37:49 +01:00
ThorstenB
b09636f5ca Fixed typo. 2011-11-10 22:08:23 +01:00
Erik Hofman
8727e609f0 Also stop the source if it is paused when exit. 2011-11-10 12:52:17 +01:00
Erik Hofman
40fc2907a1 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-11-10 10:29:07 +01:00
Martin Spott
81fd5535fc OpenSceneGraph 3.0 required 2011-11-09 13:55:49 +01:00
Mathias Froehlich
ad079b8ed4 modellib: Add method for deferred model loading.
Add method that schedules a ProxyNode to do
just deferred model loading instead of full scenery paging.
Add support for ProxyNodes to CheckSceneryVisitor.
Use PagedLOD instead of our own derived method.
2011-11-08 21:31:18 +01:00
PSadrozinski
a543560f7d Adding Icecode GL's polygon-offset support for effects 2011-11-06 09:47:29 -05:00
Erik Hofman
bb2cc6ef2d Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-11-05 11:41:07 +01:00
Mathias Froehlich
977f23f0e7 Remove automake ignores. 2011-11-01 13:53:29 +01:00
James Turner
24c047c94e Remove the remaining Makefiles from the code. 2011-11-01 09:28:26 +00:00
James Turner
22b4aa4d8b Remove the automake / autoconf build files. 2011-11-01 09:26:22 +00:00
Erik Hofman
110753e92c Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-10-30 10:40:00 +01:00
Mathias Froehlich
be70656745 Add a HLADataElementVisitor implementation. 2011-10-30 10:23:59 +01:00
James Turner
d36e13e8ed Make tiedpropertylist quieter. 2011-10-30 07:55:44 +00:00
James Turner
2e9896a9ab Enhancements to property-object support, add a default ctor and some typedefs. 2011-10-30 07:55:29 +00:00
Csaba Halasz
ee06ec0c40 terrasync build fix: added #include <string.h> for strlen 2011-10-30 02:14:27 +02:00
ThorstenB
aa0e3e3c9f #453: Using = as Nasal function argument crashes FG
Keep Nasal parser from crashing when "=" function misses a left-hand
element, i.e. when parsing "sin(=)".
(Or do people writing such terrible syntax deserve a crash? ;-) ).
2011-10-29 21:20:46 +02:00
ThorstenB
3477e1a4f5 terrasync improvements
Detach from console to make "Ctrl-C" work for fgfs on Linux.
Immediately start synchronization of current position when
starting at run-time.
2011-10-29 21:15:29 +02:00
ThorstenB
a4b788980c Fix terrasync airport synchronization sequence
Airport A-J were skipped. Thanks to James for spotting this.
Also corrects actual sync order.
2011-10-29 21:13:12 +02:00
James Turner
519a843340 Move ALUT 1.0 variables inside the #ifdef, to avoid some compiler warnings. 2011-10-29 11:06:24 +01:00
Mathias Froehlich
269299d913 Remove sg_sleep.*. 2011-10-28 19:11:43 +02:00
Mathias Froehlich
cc4b16b50d Fix mac build. 2011-10-28 19:10:20 +02:00
Mathias Froehlich
d10bcc8a53 Hopefully fix jenkins build. 2011-10-28 19:05:46 +02:00
Mathias Froehlich
92db9682e0 Make use of SGTimeStamp::sleep*. 2011-10-28 18:45:23 +02:00
Mathias Froehlich
cd773e4764 Add sleep implementations to SGTimeStamp.
Implement sleeping to an absolute timestamp
as well as sleeping for a relative time in
SGtimeStamp.
The reason for including this into SGTimeStamp
is that the timestamps internals are required to
do accurate sleeps to and absolute timestamp
for the posix timer implementation.
2011-10-28 18:45:23 +02:00
James Turner
f14ffd5b1d Fix a bug affecting TerraGear, and extend unit-tests to cover this. (SGPath::file returned an empty string for paths with no directory separator) 2011-10-28 12:57:07 +01:00
James Turner
e34f597fe2 Add sound test programs to the CMake build. 2011-10-28 12:29:26 +01:00
James Turner
95ddc04a73 Fix assorted compiler warnings found by Clang 2011-10-28 12:07:35 +01:00
Torsten Dreyer
c6d5cbd52c Keep VC90 project file working with SGAtomic 2011-10-27 08:18:54 +02:00
James Turner
75b695664a Change (revert!) behaviour of SGPath::base, which broke TerraGear, when used with multiple file suffixes (hgt.zip, for example). Test cases updated to match TG-required behaviour. 2011-10-26 19:57:57 +01:00
James Turner
59ecf48b72 Support stream output by SGPath directly. 2011-10-25 21:44:57 +01:00
James Turner
2fb13c76f5 Address warnings found via Clang - especially related to destructor visibility with ref_ptrs of various kinds. 2011-10-24 18:09:42 +01:00
Mathias Froehlich
7438aea869 Fix SGAtomic mutex logic. 2011-10-23 23:27:38 +02:00
Mathias Froehlich
83772c87ac Rework SGAtomic, move more into the implementation.
Mainly move many cases into the implementation file.
2011-10-23 23:03:15 +02:00
James Turner
6250f675db Fixes for headless mode. 2011-10-23 17:56:28 +01:00
James Turner
a31639682b Use a compile test to see if we need to provide the GCC atomic built-ins ourselves, or not. 2011-10-23 15:59:27 +01:00
James Turner
576979c562 Make lat/lon points in the ocean tile configurable at run-time. Not hooked up to a property yet, but soon. 2011-10-23 11:26:19 +01:00
Erik Hofman
c53989adb8 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-10-23 10:39:26 +02:00
Stuart Buchanan
a1bb62f43c Fixes to 3D clouds
- Wrap 3D clouds (e.g. Global Weather) on the surface of a sphere rather than on a plane. Cloud altitude no-longer increases with distance from the start position
 - Fix altitude of individual clouds, which where being places approx 1/2 the sprite height too high. Note that this means sprite positions in the cloud are the center of the cloud rather than the bottom.
 - Improve LOD radii, which were far too large.
2011-10-22 21:28:09 +01:00
James Turner
5eec2e7889 Support for creating a source package via CPack 2011-10-22 15:37:17 +01:00
James Turner
f4bb236c04 Add FUZZY_COMPARE to me tar unit-test, tolerate lower-order imprecision in FPUs 2011-10-21 11:21:52 +01:00
James Turner
c82df0590d SGPath rename wrapper. Let's see what Win32 makes of it. 2011-10-21 09:36:33 +01:00
James Turner
43e13f0cf2 Remove-on-destroy option for simgear::Dir, to help with cleaning up temporary directories. 2011-10-21 09:36:10 +01:00
James Turner
63a8209a83 Remove using std:: from the metar header, remove HTTP support, add very basic unit-test harness. 2011-10-21 09:35:37 +01:00
James Turner
7984f055e2 string list joining, and a test case for that and splitting. 2011-10-20 11:12:54 +01:00
Erik Hofman
3104898c7c Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-10-18 18:32:57 +02:00
James Turner
8cb716fe8e std:: namespace fixes. 2011-10-17 09:50:35 +01:00
James Turner
9cdf5ab9a1 Add another helper to strutils, to compare version strings. 2011-10-17 09:50:21 +01:00
Csaba Halasz
bcf7ed501d Compile fix: add this-> in SGExpression.hxx due to two-phase name lookup (reported by gcc 4.7) 2011-10-16 14:00:39 +02:00
Frederic Bouvier
09b0dd2b2d Fix windows build 2011-10-15 09:42:15 +02:00
James Turner
04a47dfb8d Use mkdtemp where available, avoiding linker warnings about dangerous tempnam 2011-10-15 02:06:35 +01:00
James Turner
bc9b3f6ff1 Unit test for SGBinObj, and fix a bug in large-indice handling the test revealed. 2011-10-14 21:57:34 +01:00
James Turner
086a30e61a Add default constructor to simgear::Dir 2011-10-14 19:28:21 +01:00
Erik Hofman
cd8e7a1030 Warn for stereo files. 2011-10-03 08:34:20 +02:00
Mathias Froehlich
8e92c5d985 hla: fix typo resulting in an endless loop. 2011-10-02 15:13:06 +02:00
Mathias Froehlich
5708ec5a89 hla: provide main loop capabilities for HLAFederate. 2011-10-02 14:36:33 +02:00
Mathias Froehlich
f665431132 hla: lift the event loop logic from RTI to HLAFederate. 2011-10-02 10:11:10 +02:00
Mathias Froehlich
9e27511ef9 hla: Provide createJoin and resignDestroy methods. 2011-10-01 17:46:16 +02:00
Mathias Froehlich
344f876b0a hla: disable copying for HLA*Class. 2011-10-01 10:11:33 +02:00
Mathias Froehlich
10217a3b19 rti: Implement query{GALT,LITS} in the interface and RTI13. 2011-10-01 10:04:23 +02:00
Mathias Froehlich
778cc4c435 clouds: remove unused bump mapping flags. 2011-10-01 09:21:57 +02:00
Mathias Froehlich
bd999ca090 hla: Move callbacks into the rti federate implementation. 2011-10-01 09:10:57 +02:00
Mathias Froehlich
4d9980b0e6 HLAPropertyDataElement: add virtual qualifier to destructor. 2011-10-01 08:34:13 +02:00
James Turner
a459b8fdbb Make the common case the default: no library suffix for RelWithDbg or MinSizeRel builds. Of course you can still specify a suffix if desired. 2011-09-26 13:32:34 +01:00
Mathias Froehlich
c925c02e69 automake: add thread libs to the io tests. 2011-09-24 09:55:01 +02:00
James Turner
4566bece90 Alternate, WinSock friendly reporting for host lookup failures. 2011-09-16 16:43:09 +01:00
James Turner
403b7c14aa Fix a crash where hostlookup fails entirely, thanks to Andreas Gaeb for the catch. 2011-09-16 11:37:02 +01:00
Mathias Froehlich
b3e07077fa cmake: clear the svn libraries variable if not found. 2011-09-14 17:24:49 +02:00
Andreas Gaeb
f7cee2ed56 cmake: Add headers to library components
Add headers to library components so that they get
included into the IDE project files.
2011-09-14 08:56:17 +02:00
Torsten Dreyer
b7173100c8 Merge commit 'refs/merge-requests/11' of git://gitorious.org/fg/simgear into merge-requests/11 2011-09-12 17:26:01 +02:00
Frederic Bouvier
cb496379bc Typo 2011-09-12 12:20:03 +02:00
Frederic Bouvier
c37b9c95e6 Attempt to make FindSvnClient.cmake portable 2011-09-12 12:17:06 +02:00
Frederic Bouvier
919e01f26e Fix SVN detection for Windows 2011-09-12 10:54:03 +02:00
Frederic Bouvier
cad21935d6 Auto detect 3rd Party root for Windows 2011-09-12 10:53:18 +02:00
Mathias Froehlich
d290fdfc5f cmake: Use a default build type that builds fast executables. 2011-09-12 08:10:20 +02:00
Mathias Froehlich
c77161e2b0 cmake: add quotes to string split. 2011-09-11 23:27:03 +02:00
Stuart Buchanan
d2dfb81a09 Place clouds on a curved field, rather than completely flat, so
they curve with the earth surface. Note that this does not fix
"wrapped" clouds.
2011-09-11 22:11:27 +01:00
Stuart Buchanan
4acf7ce840 Merge branch 'next' of gitorious.org:fg/simgear into next 2011-09-11 21:38:54 +01:00
Frederic Bouvier
2f6b84a2cc Lower the requirements on Cmake version (at least until Jenkins is updated) 2011-09-11 21:43:54 +02:00
Frederic Bouvier
2c00a4ac35 Enforce the use of Cmake 2.8 2011-09-11 20:48:50 +02:00
Stuart Buchanan
c27ca18674 Merge branch 'next' of gitorious.org:fg/simgear into next 2011-09-09 18:42:56 +01:00
James Turner
7c7f3d4fcd Hopefully fix test compilation on MSVC 2008+CMake 2011-09-09 11:48:11 +01:00
Mathias Froehlich
8fba4b0cbe Fix win32 SGThread::join timeout. 2011-09-08 17:41:21 +02:00
James Turner
b0015ab6e8 Further Windows Cmake tweaks. 2011-09-07 20:41:55 +01:00
James Turner
3a210d6fa6 Make sgio tests friendly to Windows. 2011-09-07 20:12:35 +01:00
James Turner
b5a4a55370 Cmake Windows tweaks. 2011-09-07 19:58:26 +01:00
Mathias Froehlich
35a449c7d0 Update the automake based build system to the last changes. 2011-09-07 18:39:04 +02:00
James Turner
1305e16425 Work (in progress) on CPack packaging for SimGear 2011-09-07 16:54:28 +01:00
Mathias Froehlich
08003ceba9 Revert to simgears thread support.
For all source directories outside of simgear/scene,
which really depends very hard on osg, avoid using osg
classes. This should reenable the use of some basic and
scenegraph independent parts of simgear without the
the need for osg.
2011-09-07 17:32:43 +02:00
Mathias Froehlich
059db643bc Reimplement SGThread and friends.
Reimplement the threading stuff using either pthreads
or win32 threads. These simple classes should help us
to stay osg independent for simgears core classes.
2011-09-07 17:32:43 +02:00
Martin Spott
39731debdc Merge commit 'refs/merge-requests/10' of git://gitorious.org/fg/simgear into next 2011-09-05 14:17:00 +02:00
Torsten Dreyer
9ef56cbc48 Merge commit 'refs/merge-requests/7' of git://gitorious.org/fg/simgear into merge-requests/7 2011-09-02 12:11:42 +02:00
Stuart Buchanan
becea84955 Merge branch 'next' of gitorious.org:fg/simgear into next 2011-09-01 19:55:11 +01:00
Dmitry Marakasov
ceac7b46fc Fix bashisms in configure.ac 2011-09-01 22:53:59 +04:00
Mathias Froehlich
594095a363 Introduce quaternion finite difference method.
This implements a function for the quaternion implementation
that computes the angular velocity that matches an explicit euler
step that propagates from a starting quaternion orientation to a
destination quaternion orientation.
2011-09-01 17:11:25 +02:00
James Turner
3397066343 One more Linux compile fix. 2011-08-31 07:26:11 -07:00
James Turner
d1d8c68bf1 Missing include on Linux 2011-10-14 12:05:31 +01:00
James Turner
d37bf8a4ae SGPath/Dir extensions to ease file handling in TerraGear. Also a unit-test, shocking. 2011-10-14 11:37:36 +01:00
James Turner
e4e31be7d4 Fix BTG writer for non-included index arrays. 2011-10-12 17:01:52 +01:00
ThorstenB
5ede8c12ba Make SGModelPlacement safe on reinit
Remove old model When init is called multiple times (i.e. reinit).
Also allow explicit removal of submodel (= init(0) ).
2011-10-11 21:28:37 +02:00
Torsten Dreyer
db509f4075 Merge branch 'next' of gitorious.org:fg/simgear into next 2011-10-08 20:36:20 +02:00
Mathias Froehlich
85e58b4a49 hla: for rti13 queue all callbacks.
This is to avoid running into the rti13 ambassadors
recursion guards. Newer rti standards will not requires this.
2011-10-08 17:44:53 +02:00
Martin Spott
64b6a4ebf2 Add missing header for printf 2011-10-07 09:57:09 +02:00
Martin Spott
a0c48de39d Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-10-07 09:39:12 +02:00
James Turner
d9a281c493 Support for 32-bit vertex indices in BTG files 2011-10-06 21:28:55 +01:00
Torsten Dreyer
eb52f38c47 Stuart Buchanan:
A further fix to the cloud placement, to make it more accurate over longer distances.
2011-10-06 16:49:09 +02:00
Torsten Dreyer
c1f51d5be7 Stuart Buchanan:
Add additional lighting factors for 3D clouds so you can set the bottom, middle, top, and shade lighting factors.
2011-10-06 16:47:03 +02:00
Torsten Dreyer
08cb2039c5 Merge commit 'refs/merge-requests/12' of git://gitorious.org/fg/simgear into merge-requests/12 2011-10-06 16:42:36 +02:00
Mathias Froehlich
6485ea4051 hla: Add flush queue request, fix comments. 2011-10-05 21:03:52 +02:00
Frederic Bouvier
aa9e91f926 Fix win32 build of decode_binobj 2011-10-05 08:13:31 +02:00
Mathias Froehlich
70ac6614e8 hla: Remove interface functions that should not be called explicitly. 2011-10-04 21:07:24 +02:00
Mathias Froehlich
64ce231705 hla: Initially request update for subscribed unowned attributes. 2011-10-04 20:55:44 +02:00
Mathias Froehlich
7a98f89e1b hla: provide a more general property data element implementation. 2011-10-04 20:32:34 +02:00
Mathias Froehlich
264e336a49 hla: add missing file fir the last commit. 2011-10-04 20:27:59 +02:00
Mathias Froehlich
595328963a hla: provide a data type visitor building a default data element tree. 2011-10-04 20:21:12 +02:00
Mathias Froehlich
d951a55be0 hla: detect string and opaque data types. 2011-10-04 19:48:34 +02:00
James Turner
7ffc84fb86 Fix decode_bin linkage with GNU ld. 2011-10-04 17:53:53 +01:00
James Turner
5871b54172 Build decode_bin helper under CMake. 2011-10-04 15:06:12 +01:00
Mathias Froehlich
92976b7735 hla: remove the now unused HLAPropertyReference{,Set}. 2011-10-03 13:11:52 +02:00
ThorstenB
2e13c1fa4b Add convenience class for change listener callbacks. 2011-10-03 11:57:48 +02:00
Martin Spott
b5134f15b4 Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-10-03 11:45:57 +02:00
Mathias Froehlich
bcb320b537 hla: Provide a directly property based api for property data element. 2011-10-03 11:21:27 +02:00
Martin Spott
1475964145 Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-10-03 10:42:38 +02:00
Martin Spott
1802ccf374 Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-10-01 22:05:53 +02:00
Martin Spott
3849de1931 Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-26 16:23:58 +02:00
Martin Spott
1a46974cb9 Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-26 11:18:56 +02:00
Martin Spott
25918b8b76 Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-16 22:55:44 +02:00
Stuart Buchanan
20bd0737a2 Make tree textures consistent across runs by replacing rand() call with
something deterministic.
2011-09-15 21:11:00 +01:00
Martin Spott
31fdfbaf38 Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-14 19:55:27 +02:00
Martin Spott
8428cae1c8 Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-14 15:50:19 +02:00
Martin Spott
65ae34169d Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-13 13:37:12 +02:00
Martin Spott
ecff995e7c Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-12 16:02:00 +02:00
Martin Spott
40dc9ff95e Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-12 09:30:27 +02:00
Martin Spott
24a421c83e Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-12 00:57:50 +02:00
Martin Spott
b204b3c8eb Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-09 18:13:12 +02:00
Martin Spott
34738bb20a Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-08 18:09:24 +02:00
Martin Spott
1b1068248d Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-08 11:48:56 +02:00
Martin Spott
9f684978cf Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-07 19:21:53 +02:00
Martin Spott
747717e2ee Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-07 18:35:40 +02:00
Martin Spott
ed7f2df04e Merge branch 'next' of git.gitorious.org:fg/simgear into next 2011-09-07 17:42:54 +02:00
Martin Spott
b159a72ce9 Fix CMake HLA fix 2011-09-05 18:45:33 +02:00
Mathias Froehlich
29faf13afd Move the decision which rti to use into HLAFederate. 2011-08-30 22:18:29 +02:00
James Turner
427d6c3316 Async lookup attempt #3 - use OpenThreads instead - I'm going to kill off SGThread imminently. 2011-08-30 15:14:14 +01:00
James Turner
eafea28266 Revert "Asynchronous host lookups+caching, attempt #2"
Bah, SGThread is a pain, need to switch to OpenThreads

This reverts commit 1cb9a79fd4.
2011-08-30 13:41:06 +01:00
James Turner
1cb9a79fd4 Asynchronous host lookups+caching, attempt #2 2011-08-30 12:51:03 +01:00
Mathias Froehlich
959791ffde Add modifyLookahead to the rti abstraction. 2011-08-30 07:28:13 +02:00
Mathias Froehlich
a5775cdb94 Add SGVec* convinience hla data elements. 2011-08-30 07:27:24 +02:00
Stuart Buchanan
05272d1070 Merge branch 'next' of gitorious.org:fg/simgear into next 2011-08-29 14:33:02 +01:00
Mathias Froehlich
b5d2cfdbea Fix error message in RTI13ObjectInstance. 2011-08-28 22:26:16 +02:00
Mathias Froehlich
e716f82670 Add query{Looahead,FederateTime} to the hla interface. 2011-08-28 21:22:02 +02:00
ThorstenB
dc5af66748 Merge commit 'refs/merge-requests/9' of git://gitorious.org/fg/simgear into merge-requests/9 2011-08-28 14:10:11 +02:00
ThorstenB
40e177a02e #329: fix issue with mismatching sound volume
Sounds played after changing view position sometimes had incorrect volume
2011-08-27 12:00:17 +02:00
ThorstenB
36a8243f73 Support absolute paths for XML includes.
Use standard path resolver when searching for includes. Includes like
  <foo include="/Aircraft/Instruments/myfile.xml">
are now also supported - no need for
  <foo include="../../../Aircraft/Instruments/myfile.xml">.
2011-08-27 11:53:15 +02:00
Stuart Buchanan
d90647e9ba Merge branch 'next' of gitorious.org:fg/simgear into next 2011-08-26 19:09:51 +01:00
James Turner
c7152af191 Further tweaks to only consider IP4 addresses for the moment, when using getaddrinfo. 2011-08-26 11:27:50 +01:00
James Turner
2f9ba31b0a Request only IP4 addresses for the moment, further work required to deal with IP6 addresses. 2011-08-26 09:36:59 +01:00
Stuart Buchanan
ef48baafcc Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-08-25 22:01:07 +01:00
Christian Schmitt
1227bd4898 Don't make CMake install HLA libs and headers in every case.
Only install them when RTI is enabled. The autotools build system
handles this equally.
2011-08-25 14:03:52 +02:00
Torsten Dreyer
09e610b900 Implement #327 Add condition checking the range of a value
New feature for <condition> elements:
An (optional) element <precision> allows for fuzzy equals checks
example:
<condition>
  <equals>
    <property>/foo</property>
    <value type="double">0.0</value>
    <precision>0.1</precision>
  </equals>
</condition>

This condition evaluates as true if /foo is within [-0.05..0.05]
(both inclusive)
The precision tag works for int, long, float and double propeties.
It has no meaning for bool properties. For string properties,
precision sets the length of the strings to compare.
2011-08-24 21:26:02 +02:00
Christian Schmitt
b317520543 Make RTI configurable 2011-08-24 13:25:46 +02:00
Christian Schmitt
25c3881782 fix some of the CMake syntax and correctly print the headless option 2011-08-24 13:23:46 +02:00
James Turner
27e8916843 Another Windows typo-fix. 2011-08-24 11:29:09 +01:00
James Turner
fa27207351 Include ws2tcpip.h header (for getaddrinfo) on Windows 2011-08-24 11:25:37 +01:00
James Turner
3753d50992 Fix a release build issue, meaning of IDLE state was overloaded, add an explicit state when we're waiting for the response start. 2011-08-24 02:30:27 -07:00
James Turner
b7654c181d Copy constructor and assignment operator for revised IPAddress 2011-08-24 02:30:02 -07:00
James Turner
50e226a146 Change IPAddress to use getaddrinfo internally, and store the sockaddr data via a pointer 2011-08-24 09:46:20 +01:00
Stuart Buchanan
991f28906e Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-08-22 21:15:58 +01:00
James Turner
f18a9493b3 Revert "Support non-blocking address lookups, and switch to getaddrinfo over gethostbyname. (Only affects netChannel - raw socket will use blocking behaviour by default, as previously)"
This reverts commit 878b504f8e.
2011-08-22 10:15:05 +01:00
James Turner
bca9a787f6 Revert "Keep automake working, added new files"
This reverts commit a175033e3b.
2011-08-22 10:15:00 +01:00
James Turner
9699d76dcb Revert "Ick, further fixes for Linux/MSVC"
This reverts commit 5f07efa12a.
2011-08-22 10:14:55 +01:00
James Turner
5f07efa12a Ick, further fixes for Linux/MSVC 2011-08-22 09:10:38 +01:00
James Turner
a175033e3b Keep automake working, added new files 2011-08-21 22:37:01 +01:00
James Turner
878b504f8e Support non-blocking address lookups, and switch to getaddrinfo over gethostbyname. (Only affects netChannel - raw socket will use blocking behaviour by default, as previously) 2011-08-21 22:30:04 +01:00
Torsten Dreyer
669ab640da Remove (last) reference to obsolete visual_enviro.hxx 2011-08-21 21:13:38 +02:00
Stuart Buchanan
2f381c22e3 Further enhancements/bug fixes to the 3D clouds:
1) Default values for [min|max]_[cloud|sprite]_[width|height] changed to be
   more logical.

2) Cloud bounding box expanded slightly to ensure they aren't over-culled

3) Cloud location now defines the _base_ of the cloud.

4) Sprites that would extend below the bottom of the cloud are now shifted
   upwards to ensure no cloud appears below the base.
2011-08-21 19:18:24 +01:00
ThorstenB
ee06c12374 Fix sg_dir dot-file handling
File dialogs never showed ".." directories for navigation, since these were
filtered by the "INCLUDE_HIDDEN" option. Only the "NO_DOT_OR_DOTDOT"
option should be used for filtering - otherwise it's impossible to show
the "."/".." directories while all other files are still hidden.
2011-08-21 14:31:08 +02:00
Torsten Dreyer
225c2803ac remove reference to obsolete visual_enviro.hxx 2011-08-20 08:51:39 +02:00
Curtis L. Olson
1e0bd6717e Add visual_enviro.hxx to the source distribution (why isn't visual_enviro.cxx
built here?)
2011-08-15 22:45:44 -05:00
Curtis L. Olson
33c84965ad Make sure hla tree is added to source distribution. 2011-08-15 22:05:18 -05:00
ThorstenB
a668e47fa1 Introduce some more logging classes.
The current habit of almost everything being in either SG_GENERAL or
SG_ALL really sucks :).
2011-08-11 23:45:19 +02:00
Curtis L. Olson
c95d76266a Fix "make dist" 2011-08-11 09:47:07 -05:00
James Turner
902948e3c6 Tweaks to queuing of HTTP/1.0 connections, and tests for sequential connections in both 1.0 and 1.1 modes. 2011-08-08 18:09:30 +01:00
Stuart Buchanan
2805a2d0cc Add support for "squashing" the billboarding of individual 3D cloud sprites, to allow thin layers of stratus to be generated by large textures. 2011-08-07 12:56:10 +01:00
Stuart Buchanan
410c5ae919 Add control of 3D cloud field wrapping. Base code was already present, but without accessor methods. 2011-08-07 11:41:25 +01:00
James Turner
7525fd5e3e Update HTTP code to support HTTP/1.0 responses, eg metarproxy 2011-08-07 10:49:13 +01:00
Frederic Bouvier
55208d7d1f Remove obsolete files 2011-08-06 16:41:02 +02:00
Frederic Bouvier
88e2cdd283 Fix issue #392: mktime takes a localtime as input. Assumption that if HAVE_DAYLIGHT is missing imply that mktime takes a gmt time is wrong (sg_time.cxx, line 482) 2011-08-06 16:26:21 +02:00
Frederic Bouvier
6ac69b604e Fix a typo 2011-08-06 15:58:31 +02:00
James Turner
76ba747706 Whoops, fix tests for user-agent being HTTP/1.1 spec 2011-08-04 19:37:30 +01:00
ThorstenB
469c0242d4 Improved CMake support for libsvn
Added missing CMake defines for SVN_CLIENT.
Don't detect libsvn without APR.
When installed, enable libsvn support by default (same as for automake).
When enabled, provide libsvn include dir to libtsync.
gitignore temporary CMake files
2011-08-04 19:28:13 +02:00
James Turner
115531e944 Further HTTP improvements, correct proxy support, spec compliance, support for chunked encoding. 2011-08-04 18:03:56 +01:00
ThorstenB
6edfacbf4e Ove Kåven: Fix property refcounting for particles 2011-08-01 19:47:19 +02:00
James Turner
a2249becba Further HTTP improvements, wget-alike test program to check it all behaves! 2011-08-01 09:03:12 +01:00
ThorstenB
b53c53d9d8 #232: resurrect the "point sprites for runway lights" switch
Automatic GL/OSG feature detection still not working, since we don't have
a "context" - but at least the manual switch works (on start-up only).
2011-07-31 14:00:48 +02:00
James Turner
13736219ff Ooops, forgot automake 2011-07-30 12:41:54 +01:00
James Turner
3ac5ff0cac Clean header dependencies of condition.hxx - introduce a new header, propsfwd.hxx, for common case of headers that only need SGPropertyNode_ptr and SGCondition_ptr 2011-07-30 10:48:37 +01:00
James Turner
19119cc4ae Tweaks to HTTP code, in preparation for using it for metar - especially, test code for proxies 2011-07-30 10:43:49 +01:00
Stuart Buchanan
38ac7b41ad Updates to random forest:
- Bug fix - use multiple textures per tile
- Graduate LoD so tree cover fades in/out.
2011-07-29 15:22:24 +01:00
Stuart Buchanan
b47d1ad5fd Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-07-26 22:17:14 +01:00
Torsten Dreyer
45f642c4e4 Don't rely on simgear/version.h
version.h is generated by the build system for official builds of
FlightGear. To avoid complicating the life of regular developers,
especially on Windows, we set HAVE_VERSION_H if version.h is generated.
If that define is not set, we include this file instead, which provides
placeholder values instead.
2011-07-25 20:22:57 +02:00
Stuart Buchanan
04dc28cb33 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-07-21 18:45:13 +01:00
Mathias Froehlich
f7e9d79322 Make it compile with gcc-4.6 2011-07-19 19:23:53 +02:00
James Turner
5c6076d72d Merge branch 'next' of gitorious.org:fg/simgear into next 2011-07-19 17:56:04 +01:00
James Turner
ee1901225b Ooof, lurking PLIB reference in the tests 2011-07-19 17:55:40 +01:00
Mathias Froehlich
b61ba449fb Fix case of SGGeometryTest.cxx 2011-07-19 18:54:02 +02:00
James Turner
d53e2fa8c1 Enable more unit-tests via CTest 2011-07-19 17:30:08 +01:00
James Turner
20ac2dcd04 Remove some debug output, fix version.h include path 2011-07-19 14:34:07 +01:00
James Turner
ac7db26f17 But of course, Mac lacks malloc.h - so you cstdlib instead. <sigh> 2011-07-19 06:17:05 -07:00
James Turner
4a65a23706 test linkage needs librt on Linux. Need to tidy this up on the FG side. 2011-07-19 13:53:13 +01:00
James Turner
425d83c497 Fix Linux compilation of netChat - explicit include of malloc.h required. 2011-07-19 05:32:39 -07:00
James Turner
a7d338a58e And not forgetting VC90 either. 2011-07-19 13:10:01 +01:00
James Turner
6a612972e2 Not forgetting automake for the moment 2011-07-19 12:56:49 +01:00
James Turner
f06f25532c Tiny HTTP client layer on top of NetChat - and CTest support for some SimGear tests. 2011-07-19 12:55:55 +01:00
ThorstenB
116c487384 Fix locale setting for Windows 2011-07-18 20:29:11 +02:00
ThorstenB
5f70abb16d Clean solution for locale problem.
Changing and reverting the locale isn't thread-safe. Instead, setup the
environment to ensure the active locale sticks to default "C" locale at
any time.
2011-07-18 20:15:50 +02:00
Stuart Buchanan
c17110f6e7 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2011-07-18 19:11:25 +01:00
Torsten Dreyer
69cbc2feb5 Bump to version 2.5.0 2011-07-17 11:06:45 +02:00
Torsten Dreyer
feb0b83365 Bump version to 2.4.0 2011-07-17 10:46:56 +02:00
Stuart Buchanan
03796f2337 Merge branches 'next' and 'next' of git://gitorious.org/fg/simgear into next 2011-07-03 19:03:06 +01:00
ThorstenB
d4f5a35e87 Alert message formatting.
Avoid log output cluttering due to "missing animation objects".
2011-07-03 13:04:00 +02:00
Torsten Dreyer
da707f3e40 terrasync: some code cleanup - don't use snprintf 2011-06-28 13:16:08 +02:00
ThorstenB
59a6fd1ed8 #348: (continued) Missing sound files not reported properly
Avoid useless "File '' not found." messages for missing sound files.
2011-06-26 01:06:07 +02:00
ThorstenB
8c8d9e5cc4 #348: Missing model/texture files not reported properly
Whenever resolving a (relative) path to an absolute path with
'findDataFile', check if the result is empty and report original
(relative) path as missing. Otherwise no or a meaningless message is
issued ("File '' not found.").
2011-06-26 00:36:19 +02:00
Torsten Dreyer
d36170879c Terrasync: make whitespace in pathnames work under windows 2011-06-25 00:04:44 +02:00
ThorstenB
204e483c08 Disable support of white-space path for Windows
Apparently enclosing white-space paths using '"' doesn't work on Windows.
2011-06-23 17:20:06 +02:00
ThorstenB
f582eb5310 Improve upate interval after failed updates. 2011-06-23 17:20:06 +02:00
Torsten Dreyer
6f9a14d6c4 Fix bug #346: httpd broken
Fix bug introduced by myself in
commit b06e38699a
2011-06-22 22:40:23 +02:00
ThorstenB
76fcad0a0b Bad boundary check. Add missing parentheses. 2011-06-22 09:16:27 +02:00
ThorstenB
cc06799838 fix #353: svn doesn't like stray path separators 2011-06-20 22:46:46 +02:00
ThorstenB
8a26c382a2 Improve error handling and avoid refresh nuisances.
Ignore errors due to missing (ocean-)scenery data on SVN server.
For now, only refresh scenery tiles when ocean is replaced by actual
scenery data after download.
2011-06-20 22:10:07 +02:00
ThorstenB
22198d8bd2 Improve external SVN support.
Support white-space paths when calling external SVN utility.
Support optional configuration of absolute path to SVN utility.
2011-06-20 22:05:37 +02:00
Frederic Bouvier
d534dcadfb Compile built-in svn in MSVC if 32-bit target is selected 2011-06-15 08:13:37 +02:00
ThorstenB
708ae35068 Melchior FRANZ: fix SGPropertyNode::LAST_USED_ATTRIBUTE
fixes commit c782a32076,
(also see 38494a48d8 :) )
2011-06-14 21:49:42 +02:00
ThorstenB
50cea4f64e Csaba Halasz: fix SGTimerQueue so tasks can remove themselves properly
fixes commit c033979130
2011-06-13 14:13:48 +02:00
ThorstenB
c782a32076 Introduce "PRESERVE" flag to protect properties on sim reset.
Some specific properties need protection and shouldn't be restored to their
original values on sim-reset.
2011-06-12 20:32:13 +02:00
ThorstenB
edc877442f Add optional attribute condition to "copyProperties".
Option to only copy properties with specific attribute values.
Default is copy all (as before).
2011-06-12 13:41:38 +02:00
ThorstenB
a1fe0f6305 Make some properties read-only to avoid sim-reset issues.
Do not loose internal statistics/state on sim-reset
2011-06-12 13:31:23 +02:00
ThorstenB
cb5aee9fa4 Add missing CMake module for built-in svn-client support.
Thanks to Martin for spotting this.
2011-06-12 10:08:16 +02:00
ThorstenB
9b18b14f11 Added missing terrsync make+header files... 2011-06-11 23:58:00 +02:00
ThorstenB
0fd7bb8d3f Convert terrasync into a subsystem.
Fixed scenery tile refresh method.
Simgear automake makefiles with libsvn detection.
Simgear CMake support for libsvn (may not work :) )
2011-06-11 23:22:26 +02:00
ThorstenB
c836018ac7 Copied original terrasync sources 2011-06-11 22:55:57 +02:00
ThorstenB
ba678eabdc Add method to reload specific scenery tiles. 2011-06-09 22:24:08 +02:00
ThorstenB
9442d3d0f3 Added guarded blocking deque class.
So, what are we going to do with it... ;-)
2011-06-08 23:39:24 +02:00
Mathias Froehlich
9f0313dd0b Do not crash on exporting some EffectGeodes. 2011-06-08 13:42:30 +02:00
ThorstenB
3d109f9c4c fix #314: Nasal not working on i386/32bit systems with gcc>=4.5.x
Change magic Nasal reftag to encode a quiet NaN (qNaN) instead of a
signaling NaN (sNaN), since sNaNs cannot pass cleanly through an FPU
(an sNaN is always converted to a qNaN, even by simple FPU load/store
instructions). gcc 4.5.x uses float load/store operations more
aggressively to move our 64bit Nasal variables (naRef) around.

Signed-off-by: Andy Ross
2011-06-02 10:05:10 +02:00
Torsten Dreyer
f8a337fb9f gcc warning fix: remove unused variable 2011-05-31 15:53:25 +02:00
ThorstenB
3c0966279c fixed #260: Scale animation also scales color
Added missing normalization. Thanks to Lauri for analysing this.
2011-05-29 18:40:19 +02:00
ThorstenB
c033979130 screen shot fixes (issue #127 related)
Provide proper return status when screen grabbing.
Allow tasks to remove themselves (return task entries to the queue _before_
executig them)
2011-05-28 23:09:06 +02:00
Torsten Dreyer
c828961327 Merge branch 'next' of gitorious.org:fg/simgear into next 2011-05-28 10:20:03 +02:00
Torsten Dreyer
83a95a0488 (Re)fix bug #285, textranslate broken
Due to fingertrouble, I removed the check for _step == 0 which
this patch re-adds.

Also, make this function look more like a template by not using
0.0 - constants.
2011-05-28 10:17:19 +02:00
ThorstenB
f3c131ffaf Minor compiler version detection issue.
Well, almost prepared for gcc 5.0 now ;-).
2011-05-27 22:30:43 +02:00
Torsten Dreyer
b06e38699a Make multicast sockets work under windows
msdn article 737550 states that "the preferred method is to call the
bind function to associate a socket with a local IP address and then
join the multicast group. Although this order of operations is not
mandatory, it is strongly recommended".
Since binding to the multicast address seems to fail, let's try binding
to INADDR_ANY and joint thereafter.
2011-05-27 21:06:06 +02:00
Torsten Dreyer
3a07e2fe21 ignore cmake generated files 2011-05-25 19:21:08 +02:00
Torsten Dreyer
ca668f8a37 Fix bug #285 textranslate and scroll animation with negative numbers
rewrite SGStepExpression::apply_mods so it creates the same step
for negative numbers as it does for positive numbers.
2011-05-25 19:14:09 +02:00
James Turner
5181aecc7b Port version-defined-in-a-file logic over from fg. 2011-05-21 14:56:10 +01:00
James Turner
0e92cfbd0d Bump Simgear version to 2.3.0 - should have been done after 2.2.0 was branched, oops. Will refactor this lot to use a single 'version' file like FG, soon. 2011-05-21 14:12:31 +01:00
Stuart Buchanan
60c7507a33 Fix 3D cloud elevation 2011-05-14 21:13:05 +01:00
ThorstenB
c7c3fae5c2 Also remove visual_enviro.cxx from the VC90 build. 2011-05-07 19:40:01 +02:00
Mathias Froehlich
4acbb2a312 Also remove visual_enviro.cxx from the cmake build system. 2011-05-07 18:32:44 +02:00
Torsten Dreyer
4e6159aa07 Remove unused class SGEnviro
This class and their source files visual_enviro.[h|c]xx were
unused since OSG transition. It's only functionality was to
keep a variable for the enable-state of rendering of precipitation.
This has now been moved to SGPrecipitation.
2011-05-06 14:10:04 +02:00
Torsten Dreyer
6a1d05646c fix typo 2011-05-06 13:07:21 +02:00
Curtis L. Olson
2e05043f43 Fix a crash on exit. The SGEnviro destructor was attempting to delete an
object that had already been deleted by the sound manager.  Since SGEnviro
doesn't own this object, I removed the delete from it's destructor.
2011-05-03 13:24:57 -05:00
Frederic Bouvier
1b8216e911 Consistency fix - remove a warning under MSVC 2011-04-26 20:42:42 +02:00
Frederic Bouvier
a2121b86df Compile under MSVC 2011-04-26 19:45:40 +02:00
Torsten Dreyer
1cd17e9edd Improvements to the global 3D clouds system
Stuart Buchanan:
Improvements to the global 3D clouds system
- clouds now move with the wind
- bug causing cloud coverage to be less than it should have been fixed
- support for adding 3D clouds with an fg_command.

(https://gitorious.org/fg/flightgear/merge_requests/1554)
2011-04-23 20:56:28 +02:00
Erik Hofman
5229f5a13c Lauri Peltonen's patch to increase the number of rings and bands of the sky dome 2011-04-16 11:32:34 +02:00
Torsten Dreyer
4ff014d275 Add multicast support for sockets 2011-04-13 18:43:28 +02:00
ThorstenB
83243f471a Enable OSG cache (default) and option to disable.
(also requires flightgear update)
2011-04-03 18:56:09 +02:00
ThorstenB
3c0c51a946 Minor event manager clean-up/simplification.
(Mainly disliked the "delete this;" concept :) ).
2011-04-03 18:22:39 +02:00
ThorstenB
08ad449774 Improve subsystem manager's timing statistics
Option to print statistics at run-time.
Convenient filter parameters to show subsystems with jitter or excessive
execution time only.
2011-03-23 23:12:13 +01:00
ThorstenB
eae1b99036 Keep PropertyList outside global namespace
Avoids conflict with FG's GUI widget "PropertyList"...
(don't use "using..." in header files since namespaces become useless then)
2011-03-23 22:30:42 +01:00
ThorstenB
44f27b23d0 Avoid some memory leaks in derived classes due to non-virtual destructors. 2011-03-19 14:50:18 +01:00
ThorstenB
92c83bc280 Avoid nuisance sounds in initial update loop.
Stop all "in-transit" sounds effects from triggering in the first update
loop when their initial property value is "1".
2011-03-19 14:48:58 +01:00
ThorstenB
10bbd435b7 Catch dangling property ties.
It's bad when tied properties are not untied before removing the tied property list.
We could try to "untie" the properties in the destructor - but that usually
caused weird mem access errors, since the tied properties will access
a no longer existing object (the very object whose destruction called the
TiedPropertyList destructor...). => so just add a warning and a nagging trap :)
2011-03-07 19:32:20 +01:00
ThorstenB
2ef8672a6b Change cloudfield::addCloud interface,
so it's more obvious that "addCloud" won't keep a reference to SGNewCloud.
2011-03-07 19:26:37 +01:00
ThorstenB
a22dd264cd Replace occurrences of osgDB::findDataFile with SGModelLib wrapper
which considers separate aircraft dirs (--fg-aircraft).
2011-03-06 22:38:44 +01:00
ThorstenB
baf5116841 Merge remote branch 'origin/releases/2.2.0' into next 2011-03-04 22:52:21 +01:00
ThorstenB
e55017bbfc Fix TextureBuilder to work with --fg-aircraft dirs.
Avoid direct use of osgDB to search for files. Using SGModelLib
instead to also search fg-aircraft dirs.
2011-03-04 22:50:32 +01:00
Csaba Halasz
19636bda4e Add missing META_Object to SGReaderWriterXMLOptions (needed for proper cloning) 2011-03-01 20:57:09 +01:00
Torsten Dreyer
83124e0c05 Don't depend on props.hxx
There is no reference to anything defined in props.hxx, so remove
the dependency here.
2011-02-27 20:35:44 +01:00
Torsten Dreyer
a079870bca Add strutils::starts_with and strutils::ends_with 2011-02-20 15:29:06 +01:00
ThorstenB
ce71b8c1cf Merge remote branch 'origin/releases/2.2.0' into next 2011-02-19 11:59:10 +01:00
ThorstenB
7b0c25f91e #83: John Denker: Set correct file modes
Sources shouldn't be executable.
2011-02-19 11:54:10 +01:00
Tim Moore
feab25d0be Merge branch 'releases/2.2.0' into next 2011-02-17 11:40:47 +01:00
Tim Moore
956b4406d0 fix SGPagedLOD change for 2.8.3
One more try...
2011-02-17 11:39:52 +01:00
Tim Moore
3a0fbae4d9 Merge branch 'releases/2.2.0' into next 2011-02-16 16:54:35 +01:00
Tim Moore
f106dc2a29 don't assume that OSG 2.8.3 has PagedLOD options
I was confused by my git svn import of the OSG tree.
2011-02-16 16:47:33 +01:00
Tim Moore
252a539e69 Merge branch 'releases/2.2.0' into next
Conflicts:
	simgear/scene/model/SGPagedLOD.cxx
2011-02-15 12:52:03 +01:00
Tim Moore
df6badfdd5 accomodate changes to osgDB::DatabasePager interface
The change was introduced in OSG SVN revision 12080. Note: that
revision has a bug that causes fgfs to crash. The bug is fixed in
revision 12170.
2011-02-15 12:41:23 +01:00
Torsten Dreyer
7479ae521c Provide easy Tie() for indexed properties 2011-02-14 20:24:41 +01:00
ThorstenB
416fb94ae8 Clear tile cache on (re-)init.
Clearing the cache was disabled to avoid scenery reloading on sim resets,
which is now avoided elsewhere (in FG).
Cache cleaning is now needed to support new option for complete scenery
reloading.
2011-02-13 19:23:21 +01:00
Torsten Dreyer
3a620fe55d Fix initial value for tied read-only properties 2011-02-12 14:46:58 +01:00
ThorstenB
5208750cdb Ivan Ngeow: Fixed compile for FreeBSD platforms. 2011-02-11 18:50:20 +01:00
ThorstenB
c684f8f043 Ivan Ngeow: Fixed compile for FreeBSD platforms. 2011-02-11 18:49:01 +01:00
ThorstenB
73084863b7 Temporary warning when compiling against OSG 2.9.11.
Current OSG development isn't supported by FG yet, so add a
warning for now...
2011-02-06 20:34:52 +01:00
Torsten Dreyer
503310cdb8 Darn! Typo in vc90 project file 2011-02-06 16:37:48 +01:00
Torsten Dreyer
bda8d34c2b Use tiedpropertylist.hxx in cmake and vc90 2011-02-06 16:35:15 +01:00
Torsten Dreyer
2ee87483f9 Move TiedPropertyList from flightgear to simgear 2011-02-06 15:05:50 +01:00
ThorstenB
9e04bf1ece Temporary warning when compiling against OSG 2.9.11.
Current OSG development isn't supported by FG yet, so add a
warning for now...
2011-02-06 10:04:55 +01:00
Frederic Bouvier
29c8c9f989 Fix cppcheck performance warning : Prefer prefix ++/-- operators for non-primitive types. 2011-01-30 21:22:06 +01:00
Frederic Bouvier
1035e714ff Deprecate VS2010 handmade project files now that we have Cmake 2011-01-28 19:03:38 +01:00
Frederic Bouvier
57fa022c9f Cmake: fix non MSVC build 2011-01-28 14:51:15 +01:00
Frederic Bouvier
76c3f7bc8f Cmake: support VS2010 and MSVC 64 bit 2011-01-28 14:46:05 +01:00
Torsten Dreyer
6d2646239e Fix wrong difference calculation in SGExpression 2011-01-25 23:01:14 +01:00
Torsten Dreyer
c955e61ba7 Fix wrong difference calculation in SGExpression 2011-01-25 22:58:50 +01:00
Frederic Bouvier
c31a5279af Cmake: restore its original name to the ephemeris library 2011-01-23 21:05:37 +01:00
ThorstenB
840780dc4a Another place to catch SG exceptions.
SGBinding::fire needs to catch, otherwise exceptions in the event handler
context cause an FG exit (fixes a crash with the route manager dialog).
2011-01-20 19:39:33 +01:00
ThorstenB
02b3c37b9f Another place to catch SG exceptions.
SGBinding::fire needs to catch, otherwise exceptions in the event handler
context cause an FG exit (fixes a crash with the route manager dialog).
2011-01-20 01:06:46 +01:00
Mathias Froehlich
d14fe813a9 Add the hla directory to the cmake build system. 2011-01-17 21:34:00 +01:00
Mathias Froehlich
44ff23b227 Add an initial implementation of a rti/hla dispatcher. 2011-01-17 21:33:45 +01:00
Mathias Froehlich
257459abc6 Add the new hla directory to the build system. 2011-01-17 21:33:33 +01:00
Torsten Dreyer
e988dc0e42 Fix bug in SGMisc<T>:: normalizePeriodic()
SGMisc<T>::normalizePeriodic(min,max,value) returned zero for
all values less than min.
Example:
A call of normalizePeriodic(0,twopi(),-pi()) returned zero
where the correct value would be 3*pi().
2011-01-17 19:51:29 +01:00
James Turner
7d544dee47 Olaf Flebbe: Decrease required OSG version. 2011-01-13 22:14:37 +00:00
Frederic Bouvier
1670f88e54 MSVC fix: deambiguiate function calls 2011-01-08 14:55:22 +01:00
Torsten Dreyer
58c7edfed6 SGExpression bugfix: allow <sin> within <product> 2011-01-08 13:06:25 +01:00
Torsten Dreyer
122d7f681f Add <expression> to animations
Allow complex animation expressions

Example: translate along the y-axis following a sin
function.
<animation>
  <type>translate</type>
  <axis>
    <y>1</y>
  </axis>
  <expression>
    <sin>
      <product>
        <property>/some/position-norm</property>
        <value>6.28</value>
      </product>
    </sin>
  </expression>
</animation>
2011-01-07 22:43:46 +01:00
Frederic Bouvier
acec1ba4bf Remove the dependency to boost serialization 2011-01-05 09:54:50 +01:00
Curtis L. Olson
0040757cd3 Merge branch 'next' of gitorious.org:fg/simgear into next 2011-01-03 07:55:45 -06:00
Curtis L. Olson
49d554e9d8 Update simgear version number to keep pace with FlightGear. 2011-01-03 07:54:31 -06:00
James Turner
fa3389ed23 Better MSVC Boost serialization fix from Olaf 2011-01-03 09:48:31 +00:00
Frederic Bouvier
188a84a893 Cmake: use build postfix 2011-01-02 19:44:04 +01:00
Frederic Bouvier
ceff1622c1 Cmake: Right way to search for include files 2011-01-02 18:45:14 +01:00
Frederic Bouvier
8d15cacf92 Cmake: MSVC_3RDPARTY_DIR is a path, not an option 2011-01-02 18:01:57 +01:00
James Turner
80161bfa96 Cmake: 3RDPARTY_DIR fixes from Olaf Flebbe 2011-01-01 21:06:43 +00:00
Torsten Dreyer
c32ab1b84f handle NCD (nil clouds detected) in METAR 2010-12-31 13:31:09 +01:00
Tim Moore
73c0ce628b Merge remote branch 'gitorious/next' into next 2010-12-29 18:12:56 +01:00
Tim Moore
dc68397e48 cmake improvements for shared library build 2010-12-29 18:12:44 +01:00
Tim Moore
c934b47f2e Issue 110: fix pick animation interaction with effects
Set OVERRIDE and PROTECTED attributes on pick animation state
attributes. Set up attributes and add a colorMode uniform so that the
default shader will take color and alpha values from the
material. Also, add a DotOsg writer method for ConditionNode.
2010-12-29 18:09:23 +01:00
James Turner
07d3d6508a Uninstall support, pinched from OSG. 2010-12-28 13:38:05 +00:00
James Turner
e4a8896fdc MSVC improvements from Olaf Flebbe. 2010-12-28 13:32:54 +00:00
Tim Moore
33e1a9457a set data variance to DYNAMIC for animated effect attributes 2010-12-26 18:34:00 +01:00
James Turner
b6a20fd6e4 64-bit compatability tweak from papillion 2010-12-20 14:46:53 +00:00
James Turner
ae9757bf43 Create version.h during SimGear CMake build 2010-12-19 19:08:14 +00:00
James Turner
b9a34b1b05 Initial work on CMake support for SimGear. 2010-12-19 14:16:39 +00:00
Erik Hofman
c33f66b691 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-12-13 18:40:39 +01:00
Erik Hofman
cf8d6c2621 Remove unused files 2010-12-13 18:40:08 +01:00
Torsten Dreyer
6c789f7165 metar: add string constants for cloud coverages 2010-12-12 22:18:10 +01:00
Erik Hofman
7d77eff4f4 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-12-12 20:23:08 +01:00
Erik Hofman
f83278bd61 Update the bad-doppler test and simplify it to only test for bad platforms. 2010-12-12 14:07:44 +01:00
Csaba Halasz
9a96018cc2 Compilation fix: add missing #include to SGPagedLod.cxx, needed by OSG 2.9.11 2010-12-12 00:23:06 +01:00
Torsten Dreyer
ab3612517f Make the max. opacity of a 2d cloud settable 2010-12-09 09:06:40 +01:00
Torsten Dreyer
0909722bb5 Metar: symbolic cloudnames and phenomena exposure
- use symbolic names for scattered, broken, overcast, etc. cloud
coverages.
- better approach to expose weather phenomena to the interface
2010-12-04 12:02:38 +01:00
Torsten Dreyer
1cb8f9237c Expose weather phenomena to the SGMetar interface 2010-11-27 21:04:04 +01:00
Anders Gidenstam
4cac366468 simgear/scene/sky/sky.cxx: Include sg_inlines.h with simgear/ prefix as all other simgear includes. 2010-11-26 21:49:30 +01:00
Torsten Dreyer
a6138b3445 Make visibility within cloudlayers settable 2010-11-26 19:24:44 +01:00
Frederic Bouvier
093e4614d3 Update VS2010 projects 2010-11-20 21:42:10 +01:00
Frederic Bouvier
82efb8a784 Update VS2010 projects 2010-11-20 14:23:20 +01:00
Frederic Bouvier
be720709fe Compile PropertyObject under Windows 2010-11-20 14:20:35 +01:00
James Turner
325b13b101 Build propertyObject on MSVC2008 2010-11-20 13:08:01 +00:00
James Turner
203d1c2b45 PropertyObject ::create tests. 2010-11-20 04:25:11 -08:00
James Turner
c3c97f2956 Shrink PropertyObjectBase by a pointer, don't pull exception header into the header. 2010-11-20 03:31:42 -08:00
James Turner
ac535de2fa PropertyObject enhancements, unit-test for make check 2010-11-20 02:49:04 -08:00
Torsten Dreyer
9d4f0f5824 A sum without diff is like foo without bar
Add a <difference> aka <diff> to SGExpression to compute
differences
2010-11-20 11:05:45 +01:00
ThorstenB
b4f5eaa541 Current timestamps for forced scenery loading.
Priorities during forced model loads won't work unless using current framestamps...
2010-11-19 13:39:20 +01:00
ThorstenB
66cdbf6215 Fixed invalid character in source file.
Removed illegal character (0xc). How did this happen???
2010-11-19 13:36:50 +01:00
ThorstenB
c9e0bfb7fe Improved tile cache priority scheme.
Use priorities for loading/unloading.
Maintain an expiry time for each tile.
Replaced "cache lock" by "current view" flag.
2010-11-19 13:33:12 +01:00
James Turner
6da8ef83af Merge branch 'topics/propobj' into next 2010-11-18 20:23:40 +00:00
James Turner
f53559b8d0 Initial propertyObject work. 2010-11-18 20:21:37 +00:00
Torsten Dreyer
49f038b9d1 Purge some gcc and MSVC warnings 2010-11-18 12:08:16 +01:00
Tim Moore
ce67657e0a eliminate property node path cache
The property path cache was making very little difference in practice
and made the eventual goal of having the property tree be thread safe
for readers more difficult to attain.
2010-11-17 11:25:07 +01:00
James Turner
56c520f455 Tighten up name filters on Unix. Fixes bug 168. 2010-11-15 23:23:40 +00:00
ThorstenB
9f88b077ee remove old .cvsignore files
Hello GIT!
2010-11-14 15:09:36 +01:00
Curtis L. Olson
50315a7346 Fix setsockopt() to match previous precident of setsockopt() usage (as seen
later in the setBroadcast() function.)
2010-11-12 15:52:33 -06:00
Frederic Bouvier
6b58afe823 Fix setsockopt call 2010-11-12 22:03:11 +01:00
Curtis L. Olson
167cba9e93 Patch to avoid the problem of the socket resource not yet being available
if the program is restarted quickly after being killed.

Reference: http://www.unixguide.net/network/socketfaq/4.5.shtml
2010-11-12 13:19:57 -06:00
Frederic Bouvier
ce89a410d2 Update VS2010 projects : use Boost 1.44.0 2010-11-07 20:01:18 +01:00
Frederic Bouvier
98d0f33f8f Don't crash on exit 2010-11-07 10:31:13 +01:00
Frederic Bouvier
c305341ef4 Update VS2008 projects : use Boost 1.44.0 available in last 3rd Party archive 2010-11-06 17:02:16 +01:00
ThorstenB
0607a67a92 Fixed METAR. Make loader fully HTTP compliant.
HTTP protocol requires a "Host:" line.
The old noaa server didn't mind. Now it does...
2010-11-05 20:07:50 +01:00
James Turner
5f2f95676c Formal shutdown interface on SGSubsystem. 2010-11-05 09:19:22 +00:00
Frederic Bouvier
4bf16243fc Update Vs2010 projects 2010-11-04 22:20:08 +01:00
James Turner
607738f22e Fix ConditionNode Win32 compilation. 2010-11-04 18:54:18 +00:00
James Turner
200df49d6e Make subsystem group destruction explicit, so get_subsystem calls during destruction are safe. 2010-11-04 18:49:24 +00:00
Tim Moore
580a1b7fc2 Add ConditionNode files to VC90 project 2010-11-04 15:04:03 +01:00
Tim Moore
3372f9fc0d add SGMath.hxx header file to ConditionNode.cxx
Apparently necessary for MSVC 2008.
2010-11-04 11:04:13 +01:00
Tim Moore
4787ac64ff issue 165: fix material animation condition problem
The evaluation of the condition is moved to a ConditionNode and
separated from the animation of values via properties. Previously the
conditional application of static values was broken.
2010-11-04 10:06:13 +01:00
Tim Moore
fef625ce27 add ConditionNode scenegraph node
This class directs its scenegraph traversal by evaluating a condition
and doesn't rely on an update callback.
2010-11-04 07:01:38 +01:00
ThorstenB
0b53dd8fa7 Show compiler warnings by default. 2010-10-30 20:53:19 +02:00
James Turner
fe628e44e1 Add platform defines to SimGear, and a replacement for ulSleep functions. 2010-10-30 19:18:57 +01:00
Frederic Bouvier
d314b6a552 Fix line endings 2010-10-29 19:47:44 +02:00
Frederic Bouvier
02462d1752 Quick hack to remote trailing / on Windows. Feel free to replace by something more elegant 2010-10-29 09:30:59 +02:00
ThorstenB
5b734d8c52 Merge branch 'integration' into next 2010-10-28 19:39:55 +02:00
James Turner
81d640ed7c Fix build when OSG implict-ref-ptr conversion is disabled. 2010-10-26 10:09:55 +01:00
Frederic Bouvier
7e2ad05fae Add mipmap.* to the unix build system 2010-10-25 21:59:55 +02:00
Frederic Bouvier
bda5890f17 Add a function to debug mipmaps 2010-10-25 21:51:27 +02:00
Frederic Bouvier
c7dd293e01 Update Vs2010 projects 2010-10-24 09:30:16 +02:00
Frederic Bouvier
fbf0a20f38 Unix line endings 2010-10-24 09:25:42 +02:00
Frederic Bouvier
87ccfbab02 Restore commit 48c6d3d89a by Torsten Dreyer: Provide a little more descriptive error message if TextureBuilder fails 2010-10-24 09:25:41 +02:00
Frederic Bouvier
97f39282ef Don't compute mipmap for inexistant image color components 2010-10-24 09:25:40 +02:00
Frederic Bouvier
4fd3d49fc1 Add mipmap control in the effect file 2010-10-24 09:25:40 +02:00
Frederic Bouvier
a70c8a9cae Untabify 2010-10-24 09:25:39 +02:00
Frederic Bouvier
c0926633e8 Update Vs2010 projects 2010-10-24 09:24:13 +02:00
James Turner
1ae91097ba Build fixes for net classes in Simgear. 2010-10-24 01:22:59 +01:00
James Turner
bfd76880a9 Migrate relevant PLIB netXXX classes into SimGear. 2010-10-24 01:12:42 +01:00
ThorstenB
662578dbe7 Buffer size safety.
Do not look for '\n' beyond valid data area.
Obey buffer length (in case a METAR contained a line > 512byte).
2010-10-23 14:47:24 +02:00
Torsten Dreyer
48c6d3d89a Provide a little more descriptive error message if TextureBuilder fails 2010-10-12 16:21:38 +02:00
Frederic Bouvier
7bdb530440 Add project.* to MSVC project files 2010-10-09 08:45:52 +02:00
Tim Moore
bfe953c18d replace glu functions with equivalents from OSG 2010-10-08 23:44:38 +02:00
Torsten Dreyer
136676012f Merge branch 'next' of gitorious.org:fg/simgear into next 2010-10-07 17:43:35 +02:00
Torsten Dreyer
0994ffc195 Don't crash in strutils::trim() with empty strings 2010-10-05 22:39:41 +02:00
Frederic Bouvier
df19feac34 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-10-05 08:32:00 +02:00
Frederic Bouvier
961fa89b7a Use same transformation for generated ocean tiles than for regular tiles. Fix the normal orientation that broke the new water shader 2010-10-05 08:30:52 +02:00
James Turner
ddf9e08069 Make get_subsystem safe during destruction of the manager. 2010-10-03 16:08:34 +01:00
Tim Moore
b5f3978b8a Thorsten Renk's fix for tile manager problems
Locking tiles in cache keeps tiles from mysteriously disappearing.
2010-10-02 23:05:52 +02:00
James Turner
82dc6c32ec Don't crash when a submodel fails to load. 2010-10-02 21:01:29 +01:00
James Turner
889e2d6f06 Add another overload for sg_io_exception ctor. 2010-10-01 12:27:08 +01:00
Torsten Dreyer
9a28642a4e tolerate NDV (no directional validation) in METAR 2010-09-27 19:38:15 +02:00
Torsten Dreyer
0b953462f7 Ivan Ngeow: Fix build on FreeBSD
FreeBSD 8.0-RELEASE, only a very small patch needed
to be applied to simgear/simgear/compiler.h, to add

so that __FreeBSD_version is defined.
2010-09-23 10:27:06 +02:00
Torsten Dreyer
061eb686c6 Fix wrong movement of 2d cloud layers on N/S courses 2010-09-19 10:53:25 +02:00
Frederic Bouvier
937297561f Fix MSVC 100 project files updated by hand 2010-09-12 12:06:57 +02:00
Erik Hofman
bf70d6f087 Set the listener position to it's default value, just like the samples position 2010-09-10 15:02:37 +02:00
Frederic Bouvier
26fdfc42f4 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-09-09 20:06:27 +02:00
Frederic Bouvier
abab8c6ec8 MSVC 10 project update 2010-09-09 20:06:15 +02:00
James Turner
a7697f6095 Second attempt to fixed OpenAL tests. 2010-09-06 14:27:58 +01:00
James Turner
49270e99e5 Fix up tests for revised SGSoundSample ctor. 2010-09-06 12:30:13 +01:00
James Turner
d75ce1e12e Pass current-dir down through XMLSound
(should allow relative paths in sound XML files)
2010-09-06 09:26:46 +01:00
James Turner
289e768ca5 Add ResourceManager, and use to find sound and model paths. 2010-09-06 09:09:58 +01:00
James Turner
44c587400d Validate sound file paths in an XML file. 2010-09-05 14:15:18 +01:00
Torsten Dreyer
df467b9dba Let SGCloudLayer handle coverage strings
This is currently handled in various places in FlightGear.
2010-08-27 18:20:09 +02:00
Frederic Bouvier
510543e14b Add a convenience constructeur to SGPath 2010-08-22 09:33:56 +02:00
Frederic Bouvier
c3133f020d std::string::c_str() is const 2010-08-21 09:02:12 +02:00
James Turner
a7439aa056 Standardise path-handling in XML mode files
aircraft-dir/fg-data paths always work, and
paths relative to the location of the current XML
file always work.
2010-08-17 11:05:55 +01:00
James Turner
d7bea0c4c6 Add isAbsolute/isRelative predicates to SGPath. 2010-08-14 22:51:01 +01:00
James Turner
764a3c29e9 Allow loading of 2.5D panels to be controlled again. 2010-08-14 19:48:52 +01:00
James Turner
3c57572b89 Ralf Gerlich: fix bucket numbering at extreme latitudes
Also document existing algorithms
2010-08-14 10:18:35 +01:00
Tim Moore
fe7c6554f7 support for integer uniforms
Also, share common Uniform objects
2010-08-13 12:54:02 +02:00
Tim Moore
19bb7f5a83 force static models to have effects too 2010-08-13 12:54:02 +02:00
Torsten Dreyer
c0e20ad56b add padding function lpad and rpad to strutils 2010-08-12 13:02:16 +02:00
Torsten Dreyer
49887ff06e Fix the fix that turned a warning into a bug :-( 2010-08-12 12:16:48 +02:00
Torsten Dreyer
1f6555c9ad two warning fixes 2010-08-12 11:42:04 +02:00
Torsten Dreyer
7f8efa7cef use correct parameter types for SGText::UpdateCallback 2010-08-12 11:35:09 +02:00
James Turner
8106956be2 Merge branch 'topics/cmdcatch' into next 2010-08-11 00:20:02 +01:00
James Turner
cc435ba817 Fix Win32 build of SGPath. 2010-08-09 09:13:28 +01:00
James Turner
0c55a4d7bb Catch exceptions raised executing a command. 2010-08-09 09:12:26 +01:00
James Turner
c4b4c0ce59 Make SGPath cache stat() information, cheers Fred
* cache exists/isDir/isFile in SGPath, to avoid
  repeated calls.
2010-08-09 08:19:14 +01:00
James Turner
d31c1df639 More ignore files, for 'make check' binaries 2010-08-08 09:55:31 +01:00
James Turner
780286ea81 Ding, dong, the witch is dead. PLIB is no more, in SimGear. 2010-08-07 18:03:37 +01:00
James Turner
20a75b9c9e Change how certain constants are (re-)defined, to avoid warning when PLIB sg.h is included. 2010-08-07 16:28:39 +01:00
James Turner
2a2e2716bd Removal of PLIB/SG from SimGear 2010-08-07 13:55:33 +01:00
James Turner
6a07c22826 Catch subsystem update() exceptions in the manager, and permit a maximum number of exceptions before suspending the subsystem. 2010-08-07 10:25:20 +01:00
James Turner
7c294915c8 Ensure 'make dist' works. 2010-08-07 09:09:58 +01:00
James Turner
7788cb288e Fixes for automake correctness. 2010-08-06 21:18:04 +01:00
James Turner
c1762c709e Ralf Gerlich: add headless mode to SimGear (merging simgear-cs) 2010-08-06 19:17:14 +01:00
James Turner
8690528080 Fix compilation if OSG ref_ptr implicit conversion is not enabled. 2010-08-06 18:42:56 +01:00
Frederic Bouvier
5376294389 Merge commit 'refs/merge-requests/1' of git://gitorious.org/fg/simgear into vivian/cube 2010-08-03 08:41:27 +02:00
Frederic Bouvier
fa1b703bf8 Update MSVC10 project files 2010-08-03 08:40:10 +02:00
Vivian Meazza
72d2c7f078 Remove debugging messages
Signed-off-by: Vivian Meazza <vivian.meazza@lineone.net>
2010-08-02 20:27:49 +01:00
Vivian Meazza
09ecc66e53 Add support for Cube Crosses. Based on Zan's work, with some bugs removed.
Signed-off-by: Vivian Meazza <vivian.meazza@lineone.net>
2010-08-02 20:22:33 +01:00
Erik Hofman
879dc295a8 Actually enable looping for a sample queue 2010-08-02 11:43:53 +02:00
Erik Hofman
8a5a1d3301 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-08-02 10:11:41 +02:00
Erik Hofman
67c8067aed Initial commit for a sample queue extension. 2010-08-02 10:10:58 +02:00
Frederic Bouvier
123e32e345 MSVC 10 build 2010-08-01 18:00:39 +02:00
Frederic Bouvier
3a09d67f59 MSVC 10 build: Resolve an ambiguity between boost::bind and std::tr1::bind 2010-08-01 18:00:37 +02:00
Frederic Bouvier
ec3ed8fbcd Project file to build and install SimGear alone 2010-08-01 18:00:32 +02:00
Frederic Bouvier
18370ebd08 Update project to use VC100 OSG and Boost 1.42.0 2010-08-01 18:00:30 +02:00
Frederic Bouvier
acbc09b232 MSVC10 build fix 2010-08-01 18:00:27 +02:00
Frederic Bouvier
9d1cf253b4 Compile with MSVC10 2010-08-01 18:00:25 +02:00
Frederic Bouvier
e46304d1ce Add VS2010 project files 2010-08-01 18:00:23 +02:00
James Turner
668c62b1f4 Missed removing a build rule. 2010-07-31 15:33:25 +01:00
James Turner
49f418f146 Remove legacy direct-OpenGL code in simgear/screen (predating switch to OSG). 2010-07-31 15:17:09 +01:00
Erik Hofman
c46c735f2f fix a typo 2010-07-30 10:44:50 +02:00
Erik Hofman
82aa7fcbad use std::string 2010-07-30 10:42:44 +02:00
James Turner
2cfeeb4b13 Merge branch 'topics/remove_point3d' of git@gitorious.org:~zakalawe/fg/james-simgear into topics/remove_point3d 2010-07-30 09:00:35 +01:00
James Turner
aa859c488f Remove deprecated vector classes - finally! 2010-07-30 00:46:30 +01:00
James Turner
1b2915aa2a WIP - removing remaining users of Point3D. 2010-07-29 17:49:37 +01:00
James Turner
e99c3d4705 Collapse SGGeoCoord into SGTimeZone, and switch timezone search to cartesian math. 2010-07-29 10:12:00 +01:00
James Turner
d23491646a Use a custom 'findDataFile' method in key places, and hook this into a callback set on SGModelLib. 2010-07-29 01:05:24 +01:00
Erik Hofman
1d740a63bd C++ify some code 2010-07-27 15:57:36 +02:00
Erik Hofman
d1897fabf0 Small bugfix, the previous test always sets _property (these days) 2010-07-27 14:51:44 +02:00
Erik Hofman
d4178d6440 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-07-27 10:15:28 +02:00
James Turner
f4d42289d4 More ignore rules for Git. 2010-07-27 00:21:44 +01:00
Erik Hofman
d0def466da Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-07-25 10:29:25 +02:00
James Turner
959f44502b Fix simgear::Dir::children on Linux where dirent->d_type might be 0; always use stat() to determine file type. Thanks to Alex Romonsan for helping debugging this! 2010-07-24 10:27:50 +01:00
Erik Hofman
1840541f6d Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-07-23 20:05:40 +02:00
Cutis L. Olson
c5ec6927b3 Add a method to set particle wind using from heading (deg) and speed (kt) 2010-07-23 09:01:49 -05:00
James Turner
7beaf3705e Add closest-point calculation to SGRay, to replace a vector.h helper. 2010-07-23 13:04:09 +01:00
Erik Hofman
792ffa2d26 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-07-23 13:57:53 +02:00
James Turner
bbd61977f1 Change SGPath::exists to use stat(), fix '.' and '..' handling on Windows, add simgear::Dir version of exists(). 2010-07-23 07:54:10 +01:00
James Turner
e3d1fa2686 Merge branch 'next' of git@gitorious.org:fg/simgear into next 2010-07-23 06:30:37 +01:00
James Turner
293d3b4fb3 Fix Win32 compilation of raw_socket. 2010-07-23 06:30:02 +01:00
James Turner
e1d8155565 Linux build fixes, now netSocket.h is no longer included. 2010-07-22 22:06:02 +01:00
James Turner
c37b27a926 I greatly dislike GNU automake. 2010-07-22 21:27:11 +01:00
James Turner
6b3a05e23f Move PLIB netSocket into SimGear, as simgear::Socket, and update the wrapper classes. 2010-07-22 20:02:37 +01:00
Erik Hofman
0e92bb58b0 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-07-22 08:57:04 +02:00
James Turner
63cbd4deb0 On Unix, check for symlinks from readdir(), and look through them (using stat()) to discern target type. 2010-07-21 22:08:06 +01:00
Frederic Bouvier
17bcd4e2ab Add a new function alias for MSVC: strcasecmp -> stricmp 2010-07-19 22:36:01 +02:00
Frederic Bouvier
72f301c655 Merge branch 'next' of git://gitorious.org/fg/simgear into fredb/winbuild 2010-07-19 20:02:41 +02:00
Erik Hofman
a62a8518b9 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-07-16 20:20:28 +02:00
Torsten Dreyer
fa169d6aa2 Merge branch 'next' of gitorious.org:fg/simgear into next 2010-07-16 18:35:55 +02:00
Torsten Dreyer
d2bcb86e1e Warning fix: compare signed/unsigned 2010-07-16 18:34:39 +02:00
Torsten Dreyer
ed7361622b Warning fix: unused variable in TextureBuilder.cxx 2010-07-16 18:19:56 +02:00
James Turner
3117ec5a7d Fix simgear::Dir compilation on some Unix setups, thanks Anders. 2010-07-16 08:40:07 +01:00
James Turner
cb4716f403 Initial work on simgear::Dir, replacement for PLIB ulDir functions. 2010-07-15 09:40:46 +01:00
Erik Hofman
b48c0e968f Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-07-14 12:19:08 +02:00
James Turner
aa2ed5fb0c Allow tasks to be removed from the EventManager by name. 2010-07-13 13:07:35 +01:00
Erik Hofman
8b7a279c61 Merge branch 'next' of git://gitorious.org/fg/simgear into next 2010-07-09 08:53:56 +02:00
James Turner
b286e9d337 Add two more subsystem groups, to aid in fixing bug 141. 2010-07-08 23:21:25 +01:00
Erik Hofman
d671c3d9fa At some points Flightgear stops and restarts the entire sample group containing the looping background/engine noise. But it does not restart the individual (looping) samples in the group. So now the background noise dies when resetting the sim or changing aircraft location. 2010-06-29 08:28:38 +02:00
Erik Hofman
7086f2dc89 brehmt:
When a sample's state constantly is "changed" (because sth. keeps updating the
sample in each update loop), then SGSampleGroup::update never ever checked if
the sample had already stopped playing by itself.
The attached patch reorders the last two conditions. It now first checks if a
sample has already stopped playing, before checking if there's sth to update.
2010-06-28 08:12:23 +02:00
Frederic Bouvier
7e8bb9ea00 Merge branch 'next' of git://gitorious.org/fg/simgear into fredb/winbuild 2010-06-19 08:14:26 +02:00
Frederic Bouvier
4e46bb6671 Merge branch 'master' of git://gitorious.org/fg/simgear into fredb/winbuild 2010-06-19 08:14:02 +02:00
Tim Moore
de35658096 Merge remote branch 'gitorious/next' into next 2010-06-17 23:46:52 +02:00
Tim Moore
034f5db3bd use an additional shader program map keyed using the resolved shader filenames 2010-06-17 23:45:27 +02:00
James Turner
57375bfd73 Merge commit 'b846e33' into next 2010-06-17 21:40:09 +01:00
James Turner
b846e33ee3 Extend Magvar interface to use SGGeod. 2010-06-17 21:39:10 +01:00
James Turner
cc9b817f0e Extend SGSubsystemGroup, to allow running a fixed dt time, internally 2010-06-16 18:02:41 +01:00
Tim Moore
0d419aba8a Add bool and int uniform types for shaders, and vertex-program-two-sided
vertex-program-two-sided is an extra parameter written by the code
that creates effects from state sets generated by the ac3d loader. The
objective of this work is to support a workaround for broken
gl_FrontFacing on some Macintosh machines.
2010-06-15 19:05:18 +02:00
James Turner
ae22321d9c Automake changes to Hudson 'make check' runs.
Includes moving the OpenAL test programs to 'noinst' so they don't run as part of make check
2010-06-14 12:38:41 +01:00
James Turner
87169febf8 Const-ify some ephemeris accessors, so they can be tied. 2010-06-14 10:23:06 +01:00
James Turner
dd044844e5 Add radial intersection code to SGGeodesy, and test coverage for geocentric helpers. 2010-06-14 10:15:44 +01:00
James Turner
0c8c596ee5 Fix longitude sign convention of geocentric routines
(derived from the Williams aviation formulary, with W longitude +ve)
2010-06-11 18:38:43 +02:00
James Turner
b9496fef1d Merge branch 'topics/condexp' into next 2010-05-27 15:19:38 +01:00
James Turner
b4b9d3a4b7 Support constant true and false values in conditions. 2010-05-27 15:19:04 +01:00
James Turner
0128c89f8d Merge branch 'topics/condexp' into next 2010-05-26 19:29:28 +01:00
James Turner
9e77d06c72 Support <table>s in expression XML. 2010-05-26 19:28:42 +01:00
Torsten Dreyer
25bb1cc957 Cleanup some nonprinting characters make this file work 2010-05-23 21:02:19 +02:00
Torsten Dreyer
2c6f8299f0 typo in gitignore filename 2010-05-23 19:09:00 +02:00
Torsten Dreyer
6a2773c3ac ignore generated files 2010-05-23 10:54:23 +02:00
Torsten Dreyer
1eea917121 ignore generated files 2010-05-23 10:45:01 +02:00
Torsten Dreyer
ea1bbbabfa ignore generated test apps 2010-05-23 10:44:29 +02:00
Torsten Dreyer
399d2bc73c Fix a gcc warning 2010-05-22 23:40:07 +02:00
Torsten Dreyer
0759dbcdc9 Merge branch 'next' of gitorious.org:fg/simgear into next 2010-05-22 23:36:39 +02:00
Torsten Dreyer
1ae0f9c19d New pick animation capability from Alex Perry
Alex Perry: Adds a new pick animation capability which parallels the existing
"action" for a named object.  Specifying "vncaction" and a transform
from model space will enable all mouse clicks on that object to be
delivered directly to the OSG image.  Currently, the readers for VNC
and PDF files yield interactive images; more are likely to be added
over time.
2010-05-22 23:35:01 +02:00
James Turner
e8364a03bc Merge branch 'topics/condexp' into next 2010-05-20 23:57:54 +01:00
James Turner
046d88ab2d Support <expression> children in comparison conditions. Also makes ordering of child nodes match XML consistently. 2010-05-20 23:56:04 +01:00
Mathias Froehlich
f161f78a33 Add a tight and cheap method to represent a rotation.
Adapt tests for that new method.
2010-05-17 23:13:59 +02:00
Erik Hofman
1912444886 revert previous commit, this was a mistake 2010-05-11 11:32:58 +02:00
Erik Hofman
b6ef5a0a3d Before 2010-05-08 11:19:01 +02:00
Frederic Bouvier
401c88adbb Test git commit with a simple change 2010-05-08 00:19:43 +02:00
James Turner
42984d1bfb Make ALUT 1.0 builds again, hopefully in the short term - MinGW needs this. 2010-05-07 00:12:21 +01:00
James Turner
6997082b03 Add .gitignore files, ignore automake/configure artefacts. 2010-05-06 11:25:53 +01:00
James Turner
139217dc79 Configure.as updates for ALUT changes, make --with-alut-framework= work. 2010-05-06 10:27:38 +01:00
Tim Moore
2cc2a857a2 Merge branch 'jmt/ref_ptr-conv' 2010-05-06 10:43:53 +02:00
Tim Moore
7dfb463ba9 Merge branch 'ehofman/framebuffer' 2010-05-06 10:43:45 +02:00
Tim Moore
da07871bc6 Merge branch 'mathias/intersect' 2010-05-06 10:43:27 +02:00
Tim Moore
530d2309e7 Merge branch 'ehofman/sound' 2010-05-06 10:43:12 +02:00
Tim Moore
7e7a5d38f8 Merge branch 'fredb/msvc-cleanup' 2010-05-06 10:42:59 +02:00
Tim Moore
ecf949dee0 Merge branch 'ehofman/model' 2010-05-06 10:42:44 +02:00
509 changed files with 45877 additions and 23696 deletions

View File

@@ -1,19 +0,0 @@
Makefile
Makefile.in
SimGear.spec
aclocal.m4
autom4te.cache
config.cache
config.log
config.status
configure
do-config.sh
.cdtproject
.project
config.guess
config.sub
depcomp
INSTALL
install-sh
missing
mkinstalldirs

15
.gitignore vendored Normal file
View File

@@ -0,0 +1,15 @@
Makefile
SimGear.spec
*.o
lib*.a
.*.swp
cmake_install.cmake
CMakeFiles
CMakeCache.txt
CPackConfig.cmake
CPackSourceConfig.cmake
cmake_uninstall.cmake
CTestTestfile.cmake
install_manifest.txt
build*
Build

290
CMakeLists.txt Normal file
View File

@@ -0,0 +1,290 @@
cmake_minimum_required (VERSION 2.6.4)
include (CheckFunctionExists)
include (CheckIncludeFile)
include (CheckCXXSourceCompiles)
project(SimGear)
# read 'version' file into a variable (stripping any newlines or spaces)
file(READ version versionFile)
string(STRIP ${versionFile} SIMGEAR_VERSION)
# use simgear version also as the SO version (if building SOs)
SET(SIMGEAR_SOVERSION ${SIMGEAR_VERSION})
#packaging
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
SET(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Simulation support libraries for FlightGear and related projects")
SET(CPACK_PACKAGE_VENDOR "The FlightGear project")
SET(CPACK_GENERATOR "TBZ2")
SET(CPACK_INSTALL_CMAKE_PROJECTS ${CMAKE_CURRENT_BINARY_DIR};SimGear;ALL;/)
# split version string into components, note CMAKE_MATCH_0 is the entire regexp match
string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" CPACK_PACKAGE_VERSION ${SIMGEAR_VERSION} )
set(CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})
set(CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
set(CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
message(STATUS "version is ${CPACK_PACKAGE_VERSION_MAJOR} dot ${CPACK_PACKAGE_VERSION_MINOR} dot ${CPACK_PACKAGE_VERSION_PATCH}")
set(CPACK_SOURCE_GENERATOR TBZ2)
set(CPACK_SOURCE_PACKAGE_FILE_NAME "simgear-${SIMGEAR_VERSION}" CACHE INTERNAL "tarball basename")
set(CPACK_SOURCE_IGNORE_FILES
"^${PROJECT_SOURCE_DIR}/.git;\\\\.gitignore;Makefile.am;~$;${CPACK_SOURCE_IGNORE_FILES}")
message(STATUS "ignoring: ${CPACK_SOURCE_IGNORE_FILES}")
include (CPack)
# We have some custom .cmake scripts not in the official distribution.
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
# Change the default build type to something fast
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
FORCE)
endif(NOT CMAKE_BUILD_TYPE)
# Determine name of library installation directory, i.e. "lib" vs "lib64", which
# differs between all Debian-based vs all other Linux distros.
# See cmake bug #11964, http://cmake.org/gitweb?p=cmake.git;a=commit;h=126c993d
# GNUInstallDirs requires CMake >= 2.8.5, use own file for older cmake
if(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
include(GNUInstallDirs)
else(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
include(OldGNUInstallDirs)
endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}")
option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF)
option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON)
option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF)
option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON)
if (MSVC)
GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
if (CMAKE_CL_64)
SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
else (CMAKE_CL_64)
SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty")
endif (CMAKE_CL_64)
if (EXISTS ${TEST_3RDPARTY_DIR})
set(MSVC_3RDPARTY_ROOT ${PARENT_DIR} CACHE PATH "Location where the third-party dependencies are extracted")
else (EXISTS ${TEST_3RDPARTY_DIR})
set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
endif (EXISTS ${TEST_3RDPARTY_DIR})
else (MSVC)
set(MSVC_3RDPARTY_ROOT NOT_FOUND CACHE PATH "Location where the third-party dependencies are extracted")
endif (MSVC)
if (MSVC AND MSVC_3RDPARTY_ROOT)
message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
set( OSG_MSVC "msvc" )
if (${MSVC_VERSION} EQUAL 1600)
set( OSG_MSVC ${OSG_MSVC}100 )
else (${MSVC_VERSION} EQUAL 1600)
set( OSG_MSVC ${OSG_MSVC}90 )
endif (${MSVC_VERSION} EQUAL 1600)
if (CMAKE_CL_64)
set( OSG_MSVC ${OSG_MSVC}-64 )
set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
else (CMAKE_CL_64)
set( MSVC_3RDPARTY_DIR 3rdParty )
endif (CMAKE_CL_64)
set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib )
set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include)
set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
set (ALUT_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
endif (MSVC AND MSVC_3RDPARTY_ROOT)
find_package(Boost REQUIRED)
set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
find_package(ZLIB REQUIRED)
find_package(Threads REQUIRED)
if(SIMGEAR_HEADLESS)
message(STATUS "SimGear mode: HEADLESS")
else()
message(STATUS "SimGear mode: NORMAL")
find_package(OpenGL REQUIRED)
find_package(OpenAL REQUIRED)
find_package(ALUT REQUIRED)
find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgUtil)
endif(SIMGEAR_HEADLESS)
if(JPEG_FACTORY)
message(STATUS "JPEG-factory: ENABLED")
find_package(JPEG REQUIRED)
include_directories(${JPEG_INCLUDE_DIR})
else()
message(STATUS "JPEG-factory: DISABLED")
endif(JPEG_FACTORY)
if(ENABLE_LIBSVN)
find_package(SvnClient)
if(LIBSVN_FOUND)
message(STATUS "Subversion client support: ENABLED")
set(HAVE_SVN_CLIENT_H 1)
set(HAVE_LIBSVN_CLIENT_1 1)
else()
# Oops. ENABLE_LIBSVN is ON, but svn is still missing.
# Provide clearly visible warning/hint, so builders know what else they should install (or disable).
message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
endif(LIBSVN_FOUND)
else()
message(STATUS "Subversion client support: DISABLED")
endif(ENABLE_LIBSVN)
check_include_file(sys/time.h HAVE_SYS_TIME_H)
check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
check_include_file(unistd.h HAVE_UNISTD_H)
check_include_file(windows.h HAVE_WINDOWS_H)
if(ENABLE_RTI)
# See if we have any rti library variant installed
message(STATUS "RTI: ENABLED")
find_package(RTI)
else()
message(STATUS "RTI: DISABLED")
endif(ENABLE_RTI)
check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
check_function_exists(ftime HAVE_FTIME)
check_function_exists(timegm HAVE_TIMEGM)
check_function_exists(rint HAVE_RINT)
check_function_exists(mkdtemp HAVE_MKDTEMP)
check_function_exists(bcopy HAVE_BCOPY)
check_function_exists(mmap HAVE_MMAP)
if(HAVE_UNISTD_H)
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
check_cxx_source_compiles(
"#include <unistd.h>
#if !defined(_POSIX_TIMERS) || (0 >= _POSIX_TIMERS)
#error clock_gettime is not supported
#endif
int main() { return 0; }
"
HAVE_CLOCK_GETTIME)
endif(HAVE_UNISTD_H)
set(RT_LIBRARY "")
if(HAVE_CLOCK_GETTIME)
check_library_exists(rt clock_gettime "" HAVE_RT)
if(HAVE_RT)
set(RT_LIBRARY rt)
endif(HAVE_RT)
endif(HAVE_CLOCK_GETTIME)
SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
SET(CMAKE_MINSIZEREL_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
# isnan might not be real symbol, so can't check using function_exists
check_cxx_source_compiles(
"#include <cmath>
void f() { isnan(0.0);} "
HAVE_ISNAN)
if(CMAKE_COMPILER_IS_GNUCXX)
set(WARNING_FLAGS_CXX "-Wall")
set(WARNING_FLAGS_C "-Wall")
# certain GCC versions don't provide the atomic builds, and hence
# require is to provide them in SGAtomic.cxx
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_INCLUDE_PATH})
check_cxx_source_compiles(
"int main() { unsigned mValue; return __sync_add_and_fetch(&mValue, 1); }"
GCC_ATOMIC_BUILTINS_FOUND)
endif(CMAKE_COMPILER_IS_GNUCXX)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(WARNING_FLAGS_CXX "-Wall -Wno-overloaded-virtual")
set(WARNING_FLAGS_C "-Wall")
endif()
if(WIN32)
if(MINGW)
add_definitions(-D_WIN32_WINNT=0x501)
endif()
if(MSVC)
# turn off various warnings
# foreach(warning 4244 4251 4267 4275 4290 4786 4305 4996)
# SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
# endforeach(warning)
set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996")
endif(MSVC)
# assumed on Windows
set(HAVE_GETLOCALTIME 1)
set( WINSOCK_LIBRARY "ws2_32.lib" )
set( RT_LIBRARY "winmm" )
endif(WIN32)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
include_directories(${PROJECT_SOURCE_DIR})
include_directories(${PROJECT_BINARY_DIR}/simgear)
include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}
${ALUT_INCLUDE_DIR} ${OPENAL_INCLUDE_DIR} )
add_definitions(-DHAVE_CONFIG_H)
add_definitions(-DHAVE_EXPAT_CONFIG_H)
# configure a header file to pass some of the CMake settings
# to the source code
configure_file (
"${PROJECT_SOURCE_DIR}/simgear/simgear_config_cmake.h.in"
"${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
)
configure_file (
"${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
"${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
)
if(ENABLE_TESTS)
# enable CTest / make test target
message(STATUS "Tests: ENABLED")
include (Dart)
enable_testing()
else()
message(STATUS "Tests: DISABLED")
endif(ENABLE_TESTS)
install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
add_subdirectory(simgear)
#-----------------------------------------------------------------------------
### uninstall target
#-----------------------------------------------------------------------------
CONFIGURE_FILE(
"${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
ADD_CUSTOM_TARGET(uninstall
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")

View File

@@ -0,0 +1,67 @@
# Locate ALUT
# This module defines
# ALUT_LIBRARY
# ALUT_FOUND, if false, do not try to link to ALUT
# ALUT_INCLUDE_DIR, where to find the headers
#
# $ALUTDIR is an environment variable that would
# correspond to the ./configure --prefix=$ALUTDIR
# used in building ALUT.
#
# Created by James Turner. This was influenced by the FindOpenAL.cmake module.
#=============================================================================
# Copyright 2005-2009 Kitware, Inc.
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distributed this file outside of CMake, substitute the full
# License text for the above reference.)
# Per my request, CMake should search for frameworks first in
# the following order:
# ~/Library/Frameworks/OpenAL.framework/Headers
# /Library/Frameworks/OpenAL.framework/Headers
# /System/Library/Frameworks/OpenAL.framework/Headers
#
# On OS X, this will prefer the Framework version (if found) over others.
# People will have to manually change the cache values of
# OPENAL_LIBRARY to override this selection or set the CMake environment
# CMAKE_INCLUDE_PATH to modify the search paths.
FIND_LIBRARY(ALUT_LIBRARY
NAMES ALUT alut
HINTS
$ENV{ALUTDIR}
PATH_SUFFIXES lib64 lib libs64 libs libs/Win32 libs/Win64
PATHS
~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/opt
)
FIND_PATH(ALUT_INCLUDE_DIR
NAMES ALUT/alut.h alut.h
HINTS
$ENV{ALUTDIR}
PATH_SUFFIXES include/AL include
PATHS
~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/opt
)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ALUT DEFAULT_MSG ALUT_LIBRARY ALUT_INCLUDE_DIR)
MARK_AS_ADVANCED(ALUT_LIBRARY ALUT_INCLUDE_DIR)

View File

@@ -0,0 +1,76 @@
# Find Subversion client libraries, and dependencies
# including APR (Apache Portable Runtime)
include (CheckFunctionExists)
include (CheckIncludeFile)
include (CheckLibraryExists)
macro(find_static_component comp libs)
# account for alternative Windows svn distribution naming
if(MSVC)
set(compLib "lib${comp}")
else(MSVC)
set(compLib "${comp}")
endif(MSVC)
string(TOUPPER "${comp}" compLibBase)
set( compLibName ${compLibBase}_LIBRARY )
FIND_LIBRARY(${compLibName}
NAMES ${compLib}
HINTS $ENV{PLIBDIR}
PATH_SUFFIXES lib64 lib libs64 libs libs/Win32 libs/Win64
PATHS
/usr/local
/usr
/opt
)
list(APPEND ${libs} ${${compLibName}})
endmacro()
find_program(HAVE_APR_CONFIG apr-1-config)
if(HAVE_APR_CONFIG)
execute_process(COMMAND apr-1-config --cppflags --includes
OUTPUT_VARIABLE APR_CFLAGS
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND apr-1-config --link-ld
OUTPUT_VARIABLE RAW_APR_LIBS
OUTPUT_STRIP_TRAILING_WHITESPACE)
# clean up some vars, or other CMake pieces complain
string(STRIP "${RAW_APR_LIBS}" APR_LIBS)
else(HAVE_APR_CONFIG)
message(STATUS "apr-1-config not found, implement manual search for APR")
endif(HAVE_APR_CONFIG)
if(HAVE_APR_CONFIG OR MSVC)
find_path(LIBSVN_INCLUDE_DIR svn_client.h
HINTS
$ENV{LIBSVN_DIR}
PATH_SUFFIXES include/subversion-1
PATHS
/usr/local
/usr
/opt
)
set(LIBSVN_LIBRARIES "")
if (MSVC)
find_static_component("apr-1" LIBSVN_LIBRARIES)
else (MSVC)
list(APPEND LIBSVN_LIBRARIES ${APR_LIBS})
endif (MSVC)
find_static_component("svn_client-1" LIBSVN_LIBRARIES)
find_static_component("svn_subr-1" LIBSVN_LIBRARIES)
find_static_component("svn_ra-1" LIBSVN_LIBRARIES)
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBSVN DEFAULT_MSG LIBSVN_LIBRARIES LIBSVN_INCLUDE_DIR)
if(NOT LIBSVN_FOUND)
set(LIBSVN_LIBRARIES "")
endif(NOT LIBSVN_FOUND)
endif(HAVE_APR_CONFIG OR MSVC)

View File

@@ -0,0 +1,182 @@
# - Define GNU standard installation directories
# Provides install directory variables as defined for GNU software:
# http://www.gnu.org/prep/standards/html_node/Directory-Variables.html
# Inclusion of this module defines the following variables:
# CMAKE_INSTALL_<dir> - destination for files of a given type
# CMAKE_INSTALL_FULL_<dir> - corresponding absolute path
# where <dir> is one of:
# BINDIR - user executables (bin)
# SBINDIR - system admin executables (sbin)
# LIBEXECDIR - program executables (libexec)
# SYSCONFDIR - read-only single-machine data (etc)
# SHAREDSTATEDIR - modifiable architecture-independent data (com)
# LOCALSTATEDIR - modifiable single-machine data (var)
# LIBDIR - object code libraries (lib or lib64)
# INCLUDEDIR - C header files (include)
# OLDINCLUDEDIR - C header files for non-gcc (/usr/include)
# DATAROOTDIR - read-only architecture-independent data root (share)
# DATADIR - read-only architecture-independent data (DATAROOTDIR)
# INFODIR - info documentation (DATAROOTDIR/info)
# LOCALEDIR - locale-dependent data (DATAROOTDIR/locale)
# MANDIR - man documentation (DATAROOTDIR/man)
# DOCDIR - documentation root (DATAROOTDIR/doc/PROJECT_NAME)
# Each CMAKE_INSTALL_<dir> value may be passed to the DESTINATION options of
# install() commands for the corresponding file type. If the includer does
# not define a value the above-shown default will be used and the value will
# appear in the cache for editing by the user.
# Each CMAKE_INSTALL_FULL_<dir> value contains an absolute path constructed
# from the corresponding destination by prepending (if necessary) the value
# of CMAKE_INSTALL_PREFIX.
#=============================================================================
# Copyright 2011 Nikita Krupen'ko <krnekit@gmail.com>
# Copyright 2011 Kitware, Inc.
#
# Distributed under the OSI-approved BSD License (the "License");
# see accompanying file Copyright.txt for details.
#
# This software is distributed WITHOUT ANY WARRANTY; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the License for more information.
#=============================================================================
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
# Installation directories
#
if(NOT DEFINED CMAKE_INSTALL_BINDIR)
set(CMAKE_INSTALL_BINDIR "bin" CACHE PATH "user executables (bin)")
endif()
if(NOT DEFINED CMAKE_INSTALL_SBINDIR)
set(CMAKE_INSTALL_SBINDIR "sbin" CACHE PATH "system admin executables (sbin)")
endif()
if(NOT DEFINED CMAKE_INSTALL_LIBEXECDIR)
set(CMAKE_INSTALL_LIBEXECDIR "libexec" CACHE PATH "program executables (libexec)")
endif()
if(NOT DEFINED CMAKE_INSTALL_SYSCONFDIR)
set(CMAKE_INSTALL_SYSCONFDIR "etc" CACHE PATH "read-only single-machine data (etc)")
endif()
if(NOT DEFINED CMAKE_INSTALL_SHAREDSTATEDIR)
set(CMAKE_INSTALL_SHAREDSTATEDIR "com" CACHE PATH "modifiable architecture-independent data (com)")
endif()
if(NOT DEFINED CMAKE_INSTALL_LOCALSTATEDIR)
set(CMAKE_INSTALL_LOCALSTATEDIR "var" CACHE PATH "modifiable single-machine data (var)")
endif()
if(NOT DEFINED CMAKE_INSTALL_LIBDIR)
set(_LIBDIR_DEFAULT "lib")
# Override this default 'lib' with 'lib64' iff:
# - we are on Linux system but NOT cross-compiling
# - we are NOT on debian
# - we are on a 64 bits system
# reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf
# Note that the future of multi-arch handling may be even
# more complicated than that: http://wiki.debian.org/Multiarch
if(CMAKE_SYSTEM_NAME MATCHES "Linux"
AND NOT CMAKE_CROSSCOMPILING
AND NOT EXISTS "/etc/debian_version")
if(NOT DEFINED CMAKE_SIZEOF_VOID_P)
message(AUTHOR_WARNING
"Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. "
"Please enable at least one language before including GNUInstallDirs.")
else()
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
set(_LIBDIR_DEFAULT "lib64")
endif()
endif()
endif()
set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})")
endif()
if(NOT DEFINED CMAKE_INSTALL_INCLUDEDIR)
set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE PATH "C header files (include)")
endif()
if(NOT DEFINED CMAKE_INSTALL_OLDINCLUDEDIR)
set(CMAKE_INSTALL_OLDINCLUDEDIR "/usr/include" CACHE PATH "C header files for non-gcc (/usr/include)")
endif()
if(NOT DEFINED CMAKE_INSTALL_DATAROOTDIR)
set(CMAKE_INSTALL_DATAROOTDIR "share" CACHE PATH "read-only architecture-independent data root (share)")
endif()
#-----------------------------------------------------------------------------
# Values whose defaults are relative to DATAROOTDIR. Store empty values in
# the cache and store the defaults in local variables if the cache values are
# not set explicitly. This auto-updates the defaults as DATAROOTDIR changes.
if(NOT CMAKE_INSTALL_DATADIR)
set(CMAKE_INSTALL_DATADIR "" CACHE PATH "read-only architecture-independent data (DATAROOTDIR)")
set(CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_DATAROOTDIR}")
endif()
if(NOT CMAKE_INSTALL_INFODIR)
set(CMAKE_INSTALL_INFODIR "" CACHE PATH "info documentation (DATAROOTDIR/info)")
set(CMAKE_INSTALL_INFODIR "${CMAKE_INSTALL_DATAROOTDIR}/info")
endif()
if(NOT CMAKE_INSTALL_LOCALEDIR)
set(CMAKE_INSTALL_LOCALEDIR "" CACHE PATH "locale-dependent data (DATAROOTDIR/locale)")
set(CMAKE_INSTALL_LOCALEDIR "${CMAKE_INSTALL_DATAROOTDIR}/locale")
endif()
if(NOT CMAKE_INSTALL_MANDIR)
set(CMAKE_INSTALL_MANDIR "" CACHE PATH "man documentation (DATAROOTDIR/man)")
set(CMAKE_INSTALL_MANDIR "${CMAKE_INSTALL_DATAROOTDIR}/man")
endif()
if(NOT CMAKE_INSTALL_DOCDIR)
set(CMAKE_INSTALL_DOCDIR "" CACHE PATH "documentation root (DATAROOTDIR/doc/PROJECT_NAME)")
set(CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}")
endif()
#-----------------------------------------------------------------------------
mark_as_advanced(
CMAKE_INSTALL_BINDIR
CMAKE_INSTALL_SBINDIR
CMAKE_INSTALL_LIBEXECDIR
CMAKE_INSTALL_SYSCONFDIR
CMAKE_INSTALL_SHAREDSTATEDIR
CMAKE_INSTALL_LOCALSTATEDIR
CMAKE_INSTALL_LIBDIR
CMAKE_INSTALL_INCLUDEDIR
CMAKE_INSTALL_OLDINCLUDEDIR
CMAKE_INSTALL_DATAROOTDIR
CMAKE_INSTALL_DATADIR
CMAKE_INSTALL_INFODIR
CMAKE_INSTALL_LOCALEDIR
CMAKE_INSTALL_MANDIR
CMAKE_INSTALL_DOCDIR
)
# Result directories
#
foreach(dir
BINDIR
SBINDIR
LIBEXECDIR
SYSCONFDIR
SHAREDSTATEDIR
LOCALSTATEDIR
LIBDIR
INCLUDEDIR
OLDINCLUDEDIR
DATAROOTDIR
DATADIR
INFODIR
LOCALEDIR
MANDIR
DOCDIR
)
if(NOT IS_ABSOLUTE ${CMAKE_INSTALL_${dir}})
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_${dir}}")
else()
set(CMAKE_INSTALL_FULL_${dir} "${CMAKE_INSTALL_${dir}}")
endif()
endforeach()

View File

@@ -0,0 +1,31 @@
macro(simgear_component_common name includePath sourcesList sources headers)
if (SIMGEAR_SHARED)
foreach(s ${sources})
set_property(GLOBAL
APPEND PROPERTY ${sourcesList} "${CMAKE_CURRENT_SOURCE_DIR}/${s}")
endforeach()
foreach(h ${headers})
set_property(GLOBAL
APPEND PROPERTY PUBLIC_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/${h}")
endforeach()
else()
set(libName "sg${name}")
add_library(${libName} STATIC ${sources} ${headers})
install (TARGETS ${libName} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
install (FILES ${headers} DESTINATION include/simgear/${includePath})
endmacro()
function(simgear_component name includePath sources headers)
simgear_component_common(${name} ${includePath} CORE_SOURCES "${sources}" "${headers}")
endfunction()
function(simgear_scene_component name includePath sources headers)
simgear_component_common(${name} ${includePath} SCENE_SOURCES "${sources}" "${headers}")
endfunction()

View File

@@ -0,0 +1,22 @@
IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
ENDIF()
FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
STRING(REGEX REPLACE "\n" ";" files "${files}")
FOREACH(file ${files})
MESSAGE(STATUS "Uninstalling \"${file}\"")
IF(EXISTS "${file}")
EXEC_PROGRAM(
"@CMAKE_COMMAND@" ARGS "-E remove \"${file}\""
OUTPUT_VARIABLE rm_out
RETURN_VALUE rm_retval
)
IF(NOT "${rm_retval}" STREQUAL 0)
MESSAGE(FATAL_ERROR "Problem when removing \"${file}\"")
ENDIF()
ELSE()
MESSAGE(STATUS "File \"${file}\" does not exist.")
ENDIF()
ENDFOREACH()

View File

@@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -464,7 +464,7 @@ convey the exclusion of warranty; and each file should have at least the
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Also add information on how to contact you by electronic and paper mail.

View File

@@ -22,7 +22,7 @@ PROJECT_NAME = SimGear
# This could be handy for archiving the generated documentation or
# if some version control system is used.
PROJECT_NUMBER = 1.9.0
PROJECT_NUMBER = 2.2.0
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.

57
INSTALL Normal file
View File

@@ -0,0 +1,57 @@
How to build SimGear
====================
SimGear uses the CMake build system to generate a platform-specific
build environment. CMake reads the CMakeLists.txt files that you'll
find throughout the source directories, checks for installed
dependencies and then generates the appropriate build system.
If you don't already have CMake installed on your system you can grab
it from http://www.cmake.org, use version 2.6.4 or later.
Under unices (i.e. Linux, Solaris, Free-BSD, HP-Ux, OSX) use the cmake
or ccmake command-line utils. Preferably, create an out-of-source
build directory and run cmake or ccmake from there. The advantage to
this approach is that the temporary files created by CMake won't
clutter the source directory, and also makes it possible to have
multiple independent build targets by creating multiple build
directories. In a directory alongside the SimGear source directory
use:
mkdir sgbuild
cd sgbuild
cmake ../simgear -DCMAKE_BUILD_TYPE=Release
make
sudo make install
Build Dependencies
==================
SimGear depends on a number of 3rd party libraries, the most notable
being:
* OpenSceneGraph (OSG) - see README.OSG
* Portable Games Library (PLIB) - see README.plib
* zlib compression library - see README.zlib
* Open Audio Library (OpenAL) - see README.OpenAL
* Subversion Client Library (optional dependency)
Further information
===================
* README.cmake
for more detailed CMake instructions
* README.msvc
in the FlightGear source package for more Windows-specific instructions
* FlightGear Wiki
http://wiki.flightgear.org/Building_Flightgear
* FlightGear Forums
For help on building see: http://www.flightgear.org/forums
=> Support/Compiling
* FlightGear Mailing lists
http://wiki.flightgear.org/index.php/Mailing_list

View File

@@ -1,22 +0,0 @@
EXTRA_DIST = \
acinclude.m4 \
autogen.sh \
DoxygenMain.cxx \
README.zlib \
README.plib \
README.OpenAL \
README.OSG \
projects
SUBDIRS = simgear
dist-hook:
(cd $(top_srcdir); $(HOME)/Projects/FlightGear/admin/am2dsp.pl)
rm -rf `find $(distdir)/projects -name CVS`
#
# Rule to build RPM distribution package
#
rpm: dist
rpm -ta $(PACKAGE)-$(VERSION).tar.gz

16
README
View File

@@ -1 +1,15 @@
[ Nothing here at this time. ]
SimGear - Simulator Construction Tools
======================================
http://www.flightgear.org
SimGear is a set of open-source libraries designed to be used as building
blocks for quickly assembling 3d simulations, games, and visualization
applications.
SimGear is developed by the FlightGear project and also provides the base
for the FlightGear Flight Simulator.
Source code for SimGear is released under the GNU Library General Public
License (LGPL) - see COPYING for license details.
See INSTALL file for help on building SimGear.

View File

@@ -1,10 +1,9 @@
[This file is mirrored in both the FlightGear and SimGear packages.]
You *must* have OpenSceneGraph (OSG) installed to build this version of
You *must* have OpenSceneGraph (OSG) installed to build this version of
FlightGear.
Notice that FlightGear 1.9.0 requires at least version 2.7.8. Using earlier
versions of OSG will yield serious rendering bugs.
Notice that this version of SimGear/FlightGear requires at least OSG 3.0.0.
You can get the latest version of OSG from:
@@ -22,6 +21,6 @@ ccmake .
[ While running ccmake: press 'c' to configure, press 'c' once more, and
then press 'g' to generate and exit ]
make
make
sudo make install

161
README.cmake Normal file
View File

@@ -0,0 +1,161 @@
Getting started with CMake
==========================
(These instructions apply to Unix-like systems, including Cygwin and Mac. To
build using Visual Studio or some other IDE supported by CMake, most of the
information below still applies. Otherwise see
http://wiki.flightgear.org/Building_Flightgear for Windows specific build
instructions.)
Always compile in a separate directory to the code. For example, if the
code (eg, from Git) is at /home/curt/projects/simgear, you might create
/home/curt/projects/sgbuild. Change into the new directory, and run
cmake ../simgear
To generate standard Unix Makefiles in sgbuild.
Probably you want to specify an install prefix:
cmake ../simgear -DCMAKE_INSTALL_PREFIX=/usr
Note the install prefix is automatically searched for required libraries
and header files, so if you install PLIB, OpenSceneGraph to the
same prefix, most configuration options are unnecessary.
If for some reason you have a dependency (or several) at a different prefix,
you can specify one or more via CMAKE_PREFIX_PATH:
cmake ../simgear -DCMAKE_PREFIX_PATH="/opt/local;/opt/fgfs"
(note the use of semi-colons to specify multiple prefix paths)
Standard prefixes are searched automatically (/usr, /usr/local, /opt/local)
Most dependencies also expose an environment variable to specify their
installation directory explicitly eg OSG_DIR or PLIBDIR. Any of the methods
described above will work, but specifying an INSTALL_PREFIX or PREFIX_PATH is
usually simpler.
By default, we select a release build. To create a debug build, use
cmake ../simgear -DCMAKE_BUILD_TYPE=Debug
(or MinSizeRel, or RelWithDbg)
Debug builds will automatically use corresponding debug builds of required
libraries, if they are available. For example you can install debug builds of
OpenSceneGraph, and a debug SimGear build will use them.
(Debug builds of libraries have the 'd' suffix by default - Release builds
have no additional suffix)
Note most IDE projects (eg Xcode and Visual Studio) support building all the
build types from the same project, so you can omit the CMAKE_BUILD_TYPE option
when running cmake, and simply pick the build configuration as normal in the
IDE.
It's common to have several build directories with different build
configurations, eg
/home/curt/projects/simgear (the git clone)
/home/curt/projects/sgdebug
/home/curt/projects/sgrelease
/home/curt/projects/sg-with-svn-osg
To set an optional feature, do
cmake ../simgear -DFEATURE_NAME=ON
(or 'OFF' to disable )
To see the variables that can be configured / are currently defined, you can
run one of the GUI front ends, or the following command:
cmake ../simgear -L
Add 'A' to see all the options (including advanced options), or 'H' to see
the help for each option (similar to running configure --help under autoconf):
cmake ../simgear -LH
Build Targets
=============
For a Unix makefile build, 'make dist', 'make uninstall' and 'make test' are
all available and should work as expected. 'make clean' is also as normal,
but there is *no* 'make distclean' target. The equivalent is to completely
remove your build directory, and start with a fresh one.
Adding new files to the build
Add source files to the SOURCES list, and headers to the HEADERS list. Note
technically you only need to add source files, but omitting headers confuses
project generation and distribution / packaging targets.
For target conditional files, you can append to the SOURCES or HEADERS lists
inside an if() test, for example:
if(APPLE)
list(APPEND SOURCES extraFile1.cxx extraFile2.cxx)
endif()
Setting include directories
In any CMakeList.txt, you can do the following:
include_directories(${PROJECT_SOURCE_DIR}/some/path)
For example, this can be done in particular subdirectory, or at the project
root, or an intermediate level.
Setting target specific compile flags, includes or defines
Use set_target_property(), for example
set_target_property(fgfs PROPERTIES
COMPILE_DEFINITIONS FOO BAR=1)
You can set a property on an individual source file:
set_property(SOURCE myfile.cxx PROPERTY COMPILE_FLAGS "-Wno-unsigned-compare")
Detecting Features / Libraries
For most standard libraries (Gtk, wxWidget, Python, GDAL, Qt, libXml, Boost),
cmake provides a standard helper. To see the available modules, run:
cmake --help-module-list
In the root CMakeLists file, use a statement like:
find_package(OpenGL REQUIRED)
Each package helper sets various variables such aaa_FOUND, aaa_INCLUDE_DIR,
and aaa_LIBRARY. Depending on the complexity of the package, these variables
might have different names (eg, OPENSCENEGRAPH_LIBRARIES).
If there's no standard helper for a library you need, find a similar one, copy
it to CMakeModules/FindABC.cmake, and modify the code to fit. Generally this
is pretty straightforward. The built-in modules reside in the Cmake 'share'
directory, eg /usr/share/cmake/modules on Unix systems.
Note libraries support by pkg-config can be handled directly, with no need
to create a custom FindABC helper.
Adding a new executable target
add_executable(myexecutable ${SOURCES} ${HEADERS})
target_link_libraries(myexecutable .... libraries ... )
install(TARGETS myexecutable RUNTIME DESTINATION bin)
(If the executable should not be installed, omit the final line above)
If you add an additional line
add_test(testname ${EXECUTABLE_OUTPUT_PATH}/myexecutable)
Then running 'make test' will run your executable as a unit test. The
executable should return either a success or failure result code.

1
TODO
View File

@@ -1 +0,0 @@
03/25/2001 - Resolve location of Sky dome implimentation documentation.

View File

@@ -1,706 +0,0 @@
dnl
dnl originally from ncftp 2.3.0
dnl added wi_EXTRA_PDIR and wi_ANSI_C
dnl $Id$
dnl
AC_DEFUN([wi_EXTRA_IDIR], [
incdir="$1"
if test -r $incdir ; then
already=""
for CPPflag in $CPPFLAGS ; do
if test "_$CPPflag" = "_-I${incdir}" ; then
already=yes
break
fi
done
if test -n "$already" ; then
echo " + already had -I$incdir" 1>&AS_MESSAGE_LOG_FD
else
if test "$CPPFLAGS" = "" ; then
CPPFLAGS="-I$incdir"
else
CPPFLAGS="$CPPFLAGS -I$incdir"
fi
echo " + added -I$incdir" 1>&AS_MESSAGE_LOG_FD
fi
else
echo " + IDIR is not accessible: '$myincdir'" 1>&AS_MESSAGE_LOG_FD
fi
])
dnl
dnl
dnl
dnl
AC_DEFUN([wi_EXTRA_LDIR], [
mylibdir="$1"
if test -r $mylibdir ; then
already=""
for LDflag in $LDFLAGS ; do
if test "_$LDflag" = "_-L${mylibdir}" ; then
already=yes
break
fi
done
if test -n "$already" ; then
echo " + already had -L$mylibdir" 1>&AS_MESSAGE_LOG_FD
else
if test "$LDFLAGS" = "" ; then
LDFLAGS="-L$mylibdir"
else
LDFLAGS="$LDFLAGS -L$mylibdir"
fi
echo " + added -L$mylibdir" 1>&AS_MESSAGE_LOG_FD
fi
else
echo " + LDIR is not accessible: '$mylibdir'" 1>&AS_MESSAGE_LOG_FD
fi
])
dnl
dnl __FP__
dnl
dnl
AC_DEFUN([wi_EXTRA_PDIR], [
progdir="$1"
if test -r $progdir ; then
case ":$PATH:" in
*:${progdir}:*)
echo " + already had $progdir in \$PATH" 1>&AS_MESSAGE_LOG_FD
;;
*)
if test "$PATH" = "" ; then
PATH="$progdir"
else
PATH="$PATH:$progdir"
fi
echo " + appended $progdir to \$PATH" 1>&AS_MESSAGE_LOG_FD
;;
esac
else
echo " + PDIR is not accessible: '$progdir'" 1>&AS_MESSAGE_LOG_FD
fi
])
dnl
dnl
dnl If you want to also look for include and lib subdirectories in the
dnl $HOME tree, you supply "yes" as the first argument to this macro.
dnl
dnl If you want to look for subdirectories in include/lib directories,
dnl you pass the names in argument 3, otherwise pass a dash.
dnl
AC_DEFUN([wi_EXTRA_DIRS], [echo "checking for extra include and lib directories..." 1>&6
ifelse([$1], yes, [dnl
b1=`cd .. ; pwd`
b2=`cd ../.. ; pwd`
exdirs="$HOME $j $b1 $b2 $prefix $2"
],[dnl
exdirs="$prefix $2"
])
subexdirs="$3"
if test "$subexdirs" = "" ; then
subexdirs="-"
fi
for subexdir in $subexdirs ; do
if test "$subexdir" = "-" ; then
subexdir=""
else
subexdir="/$subexdir"
fi
for exdir in $exdirs ; do
if test "$exdir" != "/usr" || test "$subexdir" != ""; then
incdir="${exdir}/include${subexdir}"
wi_EXTRA_IDIR($incdir)
dnl On 64-bit machines, if lib64/ exists and is not identical to lib/
dnl then it should be listed here, listed ahead of lib/.
mylibdir64="${exdir}/lib64${subexdir}"
mylibdir32="${exdir}/lib${subexdir}"
if test "x86_64" = $(uname -m) \
-a ! ${mylibdir64} -ef ${mylibdir32} ; then
wi_EXTRA_LDIR($mylibdir64)
fi
wi_EXTRA_LDIR($mylibdir32)
progdir="${exdir}/bin${subexdir}"
wi_EXTRA_PDIR($progdir)
fi
done
done
])
dnl
dnl
dnl
AC_DEFUN([wi_HPUX_CFLAGS],
[AC_MSG_CHECKING(if HP-UX ansi C compiler flags are needed)
AC_REQUIRE([AC_PROG_CC])
os=`uname -s | tr '[A-Z]' '[a-z]'`
ac_cv_hpux_flags=no
if test "$os" = hp-ux ; then
if test "$ac_cv_prog_gcc" = yes ; then
if test "$CFLAGS" != "" ; then
# Shouldn't be in there.
CFLAGS=`echo "$CFLAGS" | sed 's/-Aa//g'`
fi
else
# If you're not using gcc, then you better have a cc/c89
# that is usable. If you have the barebones compiler, it
# won't work. The good compiler uses -Aa for the ANSI
# compatible stuff.
x=`echo $CFLAGS | grep 'Aa' 2>/dev/null`
if test "$x" = "" ; then
CFLAGS="$CFLAGS -Aa"
fi
ac_cv_hpux_flags=yes
fi
# Also add _HPUX_SOURCE to get the extended namespace.
x=`echo $CFLAGS | grep '_HPUX_SOURCE' 2>/dev/null`
if test "$x" = "" ; then
CFLAGS="$CFLAGS -D_HPUX_SOURCE"
fi
fi
AC_MSG_RESULT($ac_cv_hpux_flags)
])
dnl
dnl
dnl
AC_DEFUN([wi_CFLAGS], [AC_REQUIRE([AC_PROG_CC])
wi_HPUX_CFLAGS
if test "$CFLAGS" = "" ; then
CFLAGS="-O"
elif test "$ac_cv_prog_gcc" = "yes" ; then
case "$CFLAGS" in
*"-g -O"*)
#echo "using -g as default gcc CFLAGS" 1>&6
CFLAGS=`echo $CFLAGS | sed 's/-g\ -O/-O/'`
;;
*"-O -g"*)
# Leave the -g, but remove all -O options.
#echo "using -g as default gcc CFLAGS" 1>&6
CFLAGS=`echo $CFLAGS | sed 's/-O\ -g/-O/'`
;;
esac
fi
])
dnl
dnl
dnl
AC_DEFUN([wi_PROTOTYPES], [
AC_MSG_CHECKING(if the compiler supports function prototypes)
AC_TRY_COMPILE(,[extern void exit(int status);],[wi_cv_prototypes=yes
AC_DEFINE(PROTOTYPES)],wi_cv_prototypes=no)
AC_MSG_RESULT($wi_cv_prototypes)
])
dnl
dnl
dnl
AC_DEFUN([wi_ANSI_C], [
AC_MSG_CHECKING(ANSI-style function definitions)
AC_TRY_COMPILE(,[int blubb(int x) { return 0; }],[wi_cv_ansi_funcs=yes
AC_DEFINE(ANSI_FUNCS)],wi_cv_ansi_funcs=no)
AC_MSG_RESULT($wi_cv_ansi_funcs)
])
dnl
dnl
dnl
AC_DEFUN([wi_HEADER_SYS_SELECT_H], [
# See if <sys/select.h> is includable after <sys/time.h>
if test "$ac_cv_header_sys_time_h" = no ; then
AC_CHECK_HEADERS(sys/time.h sys/select.h)
else
AC_CHECK_HEADERS(sys/select.h)
fi
if test "$ac_cv_header_sys_select_h" = yes ; then
AC_MSG_CHECKING([if <sys/select.h> is compatible with <sys/time.h>])
selecth=yes
if test "$ac_cv_header_sys_time_h" = yes ; then
AC_TRY_COMPILE([#include <sys/time.h>
#include <sys/select.h>],[
fd_set a;
struct timeval tmval;
tmval.tv_sec = 0;],selecth=yes,selecth=no)
if test "$selecth" = yes ; then
AC_DEFINE(CAN_USE_SYS_SELECT_H)
fi
fi
AC_MSG_RESULT($selecth)
fi
])
dnl
dnl
dnl
AC_DEFUN([wi_LIB_RESOLV], [
# See if we could access two well-known sites without help of any special
# libraries, like resolv.
AC_TRY_RUN([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
main()
{
struct hostent *hp1, *hp2;
int result;
hp1 = gethostbyname("gatekeeper.dec.com");
hp2 = gethostbyname("ftp.ncsa.uiuc.edu");
result = ((hp1 != (struct hostent *) 0) && (hp2 != (struct hostent *) 0));
exit(! result);
}],look_for_resolv=no,look_for_resolv=yes,look_for_resolv=yes)
AC_MSG_CHECKING([if we need to look for -lresolv])
AC_MSG_RESULT($look_for_resolv)
if test "$look_for_resolv" = yes ; then
AC_CHECK_LIB(resolv,main)
else
ac_cv_lib_resolv=no
fi
])
dnl
dnl
dnl
AC_DEFUN([wi_LIB_NSL], [
AC_MSG_CHECKING(if we can use -lnsl)
ac_save_LIBS="$LIBS";
LIBS="$LIBS -lnsl";
AC_CACHE_VAL(r_cv_use_libnsl, [
AC_TRY_RUN(
main() { if (getpwuid(getuid())) exit(0); exit(-1); },
nc_cv_use_libnsl=yes, nc_cv_use_libnsl=no, nc_cv_use_libnsl=no)
])
if test "$nc_cv_use_libnsl" = "no"; then LIBS="$ac_save_LIBS"; fi
AC_MSG_RESULT($nc_cv_use_libnsl)
])dnl
dnl
dnl
dnl
AC_DEFUN([nc_PATH_PROG_ZCAT], [
AC_PATH_PROG(GZCAT,gzcat)
AC_PATH_PROG(ZCAT,zcat)
if test "x$GZCAT" = x ; then
if test "x$ZCAT" != x ; then
# See if zcat is really gzcat. gzcat has a --version option, regular
# zcat does not.
AC_MSG_CHECKING(if zcat is really gzcat in disguise)
if $ZCAT --version 2> /dev/null ; then
AC_DEFINE_UNQUOTED(GZCAT, "$ZCAT")
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi
fi
else
AC_DEFINE_UNQUOTED(GZCAT, "$GZCAT")
fi
if test "x$ZCAT" != x ; then
AC_DEFINE_UNQUOTED(ZCAT, "$ZCAT")
fi
])
dnl
dnl
dnl
AC_DEFUN([wi_SYSV_EXTRA_DIRS], [
# Use System V because their curses extensions are required. This must
# be done early so we use the -I and -L in the library checks also.
# This is mostly a Solaris/SunOS hack. Note that doing this will also
# use all of the other System V libraries and headers.
AC_MSG_CHECKING(for alternative System V libraries)
if test -f /usr/5include/curses.h ; then
CPPFLAGS="$CPPFLAGS -I/usr/5include"
LDFLAGS="$LDFLAGS -L/usr/5lib"
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
fi
])
dnl
dnl
dnl
AC_DEFUN([wi_DEFINE_UNAME], [
# Get first 127 chars of all uname information. Some folks have
# way too much stuff there, so grab only the first 127.
unam=`uname -a 2>/dev/null | cut -c1-127`
if test "$unam" != "" ; then
AC_DEFINE_UNQUOTED(UNAME, "$unam")
fi
])
dnl
dnl
dnl
AC_DEFUN([wi_READLINE_WITH_NCURSES], [
# Readline and Ncurses could both define "backspace".
# Warn about this if we have both things in our definitions list.
if test "$ac_cv_lib_readline" = yes && test "$ac_cv_lib_ncurses" = yes ; then
AC_MSG_CHECKING(if readline and ncurses will link together)
j="$LIBS"
LIBS="-lreadline -lncurses"
AC_TRY_LINK(,[
readline("prompt");
endwin();
],k=yes,k=no)
if test "$k" = no ; then
AC_MSG_RESULT(no)
# Remove '-lreadline' from LIBS.
LIBS=`echo $j | sed s/-lreadline//g`
ac_cv_lib_readline=no
AC_WARN([The versions of GNU readline and ncurses you have installed on this system
can't be used together, because they use the same symbol, backspace. If
possible, recompile one of the libraries with -Dbackspace=back_space, then
re-run configure.])
else
AC_MSG_RESULT(yes)
LIBS="$j"
fi
fi
])
dnl
dnl
dnl
dnl AC_EXT_DAYLIGHT
dnl Check for an external variable daylight. Stolen from w3c-libwww.
AC_DEFUN([AC_EXT_DAYLIGHT],
[ AC_MSG_CHECKING(int daylight variable)
AC_TRY_COMPILE([#include <time.h>], [return daylight;],
have_daylight=yes,
have_daylight=no)
AC_MSG_RESULT($have_daylight)
])dnl
dnl AC_EXT_TIMEZONE
dnl Check for an external variable timezone. Stolen from tcl-8.0.
AC_DEFUN([AC_EXT_TIMEZONE],
[
#
# Its important to include time.h in this check, as some systems (like convex)
# have timezone functions, etc.
#
have_timezone=no
AC_MSG_CHECKING([long timezone variable])
AC_TRY_COMPILE([#include <time.h>],
[extern long timezone;
timezone += 1;
exit (0);],
[have_timezone=yes
AC_MSG_RESULT(yes)],
AC_MSG_RESULT(no))
#
# On some systems (eg IRIX 6.2), timezone is a time_t and not a long.
#
if test "$have_timezone" = no; then
AC_MSG_CHECKING([time_t timezone variable])
AC_TRY_COMPILE([#include <time.h>],
[extern time_t timezone;
timezone += 1;
exit (0);],
[have_timezone=yes
AC_MSG_RESULT(yes)],
AC_MSG_RESULT(no))
fi
])dnl
## AC_BZ_SET_COMPILER: Addition by Theodore Papadopoulo
## Patch by Jim McKelvey: change sed -e 's/ /@/g' to sed -e 's/ /@/'
AC_DEFUN([AC_SG_SET_COMPILER],
[cxxwith=`echo $1 | sed -e 's/ /@/'`
case "$cxxwith" in
*:*@*) # Full initialization syntax
CXX=`echo "$cxxwith" | sed -n -e 's/.*:\(.*\)@.*/\1/p'`
CXXFLAGS=`echo "$cxxwith" | sed -n -e 's/.*:.*@\(.*\)/\1/p'`
;;
*:*) # Simple initialization syntax
CXX=`echo "$cxxwith" | sed -n -e 's/.*:\(.*\)/\1/p'`
CXXFLAGS=$3
;;
*) # Default values
CXX=$2
CXXFLAGS=$3
CC="$2 --c"
## CFLAGS=
;;
esac])
pushdef([AC_PROG_INSTALL],
[
dnl our own version, testing for a -p flag
popdef([AC_PROG_INSTALL])
dnl as AC_PROG_INSTALL works as it works we first have
dnl to save if the user didn't specify INSTALL, as the
dnl autoconf one overwrites INSTALL and we have no chance to find
dnl out afterwards
AC_PROG_INSTALL
# OK, user hasn't given any INSTALL, autoconf found one for us
# now we test, if it supports the -p flag
AC_MSG_CHECKING(for -p flag to install)
rm -f confinst.$$.* > /dev/null 2>&1
echo "Testtest" > confinst.$$.orig
ac_res=no
if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then
if test -f confinst.$$.new ; then
# OK, -p seems to do no harm to install
INSTALL="${INSTALL} -p"
ac_res=yes
fi
fi
rm -f confinst.$$.*
AC_MSG_RESULT($ac_res)
dnl the following tries to resolve some signs and wonders coming up
dnl with different autoconf/automake versions
dnl e.g.:
dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s
dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS)
dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s
dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has
dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the
dnl install-@DIR@PROGRAMS targets to explicitly use that flag
dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as
dnl INSTALL_SCRIPT, which breaks with automake <= 1.4
dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure
dnl to clean up that mess we:
dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG
dnl which cleans KDE's program with automake > 1.4;
dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems
dnl with automake<=1.4
dnl note that dues to this sometimes two '-s' flags are used
INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)'
INSTALL_SCRIPT='${INSTALL}'
])dnl
# ===========================================================================
# http://autoconf-archive.cryp.to/ax_boost_base.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_BOOST_BASE([MINIMUM-VERSION])
#
# DESCRIPTION
#
# Test for the Boost C++ libraries of a particular version (or newer)
#
# If no path to the installed boost library is given the macro searchs
# under /usr, /usr/local, /opt and /opt/local and evaluates the
# $BOOST_ROOT environment variable. Further documentation is available at
# <http://randspringer.de/boost/index.html>.
#
# This macro calls:
#
# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
#
# And sets:
#
# HAVE_BOOST
#
# LAST MODIFICATION
#
# 2008-04-12
#
# COPYLEFT
#
# Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
#
# Copying and distribution of this file, with or without modification, are
# permitted in any medium without royalty provided the copyright notice
# and this notice are preserved.
AC_DEFUN([AX_BOOST_BASE],
[
AC_ARG_WITH([boost],
AS_HELP_STRING([--with-boost@<:@=DIR@:>@], [use boost (default is yes) - it is possible to specify the root directory for boost (optional)]),
[
if test "$withval" = "no"; then
want_boost="no"
elif test "$withval" = "yes"; then
want_boost="yes"
ac_boost_path=""
else
want_boost="yes"
ac_boost_path="$withval"
fi
],
[want_boost="yes"])
AC_ARG_WITH([boost-libdir],
AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
[Force given directory for boost libraries. Note that this will overwrite library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
[
if test -d $withval
then
ac_boost_lib_path="$withval"
else
AC_MSG_ERROR(--with-boost-libdir expected directory name)
fi
],
[ac_boost_lib_path=""]
)
if test "x$want_boost" = "xyes"; then
boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
if test "x$boost_lib_version_req_sub_minor" = "x" ; then
boost_lib_version_req_sub_minor="0"
fi
WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
succeeded=no
dnl first we check the system location for boost libraries
dnl this location ist chosen if boost libraries are installed with the --layout=system option
dnl or if you install boost with RPM
if test "$ac_boost_path" != ""; then
BOOST_LDFLAGS="-L$ac_boost_path/lib"
BOOST_CPPFLAGS="-I$ac_boost_path/include"
else
for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
BOOST_LDFLAGS="-L$ac_boost_path_tmp/lib"
BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
break;
fi
done
fi
dnl overwrite ld flags if we have required special directory with
dnl --with-boost-libdir parameter
if test "$ac_boost_lib_path" != ""; then
BOOST_LDFLAGS="-L$ac_boost_lib_path"
fi
CPPFLAGS_SAVED="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
export CPPFLAGS
LDFLAGS_SAVED="$LDFLAGS"
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
export LDFLAGS
AC_LANG_PUSH(C++)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
@%:@include <boost/version.hpp>
]], [[
#if BOOST_VERSION >= $WANT_BOOST_VERSION
// Everything is okay
#else
# error Boost version is too old
#endif
]])],[
AC_MSG_RESULT(yes)
succeeded=yes
found_system=yes
],[
])
AC_LANG_POP([C++])
dnl if we found no boost with system layout we search for boost libraries
dnl built and installed without the --layout=system option or for a staged(not installed) version
if test "x$succeeded" != "xyes"; then
_version=0
if test "$ac_boost_path" != ""; then
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
V_CHECK=`expr $_version_tmp \> $_version`
if test "$V_CHECK" = "1" ; then
_version=$_version_tmp
fi
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
done
fi
else
for ac_boost_path in /usr /usr/local /opt /opt/local ; do
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
V_CHECK=`expr $_version_tmp \> $_version`
if test "$V_CHECK" = "1" ; then
_version=$_version_tmp
best_path=$ac_boost_path
fi
done
fi
done
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
if test "$ac_boost_lib_path" = ""
then
BOOST_LDFLAGS="-L$best_path/lib"
fi
if test "x$BOOST_ROOT" != "x"; then
if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/lib" && test -r "$BOOST_ROOT/stage/lib"; then
version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
V_CHECK=`expr $stage_version_shorten \>\= $_version`
if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
BOOST_CPPFLAGS="-I$BOOST_ROOT"
BOOST_LDFLAGS="-L$BOOST_ROOT/stage/lib"
fi
fi
fi
fi
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
export CPPFLAGS
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
export LDFLAGS
AC_LANG_PUSH(C++)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
@%:@include <boost/version.hpp>
]], [[
#if BOOST_VERSION >= $WANT_BOOST_VERSION
// Everything is okay
#else
# error Boost version is too old
#endif
]])],[
AC_MSG_RESULT(yes)
succeeded=yes
found_system=yes
],[
])
AC_LANG_POP([C++])
fi
if test "$succeeded" != "yes" ; then
if test "$_version" = "0" ; then
AC_MSG_ERROR([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
else
AC_MSG_ERROR([Your boost libraries seems to old (version $_version).])
fi
else
AC_SUBST(BOOST_CPPFLAGS)
AC_SUBST(BOOST_LDFLAGS)
AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
fi
CPPFLAGS="$CPPFLAGS_SAVED"
LDFLAGS="$LDFLAGS_SAVED"
fi
])

View File

@@ -1,38 +0,0 @@
type = StaticLibrary,Multithreaded,
exclude_dir = threads
include_path = .
include_path = ..
include_path = .\SimGear
include_path = ..\zlib-1.2.3
include_path = "..\OpenAL 1.0 Software Development Kit\include"
define = _USE_MATH_DEFINES
define = _CRT_SECURE_NO_DEPRECATE
define = HAVE_CONFIG_H
# Rule to create simgear_config.h
add_source_file = SOURCE=.\simgear\simgear_config.h.vc5\
\
!IF "$(CFG)" == "SimGear - Win32 Release"\
\
# Begin Custom Build - Creating config.h\
InputPath=.\simgear\simgear_config.h.vc5\
\
".\simgear\simgear_config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\
copy .\simgear\simgear_config.h.vc5 .\simgear\simgear_config.h\
\
# End Custom Build\
\
!ELSEIF "$(CFG)" == "SimGear - Win32 Debug"\
\
# Begin Custom Build - Creating config.h\
InputPath=.\simgear\simgear_config.h.vc5\
\
".\simgear\simgear_config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"\
copy .\simgear\simgear_config.h.vc5 .\simgear\simgear_config.h\
\
# End Custom Build\
\
!ENDIF\

View File

@@ -1,52 +0,0 @@
#!/bin/sh
OSTYPE=`uname -s`
MACHINE=`uname -m`
AUTO_MAKE_VERSION=`automake --version | head -1 | awk '{print $4}' | sed -e 's/\.\([0-9]*\).*/\1/'`
if test $AUTO_MAKE_VERSION -lt 15; then
echo ""
echo "You need to upgrade to automake version 1.5 or greater."
echo "Most distributions have packages available to install or you can"
echo "find the source for the most recent version at"
echo "ftp://ftp.gnu.org/gnu/automake"
exit 1
fi
echo "Host info: $OSTYPE $MACHINE"
echo -n " automake: `automake --version | head -1 | awk '{print $4}'`"
echo " ($AUTO_MAKE_VERSION)"
echo ""
echo "Running aclocal"
aclocal
echo "Running autoheader"
autoheader
if [ ! -e simgear/simgear_config.h.in ]; then
echo "ERROR: autoheader didn't create simgear/simgear_config.h.in!"
exit 1
fi
echo "Running automake --add-missing"
automake --add-missing
echo "Running autoconf"
autoconf
if [ ! -e configure ]; then
echo "ERROR: configure was not created!"
exit 1
fi
echo ""
echo "======================================"
if [ -f config.cache ]; then
echo "config.cache exists. Removing the config.cache file will force"
echo "the ./configure script to rerun all it's tests rather than using"
echo "the previously cached values."
echo ""
fi
echo "Now you are ready to run './configure'"
echo "======================================"

View File

@@ -1,665 +0,0 @@
dnl Process this file with autoget.sh to produce a working configure
dnl script.
AC_INIT
AC_CONFIG_SRCDIR([simgear/bucket/newbucket.cxx])
dnl Require at least automake 2.52
AC_PREREQ(2.52)
dnl Initialize the automake stuff
AM_INIT_AUTOMAKE(SimGear, 2.0.0)
dnl Specify KAI C++ compiler and flags.
dnl Borrowed with slight modification from blitz distribution.
AC_ARG_WITH(cxx,
[ --with-cxx=COMPILER[:name-flags] set options for COMPILER (KCC)],
[case "$withval" in
KCC*) # KAI C++ http://www.kai.com/
echo "Configuring for KAI C++"
AC_SG_SET_COMPILER($withval,"KCC","--restrict --strict_warnings")
CXX_OPTIMIZE_FLAGS=="+K3 -O3"
CXX_DEBUG_FLAGS="-g +K0"
;;
esac
])
AC_MSG_CHECKING([CXX])
AC_MSG_RESULT([$CXX])
AC_MSG_CHECKING([CC])
AC_MSG_RESULT([$CC])
dnl Checks for programs.
AC_PROG_MAKE_SET
AC_PROG_CC
AC_PROG_CPP
AC_PROG_CXX
AC_PROG_CXXCPP
AC_PROG_RANLIB
AC_PROG_INSTALL
AC_PROG_LN_S
AX_BOOST_BASE([1.37.0])
if test "x$BOOST_CPPFLAGS" != "x-I/usr/include" ; then
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
fi
dnl set the $host variable based on local machine/os
AC_CANONICAL_HOST
dnl Used on the Irix platform
case "${host}" in
*-*-irix*)
if test "x$CXX" = "xCC" -o "x$CXX" = "xccache CC"; then
AR="$CXX -ar"
ARFLAGS="-o"
CXXFLAGS="$CXXFLAGS -I$(top_srcdir)/simgear/compatibility/MIPSpro740"
compatibility_DIR="compatibility"
MIPSpro_DIRS="MIPSpro740"
AC_MSG_CHECKING([for MIPSpro compiler version 7.4 or newer])
AC_TRY_RUN([
int main() {
if ( _COMPILER_VERSION < 740 ) {
return -1;
}
return 0;
}
], AC_MSG_RESULT(yes),
[ AC_MSG_RESULT(no)
CXXFLAGS="$CXXFLAGS -I$(top_srcdir)/simgear/compatibility/MIPSpro721"
MIPSpro_DIRS="$(MIPSpro_DIRS) MIPSpro721"
AC_MSG_WARN([Using our own subset of the STL headers])
], AC_MSG_RESULT(yes))
AC_SUBST(MIPSpro_DIRS)
fi
;;
*)
AR="ar"
ARFLAGS="cru"
compatibility_DIR=
;;
esac
AC_SUBST(AR)
AC_SUBST(ARFLAGS)
AC_SUBST(compatibility_DIR)
if echo $includedir | egrep "simgear$" > /dev/null; then
echo "includedir is" $includedir "libdir is" $libdir
else
includedir="${includedir}/simgear"
echo "includedir changed to" $includedir "libdir is" $libdir
fi
dnl set logging; default value of with_logging=yes
AC_ARG_WITH(logging, [ --with-logging Include logging output (default)])
if test "x$with_logging" = "xno" ; then
AC_DEFINE([FG_NDEBUG], 1, [Define for no logging output])
fi
# Specify if we want to build with Norman's jpeg image server support.
# This requires libjpeg to be installed and available.
# Default to with_jpeg_server=no
JPEGLIB=''
AC_ARG_WITH(jpeg_factory, [ --with-jpeg-factory Include Norman's jpeg image factory support code])
if test "x$with_jpeg_factory" = "xyes" ; then
echo "Building with Norman's jpeg image factory support"
AC_CHECK_LIB(jpeg, jpeg_start_compress)
if test "x$ac_cv_lib_jpeg_jpeg_start_compress" != "xyes" ; then
echo
echo "In order to build the jpeg factory code you need libjpeg installed."
echo "otherwise please configure with the --with-jpeg-sever=no option"
echo
echo "libjpeg is available at :"
echo " ftp://ftp.uu.net in the directory graphics/jpeg"
exit 1
fi
else
echo "Building without Norman's jpeg image server support"
fi
AM_CONDITIONAL(ENABLE_JPEG_SERVER, test "x$with_jpeg_factory" = "xyes")
# specify the plib location
AC_ARG_WITH(plib, [ --with-plib=PREFIX Specify the prefix path to plib])
if test "x$with_plib" != "x" ; then
echo "plib prefix is $with_plib"
EXTRA_DIRS="${EXTRA_DIRS} $with_plib"
fi
AC_ARG_WITH(plib_framework, [ --with-plib-framework=PREFIX Specify the prefix path to PLIB.framework ])
if test "x$with_plib_framework" != "x"; then
echo "plib framework prefix is $with_plib_framework"
fi
# specify the osg location
AC_ARG_WITH(osg, [ --with-osg=PREFIX Specify the prefix path to osg])
if test "x$with_osg" != "x" ; then
echo "osg prefix is $with_osg"
EXTRA_DIRS="${EXTRA_DIRS} $with_osg"
fi
AC_ARG_WITH(osg_framework, [ --with-osg-framework=PREFIX Specify the prefix path to OSG.framework ])
if test "x$with_osg_framework" != "x"; then
echo "osg framework prefix is $with_osg_framework"
CPPFLAGS = "$CPPFLAGS -F$with-osg-framework"
export DYLD_FRAMEWORK_PATH="$DYLD_FRAMEWORK_PATH:$with_osg_framework"
fi
dnl specifying OpenAL.framework (for user provided OpenAL.framework / ALUT)
AC_ARG_WITH(openal_framework, [ --with-openal-framework=PREFIX Speicfy the prefix path to OpenAL.framework ])
if test "x$with_openal_framework" != "x"; then
echo "OpenAL framework prefix is $with_openal_framework"
fi
dnl Determine an extra directories to add to include/lib search paths
case "${host}" in
*-apple-darwin* | *-*-cygwin* | *-*-mingw32*)
echo no EXTRA_DIRS for $host
;;
*)
if test -d /usr/X11R6 ; then
EXTRA_DIR1="/usr/X11R6"
fi
if test -d /opt/X11R6 ; then
EXTRA_DIR2="/opt/X11R6"
fi
EXTRA_DIRS="${EXTRA_DIRS} $EXTRA_DIR1 $EXTRA_DIR2"
;;
esac
wi_EXTRA_DIRS(no, ${EXTRA_DIRS})
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 X11 might be installed on Mac OS X or cygwin/mingwin, we don't want
dnl to use it if it is.
case "${host}" in
*-apple-darwin* | *-*-cygwin* | *-*-mingw32*)
echo no fancy X11 check
;;
*)
AC_PATH_XTRA
;;
esac
dnl Checks for libraries.
dnl Thread related checks
AC_CHECK_HEADER(pthread.h)
AC_SEARCH_LIBS(pthread_exit, [pthread c_r])
if test "x$ac_cv_header_pthread_h" = "xyes"; then
CXXFLAGS="$CXXFLAGS -D_REENTRANT"
CFLAGS="$CFLAGS -D_REENTRANT"
if test "x$ac_cv_search_pthread_exit" = "x-lc_r"; then
CXXFLAGS="-pthread $CXXFLAGS"
CFLAGS="-pthread $CFLAGS"
fi
fi
AM_CONDITIONAL(HAVE_THREADS, test "x$ac_cv_header_pthread_h" = "xyes")
thread_LIBS="$LIBS"
LIBS=""
dnl search for network related libraries
AC_SEARCH_LIBS(inet_addr, xnet)
AC_SEARCH_LIBS(socket, socket)
network_LIBS="$LIBS"
LIBS=""
dnl check for some default libraries
AC_SEARCH_LIBS(cos, m)
AC_SEARCH_LIBS(clock_gettime, rt)
base_LIBS="$LIBS"
dnl check for OpenGL related libraries
case "${host}" in
*-*-cygwin* | *-*-mingw32*)
dnl CygWin under Windoze.
echo Win32 specific hacks...
AC_DEFINE([WIN32], 1, [Define for Win32 platforms])
AC_DEFINE([NOMINMAX], 1, [Define for Win32 platforms])
LIBS="$LIBS -lglu32 -lopengl32"
LIBS="$LIBS -luser32 -lgdi32 -lwinmm"
dnl add -lwsock32 for mingwin
case "${host}" in
*-*-mingw32*)
base_LIBS="$base_LIBS -lws2_32"
;;
esac
echo "Will link apps with $LIBS"
;;
*-apple-darwin*)
dnl Mac OS X
LIBS="$LIBS -framework OpenGL -framework Carbon -lobjc"
;;
*)
dnl X-Windows based machines
AC_SEARCH_LIBS(XCreateWindow, X11)
AC_SEARCH_LIBS(XShmCreateImage, Xext)
AC_SEARCH_LIBS(XGetExtensionVersion, Xi)
AC_SEARCH_LIBS(IceOpenConnection, ICE)
AC_SEARCH_LIBS(SmcOpenConnection, SM)
AC_SEARCH_LIBS(XtMalloc, Xt)
AC_SEARCH_LIBS(XmuLookupStandardColormap, Xmu)
AC_SEARCH_LIBS(glNewList, [ GL GLcore MesaGL ])
if test "x$ac_cv_search_glNewList" = "x-lGLcore"; then
dnl if GLcore found, then also check for GL
AC_SEARCH_LIBS(glXCreateContext, GL)
fi
dnl if using mesa, check for xmesa.h
if test "x$ac_cv_search_glNewList" = "x-lMesaGL"; then
AC_CHECK_HEADER(GL/fxmesa.h)
if test "x$ac_cv_header_GL_fxmesa_h" = "xyes"; then
AC_DEFINE([XMESA], 1, [Define for fxmesa])
AC_DEFINE([FX], 1, [Define for fxmesa])
fi
fi
AC_SEARCH_LIBS(gluLookAt, [ GLU MesaGLU ])
;;
esac
AC_SEARCH_LIBS(glutGetModifiers, [ glut glut32 freeglut ], have_glut=yes, have_glut=no)
AM_CONDITIONAL(HAVE_GLUT, test "x$have_glut" = "xyes")
opengl_LIBS="$LIBS"
LIBS="$base_LIBS"
dnl check for OpenAL libraries
OPENAL_OK="no"
ALUT_OK="no"
case "${host}" in
*-*-cygwin* | *-*-mingw32*)
dnl CygWin under Windoze.
INCLUDES="$INCLUDES -I/usr/local/include/"
LIBS="$LIBS -L/usr/local/lib"
AC_SEARCH_LIBS(alGenBuffers, [ openal32 openal 'openal -ldsound -lwinmm' ] )
AC_SEARCH_LIBS(alutInit, [ openal32 ALut alut ] )
LIBS="$LIBS -lwinmm -ldsound -ldxguid -lole32"
openal_LIBS="$LIBS"
OPENAL_OK="$ac_cv_search_alGenBuffers"
ALUT_OK="$ac_cv_search_alutInit"
;;
*-apple-darwin*)
dnl Mac OS X
LIBS="$LIBS -framework IOKit -framework OpenAL"
openal_LIBS="$LIBS"
OPENAL_OK="yes"
ALUT_OK="no"
if test "x$with_openal_lib" != "x"; then
echo "libopenal is not supported on Mac OS platform."
openal_LIBS=""
fi
OPENAL_OK="yes"
# Looking for alut.h, if found assume that it is a part of
# the OpenAL package.
AC_CHECK_HEADERS([OpenAL/alut.h],[ALUT_OK="yes"])
dnl Thank you Christian Bauer from SheepSaver
dnl Modified by Tatsuhiro Nishioka for accepting a given framework path
dnl AC_CHECK_FRAMEWORK($1=NAME, $2=INCLUDES, $3=FRAMEWORK_PATH) ; $3 is optional
AC_DEFUN([AC_CHECK_FRAMEWORK], [
AS_VAR_PUSHDEF([ac_Framework], [ac_cv_framework_$1])dnl
AC_CACHE_CHECK([whether compiler supports framework $1],
ac_Framework, [
saved_LIBS="$LIBS"
FRAMEWORKS="$FRAMEWORKS -framework $1"
if test "$3" = ""; then
FRAMEWORKS="$FRAMEWORKS $ADD2LD"
elif test "`echo $FRAMEWORKS | grep -- -F$3`" = ""; then
FRAMEWORKS="$FRAMEWORKS -F$3"
CXXFLAGS="$CXXFLAGS -F$3"
CCFLAGS="$CCFLAGS -F$3"
dnl This is needed for AC_TRY_LINK when a framework path is specified
export DYLD_FRAMEWORK_PATH="${DYLD_FRAMEWORK_PATH}:$3"
fi
AC_TRY_LINK(
[$2], [],
[AS_VAR_SET(ac_Framework, yes)], [AS_VAR_SET(ac_Framework, no); LIBS="$saved_LIBS"]
)
])
AS_IF([test AS_VAR_GET(ac_Framework) = yes],
[AC_DEFINE(AS_TR_CPP(HAVE_FRAMEWORK_$1), 1, [Define if framework $1 is available.])]
)
AS_VAR_POPDEF([ac_Framework])dnl
])
dnl Check for OpenAL.framework when --with-openal-framework is specified
dnl Of cource OpenAL.framework needs to have alut.h
if test "x$with_openal_framework" != "x"; then
AC_CHECK_FRAMEWORK(OpenAL, [#include <OpenAL/alut.h>], $with_openal_framework)
fi
;;
*)
dnl default unix style machines
save_LIBS=$LIBS
LIBS="$LIBS $thread_LIBS"
AC_SEARCH_LIBS(alGenBuffers, openal)
AC_SEARCH_LIBS(alutInit, [ alut openal ] )
OPENAL_OK="$ac_cv_search_alGenBuffers"
ALUT_OK="$ac_cv_search_alutInit"
openal_LIBS="$LIBS"
LIBS=$save_LIBS
;;
esac
if test "$OPENAL_OK" == "no"; then
echo
echo "You *must* have the openal library installed on your system to build"
echo "SimGear!"
echo
echo "Please see README.OpenAL for more details."
echo
echo "configure aborted."
exit
fi
if test "$ALUT_OK" == "no"; then
echo
echo "You *must* have the alut library installed on your system to build"
echo "SimGear!"
echo
echo "Please see README.OpenAL for more details."
echo
echo "configure aborted."
exit
fi
LIBS="$base_LIBS"
AC_SUBST(base_LIBS)
AC_SUBST(openal_LIBS)
AC_SUBST(opengl_LIBS)
AC_SUBST(thread_LIBS)
AC_SUBST(network_LIBS)
dnl Check for MS Windows environment
AC_CHECK_HEADER(windows.h)
AM_CONDITIONAL(EXTGL_NEEDED, test "x$ac_cv_header_windows_h" = "xyes")
# The following are C++ items that need to be tested for with the c++
# compiler
CXXCPP="g++ -E"
AC_LANG_PUSH(C++)
dnl Check for "plib" without which we cannot go on
case ${host} in
*-apple-darwin*)
# Check PLIB framework availability when with-plib-framework is specified
if test "x$with_plib_framework" != "x"; then
AC_CHECK_FRAMEWORK(PLIB, [#include <plib/ul.h>], $with_plib_framework)
plib_FRAMEWORK="$FRAMEWORKS"
FRAMEWORKS=""
AC_SUBST(plib_FRAMEWORK)
fi
;;
esac
AM_CONDITIONAL(HAVE_FRAMEWORK_PLIB, test "x$ac_cv_framework_PLIB" != "x")
AC_CHECK_HEADER(plib/ul.h)
AC_CHECK_LIB(plibul,ulInit)
if test "x$ac_cv_header_plib_ul_h" != "xyes" \
-o "x$ac_cv_lib_plibul_ulInit" != "xyes" ; then
echo
echo "You *must* have the plib library installed on your system to build"
echo "SimGear!"
echo
echo " LIBS: '$LIBS'"
echo " LDFLAGS: '$LDFLAGS'"
echo " CPPFLAGS: '$CPPFLAGS'"
echo
echo "Please see README.plib for more details."
echo
echo "configure aborted."
exit
fi
AC_MSG_CHECKING([for plib 1.8.5 or newer])
AC_TRY_RUN([
#include <plib/ul.h>
#define MIN_PLIB_VERSION 185
int main() {
if ( PLIB_VERSION < MIN_PLIB_VERSION ) {
return -1;
}
return 0;
}
],
AC_MSG_RESULT(yes),
[AC_MSG_RESULT(wrong version);
AC_MSG_ERROR([Install plib 1.8.5 or later first...])],
AC_MSG_RESULT(yes)
)
LIBS="$saved_LIBS"
# OpenSceneGraph
case "${host}" in
*-apple-darwin*)
if test "x$with_osg_framework" != "x"; then
# AC_CHECK_FRAMEWORK(osgViewer, [#include <osgViewer/Version>], $with_osg_framework)
# AC_CHECK_FRAMEWORK(osgGA, [#include <osgGA/Version>], $with_osg_framework)
# AC_CHECK_FRAMEWORK(osgText, [#include <osgText/Version>], $with_osg_framework)
# AC_CHECK_FRAMEWORK(osgFX, [#include <osgFX/AnisotropicLighting>], $with_osg_framework)
# AC_CHECK_FRAMEWORK(osgUtil, [#include <osgUtil/Version>], $with_osg_framework)
# AC_CHECK_FRAMEWORK(osgDB, [#include <osgDB/Version>], $with_osg_framework)
# AC_CHECK_FRAMEWORK(osgSim, [#include <osgSim/Version>], $with_osg_framework)
# AC_CHECK_FRAMEWORK(osgParticle, [#include <osgParticle/Version>], $with_osg_framework)
# AC_CHECK_FRAMEWORK(osg, [#include <osg/Version>], $with_osg_framework)
# osg_FRAMEWORKS="$FRAMEWORKS"
# FRAMEWORKS=""
# AC_SUBST(osg_FRAMEWORKS)
AC_CHECK_FRAMEWORK(OpenThreads, [#include <OpenThreads/Version>], $with_osg_framework)
openthreads_FRAMEWORK="$FRAMEWORKS"
FRAMEWORKS=""
AC_SUBST(openthreads_FRAMEWORK)
else
dnl
dnl This is needed when osg dynamic libs are specified
dnl instead of OSG frameworks on Mac OS X
dnl
AC_CHECK_LIB(OpenThreads,OpenThreadsGetVersion)
fi
;;
*)
if test "x$enable_osgdebug" = "xyes"; then
AC_CHECK_LIB(OpenThreadsd,OpenThreadsGetVersion)
else
AC_CHECK_LIB(OpenThreads,OpenThreadsGetVersion)
fi
;;
esac
AM_CONDITIONAL(HAVE_FRAMEWORK_OSG, test "x$ac_cv_framework_osg" != "x")
AC_CHECK_HEADER(osg/Version)
if test "x$ac_cv_header_osg_Version" != "xyes" -o "x$ac_cv_lib_OpenThreads_OpenThreadsGetVersion" != "xyes"; then
if test "x$ac_cv_framework_osg" != "xyes"; then
echo
echo "You *must* have the OpenThreads library installed on your system"
echo "to build this version of SimGear!"
echo " Maybe you need to specify --with-osg=DIR."
echo " Maybe you need to specify some LDFLAGS to help the linker."
echo
echo " LIBS: '$LIBS'"
echo " LDFLAGS: '$LDFLAGS'"
echo " CPPFLAGS: '$CPPFLAGS'"
echo
echo "Please see README.OSG for more details."
echo
echo "configure aborted."
exit
fi
fi
AC_CHECK_HEADER(boost/version.hpp)
if test "x$ac_cv_header_boost_version_hpp" != "xyes"; then
echo
echo "You *must* have the Boost library installed on your system"
echo "to build this version of SimGear!"
echo
echo " LIBS: '$LIBS'"
echo " LDFLAGS: '$LDFLAGS'"
echo " CPPFLAGS: '$CPPFLAGS'"
echo
echo "configure aborted."
exit
fi
AC_LANG_POP
dnl Check for system installed zlib
AC_CHECK_HEADER(zlib.h)
if test "x$ac_cv_header_zlib_h" != "xyes"; then
echo
echo "zlib library not found."
echo
echo "If your OS does not provide an installable package for zlib"
echo "you will have to compile and install it first yourself. A copy"
echo "of zlib-1.1.4.tar.gz is included with SimGear. You will"
echo "have to untar this source code, and follow its included instructions"
echo "to compile and install on your system."
echo
echo "configure aborted."
echo
fi
dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS( \
fcntl.h getopt.h malloc.h memory.h stdint.h stdlib.h sys/param.h \
sys/stat.h sys/time.h sys/timeb.h unistd.h values.h )
if test "x$ac_cv_header_stdint_h" = "xyes"; then
AC_DEFINE([HAVE_STDINT_H], 1, [Define if stdint.h exists])
fi
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
AC_TYPE_MODE_T
AC_HEADER_TIME
AC_STRUCT_TM
dnl Checks for library functions.
old_LIBS=$LIBS
LIBS="$base_LIBS $network_LIBS $opengl_LIBS"
AC_TYPE_SIGNAL
AC_FUNC_VPRINTF
AC_CHECK_FUNCS( [ \
ftime gettimeofday timegm memcpy bcopy mktime strstr rand \
random drand48 setitimer getitimer signal GetLocalTime rint getrusage ] )
LIBS=$old_LIBS
AM_CONFIG_HEADER(simgear/simgear_config.h)
AC_CONFIG_FILES([ \
Makefile \
SimGear.spec \
simgear/Makefile \
simgear/version.h \
simgear/compatibility/Makefile \
simgear/compatibility/MIPSpro721/Makefile \
simgear/compatibility/MIPSpro740/Makefile \
simgear/bucket/Makefile \
simgear/debug/Makefile \
simgear/ephemeris/Makefile \
simgear/io/Makefile \
simgear/magvar/Makefile \
simgear/math/Makefile \
simgear/environment/Makefile \
simgear/misc/Makefile \
simgear/nasal/Makefile \
simgear/props/Makefile \
simgear/route/Makefile \
simgear/scene/Makefile \
simgear/scene/bvh/Makefile \
simgear/scene/material/Makefile \
simgear/scene/model/Makefile \
simgear/scene/sky/Makefile \
simgear/scene/tgdb/Makefile \
simgear/scene/util/Makefile \
simgear/screen/Makefile \
simgear/serial/Makefile \
simgear/sound/Makefile \
simgear/structure/Makefile \
simgear/threads/Makefile \
simgear/timing/Makefile \
simgear/xml/Makefile \
])
AC_OUTPUT
echo ""
echo "Configure Summary"
echo "================="
echo "Prefix: $prefix"
if test "x$with_logging" != "x"; then
echo "Debug messages: $with_logging"
else
echo "Debug messages: yes"
fi
echo -n "Automake version: "
automake --version | head -1
if test "x$with_jpeg_factory" = "xyes"; then
echo "With JPEG Factory support"
else
echo "Without JPEG Factory support"
fi
if test "x$ac_cv_header_pthread_h" = "xyes"; then
echo "Threads: pthread lib found."
else
echo "Threads: no threads (pthread lib not found.)"
fi

View File

@@ -1,5 +0,0 @@
SimGear.ncb
SimGear.suo
*.user
Win32
x64

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +0,0 @@
Makefile
Makefile.in
simgear_config.h
simgear_config.h.in
stamp-h
stamp-h.in
stamp-h1
version.h

2
simgear/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
simgear_config.h
version.h

93
simgear/CMakeLists.txt Normal file
View File

@@ -0,0 +1,93 @@
file(WRITE ${PROJECT_BINARY_DIR}/simgear/version.h "#define SIMGEAR_VERSION ${SIMGEAR_VERSION}")
foreach( mylibfolder
bucket
debug
ephemeris
io
magvar
math
misc
nasal
props
serial
structure
threads
timing
xml
)
add_subdirectory(${mylibfolder})
endforeach( mylibfolder )
if(NOT SIMGEAR_HEADLESS)
add_subdirectory(environment)
add_subdirectory(screen)
add_subdirectory(scene)
add_subdirectory(sound)
endif(NOT SIMGEAR_HEADLESS)
if(ENABLE_RTI)
add_subdirectory(hla)
endif(ENABLE_RTI)
set(HEADERS compiler.h constants.h sg_inlines.h ${PROJECT_BINARY_DIR}/simgear/version.h)
install (FILES ${HEADERS} DESTINATION include/simgear/)
if(SIMGEAR_SHARED)
message(STATUS "Library building mode: SHARED LIBRARIES")
get_property(coreSources GLOBAL PROPERTY CORE_SOURCES)
get_property(sceneSources GLOBAL PROPERTY SCENE_SOURCES)
get_property(publicHeaders GLOBAL PROPERTY PUBLIC_HEADERS)
add_library(SimGearCore SHARED ${coreSources})
# set_property(TARGET SimGearCore PROPERTY FRAMEWORK 1)
# message(STATUS "public header: ${publicHeaders}")
# set_property(TARGET SimGearCore PROPERTY PUBLIC_HEADER "${publicHeaders}")
set_property(TARGET SimGearCore PROPERTY LINKER_LANGUAGE CXX)
set_property(TARGET SimGearCore PROPERTY VERSION ${SIMGEAR_VERSION})
set_property(TARGET SimGearCore PROPERTY SOVERSION ${SIMGEAR_SOVERSION})
target_link_libraries(SimGearCore ${ZLIB_LIBRARY} ${RT_LIBRARY})
install(TARGETS SimGearCore LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
if(LIBSVN_FOUND)
add_definitions(${APR_CFLAGS})
IF(APPLE)
set_property(SOURCE scene/tsync/terrasync.cxx PROPERTY COMPILE_FLAGS "-iwithsysroot ${LIBSVN_INCLUDE_DIR}")
ELSE()
include_directories(${LIBSVN_INCLUDE_DIR})
ENDIF(APPLE)
target_link_libraries(SimGearCore ${LIBSVN_LIBRARIES})
endif(LIBSVN_FOUND)
if(NOT SIMGEAR_HEADLESS)
add_library(SimGearScene SHARED ${sceneSources})
# set_property(TARGET SimGearScene PROPERTY FRAMEWORK 1)
# set_property(TARGET SimGearScene PROPERTY PUBLIC_HEADER "${publicHeaders}")
set_property(TARGET SimGearScene PROPERTY LINKER_LANGUAGE CXX)
set_property(TARGET SimGearScene PROPERTY VERSION ${SIMGEAR_VERSION})
set_property(TARGET SimGearScene PROPERTY SOVERSION ${SIMGEAR_SOVERSION})
target_link_libraries(SimGearScene
SimGearCore
${ZLIB_LIBRARY}
${OPENSCENEGRAPH_LIBRARIES}
${OPENAL_LIBRARY} ${ALUT_LIBRARY}
${OPENGL_LIBRARY}
${JPEG_LIBRARY})
install(TARGETS SimGearScene LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
else()
message(STATUS "Library building mode: STATIC LIBRARIES")
endif(SIMGEAR_SHARED)

View File

@@ -1,31 +0,0 @@
# METAR_DIRS =
METAR_DIRS = environment
EXTRA_DIST = simgear_config.h.vc5 simgear_config.h-msvc71 version.h.in
include_HEADERS = \
compiler.h constants.h sg_inlines.h version.h
SUBDIRS = \
$(compatibility_DIR) \
xml \
debug \
misc \
structure \
bucket \
ephemeris \
io \
magvar \
math \
$(METAR_DIRS) \
nasal \
props \
route \
scene \
screen \
serial \
sound \
threads \
timing
DIST_SUBDIRS = $(SUBDIRS) compatibility

View File

@@ -1,3 +0,0 @@
.deps
Makefile
Makefile.in

View File

@@ -0,0 +1,7 @@
include (SimGearComponent)
set(HEADERS newbucket.hxx)
set(SOURCES newbucket.cxx)
simgear_component(bucket bucket "${SOURCES}" "${HEADERS}")

View File

@@ -1,17 +0,0 @@
includedir = @includedir@/bucket
lib_LIBRARIES = libsgbucket.a
include_HEADERS = newbucket.hxx
libsgbucket_a_SOURCES = newbucket.cxx
# noinst_PROGRAMS = testbucket
# testbucket_SOURCES = testbucket.cxx
# testbucket_LDADD = \
# libsgbucket.a \
# $(top_builddir)/misc/libsgmisc.a
INCLUDES = -I$(top_srcdir)

View File

@@ -92,6 +92,11 @@ void SGBucket::set_bucket( double dlon, double dlat ) {
// cout << "diff = " << diff << " span = " << span << endl;
/* Calculate the greatest integral longitude less than
* or equal to the given longitude (floor(dlon)),
* but attribute coordinates near the east border
* to the next tile.
*/
if ( (dlon >= 0) || (fabs(diff) < SG_EPSILON) ) {
lon = (int)dlon;
} else {
@@ -100,22 +105,48 @@ void SGBucket::set_bucket( double dlon, double dlat ) {
// find subdivision or super lon if needed
if ( span < SG_EPSILON ) {
/* sg_bucket_span() never returns 0.0
* or anything near it, so this really
* should not occur at any time.
*/
// polar cap
lon = 0;
x = 0;
} else if ( span <= 1.0 ) {
/* We have more than one tile per degree of
* longitude, so we need an x offset.
*/
x = (int)((dlon - lon) / span);
} else {
if ( dlon >= 0 ) {
lon = (int)( (int)(lon / span) * span);
} else {
// cout << " lon = " << lon
// << " tmp = " << (int)((lon-1) / span) << endl;
lon = (int)( (int)((lon + 1) / span) * span - span);
if ( lon < -180 ) {
lon = -180;
}
}
/* We have one or more degrees per tile,
* so we need to find the base longitude
* of that tile.
*
* First we calculate the integral base longitude
* (e.g. -85.5 => -86) and then find the greatest
* multiple of span that is less than or equal to
* that longitude.
*
* That way, the Greenwich Meridian is always
* a tile border.
*
* This gets us into trouble with the polar caps,
* which have width 360 and thus either span
* the range from 0 to 360 or from -360 to 0
* degrees, depending on whether lon is positive
* or negative!
*
* We also get into trouble with the 8 degree tiles
* north of 88N and south of 88S, because the west-
* and east-most tiles in that range will cover 184W
* to 176W and 176E to 184E respectively, with their
* center at 180E/W!
*/
lon=(int)floor(floor((lon+SG_EPSILON)/span)*span);
/* Correct the polar cap issue */
if ( lon < -180 ) {
lon = -180;
}
x = 0;
}
@@ -124,11 +155,15 @@ void SGBucket::set_bucket( double dlon, double dlat ) {
//
diff = dlat - (double)(int)dlat;
/* Again, a modified floor() function (see longitude) */
if ( (dlat >= 0) || (fabs(diff) < SG_EPSILON) ) {
lat = (int)dlat;
} else {
lat = (int)dlat - 1;
}
/* Latitude base and offset are easier, as
* tiles always are 1/8 degree of latitude wide.
*/
y = (int)((dlat - lat) * 8);
}
@@ -139,7 +174,7 @@ void SGBucket::set_bucket(const SGGeod& geod)
}
// Build the path name for this bucket
string SGBucket::gen_base_path() const {
std::string SGBucket::gen_base_path() const {
// long int index;
int top_lon, top_lat, main_lon, main_lat;
char hem, pole;
@@ -189,6 +224,17 @@ string SGBucket::gen_base_path() const {
// return width of the tile in degrees
double SGBucket::get_width() const {
if (lon==-180 && (lat==-89 || lat==88) ) {
/* Normally the tile at 180W in 88N and 89S
* would cover 184W to 176W and the next
* on the east side starts at 176W.
* To correct, make this a special tile
* from 180W to 176W with 4 degrees width
* instead of the normal 8 degrees at
* that latitude.
*/
return 4.0;
}
return sg_bucket_span( get_center_lat() );
}
@@ -213,7 +259,7 @@ double SGBucket::get_width_m() const {
double local_perimeter = local_radius * SGD_2PI;
double degree_width = local_perimeter / 360.0;
return sg_bucket_span( get_center_lat() ) * degree_width;
return get_width() * degree_width;
}

View File

@@ -24,6 +24,11 @@
/** \file newbucket.hxx
* A class and associated utiltity functions to manage world scenery tiling.
*
* Tile borders are aligned along circles of latitude and longitude.
* All tiles are 1/8 degree of latitude high and their width in degrees
* longitude depends on their latitude, adjusted in such a way that
* all tiles cover about the same amount of area of the earth surface.
*/
#ifndef _NEWBUCKET_HXX
@@ -211,9 +216,9 @@ public:
double span = sg_bucket_span( lat + y / 8.0 + SG_HALF_BUCKET_SPAN );
if ( span >= 1.0 ) {
return lon + span / 2.0;
return lon + get_width() / 2.0;
} else {
return lon + x * span + span / 2.0;
return lon + x * span + get_width() / 2.0;
}
}
@@ -329,7 +334,7 @@ void sgBucketDiff( const SGBucket& b1, const SGBucket& b2, int *dx, int *dy );
inline std::ostream&
operator<< ( std::ostream& out, const SGBucket& b )
{
return out << b.lon << ":" << b.x << ", " << b.lat << ":" << b.y;
return out << b.lon << ":" << (int)b.x << ", " << b.lat << ":" << (int)b.y;
}

View File

@@ -1,2 +0,0 @@
Makefile
Makefile.in

View File

@@ -1,2 +0,0 @@
Makefile
Makefile.in

View File

@@ -1,14 +0,0 @@
includedir = @includedir@/compatibility/
include_HEADERS = \
iostream \
strstream \
sstream \
istream \
fstream \
iterator \
iomanip \
new \
streambuf \
\
irix_string

View File

@@ -1,2 +0,0 @@
Makefile
Makefile.in

View File

@@ -1,22 +0,0 @@
includedir = @includedir@/compatibility
EXTRA_DIST = README
include_HEADERS = \
cfloat \
csetjmp \
cstdio \
cwchar \
cassert \
climits \
csignal \
cstdlib \
cwctype \
cctype \
clocale \
cstdarg \
cstring \
cerrno \
cmath \
cstddef \
ctime

View File

@@ -1,3 +0,0 @@
SUBDIRS = $(MIPSpro_DIRS)
DIST_SUBDIRS = MIPSpro721 MIPSpro740

View File

@@ -67,6 +67,10 @@
# define vsnprintf _vsnprintf
# endif
# define copysign _copysign
# define strcasecmp stricmp
# undef min
# undef max
# pragma warning(disable: 4786) // identifier was truncated to '255' characters
# pragma warning(disable: 4244) // conversion from double to float
@@ -105,6 +109,7 @@
#if defined (__sun)
# define SG_UNIX
# include <strings.h>
# include <memory.h>
# if defined ( __cplusplus )
@@ -134,6 +139,8 @@
//
#ifdef __APPLE__
# define SG_MAC
# define SG_UNIX
# ifdef __GNUC__
# if ( __GNUC__ > 3 ) || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 3 )
inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
@@ -150,6 +157,8 @@ inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
#endif
#if defined (__FreeBSD__)
# define SG_UNIX
#include <sys/param.h>
# if __FreeBSD_version < 500000
extern "C" {
inline int isnan(double r) { return !(r <= 0 || r >= 0); }
@@ -158,9 +167,19 @@ inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
#endif
#if defined (__CYGWIN__)
# define SG_WINDOWS
# define SG_UNIX
# include <ieeefp.h> // isnan
#endif
// includes both MSVC and mingw compilers
#if defined(_WIN32) || defined(__WIN32__)
# define SG_WINDOWS
#endif
#if defined(__linux__) || defined(_AIX) || defined ( sgi )
# define SG_UNIX
#endif
//
// No user modifiable definitions beyond here.

View File

@@ -34,15 +34,22 @@
#include <cmath>
#include <plib/sg.h>
// Make sure PI is defined in its various forms
// SG_PI and SGD_PI (float and double) come from plib/sg.h
#ifndef SGD_PI // remove me once FlightGear no longer uses PLIB
#ifdef M_PI
const double SGD_PI = M_PI;
const float SG_PI = M_PI;
#else
const float SG_PI = 3.1415926535f;
const double SGD_PI = 3.1415926535;
#endif
#endif // of PLIB-SG guard
/** 2 * PI */
#define SGD_2PI 6.28318530717958647692
const double SGD_2PI = SGD_PI * 2.0;
/** PI / 2 */
#ifdef M_PI_2
@@ -52,7 +59,17 @@
#endif
/** PI / 4 */
#define SGD_PI_4 0.78539816339744830961
const double SGD_PI_4 = 0.78539816339744830961;
#ifndef SGD_DEGREES_TO_RADIANS // // remove me once FlightGear no longer uses PLIB
const double SGD_DEGREES_TO_RADIANS = SGD_PI / 180.0;
const double SGD_RADIANS_TO_DEGREES = 180.0 / SGD_PI;
const float SG_DEGREES_TO_RADIANS = SG_PI / 180.0f;
const float SG_RADIANS_TO_DEGREES = 180.0f / SG_PI;
#endif // of PLIB-SG guard
/** \def SG_E "e" */
#ifdef M_E

View File

@@ -1,3 +0,0 @@
.deps
Makefile
Makefile.in

View File

@@ -0,0 +1,7 @@
include (SimGearComponent)
set(HEADERS debug_types.h logstream.hxx)
set(SOURCES logstream.cxx)
simgear_component(debug debug "${SOURCES}" "${HEADERS}")

View File

@@ -1,11 +0,0 @@
includedir = @includedir@/debug
EXTRA_DIST = logtest.cxx
lib_LIBRARIES = libsgdebug.a
include_HEADERS = debug_types.h logstream.hxx
libsgdebug_a_SOURCES = logstream.cxx
INCLUDES = -I$(top_srcdir)

View File

@@ -1,35 +1,38 @@
/** \file debug_types.h
* Define the various logging classes and prioritiess
* Define the various logging classes and priorities
*/
/**
* Define the possible classes/categories of logging messages
*/
typedef enum {
SG_NONE = 0x00000000,
SG_NONE = 0x00000000,
SG_TERRAIN = 0x00000001,
SG_ASTRO = 0x00000002,
SG_FLIGHT = 0x00000004,
SG_INPUT = 0x00000008,
SG_GL = 0x00000010,
SG_VIEW = 0x00000020,
SG_COCKPIT = 0x00000040,
SG_GENERAL = 0x00000080,
SG_MATH = 0x00000100,
SG_EVENT = 0x00000200,
SG_AIRCRAFT = 0x00000400,
SG_AUTOPILOT = 0x00000800,
SG_IO = 0x00001000,
SG_CLIPPER = 0x00002000,
SG_NETWORK = 0x00004000,
SG_ATC = 0x00008000,
SG_NASAL = 0x00010000,
SG_INSTR = 0x00020000,
SG_SYSTEMS = 0x00040000,
SG_UNDEFD = 0x00080000, // For range checking
SG_TERRAIN = 0x00000001,
SG_ASTRO = 0x00000002,
SG_FLIGHT = 0x00000004,
SG_INPUT = 0x00000008,
SG_GL = 0x00000010,
SG_VIEW = 0x00000020,
SG_COCKPIT = 0x00000040,
SG_GENERAL = 0x00000080,
SG_MATH = 0x00000100,
SG_EVENT = 0x00000200,
SG_AIRCRAFT = 0x00000400,
SG_AUTOPILOT = 0x00000800,
SG_IO = 0x00001000,
SG_CLIPPER = 0x00002000,
SG_NETWORK = 0x00004000,
SG_ATC = 0x00008000,
SG_NASAL = 0x00010000,
SG_INSTR = 0x00020000,
SG_SYSTEMS = 0x00040000,
SG_AI = 0x00080000,
SG_ENVIRONMENT = 0x00100000,
SG_SOUND = 0x00200000,
SG_UNDEFD = 0x00400000, // For range checking
SG_ALL = 0xFFFFFFFF
SG_ALL = 0xFFFFFFFF
} sgDebugClass;

View File

@@ -1,4 +0,0 @@
.deps
Makefile
Makefile.in
metar

View File

@@ -0,0 +1,23 @@
include (SimGearComponent)
set(HEADERS metar.hxx precipitation.hxx)
set(SOURCES metar.cxx precipitation.cxx)
simgear_scene_component(environment environment "${SOURCES}" "${HEADERS}")
if(ENABLE_TESTS)
add_executable(test_metar test_metar.cxx)
if (SIMGEAR_SHARED)
target_link_libraries(test_metar SimGearScene)
else()
target_link_libraries(test_metar
sgenvironment sgstructure sgmisc sgdebug
${CMAKE_THREAD_LIBS_INIT}
${ZLIB_LIBRARY}
${RT_LIBRARY})
endif()
add_test(metar ${EXECUTABLE_OUTPUT_PATH}/test_metar)
endif(ENABLE_TESTS)

View File

@@ -1,9 +0,0 @@
includedir = @includedir@/environment
lib_LIBRARIES = libsgenvironment.a
include_HEADERS = metar.hxx visual_enviro.hxx precipitation.hxx
libsgenvironment_a_SOURCES = metar.cxx visual_enviro.cxx precipitation.cxx
INCLUDES = -I$(top_srcdir)

View File

@@ -30,8 +30,8 @@
#include <string>
#include <time.h>
#include <cstring>
#include <simgear/io/sg_socket.hxx>
#include <simgear/debug/logstream.hxx>
#include <simgear/structure/exception.hxx>
@@ -39,32 +39,28 @@
#define NaN SGMetarNaN
using std::string;
using std::map;
using std::vector;
/**
* The constructor takes a Metar string, or a four-letter ICAO code. In the
* latter case the metar string is downloaded from
* http://weather.noaa.gov/pub/data/observations/metar/stations/.
* The constructor takes a Metar string
* The constructor throws sg_io_exceptions on failure. The "METAR"
* keyword has no effect (apart from incrementing the group counter
* @a grpcount) and can be left away. A keyword "SPECI" is
* likewise accepted.
*
* @param m ICAO station id or metar string
* @param proxy proxy host (optional; default: "")
* @param port proxy port (optional; default: "80")
* @param auth proxy authorization information (optional; default: "")
*
* @par Examples:
* @code
* SGMetar *m = new SGMetar("METAR KSFO 061656Z 19004KT 9SM SCT100 OVC200 08/03 A3013");
* double t = m->getTemperature_F();
* delete m;
*
* SGMetar n("KSFO", "proxy.provider.foo", "3128", "proxy-password");
* double d = n.getDewpoint_C();
* @endcode
*/
SGMetar::SGMetar(const string& m, const string& proxy, const string& port,
const string& auth, const time_t time) :
SGMetar::SGMetar(const string& m) :
_grpcount(0),
_x_proxy(false),
_year(-1),
@@ -86,16 +82,10 @@ SGMetar::SGMetar(const string& m, const string& proxy, const string& port,
_snow(false),
_cavok(false)
{
if (m.length() == 4 && isalnum(m[0]) && isalnum(m[1]) && isalnum(m[2]) && isalnum(m[3])) {
for (int i = 0; i < 4; i++)
_icao[i] = toupper(m[i]);
_icao[4] = '\0';
_data = loadData(_icao, proxy, port, auth, time);
} else {
_data = new char[m.length() + 2]; // make room for " \0"
strcpy(_data, m.c_str());
_url = _data;
}
_data = new char[m.length() + 2]; // make room for " \0"
strcpy(_data, m.c_str());
_url = _data;
normalizeData();
_m = _data;
@@ -168,83 +158,6 @@ void SGMetar::useCurrentDate()
_month = now.tm_mon + 1;
}
/**
* If called with "KSFO" loads data from
* @code
* http://weather.noaa.gov/pub/data/observations/metar/stations/KSFO.TXT.
* @endcode
* Throws sg_io_exception on failure. Gives up after waiting longer than 10 seconds.
*
* @param id four-letter ICAO Metar station code, e.g. "KSFO".
* @param proxy proxy host (optional; default: "")
* @param port proxy port (optional; default: "80")
* @param auth proxy authorization information (optional; default: "")
* @return pointer to Metar data string, allocated by new char[].
* @see rfc2068.txt for proxy spec ("Proxy-Authorization")
*/
char *SGMetar::loadData(const char *id, const string& proxy, const string& port,
const string& auth, time_t time)
{
const int buflen = 512;
char buf[2 * buflen];
string host = proxy.empty() ? "weather.noaa.gov" : proxy;
string path = "/pub/data/observations/metar/stations/";
path += string(id) + ".TXT";
_url = "http://weather.noaa.gov" + path;
SGSocket *sock = new SGSocket(host, port.empty() ? "80" : port, "tcp");
sock->set_timeout(10000);
if (!sock->open(SG_IO_OUT)) {
delete sock;
throw sg_io_exception("cannot connect to ", sg_location(host));
}
string get = "GET ";
if (!proxy.empty())
get += "http://weather.noaa.gov";
sprintf(buf, "%ld", time);
get += path + " HTTP/1.0\015\012X-Time: " + buf + "\015\012";
if (!auth.empty())
get += "Proxy-Authorization: " + auth + "\015\012";
get += "\015\012";
sock->writestring(get.c_str());
int i;
// skip HTTP header
while ((i = sock->readline(buf, buflen))) {
if (i <= 2 && isspace(buf[0]) && (!buf[1] || isspace(buf[1])))
break;
if (!strncmp(buf, "X-MetarProxy: ", 13))
_x_proxy = true;
}
if (i) {
i = sock->readline(buf, buflen);
if (i)
sock->readline(&buf[i], buflen);
}
sock->close();
delete sock;
char *b = buf;
scanBoundary(&b);
if (*b == '<')
throw sg_io_exception("no metar data available from ",
sg_location(_url));
char *metar = new char[strlen(b) + 2]; // make room for " \0"
strcpy(metar, b);
return metar;
}
/**
* Replace any number of subsequent spaces by just one space, and add
* a trailing space. This makes scanning for things like "ALL RWY" easier.
@@ -465,11 +378,13 @@ bool SGMetar::scanVisibility()
int modifier = SGMetarVisibility::EQUALS;
// \d{4}(N|NE|E|SE|S|SW|W|NW)?
if (scanNumber(&m, &i, 4)) {
if (*m == 'E')
if( strncmp( m, "NDV",3 ) == 0 ) {
m+=3; // tolerate NDV (no directional validation)
} else if (*m == 'E') {
m++, dir = 90;
else if (*m == 'W')
} else if (*m == 'W') {
m++, dir = 270;
else if (*m == 'N') {
} else if (*m == 'N') {
m++;
if (*m == 'E')
m++, dir = 45;
@@ -485,7 +400,7 @@ bool SGMetar::scanVisibility()
m++, dir = 225;
else
dir = 180;
}
}
if (i == 0)
i = 50, modifier = SGMetarVisibility::LESS_THAN;
else if (i == 9999)
@@ -591,7 +506,7 @@ bool SGMetar::scanRwyVisRange()
r._max_visibility._distance = to;
if (*m == '/') // this is not in the spec!
*m++;
m++;
if (*m == 'D')
m++, r._min_visibility._tendency = SGMetarVisibility::DECREASING;
else if (*m == 'N')
@@ -612,8 +527,8 @@ bool SGMetar::scanRwyVisRange()
static const struct Token special[] = {
{ "NSW", "no significant weather" },
{ "VCSH", "showers in the vicinity" },
{ "VCTS", "thunderstorm in the vicinity" },
/* { "VCSH", "showers in the vicinity" },
{ "VCTS", "thunderstorm in the vicinity" }, */
{ 0, 0 }
};
@@ -666,6 +581,7 @@ bool SGMetar::scanWeather()
char *m = _m;
string weather;
const struct Token *a;
if ((a = scanToken(&m, special))) {
if (!scanBoundary(&m))
return false;
@@ -675,32 +591,35 @@ bool SGMetar::scanWeather()
}
string pre, post;
int intensity = 0;
struct Weather w;
if (*m == '-')
m++, pre = "light ", intensity = 1;
m++, pre = "light ", w.intensity = LIGHT;
else if (*m == '+')
m++, pre = "heavy ", intensity = 3;
m++, pre = "heavy ", w.intensity = HEAVY;
else if (!strncmp(m, "VC", 2))
m += 2, post = "in the vicinity ";
m += 2, post = "in the vicinity ", w.vincinity=true;
else
pre = "moderate ", intensity = 2;
pre = "moderate ", w.intensity = MODERATE;
int i;
for (i = 0; i < 3; i++) {
if (!(a = scanToken(&m, description)))
break;
w.descriptions.push_back(a->id);
weather += string(a->text) + " ";
}
for (i = 0; i < 3; i++) {
if (!(a = scanToken(&m, phenomenon)))
break;
w.phenomena.push_back(a->id);
weather += string(a->text) + " ";
if (!strcmp(a->id, "RA"))
_rain = intensity;
_rain = w.intensity;
else if (!strcmp(a->id, "HA"))
_hail = intensity;
_hail = w.intensity;
else if (!strcmp(a->id, "SN"))
_snow = intensity;
_snow = w.intensity;
}
if (!weather.length())
return false;
@@ -710,6 +629,8 @@ bool SGMetar::scanWeather()
weather = pre + weather + post;
weather.erase(weather.length() - 1);
_weather.push_back(weather);
if( w.phenomena.size() > 0 )
_weather2.push_back( w );
_grpcount++;
return true;
}
@@ -738,7 +659,7 @@ static const struct Token cloud_types[] = {
{ 0, 0 }
};
#include <iostream>
// (FEW|SCT|BKN|OVC|SKC|CLR|CAVOK|VV)([0-9]{3}|///)?[:cloud_type:]?
bool SGMetar::scanSkyCondition()
{
@@ -756,6 +677,7 @@ bool SGMetar::scanSkyCondition()
if (!strncmp(m, "CLR", i = 3) // clear
|| !strncmp(m, "SKC", i = 3) // sky clear
|| !strncmp(m, "NCD", i = 3) // nil cloud detected
|| !strncmp(m, "NSC", i = 3) // no significant clouds
|| !strncmp(m, "CAVOK", i = 5)) { // ceiling and visibility OK (implies 9999)
m += i;
@@ -763,7 +685,7 @@ bool SGMetar::scanSkyCondition()
return false;
if (i == 3) {
cl._coverage = 0;
cl._coverage = SGMetarCloud::COVERAGE_CLEAR;
_clouds.push_back(cl);
} else {
_cavok = true;
@@ -775,13 +697,13 @@ bool SGMetar::scanSkyCondition()
if (!strncmp(m, "VV", i = 2)) // vertical visibility
;
else if (!strncmp(m, "FEW", i = 3))
cl._coverage = 1;
cl._coverage = SGMetarCloud::COVERAGE_FEW;
else if (!strncmp(m, "SCT", i = 3))
cl._coverage = 2;
cl._coverage = SGMetarCloud::COVERAGE_SCATTERED;
else if (!strncmp(m, "BKN", i = 3))
cl._coverage = 3;
cl._coverage = SGMetarCloud::COVERAGE_BROKEN;
else if (!strncmp(m, "OVC", i = 3))
cl._coverage = 4;
cl._coverage = SGMetarCloud::COVERAGE_OVERCAST;
else
return false;
m += i;
@@ -794,7 +716,7 @@ bool SGMetar::scanSkyCondition()
} else if (!scanNumber(&m, &i, 3))
i = -1;
if (cl._coverage == -1) {
if (cl._coverage == SGMetarCloud::COVERAGE_NIL) {
if (!scanBoundary(&m))
return false;
if (i == -1) // 'VV///'
@@ -1194,13 +1116,29 @@ const struct Token *SGMetar::scanToken(char **str, const struct Token *list)
}
void SGMetarCloud::set(double alt, int cov)
void SGMetarCloud::set(double alt, Coverage cov)
{
_altitude = alt;
if (cov != -1)
_coverage = cov;
}
SGMetarCloud::Coverage SGMetarCloud::getCoverage( const std::string & coverage )
{
if( coverage == "clear" ) return COVERAGE_CLEAR;
if( coverage == "few" ) return COVERAGE_FEW;
if( coverage == "scattered" ) return COVERAGE_SCATTERED;
if( coverage == "broken" ) return COVERAGE_BROKEN;
if( coverage == "overcast" ) return COVERAGE_OVERCAST;
return COVERAGE_NIL;
}
const char * SGMetarCloud::COVERAGE_NIL_STRING = "nil";
const char * SGMetarCloud::COVERAGE_CLEAR_STRING = "clear";
const char * SGMetarCloud::COVERAGE_FEW_STRING = "few";
const char * SGMetarCloud::COVERAGE_SCATTERED_STRING = "scattered";
const char * SGMetarCloud::COVERAGE_BROKEN_STRING = "broken";
const char * SGMetarCloud::COVERAGE_OVERCAST_STRING = "overcast";
void SGMetarVisibility::set(double dist, int dir, int mod, int tend)
{

View File

@@ -29,18 +29,12 @@
#include <simgear/constants.h>
using std::vector;
using std::map;
using std::string;
const double SGMetarNaN = -1E20;
#define NaN SGMetarNaN
struct Token {
const char *id;
const char *text;
};
const double SGMetarNaN = -1E20;
class SGMetar;
@@ -48,7 +42,7 @@ class SGMetarVisibility {
friend class SGMetar;
public:
SGMetarVisibility() :
_distance(NaN),
_distance(SGMetarNaN),
_direction(-1),
_modifier(EQUALS),
_tendency(NONE) {}
@@ -70,8 +64,8 @@ public:
void set(double dist, int dir = -1, int mod = -1, int tend = -1);
inline double getVisibility_m() const { return _distance; }
inline double getVisibility_ft() const { return _distance == NaN ? NaN : _distance * SG_METER_TO_FEET; }
inline double getVisibility_sm() const { return _distance == NaN ? NaN : _distance * SG_METER_TO_SM; }
inline double getVisibility_ft() const { return _distance == SGMetarNaN ? SGMetarNaN : _distance * SG_METER_TO_FEET; }
inline double getVisibility_sm() const { return _distance == SGMetarNaN ? SGMetarNaN : _distance * SG_METER_TO_SM; }
inline int getDirection() const { return _direction; }
inline int getModifier() const { return _modifier; }
inline int getTendency() const { return _tendency; }
@@ -93,8 +87,8 @@ public:
_deposit_string(0),
_extent(-1),
_extent_string(0),
_depth(NaN),
_friction(NaN),
_depth(SGMetarNaN),
_friction(SGMetarNaN),
_friction_string(0),
_comment(0),
_wind_shear(false) {}
@@ -107,7 +101,7 @@ public:
inline double getFriction() const { return _friction; }
inline const char *getFrictionString() const { return _friction_string; }
inline const char *getComment() const { return _comment; }
inline const bool getWindShear() const { return _wind_shear; }
inline bool getWindShear() const { return _wind_shear; }
inline const SGMetarVisibility& getMinVisibility() const { return _min_visibility; }
inline const SGMetarVisibility& getMaxVisibility() const { return _max_visibility; }
@@ -130,18 +124,35 @@ protected:
class SGMetarCloud {
friend class SGMetar;
public:
SGMetarCloud() : _coverage(-1), _altitude(NaN), _type(0), _type_long(0) {}
enum Coverage {
COVERAGE_NIL = -1,
COVERAGE_CLEAR = 0,
COVERAGE_FEW = 1,
COVERAGE_SCATTERED = 2,
COVERAGE_BROKEN = 3,
COVERAGE_OVERCAST = 4
};
void set(double alt, int cov = -1);
static const char * COVERAGE_NIL_STRING;
static const char * COVERAGE_CLEAR_STRING;
static const char * COVERAGE_FEW_STRING;
static const char * COVERAGE_SCATTERED_STRING;
static const char * COVERAGE_BROKEN_STRING;
static const char * COVERAGE_OVERCAST_STRING;
inline int getCoverage() const { return _coverage; }
SGMetarCloud() : _coverage(COVERAGE_NIL), _altitude(SGMetarNaN), _type(0), _type_long(0) {}
void set(double alt, Coverage cov = COVERAGE_NIL );
inline Coverage getCoverage() const { return _coverage; }
static Coverage getCoverage( const std::string & coverage );
inline double getAltitude_m() const { return _altitude; }
inline double getAltitude_ft() const { return _altitude == NaN ? NaN : _altitude * SG_METER_TO_FEET; }
inline double getAltitude_ft() const { return _altitude == SGMetarNaN ? SGMetarNaN : _altitude * SG_METER_TO_FEET; }
inline const char *getTypeString() const { return _type; }
inline const char *getTypeLongString() const { return _type_long; }
protected:
int _coverage; // quarters: 0 -> clear ... 4 -> overcast
Coverage _coverage; // quarters: 0 -> clear ... 4 -> overcast
double _altitude; // 1000 m
const char *_type; // CU
const char *_type_long; // cumulus
@@ -150,8 +161,7 @@ protected:
class SGMetar {
public:
SGMetar(const string& m, const string& proxy = "", const string& port = "",
const string &auth = "", const time_t time = 0);
SGMetar(const std::string& m);
~SGMetar();
enum ReportType {
@@ -161,9 +171,24 @@ public:
RTD
};
enum Intensity {
NIL = 0,
LIGHT = 1,
MODERATE = 2,
HEAVY = 3
};
struct Weather {
Weather() { intensity = NIL; vincinity = false; }
Intensity intensity;
bool vincinity;
std::vector<std::string> descriptions;
std::vector<std::string> phenomena;
};
inline const char *getData() const { return _data; }
inline const char *getUnusedData() const { return _m; }
inline const bool getProxy() const { return _x_proxy; }
inline bool getProxy() const { return _x_proxy; }
inline const char *getId() const { return _icao; }
inline int getYear() const { return _year; }
inline int getMonth() const { return _month; }
@@ -174,14 +199,14 @@ public:
inline int getWindDir() const { return _wind_dir; }
inline double getWindSpeed_mps() const { return _wind_speed; }
inline double getWindSpeed_kmh() const { return _wind_speed == NaN ? NaN : _wind_speed * SG_MPS_TO_KMH; }
inline double getWindSpeed_kt() const { return _wind_speed == NaN ? NaN : _wind_speed * SG_MPS_TO_KT; }
inline double getWindSpeed_mph() const { return _wind_speed == NaN ? NaN : _wind_speed * SG_MPS_TO_MPH; }
inline double getWindSpeed_kmh() const { return _wind_speed == SGMetarNaN ? SGMetarNaN : _wind_speed * SG_MPS_TO_KMH; }
inline double getWindSpeed_kt() const { return _wind_speed == SGMetarNaN ? SGMetarNaN : _wind_speed * SG_MPS_TO_KT; }
inline double getWindSpeed_mph() const { return _wind_speed == SGMetarNaN ? SGMetarNaN : _wind_speed * SG_MPS_TO_MPH; }
inline double getGustSpeed_mps() const { return _gust_speed; }
inline double getGustSpeed_kmh() const { return _gust_speed == NaN ? NaN : _gust_speed * SG_MPS_TO_KMH; }
inline double getGustSpeed_kt() const { return _gust_speed == NaN ? NaN : _gust_speed * SG_MPS_TO_KT; }
inline double getGustSpeed_mph() const { return _gust_speed == NaN ? NaN : _gust_speed * SG_MPS_TO_MPH; }
inline double getGustSpeed_kmh() const { return _gust_speed == SGMetarNaN ? SGMetarNaN : _gust_speed * SG_MPS_TO_KMH; }
inline double getGustSpeed_kt() const { return _gust_speed == SGMetarNaN ? SGMetarNaN : _gust_speed * SG_MPS_TO_KT; }
inline double getGustSpeed_mph() const { return _gust_speed == SGMetarNaN ? SGMetarNaN : _gust_speed * SG_MPS_TO_MPH; }
inline int getWindRangeFrom() const { return _wind_range_from; }
inline int getWindRangeTo() const { return _wind_range_to; }
@@ -192,11 +217,11 @@ public:
inline const SGMetarVisibility *getDirVisibility() const { return _dir_visibility; }
inline double getTemperature_C() const { return _temp; }
inline double getTemperature_F() const { return _temp == NaN ? NaN : 1.8 * _temp + 32; }
inline double getTemperature_F() const { return _temp == SGMetarNaN ? SGMetarNaN : 1.8 * _temp + 32; }
inline double getDewpoint_C() const { return _dewp; }
inline double getDewpoint_F() const { return _dewp == NaN ? NaN : 1.8 * _dewp + 32; }
inline double getPressure_hPa() const { return _pressure == NaN ? NaN : _pressure / 100; }
inline double getPressure_inHg() const { return _pressure == NaN ? NaN : _pressure * SG_PA_TO_INHG; }
inline double getDewpoint_F() const { return _dewp == SGMetarNaN ? SGMetarNaN : 1.8 * _dewp + 32; }
inline double getPressure_hPa() const { return _pressure == SGMetarNaN ? SGMetarNaN : _pressure / 100; }
inline double getPressure_inHg() const { return _pressure == SGMetarNaN ? SGMetarNaN : _pressure * SG_PA_TO_INHG; }
inline int getRain() const { return _rain; }
inline int getHail() const { return _hail; }
@@ -205,12 +230,13 @@ public:
double getRelHumidity() const;
inline const vector<SGMetarCloud>& getClouds() const { return _clouds; }
inline const map<string, SGMetarRunway>& getRunways() const { return _runways; }
inline const vector<string>& getWeather() const { return _weather; }
inline const std::vector<SGMetarCloud>& getClouds() const { return _clouds; }
inline const std::map<std::string, SGMetarRunway>& getRunways() const { return _runways; }
inline const std::vector<std::string>& getWeather() const { return _weather; }
inline const std::vector<struct Weather> getWeather2() const { return _weather2; }
protected:
string _url;
std::string _url;
int _grpcount;
bool _x_proxy;
char *_data;
@@ -234,14 +260,15 @@ protected:
int _hail;
int _snow;
bool _cavok;
std::vector<struct Weather> _weather2;
SGMetarVisibility _min_visibility;
SGMetarVisibility _max_visibility;
SGMetarVisibility _vert_visibility;
SGMetarVisibility _dir_visibility[8];
vector<SGMetarCloud> _clouds;
map<string, SGMetarRunway> _runways;
vector<string> _weather;
std::vector<SGMetarCloud> _clouds;
std::map<std::string, SGMetarRunway> _runways;
std::vector<std::string> _weather;
bool scanPreambleDate();
bool scanPreambleTime();
@@ -269,10 +296,7 @@ protected:
int scanNumber(char **str, int *num, int min, int max = 0);
bool scanBoundary(char **str);
const struct Token *scanToken(char **str, const struct Token *list);
char *loadData(const char *id, const string& proxy, const string& port,
const string &auth, time_t time);
void normalizeData();
};
#undef NaN
#endif // _METAR_HXX

View File

@@ -25,7 +25,7 @@
*/
#include "precipitation.hxx"
#include "visual_enviro.hxx"
//#include "visual_enviro.hxx"
#include <simgear/constants.h>
#include <osg/ClipNode>
@@ -36,11 +36,20 @@
* Build a new OSG object from osgParticle.
*/
SGPrecipitation::SGPrecipitation() :
_freeze(false), _snow_intensity(0.0), _rain_intensity(0.0), _clip_distance(5.0)
_freeze(false), _enabled(true), _snow_intensity(0.0), _rain_intensity(0.0), _clip_distance(5.0)
{
_precipitationEffect = new osgParticle::PrecipitationEffect;
}
void SGPrecipitation::setEnabled( bool value )
{
_enabled = value;
}
bool SGPrecipitation::getEnabled() const
{
return _enabled;
}
/**
* @brief Build and add the object "precipitationEffect"
@@ -161,8 +170,7 @@ bool SGPrecipitation::update(void)
this->_snow_intensity = this->_rain_intensity;
}
bool enabled = sgEnviro.get_precipitation_enable_state();
if (enabled && this->_snow_intensity > 0) {
if (_enabled && this->_snow_intensity > 0) {
_precipitationEffect->setWind(_wind_vec);
_precipitationEffect->setParticleSpeed( -0.75f - 0.25f*_snow_intensity);
@@ -174,7 +182,7 @@ bool SGPrecipitation::update(void)
_precipitationEffect->setFarTransition(100.0f - 60.0f*sqrtf(_snow_intensity));
_precipitationEffect->setParticleColor(osg::Vec4(0.85, 0.85, 0.85, 1.0) - osg::Vec4(0.1, 0.1, 0.1, 1.0) * _snow_intensity);
} else if (enabled && this->_rain_intensity > 0) {
} else if (_enabled && this->_rain_intensity > 0) {
_precipitationEffect->setWind(_wind_vec);
_precipitationEffect->setParticleSpeed( -2.0f + -5.0f*_rain_intensity);

View File

@@ -36,6 +36,7 @@ class SGPrecipitation : public osg::Referenced
{
private:
bool _freeze;
bool _enabled;
float _snow_intensity;
float _rain_intensity;
@@ -56,6 +57,9 @@ public:
void setFreezing(bool);
void setRainIntensity(float);
void setSnowIntensity(float);
void setEnabled( bool );
bool getEnabled() const;
};
#endif

View File

@@ -0,0 +1,76 @@
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#ifdef _MSC_VER
# define random rand
#endif
#include <simgear/misc/sg_dir.hxx>
#include <simgear/structure/exception.hxx>
#include "metar.hxx"
using std::cout;
using std::cerr;
using std::endl;
using std::string;
#define COMPARE(a, b) \
if ((a) != (b)) { \
cerr << "failed:" << #a << " != " << #b << endl; \
cerr << "\tgot:" << a << endl; \
exit(1); \
}
#define FUZZY_COMPARE(a, b, epsilon) \
if (fabs(a - b) > epsilon) { \
cerr << "failed:" << #a << " != " << #b << endl; \
cerr << "\tgot:" << a << endl; \
cerr << "\tepsilon:" << epsilon << endl; \
}
#define VERIFY(a) \
if (!(a)) { \
cerr << "failed:" << #a << endl; \
exit(1); \
}
const double TEST_EPSILON = 1e-9;
void test_basic()
{
SGMetar m1("2011/10/20 11:25 EHAM 201125Z 27012KT 240V300 9999 VCSH FEW025CB SCT048 10/05 Q1025 TEMPO VRB03KT");
COMPARE(m1.getYear(), 2011);
COMPARE(m1.getMonth(), 10);
COMPARE(m1.getDay(), 20);
COMPARE(m1.getHour(), 11);
COMPARE(m1.getMinute(), 25);
COMPARE(m1.getReportType(), -1); // should default to NIL?
COMPARE(m1.getWindDir(), 270);
FUZZY_COMPARE(m1.getWindSpeed_kt(), 12, TEST_EPSILON);
FUZZY_COMPARE(m1.getTemperature_C(), 10, TEST_EPSILON);
FUZZY_COMPARE(m1.getDewpoint_C(), 5, TEST_EPSILON);
FUZZY_COMPARE(m1.getPressure_hPa(), 1025, TEST_EPSILON);
}
int main(int argc, char* argv[])
{
try {
test_basic();
} catch (sg_exception& e) {
cerr << "got exception:" << e.getMessage() << endl;
return -1;
}
return 0;
}

View File

@@ -28,8 +28,6 @@
#include <simgear/structure/SGSharedPtr.hxx>
#include <simgear/math/sg_random.h>
#include <simgear/math/sg_geodesy.hxx>
#include <simgear/math/point3d.hxx>
#include <simgear/math/polar3d.hxx>
#include <simgear/sound/sample_group.hxx>
#include <simgear/scene/sky/cloudfield.hxx>
#include <simgear/scene/sky/newcloud.hxx>
@@ -42,7 +40,7 @@ using std::vector;
typedef struct {
Point3D pt;
SGVec3d pt;
int depth;
int prev;
} lt_tree_seg;
@@ -52,23 +50,23 @@ static float rainpos[MAX_RAIN_SLICE];
#define MAX_LT_TREE_SEG 400
#define DFL_MIN_LIGHT 0.35
sgVec3 SGEnviro::min_light = {DFL_MIN_LIGHT, DFL_MIN_LIGHT, DFL_MIN_LIGHT};
SGVec3f SGEnviro::min_light(DFL_MIN_LIGHT, DFL_MIN_LIGHT, DFL_MIN_LIGHT);
#define DFL_STREAK_BRIGHT_NEARMOST_LAYER 0.9
SGfloat SGEnviro::streak_bright_nearmost_layer = DFL_STREAK_BRIGHT_NEARMOST_LAYER;
float SGEnviro::streak_bright_nearmost_layer = DFL_STREAK_BRIGHT_NEARMOST_LAYER;
#define DFL_STREAK_BRIGHT_FARMOST_LAYER 0.5
SGfloat SGEnviro::streak_bright_farmost_layer = DFL_STREAK_BRIGHT_FARMOST_LAYER;
float SGEnviro::streak_bright_farmost_layer = DFL_STREAK_BRIGHT_FARMOST_LAYER;
#define DFL_STREAK_PERIOD_MAX 2.5
SGfloat SGEnviro::streak_period_max = DFL_STREAK_PERIOD_MAX;
float SGEnviro::streak_period_max = DFL_STREAK_PERIOD_MAX;
#define DFL_STREAK_PERIOD_CHANGE_PER_KT 0.005
SGfloat SGEnviro::streak_period_change_per_kt = DFL_STREAK_PERIOD_CHANGE_PER_KT;
float SGEnviro::streak_period_change_per_kt = DFL_STREAK_PERIOD_CHANGE_PER_KT;
#define DFL_STREAK_PERIOD_MIN 1.0
SGfloat SGEnviro::streak_period_min = DFL_STREAK_PERIOD_MIN;
float SGEnviro::streak_period_min = DFL_STREAK_PERIOD_MIN;
#define DFL_STREAK_LENGTH_MIN 0.03
SGfloat SGEnviro::streak_length_min = DFL_STREAK_LENGTH_MIN;
float SGEnviro::streak_length_min = DFL_STREAK_LENGTH_MIN;
#define DFL_STREAK_LENGTH_CHANGE_PER_KT 0.0005
SGfloat SGEnviro::streak_length_change_per_kt = DFL_STREAK_LENGTH_CHANGE_PER_KT;
float SGEnviro::streak_length_change_per_kt = DFL_STREAK_LENGTH_CHANGE_PER_KT;
#define DFL_STREAK_LENGTH_MAX 0.1
SGfloat SGEnviro::streak_length_max = DFL_STREAK_LENGTH_MAX;
float SGEnviro::streak_length_max = DFL_STREAK_LENGTH_MAX;
#define DFL_STREAK_COUNT_MIN 40
int SGEnviro::streak_count_min = DFL_STREAK_COUNT_MIN;
#define DFL_STREAK_COUNT_MAX 190
@@ -77,9 +75,9 @@ int SGEnviro::streak_count_min = DFL_STREAK_COUNT_MIN;
#endif
int SGEnviro::streak_count_max = DFL_STREAK_COUNT_MAX;
#define DFL_CONE_BASE_RADIUS 15.0
SGfloat SGEnviro::cone_base_radius = DFL_CONE_BASE_RADIUS;
float SGEnviro::cone_base_radius = DFL_CONE_BASE_RADIUS;
#define DFL_CONE_HEIGHT 30.0
SGfloat SGEnviro::cone_height = DFL_CONE_HEIGHT;
float SGEnviro::cone_height = DFL_CONE_HEIGHT;
void SGEnviro::config(const SGPropertyNode* n)
@@ -88,7 +86,7 @@ void SGEnviro::config(const SGPropertyNode* n)
return;
const float ml = n->getFloatValue("min-light", DFL_MIN_LIGHT);
sgSetVec3(min_light, ml, ml, ml);
min_light = SGVec3f(ml, ml, ml);
streak_bright_nearmost_layer = n->getFloatValue(
"streak-brightness-nearmost-layer",
@@ -146,7 +144,7 @@ public:
~SGLightning();
void lt_Render(void);
void lt_build(void);
void lt_build_tree_branch(int tree_nr, Point3D &start, float energy, int nbseg, float segsize);
void lt_build_tree_branch(int tree_nr, SGVec3d &start, float energy, int nbseg, float segsize);
// contains all the segments of the lightning
lt_tree_seg lt_tree[MAX_LT_TREE_SEG];
@@ -189,18 +187,18 @@ SGEnviro::SGEnviro() :
}
SGEnviro::~SGEnviro(void) {
if (sampleGroup) delete sampleGroup;
// if (sampleGroup) delete sampleGroup;
// OSGFIXME
return;
list_of_lightning::iterator iLightning;
for( iLightning = lightnings.begin() ; iLightning != lightnings.end() ; iLightning++ ) {
for( iLightning = lightnings.begin() ; iLightning != lightnings.end() ; ++iLightning ) {
delete (*iLightning);
}
lightnings.clear();
}
void SGEnviro::startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double alt, double delta_time) {
void SGEnviro::startOfFrame( SGVec3f p, SGVec3f up, double lon, double lat, double alt, double delta_time) {
// OSGFIXME
return;
view_in_cloud = false;
@@ -210,7 +208,7 @@ void SGEnviro::startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double
elapsed_time += delta_time;
min_time_before_lt -= delta_time;
dt = delta_time;
#if 0
sgMat4 T1, LON, LAT;
sgVec3 axis;
@@ -232,6 +230,7 @@ void SGEnviro::startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double
sgSetCoord( &pos, TRANSFORM );
sgMakeCoordMat4( transform, &pos );
#endif
last_lon = lon;
last_lat = lat;
last_alt = alt;
@@ -289,10 +288,10 @@ void SGEnviro::set_lightning_enable_state(bool enable) {
}
}
void SGEnviro::setLight(sgVec4 adj_fog_color) {
void SGEnviro::setLight(SGVec4f adj_fog_color) {
// OSGFIXME
return;
sgCopyVec4( fog_color, adj_fog_color );
fog_color = adj_fog_color;
if( false ) {
// ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
}
@@ -381,7 +380,7 @@ void SGEnviro::callback_cloud(float heading, float alt, float radius, int family
if(lightning_enable_state && min_time_before_lt <= 0.0 && (family == SGNewCloud::CLFamilly_cb) &&
dist < 15000.0 * 15000.0 && sg_random() > 0.9f) {
double lat, lon;
Point3D orig, dest;
SGVec3d orig, dest;
orig.setlat(last_lat * SG_DEGREES_TO_RADIANS );
orig.setlon(last_lon * SG_DEGREES_TO_RADIANS );
orig.setelev(0.0);
@@ -418,118 +417,11 @@ list_of_SGWxRadarEcho *SGEnviro::get_radar_echo(void) {
void SGEnviro::DrawCone2(float baseRadius, float height, int slices, bool down, double rain_norm, double speed) {
// OSGFIXME
return;
sgVec3 light;
sgAddVec3( light, fog_color, min_light );
float da = SG_PI * 2.0f / (float) slices;
// low number = faster
float speedf = streak_period_max - speed * streak_period_change_per_kt;
if( speedf < streak_period_min )
speedf = streak_period_min;
float lenf = streak_length_min + speed * streak_length_change_per_kt;
if( lenf > streak_length_max )
lenf = streak_length_max;
float t = fmod((float) elapsed_time, speedf) / speedf;
// t = 0.1f;
if( !down )
t = 1.0f - t;
float angle = 0.0f;
//glColor4f(1.0f, 0.7f, 0.7f, 0.9f); // XXX unneeded? overriden below
glBegin(GL_LINES);
if (slices > MAX_RAIN_SLICE)
slices = MAX_RAIN_SLICE; // should never happen
for( int i = 0 ; i < slices ; i++ ) {
float x = cos(angle) * baseRadius;
float y = sin(angle) * baseRadius;
angle += da;
sgVec3 dir = {x, -height, y};
// rain drops at 2 different speed to simulate depth
float t1 = (i & 1 ? t : t + t) + rainpos[i];
if(t1 > 1.0f) t1 -= 1.0f;
if(t1 > 1.0f) t1 -= 1.0f;
// distant raindrops are more transparent
float c = t1 * (i & 1 ?
streak_bright_farmost_layer
: streak_bright_nearmost_layer);
glColor4f(c * light[0], c * light[1], c * light[2], c);
sgVec3 p1, p2;
sgScaleVec3(p1, dir, t1);
// distant raindrops are shorter
float t2 = t1 + (i & 1 ? lenf : lenf+lenf);
sgScaleVec3(p2, dir, t2);
glVertex3f(p1[0], p1[1] + height, p1[2]);
glVertex3f(p2[0], p2[1] + height, p2[2]);
}
glEnd();
}
void SGEnviro::drawRain(double pitch, double roll, double heading, double hspeed, double rain_norm) {
// OSGFIXME
return;
#if 0
static int debug_period = 0;
if (debug_period++ == 50) {
debug_period = 0;
cout << "drawRain("
<< pitch << ", "
<< roll << ", "
<< heading << ", "
<< hspeed << ", "
<< rain_norm << ");"
//" angle = " << angle
//<< " raindrop(KTS) = " << raindrop_speed_kts
<< endl;
}
#endif
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA );
glDisable( GL_FOG );
glDisable(GL_LIGHTING);
int slice_count = static_cast<int>(
(streak_count_min + rain_norm*(streak_count_max-streak_count_min))
* precipitation_density / 100.0);
// www.wonderquest.com/falling-raindrops.htm says that
// Raindrop terminal velocity is 5 to 20mph
// Rather than model it accurately (temp, pressure, diameter), and make it
// smaller than terminal when closer to the precipitation cloud base,
// we interpolate in the 5-20mph range according to rain_norm.
double raindrop_speed_kts
= (5.0 + rain_norm*15.0) * SG_MPH_TO_MPS * SG_MPS_TO_KT;
float angle = atanf(hspeed / raindrop_speed_kts) * SG_RADIANS_TO_DEGREES;
glPushMatrix();
// the cone rotate with hspeed
angle = -pitch - angle;
glRotatef(roll, 0.0, 0.0, 1.0);
glRotatef(heading, 0.0, 1.0, 0.0);
glRotatef(angle, 1.0, 0.0, 0.0);
// up cone
DrawCone2(cone_base_radius, cone_height,
slice_count, true, rain_norm, hspeed);
// down cone (usually not visible)
if(angle > 0.0 || heading != 0.0)
DrawCone2(cone_base_radius, -cone_height,
slice_count, false, rain_norm, hspeed);
glPopMatrix();
glEnable(GL_LIGHTING);
glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
glEnable( GL_FOG );
glEnable(GL_DEPTH_TEST);
}
void SGEnviro::set_sampleGroup(SGSampleGroup *sgr) {
@@ -560,169 +452,20 @@ SGLightning::~SGLightning() {
}
// lightning rendering code
void SGLightning::lt_build_tree_branch(int tree_nr, Point3D &start, float energy, int nbseg, float segsize) {
void SGLightning::lt_build_tree_branch(int tree_nr, SGVec3d &start, float energy, int nbseg, float segsize) {
// OSGFIXME
return;
sgVec3 dir, newdir;
int nseg = 0;
Point3D pt = start;
if( nbseg == 50 )
sgSetVec3( dir, 0.0, -1.0, 0.0 );
else {
sgSetVec3( dir, sg_random() - 0.5f, sg_random() - 0.5f, sg_random() - 0.5f);
sgNormaliseVec3(dir);
}
if( nb_tree >= MAX_LT_TREE_SEG )
return;
lt_tree[nb_tree].depth = tree_nr;
nseg = 0;
lt_tree[nb_tree].pt = pt;
lt_tree[nb_tree].prev = -1;
nb_tree ++;
// TODO:check agl
while(nseg < nbseg && pt.y() > 0.0) {
int prev = nb_tree - 1;
nseg++;
// add a branch
if( energy * sg_random() > 0.8f )
lt_build_tree_branch(tree_nr + 1, pt, energy * 0.9f, nbseg == 50 ? 10 : static_cast<int>(nbseg * 0.4f), segsize * 0.7f);
if( nb_tree >= MAX_LT_TREE_SEG )
return;
sgSetVec3(newdir, (sg_random() - 0.5f), (sg_random() - 0.5f) - (nbseg == 50 ? 0.5f : 0.0), (sg_random() - 0.5f));
sgNormaliseVec3(newdir);
sgAddVec3( dir, newdir);
sgNormaliseVec3(dir);
sgVec3 scaleDir;
sgScaleVec3( scaleDir, dir, segsize * energy * 0.5f );
pt[PX] += scaleDir[0];
pt[PY] += scaleDir[1];
pt[PZ] += scaleDir[2];
lt_tree[nb_tree].depth = tree_nr;
lt_tree[nb_tree].pt = pt;
lt_tree[nb_tree].prev = prev;
nb_tree ++;
}
}
void SGLightning::lt_build(void) {
// OSGFIXME
return;
Point3D top;
nb_tree = 0;
top[PX] = 0 ;
top[PY] = alt;
top[PZ] = 0;
lt_build_tree_branch(0, top, 1.0, 50, top[PY] / 8.0);
if( ! sgEnviro.sampleGroup )
return;
Point3D start( sgEnviro.last_lon*SG_DEGREES_TO_RADIANS, sgEnviro.last_lat*SG_DEGREES_TO_RADIANS, 0.0 );
Point3D dest( lon*SG_DEGREES_TO_RADIANS, lat*SG_DEGREES_TO_RADIANS, 0.0 );
double course = 0.0, dist = 0.0;
calc_gc_course_dist( dest, start, &course, &dist );
if( dist < 10000.0 && ! sgEnviro.snd_playing && (dist < sgEnviro.snd_dist || ! sgEnviro.snd_active) ) {
sgEnviro.snd_timer = 0.0;
sgEnviro.snd_wait = dist / 340;
sgEnviro.snd_dist = dist;
sgEnviro.snd_pos_lat = lat;
sgEnviro.snd_pos_lon = lon;
sgEnviro.snd_active = true;
sgEnviro.snd_playing = false;
}
}
void SGLightning::lt_Render(void) {
// OSGFIXME
return;
float flash = 0.5;
if( fmod(sgEnviro.elapsed_time*100.0, 100.0) > 50.0 )
flash = sg_random() * 0.75f + 0.25f;
float h = lt_tree[0].pt[PY];
sgVec4 col={0.62f, 0.83f, 1.0f, 1.0f};
sgVec4 c;
#define DRAW_SEG() \
{glColorMaterial(GL_FRONT, GL_EMISSION); \
glDisable(GL_LINE_SMOOTH); glBegin(GL_LINES); \
glColor4fv(c); \
glVertex3f(lt_tree[n].pt[PX], lt_tree[n].pt[PZ], lt_tree[n].pt[PY]); \
glVertex3f(lt_tree[lt_tree[n].prev].pt[PX], lt_tree[lt_tree[n].prev].pt[PZ], lt_tree[lt_tree[n].prev].pt[PY]); \
glEnd(); glEnable(GL_LINE_SMOOTH);}
glDepthMask( GL_FALSE );
glEnable(GL_BLEND);
glBlendFunc( GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_LIGHTING);
glDisable( GL_FOG );
glPushMatrix();
sgMat4 modelview, tmp;
// OSGFIXME
// ssgGetModelviewMatrix( modelview );
sgCopyMat4( tmp, sgEnviro.transform );
sgPostMultMat4( tmp, modelview );
// OSGFIXME
// ssgLoadModelviewMatrix( tmp );
Point3D start( sgEnviro.last_lon*SG_DEGREES_TO_RADIANS, sgEnviro.last_lat*SG_DEGREES_TO_RADIANS, 0.0 );
Point3D dest( lon*SG_DEGREES_TO_RADIANS, lat*SG_DEGREES_TO_RADIANS, 0.0 );
double course = 0.0, dist = 0.0;
calc_gc_course_dist( dest, start, &course, &dist );
double ax = 0.0, ay = 0.0;
ax = cos(course) * dist;
ay = sin(course) * dist;
glTranslatef( ax, ay, -sgEnviro.last_alt );
sgEnviro.radarEcho.push_back( SGWxRadarEcho ( course, 0.0, 0.0, dist, age, true, 0 ) );
for( int n = 0 ; n < nb_tree ; n++ ) {
if( lt_tree[n].prev < 0 )
continue;
float t1 = sgLerp(0.5, 1.0, lt_tree[n].pt[PY] / h);
t1 *= flash;
if( lt_tree[n].depth >= 2 ) {
glLineWidth(3);
sgScaleVec4(c, col, t1 * 0.6f);
DRAW_SEG();
} else {
if( lt_tree[n].depth == 0 ) {
glLineWidth(12);
sgScaleVec4(c, col, t1 * 0.5f);
DRAW_SEG();
glLineWidth(6);
sgScaleVec4(c, col, t1);
DRAW_SEG();
} else {
glLineWidth(6);
sgScaleVec4(c, col, t1 * 0.7f);
DRAW_SEG();
}
if( lt_tree[n].depth == 0 )
glLineWidth(3);
else
glLineWidth(2);
sgSetVec4(c, t1, t1, t1, t1);
DRAW_SEG();
}
}
glLineWidth(1);
glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
glPopMatrix();
glDepthMask( GL_TRUE );
glEnable( GL_FOG );
glEnable(GL_LIGHTING);
}
void SGEnviro::addLightning(double lon, double lat, double alt) {
@@ -737,53 +480,6 @@ void SGEnviro::addLightning(double lon, double lat, double alt) {
void SGEnviro::drawLightning(void) {
// OSGFIXME
return;
list_of_lightning::iterator iLightning;
// play 'thunder' for lightning
if( snd_active ) {
if( !snd_playing ) {
// wait until sound has reached us
snd_timer += dt;
if( snd_timer >= snd_wait ) {
snd_playing = true;
// compute relative position of lightning
Point3D start( sgEnviro.last_lon*SG_DEGREES_TO_RADIANS, sgEnviro.last_lat*SG_DEGREES_TO_RADIANS, 0.0 );
Point3D dest( snd_pos_lon*SG_DEGREES_TO_RADIANS, snd_pos_lat*SG_DEGREES_TO_RADIANS, 0.0 );
double course = 0.0, dist = 0.0;
calc_gc_course_dist( dest, start, &course, &dist );
double ax = 0.0, ay = 0.0;
ax = cos(course) * dist;
ay = sin(course) * dist;
SGSharedPtr<SGSoundSample> snd = sampleGroup->find("thunder");
if( snd ) {
SGVec3d pos = SGVec3d(ax, ay, -sgEnviro.last_alt);
snd->set_position(pos);
snd->play_once();
}
}
} else {
if( !sampleGroup->is_playing("thunder") ) {
snd_active = false;
snd_playing = false;
}
}
}
if( ! lightning_enable_state )
return;
for( iLightning = lightnings.begin() ; iLightning != lightnings.end() ; iLightning++ ) {
if( dt )
if( sg_random() > 0.95f )
(*iLightning)->lt_build();
(*iLightning)->lt_Render();
(*iLightning)->age -= dt;
if( (*iLightning)->age < 0.0 ) {
delete (*iLightning);
lightnings.erase( iLightning );
break;
}
}
}

View File

@@ -22,14 +22,11 @@
#ifndef _VISUAL_ENVIRO_HXX
#define _VISUAL_ENVIRO_HXX
#include <plib/sg.h>
#include <simgear/compiler.h>
#include <string>
#include <vector>
using std::vector;
using std::string;
#include <simgear/math/SGMath.hxx>
class SGLightning;
class SGSampleGroup;
@@ -62,7 +59,7 @@ public:
int cloudId;
};
typedef vector<SGWxRadarEcho> list_of_SGWxRadarEcho;
typedef std::vector<SGWxRadarEcho> list_of_SGWxRadarEcho;
/**
* Visual environment helper class.
@@ -81,8 +78,8 @@ private:
double last_cloud_turbulence, cloud_turbulence;
bool lightning_enable_state;
double elapsed_time, dt;
sgVec4 fog_color;
sgMat4 transform;
SGVec4f fog_color;
SGMatrixf transform;
double last_lon, last_lat, last_alt;
SGSampleGroup *sampleGroup;
bool snd_active, snd_playing;
@@ -93,8 +90,8 @@ private:
/** a list of all the radar echo. */
list_of_SGWxRadarEcho radarEcho;
static sgVec3 min_light;
static SGfloat streak_bright_nearmost_layer,
static SGVec3f min_light;
static float streak_bright_nearmost_layer,
streak_bright_farmost_layer,
streak_period_max,
streak_period_change_per_kt,
@@ -103,7 +100,7 @@ private:
streak_length_change_per_kt,
streak_length_max;
static int streak_count_min, streak_count_max;
static SGfloat cone_base_radius,
static float cone_base_radius,
cone_height;
public:
@@ -121,7 +118,7 @@ public:
/**
* Forward a few states used for renderings.
*/
void startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double alt, double delta_time);
void startOfFrame( SGVec3f p, SGVec3f up, double lon, double lat, double alt, double delta_time);
void endOfFrame(void);
@@ -158,7 +155,7 @@ public:
* Forward the fog color used by the rain rendering.
* @param adj_fog_color color of the fog
*/
void setLight(sgVec4 adj_fog_color);
void setLight(SGVec4f adj_fog_color);
// this can be queried to add some turbulence for example
bool is_view_in_cloud(void) const;
@@ -250,7 +247,7 @@ public:
list_of_SGWxRadarEcho *get_radar_echo(void);
sgMat4 *get_transform(void) { return &transform; }
SGMatrixf *get_transform(void) { return &transform; }
};
extern SGEnviro sgEnviro;

View File

@@ -1,3 +0,0 @@
.deps
Makefile
Makefile.in

View File

@@ -0,0 +1,35 @@
include (SimGearComponent)
set(HEADERS
celestialBody.hxx
ephemeris.hxx
jupiter.hxx
mars.hxx
mercury.hxx
moonpos.hxx
neptune.hxx
pluto.hxx
saturn.hxx
star.hxx
stardata.hxx
uranus.hxx
venus.hxx
)
set(SOURCES
celestialBody.cxx
ephemeris.cxx
jupiter.cxx
mars.cxx
mercury.cxx
moonpos.cxx
neptune.cxx
saturn.cxx
star.cxx
stardata.cxx
uranus.cxx
venus.cxx
)
simgear_component(ephem ephemeris "${SOURCES}" "${HEADERS}")

View File

@@ -1,34 +0,0 @@
includedir = @includedir@/ephemeris
lib_LIBRARIES = libsgephem.a
include_HEADERS = \
celestialBody.hxx \
ephemeris.hxx \
jupiter.hxx \
mars.hxx \
mercury.hxx \
moonpos.hxx \
neptune.hxx \
saturn.hxx \
star.hxx \
stardata.hxx \
uranus.hxx \
venus.hxx
libsgephem_a_SOURCES = \
celestialBody.cxx \
ephemeris.cxx \
jupiter.cxx \
mars.cxx \
mercury.cxx \
moonpos.cxx \
neptune.cxx \
pluto.hxx \
saturn.cxx \
star.cxx \
stardata.cxx \
uranus.cxx \
venus.cxx
INCLUDES = -I$(top_srcdir)

View File

@@ -81,8 +81,8 @@ public:
double getRightAscension();
double getDeclination();
double getMagnitude();
double getLon();
double getLat();
double getLon() const;
double getLat() const;
void updatePosition(double mjd, Star *ourSun);
};
@@ -90,12 +90,12 @@ inline double CelestialBody::getRightAscension() { return rightAscension; }
inline double CelestialBody::getDeclination() { return declination; }
inline double CelestialBody::getMagnitude() { return magnitude; }
inline double CelestialBody::getLon()
inline double CelestialBody::getLon() const
{
return lonEcl;
}
inline double CelestialBody::getLat()
inline double CelestialBody::getLat() const
{
return latEcl;
}

View File

@@ -43,47 +43,47 @@ public:
Star ();
~Star();
void updatePosition(double mjd);
double getM();
double getw();
double getxs();
double getys();
double getye();
double getze();
double getDistance();
double getM() const;
double getw() const;
double getxs() const;
double getys() const;
double getye() const;
double getze() const;
double getDistance() const;
};
inline double Star::getM()
inline double Star::getM() const
{
return M;
}
inline double Star::getw()
inline double Star::getw() const
{
return w;
}
inline double Star::getxs()
inline double Star::getxs() const
{
return xs;
}
inline double Star::getys()
inline double Star::getys() const
{
return ys;
}
inline double Star::getye()
inline double Star::getye() const
{
return ye;
}
inline double Star::getze()
inline double Star::getze() const
{
return ze;
}
inline double Star::getDistance()
inline double Star::getDistance() const
{
return distance;
}

View File

@@ -34,6 +34,8 @@
using std::getline;
#endif
using std::string;
// Constructor
SGStarData::SGStarData( const SGPath& path )
{

View File

@@ -0,0 +1,76 @@
include (SimGearComponent)
set(HLA_HEADERS
RTIData.hxx
HLAArrayDataElement.hxx
HLAArrayDataType.hxx
HLABasicDataElement.hxx
HLABasicDataType.hxx
HLADataElement.hxx
HLADataElementVisitor.hxx
HLADataType.hxx
HLADataTypeVisitor.hxx
HLAEnumeratedDataElement.hxx
HLAEnumeratedDataType.hxx
HLAFixedRecordDataElement.hxx
HLAFixedRecordDataType.hxx
HLAFederate.hxx
HLAInteractionClass.hxx
HLALocation.hxx
HLAObjectClass.hxx
HLAObjectInstance.hxx
HLAOMTXmlVisitor.hxx
HLAPropertyDataElement.hxx
HLARawDataElement.hxx
HLATypes.hxx
HLAVariantDataElement.hxx
HLAVariantDataType.hxx
HLAVariantRecordDataElement.hxx
HLAVariantRecordDataType.hxx
)
set(HLA_SOURCES
HLAArrayDataElement.cxx
HLAArrayDataType.cxx
HLABasicDataElement.cxx
HLABasicDataType.cxx
HLADataElement.cxx
HLADataType.cxx
HLADataTypeVisitor.cxx
HLAEnumeratedDataElement.cxx
HLAEnumeratedDataType.cxx
HLAFederate.cxx
HLAInteractionClass.cxx
HLAFixedRecordDataElement.cxx
HLAFixedRecordDataType.cxx
HLAObjectClass.cxx
HLAObjectInstance.cxx
HLAOMTXmlVisitor.cxx
HLAPropertyDataElement.cxx
HLARawDataElement.cxx
HLAVariantRecordDataElement.cxx
HLAVariantRecordDataType.cxx
)
simgear_component(hla hla "${HLA_SOURCES}" "${HLA_HEADERS}")
if(RTI_FOUND)
set(RTI13_SOURCES
RTI13InteractionClass.cxx
RTI13ObjectClass.cxx
RTI13ObjectInstance.cxx
RTI13Federate.cxx
RTI13FederateFactory.cxx
)
simgear_component(rti13 hla "${RTI13_SOURCES}" "")
set_property(TARGET sgrti13 APPEND PROPERTY COMPILE_FLAGS "-I${RTI_INCLUDE_DIR}")
endif()
set(RTI_SOURCES
RTIInteractionClass.cxx
RTIObjectClass.cxx
RTIObjectInstance.cxx
RTIFederate.cxx
RTIFederateFactory.cxx
RTIFederateFactoryRegistry.cxx
)
simgear_component(rti hla "${RTI_SOURCES}" "")

View File

@@ -0,0 +1,374 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAArrayDataElement.hxx"
#include <simgear/debug/logstream.hxx>
#include "HLADataElementVisitor.hxx"
namespace simgear {
HLAAbstractArrayDataElement::HLAAbstractArrayDataElement(const HLAArrayDataType* dataType) :
_dataType(dataType)
{
}
HLAAbstractArrayDataElement::~HLAAbstractArrayDataElement()
{
}
void
HLAAbstractArrayDataElement::accept(HLADataElementVisitor& visitor)
{
visitor.apply(*this);
}
void
HLAAbstractArrayDataElement::accept(HLAConstDataElementVisitor& visitor) const
{
visitor.apply(*this);
}
bool
HLAAbstractArrayDataElement::decode(HLADecodeStream& stream)
{
if (!_dataType.valid())
return false;
return _dataType->decode(stream, *this);
}
bool
HLAAbstractArrayDataElement::encode(HLAEncodeStream& stream) const
{
if (!_dataType.valid())
return false;
return _dataType->encode(stream, *this);
}
const HLAArrayDataType*
HLAAbstractArrayDataElement::getDataType() const
{
return _dataType.get();
}
bool
HLAAbstractArrayDataElement::setDataType(const HLADataType* dataType)
{
const HLAArrayDataType* arrayDataType = dynamic_cast<const HLAArrayDataType*>(dataType);
if (!arrayDataType) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAArrayDataType: unable to set data type!");
return false;
}
_dataType = arrayDataType;
return true;
}
const HLADataType*
HLAAbstractArrayDataElement::getElementDataType() const
{
if (!_dataType.valid())
return 0;
return _dataType->getElementDataType();
}
////////////////////////////////////////////////////////////////////////
HLAArrayDataElement::DataElementFactory::~DataElementFactory()
{
}
HLAArrayDataElement::HLAArrayDataElement(const HLAArrayDataType* dataType) :
HLAAbstractArrayDataElement(dataType)
{
}
HLAArrayDataElement::~HLAArrayDataElement()
{
clearStamp();
}
bool
HLAArrayDataElement::setNumElements(unsigned size)
{
unsigned oldSize = _elementVector.size();
if (size == oldSize)
return true;
_elementVector.resize(size);
for (unsigned i = oldSize; i < size; ++i)
_elementVector[i] = newElement(i);
setDirty(true);
return true;
}
bool
HLAArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
{
HLADataElement* dataElement = getElement(i);
if (!dataElement)
return false;
return dataElement->decode(stream);
}
unsigned
HLAArrayDataElement::getNumElements() const
{
return _elementVector.size();
}
bool
HLAArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
{
const HLADataElement* dataElement = getElement(i);
if (!dataElement)
return false;
return dataElement->encode(stream);
}
const HLADataElement*
HLAArrayDataElement::getElement(unsigned index) const
{
if (_elementVector.size() <= index)
return 0;
return _elementVector[index].get();
}
HLADataElement*
HLAArrayDataElement::getElement(unsigned index)
{
if (_elementVector.size() <= index)
return 0;
return _elementVector[index].get();
}
HLADataElement*
HLAArrayDataElement::getOrCreateElement(unsigned index)
{
if (_elementVector.size() <= index)
if (!setNumElements(index + 1))
return 0;
return _elementVector[index].get();
}
void
HLAArrayDataElement::setElement(unsigned index, HLADataElement* value)
{
unsigned oldSize = _elementVector.size();
if (oldSize <= index) {
_elementVector.resize(index + 1);
for (unsigned j = oldSize; j < index; ++j)
_elementVector[j] = newElement(j);
}
if (_elementVector[index].valid())
_elementVector[index]->clearStamp();
_elementVector[index] = value;
if (value)
value->attachStamp(*this);
setDirty(true);
}
void
HLAArrayDataElement::setDataElementFactory(HLAArrayDataElement::DataElementFactory* dataElementFactory)
{
_dataElementFactory = dataElementFactory;
}
HLAArrayDataElement::DataElementFactory*
HLAArrayDataElement::getDataElementFactory()
{
return _dataElementFactory.get();
}
void
HLAArrayDataElement::_setStamp(Stamp* stamp)
{
HLAAbstractArrayDataElement::_setStamp(stamp);
for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) {
if (!i->valid())
continue;
(*i)->attachStamp(*this);
}
}
HLADataElement*
HLAArrayDataElement::newElement(unsigned index)
{
if (!_dataElementFactory.valid())
return 0;
HLADataElement* dataElement = _dataElementFactory->createElement(*this, index);
if (!dataElement)
return 0;
dataElement->attachStamp(*this);
return dataElement;
}
////////////////////////////////////////////////////////////////////////
HLAVariantArrayDataElement::HLAVariantArrayDataElement() :
HLAAbstractArrayDataElement(0)
{
}
HLAVariantArrayDataElement::~HLAVariantArrayDataElement()
{
clearStamp();
}
bool
HLAVariantArrayDataElement::setDataType(const HLADataType* dataType)
{
const HLAArrayDataType* arrayDataType = dataType->toArrayDataType();
if (!arrayDataType) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type, dataType is not an array data type!");
return false;
}
const HLAVariantRecordDataType* variantRecordDataType = arrayDataType->getElementDataType()->toVariantRecordDataType();
if (!variantRecordDataType) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAVariantArrayDataType: unable to set data type: arrayDataTypes element data type is no a variant data type!");
return false;
}
_dataType = arrayDataType;
return true;
}
bool
HLAVariantArrayDataElement::setNumElements(unsigned size)
{
unsigned oldSize = _elementVector.size();
if (size == oldSize)
return true;
_elementVector.resize(size);
for (unsigned i = oldSize; i < size; ++i)
_elementVector[i] = newElement();
setDirty(true);
return true;
}
bool
HLAVariantArrayDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
{
HLAVariantRecordDataElement* dataElement = getElement(i);
if (!dataElement)
return false;
return dataElement->decode(stream);
}
unsigned
HLAVariantArrayDataElement::getNumElements() const
{
return _elementVector.size();
}
bool
HLAVariantArrayDataElement::encodeElement(HLAEncodeStream& stream, unsigned i) const
{
const HLADataElement* dataElement = getElement(i);
if (!dataElement)
return false;
return dataElement->encode(stream);
}
const HLAVariantRecordDataElement*
HLAVariantArrayDataElement::getElement(unsigned index) const
{
if (_elementVector.size() <= index)
return 0;
return _elementVector[index].get();
}
HLAVariantRecordDataElement*
HLAVariantArrayDataElement::getElement(unsigned index)
{
if (_elementVector.size() <= index)
return 0;
return _elementVector[index].get();
}
HLAVariantRecordDataElement*
HLAVariantArrayDataElement::getOrCreateElement(unsigned index)
{
if (_elementVector.size() <= index)
if (!setNumElements(index + 1))
return 0;
return _elementVector[index].get();
}
void
HLAVariantArrayDataElement::setElement(unsigned index, HLAVariantRecordDataElement* value)
{
unsigned oldSize = _elementVector.size();
if (oldSize <= index) {
_elementVector.resize(index + 1);
for (unsigned j = oldSize; j < index; ++j)
_elementVector[j] = newElement();
}
if (_elementVector[index].valid())
_elementVector[index]->clearStamp();
_elementVector[index] = value;
if (value)
value->attachStamp(*this);
setDirty(true);
}
void
HLAVariantArrayDataElement::setAlternativeDataElementFactory(HLAVariantArrayDataElement::AlternativeDataElementFactory* alternativeDataElementFactory)
{
_alternativeDataElementFactory = alternativeDataElementFactory;
}
HLAVariantArrayDataElement::AlternativeDataElementFactory*
HLAVariantArrayDataElement::getAlternativeDataElementFactory()
{
return _alternativeDataElementFactory.get();
}
void
HLAVariantArrayDataElement::_setStamp(Stamp* stamp)
{
HLAAbstractArrayDataElement::_setStamp(stamp);
for (ElementVector::iterator i = _elementVector.begin(); i != _elementVector.end(); ++i) {
if (!i->valid())
continue;
(*i)->attachStamp(*this);
}
}
HLAVariantRecordDataElement*
HLAVariantArrayDataElement::newElement()
{
const HLAArrayDataType* arrayDataType = getDataType();
if (!arrayDataType)
return 0;
const HLADataType* elementDataType = arrayDataType->getElementDataType();
if (!elementDataType)
return 0;
const HLAVariantRecordDataType* variantRecordDataType = elementDataType->toVariantRecordDataType();
if (!variantRecordDataType)
return 0;
HLAVariantRecordDataElement* variantRecordDataElement = new HLAVariantRecordDataElement(variantRecordDataType);
variantRecordDataElement->setDataElementFactory(_alternativeDataElementFactory.get());
variantRecordDataElement->attachStamp(*this);
return variantRecordDataElement;
}
}

View File

@@ -0,0 +1,538 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAArrayDataElement_hxx
#define HLAArrayDataElement_hxx
#include <string>
#include <vector>
#include <simgear/math/SGMath.hxx>
#include "HLAArrayDataType.hxx"
#include "HLADataElement.hxx"
#include "HLAVariantRecordDataElement.hxx"
#include "HLADataTypeVisitor.hxx"
namespace simgear {
class HLAAbstractArrayDataElement : public HLADataElement {
public:
HLAAbstractArrayDataElement(const HLAArrayDataType* dataType);
virtual ~HLAAbstractArrayDataElement();
virtual void accept(HLADataElementVisitor& visitor);
virtual void accept(HLAConstDataElementVisitor& visitor) const;
virtual bool decode(HLADecodeStream& stream);
virtual bool encode(HLAEncodeStream& stream) const;
virtual const HLAArrayDataType* getDataType() const;
virtual bool setDataType(const HLADataType* dataType);
const HLADataType* getElementDataType() const;
virtual bool setNumElements(unsigned count) = 0;
virtual bool decodeElement(HLADecodeStream& stream, unsigned i) = 0;
virtual unsigned getNumElements() const = 0;
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const = 0;
protected:
SGSharedPtr<const HLAArrayDataType> _dataType;
};
class HLAArrayDataElement : public HLAAbstractArrayDataElement {
public:
HLAArrayDataElement(const HLAArrayDataType* dataType = 0);
virtual ~HLAArrayDataElement();
virtual bool setNumElements(unsigned size);
virtual bool decodeElement(HLADecodeStream& stream, unsigned i);
virtual unsigned getNumElements() const;
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const;
const HLADataElement* getElement(unsigned index) const;
HLADataElement* getElement(unsigned index);
HLADataElement* getOrCreateElement(unsigned index);
void setElement(unsigned i, HLADataElement* value);
class DataElementFactory : public SGReferenced {
public:
virtual ~DataElementFactory();
virtual HLADataElement* createElement(const HLAArrayDataElement&, unsigned) = 0;
};
void setDataElementFactory(DataElementFactory* dataElementFactory);
DataElementFactory* getDataElementFactory();
protected:
virtual void _setStamp(Stamp* stamp);
private:
HLADataElement* newElement(unsigned index);
typedef std::vector<SGSharedPtr<HLADataElement> > ElementVector;
ElementVector _elementVector;
SGSharedPtr<DataElementFactory> _dataElementFactory;
};
// Holds an array of variants.
// Factors out common code for that use case.
class HLAVariantArrayDataElement : public HLAAbstractArrayDataElement {
public:
HLAVariantArrayDataElement();
virtual ~HLAVariantArrayDataElement();
// Overwrite this from the abstract class, need some more checks here
virtual bool setDataType(const HLADataType* dataType);
virtual bool setNumElements(unsigned size);
virtual bool decodeElement(HLADecodeStream& stream, unsigned i);
virtual unsigned getNumElements() const;
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const;
const HLAVariantRecordDataElement* getElement(unsigned index) const;
HLAVariantRecordDataElement* getElement(unsigned index);
HLAVariantRecordDataElement* getOrCreateElement(unsigned index);
void setElement(unsigned index, HLAVariantRecordDataElement* value);
typedef HLAVariantRecordDataElement::DataElementFactory AlternativeDataElementFactory;
void setAlternativeDataElementFactory(AlternativeDataElementFactory* alternativeDataElementFactory);
AlternativeDataElementFactory* getAlternativeDataElementFactory();
protected:
virtual void _setStamp(Stamp* stamp);
private:
HLAVariantRecordDataElement* newElement();
typedef std::vector<SGSharedPtr<HLAVariantRecordDataElement> > ElementVector;
ElementVector _elementVector;
SGSharedPtr<AlternativeDataElementFactory> _alternativeDataElementFactory;
};
class HLAStringDataElement : public HLAAbstractArrayDataElement {
public:
HLAStringDataElement(const HLAArrayDataType* dataType = 0) :
HLAAbstractArrayDataElement(dataType)
{}
HLAStringDataElement(const HLAArrayDataType* dataType, const std::string& value) :
HLAAbstractArrayDataElement(dataType),
_value(value)
{}
const std::string& getValue() const
{ return _value; }
void setValue(const std::string& value)
{ _value = value; setDirty(true); }
virtual bool setNumElements(unsigned count)
{
_value.resize(count);
return true;
}
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
{
HLATemplateDecodeVisitor<std::string::value_type> visitor(stream);
getElementDataType()->accept(visitor);
_value[i] = visitor.getValue();
return true;
}
virtual unsigned getNumElements() const
{
return _value.size();
}
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
{
HLATemplateEncodeVisitor<std::string::value_type> visitor(stream, _value[i]);
getElementDataType()->accept(visitor);
return true;
}
private:
std::string _value;
};
class HLAStringData {
public:
HLAStringData() :
_value(new HLAStringDataElement(0))
{ }
HLAStringData(const std::string& value) :
_value(new HLAStringDataElement(0))
{ _value->setValue(value); }
operator const std::string&() const
{ return _value->getValue(); }
HLAStringData& operator=(const std::string& value)
{ _value->setValue(value); return *this; }
const std::string& getValue() const
{ return _value->getValue(); }
void setValue(const std::string& value)
{ _value->setValue(value); }
const HLAStringDataElement* getDataElement() const
{ return _value.get(); }
HLAStringDataElement* getDataElement()
{ return _value.get(); }
const HLAArrayDataType* getDataType() const
{ return _value->getDataType(); }
void setDataType(const HLAArrayDataType* dataType)
{ _value->setDataType(dataType); }
private:
SGSharedPtr<HLAStringDataElement> _value;
};
template<typename T>
class HLAVec2DataElement : public HLAAbstractArrayDataElement {
public:
HLAVec2DataElement(const HLAArrayDataType* dataType = 0) :
HLAAbstractArrayDataElement(dataType),
_value(SGVec2<T>::zeros())
{}
HLAVec2DataElement(const HLAArrayDataType* dataType, const SGVec2<T>& value) :
HLAAbstractArrayDataElement(dataType),
_value(value)
{}
const SGVec2<T>& getValue() const
{ return _value; }
void setValue(const SGVec2<T>& value)
{ _value = value; setDirty(true); }
virtual bool setNumElements(unsigned count)
{
for (unsigned i = count; i < 2; ++i)
_value[i] = 0;
return true;
}
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
{
if (i < 2) {
HLATemplateDecodeVisitor<typename SGVec2<T>::value_type> visitor(stream);
getElementDataType()->accept(visitor);
_value[i] = visitor.getValue();
} else {
HLADataTypeDecodeVisitor visitor(stream);
getElementDataType()->accept(visitor);
}
return true;
}
virtual unsigned getNumElements() const
{
return 2;
}
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
{
if (i < 2) {
HLATemplateEncodeVisitor<typename SGVec2<T>::value_type> visitor(stream, _value[i]);
getElementDataType()->accept(visitor);
} else {
HLADataTypeEncodeVisitor visitor(stream);
getElementDataType()->accept(visitor);
}
return true;
}
private:
SGVec2<T> _value;
};
template<typename T>
class HLAVec2Data {
public:
HLAVec2Data() :
_value(new HLAVec2DataElement<T>(0))
{ }
HLAVec2Data(const SGVec2<T>& value) :
_value(new HLAVec2DataElement<T>(0, value))
{ }
operator const SGVec2<T>&() const
{ return _value->getValue(); }
HLAVec2Data& operator=(const SGVec2<T>& value)
{ _value->setValue(value); return *this; }
const SGVec2<T>& getValue() const
{ return _value->getValue(); }
void setValue(const SGVec2<T>& value)
{ _value->setValue(value); }
const HLAVec2DataElement<T>* getDataElement() const
{ return _value.get(); }
HLAVec2DataElement<T>* getDataElement()
{ return _value.get(); }
const HLAArrayDataType* getDataType() const
{ return _value->getDataType(); }
void setDataType(const HLAArrayDataType* dataType)
{ _value->setDataType(dataType); }
private:
SGSharedPtr<HLAVec2DataElement<T> > _value;
};
typedef HLAVec2Data<float> HLAVec2fData;
typedef HLAVec2Data<double> HLAVec2dData;
template<typename T>
class HLAVec3DataElement : public HLAAbstractArrayDataElement {
public:
HLAVec3DataElement(const HLAArrayDataType* dataType = 0) :
HLAAbstractArrayDataElement(dataType),
_value(SGVec3<T>::zeros())
{}
HLAVec3DataElement(const HLAArrayDataType* dataType, const SGVec3<T>& value) :
HLAAbstractArrayDataElement(dataType),
_value(value)
{}
const SGVec3<T>& getValue() const
{ return _value; }
void setValue(const SGVec3<T>& value)
{ _value = value; setDirty(true); }
virtual bool setNumElements(unsigned count)
{
for (unsigned i = count; i < 3; ++i)
_value[i] = 0;
return true;
}
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
{
if (i < 3) {
HLATemplateDecodeVisitor<typename SGVec3<T>::value_type> visitor(stream);
getElementDataType()->accept(visitor);
_value[i] = visitor.getValue();
} else {
HLADataTypeDecodeVisitor visitor(stream);
getElementDataType()->accept(visitor);
}
return true;
}
virtual unsigned getNumElements() const
{
return 3;
}
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
{
if (i < 3) {
HLATemplateEncodeVisitor<typename SGVec3<T>::value_type> visitor(stream, _value[i]);
getElementDataType()->accept(visitor);
} else {
HLADataTypeEncodeVisitor visitor(stream);
getElementDataType()->accept(visitor);
}
return true;
}
private:
SGVec3<T> _value;
};
template<typename T>
class HLAVec3Data {
public:
HLAVec3Data() :
_value(new HLAVec3DataElement<T>(0))
{ }
HLAVec3Data(const SGVec3<T>& value) :
_value(new HLAVec3DataElement<T>(0, value))
{ }
operator const SGVec3<T>&() const
{ return _value->getValue(); }
HLAVec3Data& operator=(const SGVec3<T>& value)
{ _value->setValue(value); return *this; }
const SGVec3<T>& getValue() const
{ return _value->getValue(); }
void setValue(const SGVec3<T>& value)
{ _value->setValue(value); }
const HLAVec3DataElement<T>* getDataElement() const
{ return _value.get(); }
HLAVec3DataElement<T>* getDataElement()
{ return _value.get(); }
const HLAArrayDataType* getDataType() const
{ return _value->getDataType(); }
void setDataType(const HLAArrayDataType* dataType)
{ _value->setDataType(dataType); }
private:
SGSharedPtr<HLAVec3DataElement<T> > _value;
};
typedef HLAVec3Data<float> HLAVec3fData;
typedef HLAVec3Data<double> HLAVec3dData;
template<typename T>
class HLAVec4DataElement : public HLAAbstractArrayDataElement {
public:
HLAVec4DataElement(const HLAArrayDataType* dataType = 0) :
HLAAbstractArrayDataElement(dataType),
_value(SGVec4<T>::zeros())
{}
HLAVec4DataElement(const HLAArrayDataType* dataType, const SGVec4<T>& value) :
HLAAbstractArrayDataElement(dataType),
_value(value)
{}
const SGVec4<T>& getValue() const
{ return _value; }
void setValue(const SGVec4<T>& value)
{ _value = value; setDirty(true); }
virtual bool setNumElements(unsigned count)
{
for (unsigned i = count; i < 4; ++i)
_value[i] = 0;
return true;
}
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
{
if (i < 4) {
HLATemplateDecodeVisitor<typename SGVec4<T>::value_type> visitor(stream);
getElementDataType()->accept(visitor);
_value[i] = visitor.getValue();
} else {
HLADataTypeDecodeVisitor visitor(stream);
getElementDataType()->accept(visitor);
}
return true;
}
virtual unsigned getNumElements() const
{
return 4;
}
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
{
if (i < 4) {
HLATemplateEncodeVisitor<typename SGVec4<T>::value_type> visitor(stream, _value[i]);
getElementDataType()->accept(visitor);
} else {
HLADataTypeEncodeVisitor visitor(stream);
getElementDataType()->accept(visitor);
}
return true;
}
private:
SGVec4<T> _value;
};
template<typename T>
class HLAVec4Data {
public:
HLAVec4Data() :
_value(new HLAVec4DataElement<T>(0))
{ }
HLAVec4Data(const SGVec4<T>& value) :
_value(new HLAVec4DataElement<T>(0, value))
{ }
operator const SGVec4<T>&() const
{ return _value->getValue(); }
HLAVec4Data& operator=(const SGVec4<T>& value)
{ _value->setValue(value); return *this; }
const SGVec4<T>& getValue() const
{ return _value->getValue(); }
void setValue(const SGVec4<T>& value)
{ _value->setValue(value); }
const HLAVec4DataElement<T>* getDataElement() const
{ return _value.get(); }
HLAVec4DataElement<T>* getDataElement()
{ return _value.get(); }
const HLAArrayDataType* getDataType() const
{ return _value->getDataType(); }
void setDataType(const HLAArrayDataType* dataType)
{ _value->setDataType(dataType); }
private:
SGSharedPtr<HLAVec4DataElement<T> > _value;
};
typedef HLAVec4Data<float> HLAVec4fData;
typedef HLAVec4Data<double> HLAVec4dData;
template<typename T>
class HLAQuatDataElement : public HLAAbstractArrayDataElement {
public:
HLAQuatDataElement(const HLAArrayDataType* dataType = 0) :
HLAAbstractArrayDataElement(dataType),
_value(SGQuat<T>::zeros())
{}
HLAQuatDataElement(const HLAArrayDataType* dataType, const SGQuat<T>& value) :
HLAAbstractArrayDataElement(dataType),
_value(value)
{}
const SGQuat<T>& getValue() const
{ return _value; }
void setValue(const SGQuat<T>& value)
{ _value = value; setDirty(true); }
virtual bool setNumElements(unsigned count)
{
for (unsigned i = count; i < 4; ++i)
_value[i] = 0;
return true;
}
virtual bool decodeElement(HLADecodeStream& stream, unsigned i)
{
if (i < 4) {
HLATemplateDecodeVisitor<typename SGQuat<T>::value_type> visitor(stream);
getElementDataType()->accept(visitor);
_value[i] = visitor.getValue();
} else {
HLADataTypeDecodeVisitor visitor(stream);
getElementDataType()->accept(visitor);
}
return true;
}
virtual unsigned getNumElements() const
{
return 4;
}
virtual bool encodeElement(HLAEncodeStream& stream, unsigned i) const
{
if (i < 4) {
HLATemplateEncodeVisitor<typename SGQuat<T>::value_type> visitor(stream, _value[i]);
getElementDataType()->accept(visitor);
} else {
HLADataTypeEncodeVisitor visitor(stream);
getElementDataType()->accept(visitor);
}
return true;
}
private:
SGQuat<T> _value;
};
}
#endif

View File

@@ -0,0 +1,198 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAArrayDataType.hxx"
#include "HLAArrayDataElement.hxx"
namespace simgear {
HLAArrayDataType::HLAArrayDataType(const std::string& name) :
HLADataType(name),
_isOpaque(false),
_isString(false)
{
}
HLAArrayDataType::~HLAArrayDataType()
{
}
void
HLAArrayDataType::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
const HLAArrayDataType*
HLAArrayDataType::toArrayDataType() const
{
return this;
}
void
HLAArrayDataType::releaseDataTypeReferences()
{
_elementDataType = 0;
HLADataType::releaseDataTypeReferences();
}
void
HLAArrayDataType::setElementDataType(const HLADataType* elementDataType)
{
_elementDataType = elementDataType;
}
void
HLAArrayDataType::setIsOpaque(bool isOpaque)
{
_isOpaque = isOpaque;
}
void
HLAArrayDataType::setIsString(bool isString)
{
_isString = isString;
}
void
HLAArrayDataType::_recomputeAlignmentImplementation()
{
unsigned alignment = 1;
if (const HLADataType* dataType = getElementDataType())
alignment = std::max(alignment, dataType->getAlignment());
setAlignment(alignment);
}
///////////////////////////////////////////////////////////////////////////////////
HLAFixedArrayDataType::HLAFixedArrayDataType(const std::string& name) :
HLAArrayDataType(name)
{
}
HLAFixedArrayDataType::~HLAFixedArrayDataType()
{
}
void
HLAFixedArrayDataType::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
bool
HLAFixedArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
{
stream.alignOffsetForSize(getAlignment());
unsigned numElements = getNumElements();
if (!value.setNumElements(numElements))
return false;
for (unsigned i = 0; i < numElements; ++i)
if (!value.decodeElement(stream, i))
return false;
return true;
}
bool
HLAFixedArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
{
stream.alignOffsetForSize(getAlignment());
unsigned numElementsType = getNumElements();
unsigned numElementsValue = value.getNumElements();
unsigned numElements = SGMisc<unsigned>::min(numElementsType, numElementsValue);
unsigned i = 0;
for (; i < numElements; ++i)
if (!value.encodeElement(stream, i))
return false;
for (; i < numElementsType; ++i) {
HLADataTypeEncodeVisitor visitor(stream);
getElementDataType()->accept(visitor);
}
return true;
}
/////////////////////////////////////////////////////////////////////////////////
HLAVariableArrayDataType::HLAVariableArrayDataType(const std::string& name) :
HLAArrayDataType(name)
{
setSizeDataType(new HLAUInt32BEDataType);
}
HLAVariableArrayDataType::~HLAVariableArrayDataType()
{
}
void
HLAVariableArrayDataType::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
bool
HLAVariableArrayDataType::decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const
{
stream.alignOffsetForSize(getAlignment());
HLATemplateDecodeVisitor<unsigned> numElementsVisitor(stream);
getSizeDataType()->accept(numElementsVisitor);
unsigned numElements = numElementsVisitor.getValue();
if (!value.setNumElements(numElements))
return false;
for (unsigned i = 0; i < numElements; ++i)
if (!value.decodeElement(stream, i))
return false;
return true;
}
bool
HLAVariableArrayDataType::encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const
{
stream.alignOffsetForSize(getAlignment());
unsigned numElements = value.getNumElements();
HLATemplateEncodeVisitor<unsigned> numElementsVisitor(stream, numElements);
getSizeDataType()->accept(numElementsVisitor);
for (unsigned i = 0; i < numElements; ++i)
if (!value.encodeElement(stream, i))
return false;
return true;
}
void
HLAVariableArrayDataType::setSizeDataType(const HLABasicDataType* sizeDataType)
{
_sizeDataType = sizeDataType;
}
void
HLAVariableArrayDataType::_recomputeAlignmentImplementation()
{
unsigned alignment = 1;
if (const HLADataType* dataType = getElementDataType())
alignment = std::max(alignment, dataType->getAlignment());
if (const HLADataType* dataType = getSizeDataType())
alignment = std::max(alignment, dataType->getAlignment());
setAlignment(alignment);
}
} // namespace simgear

View File

@@ -0,0 +1,106 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAArrayDataType_hxx
#define HLAArrayDataType_hxx
#include <string>
#include <simgear/structure/SGSharedPtr.hxx>
#include "HLADataType.hxx"
namespace simgear {
class HLAAbstractArrayDataElement;
class HLAArrayDataType : public HLADataType {
public:
HLAArrayDataType(const std::string& name = "HLAArrayDataType");
virtual ~HLAArrayDataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual const HLAArrayDataType* toArrayDataType() const;
virtual void releaseDataTypeReferences();
virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const = 0;
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const = 0;
void setElementDataType(const HLADataType* elementDataType);
const HLADataType* getElementDataType() const
{ return _elementDataType.get(); }
void setIsOpaque(bool isOpaque);
bool getIsOpaque() const
{ return _isOpaque; }
void setIsString(bool isString);
bool getIsString() const
{ return _isString; }
protected:
virtual void _recomputeAlignmentImplementation();
private:
SGSharedPtr<const HLADataType> _elementDataType;
bool _isOpaque;
bool _isString;
};
class HLAFixedArrayDataType : public HLAArrayDataType {
public:
HLAFixedArrayDataType(const std::string& name = "HLAFixedArrayDataType");
virtual ~HLAFixedArrayDataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const;
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const;
void setNumElements(unsigned numElements)
{ _numElements = numElements; }
unsigned getNumElements() const
{ return _numElements; }
private:
unsigned _numElements;
};
class HLAVariableArrayDataType : public HLAArrayDataType {
public:
HLAVariableArrayDataType(const std::string& name = "HLAVariableArrayDataType");
virtual ~HLAVariableArrayDataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual bool decode(HLADecodeStream& stream, HLAAbstractArrayDataElement& value) const;
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractArrayDataElement& value) const;
void setSizeDataType(const HLABasicDataType* sizeDataType);
const HLABasicDataType* getSizeDataType() const
{ return _sizeDataType.get(); }
protected:
virtual void _recomputeAlignmentImplementation();
private:
SGSharedPtr<const HLABasicDataType> _sizeDataType;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,152 @@
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLABasicDataElement.hxx"
#include "HLADataElementVisitor.hxx"
#include "HLADataTypeVisitor.hxx"
namespace simgear {
HLABasicDataElement::HLABasicDataElement(const HLABasicDataType* dataType) :
_dataType(dataType)
{
}
HLABasicDataElement::~HLABasicDataElement()
{
}
void
HLABasicDataElement::accept(HLADataElementVisitor& visitor)
{
visitor.apply(*this);
}
void
HLABasicDataElement::accept(HLAConstDataElementVisitor& visitor) const
{
visitor.apply(*this);
}
const HLABasicDataType*
HLABasicDataElement::getDataType() const
{
return _dataType.get();
}
bool
HLABasicDataElement::setDataType(const HLADataType* dataType)
{
const HLABasicDataType* scalarDataType = dynamic_cast<const HLABasicDataType*>(dataType);
if (!scalarDataType) {
SG_LOG(SG_NETWORK, SG_WARN, "HLABasicDataType: unable to set data type!");
return false;
}
setDataType(scalarDataType);
return true;
}
void
HLABasicDataElement::setDataType(const HLABasicDataType* dataType)
{
_dataType = dataType;
}
#define IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(type, ctype) \
HLAAbstract##type##DataElement::HLAAbstract##type##DataElement(const HLABasicDataType* dataType) :\
HLABasicDataElement(dataType) \
{ \
} \
\
HLAAbstract##type##DataElement::~HLAAbstract##type##DataElement() \
{ \
} \
\
bool \
HLAAbstract##type##DataElement::encode(HLAEncodeStream& stream) const \
{ \
if (!_dataType.valid()) \
return false; \
HLATemplateEncodeVisitor<ctype> visitor(stream, getValue()); \
_dataType->accept(visitor); \
return true; \
} \
\
bool \
HLAAbstract##type##DataElement::decode(HLADecodeStream& stream) \
{ \
if (!_dataType.valid()) \
return false; \
HLATemplateDecodeVisitor<ctype> visitor(stream); \
_dataType->accept(visitor); \
setValue(visitor.getValue()); \
return true; \
} \
\
HLA##type##DataElement::HLA##type##DataElement(const HLABasicDataType* dataType) : \
HLAAbstract##type##DataElement(dataType), \
_value(0) \
{ \
} \
\
HLA##type##DataElement::HLA##type##DataElement(const HLABasicDataType* dataType, \
const ctype& value) : \
HLAAbstract##type##DataElement(dataType), \
_value(value) \
{ \
} \
\
HLA##type##DataElement::~HLA##type##DataElement() \
{ \
} \
\
ctype \
HLA##type##DataElement::getValue() const \
{ \
return _value; \
} \
\
void \
HLA##type##DataElement::setValue(ctype value) \
{ \
_value = value; \
setDirty(true); \
}
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Char, char);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(WChar, wchar_t);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(SChar, signed char);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(UChar, unsigned char);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Short, short);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(UShort, unsigned short);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Int, int);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(UInt, unsigned int);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Long, long);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(ULong, unsigned long);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Float, float);
IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT(Double, double);
#undef IMPLEMENT_TYPED_HLA_BASIC_DATA_ELEMENT
}

View File

@@ -0,0 +1,115 @@
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLABasicDataElement_hxx
#define HLABasicDataElement_hxx
#include "HLABasicDataType.hxx"
#include "HLADataElement.hxx"
namespace simgear {
class HLABasicDataElement : public HLADataElement {
public:
HLABasicDataElement(const HLABasicDataType* dataType);
virtual ~HLABasicDataElement();
virtual void accept(HLADataElementVisitor& visitor);
virtual void accept(HLAConstDataElementVisitor& visitor) const;
virtual bool encode(HLAEncodeStream& stream) const = 0;
virtual bool decode(HLADecodeStream& stream) = 0;
virtual const HLABasicDataType* getDataType() const;
virtual bool setDataType(const HLADataType* dataType);
void setDataType(const HLABasicDataType* dataType);
protected:
SGSharedPtr<const HLABasicDataType> _dataType;
};
#define TYPED_HLA_BASIC_DATA_ELEMENT(type, ctype) \
class HLAAbstract##type##DataElement : public HLABasicDataElement { \
public: \
HLAAbstract##type##DataElement(const HLABasicDataType* dataType = 0); \
virtual ~HLAAbstract##type##DataElement(); \
\
virtual bool encode(HLAEncodeStream& stream) const; \
virtual bool decode(HLADecodeStream& stream); \
\
virtual ctype getValue() const = 0; \
virtual void setValue(ctype) = 0; \
}; \
class HLA##type##DataElement : public HLAAbstract##type##DataElement { \
public: \
HLA##type##DataElement(const HLABasicDataType* dataType = 0); \
HLA##type##DataElement(const HLABasicDataType* dataType, \
const ctype& value); \
virtual ~HLA##type##DataElement(); \
virtual ctype getValue() const; \
virtual void setValue(ctype value); \
private: \
ctype _value; \
}; \
class HLA##type##Data { \
public: \
HLA##type##Data() : \
_value(new HLA##type##DataElement(0)) \
{ } \
HLA##type##Data(const ctype& value) : \
_value(new HLA##type##DataElement(0, value)) \
{ } \
operator ctype() const \
{ return _value->getValue(); } \
HLA##type##Data& operator=(const ctype& value) \
{ _value->setValue(value); return *this; } \
ctype getValue() const \
{ return _value->getValue(); } \
void setValue(const ctype& value) \
{ _value->setValue(value); } \
const HLA##type##DataElement* getDataElement() const \
{ return _value.get(); } \
HLA##type##DataElement* getDataElement() \
{ return _value.get(); } \
const HLABasicDataType* getDataType() const \
{ return _value->getDataType(); } \
void setDataType(const HLABasicDataType* dataType) \
{ _value->setDataType(dataType); } \
\
private: \
SGSharedPtr<HLA##type##DataElement> _value; \
};
TYPED_HLA_BASIC_DATA_ELEMENT(Char, char);
TYPED_HLA_BASIC_DATA_ELEMENT(WChar, wchar_t);
TYPED_HLA_BASIC_DATA_ELEMENT(SChar, signed char);
TYPED_HLA_BASIC_DATA_ELEMENT(UChar, unsigned char);
TYPED_HLA_BASIC_DATA_ELEMENT(Short, short);
TYPED_HLA_BASIC_DATA_ELEMENT(UShort, unsigned short);
TYPED_HLA_BASIC_DATA_ELEMENT(Int, int);
TYPED_HLA_BASIC_DATA_ELEMENT(UInt, unsigned int);
TYPED_HLA_BASIC_DATA_ELEMENT(Long, long);
TYPED_HLA_BASIC_DATA_ELEMENT(ULong, unsigned long);
TYPED_HLA_BASIC_DATA_ELEMENT(Float, float);
TYPED_HLA_BASIC_DATA_ELEMENT(Double, double);
#undef TYPED_HLA_BASIC_DATA_ELEMENT
}
#endif

View File

@@ -0,0 +1,176 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLABasicDataType.hxx"
#include "HLADataType.hxx"
#include "HLADataTypeVisitor.hxx"
namespace simgear {
HLABasicDataType::HLABasicDataType(const std::string& name) :
HLADataType(name)
{
}
HLABasicDataType::~HLABasicDataType()
{
}
void
HLABasicDataType::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
const HLABasicDataType*
HLABasicDataType::toBasicDataType() const
{
return this;
}
//////////////////////////////////////////////////////////////////////////////
HLAInt8DataType::HLAInt8DataType(const std::string& name) :
HLABasicDataType(name)
{
setAlignment(sizeof(int8_t));
}
HLAInt8DataType::~HLAInt8DataType()
{
}
void
HLAInt8DataType::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
//////////////////////////////////////////////////////////////////////////////
HLAUInt8DataType::HLAUInt8DataType(const std::string& name) :
HLABasicDataType(name)
{
setAlignment(sizeof(uint8_t));
}
HLAUInt8DataType::~HLAUInt8DataType()
{
}
void
HLAUInt8DataType::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
//////////////////////////////////////////////////////////////////////////////
#define BASIC_DATATYPE_IMPLEMENTATION(type, name) \
HLA##name##DataType::HLA##name##DataType(const std::string& name) : \
HLABasicDataType(name) \
{ \
setAlignment(sizeof(type)); \
} \
\
HLA##name##DataType::~HLA##name##DataType() \
{ \
} \
\
void \
HLA##name##DataType::accept(HLADataTypeVisitor& visitor) const \
{ \
visitor.apply(*this); \
} \
\
\
\
HLA##name##LEDataType::HLA##name##LEDataType(const std::string& name) : \
HLA##name##DataType(name) \
{ \
} \
\
HLA##name##LEDataType::~HLA##name##LEDataType() \
{ \
} \
\
bool \
HLA##name##LEDataType::decode(HLADecodeStream& stream, \
type& value) const \
{ \
if (!stream.alignOffsetForSize(getAlignment())) \
return false; \
return stream.decode##name##LE(value); \
} \
\
bool \
HLA##name##LEDataType::encode(HLAEncodeStream& stream, \
const type& value) const \
{ \
if (!stream.alignOffsetForSize(getAlignment())) \
return false; \
return stream.encode##name##LE(value); \
} \
\
\
\
HLA##name##BEDataType::HLA##name##BEDataType(const std::string& name) : \
HLA##name##DataType(name) \
{ \
} \
\
HLA##name##BEDataType::~HLA##name##BEDataType() \
{ \
} \
\
bool \
HLA##name##BEDataType::decode(HLADecodeStream& stream, \
type& value) const \
{ \
if (!stream.alignOffsetForSize(getAlignment())) \
return false; \
return stream.decode##name##BE(value); \
} \
\
bool \
HLA##name##BEDataType::encode(HLAEncodeStream& stream, \
const type& value) const \
{ \
if (!stream.alignOffsetForSize(getAlignment())) \
return false; \
return stream.encode##name##BE(value); \
}
BASIC_DATATYPE_IMPLEMENTATION(int16_t, Int16)
BASIC_DATATYPE_IMPLEMENTATION(uint16_t, UInt16)
BASIC_DATATYPE_IMPLEMENTATION(int32_t, Int32)
BASIC_DATATYPE_IMPLEMENTATION(uint32_t, UInt32)
BASIC_DATATYPE_IMPLEMENTATION(int64_t, Int64)
BASIC_DATATYPE_IMPLEMENTATION(uint64_t, UInt64)
BASIC_DATATYPE_IMPLEMENTATION(float, Float32)
BASIC_DATATYPE_IMPLEMENTATION(double, Float64)
#undef BASIC_DATATYPE_IMPLEMENTATION
} // namespace simgear

View File

@@ -0,0 +1,155 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLABasicDataType_hxx
#define HLABasicDataType_hxx
#include <string>
#include "HLADataType.hxx"
namespace simgear {
class HLABasicDataType : public HLADataType {
public:
virtual ~HLABasicDataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual const HLABasicDataType* toBasicDataType() const;
protected:
HLABasicDataType(const std::string& name);
};
class HLAInt8DataType : public HLABasicDataType {
public:
HLAInt8DataType(const std::string& name = "HLAInt8DataType");
virtual ~HLAInt8DataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
bool skip(HLADecodeStream& stream) const
{
if (!stream.alignOffsetForSize(getAlignment()))
return false;
return stream.skip(1);
}
bool skip(HLAEncodeStream& stream) const
{
if (!stream.alignOffsetForSize(getAlignment()))
return false;
return stream.skip(1);
}
bool decode(HLADecodeStream& stream, int8_t& value) const
{
if (!stream.alignOffsetForSize(getAlignment()))
return false;
return stream.decodeInt8(value);
}
bool encode(HLAEncodeStream& stream, const int8_t& value) const
{
if (!stream.alignOffsetForSize(getAlignment()))
return false;
return stream.encodeInt8(value);
}
};
class HLAUInt8DataType : public HLABasicDataType {
public:
HLAUInt8DataType(const std::string& name = "HLAUInt8DataType");
virtual ~HLAUInt8DataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
bool skip(HLADecodeStream& stream) const
{
if (!stream.alignOffsetForSize(getAlignment()))
return false;
return stream.skip(1);
}
bool skip(HLAEncodeStream& stream) const
{
if (!stream.alignOffsetForSize(getAlignment()))
return false;
return stream.skip(1);
}
bool decode(HLADecodeStream& stream, uint8_t& value) const
{
if (!stream.alignOffsetForSize(getAlignment()))
return false;
return stream.decodeUInt8(value);
}
bool encode(HLAEncodeStream& stream, const uint8_t& value) const
{
if (!stream.alignOffsetForSize(getAlignment()))
return false;
return stream.encodeUInt8(value);
}
};
#define BASIC_DATATYPE_IMPLEMENTATION(type, name) \
class HLA##name##DataType : public HLABasicDataType { \
public: \
virtual ~HLA##name##DataType(); \
\
virtual void accept(HLADataTypeVisitor& visitor) const; \
\
bool skip(HLADecodeStream& stream) const \
{ \
if (!stream.alignOffsetForSize(getAlignment())) \
return false; \
return stream.skip(sizeof(type)); \
} \
bool skip(HLAEncodeStream& stream) const \
{ \
if (!stream.alignOffsetForSize(getAlignment())) \
return false; \
return stream.skip(sizeof(type)); \
} \
virtual bool decode(HLADecodeStream& stream, type& value) const = 0; \
virtual bool encode(HLAEncodeStream& stream, const type& value) const = 0;\
protected: \
HLA##name##DataType(const std::string& name); \
}; \
class HLA##name##LEDataType : public HLA##name##DataType { \
public: \
HLA##name##LEDataType(const std::string& name = "HLA" #name "LEDataType");\
virtual ~HLA##name##LEDataType(); \
virtual bool decode(HLADecodeStream& stream, type& value) const; \
virtual bool encode(HLAEncodeStream& stream, const type& value) const; \
}; \
class HLA##name##BEDataType : public HLA##name##DataType { \
public: \
HLA##name##BEDataType(const std::string& name = "HLA" #name "BEDataType");\
virtual ~HLA##name##BEDataType(); \
virtual bool decode(HLADecodeStream& stream, type& value) const; \
virtual bool encode(HLAEncodeStream& stream, const type& value) const; \
};
BASIC_DATATYPE_IMPLEMENTATION(int16_t, Int16)
BASIC_DATATYPE_IMPLEMENTATION(uint16_t, UInt16)
BASIC_DATATYPE_IMPLEMENTATION(int32_t, Int32)
BASIC_DATATYPE_IMPLEMENTATION(uint32_t, UInt32)
BASIC_DATATYPE_IMPLEMENTATION(int64_t, Int64)
BASIC_DATATYPE_IMPLEMENTATION(uint64_t, UInt64)
BASIC_DATATYPE_IMPLEMENTATION(float, Float32)
BASIC_DATATYPE_IMPLEMENTATION(double, Float64)
#undef BASIC_DATATYPE_IMPLEMENTATION
} // namespace simgear
#endif

View File

@@ -0,0 +1,258 @@
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLADataElement.hxx"
#include <simgear/debug/logstream.hxx>
#include "HLADataElementVisitor.hxx"
namespace simgear {
HLADataElement::PathElement::Data::~Data()
{
}
const HLADataElement::PathElement::FieldData*
HLADataElement::PathElement::Data::toFieldData() const
{
return 0;
}
const HLADataElement::PathElement::IndexData*
HLADataElement::PathElement::Data::toIndexData() const
{
return 0;
}
HLADataElement::PathElement::FieldData::FieldData(const std::string& name) :
_name(name)
{
}
HLADataElement::PathElement::FieldData::~FieldData()
{
}
const HLADataElement::PathElement::FieldData*
HLADataElement::PathElement::FieldData::toFieldData() const
{
return this;
}
bool
HLADataElement::PathElement::FieldData::less(const Data* data) const
{
const FieldData* fieldData = data->toFieldData();
// IndexData is allways smaller than FieldData
if (!fieldData)
return false;
return _name < fieldData->_name;
}
bool
HLADataElement::PathElement::FieldData::equal(const Data* data) const
{
const FieldData* fieldData = data->toFieldData();
// IndexData is allways smaller than FieldData
if (!fieldData)
return false;
return _name == fieldData->_name;
}
void
HLADataElement::PathElement::FieldData::append(std::string& s) const
{
s.append(1, std::string::value_type('.'));
s.append(_name);
}
HLADataElement::PathElement::IndexData::IndexData(unsigned index) :
_index(index)
{
}
HLADataElement::PathElement::IndexData::~IndexData()
{
}
const HLADataElement::PathElement::IndexData*
HLADataElement::PathElement::IndexData::toIndexData() const
{
return this;
}
bool
HLADataElement::PathElement::IndexData::less(const Data* data) const
{
const IndexData* indexData = data->toIndexData();
// IndexData is allways smaller than FieldData
if (!indexData)
return true;
return _index < indexData->_index;
}
bool
HLADataElement::PathElement::IndexData::equal(const Data* data) const
{
const IndexData* indexData = data->toIndexData();
// IndexData is allways smaller than FieldData
if (!indexData)
return false;
return _index == indexData->_index;
}
void
HLADataElement::PathElement::IndexData::append(std::string& s) const
{
s.append(1, std::string::value_type('['));
unsigned value = _index;
do {
s.append(1, std::string::value_type('0' + value % 10));
} while (value /= 10);
s.append(1, std::string::value_type(']'));
}
HLADataElement::~HLADataElement()
{
}
void
HLADataElement::setTimeStamp(const SGTimeStamp& timeStamp)
{
if (!_stamp.valid())
return;
_stamp->setTimeStamp(timeStamp);
}
void
HLADataElement::setTimeStampValid(bool timeStampValid)
{
if (!_stamp.valid())
return;
_stamp->setTimeStampValid(timeStampValid);
}
double
HLADataElement::getTimeDifference(const SGTimeStamp& timeStamp) const
{
if (!_stamp.valid())
return 0;
if (!_stamp->getTimeStampValid())
return 0;
return (timeStamp - _stamp->getTimeStamp()).toSecs();
}
void
HLADataElement::createStamp()
{
_setStamp(new Stamp);
setDirty(true);
}
void
HLADataElement::attachStamp(HLADataElement& dataElement)
{
_setStamp(dataElement._getStamp());
}
void
HLADataElement::clearStamp()
{
_setStamp(0);
}
void
HLADataElement::accept(HLADataElementVisitor& visitor)
{
visitor.apply(*this);
}
void
HLADataElement::accept(HLAConstDataElementVisitor& visitor) const
{
visitor.apply(*this);
}
std::string
HLADataElement::toString(const Path& path)
{
std::string s;
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
i->append(s);
return s;
}
HLADataElement::StringPathPair
HLADataElement::toStringPathPair(const std::string& s)
{
Path path;
// Skip the initial attribute/parameter name if given
std::string::size_type i = s.find_first_of("[.");
std::string attribute = s.substr(0, i);
while (i < s.size()) {
if (s[i] == '[') {
++i;
unsigned index = 0;
while (i < s.size()) {
if (s[i] == ']')
break;
unsigned v = s[i] - '0';
// Error, no number
if (10 <= v) {
SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid character in array subscript for \""
<< s << "\" at \"" << attribute << toString(path) << "\"!");
return StringPathPair();
}
index *= 10;
index += v;
++i;
}
path.push_back(index);
++i;
continue;
}
if (s[i] == '.') {
// Error, . cannot be last
if (s.size() <= ++i) {
SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid terminating '.' for \""
<< s << "\"!");
return StringPathPair();
}
std::string::size_type e = s.find_first_of("[.", i);
path.push_back(s.substr(i, e - i));
i = e;
continue;
}
}
return StringPathPair(attribute, path);
}
void
HLADataElement::_setStamp(HLADataElement::Stamp* stamp)
{
_stamp = stamp;
}
}

View File

@@ -0,0 +1,256 @@
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLADataElement_hxx
#define HLADataElement_hxx
#include <list>
#include <map>
#include <simgear/structure/SGReferenced.hxx>
#include <simgear/structure/SGSharedPtr.hxx>
#include <simgear/timing/timestamp.hxx>
#include "RTIData.hxx"
#include "HLADataType.hxx"
class SGTimeStamp;
namespace simgear {
class HLADataElementVisitor;
class HLAConstDataElementVisitor;
class HLADataElement : public SGReferenced {
public:
virtual ~HLADataElement();
virtual void accept(HLADataElementVisitor& visitor) = 0;
virtual void accept(HLAConstDataElementVisitor& visitor) const = 0;
virtual bool encode(HLAEncodeStream& stream) const = 0;
virtual bool decode(HLADecodeStream& stream) = 0;
virtual const HLADataType* getDataType() const = 0;
virtual bool setDataType(const HLADataType* dataType) = 0;
/// Returns the time stamp if this data element.
/// Do not access this getter if the getTimeStampValid() method returns false.
const SGTimeStamp& getTimeStamp() const
{ return _stamp->getTimeStamp(); }
void setTimeStamp(const SGTimeStamp& timeStamp);
bool getTimeStampValid() const
{ if (!_stamp.valid()) return false; return _stamp->getTimeStampValid(); }
void setTimeStampValid(bool timeStampValid);
/// Convenience function that gives the time difference in seconds to a given timestamp
/// This function returns 0 if the timestamp is not valid.
double getTimeDifference(const SGTimeStamp& timeStamp) const;
/// Dirty tracking of the attribute/parameter that this data element belongs to
bool getDirty() const
{ if (!_stamp.valid()) return true; return _stamp->getDirty(); }
void setDirty(bool dirty)
{ if (!_stamp.valid()) return; _stamp->setDirty(dirty); }
/// Stamp handling
void createStamp();
void attachStamp(HLADataElement& dataElement);
void clearStamp();
/// HLADataElements could be identified by path
/// These paths are composed of structure field names and array indices in the
/// order they appear while walking to the data element.
/// So provide here some tool functions to access these elements
/// Note that these functions are relatively expensive in execution time.
/// So only use them once at object creation time and store direct references to the values
class PathElement {
public:
PathElement(unsigned index) : _data(new IndexData(index)) {}
PathElement(const std::string& name) : _data(new FieldData(name)) {}
bool isFieldValue() const
{ return _data->toFieldData(); }
bool isIndexValue() const
{ return _data->toIndexData(); }
unsigned getIndexValue() const
{
const IndexData* indexData = _data->toIndexData();
if (!indexData)
return ~unsigned(0);
return indexData->_index;
}
std::string getFieldValue() const
{
const FieldData* fieldData = _data->toFieldData();
if (!fieldData)
return std::string();
return fieldData->_name;
}
// Want to be able to use that in std::map and std::set
bool operator<(const PathElement& pathElement) const
{ return _data->less(pathElement._data.get()); }
bool operator==(const PathElement& pathElement) const
{ return _data->equal(pathElement._data.get()); }
void append(std::string& s) const
{ _data->append(s); }
private:
struct FieldData;
struct IndexData;
struct Data : public SGReferenced {
virtual ~Data();
virtual const FieldData* toFieldData() const;
virtual const IndexData* toIndexData() const;
virtual bool less(const Data*) const = 0;
virtual bool equal(const Data*) const = 0;
virtual void append(std::string&) const = 0;
};
struct FieldData : public Data {
FieldData(const std::string& name);
virtual ~FieldData();
virtual const FieldData* toFieldData() const;
virtual bool less(const Data* data) const;
virtual bool equal(const Data* data) const;
virtual void append(std::string& s) const;
std::string _name;
};
struct IndexData : public Data {
IndexData(unsigned index);
virtual ~IndexData();
virtual const IndexData* toIndexData() const;
virtual bool less(const Data* data) const;
virtual bool equal(const Data* data) const;
virtual void append(std::string& s) const;
unsigned _index;
};
SGSharedPtr<Data> _data;
};
typedef std::list<PathElement> Path;
typedef std::pair<std::string, Path> StringPathPair;
typedef StringPathPair AttributePathPair; // deprecated
typedef std::pair<unsigned, Path> IndexPathPair;
static std::string toString(const Path& path);
static std::string toString(const StringPathPair& path)
{ return path.first + toString(path.second); }
static StringPathPair toStringPathPair(const std::string& s);
static AttributePathPair toAttributePathPair(const std::string& s) // deprecated
{ return toStringPathPair(s); }
static Path toPath(const std::string& s)
{ return toStringPathPair(s).second; }
protected:
// Container for the timestamp the originating attribute was last updated for
class Stamp : public SGReferenced {
public:
Stamp() : _timeStampValid(false), _dirty(true)
{ }
const SGTimeStamp& getTimeStamp() const
{ return _timeStamp; }
void setTimeStamp(const SGTimeStamp& timeStamp)
{ _timeStamp = timeStamp; }
bool getTimeStampValid() const
{ return _timeStampValid; }
void setTimeStampValid(bool timeStampValid)
{ _timeStampValid = timeStampValid; }
bool getDirty() const
{ return _dirty; }
void setDirty(bool dirty)
{ _dirty = dirty; }
private:
SGTimeStamp _timeStamp;
bool _timeStampValid;
bool _dirty;
};
/// get the stamp
Stamp* _getStamp() const
{ return _stamp.get(); }
/// Set the stamp
virtual void _setStamp(Stamp* stamp);
private:
SGSharedPtr<Stamp> _stamp;
};
class HLADataElementProvider {
public:
class AbstractProvider : public SGReferenced {
public:
virtual ~AbstractProvider() { }
virtual HLADataElement* getDataElement(const HLADataElement::Path& path) = 0;
// virtual HLADataElement* getDataElement(const HLADataElement::Path& path, const HLADataType* dataType)
// {
// SGSharedPtr<HLADataElement> dataElement = getDataElement(path);
// if (!dataElement.valid())
// return 0;
// if (!dataElement->setDataType(dataType))
// return 0;
// return dataElement.release();
// }
};
HLADataElementProvider()
{ }
HLADataElementProvider(HLADataElement* dataElement) :
_provider(new ConcreteProvider(dataElement))
{ }
HLADataElementProvider(const SGSharedPtr<HLADataElement>& dataElement) :
_provider(new ConcreteProvider(dataElement))
{ }
HLADataElementProvider(AbstractProvider* provider) :
_provider(provider)
{ }
HLADataElement* getDataElement(const HLADataElement::Path& path) const
{
if (!_provider.valid())
return 0;
return _provider->getDataElement(path);
}
private:
class ConcreteProvider : public AbstractProvider {
public:
ConcreteProvider(const SGSharedPtr<HLADataElement>& dataElement) :
_dataElement(dataElement)
{ }
virtual HLADataElement* getDataElement(const HLADataElement::Path&)
{ return _dataElement.get(); }
private:
SGSharedPtr<HLADataElement> _dataElement;
};
SGSharedPtr<AbstractProvider> _provider;
};
typedef std::map<HLADataElement::Path, HLADataElementProvider> HLAPathElementMap;
typedef std::map<unsigned, HLAPathElementMap> HLAAttributePathElementMap;
}
#endif

View File

@@ -0,0 +1,57 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLADataElementVisitor_hxx
#define HLADataElementVisitor_hxx
namespace simgear {
class HLABasicDataElement;
class HLAAbstractEnumeratedDataElement;
class HLAAbstractFixedRecordDataElement;
class HLAAbstractArrayDataElement;
class HLAAbstractVariantRecordDataElement;
class HLADataElementVisitor {
public:
virtual ~HLADataElementVisitor() {}
virtual void apply(HLADataElement&);
virtual void apply(HLABasicDataElement&);
virtual void apply(HLAAbstractEnumeratedDataElement&);
virtual void apply(HLAAbstractArrayDataElement&);
virtual void apply(HLAAbstractFixedRecordDataElement&);
virtual void apply(HLAAbstractVariantRecordDataElement&);
};
class HLAConstDataElementVisitor {
public:
virtual ~HLAConstDataElementVisitor() {}
virtual void apply(const HLADataElement&);
virtual void apply(const HLABasicDataElement&);
virtual void apply(const HLAAbstractEnumeratedDataElement&);
virtual void apply(const HLAAbstractArrayDataElement&);
virtual void apply(const HLAAbstractFixedRecordDataElement&);
virtual void apply(const HLAAbstractVariantRecordDataElement&);
};
}
#endif

106
simgear/hla/HLADataType.cxx Normal file
View File

@@ -0,0 +1,106 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLADataType.hxx"
#include "HLADataElement.hxx"
#include "HLADataTypeVisitor.hxx"
namespace simgear {
HLADataType::HLADataType(const std::string& name, unsigned alignment) :
_name(name),
_alignment(1)
{
setAlignment(alignment);
}
HLADataType::~HLADataType()
{
}
void
HLADataType::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
const HLABasicDataType*
HLADataType::toBasicDataType() const
{
return 0;
}
const HLAArrayDataType*
HLADataType::toArrayDataType() const
{
return 0;
}
const HLAEnumeratedDataType*
HLADataType::toEnumeratedDataType() const
{
return 0;
}
const HLAFixedRecordDataType*
HLADataType::toFixedRecordDataType() const
{
return 0;
}
const HLAVariantRecordDataType*
HLADataType::toVariantRecordDataType() const
{
return 0;
}
bool
HLADataType::recomputeAlignment()
{
unsigned alignment = getAlignment();
_recomputeAlignmentImplementation();
return alignment != getAlignment();
}
void
HLADataType::releaseDataTypeReferences()
{
}
void
HLADataType::setAlignment(unsigned alignment)
{
/// FIXME: more checks
if (alignment == 0)
_alignment = 1;
else
_alignment = alignment;
}
void
HLADataType::_recomputeAlignmentImplementation()
{
}
}

View File

@@ -0,0 +1,82 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLADataType_hxx
#define HLADataType_hxx
#include <string>
#include <simgear/structure/SGWeakPtr.hxx>
#include <simgear/structure/SGWeakReferenced.hxx>
#include "RTIData.hxx"
namespace simgear {
class HLADataTypeVisitor;
class HLABasicDataType;
class HLAArrayDataType;
class HLAEnumeratedDataType;
class HLAFixedRecordDataType;
class HLAVariantRecordDataType;
class HLADataType : public SGWeakReferenced {
public:
virtual ~HLADataType();
const std::string& getName() const
{ return _name; }
const std::string& getSemantics() const
{ return _semantics; }
void setSemantics(const std::string& semantics)
{ _semantics = semantics; }
unsigned getAlignment() const
{ return _alignment; }
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual const HLABasicDataType* toBasicDataType() const;
virtual const HLAArrayDataType* toArrayDataType() const;
virtual const HLAEnumeratedDataType* toEnumeratedDataType() const;
virtual const HLAFixedRecordDataType* toFixedRecordDataType() const;
/// deprecated
const HLAVariantRecordDataType* toVariantDataType() const { return toVariantRecordDataType(); }
virtual const HLAVariantRecordDataType* toVariantRecordDataType() const;
/// Recompute the alignment value of this data type.
/// Return true if the alignment changed, false otherwise.
bool recomputeAlignment();
/// Release references to other data types. Since we can have cycles this is
/// required for propper feeing of memory.
virtual void releaseDataTypeReferences();
protected:
HLADataType(const std::string& name, unsigned alignment = 1);
void setAlignment(unsigned alignment);
virtual void _recomputeAlignmentImplementation();
private:
std::string _name;
std::string _semantics;
unsigned _alignment;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,194 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLADataTypeVisitor.hxx"
#include "HLAArrayDataElement.hxx"
#include "HLABasicDataElement.hxx"
#include "HLADataTypeVisitor.hxx"
#include "HLAEnumeratedDataElement.hxx"
#include "HLAFixedRecordDataElement.hxx"
#include "HLAVariantRecordDataElement.hxx"
namespace simgear {
HLADataElementFactoryVisitor::~HLADataElementFactoryVisitor()
{
}
void
HLADataElementFactoryVisitor::apply(const HLADataType& dataType)
{
SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Can not find a suitable data element for data type \""
<< dataType.getName() << "\"");
}
void
HLADataElementFactoryVisitor::apply(const HLAInt8DataType& dataType)
{
_dataElement = new HLASCharDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAUInt8DataType& dataType)
{
_dataElement = new HLAUCharDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAInt16DataType& dataType)
{
_dataElement = new HLAShortDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAUInt16DataType& dataType)
{
_dataElement = new HLAUShortDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAInt32DataType& dataType)
{
_dataElement = new HLAIntDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAUInt32DataType& dataType)
{
_dataElement = new HLAUIntDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAInt64DataType& dataType)
{
_dataElement = new HLALongDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAUInt64DataType& dataType)
{
_dataElement = new HLAULongDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAFloat32DataType& dataType)
{
_dataElement = new HLAFloatDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAFloat64DataType& dataType)
{
_dataElement = new HLADoubleDataElement(&dataType);
}
class HLADataElementFactoryVisitor::ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
public:
virtual HLADataElement* createElement(const HLAArrayDataElement& element, unsigned index)
{
const HLADataType* dataType = element.getElementDataType();
if (!dataType)
return 0;
HLADataElementFactoryVisitor visitor;
dataType->accept(visitor);
return visitor.getDataElement();
}
};
void
HLADataElementFactoryVisitor::apply(const HLAFixedArrayDataType& dataType)
{
if (dataType.getIsString()) {
_dataElement = new HLAStringDataElement(&dataType);
} else {
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
arrayDataElement = new HLAArrayDataElement(&dataType);
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory);
arrayDataElement->setNumElements(dataType.getNumElements());
_dataElement = arrayDataElement;
}
}
void
HLADataElementFactoryVisitor::apply(const HLAVariableArrayDataType& dataType)
{
if (dataType.getIsString()) {
_dataElement = new HLAStringDataElement(&dataType);
} else {
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
arrayDataElement = new HLAArrayDataElement(&dataType);
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory);
_dataElement = arrayDataElement;
}
}
void
HLADataElementFactoryVisitor::apply(const HLAEnumeratedDataType& dataType)
{
_dataElement = new HLAEnumeratedDataElement(&dataType);
}
void
HLADataElementFactoryVisitor::apply(const HLAFixedRecordDataType& dataType)
{
SGSharedPtr<HLAFixedRecordDataElement> recordDataElement;
recordDataElement = new HLAFixedRecordDataElement(&dataType);
unsigned numFields = dataType.getNumFields();
for (unsigned i = 0; i < numFields; ++i) {
HLADataElementFactoryVisitor visitor;
dataType.getFieldDataType(i)->accept(visitor);
recordDataElement->setField(i, visitor._dataElement.get());
}
_dataElement = recordDataElement;
}
class HLADataElementFactoryVisitor::VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory {
public:
virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index)
{
const HLAVariantRecordDataType* dataType = element.getDataType();
if (!dataType)
return 0;
const HLADataType* alternativeDataType = element.getAlternativeDataType();
if (!alternativeDataType)
return 0;
HLADataElementFactoryVisitor visitor;
alternativeDataType->accept(visitor);
return visitor.getDataElement();
}
};
void
HLADataElementFactoryVisitor::apply(const HLAVariantRecordDataType& dataType)
{
SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement;
variantRecordDataElement = new HLAVariantRecordDataElement(&dataType);
variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory);
_dataElement = variantRecordDataElement;
}
} // namespace simgear

View File

@@ -0,0 +1,661 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLADataTypeVisitor_hxx
#define HLADataTypeVisitor_hxx
#include <cassert>
#include <string>
#include <simgear/debug/logstream.hxx>
#include <simgear/math/SGMath.hxx>
#include "HLAArrayDataType.hxx"
#include "HLABasicDataType.hxx"
#include "HLADataElement.hxx"
#include "HLAEnumeratedDataType.hxx"
#include "HLAFixedRecordDataType.hxx"
#include "HLAVariantRecordDataType.hxx"
namespace simgear {
class HLADataTypeVisitor {
public:
virtual ~HLADataTypeVisitor() {}
virtual void apply(const HLADataType& dataType)
{ }
virtual void apply(const HLABasicDataType& dataType)
{ apply(static_cast<const HLADataType&>(dataType)); }
virtual void apply(const HLAInt8DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAUInt8DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAInt16DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAUInt16DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAInt32DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAUInt32DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAInt64DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAUInt64DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAFloat32DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAFloat64DataType& dataType)
{ apply(static_cast<const HLABasicDataType&>(dataType)); }
virtual void apply(const HLAArrayDataType& dataType)
{ apply(static_cast<const HLADataType&>(dataType)); }
virtual void apply(const HLAFixedArrayDataType& dataType)
{ apply(static_cast<const HLAArrayDataType&>(dataType)); }
virtual void apply(const HLAVariableArrayDataType& dataType)
{ apply(static_cast<const HLAArrayDataType&>(dataType)); }
virtual void apply(const HLAEnumeratedDataType& dataType)
{ apply(static_cast<const HLADataType&>(dataType)); }
virtual void apply(const HLAFixedRecordDataType& dataType)
{ apply(static_cast<const HLADataType&>(dataType)); }
virtual void apply(const HLAVariantRecordDataType& dataType)
{ apply(static_cast<const HLADataType&>(dataType)); }
};
/// Walks the datatype tree and checks if it is completely defined
class HLADataTypeCheckVisitor : public HLADataTypeVisitor {
public:
HLADataTypeCheckVisitor() : _valid(true) {}
bool valid() const { return _valid; }
virtual void apply(const HLAInt8DataType& dataType) { }
virtual void apply(const HLAUInt8DataType& dataType) { }
virtual void apply(const HLAInt16DataType& dataType) { }
virtual void apply(const HLAUInt16DataType& dataType) { }
virtual void apply(const HLAInt32DataType& dataType) { }
virtual void apply(const HLAUInt32DataType& dataType) { }
virtual void apply(const HLAInt64DataType& dataType) { }
virtual void apply(const HLAUInt64DataType& dataType) { }
virtual void apply(const HLAFloat32DataType& dataType) { }
virtual void apply(const HLAFloat64DataType& dataType) { }
virtual void apply(const HLAFixedArrayDataType& dataType)
{
if (!dataType.getElementDataType())
_valid = false;
else
dataType.getElementDataType()->accept(*this);
}
virtual void apply(const HLAVariableArrayDataType& dataType)
{
if (!dataType.getElementDataType())
_valid = false;
else
dataType.getElementDataType()->accept(*this);
if (!dataType.getSizeDataType())
_valid = false;
else
dataType.getSizeDataType()->accept(*this);
}
virtual void apply(const HLAEnumeratedDataType& dataType)
{
if (!dataType.getRepresentation())
_valid = false;
else
dataType.getRepresentation()->accept(*this);
}
virtual void apply(const HLAFixedRecordDataType& dataType)
{
unsigned numFields = dataType.getNumFields();
for (unsigned i = 0; i < numFields; ++i) {
if (!dataType.getFieldDataType(i))
_valid = false;
else
dataType.getFieldDataType(i)->accept(*this);
}
}
virtual void apply(const HLAVariantRecordDataType& dataType)
{ assert(0); }
protected:
bool _valid;
};
class HLADataTypeDecodeVisitor : public HLADataTypeVisitor {
public:
HLADataTypeDecodeVisitor(HLADecodeStream& stream) : _stream(stream) {}
virtual ~HLADataTypeDecodeVisitor() {}
virtual void apply(const HLAInt8DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAUInt8DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAInt16DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAUInt16DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAInt32DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAUInt32DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAInt64DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAUInt64DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAFloat32DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAFloat64DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAFixedArrayDataType& dataType)
{
unsigned numElements = dataType.getNumElements();
for (unsigned i = 0; i < numElements; ++i)
dataType.getElementDataType()->accept(*this);
}
virtual void apply(const HLAVariableArrayDataType& dataType);
virtual void apply(const HLAEnumeratedDataType& dataType)
{
dataType.getRepresentation()->accept(*this);
}
virtual void apply(const HLAFixedRecordDataType& dataType)
{
unsigned numFields = dataType.getNumFields();
for (unsigned i = 0; i < numFields; ++i)
dataType.getFieldDataType(i)->accept(*this);
}
virtual void apply(const HLAVariantRecordDataType& dataType) { assert(0); }
protected:
HLADecodeStream& _stream;
};
class HLADataTypeEncodeVisitor : public HLADataTypeVisitor {
public:
HLADataTypeEncodeVisitor(HLAEncodeStream& stream) : _stream(stream) {}
virtual ~HLADataTypeEncodeVisitor() {}
virtual void apply(const HLAInt8DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAUInt8DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAInt16DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAUInt16DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAInt32DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAUInt32DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAInt64DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAUInt64DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAFloat32DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAFloat64DataType& dataType) { dataType.skip(_stream); }
virtual void apply(const HLAFixedArrayDataType& dataType)
{
/// FIXME, might vanish in this sense ...
// dataType.encode(_stream, *this);
unsigned numElements = dataType.getNumElements();
for (unsigned i = 0; i < numElements; ++i)
dataType.getElementDataType()->accept(*this);
}
virtual void apply(const HLAVariableArrayDataType& dataType);
virtual void apply(const HLAEnumeratedDataType& dataType)
{
dataType.getRepresentation()->accept(*this);
}
virtual void apply(const HLAFixedRecordDataType& dataType)
{
unsigned numFields = dataType.getNumFields();
for (unsigned i = 0; i < numFields; ++i)
dataType.getFieldDataType(i)->accept(*this);
}
virtual void apply(const HLAVariantRecordDataType& dataType) { assert(0); }
protected:
HLAEncodeStream& _stream;
};
/// Begin implementation of some get/set visitors
class HLAScalarDecodeVisitor : public HLADataTypeDecodeVisitor {
public:
HLAScalarDecodeVisitor(HLADecodeStream& stream) :
HLADataTypeDecodeVisitor(stream)
{}
virtual void apply(const HLAFixedArrayDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAVariableArrayDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAEnumeratedDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAFixedRecordDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAVariantRecordDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing scalar value");
HLADataTypeDecodeVisitor::apply(dataType);
}
};
class HLAScalarEncodeVisitor : public HLADataTypeEncodeVisitor {
public:
HLAScalarEncodeVisitor(HLAEncodeStream& stream) :
HLADataTypeEncodeVisitor(stream)
{}
virtual void apply(const HLAFixedArrayDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAVariableArrayDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAEnumeratedDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAFixedRecordDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAVariantRecordDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing scalar value");
HLADataTypeEncodeVisitor::apply(dataType);
}
};
class HLAFixedRecordDecodeVisitor : public HLADataTypeDecodeVisitor {
public:
HLAFixedRecordDecodeVisitor(HLADecodeStream& stream) :
HLADataTypeDecodeVisitor(stream)
{ }
virtual void apply(const HLAInt8DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAUInt8DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAInt16DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAUInt16DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAInt32DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAUInt32DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAInt64DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAUInt64DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAFloat32DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAFloat64DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAFixedArrayDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAVariableArrayDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAEnumeratedDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
virtual void apply(const HLAVariantRecordDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while decodeing a fixed record value");
HLADataTypeDecodeVisitor::apply(dataType);
}
};
class HLAFixedRecordEncodeVisitor : public HLADataTypeEncodeVisitor {
public:
HLAFixedRecordEncodeVisitor(HLAEncodeStream& stream) :
HLADataTypeEncodeVisitor(stream)
{ }
virtual void apply(const HLAInt8DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAUInt8DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAInt16DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAUInt16DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAInt32DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAUInt32DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAInt64DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAUInt64DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAFloat32DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAFloat64DataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAFixedArrayDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAVariableArrayDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAEnumeratedDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
virtual void apply(const HLAVariantRecordDataType& dataType)
{
SG_LOG(SG_NETWORK, SG_WARN, "Unexpected HLADataType while writing a fixed record value");
HLADataTypeEncodeVisitor::apply(dataType);
}
};
template<typename T>
class HLATemplateDecodeVisitor : public HLAScalarDecodeVisitor {
public:
typedef T value_type;
HLATemplateDecodeVisitor(HLADecodeStream& stream, const value_type& value = value_type()) :
HLAScalarDecodeVisitor(stream),
_value(value)
{}
void setValue(const value_type& value)
{ _value = value; }
const value_type& getValue() const
{ return _value; }
virtual void apply(const HLAInt8DataType& dataType)
{
int8_t value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
virtual void apply(const HLAUInt8DataType& dataType)
{
uint8_t value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
virtual void apply(const HLAInt16DataType& dataType)
{
int16_t value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
virtual void apply(const HLAUInt16DataType& dataType)
{
uint16_t value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
virtual void apply(const HLAInt32DataType& dataType)
{
int32_t value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
virtual void apply(const HLAUInt32DataType& dataType)
{
uint32_t value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
virtual void apply(const HLAInt64DataType& dataType)
{
int64_t value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
virtual void apply(const HLAUInt64DataType& dataType)
{
uint64_t value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
virtual void apply(const HLAFloat32DataType& dataType)
{
float value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
virtual void apply(const HLAFloat64DataType& dataType)
{
double value = 0;
dataType.decode(_stream, value);
_value = value_type(value);
}
private:
value_type _value;
};
template<typename T>
class HLATemplateEncodeVisitor : public HLAScalarEncodeVisitor {
public:
typedef T value_type;
HLATemplateEncodeVisitor(HLAEncodeStream& stream, const value_type& value = value_type()) :
HLAScalarEncodeVisitor(stream),
_value(value)
{}
void setValue(const value_type& value)
{ _value = value; }
const value_type& getValue() const
{ return _value; }
virtual void apply(const HLAInt8DataType& dataType)
{
dataType.encode(_stream, _value);
}
virtual void apply(const HLAUInt8DataType& dataType)
{
dataType.encode(_stream, _value);
}
virtual void apply(const HLAInt16DataType& dataType)
{
dataType.encode(_stream, _value);
}
virtual void apply(const HLAUInt16DataType& dataType)
{
dataType.encode(_stream, _value);
}
virtual void apply(const HLAInt32DataType& dataType)
{
dataType.encode(_stream, _value);
}
virtual void apply(const HLAUInt32DataType& dataType)
{
dataType.encode(_stream, _value);
}
virtual void apply(const HLAInt64DataType& dataType)
{
dataType.encode(_stream, _value);
}
virtual void apply(const HLAUInt64DataType& dataType)
{
dataType.encode(_stream, _value);
}
virtual void apply(const HLAFloat32DataType& dataType)
{
dataType.encode(_stream, _value);
}
virtual void apply(const HLAFloat64DataType& dataType)
{
dataType.encode(_stream, _value);
}
private:
value_type _value;
};
inline void HLADataTypeDecodeVisitor::apply(const HLAVariableArrayDataType& dataType)
{
HLATemplateDecodeVisitor<unsigned> numElementsVisitor(_stream);
dataType.getSizeDataType()->accept(numElementsVisitor);
unsigned numElements = numElementsVisitor.getValue();
for (unsigned i = 0; i < numElements; ++i)
dataType.getElementDataType()->accept(*this);
}
inline void HLADataTypeEncodeVisitor::apply(const HLAVariableArrayDataType& dataType)
{
HLATemplateEncodeVisitor<unsigned> numElementsVisitor(_stream, 0);
dataType.getSizeDataType()->accept(numElementsVisitor);
}
/// Generate standard data elements according to the traversed type
class HLADataElementFactoryVisitor : public HLADataTypeVisitor {
public:
virtual ~HLADataElementFactoryVisitor();
virtual void apply(const HLADataType& dataType);
virtual void apply(const HLAInt8DataType& dataType);
virtual void apply(const HLAUInt8DataType& dataType);
virtual void apply(const HLAInt16DataType& dataType);
virtual void apply(const HLAUInt16DataType& dataType);
virtual void apply(const HLAInt32DataType& dataType);
virtual void apply(const HLAUInt32DataType& dataType);
virtual void apply(const HLAInt64DataType& dataType);
virtual void apply(const HLAUInt64DataType& dataType);
virtual void apply(const HLAFloat32DataType& dataType);
virtual void apply(const HLAFloat64DataType& dataType);
virtual void apply(const HLAFixedArrayDataType& dataType);
virtual void apply(const HLAVariableArrayDataType& dataType);
virtual void apply(const HLAEnumeratedDataType& dataType);
virtual void apply(const HLAFixedRecordDataType& dataType);
virtual void apply(const HLAVariantRecordDataType& dataType);
HLADataElement* getDataElement()
{ return _dataElement.release(); }
protected:
class ArrayDataElementFactory;
class VariantRecordDataElementFactory;
SGSharedPtr<HLADataElement> _dataElement;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,148 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAEnumeratedDataElement.hxx"
#include <simgear/debug/logstream.hxx>
#include "HLADataElementVisitor.hxx"
namespace simgear {
HLAAbstractEnumeratedDataElement::HLAAbstractEnumeratedDataElement(const HLAEnumeratedDataType* dataType) :
_dataType(dataType)
{
}
HLAAbstractEnumeratedDataElement::~HLAAbstractEnumeratedDataElement()
{
}
void
HLAAbstractEnumeratedDataElement::accept(HLADataElementVisitor& visitor)
{
visitor.apply(*this);
}
void
HLAAbstractEnumeratedDataElement::accept(HLAConstDataElementVisitor& visitor) const
{
visitor.apply(*this);
}
bool
HLAAbstractEnumeratedDataElement::decode(HLADecodeStream& stream)
{
if (!_dataType.valid())
return false;
unsigned index;
if (!_dataType->decode(stream, index))
return false;
setEnumeratorIndex(index);
return true;
}
bool
HLAAbstractEnumeratedDataElement::encode(HLAEncodeStream& stream) const
{
if (!_dataType.valid())
return false;
return _dataType->encode(stream, getEnumeratorIndex());
}
const HLAEnumeratedDataType*
HLAAbstractEnumeratedDataElement::getDataType() const
{
return _dataType.get();
}
bool
HLAAbstractEnumeratedDataElement::setDataType(const HLADataType* dataType)
{
const HLAEnumeratedDataType* enumeratedDataType = dataType->toEnumeratedDataType();
if (!enumeratedDataType) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAEnumeratedDataType: unable to set data type!");
return false;
}
setDataType(enumeratedDataType);
return true;
}
void
HLAAbstractEnumeratedDataElement::setDataType(const HLAEnumeratedDataType* dataType)
{
_dataType = dataType;
}
const HLABasicDataType*
HLAAbstractEnumeratedDataElement::getRepresentationDataType() const
{
if (!_dataType.valid())
return 0;
return _dataType->getRepresentation();
}
std::string
HLAAbstractEnumeratedDataElement::getStringRepresentation() const
{
if (!_dataType.valid())
return std::string();
return _dataType->getString(getEnumeratorIndex());
}
bool
HLAAbstractEnumeratedDataElement::setStringRepresentation(const std::string& name)
{
if (!_dataType.valid())
return false;
unsigned index = _dataType->getIndex(name);
if (_dataType->getNumEnumerators() <= index)
return false;
setEnumeratorIndex(index);
return true;
}
HLAEnumeratedDataElement::HLAEnumeratedDataElement(const HLAEnumeratedDataType* dataType) :
HLAAbstractEnumeratedDataElement(dataType),
_enumeratorIndex(~unsigned(0))
{
}
HLAEnumeratedDataElement::~HLAEnumeratedDataElement()
{
}
unsigned
HLAEnumeratedDataElement::getEnumeratorIndex() const
{
return _enumeratorIndex;
}
void
HLAEnumeratedDataElement::setEnumeratorIndex(unsigned index)
{
_enumeratorIndex = index;
}
}

View File

@@ -0,0 +1,67 @@
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAEnumeratedDataElement_hxx
#define HLAEnumeratedDataElement_hxx
#include "HLADataElement.hxx"
#include "HLAEnumeratedDataType.hxx"
namespace simgear {
class HLAAbstractEnumeratedDataElement : public HLADataElement {
public:
HLAAbstractEnumeratedDataElement(const HLAEnumeratedDataType* dataType);
virtual ~HLAAbstractEnumeratedDataElement();
virtual void accept(HLADataElementVisitor& visitor);
virtual void accept(HLAConstDataElementVisitor& visitor) const;
virtual bool decode(HLADecodeStream& stream);
virtual bool encode(HLAEncodeStream& stream) const;
virtual const HLAEnumeratedDataType* getDataType() const;
virtual bool setDataType(const HLADataType* dataType);
void setDataType(const HLAEnumeratedDataType* dataType);
const HLABasicDataType* getRepresentationDataType() const;
std::string getStringRepresentation() const;
bool setStringRepresentation(const std::string& name);
virtual unsigned getEnumeratorIndex() const = 0;
virtual void setEnumeratorIndex(unsigned index) = 0;
private:
SGSharedPtr<const HLAEnumeratedDataType> _dataType;
};
class HLAEnumeratedDataElement : public HLAAbstractEnumeratedDataElement {
public:
HLAEnumeratedDataElement(const HLAEnumeratedDataType* dataType);
virtual ~HLAEnumeratedDataElement();
virtual unsigned getEnumeratorIndex() const;
virtual void setEnumeratorIndex(unsigned index);
private:
unsigned _enumeratorIndex;
};
}
#endif

View File

@@ -0,0 +1,195 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAEnumeratedDataType.hxx"
#include <map>
#include <sstream>
#include <vector>
#include "HLAEnumeratedDataType.hxx"
#include "HLADataTypeVisitor.hxx"
namespace simgear {
template<typename DataType, typename T>
class HLAEnumeratedDataType::Map : public HLAEnumeratedDataType::AbstractMap {
public:
typedef typename std::pair<std::string,T> RepresentationPair;
typedef typename std::map<T, unsigned> RepresentationIndexMap;
typedef typename std::vector<RepresentationPair> IndexRepresentationMap;
typedef typename std::map<std::string, unsigned> StringIndexMap;
Map(const DataType* dataType) :
_dataType(dataType)
{ }
virtual bool encode(HLAEncodeStream& stream, unsigned index) const
{
T value = _otherRepresentation;
if (index < _indexRepresentationMap.size())
value = _indexRepresentationMap[index].second;
if (!_dataType->encode(stream, value))
return false;
return true;
}
virtual bool decode(HLADecodeStream& stream, unsigned& index) const
{
T value;
if (!_dataType->decode(stream, value))
return false;
typename RepresentationIndexMap::const_iterator i;
i = _representationIndexMap.find(value);
if (i == _representationIndexMap.end())
index = _indexRepresentationMap.size();
else
index = i->second;
return true;
}
virtual const HLABasicDataType* getDataType() const
{ return _dataType.get(); }
virtual bool add(const std::string& name, const std::string& number)
{
std::stringstream ss(number);
T value;
ss >> value;
if (ss.fail())
return false;
if (_representationIndexMap.find(value) != _representationIndexMap.end())
return false;
if (_stringIndexMap.find(name) != _stringIndexMap.end())
return false;
_stringIndexMap[name] = _indexRepresentationMap.size();
_representationIndexMap[value] = _indexRepresentationMap.size();
_indexRepresentationMap.push_back(RepresentationPair(name, value));
return true;
}
virtual std::string getString(unsigned index) const
{
if (_indexRepresentationMap.size() <= index)
return std::string();
return _indexRepresentationMap[index].first;
}
virtual unsigned getIndex(const std::string& name) const
{
typename StringIndexMap::const_iterator i = _stringIndexMap.find(name);
if (i == _stringIndexMap.end())
return ~unsigned(0);
return i->second;
}
virtual unsigned getNumEnumerators() const
{ return _indexRepresentationMap.size(); }
private:
IndexRepresentationMap _indexRepresentationMap;
StringIndexMap _stringIndexMap;
RepresentationIndexMap _representationIndexMap;
T _otherRepresentation;
SGSharedPtr<const DataType> _dataType;
};
class HLAEnumeratedDataType::RepresentationVisitor : public HLADataTypeVisitor {
public:
virtual void apply(const HLAInt8DataType& dataType)
{ _map = new Map<HLAInt8DataType, int8_t>(&dataType); }
virtual void apply(const HLAUInt8DataType& dataType)
{ _map = new Map<HLAUInt8DataType, uint8_t>(&dataType); }
virtual void apply(const HLAInt16DataType& dataType)
{ _map = new Map<HLAInt16DataType, int16_t>(&dataType); }
virtual void apply(const HLAUInt16DataType& dataType)
{ _map = new Map<HLAUInt16DataType, uint16_t>(&dataType); }
virtual void apply(const HLAInt32DataType& dataType)
{ _map = new Map<HLAInt32DataType, int32_t>(&dataType); }
virtual void apply(const HLAUInt32DataType& dataType)
{ _map = new Map<HLAUInt32DataType, uint32_t>(&dataType); }
virtual void apply(const HLAInt64DataType& dataType)
{ _map = new Map<HLAInt64DataType, int64_t>(&dataType); }
virtual void apply(const HLAUInt64DataType& dataType)
{ _map = new Map<HLAUInt64DataType, uint64_t>(&dataType); }
SGSharedPtr<AbstractMap> _map;
};
HLAEnumeratedDataType::HLAEnumeratedDataType(const std::string& name) :
HLADataType(name)
{
}
HLAEnumeratedDataType::~HLAEnumeratedDataType()
{
}
void
HLAEnumeratedDataType::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
const HLAEnumeratedDataType*
HLAEnumeratedDataType::toEnumeratedDataType() const
{
return this;
}
bool
HLAEnumeratedDataType::decode(HLADecodeStream& stream, unsigned& index) const
{
if (!_map.valid())
return false;
if (!_map->decode(stream, index))
return false;
return true;
}
bool
HLAEnumeratedDataType::encode(HLAEncodeStream& stream, unsigned index) const
{
if (!_map.valid())
return false;
return _map->encode(stream, index);
}
void
HLAEnumeratedDataType::setRepresentation(HLABasicDataType* representation)
{
if (!representation)
return;
RepresentationVisitor representationVisitor;
representation->accept(representationVisitor);
_map.swap(representationVisitor._map);
}
void
HLAEnumeratedDataType::_recomputeAlignmentImplementation()
{
unsigned alignment = 1;
if (const HLADataType* dataType = getRepresentation())
alignment = std::max(alignment, dataType->getAlignment());
setAlignment(alignment);
}
} // namespace simgear

View File

@@ -0,0 +1,98 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAEnumeratedDataType_hxx
#define HLAEnumeratedDataType_hxx
#include <string>
#include <simgear/structure/SGSharedPtr.hxx>
#include "HLADataType.hxx"
namespace simgear {
class HLAEnumeratedDataType : public HLADataType {
public:
HLAEnumeratedDataType(const std::string& name = "HLAEnumeratedDataType");
virtual ~HLAEnumeratedDataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual const HLAEnumeratedDataType* toEnumeratedDataType() const;
virtual bool decode(HLADecodeStream& stream, unsigned& index) const;
virtual bool encode(HLAEncodeStream& stream, unsigned index) const;
std::string getString(unsigned index) const
{
if (!_map.valid())
return std::string();
return _map->getString(index);
}
unsigned getIndex(const std::string& name) const
{
if (!_map.valid())
return ~unsigned(0);
return _map->getIndex(name);
}
unsigned getNumEnumerators() const
{
if (!_map.valid())
return 0;
return _map->getNumEnumerators();
}
bool addEnumerator(const std::string& name, const std::string& number)
{
if (!_map.valid())
return false;
return _map->add(name, number);
}
void setRepresentation(HLABasicDataType* representation);
const HLABasicDataType* getRepresentation() const
{
if (!_map.valid())
return 0;
return _map->getDataType();
}
protected:
virtual void _recomputeAlignmentImplementation();
private:
class AbstractMap : public SGReferenced {
public:
virtual ~AbstractMap() {}
virtual bool encode(HLAEncodeStream& stream, unsigned index) const = 0;
virtual bool decode(HLADecodeStream& stream, unsigned& index) const = 0;
virtual const HLABasicDataType* getDataType() const = 0;
virtual bool add(const std::string& name, const std::string& number) = 0;
virtual std::string getString(unsigned index) const = 0;
virtual unsigned getIndex(const std::string& name) const = 0;
virtual unsigned getNumEnumerators() const = 0;
};
template<typename DataType, typename T>
class Map;
class RepresentationVisitor;
SGSharedPtr<AbstractMap> _map;
};
} // namespace simgear
#endif

1267
simgear/hla/HLAFederate.cxx Normal file

File diff suppressed because it is too large Load Diff

320
simgear/hla/HLAFederate.hxx Normal file
View File

@@ -0,0 +1,320 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAFederate_hxx
#define HLAFederate_hxx
#include <map>
#include "HLAObjectInstance.hxx"
#include "HLAObjectClass.hxx"
#include "HLAInteractionClass.hxx"
class SGTimeStamp;
namespace simgear {
class RTIFederate;
class HLAFederate : public SGWeakReferenced {
public:
HLAFederate();
virtual ~HLAFederate();
enum Version {
RTI13,
RTI1516,
RTI1516E
};
/// The rti version backend to connect
Version getVersion() const;
bool setVersion(HLAFederate::Version version);
bool setVersion(const std::string& version);
/// The rti backends connect arguments, depends on the version
const std::list<std::string>& getConnectArguments() const;
bool setConnectArguments(const std::list<std::string>& connectArguments);
/// If true try to create on join and try to destroy on resign
bool getCreateFederationExecution() const;
bool setCreateFederationExecution(bool createFederationExecution);
/// The federation execution name to use on create, join and destroy
const std::string& getFederationExecutionName() const;
bool setFederationExecutionName(const std::string& federationExecutionName);
/// The federation object model name to use on create and possibly join
const std::string& getFederationObjectModel() const;
bool setFederationObjectModel(const std::string& federationObjectModel);
/// The federate type used on join
const std::string& getFederateType() const;
bool setFederateType(const std::string& federateType);
/// The federate name possibly used on join
const std::string& getFederateName() const;
bool setFederateName(const std::string& federateName);
/// connect to an rti
bool connect(Version version, const std::list<std::string>& stringList);
bool connect();
bool disconnect();
/// Create a federation execution
/// Semantically this methods should be static,
/// but the nonstatic case could reuse the connection to the server
bool createFederationExecution(const std::string& federation, const std::string& objectModel);
bool destroyFederationExecution(const std::string& federation);
bool createFederationExecution();
bool destroyFederationExecution();
/// Join with federateType the federation execution
bool join(const std::string& federateType, const std::string& federation);
bool join();
bool resign();
/// Try to create and join the federation execution.
bool createJoinFederationExecution();
bool resignDestroyFederationExecution();
/// Time management
/// If set to true, time constrained mode is entered on init
bool getTimeConstrained() const;
bool setTimeConstrained(bool timeConstrained);
/// If set to true, time advance is constrained by the local system clock
bool getTimeConstrainedByLocalClock() const;
bool setTimeConstrainedByLocalClock(bool timeConstrainedByLocalClock);
/// If set to true, time regulation mode is entered on init
bool getTimeRegulating() const;
bool setTimeRegulating(bool timeRegulating);
/// If set to a non zero value, this federate leads the federations
/// locical time advance by this amount of time.
const SGTimeStamp& getLeadTime() const;
bool setLeadTime(const SGTimeStamp& leadTime);
/// The time increment for use in the default update method.
const SGTimeStamp& getTimeIncrement() const;
bool setTimeIncrement(const SGTimeStamp& timeIncrement);
/// Actually enable time constrained mode.
/// This method blocks until time constrained mode is enabled.
bool enableTimeConstrained();
/// Actually disable time constrained mode.
bool disableTimeConstrained();
/// Actually enable time constrained by local clock mode.
bool enableTimeConstrainedByLocalClock();
/// Actually enable time regulation mode.
/// This method blocks until time regulation mode is enabled.
bool enableTimeRegulation(const SGTimeStamp& lookahead);
bool enableTimeRegulation();
/// Actually disable time regulation mode.
bool disableTimeRegulation();
/// Actually modify the lookahead time.
bool modifyLookahead(const SGTimeStamp& lookahead);
/// Advance the logical time by the given time increment.
/// Depending on the time constrained mode, this might
/// block until the time advance is granted.
bool timeAdvanceBy(const SGTimeStamp& timeIncrement);
/// Advance the logical time to the given time.
/// Depending on the time constrained mode, this might
/// block until the time advance is granted.
bool timeAdvance(const SGTimeStamp& timeStamp);
/// Advance the logical time as far as time advances are available.
/// This call should not block and advance the logical time
/// as far as currently possible.
bool timeAdvanceAvailable();
/// Get the current federates time
bool queryFederateTime(SGTimeStamp& timeStamp);
/// Get the current federates lookahead
bool queryLookahead(SGTimeStamp& timeStamp);
/// Process one messsage
bool processMessage();
/// Process one message but do not wait longer than the relative timeout.
bool processMessage(const SGTimeStamp& timeout);
/// Process messages until the federate can proceed with the
/// next simulation step. That is flush all pending messages and
/// depending on the time constrained mode process messages until
/// a pending time advance is granted.
bool processMessages();
/// Legacy tick call - deprecated
bool tick(const double& minimum, const double& maximum);
class ObjectModelFactory {
public:
virtual ~ObjectModelFactory()
{ }
virtual HLAObjectClass* createObjectClass(const std::string& name, HLAFederate& federate)
{ return federate.createObjectClass(name); }
virtual bool subscribeObjectClass(const std::string& objectClassName, const std::string& sharing)
{ return sharing.find("Subscribe") != std::string::npos; }
virtual bool publishObjectClass(const std::string& objectClassName, const std::string& sharing)
{ return sharing.find("Publish") != std::string::npos; }
virtual bool subscribeAttribute(const std::string& objectClassName, const std::string& attributeName, const std::string& sharing)
{ return sharing.find("Subscribe") != std::string::npos; }
virtual bool publishAttribute(const std::string& objectClassName, const std::string& attributeName, const std::string& sharing)
{ return sharing.find("Publish") != std::string::npos; }
};
/// Read an omt xml file - deprecated
bool readObjectModelTemplate(const std::string& objectModel,
ObjectModelFactory& objectModelFactory);
/// Read an rti1.3 omt xml file
bool readRTI13ObjectModelTemplate(const std::string& objectModel);
/// Read an rti1516 omt xml file
bool readRTI1516ObjectModelTemplate(const std::string& objectModel);
/// Read an rti1516e omt xml file
bool readRTI1516EObjectModelTemplate(const std::string& objectModel);
/// Is called past a successful join to populate the rti classes
bool resolveObjectModel();
/// Access data types
const HLADataType* getDataType(const std::string& name) const;
// virtual const HLADataType* createDataType(const std::string& name);
bool insertDataType(const std::string& name, const SGSharedPtr<HLADataType>& dataType);
void recomputeDataTypeAlignment();
/// Get the interaction class of a given name
HLAInteractionClass* getInteractionClass(const std::string& name);
const HLAInteractionClass* getInteractionClass(const std::string& name) const;
/// Default create function. Creates a default interaction class
virtual HLAInteractionClass* createInteractionClass(const std::string& name);
/// Get the object class of a given name
HLAObjectClass* getObjectClass(const std::string& name);
const HLAObjectClass* getObjectClass(const std::string& name) const;
/// Default create function. Creates a default object class
virtual HLAObjectClass* createObjectClass(const std::string& name);
/// Get the object instance of a given name
HLAObjectInstance* getObjectInstance(const std::string& name);
const HLAObjectInstance* getObjectInstance(const std::string& name) const;
virtual HLAObjectInstance* createObjectInstance(HLAObjectClass* objectClass, const std::string& name);
/// Tells the main exec loop to continue or not.
void setDone(bool done);
bool getDone() const;
/// The user overridable slot that is called to set up an object model
/// By default, depending on the set up rti version, the apropriate
/// bool read{RTI13,RTI1516,RTI1516E}ObjectModelTemplate(const std::string& objectModel);
/// method is called.
/// Note that the RTI13 files do not contain any information about the data types.
/// A user needs to set up the data types and assign them to the object classes/
/// interaction classes theirselves.
/// Past reading the object model, it is still possible to change the subscription/publication
/// types without introducing traffic on the backend rti.
virtual bool readObjectModel();
virtual bool subscribe();
virtual bool publish();
virtual bool init();
virtual bool update();
virtual bool shutdown();
virtual bool exec();
private:
HLAFederate(const HLAFederate&);
HLAFederate& operator=(const HLAFederate&);
void _clearRTI();
/// Internal helpers for interaction classes
bool _insertInteractionClass(const SGSharedPtr<HLAInteractionClass>& interactionClass);
/// Internal helpers for object classes
bool _insertObjectClass(const SGSharedPtr<HLAObjectClass>& objectClass);
/// Internal helpers for object instances
bool _insertObjectInstance(const SGSharedPtr<HLAObjectInstance>& objectInstance);
void _eraseObjectInstance(const std::string& name);
/// The underlying interface to the rti implementation
SGSharedPtr<RTIFederate> _rtiFederate;
/// Parameters required to connect to an rti
Version _version;
std::list<std::string> _connectArguments;
/// Parameters for the federation execution
std::string _federationExecutionName;
std::string _federationObjectModel;
bool _createFederationExecution;
/// Parameters for the federate
std::string _federateType;
std::string _federateName;
/// Time management related parameters
/// If true, the federate is expected to enter time constrained mode
bool _timeConstrained;
/// If true, the federate is expected to enter time regulating mode
bool _timeRegulating;
/// The amount of time this federate leads the others.
SGTimeStamp _leadTime;
/// The regular time increment we do on calling update()
SGTimeStamp _timeIncrement;
/// The reference system time at initialization time.
/// Is used to implement being time constrained on the
/// local system time.
bool _timeConstrainedByLocalClock;
SGTimeStamp _localClockOffset;
/// If true the exec method returns.
bool _done;
/// The Data Types by name
typedef std::map<std::string, SGSharedPtr<HLADataType> > DataTypeMap;
DataTypeMap _dataTypeMap;
/// The Interaction Classes by name
typedef std::map<std::string, SGSharedPtr<HLAInteractionClass> > InteractionClassMap;
InteractionClassMap _interactionClassMap;
/// The Object Classes by name
typedef std::map<std::string, SGSharedPtr<HLAObjectClass> > ObjectClassMap;
ObjectClassMap _objectClassMap;
/// The Object Instances by name
typedef std::map<std::string, SGSharedPtr<HLAObjectInstance> > ObjectInstanceMap;
ObjectInstanceMap _objectInstanceMap;
/// The Object Instances by name, the ones that have an explicit given name, may be not yet registered
// ObjectInstanceMap _explicitNamedObjectInstanceMap;
friend class HLAInteractionClass;
friend class HLAObjectClass;
friend class HLAObjectInstance;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,216 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAFixedRecordDataElement.hxx"
#include <string>
#include <vector>
#include <simgear/debug/logstream.hxx>
#include "HLADataElementVisitor.hxx"
#include "HLADataTypeVisitor.hxx"
namespace simgear {
HLAAbstractFixedRecordDataElement::HLAAbstractFixedRecordDataElement(const HLAFixedRecordDataType* dataType) :
_dataType(dataType)
{
}
HLAAbstractFixedRecordDataElement::~HLAAbstractFixedRecordDataElement()
{
}
void
HLAAbstractFixedRecordDataElement::accept(HLADataElementVisitor& visitor)
{
visitor.apply(*this);
}
void
HLAAbstractFixedRecordDataElement::accept(HLAConstDataElementVisitor& visitor) const
{
visitor.apply(*this);
}
bool
HLAAbstractFixedRecordDataElement::decode(HLADecodeStream& stream)
{
if (!_dataType.valid())
return false;
return _dataType->decode(stream, *this);
}
bool
HLAAbstractFixedRecordDataElement::encode(HLAEncodeStream& stream) const
{
if (!_dataType.valid())
return false;
return _dataType->encode(stream, *this);
}
const HLAFixedRecordDataType*
HLAAbstractFixedRecordDataElement::getDataType() const
{
return _dataType.get();
}
bool
HLAAbstractFixedRecordDataElement::setDataType(const HLADataType* dataType)
{
const HLAFixedRecordDataType* fixedRecordDataType = dataType->toFixedRecordDataType();
if (!fixedRecordDataType) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAFixedRecordDataType: unable to set data type!");
return false;
}
setDataType(fixedRecordDataType);
return true;
}
void
HLAAbstractFixedRecordDataElement::setDataType(const HLAFixedRecordDataType* dataType)
{
_dataType = dataType;
}
unsigned
HLAAbstractFixedRecordDataElement::getNumFields() const
{
return _dataType->getNumFields();
}
unsigned
HLAAbstractFixedRecordDataElement::getFieldNumber(const std::string& name) const
{
return _dataType->getFieldNumber(name);
}
const HLADataType*
HLAAbstractFixedRecordDataElement::getFieldDataType(unsigned i) const
{
return _dataType->getFieldDataType(i);
}
const HLADataType*
HLAAbstractFixedRecordDataElement::getFieldDataType(const std::string& name) const
{
return getFieldDataType(getFieldNumber(name));
}
HLAFixedRecordDataElement::HLAFixedRecordDataElement(const HLAFixedRecordDataType* dataType) :
HLAAbstractFixedRecordDataElement(dataType)
{
_fieldVector.resize(getNumFields());
}
HLAFixedRecordDataElement::~HLAFixedRecordDataElement()
{
clearStamp();
}
bool
HLAFixedRecordDataElement::decodeField(HLADecodeStream& stream, unsigned i)
{
HLADataElement* dataElement = getField(i);
if (dataElement) {
return dataElement->decode(stream);
} else {
HLADataTypeDecodeVisitor visitor(stream);
getDataType()->getFieldDataType(i)->accept(visitor);
return true;
}
}
bool
HLAFixedRecordDataElement::encodeField(HLAEncodeStream& stream, unsigned i) const
{
const HLADataElement* dataElement = getField(i);
if (dataElement) {
return dataElement->encode(stream);
} else {
HLADataTypeEncodeVisitor visitor(stream);
getDataType()->getFieldDataType(i)->accept(visitor);
return true;
}
}
HLADataElement*
HLAFixedRecordDataElement::getField(const std::string& name)
{
return getField(getFieldNumber(name));
}
const HLADataElement*
HLAFixedRecordDataElement::getField(const std::string& name) const
{
return getField(getFieldNumber(name));
}
HLADataElement*
HLAFixedRecordDataElement::getField(unsigned i)
{
if (_fieldVector.size() <= i)
return 0;
return _fieldVector[i].get();
}
const HLADataElement*
HLAFixedRecordDataElement::getField(unsigned i) const
{
if (_fieldVector.size() <= i)
return 0;
return _fieldVector[i].get();
}
void
HLAFixedRecordDataElement::setField(unsigned index, HLADataElement* value)
{
if (getNumFields() <= index)
return;
if (_fieldVector[index].valid())
_fieldVector[index]->clearStamp();
_fieldVector[index] = value;
if (value)
value->attachStamp(*this);
setDirty(true);
}
void
HLAFixedRecordDataElement::setField(const std::string& name, HLADataElement* value)
{
setField(getFieldNumber(name), value);
}
void
HLAFixedRecordDataElement::_setStamp(Stamp* stamp)
{
HLAAbstractFixedRecordDataElement::_setStamp(stamp);
for (FieldVector::iterator i = _fieldVector.begin(); i != _fieldVector.end(); ++i) {
if (!i->valid())
continue;
(*i)->attachStamp(*this);
}
}
}

View File

@@ -0,0 +1,83 @@
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAFixedRecordDataElement_hxx
#define HLAFixedRecordDataElement_hxx
#include <string>
#include <vector>
#include "HLADataElement.hxx"
#include "HLAFixedRecordDataType.hxx"
namespace simgear {
class HLAAbstractFixedRecordDataElement : public HLADataElement {
public:
HLAAbstractFixedRecordDataElement(const HLAFixedRecordDataType* dataType);
virtual ~HLAAbstractFixedRecordDataElement();
virtual void accept(HLADataElementVisitor& visitor);
virtual void accept(HLAConstDataElementVisitor& visitor) const;
virtual bool decode(HLADecodeStream& stream);
virtual bool encode(HLAEncodeStream& stream) const;
virtual const HLAFixedRecordDataType* getDataType() const;
virtual bool setDataType(const HLADataType* dataType);
void setDataType(const HLAFixedRecordDataType* dataType);
unsigned getNumFields() const;
unsigned getFieldNumber(const std::string& name) const;
const HLADataType* getFieldDataType(unsigned i) const;
const HLADataType* getFieldDataType(const std::string& name) const;
virtual bool decodeField(HLADecodeStream& stream, unsigned i) = 0;
virtual bool encodeField(HLAEncodeStream& stream, unsigned i) const = 0;
private:
SGSharedPtr<const HLAFixedRecordDataType> _dataType;
};
class HLAFixedRecordDataElement : public HLAAbstractFixedRecordDataElement {
public:
HLAFixedRecordDataElement(const HLAFixedRecordDataType* dataType);
virtual ~HLAFixedRecordDataElement();
virtual bool decodeField(HLADecodeStream& stream, unsigned i);
virtual bool encodeField(HLAEncodeStream& stream, unsigned i) const;
HLADataElement* getField(const std::string& name);
const HLADataElement* getField(const std::string& name) const;
HLADataElement* getField(unsigned i);
const HLADataElement* getField(unsigned i) const;
void setField(unsigned index, HLADataElement* value);
void setField(const std::string& name, HLADataElement* value);
protected:
virtual void _setStamp(Stamp* stamp);
private:
typedef std::vector<SGSharedPtr<HLADataElement> > FieldVector;
FieldVector _fieldVector;
};
}
#endif

View File

@@ -0,0 +1,99 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAFixedRecordDataType.hxx"
#include "HLADataTypeVisitor.hxx"
#include "HLAFixedRecordDataElement.hxx"
namespace simgear {
HLAFixedRecordDataType::HLAFixedRecordDataType(const std::string& name) :
HLADataType(name)
{
}
HLAFixedRecordDataType::~HLAFixedRecordDataType()
{
}
void
HLAFixedRecordDataType::accept(HLADataTypeVisitor& visitor) const
{
visitor.apply(*this);
}
const HLAFixedRecordDataType*
HLAFixedRecordDataType::toFixedRecordDataType() const
{
return this;
}
void
HLAFixedRecordDataType::releaseDataTypeReferences()
{
unsigned numFields = getNumFields();
for (unsigned i = 0; i < numFields; ++i)
_fieldList[i].releaseDataTypeReferences();
}
bool
HLAFixedRecordDataType::decode(HLADecodeStream& stream, HLAAbstractFixedRecordDataElement& value) const
{
stream.alignOffsetForSize(getAlignment());
unsigned numFields = getNumFields();
for (unsigned i = 0; i < numFields; ++i)
if (!value.decodeField(stream, i))
return false;
return true;
}
bool
HLAFixedRecordDataType::encode(HLAEncodeStream& stream, const HLAAbstractFixedRecordDataElement& value) const
{
stream.alignOffsetForSize(getAlignment());
unsigned numFields = getNumFields();
for (unsigned i = 0; i < numFields; ++i)
if (!value.encodeField(stream, i))
return false;
return true;
}
void
HLAFixedRecordDataType::addField(const std::string& name, const HLADataType* dataType)
{
_fieldList.push_back(Field(name, dataType));
}
void
HLAFixedRecordDataType::_recomputeAlignmentImplementation()
{
unsigned alignment = 1;
for (unsigned i = 0; i < getNumFields(); ++i) {
if (const HLADataType* dataType = getFieldDataType(i))
alignment = std::max(alignment, dataType->getAlignment());
}
setAlignment(alignment);
}
} // namespace simgear

View File

@@ -0,0 +1,98 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAFixedRecordDataType_hxx
#define HLAFixedRecordDataType_hxx
#include <string>
#include <vector>
#include <simgear/structure/SGSharedPtr.hxx>
#include "HLADataType.hxx"
namespace simgear {
class HLAAbstractFixedRecordDataElement;
class HLAFixedRecordDataType : public HLADataType {
public:
HLAFixedRecordDataType(const std::string& name = "HLAFixedRecordDataType");
virtual ~HLAFixedRecordDataType();
virtual void accept(HLADataTypeVisitor& visitor) const;
virtual const HLAFixedRecordDataType* toFixedRecordDataType() const;
virtual void releaseDataTypeReferences();
virtual bool decode(HLADecodeStream& stream, HLAAbstractFixedRecordDataElement& value) const;
virtual bool encode(HLAEncodeStream& stream, const HLAAbstractFixedRecordDataElement& value) const;
unsigned getNumFields() const
{ return _fieldList.size(); }
std::string getFieldName(unsigned i) const
{
if (_fieldList.size() <= i)
return std::string();
return _fieldList[i].getName();
}
const HLADataType* getFieldDataType(unsigned i) const
{
if (_fieldList.size() <= i)
return 0;
return _fieldList[i].getDataType();
}
unsigned getFieldNumber(const std::string& name) const
{
for (unsigned i = 0; i < _fieldList.size(); ++i) {
if (_fieldList[i].getName() != name)
continue;
return i;
}
return ~0u;
}
void addField(const std::string& name, const HLADataType* dataType);
protected:
virtual void _recomputeAlignmentImplementation();
private:
struct Field {
Field(const std::string& name, const HLADataType* dataType) :
_name(name), _dataType(dataType) {}
const std::string& getName() const
{ return _name; }
const HLADataType* getDataType() const
{ return _dataType.get(); }
void releaseDataTypeReferences()
{ _dataType = 0; }
private:
std::string _name;
SGSharedPtr<const HLADataType> _dataType;
};
typedef std::vector<Field> FieldList;
FieldList _fieldList;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,251 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAInteractionClass.hxx"
#include <simgear/debug/logstream.hxx>
#include "HLADataElement.hxx"
#include "HLAFederate.hxx"
#include "RTIInteractionClass.hxx"
namespace simgear {
HLAInteractionClass::HLAInteractionClass(const std::string& name, HLAFederate* federate) :
_federate(federate),
_rtiInteractionClass(0),
_name(name),
_subscriptionType(HLAUnsubscribed),
_publicationType(HLAUnpublished)
{
if (!federate) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass::HLAInteractionClass(): "
"No parent federate given for interaction class \"" << getName() << "\"!");
return;
}
federate->_insertInteractionClass(this);
}
HLAInteractionClass::~HLAInteractionClass()
{
// HLAInteractionClass objects only get deleted when the parent federate
// dies. So we do not need to deregister there.
_clearRTIInteractionClass();
}
const std::string&
HLAInteractionClass::getName() const
{
return _name;
}
const SGWeakPtr<HLAFederate>&
HLAInteractionClass::getFederate() const
{
return _federate;
}
HLASubscriptionType
HLAInteractionClass::getSubscriptionType() const
{
return _subscriptionType;
}
void
HLAInteractionClass::setSubscriptionType(HLASubscriptionType subscriptionType)
{
_subscriptionType = subscriptionType;
}
HLAPublicationType
HLAInteractionClass::getPublicationType() const
{
return _publicationType;
}
void
HLAInteractionClass::setPublicationType(HLAPublicationType publicationType)
{
_publicationType = publicationType;
}
unsigned
HLAInteractionClass::getNumParameters() const
{
return _parameterVector.size();
}
unsigned
HLAInteractionClass::addParameter(const std::string& name)
{
unsigned index = _parameterVector.size();
_nameIndexMap[name] = index;
_parameterVector.push_back(Parameter(name));
_resolveParameterIndex(name, index);
return index;
}
unsigned
HLAInteractionClass::getParameterIndex(const std::string& name) const
{
NameIndexMap::const_iterator i = _nameIndexMap.find(name);
if (i == _nameIndexMap.end())
return ~0u;
return i->second;
}
std::string
HLAInteractionClass::getParameterName(unsigned index) const
{
if (_parameterVector.size() <= index)
return std::string();
return _parameterVector[index]._name;
}
const HLADataType*
HLAInteractionClass::getParameterDataType(unsigned index) const
{
if (_parameterVector.size() <= index)
return 0;
return _parameterVector[index]._dataType.get();
}
void
HLAInteractionClass::setParameterDataType(unsigned index, const SGSharedPtr<const HLADataType>& dataType)
{
if (_parameterVector.size() <= index)
return;
_parameterVector[index]._dataType = dataType;
}
HLADataElement::IndexPathPair
HLAInteractionClass::getIndexPathPair(const HLADataElement::StringPathPair& stringPathPair) const
{
unsigned index = getParameterIndex(stringPathPair.first);
if (getNumParameters() <= index) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass::getIndexPathPair(\""
<< HLADataElement::toString(stringPathPair)
<< "\"): Could not resolve attribute \"" << stringPathPair.first
<< "\" for interaction class \"" << getName() << "\"!");
}
return HLADataElement::IndexPathPair(index, stringPathPair.second);
}
HLADataElement::IndexPathPair
HLAInteractionClass::getIndexPathPair(const std::string& path) const
{
return getIndexPathPair(HLADataElement::toStringPathPair(path));
}
bool
HLAInteractionClass::subscribe()
{
if (!_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::subscribe(): No RTIInteractionClass!");
return false;
}
switch (_subscriptionType) {
case HLAUnsubscribed:
return _rtiInteractionClass->unsubscribe();
case HLASubscribedActive:
return _rtiInteractionClass->subscribe(true);
case HLASubscribedPassive:
return _rtiInteractionClass->subscribe(false);
}
return false;
}
bool
HLAInteractionClass::unsubscribe()
{
if (!_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unsubscribe(): No RTIInteractionClass!");
return false;
}
return _rtiInteractionClass->unsubscribe();
}
bool
HLAInteractionClass::publish()
{
if (!_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::publish(): No RTIInteractionClass\"!");
return false;
}
switch (_publicationType) {
case HLAUnpublished:
return _rtiInteractionClass->unpublish();
case HLAPublished:
return _rtiInteractionClass->publish();
}
return false;
}
bool
HLAInteractionClass::unpublish()
{
if (!_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAInteractionClass::unpublish(): No RTIInteractionClass\"!");
return false;
}
return _rtiInteractionClass->unpublish();
}
void
HLAInteractionClass::_setRTIInteractionClass(RTIInteractionClass* interactionClass)
{
if (_rtiInteractionClass) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Setting RTIInteractionClass twice for interaction class \"" << getName() << "\"!");
return;
}
_rtiInteractionClass = interactionClass;
if (_rtiInteractionClass->_interactionClass != this) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: backward reference does not match!");
return;
}
for (unsigned i = 0; i < _parameterVector.size(); ++i)
_resolveParameterIndex(_parameterVector[i]._name, i);
}
void
HLAInteractionClass::_resolveParameterIndex(const std::string& name, unsigned index)
{
if (!_rtiInteractionClass)
return;
if (!_rtiInteractionClass->resolveParameterIndex(name, index))
SG_LOG(SG_NETWORK, SG_ALERT, "HLAInteractionClass: Could not resolve parameter \""
<< name << "\" for interaction class \"" << getName() << "\"!");
}
void
HLAInteractionClass::_clearRTIInteractionClass()
{
if (!_rtiInteractionClass)
return;
_rtiInteractionClass->_interactionClass = 0;
_rtiInteractionClass = 0;
}
} // namespace simgear

View File

@@ -0,0 +1,111 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAInteractionClass_hxx
#define HLAInteractionClass_hxx
#include <map>
#include <string>
#include <vector>
#include <simgear/structure/SGWeakReferenced.hxx>
#include "HLADataElement.hxx"
#include "HLADataType.hxx"
#include "HLATypes.hxx"
namespace simgear {
class RTIInteractionClass;
class HLADataType;
class HLAFederate;
class HLAInteractionClass : public SGWeakReferenced {
public:
HLAInteractionClass(const std::string& name, HLAFederate* federate);
virtual ~HLAInteractionClass();
const std::string& getName() const;
/// return the federate this interaction class belongs to
const SGWeakPtr<HLAFederate>& getFederate() const;
HLASubscriptionType getSubscriptionType() const;
void setSubscriptionType(HLASubscriptionType subscriptionType);
HLAPublicationType getPublicationType() const;
void setPublicationType(HLAPublicationType publicationType);
unsigned getNumParameters() const;
unsigned addParameter(const std::string& name);
unsigned getParameterIndex(const std::string& name) const;
std::string getParameterName(unsigned index) const;
const HLADataType* getParameterDataType(unsigned index) const;
void setParameterDataType(unsigned index, const SGSharedPtr<const HLADataType>& dataType);
HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::StringPathPair& stringPathPair) const;
HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const;
virtual bool subscribe();
virtual bool unsubscribe();
virtual bool publish();
virtual bool unpublish();
private:
HLAInteractionClass(const HLAInteractionClass&);
HLAInteractionClass& operator=(const HLAInteractionClass&);
void _setRTIInteractionClass(RTIInteractionClass* interactionClass);
void _resolveParameterIndex(const std::string& name, unsigned index);
void _clearRTIInteractionClass();
struct Parameter {
Parameter() {}
Parameter(const std::string& name) : _name(name) {}
std::string _name;
SGSharedPtr<const HLADataType> _dataType;
};
typedef std::vector<Parameter> ParameterVector;
typedef std::map<std::string,unsigned> NameIndexMap;
/// The parent federate.
SGWeakPtr<HLAFederate> _federate;
/// The rti class if already instantiated.
RTIInteractionClass* _rtiInteractionClass;
/// The interaction class name
std::string _name;
/// The configured subscription and publication type
HLASubscriptionType _subscriptionType;
HLAPublicationType _publicationType;
/// The parameter data
ParameterVector _parameterVector;
/// The mapping from parameter names to parameter indices
NameIndexMap _nameIndexMap;
friend class HLAFederate;
};
} // namespace simgear
#endif

549
simgear/hla/HLALocation.hxx Normal file
View File

@@ -0,0 +1,549 @@
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLALocation_hxx
#define HLALocation_hxx
#include "HLABasicDataElement.hxx"
namespace simgear {
class HLAAbstractLocation : public SGReferenced {
public:
virtual ~HLAAbstractLocation() {}
virtual SGVec3d getCartPosition() const = 0;
virtual void setCartPosition(const SGVec3d&) = 0;
virtual SGQuatd getCartOrientation() const = 0;
virtual void setCartOrientation(const SGQuatd&) = 0;
virtual SGVec3d getAngularBodyVelocity() const = 0;
virtual void setAngularBodyVelocity(const SGVec3d& angular) = 0;
virtual SGVec3d getLinearBodyVelocity() const = 0;
virtual void setLinearBodyVelocity(const SGVec3d& linear) = 0;
};
class HLACartesianLocation : public HLAAbstractLocation {
public:
HLACartesianLocation() :
_position(SGVec3d::zeros()),
_imag(SGVec3d::zeros()),
_angularVelocity(SGVec3d::zeros()),
_linearVelocity(SGVec3d::zeros())
{ }
virtual SGVec3d getCartPosition() const
{ return _position; }
virtual void setCartPosition(const SGVec3d& position)
{ _position = position; }
virtual SGQuatd getCartOrientation() const
{ return SGQuatd::fromPositiveRealImag(_imag); }
virtual void setCartOrientation(const SGQuatd& orientation)
{ _imag = orientation.getPositiveRealImag(); }
virtual SGVec3d getAngularBodyVelocity() const
{ return _angularVelocity; }
virtual void setAngularBodyVelocity(const SGVec3d& angularVelocity)
{ _angularVelocity = angularVelocity; }
virtual SGVec3d getLinearBodyVelocity() const
{ return _linearVelocity; }
virtual void setLinearBodyVelocity(const SGVec3d& linearVelocity)
{ _linearVelocity = linearVelocity; }
HLADataElementProvider getPositionDataElement(unsigned i)
{
if (3 <= i)
return HLADataElementProvider();
return new PositionDataElement(this, i);
}
HLADataElementProvider getOrientationDataElement(unsigned i)
{
if (3 <= i)
return HLADataElementProvider();
return new OrientationDataElement(this, i);
}
HLADataElementProvider getAngularVelocityDataElement(unsigned i)
{
if (3 <= i)
return HLADataElementProvider();
return new AngularVelocityDataElement(this, i);
}
HLADataElementProvider getLinearVelocityDataElement(unsigned i)
{
if (3 <= i)
return HLADataElementProvider();
return new LinearVelocityDataElement(this, i);
}
private:
class PositionDataElement : public HLAAbstractDoubleDataElement {
public:
PositionDataElement(HLACartesianLocation* data, unsigned index) :
_data(data), _index(index)
{ }
virtual double getValue() const
{ return _data->_position[_index]; }
virtual void setValue(double value)
{ _data->_position[_index] = value; }
private:
SGSharedPtr<HLACartesianLocation> _data;
unsigned _index;
};
class OrientationDataElement : public HLAAbstractDoubleDataElement {
public:
OrientationDataElement(HLACartesianLocation* data, unsigned index) :
_data(data), _index(index)
{ }
virtual double getValue() const
{ return _data->_imag[_index]; }
virtual void setValue(double value)
{ _data->_imag[_index] = value; }
private:
SGSharedPtr<HLACartesianLocation> _data;
unsigned _index;
};
class AngularVelocityDataElement : public HLAAbstractDoubleDataElement {
public:
AngularVelocityDataElement(HLACartesianLocation* data, unsigned index) :
_data(data), _index(index)
{ }
virtual double getValue() const
{ return _data->_angularVelocity[_index]; }
virtual void setValue(double value)
{ _data->_angularVelocity[_index] = value; }
private:
SGSharedPtr<HLACartesianLocation> _data;
unsigned _index;
};
class LinearVelocityDataElement : public HLAAbstractDoubleDataElement {
public:
LinearVelocityDataElement(HLACartesianLocation* data, unsigned index) :
_data(data), _index(index)
{ }
virtual double getValue() const
{ return _data->_linearVelocity[_index]; }
virtual void setValue(double value)
{ _data->_linearVelocity[_index] = value; }
private:
SGSharedPtr<HLACartesianLocation> _data;
unsigned _index;
};
SGVec3d _position;
SGVec3d _imag;
SGVec3d _angularVelocity;
SGVec3d _linearVelocity;
};
class HLALocationFactory : public SGReferenced {
public:
virtual ~HLALocationFactory() {}
virtual HLAAbstractLocation* createLocation(HLAAttributePathElementMap&) const = 0;
};
class HLACartesianLocationFactory : public HLALocationFactory {
public:
virtual HLAAbstractLocation* createLocation(HLAAttributePathElementMap& attributePathElementMap) const
{
HLACartesianLocation* location = new HLACartesianLocation;
for (unsigned i = 0; i < 3; ++i) {
const HLADataElement::IndexPathPair& indexPathPair = _positonIndexPathPair[i];
attributePathElementMap[indexPathPair.first][indexPathPair.second] = location->getPositionDataElement(i);
}
for (unsigned i = 0; i < 3; ++i) {
const HLADataElement::IndexPathPair& indexPathPair = _orientationIndexPathPair[i];
attributePathElementMap[indexPathPair.first][indexPathPair.second] = location->getOrientationDataElement(i);
}
for (unsigned i = 0; i < 3; ++i) {
const HLADataElement::IndexPathPair& indexPathPair = _angularVelocityIndexPathPair[i];
attributePathElementMap[indexPathPair.first][indexPathPair.second] = location->getAngularVelocityDataElement(i);
}
for (unsigned i = 0; i < 3; ++i) {
const HLADataElement::IndexPathPair& indexPathPair = _linearVelocityIndexPathPair[i];
attributePathElementMap[indexPathPair.first][indexPathPair.second] = location->getLinearVelocityDataElement(i);
}
return location;
}
void setPositionIndexPathPair(unsigned index, const HLADataElement::IndexPathPair& indexPathPair)
{
if (3 <= index)
return;
_positonIndexPathPair[index] = indexPathPair;
}
void setOrientationIndexPathPair(unsigned index, const HLADataElement::IndexPathPair& indexPathPair)
{
if (3 <= index)
return;
_orientationIndexPathPair[index] = indexPathPair;
}
void setAngularVelocityIndexPathPair(unsigned index, const HLADataElement::IndexPathPair& indexPathPair)
{
if (3 <= index)
return;
_angularVelocityIndexPathPair[index] = indexPathPair;
}
void setLinearVelocityIndexPathPair(unsigned index, const HLADataElement::IndexPathPair& indexPathPair)
{
if (3 <= index)
return;
_linearVelocityIndexPathPair[index] = indexPathPair;
}
private:
HLADataElement::IndexPathPair _positonIndexPathPair[3];
HLADataElement::IndexPathPair _orientationIndexPathPair[3];
HLADataElement::IndexPathPair _angularVelocityIndexPathPair[3];
HLADataElement::IndexPathPair _linearVelocityIndexPathPair[3];
};
class HLAGeodeticLocation : public HLAAbstractLocation {
public:
HLAGeodeticLocation() :
_dirty(true),
_cartPosition(SGVec3d::zeros()),
_cartOrientation(SGQuatd::unit()),
_cartBodyVelocity(SGVec3d::zeros()),
_geodPosition(),
_geodEulerRad(SGVec3d::zeros()),
_groundTrackRad(0),
_groundSpeedMPerSec(0),
_verticalSpeedMPerSec(0)
{
updateCartesianFromGeodetic();
}
virtual SGVec3d getCartPosition() const
{ updateCartesianFromGeodetic(); return _cartPosition; }
virtual void setCartPosition(const SGVec3d& position)
{ _cartPosition = position; _dirty = true; }
virtual SGQuatd getCartOrientation() const
{ updateCartesianFromGeodetic(); return _cartOrientation; }
virtual void setCartOrientation(const SGQuatd& orientation)
{ _cartOrientation = orientation; _dirty = true; }
virtual SGVec3d getAngularBodyVelocity() const
{ return SGVec3d::zeros(); }
virtual void setAngularBodyVelocity(const SGVec3d& angular)
{ }
virtual SGVec3d getLinearBodyVelocity() const
{ updateCartesianFromGeodetic(); return _cartBodyVelocity; }
virtual void setLinearBodyVelocity(const SGVec3d& linear)
{ _cartBodyVelocity = linear; _dirty = true; }
void setLatitudeDeg(double value)
{ _geodPosition.setLatitudeDeg(value); _dirty = true; }
double getLatitudeDeg() const
{ updateGeodeticFromCartesian(); return _geodPosition.getLatitudeDeg(); }
void setLatitudeRad(double value)
{ _geodPosition.setLatitudeRad(value); _dirty = true; }
double getLatitudeRad() const
{ updateGeodeticFromCartesian(); return _geodPosition.getLatitudeRad(); }
void setLongitudeDeg(double value)
{ _geodPosition.setLongitudeDeg(value); _dirty = true; }
double getLongitudeDeg() const
{ updateGeodeticFromCartesian(); return _geodPosition.getLongitudeDeg(); }
void setLongitudeRad(double value)
{ _geodPosition.setLongitudeRad(value); _dirty = true; }
double getLongitudeRad() const
{ updateGeodeticFromCartesian(); return _geodPosition.getLongitudeRad(); }
void setElevationFt(double value)
{ _geodPosition.setElevationFt(value); _dirty = true; }
double getElevationFt() const
{ updateGeodeticFromCartesian(); return _geodPosition.getElevationFt(); }
void setElevationM(double value)
{ _geodPosition.setElevationM(value); _dirty = true; }
double getElevationM() const
{ updateGeodeticFromCartesian(); return _geodPosition.getElevationM(); }
void setHeadingRad(double value)
{ _geodEulerRad[2] = value; _dirty = true; }
double getHeadingRad() const
{ updateGeodeticFromCartesian(); return _geodEulerRad[2]; }
void setHeadingDeg(double value)
{ setHeadingRad(SGMiscd::deg2rad(value)); }
double getHeadingDeg() const
{ return SGMiscd::rad2deg(getHeadingRad()); }
void setPitchRad(double value)
{ _geodEulerRad[1] = value; _dirty = true; }
double getPitchRad() const
{ updateGeodeticFromCartesian(); return _geodEulerRad[1]; }
void setPitchDeg(double value)
{ setPitchRad(SGMiscd::deg2rad(value)); }
double getPitchDeg() const
{ return SGMiscd::rad2deg(getPitchRad()); }
void setRollRad(double value)
{ _geodEulerRad[0] = value; _dirty = true; }
double getRollRad() const
{ updateGeodeticFromCartesian(); return _geodEulerRad[0]; }
void setRollDeg(double value)
{ setRollRad(SGMiscd::deg2rad(value)); }
double getRollDeg() const
{ return SGMiscd::rad2deg(getRollRad()); }
void setGroundTrackRad(double value)
{ _groundTrackRad = value; _dirty = true; }
double getGroundTrackRad() const
{ updateGeodeticFromCartesian(); return _groundTrackRad; }
void setGroundTrackDeg(double value)
{ setGroundTrackRad(SGMiscd::deg2rad(value)); }
double getGroundTrackDeg() const
{ return SGMiscd::rad2deg(getGroundTrackRad()); }
void setGroundSpeedMPerSec(double value)
{ _groundSpeedMPerSec = value; _dirty = true; }
double getGroundSpeedMPerSec() const
{ updateGeodeticFromCartesian(); return _groundSpeedMPerSec; }
void setGroundSpeedFtPerSec(double value)
{ setGroundSpeedMPerSec(SG_FEET_TO_METER*value); }
double getGroundSpeedFtPerSec() const
{ return SG_METER_TO_FEET*getGroundSpeedMPerSec(); }
void setGroundSpeedKnots(double value)
{ setGroundSpeedMPerSec(SG_KT_TO_MPS*value); }
double getGroundSpeedKnots() const
{ return SG_MPS_TO_KT*getGroundSpeedMPerSec(); }
void setVerticalSpeedMPerSec(double value)
{ _verticalSpeedMPerSec = value; _dirty = true; }
double getVerticalSpeedMPerSec() const
{ updateGeodeticFromCartesian(); return _verticalSpeedMPerSec; }
void setVerticalSpeedFtPerSec(double value)
{ setVerticalSpeedMPerSec(SG_FEET_TO_METER*value); }
double getVerticalSpeedFtPerSec() const
{ return SG_METER_TO_FEET*getVerticalSpeedMPerSec(); }
void setVerticalSpeedFtPerMin(double value)
{ setVerticalSpeedFtPerSec(value/60); }
double getVerticalSpeedFtPerMin() const
{ return 60*getVerticalSpeedFtPerSec(); }
#define DATA_ELEMENT(name) \
HLADataElementProvider get## name ## DataElement() \
{ return new DataElement<&HLAGeodeticLocation::get## name, &HLAGeodeticLocation::set ## name>(this); }
DATA_ELEMENT(LatitudeDeg)
DATA_ELEMENT(LatitudeRad)
DATA_ELEMENT(LongitudeDeg)
DATA_ELEMENT(LongitudeRad)
DATA_ELEMENT(ElevationFt)
DATA_ELEMENT(ElevationM)
DATA_ELEMENT(HeadingDeg)
DATA_ELEMENT(HeadingRad)
DATA_ELEMENT(PitchDeg)
DATA_ELEMENT(PitchRad)
DATA_ELEMENT(RollDeg)
DATA_ELEMENT(RollRad)
DATA_ELEMENT(GroundTrackDeg)
DATA_ELEMENT(GroundTrackRad)
DATA_ELEMENT(GroundSpeedMPerSec)
DATA_ELEMENT(GroundSpeedFtPerSec)
DATA_ELEMENT(GroundSpeedKnots)
DATA_ELEMENT(VerticalSpeedMPerSec)
DATA_ELEMENT(VerticalSpeedFtPerSec)
DATA_ELEMENT(VerticalSpeedFtPerMin)
#undef DATA_ELEMENT
private:
template<double (HLAGeodeticLocation::*getter)() const,
void (HLAGeodeticLocation::*setter)(double)>
class DataElement : public HLAAbstractDoubleDataElement {
public:
DataElement(HLAGeodeticLocation* data) :
_data(data)
{ }
virtual double getValue() const
{ return (_data->*getter)(); }
virtual void setValue(double value)
{ (_data->*setter)(value); }
private:
SGSharedPtr<HLAGeodeticLocation> _data;
};
void updateGeodeticFromCartesian() const
{
if (!_dirty)
return;
_geodPosition = SGGeod::fromCart(_cartPosition);
SGQuatd geodOrientation = inverse(SGQuatd::fromLonLat(_geodPosition))*_cartOrientation;
geodOrientation.getEulerRad(_geodEulerRad[2], _geodEulerRad[1], _geodEulerRad[0]);
SGVec3d nedVel = geodOrientation.backTransform(_cartBodyVelocity);
if (SGLimitsd::min() < SGMiscd::max(fabs(nedVel[0]), fabs(nedVel[1])))
_groundTrackRad = atan2(nedVel[1], nedVel[0]);
else
_groundTrackRad = 0;
_groundSpeedMPerSec = sqrt(nedVel[0]*nedVel[0] + nedVel[1]*nedVel[1]);
_verticalSpeedMPerSec = -nedVel[2];
_dirty = false;
}
void updateCartesianFromGeodetic() const
{
if (!_dirty)
return;
_cartPosition = SGVec3d::fromGeod(_geodPosition);
SGQuatd geodOrientation = SGQuatd::fromEulerRad(_geodEulerRad[2], _geodEulerRad[1], _geodEulerRad[0]);
_cartOrientation = SGQuatd::fromLonLat(_geodPosition)*geodOrientation;
SGVec3d nedVel(cos(_groundTrackRad)*_groundSpeedMPerSec,
sin(_groundTrackRad)*_groundSpeedMPerSec,
-_verticalSpeedMPerSec);
_cartBodyVelocity = geodOrientation.transform(nedVel);
_dirty = false;
}
mutable bool _dirty;
// the cartesian values
mutable SGVec3d _cartPosition;
mutable SGQuatd _cartOrientation;
mutable SGVec3d _cartBodyVelocity;
// The geodetic values
mutable SGGeod _geodPosition;
mutable SGVec3d _geodEulerRad;
mutable double _groundTrackRad;
mutable double _groundSpeedMPerSec;
mutable double _verticalSpeedMPerSec;
};
class HLAGeodeticLocationFactory : public HLALocationFactory {
public:
enum Semantic {
LatitudeDeg,
LatitudeRad,
LongitudeDeg,
LongitudeRad,
ElevationM,
ElevationFt,
HeadingDeg,
HeadingRad,
PitchDeg,
PitchRad,
RollDeg,
RollRad,
GroundTrackDeg,
GroundTrackRad,
GroundSpeedKnots,
GroundSpeedFtPerSec,
GroundSpeedMPerSec,
VerticalSpeedFtPerSec,
VerticalSpeedFtPerMin,
VerticalSpeedMPerSec
};
virtual HLAGeodeticLocation* createLocation(HLAAttributePathElementMap& attributePathElementMap) const
{
HLAGeodeticLocation* location = new HLAGeodeticLocation;
for (IndexPathPairSemanticMap::const_iterator i = _indexPathPairSemanticMap.begin();
i != _indexPathPairSemanticMap.end(); ++i) {
switch (i->second) {
case LatitudeDeg:
attributePathElementMap[i->first.first][i->first.second] = location->getLatitudeDegDataElement();
break;
case LatitudeRad:
attributePathElementMap[i->first.first][i->first.second] = location->getLatitudeRadDataElement();
break;
case LongitudeDeg:
attributePathElementMap[i->first.first][i->first.second] = location->getLongitudeDegDataElement();
break;
case LongitudeRad:
attributePathElementMap[i->first.first][i->first.second] = location->getLongitudeRadDataElement();
break;
case ElevationM:
attributePathElementMap[i->first.first][i->first.second] = location->getElevationMDataElement();
break;
case ElevationFt:
attributePathElementMap[i->first.first][i->first.second] = location->getElevationFtDataElement();
break;
case HeadingDeg:
attributePathElementMap[i->first.first][i->first.second] = location->getHeadingDegDataElement();
break;
case HeadingRad:
attributePathElementMap[i->first.first][i->first.second] = location->getHeadingRadDataElement();
break;
case PitchDeg:
attributePathElementMap[i->first.first][i->first.second] = location->getPitchDegDataElement();
break;
case PitchRad:
attributePathElementMap[i->first.first][i->first.second] = location->getPitchRadDataElement();
break;
case RollDeg:
attributePathElementMap[i->first.first][i->first.second] = location->getRollDegDataElement();
break;
case RollRad:
attributePathElementMap[i->first.first][i->first.second] = location->getRollRadDataElement();
break;
case GroundTrackDeg:
attributePathElementMap[i->first.first][i->first.second] = location->getGroundTrackDegDataElement();
break;
case GroundTrackRad:
attributePathElementMap[i->first.first][i->first.second] = location->getGroundTrackRadDataElement();
break;
case GroundSpeedKnots:
attributePathElementMap[i->first.first][i->first.second] = location->getGroundSpeedKnotsDataElement();
break;
case GroundSpeedFtPerSec:
attributePathElementMap[i->first.first][i->first.second] = location->getGroundSpeedFtPerSecDataElement();
break;
case GroundSpeedMPerSec:
attributePathElementMap[i->first.first][i->first.second] = location->getGroundSpeedMPerSecDataElement();
break;
case VerticalSpeedFtPerSec:
attributePathElementMap[i->first.first][i->first.second] = location->getVerticalSpeedFtPerSecDataElement();
break;
case VerticalSpeedFtPerMin:
attributePathElementMap[i->first.first][i->first.second] = location->getVerticalSpeedFtPerMinDataElement();
break;
case VerticalSpeedMPerSec:
attributePathElementMap[i->first.first][i->first.second] = location->getVerticalSpeedMPerSecDataElement();
break;
}
}
return location;
}
void setIndexPathPair(Semantic semantic, const HLADataElement::IndexPathPair& indexPathPair)
{ _indexPathPairSemanticMap[indexPathPair] = semantic; }
private:
typedef std::map<HLADataElement::IndexPathPair, Semantic> IndexPathPairSemanticMap;
IndexPathPairSemanticMap _indexPathPairSemanticMap;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,864 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAOMTXmlVisitor.hxx"
#include <map>
#include <string>
#include <sstream>
#include <simgear/structure/exception.hxx>
#include <simgear/xml/easyxml.hxx>
#include "HLAArrayDataType.hxx"
#include "HLABasicDataType.hxx"
#include "HLADataTypeVisitor.hxx"
#include "HLAEnumeratedDataType.hxx"
#include "HLAFederate.hxx"
#include "HLAFixedRecordDataType.hxx"
#include "HLAVariantRecordDataType.hxx"
namespace simgear {
HLAOMTXmlVisitor::ObjectClass::ObjectClass(const std::string& name, const std::string& sharing) :
_name(name),
_sharing(sharing)
{
}
HLAOMTXmlVisitor::ObjectClass::~ObjectClass()
{
}
const std::string&
HLAOMTXmlVisitor::ObjectClass::getName() const
{
return _name;
}
const std::string&
HLAOMTXmlVisitor::ObjectClass::getSharing() const
{
return _sharing;
}
unsigned
HLAOMTXmlVisitor::ObjectClass::getNumAttributes() const
{
return _attributes.size();
}
const HLAOMTXmlVisitor::Attribute*
HLAOMTXmlVisitor::ObjectClass::getAttribute(unsigned index) const
{
if (_attributes.size() <= index)
return 0;
return _attributes[index];
}
const HLAOMTXmlVisitor::ObjectClass*
HLAOMTXmlVisitor::ObjectClass::getParentObjectClass() const
{
return _parentObjectClass.get();
}
HLAOMTXmlVisitor::InteractionClass::InteractionClass(const std::string& name) :
_name(name)
{
}
HLAOMTXmlVisitor::InteractionClass::~InteractionClass()
{
}
const std::string&
HLAOMTXmlVisitor::InteractionClass::getName() const
{
return _name;
}
const std::string&
HLAOMTXmlVisitor::InteractionClass::getDimensions() const
{
return _dimensions;
}
const std::string&
HLAOMTXmlVisitor::InteractionClass::getSharing() const
{
return _sharing;
}
const std::string&
HLAOMTXmlVisitor::InteractionClass::getTransportation() const
{
return _transportation;
}
const std::string&
HLAOMTXmlVisitor::InteractionClass::getOrder() const
{
return _order;
}
unsigned
HLAOMTXmlVisitor::InteractionClass::getNumParameters() const
{
return _parameters.size();
}
const HLAOMTXmlVisitor::Parameter*
HLAOMTXmlVisitor::InteractionClass::getParameter(unsigned index) const
{
if (_parameters.size() <= index)
return 0;
return _parameters[index];
}
const HLAOMTXmlVisitor::InteractionClass*
HLAOMTXmlVisitor::InteractionClass::getParentInteractionClass() const
{
return _parentInteractionClass.get();
}
HLAOMTXmlVisitor::HLAOMTXmlVisitor()
{
}
HLAOMTXmlVisitor::~HLAOMTXmlVisitor()
{
}
void
HLAOMTXmlVisitor::setDataTypesToFederate(HLAFederate& federate)
{
// Provide all the data types
for (BasicDataMap::iterator i = _basicDataMap.begin(); i != _basicDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (SimpleDataMap::iterator i = _simpleDataMap.begin(); i != _simpleDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (EnumeratedDataMap::iterator i = _enumeratedDataMap.begin(); i != _enumeratedDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (ArrayDataMap::iterator i = _arrayDataMap.begin(); i != _arrayDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (FixedRecordDataMap::iterator i = _fixedRecordDataMap.begin(); i != _fixedRecordDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
for (VariantRecordDataMap::iterator i = _variantRecordDataMap.begin(); i != _variantRecordDataMap.end(); ++i)
federate.insertDataType(i->first, getDataType(i->first));
// Finish alignment computations
federate.recomputeDataTypeAlignment();
}
void
HLAOMTXmlVisitor::setToFederate(HLAFederate& federate)
{
setDataTypesToFederate(federate);
// Provide all interaction classes
unsigned numInteractionClasses = getNumInteractionClasses();
for (unsigned i = 0; i < numInteractionClasses; ++i) {
const InteractionClass* interactionClass = getInteractionClass(i);
SGSharedPtr<HLAInteractionClass> hlaInteractionClass;
hlaInteractionClass = federate.createInteractionClass(interactionClass->getName());
if (!hlaInteractionClass.valid()) {
SG_LOG(SG_IO, SG_INFO, "Ignoring Interaction class \"" << interactionClass->getName() << "\".");
continue;
}
hlaInteractionClass->setSubscriptionType(interactionClass->getSubscriptionType());
hlaInteractionClass->setPublicationType(interactionClass->getPublicationType());
// process the parameters
for (unsigned j = 0; j < interactionClass->getNumParameters(); ++j) {
const Parameter* parameter = interactionClass->getParameter(j);
unsigned index = hlaInteractionClass->addParameter(parameter->getName());
hlaInteractionClass->setParameterDataType(index, federate.getDataType(parameter->getDataType()));
}
}
// Provide all object classes
unsigned numObjectClasses = getNumObjectClasses();
for (unsigned i = 0; i < numObjectClasses; ++i) {
const ObjectClass* objectClass = getObjectClass(i);
SGSharedPtr<HLAObjectClass> hlaObjectClass;
hlaObjectClass = federate.createObjectClass(objectClass->getName());
if (!hlaObjectClass.valid()) {
SG_LOG(SG_IO, SG_INFO, "Ignoring Object class \"" << objectClass->getName() << "\".");
continue;
}
// process the attributes
for (unsigned j = 0; j < objectClass->getNumAttributes(); ++j) {
const Attribute* attribute = objectClass->getAttribute(j);
unsigned index = hlaObjectClass->addAttribute(attribute->getName());
hlaObjectClass->setAttributeDataType(index, federate.getDataType(attribute->getDataType()));
hlaObjectClass->setAttributeSubscriptionType(index, attribute->getSubscriptionType());
hlaObjectClass->setAttributePublicationType(index, attribute->getPublicationType());
hlaObjectClass->setAttributeUpdateType(index, attribute->getUpdateType());
}
}
}
unsigned
HLAOMTXmlVisitor::getNumObjectClasses() const
{
return _objectClassList.size();
}
const HLAOMTXmlVisitor::ObjectClass*
HLAOMTXmlVisitor::getObjectClass(unsigned i) const
{
if (_objectClassList.size() <= i)
return 0;
return _objectClassList[i];
}
unsigned
HLAOMTXmlVisitor::getNumInteractionClasses() const
{
return _interactionClassList.size();
}
const HLAOMTXmlVisitor::InteractionClass*
HLAOMTXmlVisitor::getInteractionClass(unsigned i) const
{
if (_interactionClassList.size() <= i)
return 0;
return _interactionClassList[i];
}
SGSharedPtr<HLADataType>
HLAOMTXmlVisitor::getDataType(const std::string& dataTypeName)
{
StringDataTypeMap::const_iterator i = _dataTypeMap.find(dataTypeName);
if (i != _dataTypeMap.end())
return i->second;
SGSharedPtr<HLADataType> dataType;
dataType = getBasicDataType(dataTypeName);
if (dataType.valid()) {
_dataTypeMap[dataTypeName] = dataType;
return dataType;
}
dataType = getSimpleDataType(dataTypeName);
if (dataType.valid())
return dataType;
dataType = getEnumeratedDataType(dataTypeName);
if (dataType.valid())
return dataType;
dataType = getArrayDataType(dataTypeName);
if (dataType.valid())
return dataType;
dataType = getFixedRecordDataType(dataTypeName);
if (dataType.valid())
return dataType;
dataType = getVariantRecordDataType(dataTypeName);
if (dataType.valid())
return dataType;
SG_LOG(SG_IO, SG_WARN, "Could not resolve dataType \"" << dataTypeName << "\".");
return 0;
}
SGSharedPtr<HLABasicDataType>
HLAOMTXmlVisitor::getBasicDataType(const std::string& dataTypeName)
{
BasicDataMap::const_iterator i = _basicDataMap.find(dataTypeName);
if (i == _basicDataMap.end())
return 0;
if (i->second._size == "8") {
return new HLAUInt8DataType(dataTypeName);
} else if (i->second._size == "16") {
if (i->first.find("Unsigned") != std::string::npos) {
if (i->second._endian == "Little") {
return new HLAUInt16LEDataType(dataTypeName);
} else {
return new HLAUInt16BEDataType(dataTypeName);
}
} else if (i->first.find("octetPair") != std::string::npos) {
if (i->second._endian == "Little") {
return new HLAUInt16LEDataType(dataTypeName);
} else {
return new HLAUInt16BEDataType(dataTypeName);
}
} else {
if (i->second._endian == "Little") {
return new HLAInt16LEDataType(dataTypeName);
} else {
return new HLAInt16BEDataType(dataTypeName);
}
}
} else if (i->second._size == "32") {
if (i->first.find("Unsigned") != std::string::npos) {
if (i->second._endian == "Little") {
return new HLAUInt32LEDataType(dataTypeName);
} else {
return new HLAUInt32BEDataType(dataTypeName);
}
} else if (i->first.find("float") != std::string::npos) {
if (i->second._endian == "Little") {
return new HLAFloat32LEDataType(dataTypeName);
} else {
return new HLAFloat32BEDataType(dataTypeName);
}
} else {
if (i->second._endian == "Little") {
return new HLAInt32LEDataType(dataTypeName);
} else {
return new HLAInt32BEDataType(dataTypeName);
}
}
} else if (i->second._size == "64") {
if (i->first.find("Unsigned") != std::string::npos) {
if (i->second._endian == "Little") {
return new HLAUInt64LEDataType(dataTypeName);
} else {
return new HLAUInt64BEDataType(dataTypeName);
}
} else if (i->first.find("float") != std::string::npos) {
if (i->second._endian == "Little") {
return new HLAFloat64LEDataType(dataTypeName);
} else {
return new HLAFloat64BEDataType(dataTypeName);
}
} else {
if (i->second._endian == "Little") {
return new HLAInt64LEDataType(dataTypeName);
} else {
return new HLAInt64BEDataType(dataTypeName);
}
}
}
return 0;
}
SGSharedPtr<HLADataType>
HLAOMTXmlVisitor::getSimpleDataType(const std::string& dataTypeName)
{
SimpleDataMap::const_iterator i = _simpleDataMap.find(dataTypeName);
if (i == _simpleDataMap.end())
return 0;
return getDataType(i->second._representation);
}
SGSharedPtr<HLAEnumeratedDataType>
HLAOMTXmlVisitor::getEnumeratedDataType(const std::string& dataTypeName)
{
EnumeratedDataMap::const_iterator i = _enumeratedDataMap.find(dataTypeName);
if (i == _enumeratedDataMap.end())
return 0;
SGSharedPtr<HLAEnumeratedDataType> enumeratedDataType = new HLAEnumeratedDataType(dataTypeName);
_dataTypeMap[dataTypeName] = enumeratedDataType;
enumeratedDataType->setRepresentation(getBasicDataType(i->second._representation));
for (EnumeratorList::const_iterator j = i->second._enumeratorList.begin();
j != i->second._enumeratorList.end(); ++j) {
if (!enumeratedDataType->addEnumerator(j->_name, j->_values)) {
SG_LOG(SG_IO, SG_ALERT, "Could not add enumerator \"" << j->_name
<< "\" to find enumerated data type \"" << dataTypeName << "\".");
return 0;
}
}
return enumeratedDataType;
}
SGSharedPtr<HLADataType>
HLAOMTXmlVisitor::getArrayDataType(const std::string& dataTypeName)
{
ArrayDataMap::const_iterator i = _arrayDataMap.find(dataTypeName);
if (i == _arrayDataMap.end())
return 0;
SGSharedPtr<HLAArrayDataType> arrayDataType;
if (i->second._encoding == "HLAvariableArray") {
arrayDataType = new HLAVariableArrayDataType(dataTypeName);
} else if (i->second._encoding == "HLAfixedArray") {
std::stringstream ss(i->second._cardinality);
unsigned cardinality;
ss >> cardinality;
if (ss.fail()) {
SG_LOG(SG_IO, SG_ALERT, "Could not interpret cardinality \""
<< i->second._cardinality << "\" for dataType \""
<< dataTypeName << "\".");
return 0;
}
SGSharedPtr<HLAFixedArrayDataType> dataType = new HLAFixedArrayDataType(dataTypeName);
dataType->setNumElements(cardinality);
arrayDataType = dataType;
} else {
SG_LOG(SG_IO, SG_ALERT, "Can not interpret encoding \""
<< i->second._encoding << "\" for dataType \""
<< dataTypeName << "\".");
return 0;
}
_dataTypeMap[dataTypeName] = arrayDataType;
SGSharedPtr<HLADataType> elementDataType = getDataType(i->second._dataType);
if (!elementDataType.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not interpret dataType \""
<< i->second._dataType << "\" for array data type \""
<< dataTypeName << "\".");
_dataTypeMap.erase(dataTypeName);
return 0;
}
arrayDataType->setElementDataType(elementDataType.get());
// Check if this should be a string data type
if (elementDataType->toBasicDataType()) {
if (dataTypeName == "HLAopaqueData") {
arrayDataType->setIsOpaque(true);
} else if (dataTypeName.find("String") != std::string::npos || dataTypeName.find("string") != std::string::npos) {
arrayDataType->setIsString(true);
}
}
return arrayDataType;
}
SGSharedPtr<HLAFixedRecordDataType>
HLAOMTXmlVisitor::getFixedRecordDataType(const std::string& dataTypeName)
{
FixedRecordDataMap::const_iterator i = _fixedRecordDataMap.find(dataTypeName);
if (i == _fixedRecordDataMap.end())
return 0;
SGSharedPtr<HLAFixedRecordDataType> dataType = new HLAFixedRecordDataType(dataTypeName);
_dataTypeMap[dataTypeName] = dataType;
for (FieldList::size_type j = 0; j < i->second._fieldList.size(); ++j) {
SGSharedPtr<HLADataType> fieldDataType = getDataType(i->second._fieldList[j]._dataType);
if (!fieldDataType.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not get data type \"" << i->second._fieldList[j]._dataType
<< "\" for field " << j << "of fixed record data type \"" << dataTypeName << "\".");
_dataTypeMap.erase(dataTypeName);
return 0;
}
dataType->addField(i->second._fieldList[j]._name, fieldDataType.get());
}
return dataType;
}
SGSharedPtr<HLAVariantRecordDataType>
HLAOMTXmlVisitor::getVariantRecordDataType(const std::string& dataTypeName)
{
VariantRecordDataMap::const_iterator i = _variantRecordDataMap.find(dataTypeName);
if (i == _variantRecordDataMap.end())
return 0;
SGSharedPtr<HLAVariantRecordDataType> dataType = new HLAVariantRecordDataType(dataTypeName);
_dataTypeMap[dataTypeName] = dataType;
SGSharedPtr<HLAEnumeratedDataType> enumeratedDataType = getEnumeratedDataType(i->second._dataType);
if (!enumeratedDataType.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not find enumerted data type \"" << i->second._dataType
<< "\" for variant data type \"" << dataTypeName << "\".");
return 0;
}
dataType->setEnumeratedDataType(enumeratedDataType);
for (AlternativeList::const_iterator j = i->second._alternativeList.begin();
j != i->second._alternativeList.end(); ++j) {
SGSharedPtr<HLADataType> alternativeDataType = getDataType(j->_dataType);
if (!alternativeDataType.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not resolve alternative dataType \"" << j->_dataType
<< "\" for alternative \"" << j->_name << "\".");
_dataTypeMap.erase(dataTypeName);
return 0;
}
if (!dataType->addAlternative(j->_name, j->_enumerator, alternativeDataType.get(), j->_semantics)) {
SG_LOG(SG_IO, SG_ALERT, "Could not add alternative \"" << j->_name << "\".");
return 0;
}
}
return dataType;
}
HLAOMTXmlVisitor::Mode
HLAOMTXmlVisitor::getCurrentMode()
{
if (_modeStack.empty())
return UnknownMode;
return _modeStack.back();
}
void
HLAOMTXmlVisitor::pushMode(HLAOMTXmlVisitor::Mode mode)
{
_modeStack.push_back(mode);
}
void
HLAOMTXmlVisitor::popMode()
{
_modeStack.pop_back();
}
void
HLAOMTXmlVisitor::startXML()
{
_modeStack.clear();
}
void
HLAOMTXmlVisitor::endXML()
{
if (!_modeStack.empty())
throw sg_exception("Internal parse error!");
// propagate parent attributes to the derived classes
// Note that this preserves the order of the attributes starting from the root object
for (ObjectClassList::const_iterator i = _objectClassList.begin(); i != _objectClassList.end(); ++i) {
SGSharedPtr<const ObjectClass> objectClass = (*i)->_parentObjectClass;
if (!objectClass.valid())
continue;
for (AttributeList::const_reverse_iterator j = objectClass->_attributes.rbegin();
j != objectClass->_attributes.rend(); ++j) {
(*i)->_attributes.insert((*i)->_attributes.begin(), *j);
}
}
// propagate parent parameter to the derived interactions
// Note that this preserves the order of the parameters starting from the root object
for (InteractionClassList::const_iterator i = _interactionClassList.begin(); i != _interactionClassList.end(); ++i) {
SGSharedPtr<const InteractionClass> interactionClass = (*i)->_parentInteractionClass;
if (!interactionClass.valid())
continue;
for (ParameterList::const_reverse_iterator j = interactionClass->_parameters.rbegin();
j != interactionClass->_parameters.rend(); ++j) {
(*i)->_parameters.insert((*i)->_parameters.begin(), *j);
}
}
}
void
HLAOMTXmlVisitor::startElement(const char* name, const XMLAttributes& atts)
{
if (strcmp(name, "attribute") == 0) {
if (getCurrentMode() != ObjectClassMode)
throw sg_exception("attribute tag outside objectClass!");
pushMode(AttributeMode);
if (_objectClassList.empty())
throw sg_exception("attribute tag outside of an objectClass");
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("attribute tag without name attribute");
SGSharedPtr<Attribute> attribute = new Attribute(name);
attribute->_dataType = getAttribute("dataType", atts);
attribute->_updateType = getAttribute("updateType", atts);
attribute->_updateCondition = getAttribute("updateCondition", atts);
attribute->_ownership = getAttribute("ownership", atts);
attribute->_sharing = getAttribute("sharing", atts);
attribute->_dimensions = getAttribute("dimensions", atts);
attribute->_transportation = getAttribute("transportation", atts);
attribute->_order = getAttribute("order", atts);
_objectClassStack.back()->_attributes.push_back(attribute);
} else if (strcmp(name, "objectClass") == 0) {
if (getCurrentMode() != ObjectsMode && getCurrentMode() != ObjectClassMode)
throw sg_exception("objectClass tag outside objectClass or objects!");
pushMode(ObjectClassMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("objectClass tag without name attribute");
std::string sharing = getAttribute("sharing", atts);
// The new ObjectClass
ObjectClass* objectClass = new ObjectClass(name, sharing);
// Inherit all previous attributes
if (!_objectClassStack.empty())
objectClass->_parentObjectClass = _objectClassStack.back();
_objectClassStack.push_back(objectClass);
_objectClassList.push_back(objectClass);
} else if (strcmp(name, "objects") == 0) {
if (getCurrentMode() != ObjectModelMode)
throw sg_exception("objects tag outside objectModel!");
pushMode(ObjectsMode);
} else if (strcmp(name, "parameter") == 0) {
if (getCurrentMode() != InteractionClassMode)
throw sg_exception("parameter tag outside interactionClass!");
pushMode(ParameterMode);
if (_interactionClassList.empty())
throw sg_exception("parameter tag outside of an interactionClass");
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("parameter tag without name parameter");
SGSharedPtr<Parameter> parameter = new Parameter(name);
parameter->_dataType = getAttribute("dataType", atts);
_interactionClassStack.back()->_parameters.push_back(parameter);
} else if (strcmp(name, "interactionClass") == 0) {
if (getCurrentMode() != InteractionsMode && getCurrentMode() != InteractionClassMode)
throw sg_exception("interactionClass tag outside interactions or interactionClass!");
pushMode(InteractionClassMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("interactionClass tag without name attribute");
// The new ObjectClass
InteractionClass* interactionClass = new InteractionClass(name);
interactionClass->_dimensions = getAttribute("dimensions", atts);
interactionClass->_transportation = getAttribute("transportation", atts);
interactionClass->_order = getAttribute("order", atts);
// Inherit all previous attributes
if (!_interactionClassStack.empty())
interactionClass->_parentInteractionClass = _interactionClassStack.back();
_interactionClassStack.push_back(interactionClass);
_interactionClassList.push_back(interactionClass);
} else if (strcmp(name, "interactions") == 0) {
if (getCurrentMode() != ObjectModelMode)
throw sg_exception("interactions tag outside objectModel!");
pushMode(InteractionsMode);
} else if (strcmp(name, "basicData") == 0) {
if (getCurrentMode() != BasicDataRepresentationsMode)
throw sg_exception("basicData tag outside basicDataRepresentations!");
pushMode(BasicDataMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("basicData tag without name attribute");
_basicDataMap[name]._size = getAttribute("size", atts);
_basicDataMap[name]._endian = getAttribute("endian", atts);
} else if (strcmp(name, "basicDataRepresentations") == 0) {
if (getCurrentMode() != DataTypesMode)
throw sg_exception("basicDataRepresentations tag outside dataTypes!");
pushMode(BasicDataRepresentationsMode);
} else if (strcmp(name, "simpleData") == 0) {
if (getCurrentMode() != SimpleDataTypesMode)
throw sg_exception("simpleData tag outside simpleDataTypes!");
pushMode(SimpleDataMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("simpleData tag without name attribute");
_simpleDataMap[name]._representation = getAttribute("representation", atts);
_simpleDataMap[name]._units = getAttribute("units", atts);
_simpleDataMap[name]._resolution = getAttribute("resolution", atts);
_simpleDataMap[name]._accuracy = getAttribute("accuracy", atts);
} else if (strcmp(name, "simpleDataTypes") == 0) {
if (getCurrentMode() != DataTypesMode)
throw sg_exception("simpleDataTypes tag outside dataTypes!");
pushMode(SimpleDataTypesMode);
} else if (strcmp(name, "enumerator") == 0) {
if (getCurrentMode() != EnumeratedDataMode)
throw sg_exception("enumerator tag outside enumeratedData!");
pushMode(EnumeratorMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("enumerator tag without name attribute");
Enumerator enumerator;
enumerator._name = name;
enumerator._values = getAttribute("values", atts);
_enumeratedDataMap[_enumeratedDataName]._enumeratorList.push_back(enumerator);
} else if (strcmp(name, "enumeratedData") == 0) {
if (getCurrentMode() != EnumeratedDataTypesMode)
throw sg_exception("enumeratedData tag outside enumeratedDataTypes!");
pushMode(EnumeratedDataMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("enumeratedData tag without name attribute");
_enumeratedDataName = name;
_enumeratedDataMap[_enumeratedDataName]._representation = getAttribute("representation", atts);
} else if (strcmp(name, "enumeratedDataTypes") == 0) {
if (getCurrentMode() != DataTypesMode)
throw sg_exception("enumeratedDataTypes tag outside dataTypes!");
pushMode(EnumeratedDataTypesMode);
} else if (strcmp(name, "arrayData") == 0) {
if (getCurrentMode() != ArrayDataTypesMode)
throw sg_exception("arrayData tag outside arrayDataTypes!");
pushMode(ArrayDataMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("arrayData tag without name attribute");
_arrayDataMap[name]._dataType = getAttribute("dataType", atts);
_arrayDataMap[name]._cardinality = getAttribute("cardinality", atts);
_arrayDataMap[name]._encoding = getAttribute("encoding", atts);
} else if (strcmp(name, "arrayDataTypes") == 0) {
if (getCurrentMode() != DataTypesMode)
throw sg_exception("arrayDataTypes tag outside dataTypes!");
pushMode(ArrayDataTypesMode);
} else if (strcmp(name, "field") == 0) {
if (getCurrentMode() != FixedRecordDataMode)
throw sg_exception("field tag outside fixedRecordData!");
pushMode(FieldMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("field tag without name attribute");
Field field;
field._name = name;
field._dataType = getAttribute("dataType", atts);
_fixedRecordDataMap[_fixedRecordDataName]._fieldList.push_back(field);
} else if (strcmp(name, "fixedRecordData") == 0) {
if (getCurrentMode() != FixedRecordDataTypesMode)
throw sg_exception("fixedRecordData tag outside fixedRecordDataTypes!");
pushMode(FixedRecordDataMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("fixedRecordData tag without name attribute");
_fixedRecordDataName = name;
_fixedRecordDataMap[name]._encoding = getAttribute("encoding", atts);
} else if (strcmp(name, "fixedRecordDataTypes") == 0) {
if (getCurrentMode() != DataTypesMode)
throw sg_exception("fixedRecordDataTypes tag outside dataTypes!");
pushMode(FixedRecordDataTypesMode);
} else if (strcmp(name, "alternative") == 0) {
if (getCurrentMode() != VariantRecordDataMode)
throw sg_exception("alternative tag outside variantRecordData!");
pushMode(AlternativeDataMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("alternative tag without name attribute");
Alternative alternative;
alternative._name = name;
alternative._dataType = getAttribute("dataType", atts);
alternative._semantics = getAttribute("semantics", atts);
alternative._enumerator = getAttribute("enumerator", atts);
_variantRecordDataMap[_variantRecordDataName]._alternativeList.push_back(alternative);
} else if (strcmp(name, "variantRecordData") == 0) {
if (getCurrentMode() != VariantRecordDataTypesMode)
throw sg_exception("variantRecordData tag outside variantRecordDataTypes!");
pushMode(VariantRecordDataMode);
std::string name = getAttribute("name", atts);
if (name.empty())
throw sg_exception("fixedRecordData tag without name attribute");
_variantRecordDataName = name;
_variantRecordDataMap[name]._encoding = getAttribute("encoding", atts);
_variantRecordDataMap[name]._dataType = getAttribute("dataType", atts);
_variantRecordDataMap[name]._semantics = getAttribute("semantics", atts);
_variantRecordDataMap[name]._discriminant = getAttribute("discriminant", atts);
} else if (strcmp(name, "variantRecordDataTypes") == 0) {
if (getCurrentMode() != DataTypesMode)
throw sg_exception("variantRecordDataTypes tag outside dataTypes!");
pushMode(VariantRecordDataTypesMode);
} else if (strcmp(name, "dataTypes") == 0) {
if (getCurrentMode() != ObjectModelMode)
throw sg_exception("dataTypes tag outside objectModel!");
pushMode(DataTypesMode);
} else if (strcmp(name, "objectModel") == 0) {
if (!_modeStack.empty())
throw sg_exception("objectModel tag not at top level!");
pushMode(ObjectModelMode);
} else {
_modeStack.push_back(UnknownMode);
}
}
void
HLAOMTXmlVisitor::endElement(const char* name)
{
if (strcmp(name, "objectClass") == 0) {
_objectClassStack.pop_back();
} else if (strcmp(name, "interactionClass") == 0) {
_interactionClassStack.pop_back();
} else if (strcmp(name, "enumeratedData") == 0) {
_enumeratedDataName.clear();
} else if (strcmp(name, "fixedRecordData") == 0) {
_fixedRecordDataName.clear();
} else if (strcmp(name, "variantRecordData") == 0) {
_variantRecordDataName.clear();
}
_modeStack.pop_back();
}
std::string
HLAOMTXmlVisitor::getAttribute(const char* name, const XMLAttributes& atts)
{
int index = atts.findAttribute(name);
if (index < 0 || atts.size() <= index)
return std::string();
return std::string(atts.getValue(index));
}
std::string
HLAOMTXmlVisitor::getAttribute(const std::string& name, const XMLAttributes& atts)
{
int index = atts.findAttribute(name.c_str());
if (index < 0 || atts.size() <= index)
return std::string();
return std::string(atts.getValue(index));
}
} // namespace simgear

View File

@@ -0,0 +1,334 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAOMTXmlVisitor_hxx
#define HLAOMTXmlVisitor_hxx
#include <map>
#include <string>
#include <simgear/structure/exception.hxx>
#include <simgear/structure/SGSharedPtr.hxx>
#include <simgear/xml/easyxml.hxx>
#include "HLADataType.hxx"
#include "HLATypes.hxx"
namespace simgear {
class HLAFederate;
class HLAOMTXmlVisitor : public XMLVisitor {
public:
/// structures representing the federate object model data
struct Attribute : public SGReferenced {
Attribute(const std::string& name) :
_name(name)
{ }
const std::string& getName() const
{ return _name; }
const std::string& getDataType() const
{ return _dataType; }
const std::string& getSharing() const
{ return _sharing; }
const std::string& getDimensions() const
{ return _dimensions; }
const std::string& getTransportation() const
{ return _transportation; }
const std::string& getOrder() const
{ return _order; }
HLASubscriptionType getSubscriptionType() const
{
if (_sharing.find("Subscribe") != std::string::npos)
return HLASubscribedActive;
else
return HLAUnsubscribed;
}
HLAPublicationType getPublicationType() const
{
if (_sharing.find("Publish") != std::string::npos)
return HLAPublished;
else
return HLAUnpublished;
}
HLAUpdateType getUpdateType() const
{
if (_updateType == "Periodic")
return HLAPeriodicUpdate;
else if (_updateType == "Static")
return HLAStaticUpdate;
else if (_updateType == "Conditional")
return HLAConditionalUpdate;
else
return HLAUndefinedUpdate;
}
std::string _name;
std::string _dataType;
std::string _updateType;
std::string _updateCondition;
std::string _ownership;
std::string _sharing;
std::string _dimensions;
std::string _transportation;
std::string _order;
friend class HLAOMTXmlVisitor;
};
typedef std::vector<SGSharedPtr<Attribute> > AttributeList;
struct ObjectClass : public SGReferenced {
ObjectClass(const std::string& name, const std::string& sharing);
~ObjectClass();
const std::string& getName() const;
const std::string& getSharing() const;
unsigned getNumAttributes() const;
const Attribute* getAttribute(unsigned index) const;
const ObjectClass* getParentObjectClass() const;
private:
friend class HLAOMTXmlVisitor;
std::string _name;
std::string _sharing;
AttributeList _attributes;
SGSharedPtr<ObjectClass> _parentObjectClass;
};
typedef std::vector<SGSharedPtr<ObjectClass> > ObjectClassList;
struct Parameter : public SGReferenced {
Parameter(const std::string& name) :
_name(name)
{ }
const std::string& getName() const
{ return _name; }
const std::string& getDataType() const
{ return _dataType; }
private:
std::string _name;
std::string _dataType;
friend class HLAOMTXmlVisitor;
};
typedef std::vector<SGSharedPtr<Parameter> > ParameterList;
struct InteractionClass : public SGReferenced {
InteractionClass(const std::string& name);
~InteractionClass();
const std::string& getName() const;
const std::string& getDimensions() const;
const std::string& getSharing() const;
const std::string& getTransportation() const;
const std::string& getOrder() const;
HLASubscriptionType getSubscriptionType() const
{
if (_sharing.find("Subscribe") != std::string::npos)
return HLASubscribedActive;
else
return HLAUnsubscribed;
}
HLAPublicationType getPublicationType() const
{
if (_sharing.find("Publish") != std::string::npos)
return HLAPublished;
else
return HLAUnpublished;
}
unsigned getNumParameters() const;
const Parameter* getParameter(unsigned index) const;
const InteractionClass* getParentInteractionClass() const;
private:
friend class HLAOMTXmlVisitor;
std::string _name;
std::string _dimensions;
std::string _sharing;
std::string _transportation;
std::string _order;
ParameterList _parameters;
SGSharedPtr<InteractionClass> _parentInteractionClass;
};
typedef std::vector<SGSharedPtr<InteractionClass> > InteractionClassList;
HLAOMTXmlVisitor();
~HLAOMTXmlVisitor();
void setDataTypesToFederate(HLAFederate& federate);
void setToFederate(HLAFederate& federate);
unsigned getNumObjectClasses() const;
const ObjectClass* getObjectClass(unsigned i) const;
unsigned getNumInteractionClasses() const;
const InteractionClass* getInteractionClass(unsigned i) const;
private:
SGSharedPtr<HLADataType> getDataType(const std::string& dataTypeName);
SGSharedPtr<HLABasicDataType> getBasicDataType(const std::string& dataTypeName);
SGSharedPtr<HLADataType> getSimpleDataType(const std::string& dataTypeName);
SGSharedPtr<HLAEnumeratedDataType> getEnumeratedDataType(const std::string& dataTypeName);
SGSharedPtr<HLADataType> getArrayDataType(const std::string& dataTypeName);
SGSharedPtr<HLAFixedRecordDataType> getFixedRecordDataType(const std::string& dataTypeName);
SGSharedPtr<HLAVariantRecordDataType> getVariantRecordDataType(const std::string& dataTypeName);
enum Mode {
UnknownMode,
ObjectModelMode,
ObjectsMode,
ObjectClassMode,
AttributeMode,
InteractionsMode,
InteractionClassMode,
ParameterMode,
DataTypesMode,
BasicDataRepresentationsMode,
BasicDataMode,
SimpleDataTypesMode,
SimpleDataMode,
EnumeratedDataTypesMode,
EnumeratedDataMode,
EnumeratorMode,
ArrayDataTypesMode,
ArrayDataMode,
FixedRecordDataTypesMode,
FixedRecordDataMode,
FieldMode,
VariantRecordDataTypesMode,
VariantRecordDataMode,
AlternativeDataMode
};
Mode getCurrentMode();
void pushMode(Mode mode);
void popMode();
virtual void startXML();
virtual void endXML ();
virtual void startElement(const char* name, const XMLAttributes& atts);
virtual void endElement(const char* name);
static std::string getAttribute(const char* name, const XMLAttributes& atts);
static std::string getAttribute(const std::string& name, const XMLAttributes& atts);
struct BasicData {
// std::string _name;
std::string _size;
std::string _endian;
};
typedef std::map<std::string, BasicData> BasicDataMap;
struct SimpleData {
// std::string _name;
std::string _representation;
std::string _units;
std::string _resolution;
std::string _accuracy;
};
typedef std::map<std::string, SimpleData> SimpleDataMap;
struct Enumerator {
std::string _name;
std::string _values;
};
typedef std::vector<Enumerator> EnumeratorList;
struct EnumeratedData {
// std::string _name;
std::string _representation;
EnumeratorList _enumeratorList;
};
typedef std::map<std::string, EnumeratedData> EnumeratedDataMap;
struct ArrayData {
// std::string _name;
std::string _dataType;
std::string _cardinality;
std::string _encoding;
};
typedef std::map<std::string, ArrayData> ArrayDataMap;
struct Field {
std::string _name;
std::string _dataType;
};
typedef std::vector<Field> FieldList;
struct FixedRecordData {
// std::string _name;
std::string _encoding;
FieldList _fieldList;
};
typedef std::map<std::string, FixedRecordData> FixedRecordDataMap;
struct Alternative {
std::string _name;
std::string _dataType;
std::string _semantics;
std::string _enumerator;
};
typedef std::vector<Alternative> AlternativeList;
struct VariantRecordData {
// std::string _name;
std::string _encoding;
std::string _dataType;
std::string _discriminant;
std::string _semantics;
AlternativeList _alternativeList;
};
typedef std::map<std::string, VariantRecordData> VariantRecordDataMap;
std::vector<Mode> _modeStack;
/// The total list of object classes
ObjectClassList _objectClassList;
ObjectClassList _objectClassStack;
/// The total list of interaction classes
InteractionClassList _interactionClassList;
InteractionClassList _interactionClassStack;
typedef std::map<std::string, SGSharedPtr<HLADataType> > StringDataTypeMap;
StringDataTypeMap _dataTypeMap;
/// DataType definitions
BasicDataMap _basicDataMap;
SimpleDataMap _simpleDataMap;
std::string _enumeratedDataName;
EnumeratedDataMap _enumeratedDataMap;
ArrayDataMap _arrayDataMap;
std::string _fixedRecordDataName;
FixedRecordDataMap _fixedRecordDataMap;
std::string _variantRecordDataName;
VariantRecordDataMap _variantRecordDataMap;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,445 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAObjectClass.hxx"
#include "simgear/debug/logstream.hxx"
#include "RTIFederate.hxx"
#include "RTIObjectClass.hxx"
#include "RTIObjectInstance.hxx"
#include "HLADataType.hxx"
#include "HLAFederate.hxx"
#include "HLAObjectInstance.hxx"
namespace simgear {
HLAObjectClass::InstanceCallback::~InstanceCallback()
{
}
void
HLAObjectClass::InstanceCallback::discoverInstance(const HLAObjectClass&, HLAObjectInstance& objectInstance, const RTIData& tag)
{
}
void
HLAObjectClass::InstanceCallback::removeInstance(const HLAObjectClass&, HLAObjectInstance& objectInstance, const RTIData& tag)
{
}
void
HLAObjectClass::InstanceCallback::registerInstance(const HLAObjectClass&, HLAObjectInstance& objectInstance)
{
}
void
HLAObjectClass::InstanceCallback::deleteInstance(const HLAObjectClass&, HLAObjectInstance& objectInstance)
{
}
HLAObjectClass::RegistrationCallback::~RegistrationCallback()
{
}
HLAObjectClass::HLAObjectClass(const std::string& name, HLAFederate* federate) :
_federate(federate),
_name(name)
{
if (!federate) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass::HLAObjectClass(): "
"No parent federate given for object class \"" << getName() << "\"!");
return;
}
federate->_insertObjectClass(this);
}
HLAObjectClass::~HLAObjectClass()
{
// HLAObjectClass objects only get deleted when the parent federate
// dies. So we do not need to deregister there.
_clearRTIObjectClass();
}
const std::string&
HLAObjectClass::getName() const
{
return _name;
}
const SGWeakPtr<HLAFederate>&
HLAObjectClass::getFederate() const
{
return _federate;
}
unsigned
HLAObjectClass::getNumAttributes() const
{
return _attributeVector.size();
}
unsigned
HLAObjectClass::addAttribute(const std::string& name)
{
unsigned index = _attributeVector.size();
_nameIndexMap[name] = index;
_attributeVector.push_back(Attribute(name));
_resolveAttributeIndex(name, index);
return index;
}
unsigned
HLAObjectClass::getAttributeIndex(const std::string& name) const
{
NameIndexMap::const_iterator i = _nameIndexMap.find(name);
if (i == _nameIndexMap.end())
return ~0u;
return i->second;
}
std::string
HLAObjectClass::getAttributeName(unsigned index) const
{
if (_attributeVector.size() <= index)
return std::string();
return _attributeVector[index]._name;
}
const HLADataType*
HLAObjectClass::getAttributeDataType(unsigned index) const
{
if (_attributeVector.size() <= index)
return 0;
return _attributeVector[index]._dataType.get();
}
void
HLAObjectClass::setAttributeDataType(unsigned index, const HLADataType* dataType)
{
if (_attributeVector.size() <= index)
return;
_attributeVector[index]._dataType = dataType;
}
HLAUpdateType
HLAObjectClass::getAttributeUpdateType(unsigned index) const
{
if (_attributeVector.size() <= index)
return HLAUndefinedUpdate;
return _attributeVector[index]._updateType;
}
void
HLAObjectClass::setAttributeUpdateType(unsigned index, HLAUpdateType updateType)
{
if (_attributeVector.size() <= index)
return;
_attributeVector[index]._updateType = updateType;
}
HLASubscriptionType
HLAObjectClass::getAttributeSubscriptionType(unsigned index) const
{
if (_attributeVector.size() <= index)
return HLAUnsubscribed;
return _attributeVector[index]._subscriptionType;
}
void
HLAObjectClass::setAttributeSubscriptionType(unsigned index, HLASubscriptionType subscriptionType)
{
if (_attributeVector.size() <= index)
return;
_attributeVector[index]._subscriptionType = subscriptionType;
}
HLAPublicationType
HLAObjectClass::getAttributePublicationType(unsigned index) const
{
if (_attributeVector.size() <= index)
return HLAUnpublished;
return _attributeVector[index]._publicationType;
}
void
HLAObjectClass::setAttributePublicationType(unsigned index, HLAPublicationType publicationType)
{
if (_attributeVector.size() <= index)
return;
_attributeVector[index]._publicationType = publicationType;
}
HLADataElement::IndexPathPair
HLAObjectClass::getIndexPathPair(const HLADataElement::StringPathPair& stringPathPair) const
{
unsigned index = getAttributeIndex(stringPathPair.first);
if (getNumAttributes() <= index) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass::getIndexPathPair(\""
<< HLADataElement::toString(stringPathPair)
<< "\"): Could not resolve attribute \"" << stringPathPair.first
<< "\" for object class \"" << getName() << "\"!");
}
return HLADataElement::IndexPathPair(index, stringPathPair.second);
}
HLADataElement::IndexPathPair
HLAObjectClass::getIndexPathPair(const std::string& path) const
{
return getIndexPathPair(HLADataElement::toStringPathPair(path));
}
bool
HLAObjectClass::subscribe()
{
if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::subscribe(): "
"No RTIObject class for object class \"" << getName() << "\"!");
return false;
}
HLAIndexList indexList;
for (unsigned i = 1; i < getNumAttributes(); ++i) {
if (_attributeVector[i]._subscriptionType != HLASubscribedActive)
continue;
indexList.push_back(i);
}
if (!indexList.empty()) {
if (!_rtiObjectClass->subscribe(indexList, true))
return false;
}
indexList.clear();
for (unsigned i = 1; i < getNumAttributes(); ++i) {
if (_attributeVector[i]._subscriptionType != HLASubscribedPassive)
continue;
indexList.push_back(i);
}
if (!indexList.empty()) {
if (!_rtiObjectClass->subscribe(indexList, false))
return false;
}
return true;
}
bool
HLAObjectClass::unsubscribe()
{
if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unsubscribe(): "
"No RTIObject class for object class \"" << getName() << "\"!");
return false;
}
return _rtiObjectClass->unsubscribe();
}
bool
HLAObjectClass::publish()
{
if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::publish(): "
"No RTIObject class for object class \"" << getName() << "\"!");
return false;
}
HLAIndexList indexList;
for (unsigned i = 1; i < getNumAttributes(); ++i) {
if (_attributeVector[i]._publicationType == HLAUnpublished)
continue;
indexList.push_back(i);
}
if (indexList.empty())
return true;
if (!_rtiObjectClass->publish(indexList))
return false;
return true;
}
bool
HLAObjectClass::unpublish()
{
if (!_rtiObjectClass.valid()) {
SG_LOG(SG_NETWORK, SG_WARN, "HLAObjectClass::unpublish(): "
"No RTIObject class for object class \"" << getName() << "\"!");
return false;
}
return _rtiObjectClass->unpublish();
}
void
HLAObjectClass::startRegistration() const
{
}
void
HLAObjectClass::stopRegistration() const
{
}
HLAObjectInstance*
HLAObjectClass::createObjectInstance(const std::string& name)
{
HLAObjectInstance* objectInstance = createObjectInstance();
if (objectInstance)
return objectInstance;
SGSharedPtr<HLAFederate> federate = _federate.lock();
if (!federate.valid())
return 0;
return federate->createObjectInstance(this, name);
}
HLAObjectInstance*
HLAObjectClass::createObjectInstance()
{
return 0;
}
void
HLAObjectClass::_setRTIObjectClass(RTIObjectClass* objectClass)
{
if (_rtiObjectClass) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: Setting RTIObjectClass twice for object class \"" << getName() << "\"!");
return;
}
_rtiObjectClass = objectClass;
if (_rtiObjectClass->_objectClass != this) {
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: backward reference does not match!");
return;
}
for (unsigned i = 0; i < _attributeVector.size(); ++i)
_resolveAttributeIndex(_attributeVector[i]._name, i);
}
void
HLAObjectClass::_resolveAttributeIndex(const std::string& name, unsigned index)
{
if (!_rtiObjectClass)
return;
if (!_rtiObjectClass->resolveAttributeIndex(name, index))
SG_LOG(SG_NETWORK, SG_ALERT, "HLAObjectClass: Could not resolve attribute \""
<< name << "\" for object class \"" << getName() << "\"!");
}
void
HLAObjectClass::_clearRTIObjectClass()
{
if (!_rtiObjectClass.valid())
return;
_rtiObjectClass->_objectClass = 0;
_rtiObjectClass = 0;
}
void
HLAObjectClass::_discoverInstance(RTIObjectInstance* rtiObjectInstance, const RTIData& tag)
{
SGSharedPtr<HLAFederate> federate = _federate.lock();
if (!federate.valid()) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while discovering object instance");
return;
}
SGSharedPtr<HLAObjectInstance> objectInstance = createObjectInstance(rtiObjectInstance->getName());
if (!objectInstance.valid()) {
SG_LOG(SG_NETWORK, SG_INFO, "RTI: could not create new object instance for discovered \""
<< rtiObjectInstance->getName() << "\" object");
return;
}
SG_LOG(SG_NETWORK, SG_INFO, "RTI: create new object instance for discovered \""
<< rtiObjectInstance->getName() << "\" object");
objectInstance->_setRTIObjectInstance(rtiObjectInstance);
if (!federate->_insertObjectInstance(objectInstance)) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not insert new object instance for discovered \""
<< rtiObjectInstance->getName() << "\" object");
return;
}
if (_instanceCallback.valid())
_instanceCallback->discoverInstance(*this, *objectInstance, tag);
}
void
HLAObjectClass::_removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag)
{
SGSharedPtr<HLAFederate> federate = _federate.lock();
if (!federate.valid()) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while removing object instance");
return;
}
SG_LOG(SG_NETWORK, SG_INFO, "RTI: remove object instance \"" << objectInstance.getName() << "\"");
if (_instanceCallback.valid())
_instanceCallback->removeInstance(*this, objectInstance, tag);
federate->_eraseObjectInstance(objectInstance.getName());
}
void
HLAObjectClass::_registerInstance(HLAObjectInstance* objectInstance)
{
SGSharedPtr<HLAFederate> federate = _federate.lock();
if (!federate.valid()) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while registering object instance");
return;
}
if (!objectInstance)
return;
// We can only register object instances with a valid name at the rti.
// So, we cannot do that at HLAObjectInstance creation time.
if (!federate->_insertObjectInstance(objectInstance)) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not insert new object instance \""
<< objectInstance->getName() << "\" object");
return;
}
if (_instanceCallback.valid())
_instanceCallback->registerInstance(*this, *objectInstance);
}
void
HLAObjectClass::_deleteInstance(HLAObjectInstance& objectInstance)
{
SGSharedPtr<HLAFederate> federate = _federate.lock();
if (!federate.valid()) {
SG_LOG(SG_NETWORK, SG_ALERT, "RTI: could not find parent federate while deleting object instance");
return;
}
if (_instanceCallback.valid())
_instanceCallback->deleteInstance(*this, objectInstance);
federate->_eraseObjectInstance(objectInstance.getName());
}
void
HLAObjectClass::_startRegistration()
{
if (_registrationCallback.valid())
_registrationCallback->startRegistration(*this);
else
startRegistration();
}
void
HLAObjectClass::_stopRegistration()
{
if (_registrationCallback.valid())
_registrationCallback->stopRegistration(*this);
else
stopRegistration();
}
} // namespace simgear

View File

@@ -0,0 +1,180 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAObjectClass_hxx
#define HLAObjectClass_hxx
#include <string>
#include <vector>
#include "HLADataType.hxx"
#include "HLAObjectInstance.hxx"
#include "HLATypes.hxx"
namespace simgear {
class RTIObjectClass;
class HLAFederate;
class HLAObjectClass : public SGWeakReferenced {
public:
HLAObjectClass(const std::string& name, HLAFederate* federate);
virtual ~HLAObjectClass();
/// Return the name of this object class
const std::string& getName() const;
/// return the federate this class belongs to
const SGWeakPtr<HLAFederate>& getFederate() const;
/// Return the number of attributes in this object class
unsigned getNumAttributes() const;
/// Adds a new attribute to this object class, return the index
unsigned addAttribute(const std::string& name);
/// Return the attribute index for the attribute with the given name
unsigned getAttributeIndex(const std::string& name) const;
/// Return the attribute name for the attribute with the given index
std::string getAttributeName(unsigned index) const;
/// Return the data type of the attribute with the given index
const HLADataType* getAttributeDataType(unsigned index) const;
/// Sets the data type of the attribute with the given index to dataType
void setAttributeDataType(unsigned index, const HLADataType* dataType);
/// Return the update type of the attribute with the given index
HLAUpdateType getAttributeUpdateType(unsigned index) const;
/// Sets the update type of the attribute with the given index to updateType
void setAttributeUpdateType(unsigned index, HLAUpdateType updateType);
/// Return the subscription type of the attribute with the given index
HLASubscriptionType getAttributeSubscriptionType(unsigned index) const;
/// Sets the subscription type of the attribute with the given index to subscriptionType
void setAttributeSubscriptionType(unsigned index, HLASubscriptionType subscriptionType);
/// Return the publication type of the attribute with the given index
HLAPublicationType getAttributePublicationType(unsigned index) const;
/// Sets the publication type of the attribute with the given index to publicationType
void setAttributePublicationType(unsigned index, HLAPublicationType publicationType);
/// Return the index, path pair for the given string path pair
HLADataElement::IndexPathPair getIndexPathPair(const HLADataElement::StringPathPair&) const;
/// Return the index, path pair for the given string path
HLADataElement::IndexPathPair getIndexPathPair(const std::string& path) const;
virtual bool subscribe();
virtual bool unsubscribe();
virtual bool publish();
virtual bool unpublish();
// Object instance creation and destruction
class InstanceCallback : public SGReferenced {
public:
virtual ~InstanceCallback();
virtual void discoverInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
virtual void removeInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance, const RTIData& tag);
virtual void registerInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
virtual void deleteInstance(const HLAObjectClass& objectClass, HLAObjectInstance& objectInstance);
};
void setInstanceCallback(const SGSharedPtr<InstanceCallback>& instanceCallback)
{ _instanceCallback = instanceCallback; }
const SGSharedPtr<InstanceCallback>& getInstanceCallback() const
{ return _instanceCallback; }
// Is called by the default registration callback if installed
// Should register the already known object instances of this class.
virtual void startRegistration() const;
virtual void stopRegistration() const;
// Handles startRegistrationForObjectClass and stopRegistrationForObjectClass events
class RegistrationCallback : public SGReferenced {
public:
virtual ~RegistrationCallback();
virtual void startRegistration(HLAObjectClass& objectClass) = 0;
virtual void stopRegistration(HLAObjectClass& objectClass) = 0;
};
void setRegistrationCallback(const SGSharedPtr<RegistrationCallback>& registrationCallback)
{ _registrationCallback = registrationCallback; }
const SGSharedPtr<RegistrationCallback>& getRegistrationCallback() const
{ return _registrationCallback; }
/// Create a new instance of this class.
virtual HLAObjectInstance* createObjectInstance(const std::string& name);
virtual HLAObjectInstance* createObjectInstance(); // deprecated
private:
HLAObjectClass(const HLAObjectClass&);
HLAObjectClass& operator=(const HLAObjectClass&);
void _setRTIObjectClass(RTIObjectClass* objectClass);
void _resolveAttributeIndex(const std::string& name, unsigned index);
void _clearRTIObjectClass();
// The internal entry points from the RTILObjectClass callback functions
void _discoverInstance(RTIObjectInstance* objectInstance, const RTIData& tag);
void _removeInstance(HLAObjectInstance& objectInstance, const RTIData& tag);
void _registerInstance(HLAObjectInstance* objectInstance);
void _deleteInstance(HLAObjectInstance& objectInstance);
void _startRegistration();
void _stopRegistration();
friend class HLAObjectInstance;
friend class RTIObjectClass;
struct Attribute {
Attribute() : _subscriptionType(HLAUnsubscribed), _publicationType(HLAUnpublished), _updateType(HLAUndefinedUpdate) {}
Attribute(const std::string& name) : _name(name), _subscriptionType(HLAUnsubscribed), _publicationType(HLAUnpublished), _updateType(HLAUndefinedUpdate) {}
std::string _name;
SGSharedPtr<const HLADataType> _dataType;
HLASubscriptionType _subscriptionType;
HLAPublicationType _publicationType;
HLAUpdateType _updateType;
};
typedef std::vector<Attribute> AttributeVector;
typedef std::map<std::string,unsigned> NameIndexMap;
/// The parent federate.
SGWeakPtr<HLAFederate> _federate;
/// The object class name
std::string _name;
/// The underlying rti dispatcher class
SGSharedPtr<RTIObjectClass> _rtiObjectClass;
/// The attribute data
AttributeVector _attributeVector;
/// The mapping from attribute names to attribute indices
NameIndexMap _nameIndexMap;
// Callback classes
SGSharedPtr<InstanceCallback> _instanceCallback;
SGSharedPtr<RegistrationCallback> _registrationCallback;
friend class HLAFederate;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,706 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAObjectInstance.hxx"
#include <algorithm>
#include "simgear/debug/logstream.hxx"
#include "HLAArrayDataElement.hxx"
#include "HLABasicDataElement.hxx"
#include "HLADataElement.hxx"
#include "HLAEnumeratedDataElement.hxx"
#include "HLAFederate.hxx"
#include "HLAFixedRecordDataElement.hxx"
#include "HLAObjectClass.hxx"
#include "HLAVariantRecordDataElement.hxx"
#include "RTIObjectClass.hxx"
#include "RTIObjectInstance.hxx"
namespace simgear {
HLAObjectInstance::UpdateCallback::~UpdateCallback()
{
}
HLAObjectInstance::ReflectCallback::~ReflectCallback()
{
}
HLAObjectInstance::HLAObjectInstance(HLAObjectClass* objectClass) :
_objectClass(objectClass)
{
if (objectClass)
_federate = objectClass->_federate;
}
HLAObjectInstance::~HLAObjectInstance()
{
_clearRTIObjectInstance();
}
const std::string&
HLAObjectInstance::getName() const
{
return _name;
}
const SGWeakPtr<HLAFederate>&
HLAObjectInstance::getFederate() const
{
return _federate;
}
const SGSharedPtr<HLAObjectClass>&
HLAObjectInstance::getObjectClass() const
{
return _objectClass;
}
unsigned
HLAObjectInstance::getNumAttributes() const
{
if (!_objectClass.valid())
return 0;
return _objectClass->getNumAttributes();
}
unsigned
HLAObjectInstance::getAttributeIndex(const std::string& name) const
{
if (!_objectClass.valid())
return ~0u;
return _objectClass->getAttributeIndex(name);
}
std::string
HLAObjectInstance::getAttributeName(unsigned index) const
{
if (!_objectClass.valid())
return std::string();
return _objectClass->getAttributeName(index);
}
bool
HLAObjectInstance::getAttributeOwned(unsigned index) const
{
if (!_rtiObjectInstance.valid())
return false;
return _rtiObjectInstance->getAttributeOwned(index);
}
const HLADataType*
HLAObjectInstance::getAttributeDataType(unsigned index) const
{
if (!_objectClass.valid())
return 0;
return _objectClass->getAttributeDataType(index);
}
HLADataElement*
HLAObjectInstance::getAttributeDataElement(unsigned index)
{
if (_attributeVector.size() <= index)
return 0;
return _attributeVector[index]._dataElement.get();
}
const HLADataElement*
HLAObjectInstance::getAttributeDataElement(unsigned index) const
{
if (_attributeVector.size() <= index)
return 0;
return _attributeVector[index]._dataElement.get();
}
bool
HLAObjectInstance::getAttributeData(unsigned index, RTIData& data) const
{
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to get raw attribute data without rti object instance for \"" << getName() << "\"!");
return false;
}
return _rtiObjectInstance->getAttributeData(index, data);
}
void
HLAObjectInstance::setAttributeDataElement(unsigned index, const SGSharedPtr<HLADataElement>& dataElement)
{
unsigned numAttributes = getNumAttributes();
if (numAttributes <= index)
return;
_attributeVector.resize(numAttributes);
if (_attributeVector[index]._dataElement.valid())
_attributeVector[index]._dataElement->clearStamp();
_attributeVector[index]._dataElement = dataElement;
if (_attributeVector[index]._dataElement.valid())
_attributeVector[index]._dataElement->createStamp();
}
class HLAObjectInstance::DataElementFactoryVisitor : public HLADataElementFactoryVisitor {
public:
DataElementFactoryVisitor(const HLAPathElementMap& pathElementMap) :
_pathElementMap(pathElementMap)
{ }
DataElementFactoryVisitor(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
_pathElementMap(pathElementMap),
_path(path)
{ }
virtual ~DataElementFactoryVisitor() {}
virtual void apply(const HLADataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Can not find a suitable data element for data type \""
<< dataType.getName() << "\"");
}
virtual void apply(const HLAInt8DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt8DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAInt16DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt16DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAInt32DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt32DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAInt64DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAUInt64DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAFloat32DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAFloat64DataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
class ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
public:
ArrayDataElementFactory(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
_path(path)
{
for (HLAPathElementMap::const_iterator i = pathElementMap.lower_bound(path);
i != pathElementMap.end(); ++i) {
if (i->first.begin() != std::search(i->first.begin(), i->first.end(),
path.begin(), path.end()))
break;
_pathElementMap.insert(*i);
}
}
virtual HLADataElement* createElement(const HLAArrayDataElement& element, unsigned index)
{
const HLADataType* dataType = element.getElementDataType();
if (!dataType)
return 0;
HLADataElement::Path path = _path;
path.push_back(HLADataElement::PathElement(index));
DataElementFactoryVisitor visitor(path, _pathElementMap);
dataType->accept(visitor);
return visitor._dataElement.release();
}
private:
HLADataElement::Path _path;
HLAPathElementMap _pathElementMap;
};
virtual void apply(const HLAFixedArrayDataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
arrayDataElement = new HLAArrayDataElement(&dataType);
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_path, _pathElementMap));
arrayDataElement->setNumElements(dataType.getNumElements());
_dataElement = arrayDataElement;
}
virtual void apply(const HLAVariableArrayDataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
arrayDataElement = new HLAArrayDataElement(&dataType);
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_path, _pathElementMap));
_dataElement = arrayDataElement;
}
virtual void apply(const HLAEnumeratedDataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
HLADataElementFactoryVisitor::apply(dataType);
}
virtual void apply(const HLAFixedRecordDataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
SGSharedPtr<HLAFixedRecordDataElement> recordDataElement;
recordDataElement = new HLAFixedRecordDataElement(&dataType);
unsigned numFields = dataType.getNumFields();
for (unsigned i = 0; i < numFields; ++i) {
_path.push_back(HLADataElement::PathElement(dataType.getFieldName(i)));
dataType.getFieldDataType(i)->accept(*this);
recordDataElement->setField(i, _dataElement.release());
_path.pop_back();
}
_dataElement = recordDataElement;
}
class VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory {
public:
VariantRecordDataElementFactory(const HLADataElement::Path& path, const HLAPathElementMap& pathElementMap) :
_path(path)
{
for (HLAPathElementMap::const_iterator i = pathElementMap.lower_bound(path);
i != pathElementMap.end(); ++i) {
if (i->first.begin() != std::search(i->first.begin(), i->first.end(),
path.begin(), path.end()))
break;
_pathElementMap.insert(*i);
}
}
virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index)
{
const HLAVariantRecordDataType* dataType = element.getDataType();
if (!dataType)
return 0;
const HLADataType* alternativeDataType = element.getAlternativeDataType();
if (!alternativeDataType)
return 0;
HLADataElement::Path path = _path;
path.push_back(HLADataElement::PathElement(dataType->getAlternativeName(index)));
DataElementFactoryVisitor visitor(path, _pathElementMap);
alternativeDataType->accept(visitor);
return visitor._dataElement.release();
}
private:
HLADataElement::Path _path;
HLAPathElementMap _pathElementMap;
};
virtual void apply(const HLAVariantRecordDataType& dataType)
{
_dataElement = createDataElement(_path, dataType);
if (_dataElement.valid())
return;
SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement;
variantRecordDataElement = new HLAVariantRecordDataElement(&dataType);
variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory(_path, _pathElementMap));
_dataElement = variantRecordDataElement;
}
private:
SGSharedPtr<HLADataElement> createDataElement(const HLADataElement::Path& path, const HLADataType& dataType)
{
HLAPathElementMap::const_iterator i = _pathElementMap.find(path);
if (i == _pathElementMap.end()) {
SG_LOG(SG_IO, SG_WARN, "No dataElement provided for \""
<< HLADataElement::toString(path) << "\".");
return 0;
}
SGSharedPtr<HLADataElement> dataElement = i->second.getDataElement(path);
if (!dataElement->setDataType(&dataType)) {
SG_LOG(SG_IO, SG_ALERT, "Cannot set data type for data element at \""
<< HLADataElement::toString(path) << "\"!");
return 0;
}
SG_LOG(SG_IO, SG_DEBUG, "Using provided dataElement for \""
<< HLADataElement::toString(path) << "\".");
return dataElement;
}
const HLAPathElementMap& _pathElementMap;
HLADataElement::Path _path;
};
void
HLAObjectInstance::setAttribute(unsigned index, const HLAPathElementMap& pathElementMap)
{
const HLADataType* dataType = getAttributeDataType(index);
if (!dataType) {
SG_LOG(SG_IO, SG_ALERT, "Cannot get attribute data type for setting attribute \""
<< getAttributeName(index) << "\" at index " << index << "!");
return;
}
SG_LOG(SG_IO, SG_DEBUG, "Setting DataElement for attribute \""
<< getAttributeName(index) << "\".");
DataElementFactoryVisitor visitor(pathElementMap);
dataType->accept(visitor);
setAttributeDataElement(index, visitor.getDataElement());
}
void
HLAObjectInstance::setAttributes(const HLAAttributePathElementMap& attributePathElementMap)
{
for (HLAAttributePathElementMap::const_iterator i = attributePathElementMap.begin();
i != attributePathElementMap.end(); ++i) {
setAttribute(i->first, i->second);
}
}
void
HLAObjectInstance::registerInstance()
{
registerInstance(_objectClass.get());
}
void
HLAObjectInstance::registerInstance(HLAObjectClass* objectClass)
{
if (_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to register object " << getName() << " already known to the RTI!");
return;
}
if (!objectClass) {
SG_LOG(SG_IO, SG_ALERT, "Could not register object with unknown object class!");
return;
}
if (_objectClass.valid() && objectClass != _objectClass.get()) {
SG_LOG(SG_IO, SG_ALERT, "Could not change object class while registering!");
return;
}
_objectClass = objectClass;
_federate = _objectClass->_federate;
// This error must have been flagged before
if (!_objectClass->_rtiObjectClass.valid())
return;
_setRTIObjectInstance(_objectClass->_rtiObjectClass->registerObjectInstance(this));
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Could not register object at the RTI!");
return;
}
_objectClass->_registerInstance(this);
}
void
HLAObjectInstance::deleteInstance(const RTIData& tag)
{
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_ALERT, "Trying to delete inactive object!");
return;
}
if (!_objectClass.valid())
return;
_objectClass->_deleteInstance(*this);
_rtiObjectInstance->deleteObjectInstance(tag);
}
void
HLAObjectInstance::updateAttributeValues(const RTIData& tag)
{
if (_attributeCallback.valid())
_attributeCallback->updateAttributeValues(*this, tag);
if (_updateCallback.valid()) {
_updateCallback->updateAttributeValues(*this, tag);
} else {
encodeAttributeValues();
sendAttributeValues(tag);
}
}
void
HLAObjectInstance::updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag)
{
if (_attributeCallback.valid())
_attributeCallback->updateAttributeValues(*this, tag);
if (_updateCallback.valid()) {
_updateCallback->updateAttributeValues(*this, timeStamp, tag);
} else {
encodeAttributeValues();
sendAttributeValues(timeStamp, tag);
}
}
void
HLAObjectInstance::encodeAttributeValues()
{
unsigned numAttributes = _attributeVector.size();
for (unsigned i = 0; i < numAttributes;++i) {
if (_attributeVector[i]._unconditionalUpdate) {
encodeAttributeValue(i);
} else if (_attributeVector[i]._enabledUpdate) {
const HLADataElement* dataElement = getAttributeDataElement(i);
if (dataElement && dataElement->getDirty())
encodeAttributeValue(i);
}
}
}
void
HLAObjectInstance::encodeAttributeValue(unsigned index)
{
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
return;
}
HLADataElement* dataElement = getAttributeDataElement(index);
if (!dataElement)
return;
_rtiObjectInstance->encodeAttributeData(index, *dataElement);
dataElement->setDirty(false);
}
void
HLAObjectInstance::sendAttributeValues(const RTIData& tag)
{
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
return;
}
_rtiObjectInstance->updateAttributeValues(tag);
}
void
HLAObjectInstance::sendAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag)
{
if (!_rtiObjectInstance.valid()) {
SG_LOG(SG_IO, SG_INFO, "Not updating inactive object!");
return;
}
_rtiObjectInstance->updateAttributeValues(timeStamp, tag);
}
void
HLAObjectInstance::reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag)
{
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i)
reflectAttributeValue(*i, tag);
}
void
HLAObjectInstance::reflectAttributeValues(const HLAIndexList& indexList,
const SGTimeStamp& timeStamp, const RTIData& tag)
{
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i)
reflectAttributeValue(*i, timeStamp, tag);
}
void
HLAObjectInstance::reflectAttributeValue(unsigned index, const RTIData& tag)
{
HLADataElement* dataElement = getAttributeDataElement(index);
if (!dataElement)
return;
dataElement->setTimeStampValid(false);
_rtiObjectInstance->decodeAttributeData(index, *dataElement);
}
void
HLAObjectInstance::reflectAttributeValue(unsigned index, const SGTimeStamp& timeStamp, const RTIData& tag)
{
HLADataElement* dataElement = getAttributeDataElement(index);
if (!dataElement)
return;
dataElement->setTimeStamp(timeStamp);
dataElement->setTimeStampValid(true);
_rtiObjectInstance->decodeAttributeData(index, *dataElement);
}
void
HLAObjectInstance::_setRTIObjectInstance(RTIObjectInstance* rtiObjectInstance)
{
if (!_objectClass.valid())
return;
_rtiObjectInstance = rtiObjectInstance;
_rtiObjectInstance->setObjectInstance(this);
_name = _rtiObjectInstance->getName();
unsigned numAttributes = getNumAttributes();
_attributeVector.resize(numAttributes);
for (unsigned i = 0; i < numAttributes; ++i) {
HLAUpdateType updateType = _objectClass->getAttributeUpdateType(i);
if (getAttributeOwned(i) && updateType != HLAUndefinedUpdate) {
_attributeVector[i]._enabledUpdate = true;
_attributeVector[i]._unconditionalUpdate = (updateType == HLAPeriodicUpdate);
// In case of an owned attribute, now encode its value
encodeAttributeValue(i);
} else {
_attributeVector[i]._enabledUpdate = false;
_attributeVector[i]._unconditionalUpdate = false;
}
}
// This makes sense with any new object. Even if we registered one, there might be unpublished attributes.
HLAIndexList indexList;
for (unsigned i = 0; i < numAttributes; ++i) {
HLAUpdateType updateType = _objectClass->getAttributeUpdateType(i);
if (getAttributeOwned(i))
continue;
if (updateType == HLAUndefinedUpdate)
continue;
if (updateType == HLAPeriodicUpdate)
continue;
indexList.push_back(i);
}
_rtiObjectInstance->requestObjectAttributeValueUpdate(indexList);
}
void
HLAObjectInstance::_clearRTIObjectInstance()
{
if (!_rtiObjectInstance.valid())
return;
for (unsigned i = 0; i < _attributeVector.size(); ++i) {
_attributeVector[i]._enabledUpdate = false;
_attributeVector[i]._unconditionalUpdate = false;
}
_rtiObjectInstance->setObjectInstance(0);
_rtiObjectInstance = 0;
}
void
HLAObjectInstance::_removeInstance(const RTIData& tag)
{
if (!_objectClass.valid())
return;
_objectClass->_removeInstance(*this, tag);
}
void
HLAObjectInstance::_reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag)
{
if (_reflectCallback.valid()) {
_reflectCallback->reflectAttributeValues(*this, indexList, tag);
} else if (_attributeCallback.valid()) {
reflectAttributeValues(indexList, tag);
RTIIndexDataPairList dataPairList;
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
dataPairList.push_back(RTIIndexDataPair());
dataPairList.back().first = *i;
getAttributeData(*i, dataPairList.back().second);
}
_attributeCallback->reflectAttributeValues(*this, dataPairList, tag);
} else {
reflectAttributeValues(indexList, tag);
}
}
void
HLAObjectInstance::_reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag)
{
if (_reflectCallback.valid()) {
_reflectCallback->reflectAttributeValues(*this, indexList, timeStamp, tag);
} else if (_attributeCallback.valid()) {
reflectAttributeValues(indexList, timeStamp, tag);
RTIIndexDataPairList dataPairList;
for (HLAIndexList::const_iterator i = indexList.begin(); i != indexList.end(); ++i) {
dataPairList.push_back(RTIIndexDataPair());
dataPairList.back().first = *i;
getAttributeData(*i, dataPairList.back().second);
}
_attributeCallback->reflectAttributeValues(*this, dataPairList, timeStamp, tag);
} else {
reflectAttributeValues(indexList, timeStamp, tag);
}
}
} // namespace simgear

View File

@@ -0,0 +1,204 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAObjectInstance_hxx
#define HLAObjectInstance_hxx
#include <vector>
#include <simgear/structure/SGWeakPtr.hxx>
#include "HLADataElement.hxx"
#include "HLATypes.hxx"
class SGTimeStamp;
namespace simgear {
class RTIObjectInstance;
class HLAFederate;
class HLAObjectClass;
class HLAObjectInstance : public SGWeakReferenced {
public:
HLAObjectInstance(HLAObjectClass* objectClass = 0);
virtual ~HLAObjectInstance();
/// Return the name of this object instance
const std::string& getName() const;
/// return the federate this instance belongs to
const SGWeakPtr<HLAFederate>& getFederate() const;
/// Return the object class of this instance.
/// Should always return a valid object class.
const SGSharedPtr<HLAObjectClass>& getObjectClass() const;
/// Return the number of attributes
unsigned getNumAttributes() const;
/// Return the attribute index for the attribute with the given name
unsigned getAttributeIndex(const std::string& name) const;
/// Return the attribute name for the attribute with the given index
std::string getAttributeName(unsigned index) const;
/// Return true if the attribute with the given index is owned by
/// this federate
bool getAttributeOwned(unsigned index) const;
/// Return the data type of the attribute with the given index
const HLADataType* getAttributeDataType(unsigned index) const;
/// Return the data element of the attribute with the given index
HLADataElement* getAttributeDataElement(unsigned index);
const HLADataElement* getAttributeDataElement(unsigned index) const;
/// Write the raw attribute data value into data, works only of the object
/// is backed up with an rti object instance
bool getAttributeData(unsigned index, RTIData& data) const;
/// Sets the data element of the attribute with the given index to dataElement
void setAttributeDataElement(unsigned index, const SGSharedPtr<HLADataElement>& dataElement);
/// Sets the data element of the attribute with the given index to the content of pathElementMap
void setAttribute(unsigned index, const HLAPathElementMap& pathElementMap);
void setAttributes(const HLAAttributePathElementMap& attributePathElementMap);
void registerInstance();
void registerInstance(HLAObjectClass* objectClass);
void deleteInstance(const RTIData& tag);
// Push the current values into the RTI
virtual void updateAttributeValues(const RTIData& tag);
virtual void updateAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag);
// encode periodic and dirty attribute values for the next sendAttributeValues
void encodeAttributeValues();
// encode the attribute value at index i for the next sendAttributeValues
void encodeAttributeValue(unsigned index);
// Really sends the prepared attribute update values into the RTI
void sendAttributeValues(const RTIData& tag);
void sendAttributeValues(const SGTimeStamp& timeStamp, const RTIData& tag);
class UpdateCallback : public SGReferenced {
public:
virtual ~UpdateCallback();
virtual void updateAttributeValues(HLAObjectInstance&, const RTIData&) = 0;
virtual void updateAttributeValues(HLAObjectInstance&, const SGTimeStamp&, const RTIData&) = 0;
};
void setUpdateCallback(const SGSharedPtr<UpdateCallback>& updateCallback)
{ _updateCallback = updateCallback; }
const SGSharedPtr<UpdateCallback>& getUpdateCallback() const
{ return _updateCallback; }
// Reflects the indices given in the index vector into the attributes HLADataElements.
virtual void reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag);
virtual void reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag);
// Reflect a single attribute value at the given index into the attributes HLADataELement.
virtual void reflectAttributeValue(unsigned index, const RTIData& tag);
virtual void reflectAttributeValue(unsigned index, const SGTimeStamp& timeStamp, const RTIData& tag);
class ReflectCallback : public SGReferenced {
public:
virtual ~ReflectCallback();
virtual void reflectAttributeValues(HLAObjectInstance&, const HLAIndexList&, const RTIData&) = 0;
virtual void reflectAttributeValues(HLAObjectInstance&, const HLAIndexList&, const SGTimeStamp&, const RTIData&) = 0;
};
void setReflectCallback(const SGSharedPtr<ReflectCallback>& reflectCallback)
{ _reflectCallback = reflectCallback; }
const SGSharedPtr<ReflectCallback>& getReflectCallback() const
{ return _reflectCallback; }
// deprecated.
class AttributeCallback : public SGReferenced {
public:
virtual ~AttributeCallback() {}
virtual void updateAttributeValues(HLAObjectInstance& objectInstance, const RTIData& tag)
{ }
virtual void reflectAttributeValues(HLAObjectInstance& objectInstance,
const RTIIndexDataPairList& dataPairList, const RTIData& tag)
{ }
virtual void reflectAttributeValues(HLAObjectInstance& objectInstance, const RTIIndexDataPairList& dataPairList,
const SGTimeStamp& timeStamp, const RTIData& tag)
{ reflectAttributeValues(objectInstance, dataPairList, tag); }
};
void setAttributeCallback(const SGSharedPtr<AttributeCallback>& attributeCallback)
{ _attributeCallback = attributeCallback; }
const SGSharedPtr<AttributeCallback>& getAttributeCallback() const
{ return _attributeCallback; }
private:
void _setRTIObjectInstance(RTIObjectInstance* rtiObjectInstance);
void _clearRTIObjectInstance();
// The callback entry points from the RTI interface classes.
void _removeInstance(const RTIData& tag);
void _reflectAttributeValues(const HLAIndexList& indexList, const RTIData& tag);
void _reflectAttributeValues(const HLAIndexList& indexList, const SGTimeStamp& timeStamp, const RTIData& tag);
class DataElementFactoryVisitor;
struct Attribute {
Attribute() : _enabledUpdate(false), _unconditionalUpdate(false) {}
SGSharedPtr<HLADataElement> _dataElement;
bool _enabledUpdate;
bool _unconditionalUpdate;
// HLAIndexList::iterator _unconditionalUpdateAttributeIndexListIterator;
// HLAIndexList::iterator _conditionalUpdateAttributeIndexListIterator;
};
typedef std::vector<Attribute> AttributeVector;
// At some time we want these: Until then, use the _enabledUpdate and _unconditionalUpdate flags in the Attribute struct.
// HLAIndexList _unconditionalUpdateAttributeIndexList;
// HLAIndexList _conditionalUpdateAttributeIndexList;
/// The parent Federate
SGWeakPtr<HLAFederate> _federate;
/// The ObjectClass
SGSharedPtr<HLAObjectClass> _objectClass;
/// The name as known in the RTI
std::string _name;
// /// The name as given by the local created instance
// std::string _givenName;
/// The underlying rti dispatcher class
SGSharedPtr<RTIObjectInstance> _rtiObjectInstance;
/// The attribute data
AttributeVector _attributeVector;
// Callback classes
SGSharedPtr<UpdateCallback> _updateCallback;
SGSharedPtr<ReflectCallback> _reflectCallback;
SGSharedPtr<AttributeCallback> _attributeCallback;
friend class HLAFederate;
friend class HLAObjectClass;
friend class RTIObjectInstance;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,568 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLAPropertyDataElement.hxx"
#include "HLAArrayDataElement.hxx"
#include "HLABasicDataElement.hxx"
#include "HLADataElementVisitor.hxx"
#include "HLADataTypeVisitor.hxx"
#include "HLAFixedRecordDataElement.hxx"
#include "HLAVariantRecordDataElement.hxx"
namespace simgear {
class HLAPropertyDataElement::ScalarDecodeVisitor : public HLADataTypeDecodeVisitor {
public:
ScalarDecodeVisitor(HLADecodeStream& stream, SGPropertyNode& propertyNode) :
HLADataTypeDecodeVisitor(stream),
_propertyNode(propertyNode)
{ }
virtual ~ScalarDecodeVisitor()
{ }
virtual void apply(const HLAInt8DataType& dataType)
{
int8_t value = 0;
dataType.decode(_stream, value);
_propertyNode.setIntValue(value);
}
virtual void apply(const HLAUInt8DataType& dataType)
{
uint8_t value = 0;
dataType.decode(_stream, value);
_propertyNode.setIntValue(value);
}
virtual void apply(const HLAInt16DataType& dataType)
{
int16_t value = 0;
dataType.decode(_stream, value);
_propertyNode.setIntValue(value);
}
virtual void apply(const HLAUInt16DataType& dataType)
{
uint16_t value = 0;
dataType.decode(_stream, value);
_propertyNode.setIntValue(value);
}
virtual void apply(const HLAInt32DataType& dataType)
{
int32_t value = 0;
dataType.decode(_stream, value);
_propertyNode.setIntValue(value);
}
virtual void apply(const HLAUInt32DataType& dataType)
{
uint32_t value = 0;
dataType.decode(_stream, value);
_propertyNode.setIntValue(value);
}
virtual void apply(const HLAInt64DataType& dataType)
{
int64_t value = 0;
dataType.decode(_stream, value);
_propertyNode.setLongValue(value);
}
virtual void apply(const HLAUInt64DataType& dataType)
{
uint64_t value = 0;
dataType.decode(_stream, value);
_propertyNode.setLongValue(value);
}
virtual void apply(const HLAFloat32DataType& dataType)
{
float value = 0;
dataType.decode(_stream, value);
_propertyNode.setFloatValue(value);
}
virtual void apply(const HLAFloat64DataType& dataType)
{
double value = 0;
dataType.decode(_stream, value);
_propertyNode.setDoubleValue(value);
}
protected:
SGPropertyNode& _propertyNode;
};
class HLAPropertyDataElement::ScalarEncodeVisitor : public HLADataTypeEncodeVisitor {
public:
ScalarEncodeVisitor(HLAEncodeStream& stream, const SGPropertyNode& propertyNode) :
HLADataTypeEncodeVisitor(stream),
_propertyNode(propertyNode)
{ }
virtual ~ScalarEncodeVisitor()
{ }
virtual void apply(const HLAInt8DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getIntValue());
}
virtual void apply(const HLAUInt8DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getIntValue());
}
virtual void apply(const HLAInt16DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getIntValue());
}
virtual void apply(const HLAUInt16DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getIntValue());
}
virtual void apply(const HLAInt32DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getIntValue());
}
virtual void apply(const HLAUInt32DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getIntValue());
}
virtual void apply(const HLAInt64DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getLongValue());
}
virtual void apply(const HLAUInt64DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getLongValue());
}
virtual void apply(const HLAFloat32DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getFloatValue());
}
virtual void apply(const HLAFloat64DataType& dataType)
{
dataType.encode(_stream, _propertyNode.getDoubleValue());
}
protected:
const SGPropertyNode& _propertyNode;
};
class HLAPropertyDataElement::ScalarDataElement : public HLABasicDataElement {
public:
ScalarDataElement(const HLABasicDataType* dataType, SGPropertyNode* propertyNode);
virtual ~ScalarDataElement();
virtual bool encode(HLAEncodeStream& stream) const;
virtual bool decode(HLADecodeStream& stream);
private:
SGSharedPtr<SGPropertyNode> _propertyNode;
};
HLAPropertyDataElement::ScalarDataElement::ScalarDataElement(const HLABasicDataType* dataType, SGPropertyNode* propertyNode) :
HLABasicDataElement(dataType),
_propertyNode(propertyNode)
{
}
HLAPropertyDataElement::ScalarDataElement::~ScalarDataElement()
{
}
bool
HLAPropertyDataElement::ScalarDataElement::encode(HLAEncodeStream& stream) const
{
ScalarEncodeVisitor visitor(stream, *_propertyNode);
_dataType->accept(visitor);
return true;
}
bool
HLAPropertyDataElement::ScalarDataElement::decode(HLADecodeStream& stream)
{
ScalarDecodeVisitor visitor(stream, *_propertyNode);
_dataType->accept(visitor);
return true;
}
class HLAPropertyDataElement::StringDataElement : public HLAStringDataElement {
public:
StringDataElement(const HLAArrayDataType* dataType, SGPropertyNode* propertyNode);
virtual ~StringDataElement();
virtual bool decodeElement(HLADecodeStream& stream, unsigned i);
class Listener : public SGPropertyChangeListener {
public:
Listener(StringDataElement* stringDataElement);
virtual ~Listener();
virtual void valueChanged (SGPropertyNode * node);
private:
StringDataElement* _stringDataElement;
};
private:
SGSharedPtr<SGPropertyNode> _propertyNode;
Listener* _listener;
};
HLAPropertyDataElement::StringDataElement::Listener::Listener(StringDataElement* stringDataElement) :
_stringDataElement(stringDataElement)
{
}
HLAPropertyDataElement::StringDataElement::Listener::~Listener()
{
}
void
HLAPropertyDataElement::StringDataElement::Listener::valueChanged (SGPropertyNode * node)
{
_stringDataElement->setValue(node->getStringValue());
}
HLAPropertyDataElement::StringDataElement::StringDataElement(const HLAArrayDataType* dataType, SGPropertyNode* propertyNode) :
HLAStringDataElement(dataType),
_propertyNode(propertyNode),
_listener(new Listener(this))
{
_propertyNode->addChangeListener(_listener, true);
}
HLAPropertyDataElement::StringDataElement::~StringDataElement()
{
_propertyNode->removeChangeListener(_listener);
delete _listener;
_listener = 0;
}
bool
HLAPropertyDataElement::StringDataElement::decodeElement(HLADecodeStream& stream, unsigned i)
{
if (!HLAStringDataElement::decodeElement(stream, i))
return false;
if (i + 1 == getValue().size())
_propertyNode->setStringValue(getValue());
return true;
}
class HLAPropertyDataElement::DataElementFactoryVisitor : public HLADataTypeVisitor {
public:
DataElementFactoryVisitor(SGPropertyNode* propertyNode) :
_propertyNode(propertyNode)
{ }
virtual ~DataElementFactoryVisitor()
{ }
virtual void apply(const HLADataType& dataType)
{
SG_LOG(SG_NETWORK, SG_ALERT, "HLA: Can not find a suitable data element for data type \""
<< dataType.getName() << "\"");
}
virtual void apply(const HLAInt8DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
virtual void apply(const HLAUInt8DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
virtual void apply(const HLAInt16DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
virtual void apply(const HLAUInt16DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
virtual void apply(const HLAInt32DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
virtual void apply(const HLAUInt32DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
virtual void apply(const HLAInt64DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
virtual void apply(const HLAUInt64DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
virtual void apply(const HLAFloat32DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
virtual void apply(const HLAFloat64DataType& dataType)
{
_dataElement = new ScalarDataElement(&dataType, _propertyNode.get());
}
class ArrayDataElementFactory : public HLAArrayDataElement::DataElementFactory {
public:
ArrayDataElementFactory(SGPropertyNode* propertyNode) :
_propertyNode(propertyNode)
{ }
virtual HLADataElement* createElement(const HLAArrayDataElement& element, unsigned index)
{
const HLADataType* dataType = element.getElementDataType();
if (!dataType)
return 0;
SGPropertyNode* parent = _propertyNode->getParent();
DataElementFactoryVisitor visitor(parent->getChild(_propertyNode->getNameString(), index, true));
dataType->accept(visitor);
return visitor.getDataElement();
}
private:
SGSharedPtr<SGPropertyNode> _propertyNode;
};
virtual void apply(const HLAFixedArrayDataType& dataType)
{
if (dataType.getIsString()) {
_dataElement = new StringDataElement(&dataType, _propertyNode.get());
} else {
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
arrayDataElement = new HLAArrayDataElement(&dataType);
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_propertyNode.get()));
arrayDataElement->setNumElements(dataType.getNumElements());
_dataElement = arrayDataElement;
}
}
virtual void apply(const HLAVariableArrayDataType& dataType)
{
if (dataType.getIsString()) {
_dataElement = new StringDataElement(&dataType, _propertyNode.get());
} else {
SGSharedPtr<HLAArrayDataElement> arrayDataElement;
arrayDataElement = new HLAArrayDataElement(&dataType);
arrayDataElement->setDataElementFactory(new ArrayDataElementFactory(_propertyNode.get()));
_dataElement = arrayDataElement;
}
}
virtual void apply(const HLAEnumeratedDataType& dataType)
{
_dataElement = new ScalarDataElement(dataType.getRepresentation(), _propertyNode.get());
}
virtual void apply(const HLAFixedRecordDataType& dataType)
{
SGSharedPtr<HLAFixedRecordDataElement> recordDataElement;
recordDataElement = new HLAFixedRecordDataElement(&dataType);
unsigned numFields = dataType.getNumFields();
for (unsigned i = 0; i < numFields; ++i) {
DataElementFactoryVisitor visitor(_propertyNode->getChild(dataType.getFieldName(i), 0, true));
dataType.getFieldDataType(i)->accept(visitor);
recordDataElement->setField(i, visitor._dataElement.get());
}
_dataElement = recordDataElement;
}
class VariantRecordDataElementFactory : public HLAVariantRecordDataElement::DataElementFactory {
public:
VariantRecordDataElementFactory(SGPropertyNode* propertyNode) :
_propertyNode(propertyNode)
{ }
virtual HLADataElement* createElement(const HLAVariantRecordDataElement& element, unsigned index)
{
const HLAVariantRecordDataType* dataType = element.getDataType();
if (!dataType)
return 0;
const HLADataType* alternativeDataType = element.getAlternativeDataType();
if (!alternativeDataType)
return 0;
DataElementFactoryVisitor visitor(_propertyNode->getChild(dataType->getAlternativeName(index), 0, true));
alternativeDataType->accept(visitor);
return visitor.getDataElement();
}
private:
SGSharedPtr<SGPropertyNode> _propertyNode;
};
virtual void apply(const HLAVariantRecordDataType& dataType)
{
SGSharedPtr<HLAVariantRecordDataElement> variantRecordDataElement;
variantRecordDataElement = new HLAVariantRecordDataElement(&dataType);
variantRecordDataElement->setDataElementFactory(new VariantRecordDataElementFactory(_propertyNode.get()));
_dataElement = variantRecordDataElement;
}
HLADataElement* getDataElement()
{ return _dataElement.release(); }
private:
SGSharedPtr<SGPropertyNode> _propertyNode;
SGSharedPtr<HLADataElement> _dataElement;
};
HLAPropertyDataElement::HLAPropertyDataElement()
{
}
HLAPropertyDataElement::HLAPropertyDataElement(SGPropertyNode* propertyNode)
{
setPropertyNode(propertyNode);
}
HLAPropertyDataElement::HLAPropertyDataElement(const HLADataType* dataType, SGPropertyNode* propertyNode) :
_dataType(dataType)
{
setPropertyNode(propertyNode);
}
HLAPropertyDataElement::HLAPropertyDataElement(const HLADataType* dataType) :
_dataType(dataType)
{
}
HLAPropertyDataElement::~HLAPropertyDataElement()
{
}
void
HLAPropertyDataElement::accept(HLADataElementVisitor& visitor)
{
if (_dataElement.valid()) {
visitor.apply(*_dataElement);
} else {
// We cant do anything if the data type is not valid
if (_dataType.valid()) {
HLADataElementFactoryVisitor factoryVisitor;
_dataType->accept(factoryVisitor);
_dataElement = factoryVisitor.getDataElement();
if (_dataElement.valid()) {
visitor.apply(*_dataElement);
} else {
HLADataElement::accept(visitor);
}
} else {
HLADataElement::accept(visitor);
}
}
}
void
HLAPropertyDataElement::accept(HLAConstDataElementVisitor& visitor) const
{
if (_dataElement.valid()) {
visitor.apply(*_dataElement);
} else {
HLADataElement::accept(visitor);
}
}
bool
HLAPropertyDataElement::encode(HLAEncodeStream& stream) const
{
if (_dataElement.valid()) {
return _dataElement->encode(stream);
} else {
if (!_dataType.valid())
return false;
HLADataTypeEncodeVisitor visitor(stream);
_dataType->accept(visitor);
return true;
}
}
bool
HLAPropertyDataElement::decode(HLADecodeStream& stream)
{
if (_dataElement.valid()) {
return _dataElement->decode(stream);
} else if (!_dataType.valid()) {
// We cant do anything if the data type is not valid
return false;
} else {
HLADataElementFactoryVisitor visitor;
_dataType->accept(visitor);
_dataElement = visitor.getDataElement();
if (_dataElement.valid()) {
return _dataElement->decode(stream);
} else {
HLADataTypeDecodeVisitor visitor(stream);
_dataType->accept(visitor);
return true;
}
}
}
const HLADataType*
HLAPropertyDataElement::getDataType() const
{
return _dataType.get();
}
bool
HLAPropertyDataElement::setDataType(const HLADataType* dataType)
{
_dataType = dataType;
if (_dataType.valid() && _propertyNode.valid())
_dataElement = createDataElement(_dataType, _propertyNode);
return true;
}
void
HLAPropertyDataElement::setPropertyNode(SGPropertyNode* propertyNode)
{
_propertyNode = propertyNode;
if (_dataType.valid() && _propertyNode.valid())
_dataElement = createDataElement(_dataType, _propertyNode);
}
SGPropertyNode*
HLAPropertyDataElement::getPropertyNode()
{
return _propertyNode.get();
}
const SGPropertyNode*
HLAPropertyDataElement::getPropertyNode() const
{
return _propertyNode.get();
}
HLADataElement*
HLAPropertyDataElement::createDataElement(const SGSharedPtr<const HLADataType>& dataType,
const SGSharedPtr<SGPropertyNode>& propertyNode)
{
DataElementFactoryVisitor visitor(propertyNode);
dataType->accept(visitor);
SGSharedPtr<HLADataElement> dataElement = visitor.getDataElement();
// Copy over the content of the previous data element if there is any.
if (_dataElement.valid()) {
// FIXME is encode/decode the right tool here??
RTIData data;
HLAEncodeStream encodeStream(data);
if (_dataElement->encode(encodeStream)) {
HLADecodeStream decodeStream(data);
dataElement->decode(decodeStream);
}
}
return dataElement.release();
}
} // namespace simgear

View File

@@ -0,0 +1,66 @@
// Copyright (C) 2009 - 2011 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAPropertyDataElement_hxx
#define HLAPropertyDataElement_hxx
#include <simgear/props/props.hxx>
#include "HLADataElement.hxx"
namespace simgear {
class HLAPropertyDataElement : public HLADataElement {
public:
HLAPropertyDataElement();
HLAPropertyDataElement(SGPropertyNode* propertyNode);
HLAPropertyDataElement(const HLADataType* dataType, SGPropertyNode* propertyNode);
HLAPropertyDataElement(const HLADataType* dataType);
virtual ~HLAPropertyDataElement();
virtual void accept(HLADataElementVisitor& visitor);
virtual void accept(HLAConstDataElementVisitor& visitor) const;
virtual bool encode(HLAEncodeStream& stream) const;
virtual bool decode(HLADecodeStream& stream);
virtual const HLADataType* getDataType() const;
virtual bool setDataType(const HLADataType* dataType);
void setPropertyNode(SGPropertyNode* propertyNode);
SGPropertyNode* getPropertyNode();
const SGPropertyNode* getPropertyNode() const;
private:
HLADataElement*
createDataElement(const SGSharedPtr<const HLADataType>& dataType, const SGSharedPtr<SGPropertyNode>& propertyNode);
class ScalarDecodeVisitor;
class ScalarEncodeVisitor;
class ScalarDataElement;
class StringDecodeVisitor;
class StringEncodeVisitor;
class StringDataElement;
class DataElementFactoryVisitor;
SGSharedPtr<const HLADataType> _dataType;
SGSharedPtr<HLADataElement> _dataElement;
SGSharedPtr<SGPropertyNode> _propertyNode;
};
} // namespace simgear
#endif

View File

@@ -0,0 +1,66 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <simgear/compiler.h>
#include "HLARawDataElement.hxx"
namespace simgear {
HLARawDataElement::HLARawDataElement(const HLADataType* dataType) :
_dataType(dataType)
{
}
HLARawDataElement::~HLARawDataElement()
{
}
bool
HLARawDataElement::encode(HLAEncodeStream& stream) const
{
stream.setData(_rtiData);
stream.skip(_rtiData.size());
return true;
}
bool
HLARawDataElement::decode(HLADecodeStream& stream)
{
_rtiData = stream.getData();
stream.skip(_rtiData.size());
return true;
}
const HLADataType*
HLARawDataElement::getDataType() const
{
return _dataType.get();
}
bool
HLARawDataElement::setDataType(const HLADataType* dataType)
{
_dataType = dataType;
return true;
}
}

View File

@@ -0,0 +1,52 @@
// Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLARawDataElement_hxx
#define HLARawDataElement_hxx
#include "RTIData.hxx"
#include "HLADataElement.hxx"
#include "HLADataType.hxx"
namespace simgear {
class HLARawDataElement : public HLADataElement {
public:
HLARawDataElement(const HLADataType* dataType);
virtual ~HLARawDataElement();
virtual bool encode(HLAEncodeStream& stream) const;
virtual bool decode(HLADecodeStream& stream);
virtual const HLADataType* getDataType() const;
virtual bool setDataType(const HLADataType* dataType);
const RTIData& getData() const
{ return _rtiData; }
RTIData& getData()
{ return _rtiData; }
void setData(const RTIData& rtiData)
{ _rtiData = rtiData; }
protected:
SGSharedPtr<const HLADataType> _dataType;
RTIData _rtiData;
};
}
#endif

47
simgear/hla/HLATypes.hxx Normal file
View File

@@ -0,0 +1,47 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLATypes_hxx
#define HLATypes_hxx
#include <list>
namespace simgear {
enum HLASubscriptionType {
HLAUnsubscribed,
HLASubscribedActive,
HLASubscribedPassive
};
enum HLAPublicationType {
HLAUnpublished,
HLAPublished
};
enum HLAUpdateType {
HLAStaticUpdate,
HLAPeriodicUpdate,
HLAConditionalUpdate,
HLAUndefinedUpdate
};
typedef std::list<unsigned> HLAIndexList;
} // namespace simgear
#endif

View File

@@ -0,0 +1,31 @@
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library 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
// Library 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
#ifndef HLAVariantDataElement_hxx
#define HLAVariantDataElement_hxx
#include "HLAVariantDataType.hxx"
#include "HLAVariantRecordDataElement.hxx"
namespace simgear {
typedef HLAAbstractVariantRecordDataElement HLAAbstractVariantDataElement;
typedef HLAVariantRecordDataElement HLAVariantDataElement;
}
#endif

Some files were not shown because too many files have changed in this diff Show More