Ocean
interaction/Manager.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) Meta Platforms, Inc. and affiliates.
3  *
4  * This source code is licensed under the MIT license found in the
5  * LICENSE file in the root directory of this source tree.
6  */
7 
8 #ifndef META_OCEAN_INTERACTION_MANAGER_H
9 #define META_OCEAN_INTERACTION_MANAGER_H
10 
13 
14 #include "ocean/base/Singleton.h"
15 #include "ocean/base/Timestamp.h"
16 
17 #include "ocean/io/FileManager.h"
18 
19 namespace Ocean
20 {
21 
22 namespace Interaction
23 {
24 
25 /**
26  * This class implements the manager for all interaction libraries / plugins.
27  * @ingroup interaction
28  */
29 class OCEAN_INTERACTION_EXPORT Manager :
30  public IO::FileManager,
31  public Singleton<Manager>
32 {
33  friend class Singleton<Manager>;
34  friend class Library;
35 
36  protected:
37 
38  /**
39  * Definition of a set holding registered interaction libraries.
40  */
41  typedef std::unordered_set<Library*> LibrarySet;
42 
43  /**
44  * Definition of a set holding names of interaction libraries.
45  */
46  typedef std::unordered_set<std::string> NameSet;
47 
48  /**
49  * Definition of a vector holding names.
50  */
51  typedef std::vector<std::string> Names;
52 
53  public:
54 
55  /**
56  * Loads a new interaction file.
57  * @param userInterface The application's UI elements
58  * @param engine Current engine
59  * @param timestamp Recent timestmap
60  * @param filename Filename of the interaction to load
61  * @return True, if succeeded
62  */
63  bool load(const UserInterface& userInterface, const Rendering::EngineRef& engine, const Timestamp timestamp, const std::string& filename);
64 
65  /**
66  * Unloads one specific loaded interaction files.
67  * @param userInterface The application's UI elements
68  * @param engine Current engine
69  * @param timestamp Recent timestmap
70  * @param filename Filename of the interaction to be unloaded
71  * @return True, if succeeded
72  */
73  bool unload(const UserInterface& userInterface, const Rendering::EngineRef& engine, const Timestamp timestamp, const std::string& filename);
74 
75  /**
76  * Unloads all loaded interaction files.
77  * @param userInterface The application's UI elements
78  * @param engine Current engine
79  * @param timestamp Recent timestmap
80  */
81  void unload(const UserInterface& userInterface, const Rendering::EngineRef& engine, const Timestamp timestamp);
82 
83  /**
84  * Returns whether currently at least one interaction library handles mouse events.
85  * Because mouse events can produce high computational overhead this test can safe computational time.
86  * @return True, if so
87  */
88  inline bool handlesMouseEvents() const;
89 
90  /**
91  * Pre file load interaction function.
92  * @param userInterface The application's UI elements
93  * @param filename Filename of the file to be loaded
94  */
95  void preFileLoad(const UserInterface& userInterface, const std::string& filename);
96 
97  /**
98  * Post file load interaction function.
99  * @param userInterface The application's UI elements
100  * @param filename Filename of the loaded filename
101  * @param succeeded State determining whether the file has been loaded successfully
102  */
103  void postFileLoad(const UserInterface& userInterface, const std::string& filename, const bool succeeded);
104 
105  /**
106  * Pre update interaction function.
107  * This function is invoked before each update process, the application interaction module has the possibility to return a different preferred update timestamp.<br>
108  * If several interaction modules are used and each is changing the timestamp each changed timestamp is given to the next module as preferred timestamp.<br>
109  * Therefore the last registered interaction module has the possiblity to define the used timestamp.<br>
110  * @param userInterface The application's UI elements
111  * @param engine Engine to be updated, must be valid
112  * @param view The view which will be used to render, must be valid
113  * @param timestamp Recent update timestmap
114  * @return Timestamp which should be used for the update process, if the timestamp is null any timestamp can be used
115  */
116  Timestamp preUpdate(const UserInterface& userInterface, const Rendering::EngineRef& engine, const Rendering::ViewRef& view, const Timestamp timestamp);
117 
118  /**
119  * Post update interaction function.
120  * @param userInterface The application's UI elements
121  * @param engine Engine which has been updated, must be valid
122  * @param view The view which will be used to render, must be valid
123  * @param timestamp Recent update timestamp
124  */
125  void postUpdate(const UserInterface& userInterface, const Rendering::EngineRef& engine, const Rendering::ViewRef& view, const Timestamp timestamp);
126 
127  /**
128  * Mouse press event function.
129  * @param userInterface The application's UI elements
130  * @param engine Rendering engine currently used
131  * @param button Pressed mouse button
132  * @param screenPosition 2D screen position of the mouse cursor
133  * @param ray 3D picking ray
134  * @param pickedObject Name of the possible picked object
135  * @param pickedPosition Possible intersection point between mouse-pick-ray and 3D object
136  * @param timestamp Event timestamp
137  */
138  void onMousePress(const UserInterface& userInterface, const Rendering::EngineRef& engine, const std::string& button, const Vector2& screenPosition, const Line3& ray, const Rendering::ObjectId pickedObject, const Vector3& pickedPosition, const Timestamp timestamp);
139 
140  /**
141  * Mouse move event function.
142  * @param userInterface The application's UI elements
143  * @param engine Rendering engine currently used
144  * @param button Pressed mouse button
145  * @param screenPosition 2D screen position of the mouse cursor
146  * @param ray 3D picking ray
147  * @param pickedObject Name of the possible picked object
148  * @param pickedPosition Possible intersection point between mouse-pick-ray and 3D object
149  * @param timestamp Event timestamp
150  */
151  void onMouseMove(const UserInterface& userInterface, const Rendering::EngineRef& engine, const std::string& button, const Vector2& screenPosition, const Line3& ray, const Rendering::ObjectId pickedObject, const Vector3& pickedPosition, const Timestamp timestamp);
152 
153  /**
154  * Mouse release event function.
155  * @param userInterface The application's UI elements
156  * @param engine Rendering engine currently used
157  * @param button Released mouse button
158  * @param screenPosition 2D screen position of the mouse cursor
159  * @param ray 3D picking ray
160  * @param pickedObject Name of the possible picked object
161  * @param pickedPosition Possible intersection point between mouse-pick-ray and 3D object
162  * @param timestamp Event timestamp
163  */
164  void onMouseRelease(const UserInterface& userInterface, const Rendering::EngineRef& engine, const std::string& button, const Vector2& screenPosition, const Line3& ray, const Rendering::ObjectId pickedObject, const Vector3& pickedPosition, const Timestamp timestamp);
165 
166  /**
167  * Key press function.
168  * @param userInterface The application's UI elements
169  * @param engine Rendering engine currently used
170  * @param key Key which has been pressed
171  * @param timestamp Event timestamp
172  */
173  void onKeyPress(const UserInterface& userInterface, const Rendering::EngineRef& engine, const std::string& key, const Timestamp timestamp);
174 
175  /**
176  * Key release function.
177  * @param userInterface The application's UI elements
178  * @param engine Rendering engine currently used
179  * @param key Key which has been pressed
180  * @param timestamp Event timestamp
181  */
182  void onKeyRelease(const UserInterface& userInterface, const Rendering::EngineRef& engine, const std::string& key, const Timestamp timestamp);
183 
184  /**
185  * Returns all currently supported file extensions.
186  * @see FileManager::supportedExtensions().
187  */
189 
190  /**
191  * Returns the names of all currently registered libraries.
192  * @return Library names
193  */
194  Names libraries() const;
195 
196 
197  /**
198  * Releases all interaction libraries.
199  */
200  void release();
201 
202  /**
203  * Registers an interaction library handling mouse events.
204  * @param name The name of the library interested in mouse events
205  */
206  void registerMouseEventLibrary(const std::string& name);
207 
208  /**
209  * Unregisters an interaction library handling mouse events.
210  * @param name The name of the library not interested in mouse events anymore
211  * @return True, if succeeded
212  */
213  bool unregisterMouseEventLibrary(const std::string& name);
214 
215  /**
216  * Retruns the lock object of this engine.
217  * Beware: Use this lock with caution.
218  * @return Engine lock object
219  */
220  inline Lock& lock() const;
221 
222  protected:
223 
224  /**
225  * Creates a new manager.
226  */
228 
229  /**
230  * Destructs a manager.
231  */
232  virtual ~Manager();
233 
234  /**
235  * Registers a new interaction library able to read a specific interaction format.
236  * @param library Library to register
237  */
238  void registerLibrary(Library& library);
239 
240  /**
241  * Unregisters a library.
242  * @param name The name of the library to unregister
243  * @return True, if succeeded
244  */
245  bool unregisterLibrary(const std::string& name);
246 
247  protected:
248 
249  /// Set holding all registered interaction libraries.
251 
252  /**
253  * Set holding all names of libraries interested in mouse events.
254  * This set is used to decided whether mouse events should be processed for this interaction libraries.
255  */
257 
258  /// Manager lock.
259  mutable Lock lock_;
260 };
261 
262 inline bool Manager::handlesMouseEvents() const
263 {
264  return mouseEventLibraries_.empty() == false;
265 }
266 
267 inline Lock& Manager::lock() const
268 {
269  return lock_;
270 }
271 
272 }
273 
274 }
275 
276 #endif // META_OCEAN_INTERACTION_MANAGER_H
This class is the base class for all plugin manager able to load and manager files.
Definition: FileManager.h:26
std::map< std::string, std::string > FileExtensions
Definition of a map mapping supported file extensions to file type descriptions.
Definition: FileManager.h:32
This class implements the base class for all interaction libraries.
Definition: interaction/Library.h:29
This class implements the manager for all interaction libraries / plugins.
Definition: interaction/Manager.h:32
bool unload(const UserInterface &userInterface, const Rendering::EngineRef &engine, const Timestamp timestamp, const std::string &filename)
Unloads one specific loaded interaction files.
void onKeyRelease(const UserInterface &userInterface, const Rendering::EngineRef &engine, const std::string &key, const Timestamp timestamp)
Key release function.
std::unordered_set< std::string > NameSet
Definition of a set holding names of interaction libraries.
Definition: interaction/Manager.h:46
Lock & lock() const
Retruns the lock object of this engine.
Definition: interaction/Manager.h:267
bool handlesMouseEvents() const
Returns whether currently at least one interaction library handles mouse events.
Definition: interaction/Manager.h:262
void postFileLoad(const UserInterface &userInterface, const std::string &filename, const bool succeeded)
Post file load interaction function.
void onKeyPress(const UserInterface &userInterface, const Rendering::EngineRef &engine, const std::string &key, const Timestamp timestamp)
Key press function.
void registerMouseEventLibrary(const std::string &name)
Registers an interaction library handling mouse events.
bool unregisterLibrary(const std::string &name)
Unregisters a library.
void unload(const UserInterface &userInterface, const Rendering::EngineRef &engine, const Timestamp timestamp)
Unloads all loaded interaction files.
std::vector< std::string > Names
Definition of a vector holding names.
Definition: interaction/Manager.h:51
void onMouseRelease(const UserInterface &userInterface, const Rendering::EngineRef &engine, const std::string &button, const Vector2 &screenPosition, const Line3 &ray, const Rendering::ObjectId pickedObject, const Vector3 &pickedPosition, const Timestamp timestamp)
Mouse release event function.
void preFileLoad(const UserInterface &userInterface, const std::string &filename)
Pre file load interaction function.
NameSet mouseEventLibraries_
Set holding all names of libraries interested in mouse events.
Definition: interaction/Manager.h:256
Lock lock_
Manager lock.
Definition: interaction/Manager.h:259
void postUpdate(const UserInterface &userInterface, const Rendering::EngineRef &engine, const Rendering::ViewRef &view, const Timestamp timestamp)
Post update interaction function.
void registerLibrary(Library &library)
Registers a new interaction library able to read a specific interaction format.
std::unordered_set< Library * > LibrarySet
Definition of a set holding registered interaction libraries.
Definition: interaction/Manager.h:41
virtual ~Manager()
Destructs a manager.
bool load(const UserInterface &userInterface, const Rendering::EngineRef &engine, const Timestamp timestamp, const std::string &filename)
Loads a new interaction file.
void onMouseMove(const UserInterface &userInterface, const Rendering::EngineRef &engine, const std::string &button, const Vector2 &screenPosition, const Line3 &ray, const Rendering::ObjectId pickedObject, const Vector3 &pickedPosition, const Timestamp timestamp)
Mouse move event function.
void release()
Releases all interaction libraries.
LibrarySet librarySet_
Set holding all registered interaction libraries.
Definition: interaction/Manager.h:250
Manager()
Creates a new manager.
void onMousePress(const UserInterface &userInterface, const Rendering::EngineRef &engine, const std::string &button, const Vector2 &screenPosition, const Line3 &ray, const Rendering::ObjectId pickedObject, const Vector3 &pickedPosition, const Timestamp timestamp)
Mouse press event function.
bool unregisterMouseEventLibrary(const std::string &name)
Unregisters an interaction library handling mouse events.
Timestamp preUpdate(const UserInterface &userInterface, const Rendering::EngineRef &engine, const Rendering::ViewRef &view, const Timestamp timestamp)
Pre update interaction function.
virtual FileExtensions supportedExtensions()
Returns all currently supported file extensions.
Names libraries() const
Returns the names of all currently registered libraries.
This class holds UI elements of the application from which the interaction is executed.
Definition: UserInterface.h:28
This class implements an infinite line in 3D space.
Definition: Line3.h:70
This class implements a recursive lock object.
Definition: Lock.h:31
This template class is the base class for all singleton objects.
Definition: Singleton.h:71
This class implements a timestamp.
Definition: Timestamp.h:36
size_t ObjectId
Definition of a object id.
Definition: rendering/Rendering.h:59
The namespace covering the entire Ocean framework.
Definition: Accessor.h:15