FlightGear next
VRManager.hxx
Go to the documentation of this file.
1// Copyright (C) 2021 James Hogan
2//
3// This program is free software; you can redistribute it and/or
4// modify it under the terms of the GNU General Public License as
5// published by the Free Software Foundation; either version 2 of the
6// License, or (at your option) any later version.
7//
8// This program is distributed in the hope that it will be useful, but
9// WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11// General Public License for more details.
12//
13// You should have received a copy of the GNU General Public License
14// along with this program; if not, write to the Free Software
15// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16
17#ifndef VRMANAGER_HXX
18#define VRMANAGER_HXX 1
19
20#include <config.h>
21
22#ifdef ENABLE_OSGXR
23
24#include <osg/ref_ptr>
25#include <osg/observer_ptr>
26
27#include <osgXR/Manager>
28
29#include <simgear/props/propertyObject.hxx>
30#include <simgear/scene/viewer/CompositorPass.hxx>
31
32#include "CameraGroup.hxx"
33
34#include <map>
35
36namespace flightgear
37{
38
39class VRManager : public osgXR::Manager
40{
41 public:
42
43 class ReloadCompositorCallback : public CameraInfo::ReloadCompositorCallback
44 {
45 public:
46
47 ReloadCompositorCallback(VRManager *manager) :
48 _manager(manager)
49 {
50 }
51
52 void preReloadCompositor(CameraGroup *cgroup, CameraInfo *info) override
53 {
54 _manager->preReloadCompositor(cgroup, info);
55 }
56
57 void postReloadCompositor(CameraGroup *cgroup, CameraInfo *info) override
58 {
59 _manager->postReloadCompositor(cgroup, info);
60 }
61
62 protected:
63
64 osg::observer_ptr<VRManager> _manager;
65 };
66
67 class ViewCallback : public osgXR::View::Callback
68 {
69 public:
70
71 ViewCallback(VRManager *manager) :
72 _manager(manager)
73 {
74 }
75
76 // Overridden from osgXR::View::Callback
77 void updateSubView(osgXR::View *view, unsigned int subviewIndex,
78 const osgXR::View::SubView &subview) override
79 {
80 _manager->updateSubView(view, subviewIndex, subview);
81 }
82
83 protected:
84
85 osg::observer_ptr<VRManager> _manager;
86 };
87
88 VRManager();
89
90 static VRManager *instance();
91
92 void syncProperties();
93 void syncReadOnlyProperties();
94 void syncSettingProperties();
95
96 // Settings
97
98 bool getUseMirror() const;
99
100 void setValidationLayer(bool validationLayer);
101 void setDepthInfo(bool depthInfo);
102 void setVisibilityMask(bool visibilityMask);
103
104 void setVRMode(const std::string& mode);
105 void setSwapchainMode(const std::string& mode);
106 void setMirrorMode(const std::string& mode);
107
108 // osgXR::Manager overrides
109
110 void update() override;
111
112 void doCreateView(osgXR::View *xrView) override;
113 void doDestroyView(osgXR::View *xrView) override;
114
115 void onRunning() override;
116 void onStopped() override;
117
118 // Callback entry points
119
120 void preReloadCompositor(CameraGroup *cgroup, CameraInfo *info);
121 void postReloadCompositor(CameraGroup *cgroup, CameraInfo *info);
122
123 void updateSubView(osgXR::View *view, unsigned int subviewIndex,
124 const osgXR::View::SubView &subview);
125
126 protected:
127
128 typedef std::map<osgXR::View *, osg::ref_ptr<CameraInfo>> XRViewToCamInfo;
129 XRViewToCamInfo _camInfos;
130
131 typedef std::map<CameraInfo *, osg::ref_ptr<osgXR::View>> CamInfoToXRView;
132 CamInfoToXRView _xrViews;
133
134 osg::ref_ptr<ReloadCompositorCallback> _reloadCompositorCallback;
135
136 // Properties
137
138 SGPropObjBool _propXrLayersValidation;
139 SGPropObjBool _propXrExtensionsDepthInfo;
140 SGPropObjBool _propXrExtensionsVisibilityMask;
141 SGPropObjString _propXrRuntimeName;
142 SGPropObjString _propXrSystemName;
143
144 SGPropObjString _propStateString;
145 SGPropObjBool _propPresent;
146 SGPropObjBool _propRunning;
147
148 SGPropObjBool _propEnabled;
149 SGPropObjBool _propDepthInfo;
150 SGPropObjBool _propVisibilityMask;
151 SGPropObjBool _propValidationLayer;
152 SGPropObjString _propMode;
153 SGPropObjString _propSwapchainMode;
154 SGPropObjBool _propMirrorEnabled;
155 SGPropObjString _propMirrorMode;
156
157 // Property listeners
158
159 template <typename T, typename R = T>
160 class Listener : public SGPropertyChangeListener
161 {
162 public:
163 typedef void (VRManager::*SetterFn)(R v);
164
165 Listener(VRManager *manager, SetterFn setter) :
166 _manager(manager),
167 _setter(setter)
168 {
169 }
170
171 void valueChanged(SGPropertyNode *node) override
172 {
173 (_manager->*_setter)(node->template getValue<T>());
174 }
175
176 protected:
177
178 VRManager *_manager;
179 SetterFn _setter;
180 };
181 typedef Listener<bool> ListenerBool;
182 typedef Listener<std::string, const std::string&> ListenerString;
183
184 ListenerBool _listenerEnabled;
185 ListenerBool _listenerDepthInfo;
186 ListenerBool _listenerVisibilityMask;
187 ListenerBool _listenerValidationLayer;
188 ListenerString _listenerMode;
189 ListenerString _listenerSwapchainMode;
190 ListenerString _listenerMirrorMode;
191};
192
193}
194
195#endif // ENABLE_OSGXR
196
197#endif
#define R
FlightPlan.hxx - defines a full flight-plan object, including departure, cruise, arrival information ...
Definition Addon.cxx:53