Welcome to mirror list, hosted at ThFree Co, Russian Federation.

GHOST_XrSession.h « intern « ghost « intern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f5c0c04e65d70e97f55350e6aa01ab594c6f245f (plain)
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
/*
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 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.
 */

/** \file
 * \ingroup GHOST
 */

#pragma once

#include <map>
#include <memory>

#include "GHOST_Xr_intern.h"

class GHOST_XrContext;
class GHOST_XrSwapchain;
struct GHOST_XrDrawInfo;
struct OpenXRSessionData;

class GHOST_XrSession {
 public:
  enum LifeExpectancy {
    SESSION_KEEP_ALIVE,
    SESSION_DESTROY,
  };

  GHOST_XrSession(GHOST_XrContext &xr_context);
  ~GHOST_XrSession();

  void start(const GHOST_XrSessionBeginInfo *begin_info);
  void requestEnd();

  LifeExpectancy handleStateChangeEvent(const XrEventDataSessionStateChanged &lifecycle);

  bool isRunning() const;
  bool needsUpsideDownDrawing() const;

  void unbindGraphicsContext(); /* Public so context can ensure it's unbound as needed. */

  void draw(void *draw_customdata);

  /** Action functions to be called pre-session start.
   * NOTE: The "destroy" functions can also be called post-session start. */
  bool createActionSet(const GHOST_XrActionSetInfo &info);
  void destroyActionSet(const char *action_set_name);
  bool createActions(const char *action_set_name, uint32_t count, const GHOST_XrActionInfo *infos);
  void destroyActions(const char *action_set_name,
                      uint32_t count,
                      const char *const *action_names);
  bool createActionBindings(const char *action_set_name,
                            uint32_t count,
                            const GHOST_XrActionProfileInfo *infos);
  void destroyActionBindings(const char *action_set_name,
                             uint32_t count,
                             const char *const *action_names,
                             const char *const *profile_paths);
  bool attachActionSets();

  /**
   * Action functions to be called post-session start.
   * \param action_set_name: When `nullptr`, all attached action sets will be synced.
   */
  bool syncActions(const char *action_set_name = nullptr);
  bool applyHapticAction(const char *action_set_name,
                         const char *action_name,
                         const char *subaction_path,
                         const int64_t &duration,
                         const float &frequency,
                         const float &amplitude);
  void stopHapticAction(const char *action_set_name,
                        const char *action_name,
                        const char *subaction_path);

  /* Custom data (owned by Blender, not GHOST) accessors. */
  void *getActionSetCustomdata(const char *action_set_name);
  void *getActionCustomdata(const char *action_set_name, const char *action_name);
  uint32_t getActionCount(const char *action_set_name);
  void getActionCustomdataArray(const char *action_set_name, void **r_customdata_array);

  /** Controller model functions. */
  bool loadControllerModel(const char *subaction_path);
  void unloadControllerModel(const char *subaction_path);
  bool updateControllerModelComponents(const char *subaction_path);
  bool getControllerModelData(const char *subaction_path, GHOST_XrControllerModelData &r_data);

 private:
  /** Pointer back to context managing this session. Would be nice to avoid, but needed to access
   * custom callbacks set before session start. */
  class GHOST_XrContext *m_context;

  std::unique_ptr<OpenXRSessionData> m_oxr; /* Could use stack, but PImpl is preferable. */

  /** Active Ghost graphic context. Owned by Blender, not GHOST. */
  class GHOST_Context *m_gpu_ctx = nullptr;
  std::unique_ptr<class GHOST_IXrGraphicsBinding> m_gpu_binding;

  /** Rendering information. Set when drawing starts. */
  std::unique_ptr<GHOST_XrDrawInfo> m_draw_info;

  void initSystem();
  void beginSession();
  void endSession();

  void bindGraphicsContext();

  void prepareDrawing();
  XrCompositionLayerProjection drawLayer(
      std::vector<XrCompositionLayerProjectionView> &r_proj_layer_views, void *draw_customdata);
  void drawView(GHOST_XrSwapchain &swapchain,
                XrCompositionLayerProjectionView &r_proj_layer_view,
                XrSpaceLocation &view_location,
                XrView &view,
                uint32_t view_idx,
                void *draw_customdata);
  void beginFrameDrawing();
  void endFrameDrawing(std::vector<XrCompositionLayerBaseHeader *> &layers);
};