1
0
Fork 0
Commit graph

400 commits

Author SHA1 Message Date
Edward d'Auvergne
c1c7b043ac SGSubsystemMgr::get_subsystem(): Universal switch to the templated function.
The globals non-templated get_subsystem() helper function has been made private
to enforce the switch.
2022-11-17 15:57:39 +00:00
Edward d'Auvergne
c5aa3ca0f1 SGSubsystem classes: Switch to the new SGSubsystemMgr::add() functions.
Most subsystems are now created via the subsystem manager using the global
subsystem registrations.

The FGGlobals add_subsystem() and add_new_subsystem() methods have been removed
as the subsystem manager addition and creation function interface now exceeds
the functionality of these helper functions.
2022-11-17 15:57:39 +00:00
Edward d'Auvergne
ad33e50324 SGSubsystem classes: Registration of all subsystems added since mid 2018. 2022-11-17 15:57:39 +00:00
James Hogan
5645d0b558
Splash: Drop debug logging noise
Drop some unintentional debug logging noise from the sRGB support
detection code.
2022-11-05 17:31:53 +00:00
James Hogan
ab02bce279
CameraGroup: Fix missing splash on explicit camera setup
The splash window name was only being set for the default / legacy
camera setup, however if the camera group is set up explicitly in the
configuration XML the splash window wouldn't get set and the splash
would no longer get displayed.

This is fixed by selecting the first referenced window name from a
camera.

A better fix (more closely matching the prior behaviour) would be to
create a splash camera for each created window, however this is proving
difficult to test due to instability with multiple windows, so this fix
will suffice in the mean time.

Fixes: bb0d7fc0a7 ("src/Viewer: Move splash to cam group camera")
Reported-by: Durk Talsma <durktals@gmail.com>
2022-11-05 17:19:22 +00:00
James Turner
745aef04ea Splash : restore macOS compatibility
Change to sRGB frame-buffer unfortunately broke macOS compatibility;
restore it by reverting to the internal format there.
2022-09-05 16:56:50 +01:00
James Hogan
91ddbf6a7c
VRManager: Fix crash on exit on Windows
VRManager::instance() was using a function scoped static osg::ref_ptr to
store the VRManager instance. However it needs to be used from
fgOSCloseWindow(), which is called from an atexit handler, and C++11
specifies that static object destruction and atexit handlers are reverse
sequenced, i.e. a static object initialised after an atexit call will be
destroyed before the atexit callback is called.

On Windows this can result in the osg::ref_ptr being destroyed (and
hence set to NULL) before fgOSCloseWindow() tries to call
destroyAndWait() on the instance.

Fix the resulting seg fault by moving the ref_ptr object to static file
scope so it is default constructed before the atexit call, and using
only a simple static bool to initialise it on first call to
VRManager::instance().

Reported-by: Alan Teeder <ajteeder@v-twin.org.uk>
2022-08-29 22:06:49 +01:00
Florent Rougon
563bc4775f Minor changes
Fix a typo and a warning about an unused variable.
2022-08-24 15:14:57 +02:00
Florent Rougon
36dd57f6f4 Don't look for the splash screen font in the aircraft dir
The previous way only worked because after trying
SGPath(aContext, aResource), ResourceManager::findPath() tries all
providers, among which there is a BasePathProvider with $FG_ROOT as its
base... provider which doesn't use the 'aContext' argument at all.
2022-08-24 01:31:04 +02:00
James Hogan
199adf90df
VRManager: Update to osgXR 0.5.0
osgXR 0.5.0 broke the API slightly, so update VRManager to use the new
enumeration names and update the required osgXR version for when using a
system version of osgXR.

Signed-off-by: James Hogan <james@albanarts.com>
2022-08-21 17:55:18 +01:00
James Hogan
b9efba55e7
src/Viewer/splash: VR splash screen
Use a quad composition layer object from osgXR 0.3.9 to make the splash
screen VR friendly. This allows the OpenXR compositor to redraw the quad
without any updates from flightgear, which is particularly helpful as
flightgear makes no attempt at a reasonable VR frame rate during
initialisation.

The quad is positioned 2 meters from the user, with an aspect ratio
matching the desktop window. The quad is blended using an
unpremultiplied alpha channel which is forced to a given alpha value by
osgXR.

The splash is effectively already rendered to an FBO as non-linear SRGB,
so this is made explicit in the internal texture format, with the
rendering to the desktop window using GL_FRAMEBUFFER_SRGB to ensure it
is properly re-encoded.
2022-07-12 22:38:53 +01:00
James Hogan
bb0d7fc0a7
src/Viewer: Move splash to cam group camera
Move the splash screen from the scene root to a camera group camera,
just below the GUI camera. This has a number of advantages, mainly VR
related:
 - The splash FBO will only be rendered once per frame. Currently it
   appears to be rendered for both near & far cameras, and with
   stereoscopic rendering for both left & right (even though it splats
   right across both views at the moment), so 2 or 4 times.
 - It makes it possible to render the splash fullscreen on the desktop
   window, while presenting it on a 3d quad in VR (possibly via an
   OpenXR composition layer so the runtime can keep rendering it
   smoothly while FlightGear framerate drops during loading.
2022-07-12 22:38:53 +01:00
Julian Smith
28d7308985 src/Viewer/viewmgr.*: fixed bug when /sim/aircraft contains '.' chars.
We were not appending the video container suffix if there was already a '.' in
the name.

Part of this fix is also to simplify the code - if name_in is not "" we don't
attempt to create softlink or append /sim/video/container.
2022-06-05 19:43:46 +01:00
James Turner
3f670c84b1 VSCode applied formatting. 2022-05-16 12:15:05 +01:00
James Turner
15cb5ab075 Fix Windows: include needed for getpid() 2022-05-16 12:14:13 +01:00
Lars Toenning
961c57b576 Add missing include
Fixes compilation for GCC 12.1
2022-05-11 13:04:11 +01:00
Julian Smith
b40cc51611 src/Viewer/viewmgr.cxx: log video encoding sws_scale() timing info with /sim/video/log_sws_scale_stats. 2022-05-01 15:28:01 +01:00
Julian Smith
d2d3bd5edc src/Viewer/: crude control over thread-cpu affinities on linux.
Detects /sim/affinity-control being set to 'clear' and 'revert' and modifies
all thread affinities accordingly. Only active on Linux.

Also modified meaning of /sim/thread-cpu-affinity. Instead of true/false, we now
expect these values:

    '': do nothing.

    'none': tell OSG to not set up any thread affinities (same as prev
    'false').

    'osg': allow OSG to set up thread affinities but attempt to cancel affinity
    of main thread afterwards.
2022-05-01 15:24:38 +01:00
Julian Smith
a59c94f8be src/Viewer/renderer.cxx: use /sim/thread-cpu-affinity to control thread-cpu affinity.
This is for investigating bug 2734.

If /sim/thread-cpu-affinity is true or unset on startup, we use default
behaviour where we tell OSG to set up thread-cpu affinities.

Setting /sim/thread-cpu-affinity to false on start up results in all/most
threads being free to run on any cpu core. For example in .fgfsrc or on
command, use:

    --prop:bool:/sim/thread-cpu-affinity=false
2022-04-30 00:14:00 +01:00
James Turner
a9e09a0ae4 Remove obsolete pre-OSG 3.4 code 2022-03-24 10:34:04 +00:00
Julian Smith
04ee8d95f5 src/Viewer/splash.cxx: added some missing braces for clarity. 2022-03-19 23:14:58 +00:00
Richard Harrison
d678d108ce Splash: add visibility condition to images
Using a <condition> images can be hidden now.

Also reworked the logic so that any hidden item will be hidden from creation and not rely on the update logic; as otherwise items can momentarily appear.
2022-03-11 18:38:24 +01:00
Richard Harrison
5db4b5c871 Splash-logo fixes for max-width and position
PC9-M looked wrong; reported by Erik
2022-03-10 20:21:17 +01:00
Richard Harrison
bc9291cb02 Splash: fix logic for nightly build.
I thought it would be right to display a nightly build warning for self build also - but now I've changed my mind as it is an irrelevance.
2022-03-10 15:54:29 +01:00
Richard Harrison
e3c2a39420 Define splash screen from property tree
Refactor Splash to be data drive using definitions in <content> for the system splash and <model-content> for model related content.

All system splash is at fixed index and should not be changed except for good reason.
2022-03-10 15:12:34 +01:00
Stuart Buchanan
13fab25b6f MR273 - Added the Milky Way onto the night sky
from Chris RINGEVAL

https://sourceforge.net/p/flightgear/flightgear/merge-requests/273/

Squashed commit of the following:

commit ea6e808e418533db1a41671c67a7873ddbfcc858
Author: Gonzalo Pesquero <gpesquero@yahoo.es>
Date:   Sun Nov 21 17:44:44 2021 +0100

    Add translations on splash screen

commit 3c47d771877743692f5d0d63e980d6694a549405
Author: Chris Ringeval <eatdirt@protonmail.com>
Date:   Sat Nov 27 16:37:31 2021 +0100

    Moon direction vector in the eye frame available to shaders

commit 70728f7ea29dad75c34cad69745021ee927bea31
Author: Chris Ringeval <eatdirt@protonmail.com>
Date:   Sun Nov 21 22:18:38 2021 +0100

    Add altitude to scolor object as needed by Milky Way texturing
2022-02-01 16:23:07 +00:00
James Hogan
89b7f8139f
VRManager: Handle removal of prop getValue<const char *>()
Handle removal of SGPropertyNode::getValue<const char *>() in
VRManager::Listener<const char *>::valueChanged() by switching the
string listeners and VRManager setter handlers to std::string.

This fixes the following link error when VR is enabled:
ld: VRManager.cxx.o: in function `flightgear::VRManager::Listener<char const*>::valueChanged(SGPropertyNode*)':
src/Viewer/VRManager.hxx:147: undefined reference to `char const* SGPropertyNode::getValue<char const*>(std::enable_if<simgear::props::PropertyTraits<char const*>::Internal, void>::type*) const'
2022-01-08 22:47:59 +00:00
Julian Smith
311961a522 src/Viewer/: reduced some startup diagnostics. 2022-01-08 16:11:53 +00:00
Julian Smith
3351a785be src/Viewer/viewmgr.cxx: enable/disable video encoding menu items.
It doesn't look like menubar items can be enabled/disabled using <property>
or <expression>, so instead we write to the File menu's items tree
/sim/menubar/default/menu[]/name[]/enabled.

We also set /sim/video/encoding-path to '' or path of video file that we are
encoding to.
2022-01-06 22:17:05 +00:00
Roman Ludwicki
82f967ab92 Cope with SGPropertyNode::getStringValue() now returning std::string by value.
This is by Lars Toenning <dev@ltoenning.de>, Roman Ludwicki <romek21@op.pl> and
SDeAstis <salvatore.deastis@gmail.com>, in 2021 Hackathon.

Also cope with removal of SGPropertyNode::getName() - use getNameString()
instead.
2021-12-24 14:49:06 +00:00
Julian Smith
dd9f4ac890 src/: fail --load-tape-create-video if video encoding fails.
Also fail video encoding if output file already exists.
2021-12-08 21:17:45 +00:00
Julian Smith
c1a34ac4ce Added support for generating compressed video.
Uses simgear::VideoEncoder().

Added video-start and video-stop commands. We allow specification of container,
codec, quality, speed and bitrate.

src/Main/fg_commands.cxx
    Added video-start and video-stop commands.
src/Viewer/viewmgr.cxx
src/Viewer/viewmgr.hxx
    Added video_start() and video_stop().
2021-12-08 10:42:50 +00:00
Julian Smith
69344c29c0 src/Viewer/CameraGroup.*: give const access to 'CameraList _cameras;' member.
E.g. this allows callers to find Compositor(s) owned by CameraGroup.
2021-12-08 10:41:58 +00:00
Gonzalo Pesquero
04722ce9f6 Add translations on splash screen 2021-12-01 12:23:33 +00:00
Julian Smith
5023e9786a Highlighting: cope if Highlight subsystem is not present.
This should allow things to run ok if globals->get_subsystem<Highlight>()
returns null, e.g. in a unit test or similar.
2021-11-20 17:15:58 +00:00
Julian Smith
0c6f4983dc Highlighting: use camelCase for method names in Highlight API. 2021-11-20 16:53:22 +00:00
b'Fernando Garc\xc3\xada Li\xc3\xb1\xc3\xa1n
5536dce0fd Merge /u/amalon/flightgear/ branch vr_3 into next
https://sourceforge.net/p/flightgear/flightgear/merge-requests/264/
2021-10-08 14:17:23 +00:00
Julian Smith
1bafe15c4c Added highlighting system.
If /sim/highlighting/enabled is true, we highlight animated objects under the
pointer, and also highlight other objects that are animated by the same or
related properties.

The intent here is to be able to give a visual indication of what cockpit
controls do or what cockpit controls affect particular aircraft objects - for
example moving the pointer over the flaps will highlight the flaps and also
highlight any controls or rotary indicators in the cockpit that are associated
with the flaps.

To make this work, we have to discover associations between properties. This
is currently done for YASim (e.g. associations between /controls/flight/flaps
and /surface-positions/flap-pos-norm) and autopilot filters (e.g. with
the 777, digital filters associate /controls/flight/rudder-nul with
/fcs/fbw/yaw/rudder-ratio-out). We don't currently gather associations between
properties in JSBSim

We also detect associations between dialogs, menus and keypresses and
properties, which is used to populate /sim/highlighting/current with
information about dialogs, menus and keypresses that are associated with the
currently highlighted nodes' properties.

Details:

src/GUI/Highlight.cxx
src/GUI/Highlight.hxx
src/GUI/CMakeLists.txt
src/Main/fg_init.cxx
    New subsystem called 'highlight', with support for registering and
    recovering links between menus, dialogs, keypresses and OSG node
    animations.

    Provides a function Highlight::highlight_nodes() which highlights
    related nodes using internal NodeHighlighting class, and populates
    /sim/highlighting/current with information about related dialogs, menus and
    keypresses.

    The NodeHighlighting class works by making nodes use an alternative
    StateSet which shows up as a distinct material on screen. We remember each
    highlighted node's original StateSet so that we can un-highlight. We update
    the material parameters using a listener for /sim/highlighting/material,
    which allows some control over the appearence of highlighted nodes.

src/FDM/flight.cxx
src/FDM/flight.hxx
    Added virtual method FGInterface::property_associations() which returns
    property associations from the FDM. Default implementation returns empty
    set. Implemented in YASim, but not (yet) in JSBSim. Uses a simple function
    pointer at the moment to avoid requring FDMs to use recent C++ features.

src/FDM/YASim/FGFDM.cpp
src/FDM/YASim/FGFDM.hpp
src/FDM/YASim/YASim.cxx
src/FDM/YASim/YASim.hxx
    Gathers information about property associations on startup such as
    /controls/flight/flaps => /surface-positions/flap-pos-norm, then
    YASim::property_associations() overrides default implementation to return
    these associations.

src/Autopilot/analogcomponent.cxx
src/Autopilot/analogcomponent.hxx
src/Autopilot/digitalfilter.cxx
src/Autopilot/inputvalue.cxx
src/Autopilot/inputvalue.hxx
    Filters now gather information about their input/output properties and
    register with Highlight::add_property_property(). For example this makes
    highlighting work on the 777, where pilot controls affect control surfaces
    only via filters.

src/GUI/new_gui.cxx
    Scan menus, keypresses and dialogs and register associations with
    Highlight::add_*().

src/GUI/property_list.cxx
src/GUI/property_list.hxx
src/GUI/FGPUIDialog.cxx
    Added <readonly> flag to property-list. If set, we don't show .. or . items
    and don't respond to mouse/keyboard.

    Used by fgdata's new Highlighting dialogue.

src/Model/acmodel.cxx
src/Model/acmodel.hxx
    Visit the user aircraft's scene graph when it is loaded, gathering
    information about osg::Node's that are animated by properties, and register
    these associations with Highlight::add_property_node().

src/Viewer/renderer.cxx
    When scanning for pick highlights, use Highlight::highlight_nodes() to
    highlight animated objects under the pointer and related objects.
2021-10-08 06:13:04 +01:00
James Hogan
bad7047c36
VR: Visibility mask support
Update osgXR to 0.3.3 which provides support for visibility masks using
the depth buffer, and extend VRManager to support them.

The following properties are added:
 - /sim/vr/openxr/extensions/visibility-mask: This exposes whether
   visibility masks are supported by the current OpenXR runtime, and
   maps to osgXR::Manager::hasVisibilityMaskExtension().
 - /sim/vr/visibility-mask: This allows visibility masks to be enabled
   and disabled, and maps to osgXR::Settings::setVisibilityMask() via a
   listener.

Finally we inform osgXR that it should use SimGear's newly defined
LEFT_BIT and RIGHT_BIT NodeMask bits for the visibility masks using
osgXR::Manager::setVisibilityMaskNodeMasks(). This allows a single
stereo camera to have a visibility mask for each eye.
2021-10-05 23:44:27 +01:00
James Hogan
7db47beb0e
VR: Implement mirroring of VR to desktop
Set up the default camera as a mirror of the VR view when needed, using
a new CameraInfo flag named VR_MIRROR based on a camera property
"vr-mirror" which is set on the default camera group. When set this flag
causes the compositor to be constructed (and reloaded) using
buildVRMirrorCompositor() and osgXR's mirror camera setup code, rather
than the usual Compositor::create().
2021-09-12 00:02:44 +01:00
James Hogan
7bea10a8e4
VRManager: Add mirror properties
Implement VR mirror properties and associated getUseMirror() accessor:
 - /sim/vr/mirror-mode: This will allow the user to control the VR
   mirror via a GUI.
 - /sim/vr/mirror-enabled: This isn't written, but is used by
   getUseMirror() in combination with isRunning() to determine whether
   the mirror should be used.
2021-09-11 23:49:25 +01:00
James Hogan
04c6821b8c
CameraGroup: Reset compositor order offset on reload
Use the newly added simgear::Compositor::resetOrderOffset() to reset the
order offset counter with each compositor reload. This prevents the
counter increasing indefinitely, which soon results in render orders
beyond those set statically for the GUI and upcoming VR mirror.
2021-09-11 18:05:27 +01:00
b'Fernando Garc\xc3\xada Li\xc3\xb1\xc3\xa1n
c50fe8de07 Merge /u/amalon/flightgear/ branch vr_1 into next
https://sourceforge.net/p/flightgear/flightgear/merge-requests/253/
2021-09-03 22:19:11 +00:00
James Hogan
db4525abf9
VR: Implement minimal VR support
Implement support for virtual reality headsets via version 0.3 of the
osgXR[1] library I've been working on which uses OpenXR.

Add a new VRManager class based on osgXR::Manager to implement its
callbacks. When osgXR needs a new view created, we build a new camera in
the default camera group, and notify osgXR of each new "scene" typed
render pass. It also hooks into the CameraInfo's new compositor reload
callback to ensure osgXR is updated when the compositors are reloaded.

VR settings are controlled by properties, and new --enable-vr /
--disable-vr options are implemented to enable/disable VR at start.

This is enough to get basic VR for looking around the cockpit, but more
work will be required to support a desktop mirror of VR view, VR splash
screen, VR GUI, controller interaction, and correct positional sound.

[1] https://github.com/amalon/osgXR
2021-09-03 12:09:20 +01:00
Julian Smith
74dd221e60 src/Viewer/splash.cxx: removed CompositeViewer startup message. 2021-08-29 23:13:32 +01:00
Fernando García Liñán
83b0a31b76 Canvas cameras are slave cameras instead of scene graph cameras
This was a long-standing issue where Canvas cameras were rendered
multiple times, once per slave camera. In the case of the Classic
pipeline they were being rendered twice.

Making them slave cameras has the issue of them not being shared
across GraphicsContexts anymore, so it's not possible to see Canvas
displays in extra CameraGroup windows. This is fixed by using OSG
context sharing feature and sharing the initial windows' context
with all subsequent windows.
2021-08-27 18:34:19 +02:00
James Hogan
e25a560591
CameraGroup: Add compositor reload callbacks
Add a compositor reload callback object to CameraInfo, with callbacks
for just prior and after the CameraInfo's compositor is reloaded by
reloadCompositors().

This will allow VR cameras to be reconfigured after a reload.
2021-08-23 16:00:52 +01:00
James Hogan
9e430b3fc2
CameraGroup: Add removeCamera()
Add removeCamera() method to CameraGroup to find and remove a single
CameraInfo.

This will allow cameras created for VR to be dynamically reconfigured.
2021-08-23 16:00:52 +01:00
James Hogan
7a096d9835
CameraGroup::buildCamera(): Return CameraInfo*
Make CameraGroup::buildCamera() return the new CameraInfo* so the caller
can make adjustments.
2021-08-23 16:00:52 +01:00
Julian Smith
7ed93e4e64 src/Viewer/sview.*: fixed various issues with extra view windows.
Reversed the affect of mouse in some legacy views, e.g. Helicopter and Pilot
views now move in expected direction for mouse drags. Also increased scale
of movement to make things similar to the default view system.

In chase view etc, apply mouse movements after damping of aircraft orientation,
previously mouse movements were getting damped.

Removed SviewStepFinalToTarget. SviewStepFinal now automatically aims at target
if new posdir.target_is_set flag is true.

Improved double views: Avoid duplicate SviewStepCopyToTarget step. Disabled
mouse drag handling - was gives weird results and is not required or
helpful. Be more consistent in using target position if available, otherwise
eye position; for example using a Helicopter view to create a double view now
uses the target of the helicopter view, not the eye point, which works much
better.

Removed internal use of SviewStepFinal from SviewStepDouble - used to be
special case.

Split mouse drag handling out of SviewStepRotate into new SviewStepMouseDrag.

Simplified last-pair code - both last-pair and last-pair double find position
and target in the same way.
2021-08-06 21:48:32 +01:00