-
Notifications
You must be signed in to change notification settings - Fork 54
/
gfxVRPuppet.h
163 lines (138 loc) · 5.42 KB
/
gfxVRPuppet.h
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
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef GFX_VR_PUPPET_H
#define GFX_VR_PUPPET_H
#include "nsTArray.h"
#include "mozilla/RefPtr.h"
#include "nsRefPtrHashtable.h"
#include "gfxVR.h"
#include "VRDisplayLocal.h"
#if defined(XP_WIN)
# include "CompositorD3D11.h"
#endif
#if defined(XP_MACOSX)
class MacIOSurface;
#endif
namespace mozilla {
namespace layers {
struct VertexShaderConstants;
struct PixelShaderConstants;
} // namespace layers
namespace gfx {
namespace impl {
class VRDisplayPuppet : public VRDisplayLocal {
public:
void SetDisplayInfo(const VRDisplayInfo& aDisplayInfo);
void SetSensorState(const VRHMDSensorState& aSensorState);
void ZeroSensor() override;
protected:
virtual VRHMDSensorState& GetSensorState() override;
virtual void StartPresentation() override;
virtual void StopPresentation() override;
#if defined(XP_WIN)
virtual bool SubmitFrame(ID3D11Texture2D* aSource, const IntSize& aSize,
const gfx::Rect& aLeftEyeRect,
const gfx::Rect& aRightEyeRect) override;
#elif defined(XP_MACOSX)
virtual bool SubmitFrame(MacIOSurface* aMacIOSurface, const IntSize& aSize,
const gfx::Rect& aLeftEyeRect,
const gfx::Rect& aRightEyeRect) override;
#elif defined(MOZ_WIDGET_ANDROID)
virtual bool SubmitFrame(
const mozilla::layers::SurfaceTextureDescriptor& aDescriptor,
const gfx::Rect& aLeftEyeRect, const gfx::Rect& aRightEyeRect) override;
#endif
public:
explicit VRDisplayPuppet();
void Refresh();
protected:
virtual ~VRDisplayPuppet();
void Destroy();
bool mIsPresenting;
private:
#if defined(XP_WIN)
bool UpdateConstantBuffers();
ID3D11VertexShader* mQuadVS;
ID3D11PixelShader* mQuadPS;
RefPtr<ID3D11SamplerState> mLinearSamplerState;
layers::VertexShaderConstants mVSConstants;
layers::PixelShaderConstants mPSConstants;
RefPtr<ID3D11Buffer> mVSConstantBuffer;
RefPtr<ID3D11Buffer> mPSConstantBuffer;
RefPtr<ID3D11Buffer> mVertexBuffer;
RefPtr<ID3D11InputLayout> mInputLayout;
#endif
VRHMDSensorState mSensorState;
};
class VRControllerPuppet : public VRControllerHost {
public:
explicit VRControllerPuppet(dom::GamepadHand aHand, uint32_t aDisplayID);
void SetButtonPressState(uint32_t aButton, bool aPressed);
uint64_t GetButtonPressState();
void SetButtonTouchState(uint32_t aButton, bool aTouched);
uint64_t GetButtonTouchState();
void SetAxisMoveState(uint32_t aAxis, double aValue);
double GetAxisMoveState(uint32_t aAxis);
void SetPoseMoveState(const dom::GamepadPoseState& aPose);
const dom::GamepadPoseState& GetPoseMoveState();
float GetAxisMove(uint32_t aAxis);
void SetAxisMove(uint32_t aAxis, float aValue);
protected:
virtual ~VRControllerPuppet();
private:
uint64_t mButtonPressState;
uint64_t mButtonTouchState;
float mAxisMoveState[3];
dom::GamepadPoseState mPoseState;
};
} // namespace impl
class VRSystemManagerPuppet : public VRSystemManager {
public:
static already_AddRefed<VRSystemManagerPuppet> Create();
uint32_t CreateTestDisplay();
void ClearTestDisplays();
void SetPuppetDisplayInfo(const uint32_t& aDeviceID,
const VRDisplayInfo& aDisplayInfo);
void SetPuppetDisplaySensorState(const uint32_t& aDeviceID,
const VRHMDSensorState& aSensorState);
virtual void Destroy() override;
virtual void Shutdown() override;
virtual void Enumerate() override;
virtual void GetHMDs(nsTArray<RefPtr<VRDisplayHost>>& aHMDResult) override;
virtual bool GetIsPresenting() override;
virtual void HandleInput() override;
virtual void GetControllers(
nsTArray<RefPtr<VRControllerHost>>& aControllerResult) override;
virtual void ScanForControllers() override;
virtual void RemoveControllers() override;
virtual void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
double aIntensity, double aDuration,
const VRManagerPromise& aPromise) override;
virtual void StopVibrateHaptic(uint32_t aControllerIdx) override;
virtual void NotifyVSync() override;
virtual void Run10msTasks() override;
protected:
VRSystemManagerPuppet();
private:
void HandleButtonPress(uint32_t aControllerIdx, uint32_t aButton,
uint64_t aButtonMask, uint64_t aButtonPressed,
uint64_t aButtonTouched);
void HandleAxisMove(uint32_t aControllerIndex, uint32_t aAxis, float aValue);
void HandlePoseTracking(uint32_t aControllerIndex,
const dom::GamepadPoseState& aPose,
VRControllerHost* aController);
// Enumerated puppet hardware devices, as seen by Web APIs:
nsTArray<RefPtr<impl::VRDisplayPuppet>> mPuppetHMDs;
nsTArray<RefPtr<impl::VRControllerPuppet>> mPuppetController;
// Emulated hardware state, persistent through VRSystemManager::Shutdown():
static const uint32_t kMaxPuppetDisplays = 5;
uint32_t mPuppetDisplayCount;
VRDisplayInfo mPuppetDisplayInfo[kMaxPuppetDisplays];
VRHMDSensorState mPuppetDisplaySensorState[kMaxPuppetDisplays];
};
} // namespace gfx
} // namespace mozilla
#endif /* GFX_VR_PUPPET_H*/