File: layer.hpp

package info (click to toggle)
sight 25.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 42,180 kB
  • sloc: cpp: 289,476; xml: 17,257; ansic: 9,878; python: 1,379; sh: 144; makefile: 33
file content (433 lines) | stat: -rw-r--r-- 16,757 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
/************************************************************************
 *
 * Copyright (C) 2014-2025 IRCAD France
 * Copyright (C) 2014-2020 IHU Strasbourg
 *
 * This file is part of Sight.
 *
 * Sight is free software: you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Sight 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with Sight. If not, see <https://www.gnu.org/licenses/>.
 *
 ***********************************************************************/

#pragma once

#include <sight/viz/scene3d/config.hpp>

#include <core/com/has_signals.hpp>
#include <core/com/has_slots.hpp>
#include <core/com/helper/sig_slot_connection.hpp>
#include <core/com/slot.hpp>
#include <core/thread/worker.hpp>

#include <viz/scene3d/compositor/chain_manager.hpp>
#include <viz/scene3d/compositor/core.hpp>
#include <viz/scene3d/compositor/manager/auto_stereo.hpp>
#include <viz/scene3d/compositor/types.hpp>
#include <viz/scene3d/interactor/base.hpp>
#include <viz/scene3d/window_interactor.hpp>

#include <OGRE/Ogre.h>
#include <OGRE/OgreAxisAlignedBox.h>
#include <OGRE/OgreRenderWindow.h>
#include <OGRE/OgreSceneManager.h>
#include <OGRE/OgreViewport.h>

#include <cstdint>
#include <map>
#include <vector>

namespace sight::data
{

class color;

} // namespace sight::data

namespace sight::viz::scene3d
{

class render;
class adaptor;
class light_adaptor;

} // namespace sight::viz::scene3d

namespace Ogre
{

class Camera;

} // namespace Ogre

namespace sight::viz::scene3d
{

/**
 * @brief Allows to render multiple scenes in the same render window with viewports.
 */
class SIGHT_VIZ_SCENE3D_CLASS_API layer :
    public core::base_object,
    public core::com::has_signals,
    public core::com::has_slots
{
public:

    /// Generates default methods.
    SIGHT_DECLARE_CLASS(layer, viz::scene3d::layer);

    SIGHT_ALLOW_SHARED_FROM_THIS()

    /// Defines the extrinsic x Intrinsic camera calibrations.
    using camera_calibrations_t = std::vector<Ogre::Matrix4>;

    /// Defines the viewport parameters relatively to the screen: left, top, width ,height.
    using viewport_config_t = std::tuple<float, float, float, float>;

    /// Contains the signal sent when the layer is initialized.
    SIGHT_VIZ_SCENE3D_API static const core::com::signals::key_t INIT_LAYER_SIG;
    using init_layer_signal_t = core::com::signal<void (viz::scene3d::layer::sptr)>;

    /// Contains the signal sent when the layer is resized.
    SIGHT_VIZ_SCENE3D_API static const core::com::signals::key_t RESIZE_LAYER_SIG;
    using resize_layer_signal_t = core::com::signal<void (int, int)>;

    /// Contains signals sent when the camera is modified.
    SIGHT_VIZ_SCENE3D_API static const core::com::signals::key_t CAMERA_RANGE_UPDATED_SIG;
    using camera_updated_signal_t = core::com::signal<void ()>;

    using interaction_slot_t = core::com::slot<void (viz::scene3d::window_interactor::interaction_info)>;
    using destroy_slot_t     = core::com::slot<void ()>;

    /// Contains the slot name that request the picker to do a ray cast according to the passed position.
    SIGHT_VIZ_SCENE3D_API static const core::com::slots::key_t INTERACTION_SLOT;

    /// Contains the slot name that request the reset of camera.
    SIGHT_VIZ_SCENE3D_API static const core::com::slots::key_t RESET_CAMERA_SLOT;

    /// Defines the default camera name.
    SIGHT_VIZ_SCENE3D_API static const std::string DEFAULT_CAMERA_NAME;

    /// Defines the default light name.
    SIGHT_VIZ_SCENE3D_API static const std::string DEFAULT_LIGHT_NAME;

    /// Defines the default camera node name.
    SIGHT_VIZ_SCENE3D_API static const std::string DEFAULT_CAMERA_NODE_NAME;

    /// Initializes signals and slots.
    SIGHT_VIZ_SCENE3D_API layer();

    /// Destoyres Ogre resources.
    SIGHT_VIZ_SCENE3D_API ~layer() override = default;

    /// Gets the render window containing this layer.
    SIGHT_VIZ_SCENE3D_API Ogre::RenderTarget* get_render_target() const;

    /// Sets the render window containing this layer.
    SIGHT_VIZ_SCENE3D_API void set_render_target(Ogre::RenderTarget* _render_target);

    /// Set the associated scene manager ID of this viewport
    SIGHT_VIZ_SCENE3D_API void set_id(const std::string& _id);

    /// @returns the name of this layer.
    SIGHT_VIZ_SCENE3D_API std::string get_name() const;

    /// @returns the ID of this layer.
    SIGHT_VIZ_SCENE3D_API const std::string& layer_id() const;

    /// @returns the scene manager associated to this viewport. Creates if it does not exists.
    SIGHT_VIZ_SCENE3D_API Ogre::SceneManager* get_scene_manager() const;

    /// Creates the scene.
    SIGHT_VIZ_SCENE3D_API void create_scene();

    /// Destroys the scene.
    SIGHT_VIZ_SCENE3D_API void destroy_scene();

    /// @returns true if the scene is created.
    SIGHT_VIZ_SCENE3D_API bool is_scene_created() const;

    /// Adds a disabled compositor name to the chain_manager.
    SIGHT_VIZ_SCENE3D_API void add_available_compositor(std::string _compositor_name);

    /// Enables/Disables a compositor according to the isEnabled flag.
    SIGHT_VIZ_SCENE3D_API void update_compositor_state(std::string _compositor_name, bool _is_enabled);

    /// Places and align camera's focal with the world boundingBox.
    SIGHT_VIZ_SCENE3D_API void reset_camera_coordinates();

    /// Computes camera's focal with the world boundingBox.
    SIGHT_VIZ_SCENE3D_API void compute_camera_parameters();

    /// Resets the camera clipping range (near and far).
    SIGHT_VIZ_SCENE3D_API void reset_camera_clipping_range() const;

    /// Appends a new interactor with the given priority. Interactors with higher priorities are executed first.
    SIGHT_VIZ_SCENE3D_API void add_interactor(
        const viz::scene3d::interactor::base::sptr& _interactor,
        int _priority = 0
    );

    /// Removes the given interactor.
    SIGHT_VIZ_SCENE3D_API void remove_interactor(const viz::scene3d::interactor::base::sptr& _interactor);

    /// @return the order of the layer.
    SIGHT_VIZ_SCENE3D_API int get_order() const;

    /// Sets the order of the layer.
    SIGHT_VIZ_SCENE3D_API void set_order(int _order);

    /// Sets the worker used by slots.
    SIGHT_VIZ_SCENE3D_API void set_worker(const core::thread::worker::sptr& _worker);

    /// @returns the render service.
    SIGHT_VIZ_SCENE3D_API SPTR(viz::scene3d::render) render_service() const;

    /// Sets the render service.
    SIGHT_VIZ_SCENE3D_API void set_render_service(const SPTR(viz::scene3d::render)& _service);

    /// Requests render.
    SIGHT_VIZ_SCENE3D_API void request_render();

    /// Sets stereoscopic rendering.
    SIGHT_VIZ_SCENE3D_API void set_stereo_mode(compositor::core::stereo_mode_t _mode);

    /// Sets background color : specific to background layer.
    SIGHT_VIZ_SCENE3D_API void set_background_color(std::string _top_color, std::string _bot_color);

    /// Sets background scale : specific to background layer.
    SIGHT_VIZ_SCENE3D_API void set_background_scale(float _top_scale, float _bot_scale);

    /// Sets background scale : specific to background layer.
    SIGHT_VIZ_SCENE3D_API void set_background_material(const std::string& _background);

    /// Sets if this layer need a layer's 3D scene.
    SIGHT_VIZ_SCENE3D_API void set_core_compositor(
        std::string _transparency_technique          = "",
        std::string _num_peels                       = "",
        compositor::core::stereo_mode_t _stereo_mode =
        compositor::core::stereo_mode_t::none
    );

    /// Sets if this layer has a configured compositor chain.
    SIGHT_VIZ_SCENE3D_API void set_compositor_chain_enabled(const std::string& _compositor_chain);

    /// Sets the viewport parameters for this layer: left, top, width, height.
    SIGHT_VIZ_SCENE3D_API void set_viewport_config(const viewport_config_t& _vp_cfg);

    /// @returns true if there is an XML configured compositor chain.
    SIGHT_VIZ_SCENE3D_API bool is_compositor_chain_enabled() const;

    /// @returns true if stereoscopic rendering is enabled.
    SIGHT_VIZ_SCENE3D_API bool is_3d() const;

    /// @returns true if the layer is initialized.
    SIGHT_VIZ_SCENE3D_API bool initialized() const;

    /// @returns the stereoscopic mode.
    SIGHT_VIZ_SCENE3D_API compositor::core::stereo_mode_t get_stereo_mode() const;

    /// @returns the compositor chain.
    SIGHT_VIZ_SCENE3D_API viz::scene3d::compositor::chain_manager::compositor_chain_t get_compositor_chain() const;

    /// @returns the list of adaptors in the chain manager.
    SIGHT_VIZ_SCENE3D_API service::has_services::service_vector_t get_registered_adaptors() const;

    /// @returns the viewport.
    SIGHT_VIZ_SCENE3D_API Ogre::Viewport* get_viewport() const;

    /// @returns the default camera.
    SIGHT_VIZ_SCENE3D_API Ogre::Camera* get_default_camera() const;

    /// Gets the projection matrix used to define nth viewpoint. The index must be lower than the number of viewpoints.
    SIGHT_VIZ_SCENE3D_API Ogre::Matrix4 get_camera_proj_mat(std::uint8_t _camera_idx) const;

    /// @returns the number of cameras (viewpoints) used by this layer. Defined by the stereo mode.
    SIGHT_VIZ_SCENE3D_API std::uint8_t num_cameras() const;

    /// Sets default light flag.
    SIGHT_VIZ_SCENE3D_API void set_has_default_light(bool _has_default_light);

    /// @returns the number of lights adaptors used in this layer.
    SIGHT_VIZ_SCENE3D_API int num_lights() const;

    /// @returns the light adaptors used in this layer.
    SIGHT_VIZ_SCENE3D_API std::vector<SPTR(viz::scene3d::light_adaptor)> get_light_adaptors() const;

    /**
     * Computes the bounding box of the scene.
     * @param _exclude_static Exclude static objects from the bounding box computation.
     * @return the computed bounding box of the scene.
     */
    SIGHT_VIZ_SCENE3D_API Ogre::AxisAlignedBox compute_world_bounding_box() const;

    /// @returns the OIT selected.
    SIGHT_VIZ_SCENE3D_API compositor::transparency_technique get_transparency_technique();

    /// @returns the number of peels computed by Depth Peeling or x2 Dual Depth Peeling.
    SIGHT_VIZ_SCENE3D_API int get_transparency_depth();

    /// Sets the OIT desired. Deactivate OIT compositor.
    SIGHT_VIZ_SCENE3D_API void set_transparency_technique(compositor::transparency_technique _technique);

    /// Sets the number of peels computed by Depth Peeling or x2 Dual Depth Peeling. Deactivate OIT compositor.
    SIGHT_VIZ_SCENE3D_API void set_transparency_depth(int _depth);

    /// Sets the camera calibrations for stereo rendering.
    SIGHT_VIZ_SCENE3D_API void set_camera_calibrations(const camera_calibrations_t& _calibrations);

    /// @returns true if a specified light is the default light in the layer.
    SIGHT_VIZ_SCENE3D_API bool is_default_light(const CSPTR(viz::scene3d::light_adaptor)& /*_light*/) const;

    /// Removes the default light in the layer.
    SIGHT_VIZ_SCENE3D_API void remove_default_light();

    /// Cancels interaction for all interactors with a lower priority than the one calling this.
    SIGHT_VIZ_SCENE3D_API void cancel_further_interaction();

    /// Need to be enable if using camera with orthographic mode.
    SIGHT_VIZ_SCENE3D_API void set_orthographic_camera(bool _ortho);
    /// Returns value of setOrthographicCamera.
    SIGHT_VIZ_SCENE3D_API bool is_orthographic_camera_force() const;

    /**
     * @brief Get the origin scene node used for image origin and image orientation
     *
     * @return Ogre::SceneNode*
     */
    inline Ogre::SceneNode* camera_origin_node();

private:

    /// Slot: interacts with the scene.
    void interaction(viz::scene3d::window_interactor::interaction_info /*info*/);

    /// Compute the scene size, notably in order to determine the zoom scale
    float compute_scene_length(const Ogre::AxisAlignedBox& _world_bounding_box);

    /// Setups default compositor for a layer's 3D scene.
    void setup_core();

    /// Stops and starts all adaptors belonging to this layer. Subadaptors are expected to be managed by their parent.
    void restart_adaptors();

    /// Calls a function on all interactors and deletes the ones that expired.
    void for_all_interactors(const std::function<void(const interactor::base::sptr&)>&& _f);

    /// Contains the Ogre scene manager of this viewport.
    Ogre::SceneManager* m_scene_manager {nullptr};

    /// Contains the Ogre render window containing this viewport.
    Ogre::RenderTarget* m_render_target {nullptr};

    /// Defines stereoscopic rendering mode.
    compositor::core::stereo_mode_t m_stereo_mode {compositor::core::stereo_mode_t::none};

    /// Stores configured compositor chain raw string if there is a one.
    std::string m_raw_compositor_chain;

    /// Contains the Ogre default compositor for this layer.
    SPTR(viz::scene3d::compositor::core) m_core_compositor {nullptr};

    /// Contains the Ogre default compositor default transparency technique.
    viz::scene3d::compositor::transparency_technique m_transparency_technique {viz::scene3d::compositor::DEFAULT};

    /// Defines the number of peels used by OIT.
    int m_num_peels {8};

    /// Manages the list of available compositors.
    /// The names are associated to a boolean value which indicates whether the compositor is enabled or not.
    viz::scene3d::compositor::chain_manager::uptr m_compositor_chain_manager;

    /// Defines the Z order of this viewport.
    int m_order {1};

    /// Defines the top background color : specific to background layer.
    std::string m_top_color {"#333333"};

    /// Defines the bottom background color : specific to background layer.
    std::string m_bottom_color {"#333333"};

    /// Defines the top background scale : specific to background layer.
    float m_top_scale {0.F};

    /// Defines the bottom background scale : specific to background layer.
    float m_bottom_scale {1.F};

    /// Defines the bottom background scale : specific to background layer.
    std::string m_background_material {};

    /// Contains the Ogre camera.
    Ogre::Camera* m_camera {nullptr};

    /// Stores the list of interactors, sorted by priority.
    std::multimap<int, viz::scene3d::interactor::base::wptr, std::greater<> > m_interactors;

    /// Handles flag cancelling all further interaction when enabled.
    bool m_cancel_further_interaction {false};

    /// Handles all connections.
    core::com::helper::sig_slot_connection m_connections;

    /// Contains the render service which this layer is attached.
    WPTR(viz::scene3d::render) m_render_service;

    /// Defines the layer identifier as referenced in render.
    std::string m_id;

    /// Indicates if a compositor chain is attached to the layer.
    bool m_has_compositor_chain {false};

    /// Indicates if the scene has been created.
    bool m_scene_created {false};

    /// Indicates if the scene has a default light.
    bool m_has_default_light {true};

    /// Contains the abstract light used to set the default light.
    SPTR(viz::scene3d::light_adaptor) m_light_adaptor {nullptr};

    /// Contains the diffuse color of the default light.
    SPTR(data::color) m_default_light_diffuse_color {nullptr};

    /// Contains the specular color of the specular light.
    SPTR(data::color) m_default_light_specular_color {nullptr};

    /// Defines the camera listener class used to pass the projection matrix for autostereo shaders.
    struct LayerCameraListener;
    LayerCameraListener* m_camera_listener {nullptr};

    /// Contains the autostereo listener.
    compositor::manager::auto_stereo* m_autostereo_listener {nullptr};

    /// Holds pairs of intrinsic/extrinsic calibrations for stereo cameras.
    camera_calibrations_t m_stereo_camera_calibration;

    /// Defines viewport parameters: left, top, width, height.
    viewport_config_t m_viewport_cfg {0.F, 0.F, 1.F, 1.F};

    /// True when we are using dedicated camera adaptor with orthographic projection.
    bool m_camera_orthographic {false};

    /// Contains the scene node used for image origin and orientation.
    Ogre::SceneNode* m_camera_origin_node {nullptr};
};

//------------------------------------------------------------------------------

inline Ogre::SceneNode* layer::camera_origin_node()
{
    return m_camera_origin_node;
}

} // namespace sight::viz::scene3d.