Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "mozilla/dom/VRServiceTest.h"
8 : #include "mozilla/dom/VRServiceTestBinding.h"
9 :
10 : namespace mozilla {
11 : namespace dom {
12 :
13 : NS_IMPL_CYCLE_COLLECTION_CLASS(VRMockDisplay)
14 :
15 0 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(VRMockDisplay,
16 : DOMEventTargetHelper)
17 0 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
18 :
19 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(VRMockDisplay,
20 : DOMEventTargetHelper)
21 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_END
22 :
23 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(VRMockDisplay)
24 0 : NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
25 :
26 0 : NS_IMPL_ADDREF_INHERITED(VRMockDisplay, DOMEventTargetHelper)
27 0 : NS_IMPL_RELEASE_INHERITED(VRMockDisplay, DOMEventTargetHelper)
28 :
29 0 : VRMockDisplay::VRMockDisplay(const nsCString& aID, uint32_t aDeviceID)
30 : : mDeviceID(aDeviceID)
31 0 : , mTimestamp(TimeStamp::Now())
32 : {
33 0 : mDisplayInfo.mDisplayName = aID;
34 0 : mDisplayInfo.mType = VRDeviceType::Puppet;
35 0 : mDisplayInfo.mIsConnected = true;
36 0 : mDisplayInfo.mIsMounted = false;
37 0 : mDisplayInfo.mCapabilityFlags = VRDisplayCapabilityFlags::Cap_None |
38 0 : VRDisplayCapabilityFlags::Cap_Orientation |
39 0 : VRDisplayCapabilityFlags::Cap_AngularAcceleration |
40 0 : VRDisplayCapabilityFlags::Cap_Position |
41 0 : VRDisplayCapabilityFlags::Cap_LinearAcceleration |
42 0 : VRDisplayCapabilityFlags::Cap_External |
43 0 : VRDisplayCapabilityFlags::Cap_Present |
44 0 : VRDisplayCapabilityFlags::Cap_StageParameters |
45 0 : VRDisplayCapabilityFlags::Cap_MountDetection;
46 0 : }
47 :
48 : JSObject*
49 0 : VRMockDisplay::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
50 : {
51 0 : return VRMockDisplayBinding::Wrap(aCx, this, aGivenProto);
52 : }
53 :
54 0 : void VRMockDisplay::SetEyeResolution(unsigned long aRenderWidth, unsigned long aRenderHeight)
55 : {
56 0 : mDisplayInfo.mEyeResolution.width = aRenderWidth;
57 0 : mDisplayInfo.mEyeResolution.height = aRenderHeight;
58 0 : }
59 :
60 : void
61 0 : VRMockDisplay::SetEyeParameter(VREye aEye, double aOffsetX, double aOffsetY,
62 : double aOffsetZ, double aUpDegree, double aRightDegree,
63 : double aDownDegree, double aLeftDegree)
64 : {
65 0 : uint32_t eye = static_cast<uint32_t>(aEye);
66 0 : mDisplayInfo.mEyeFOV[eye] = gfx ::VRFieldOfView(aUpDegree, aRightDegree,
67 : aRightDegree, aLeftDegree);
68 0 : mDisplayInfo.mEyeTranslation[eye].x = aOffsetX;
69 0 : mDisplayInfo.mEyeTranslation[eye].y = aOffsetY;
70 0 : mDisplayInfo.mEyeTranslation[eye].z = aOffsetZ;
71 0 : }
72 :
73 : void
74 0 : VRMockDisplay::SetPose(const Nullable<Float32Array>& aPosition,
75 : const Nullable<Float32Array>& aLinearVelocity,
76 : const Nullable<Float32Array>& aLinearAcceleration,
77 : const Nullable<Float32Array>& aOrientation,
78 : const Nullable<Float32Array>& aAngularVelocity,
79 : const Nullable<Float32Array>& aAngularAcceleration)
80 : {
81 0 : mSensorState.Clear();
82 0 : mSensorState.timestamp = (TimeStamp::Now() - mTimestamp).ToSeconds();
83 0 : mSensorState.flags = VRDisplayCapabilityFlags::Cap_Orientation |
84 0 : VRDisplayCapabilityFlags::Cap_Position |
85 0 : VRDisplayCapabilityFlags::Cap_AngularAcceleration |
86 0 : VRDisplayCapabilityFlags::Cap_LinearAcceleration |
87 0 : VRDisplayCapabilityFlags::Cap_External |
88 0 : VRDisplayCapabilityFlags::Cap_MountDetection |
89 0 : VRDisplayCapabilityFlags::Cap_Present;
90 :
91 0 : if (!aOrientation.IsNull()) {
92 0 : const Float32Array& value = aOrientation.Value();
93 0 : value.ComputeLengthAndData();
94 0 : MOZ_ASSERT(value.Length() == 4);
95 0 : mSensorState.orientation[0] = value.Data()[0];
96 0 : mSensorState.orientation[1] = value.Data()[1];
97 0 : mSensorState.orientation[2] = value.Data()[2];
98 0 : mSensorState.orientation[3] = value.Data()[3];
99 : }
100 0 : if (!aAngularVelocity.IsNull()) {
101 0 : const Float32Array& value = aAngularVelocity.Value();
102 0 : value.ComputeLengthAndData();
103 0 : MOZ_ASSERT(value.Length() == 3);
104 0 : mSensorState.angularVelocity[0] = value.Data()[0];
105 0 : mSensorState.angularVelocity[1] = value.Data()[1];
106 0 : mSensorState.angularVelocity[2] = value.Data()[2];
107 : }
108 0 : if (!aAngularAcceleration.IsNull()) {
109 0 : const Float32Array& value = aAngularAcceleration.Value();
110 0 : value.ComputeLengthAndData();
111 0 : MOZ_ASSERT(value.Length() == 3);
112 0 : mSensorState.angularAcceleration[0] = value.Data()[0];
113 0 : mSensorState.angularAcceleration[1] = value.Data()[1];
114 0 : mSensorState.angularAcceleration[2] = value.Data()[2];
115 : }
116 0 : if (!aPosition.IsNull()) {
117 0 : const Float32Array& value = aPosition.Value();
118 0 : value.ComputeLengthAndData();
119 0 : MOZ_ASSERT(value.Length() == 3);
120 0 : mSensorState.position[0] = value.Data()[0];
121 0 : mSensorState.position[1] = value.Data()[1];
122 0 : mSensorState.position[2] = value.Data()[2];
123 : }
124 0 : if (!aLinearVelocity.IsNull()) {
125 0 : const Float32Array& value = aLinearVelocity.Value();
126 0 : value.ComputeLengthAndData();
127 0 : MOZ_ASSERT(value.Length() == 3);
128 0 : mSensorState.linearVelocity[0] = value.Data()[0];
129 0 : mSensorState.linearVelocity[1] = value.Data()[1];
130 0 : mSensorState.linearVelocity[2] = value.Data()[2];
131 : }
132 0 : if (!aLinearAcceleration.IsNull()) {
133 0 : const Float32Array& value = aLinearAcceleration.Value();
134 0 : value.ComputeLengthAndData();
135 0 : MOZ_ASSERT(value.Length() == 3);
136 0 : mSensorState.linearAcceleration[0] = value.Data()[0];
137 0 : mSensorState.linearAcceleration[1] = value.Data()[1];
138 0 : mSensorState.linearAcceleration[2] = value.Data()[2];
139 : }
140 0 : }
141 :
142 : void
143 0 : VRMockDisplay::Update()
144 : {
145 0 : gfx::VRManagerChild* vm = gfx::VRManagerChild::Get();
146 :
147 0 : vm->SendSetSensorStateToMockDisplay(mDeviceID, mSensorState);
148 0 : vm->SendSetDisplayInfoToMockDisplay(mDeviceID, mDisplayInfo);
149 0 : }
150 :
151 : NS_IMPL_CYCLE_COLLECTION_CLASS(VRMockController)
152 :
153 0 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(VRMockController,
154 : DOMEventTargetHelper)
155 0 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
156 :
157 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(VRMockController,
158 : DOMEventTargetHelper)
159 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_END
160 :
161 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(VRMockController)
162 0 : NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
163 :
164 0 : NS_IMPL_ADDREF_INHERITED(VRMockController, DOMEventTargetHelper)
165 0 : NS_IMPL_RELEASE_INHERITED(VRMockController, DOMEventTargetHelper)
166 :
167 0 : VRMockController::VRMockController(const nsCString& aID, uint32_t aDeviceID)
168 0 : : mID(aID), mDeviceID(aDeviceID)
169 : {
170 0 : }
171 :
172 : JSObject*
173 0 : VRMockController::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
174 : {
175 0 : return VRMockControllerBinding::Wrap(aCx, this, aGivenProto);
176 : }
177 :
178 : void
179 0 : VRMockController::NewButtonEvent(unsigned long aButton, bool aPressed)
180 : {
181 0 : gfx::VRManagerChild* vm = gfx::VRManagerChild::Get();
182 0 : vm->SendNewButtonEventToMockController(mDeviceID, aButton, aPressed);
183 0 : }
184 :
185 : void
186 0 : VRMockController::NewAxisMoveEvent(unsigned long aAxis, double aValue)
187 : {
188 0 : gfx::VRManagerChild* vm = gfx::VRManagerChild::Get();
189 0 : vm->SendNewAxisMoveEventToMockController(mDeviceID, aAxis, aValue);
190 0 : }
191 :
192 : void
193 0 : VRMockController::NewPoseMove(const Nullable<Float32Array>& aPosition,
194 : const Nullable<Float32Array>& aLinearVelocity,
195 : const Nullable<Float32Array>& aLinearAcceleration,
196 : const Nullable<Float32Array>& aOrientation,
197 : const Nullable<Float32Array>& aAngularVelocity,
198 : const Nullable<Float32Array>& aAngularAcceleration)
199 : {
200 0 : gfx::VRManagerChild* vm = gfx::VRManagerChild::Get();
201 0 : GamepadPoseState poseState;
202 :
203 0 : poseState.flags = GamepadCapabilityFlags::Cap_Orientation |
204 0 : GamepadCapabilityFlags::Cap_Position |
205 0 : GamepadCapabilityFlags::Cap_AngularAcceleration |
206 0 : GamepadCapabilityFlags::Cap_LinearAcceleration;
207 0 : if (!aOrientation.IsNull()) {
208 0 : const Float32Array& value = aOrientation.Value();
209 0 : value.ComputeLengthAndData();
210 0 : MOZ_ASSERT(value.Length() == 4);
211 0 : poseState.orientation[0] = value.Data()[0];
212 0 : poseState.orientation[1] = value.Data()[1];
213 0 : poseState.orientation[2] = value.Data()[2];
214 0 : poseState.orientation[3] = value.Data()[3];
215 0 : poseState.isOrientationValid = true;
216 : }
217 0 : if (!aPosition.IsNull()) {
218 0 : const Float32Array& value = aPosition.Value();
219 0 : value.ComputeLengthAndData();
220 0 : MOZ_ASSERT(value.Length() == 3);
221 0 : poseState.position[0] = value.Data()[0];
222 0 : poseState.position[1] = value.Data()[1];
223 0 : poseState.position[2] = value.Data()[2];
224 0 : poseState.isPositionValid = true;
225 : }
226 0 : if (!aAngularVelocity.IsNull()) {
227 0 : const Float32Array& value = aAngularVelocity.Value();
228 0 : value.ComputeLengthAndData();
229 0 : MOZ_ASSERT(value.Length() == 3);
230 0 : poseState.angularVelocity[0] = value.Data()[0];
231 0 : poseState.angularVelocity[1] = value.Data()[1];
232 0 : poseState.angularVelocity[2] = value.Data()[2];
233 : }
234 0 : if (!aAngularAcceleration.IsNull()) {
235 0 : const Float32Array& value = aAngularAcceleration.Value();
236 0 : value.ComputeLengthAndData();
237 0 : MOZ_ASSERT(value.Length() == 3);
238 0 : poseState.angularAcceleration[0] = value.Data()[0];
239 0 : poseState.angularAcceleration[1] = value.Data()[1];
240 0 : poseState.angularAcceleration[2] = value.Data()[2];
241 : }
242 0 : if (!aLinearVelocity.IsNull()) {
243 0 : const Float32Array& value = aLinearVelocity.Value();
244 0 : value.ComputeLengthAndData();
245 0 : MOZ_ASSERT(value.Length() == 3);
246 0 : poseState.linearVelocity[0] = value.Data()[0];
247 0 : poseState.linearVelocity[1] = value.Data()[1];
248 0 : poseState.linearVelocity[2] = value.Data()[2];
249 : }
250 0 : if (!aLinearAcceleration.IsNull()) {
251 0 : const Float32Array& value = aLinearAcceleration.Value();
252 0 : value.ComputeLengthAndData();
253 0 : MOZ_ASSERT(value.Length() == 3);
254 0 : poseState.linearAcceleration[0] = value.Data()[0];
255 0 : poseState.linearAcceleration[1] = value.Data()[1];
256 0 : poseState.linearAcceleration[2] = value.Data()[2];
257 : }
258 0 : vm->SendNewPoseMoveToMockController(mDeviceID, poseState);
259 0 : }
260 :
261 : NS_IMPL_CYCLE_COLLECTION_CLASS(VRServiceTest)
262 :
263 0 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(VRServiceTest,
264 : DOMEventTargetHelper)
265 0 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
266 :
267 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(VRServiceTest,
268 : DOMEventTargetHelper)
269 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_END
270 :
271 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(VRServiceTest)
272 0 : NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
273 :
274 0 : NS_IMPL_ADDREF_INHERITED(VRServiceTest, DOMEventTargetHelper)
275 0 : NS_IMPL_RELEASE_INHERITED(VRServiceTest, DOMEventTargetHelper)
276 :
277 :
278 : JSObject*
279 0 : VRServiceTest::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
280 : {
281 0 : return VRServiceTestBinding::Wrap(aCx, this, aGivenProto);
282 : }
283 :
284 : // static
285 : already_AddRefed<VRServiceTest>
286 0 : VRServiceTest::CreateTestService(nsPIDOMWindowInner* aWindow)
287 : {
288 0 : MOZ_ASSERT(aWindow);
289 0 : RefPtr<VRServiceTest> service = new VRServiceTest(aWindow);
290 0 : return service.forget();
291 : }
292 :
293 0 : VRServiceTest::VRServiceTest(nsPIDOMWindowInner* aWindow)
294 : : mWindow(aWindow),
295 0 : mShuttingDown(false)
296 : {
297 0 : gfx::VRManagerChild* vm = gfx::VRManagerChild::Get();
298 0 : vm->SendCreateVRTestSystem();
299 0 : }
300 :
301 0 : VRServiceTest::~VRServiceTest()
302 0 : {}
303 :
304 : void
305 0 : VRServiceTest::Shutdown()
306 : {
307 0 : MOZ_ASSERT(!mShuttingDown);
308 0 : mShuttingDown = true;
309 0 : mWindow = nullptr;
310 0 : }
311 :
312 : already_AddRefed<Promise>
313 0 : VRServiceTest::AttachVRDisplay(const nsAString& aID, ErrorResult& aRv)
314 : {
315 0 : if (mShuttingDown) {
316 0 : return nullptr;
317 : }
318 :
319 0 : nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(mWindow);
320 :
321 0 : RefPtr<Promise> p = Promise::Create(go, aRv);
322 0 : if (NS_WARN_IF(aRv.Failed())) {
323 0 : return nullptr;
324 : }
325 :
326 0 : gfx::VRManagerChild* vm = gfx::VRManagerChild::Get();
327 0 : vm->CreateVRServiceTestDisplay(NS_ConvertUTF16toUTF8(aID), p);
328 :
329 0 : return p.forget();
330 : }
331 :
332 : already_AddRefed<Promise>
333 0 : VRServiceTest::AttachVRController(const nsAString& aID, ErrorResult& aRv)
334 : {
335 0 : if (mShuttingDown) {
336 0 : return nullptr;
337 : }
338 :
339 0 : nsCOMPtr<nsIGlobalObject> go = do_QueryInterface(mWindow);
340 :
341 0 : RefPtr<Promise> p = Promise::Create(go, aRv);
342 0 : if (NS_WARN_IF(aRv.Failed())) {
343 0 : return nullptr;
344 : }
345 :
346 0 : gfx::VRManagerChild* vm = gfx::VRManagerChild::Get();
347 0 : vm->CreateVRServiceTestController(NS_ConvertUTF16toUTF8(aID), p);
348 :
349 0 : return p.forget();
350 : }
351 :
352 : } // namespace dom
353 : } // namespace mozilla
|