Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(439)

Side by Side Diff: content/browser/vr/android/cardboard/cardboard_vr_device.cc

Issue 1200303002: Android WebVR implementation, Cardboard 0.5.5 SDK (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed feedback from jochen@ Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/vr/android/cardboard/cardboard_vr_device.h"
6
7 #include <math.h>
8 #include <algorithm>
9
10 #include "base/android/jni_android.h"
11 #include "base/android/jni_array.h"
12 #include "base/android/jni_string.h"
13 #include "base/strings/string_util.h"
14 #include "base/strings/utf_string_conversions.h"
15 #include "base/time/time.h"
16 #include "content/browser/vr/vr_transform_util.h"
17 #include "jni/CardboardVRDevice_jni.h"
18
19 using base::android::AttachCurrentThread;
20
21 namespace content {
22
23 bool CardboardVRDevice::RegisterCardboardVRDevice(JNIEnv* env) {
24 return RegisterNativesImpl(env);
25 }
26
27 CardboardVRDevice::CardboardVRDevice(VRDeviceProvider* provider)
28 : VRDevice(provider), frame_index_(0) {
29 JNIEnv* env = AttachCurrentThread();
30 j_cardboard_device_.Reset(Java_CardboardVRDevice_create(
31 env, base::android::GetApplicationContext()));
32 j_head_matrix_.Reset(env, env->NewFloatArray(16));
33 }
34
35 CardboardVRDevice::~CardboardVRDevice() {
36 Java_CardboardVRDevice_stopTracking(AttachCurrentThread(),
37 j_cardboard_device_.obj());
38 }
39
40 VRDeviceInfoPtr CardboardVRDevice::GetVRDevice() {
41 VRDeviceInfoPtr device = VRDeviceInfo::New();
jdduke (slow) 2015/07/23 19:10:57 Oh, could you add a TRACE_EVENT entry for this fun
42
43 JNIEnv* env = AttachCurrentThread();
44
45 ScopedJavaLocalRef<jstring> j_device_name =
46 Java_CardboardVRDevice_getDeviceName(env, j_cardboard_device_.obj());
47 device->deviceName =
48 base::android::ConvertJavaStringToUTF8(env, j_device_name.obj());
49
50 ScopedJavaLocalRef<jfloatArray> j_fov(env, env->NewFloatArray(4));
51 Java_CardboardVRDevice_getFieldOfView(env, j_cardboard_device_.obj(),
52 j_fov.obj());
53
54 std::vector<float> fov;
55 base::android::JavaFloatArrayToFloatVector(env, j_fov.obj(), &fov);
56
57 device->hmdInfo = VRHMDInfo::New();
58 VRHMDInfoPtr& hmdInfo = device->hmdInfo;
59
60 hmdInfo->leftEye = VREyeParameters::New();
61 hmdInfo->rightEye = VREyeParameters::New();
62 VREyeParametersPtr& left_eye = hmdInfo->leftEye;
63 VREyeParametersPtr& right_eye = hmdInfo->rightEye;
64
65 left_eye->recommendedFieldOfView = VRFieldOfView::New();
66 left_eye->recommendedFieldOfView->upDegrees = fov[0];
67 left_eye->recommendedFieldOfView->downDegrees = fov[1];
68 left_eye->recommendedFieldOfView->leftDegrees = fov[2];
69 left_eye->recommendedFieldOfView->rightDegrees = fov[3];
70
71 // Cardboard devices always assume a mirrored FOV, so this is just the left
72 // eye FOV with the left and right degrees swapped.
73 right_eye->recommendedFieldOfView = VRFieldOfView::New();
74 right_eye->recommendedFieldOfView->upDegrees = fov[0];
75 right_eye->recommendedFieldOfView->downDegrees = fov[1];
76 right_eye->recommendedFieldOfView->leftDegrees = fov[3];
77 right_eye->recommendedFieldOfView->rightDegrees = fov[2];
78
79 // Cardboard does not support configurable FOV.
80 left_eye->maximumFieldOfView = left_eye->recommendedFieldOfView.Clone();
81 right_eye->maximumFieldOfView = right_eye->recommendedFieldOfView.Clone();
82 left_eye->minimumFieldOfView = left_eye->recommendedFieldOfView.Clone();
83 right_eye->minimumFieldOfView = right_eye->recommendedFieldOfView.Clone();
84
85 float ipd = Java_CardboardVRDevice_getIpd(env, j_cardboard_device_.obj());
86
87 left_eye->eyeTranslation = VRVector3::New();
88 left_eye->eyeTranslation->x = ipd * -0.5f;
89 left_eye->eyeTranslation->y = 0.0f;
90 left_eye->eyeTranslation->z = 0.0f;
91
92 right_eye->eyeTranslation = VRVector3::New();
93 right_eye->eyeTranslation->x = ipd * 0.5f;
94 right_eye->eyeTranslation->y = 0.0f;
95 right_eye->eyeTranslation->z = 0.0f;
96
97 ScopedJavaLocalRef<jintArray> j_screen_size(env, env->NewIntArray(2));
98 Java_CardboardVRDevice_getScreenSize(env, j_cardboard_device_.obj(),
99 j_screen_size.obj());
100
101 std::vector<int> screen_size;
102 base::android::JavaIntArrayToIntVector(env, j_screen_size.obj(),
103 &screen_size);
104
105 left_eye->renderRect = VRRect::New();
106 left_eye->renderRect->x = 0;
107 left_eye->renderRect->y = 0;
108 left_eye->renderRect->width = screen_size[0] / 2.0;
109 left_eye->renderRect->height = screen_size[1];
110
111 right_eye->renderRect = VRRect::New();
112 right_eye->renderRect->x = screen_size[0] / 2.0;
113 right_eye->renderRect->y = 0;
114 right_eye->renderRect->width = screen_size[0] / 2.0;
115 right_eye->renderRect->height = screen_size[1];
116
117 return device.Pass();
118 }
119
120 VRSensorStatePtr CardboardVRDevice::GetSensorState() {
121 VRSensorStatePtr state = VRSensorState::New();
122
123 state->timestamp = base::Time::Now().ToJsTime();
124 state->frameIndex = frame_index_++;
125
126 JNIEnv* env = AttachCurrentThread();
127 Java_CardboardVRDevice_getSensorState(env, j_cardboard_device_.obj(),
128 j_head_matrix_.obj());
129
130 std::vector<float> head_matrix;
131 base::android::JavaFloatArrayToFloatVector(env, j_head_matrix_.obj(),
132 &head_matrix);
133
134 state->orientation = MatrixToOrientationQuaternion(
135 &head_matrix[0], &head_matrix[4], &head_matrix[8]);
136
137 state->position = VRVector3::New();
138 state->position->x = -head_matrix[12];
139 state->position->y = head_matrix[13];
140 state->position->z = head_matrix[14];
141
142 return state.Pass();
143 }
144
145 void CardboardVRDevice::ResetSensor() {
146 Java_CardboardVRDevice_resetSensor(AttachCurrentThread(),
147 j_cardboard_device_.obj());
148 }
149
150 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698