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

Side by Side Diff: chrome/browser/android/vr_shell/vr_controller.cc

Issue 2814443004: Refactor VR math off of GVR types, onto gfx types where possible. (Closed)
Patch Set: Fix tests Created 3 years, 8 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/vr_shell/vr_controller.h" 5 #include "chrome/browser/android/vr_shell/vr_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "chrome/browser/android/vr_shell/vr_math.h" 13 #include "device/vr/vr_math.h"
14 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/ gvr.h" 14 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/ gvr.h"
15 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/ gvr_controller.h" 15 #include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/ gvr_controller.h"
16 16
17 namespace vr_shell { 17 namespace vr_shell {
18 18
19 namespace { 19 namespace {
20 20
21 constexpr float kDisplacementScaleFactor = 300.0f; 21 constexpr float kDisplacementScaleFactor = 300.0f;
22 22
23 // A slop represents a small rectangular region around the first touch point of 23 // A slop represents a small rectangular region around the first touch point of
(...skipping 10 matching lines...) Expand all
34 // not equal. Also, minimum time distance needed to call two timestamps 34 // not equal. Also, minimum time distance needed to call two timestamps
35 // not equal. 35 // not equal.
36 constexpr float kDelta = 1.0e-7f; 36 constexpr float kDelta = 1.0e-7f;
37 37
38 constexpr float kCutoffHz = 10.0f; 38 constexpr float kCutoffHz = 10.0f;
39 constexpr float kRC = static_cast<float>(1.0 / (2.0 * M_PI * kCutoffHz)); 39 constexpr float kRC = static_cast<float>(1.0 / (2.0 * M_PI * kCutoffHz));
40 constexpr float kNanoSecondsPerSecond = 1.0e9f; 40 constexpr float kNanoSecondsPerSecond = 1.0e9f;
41 41
42 constexpr int kMaxNumOfExtrapolations = 2; 42 constexpr int kMaxNumOfExtrapolations = 2;
43 43
44 static constexpr gvr::Vec3f kControllerPosition = {0.2f, -0.5f, -0.15f}; 44 static constexpr gfx::Point3F kControllerPosition = {0.2f, -0.5f, -0.15f};
45 45
46 class Vector { 46 void ClampTouchpadPosition(gfx::Vector2dF* position) {
47 public: 47 position->set_x(std::min(std::max(0.0f, position->x()), 1.0f));
48 static inline void ClampTouchpadPosition(gvr::Vec2f* position) { 48 position->set_y(std::min(std::max(0.0f, position->y()), 1.0f));
49 position->x = std::min(std::max(0.0f, position->x), 1.0f); 49 }
50 position->y = std::min(std::max(0.0f, position->y), 1.0f);
51 }
52
53 static inline void SetZero(gvr::Vec2f* v) {
54 v->x = 0;
55 v->y = 0;
56 }
57
58 static inline gvr::Vec2f Subtract(gvr::Vec2f v1, gvr::Vec2f v2) {
59 gvr::Vec2f result;
60 result.x = v1.x - v2.x;
61 result.y = v1.y - v2.y;
62 return result;
63 }
64
65 static inline gvr::Vec2f Add(gvr::Vec2f v1, gvr::Vec2f v2) {
66 gvr::Vec2f result;
67 result.x = v1.x + v2.x;
68 result.y = v1.y + v2.y;
69 return result;
70 }
71
72 static inline bool Equal(const gvr::Vec2f v1, const gvr::Vec2f v2) {
73 return (std::abs(v1.x - v2.x) < kDelta) && (std::abs(v1.y - v2.y) < kDelta);
74 }
75
76 static inline gvr::Vec2f ScalarMult(gvr::Vec2f v, float scalar) {
77 gvr::Vec2f vect_prod;
78 vect_prod.x = v.x * scalar;
79 vect_prod.y = v.y * scalar;
80 return vect_prod;
81 }
82
83 }; // Vector
84 50
85 } // namespace 51 } // namespace
86 52
87 VrController::VrController(gvr_context* vr_context) { 53 VrController::VrController(gvr_context* vr_context) {
88 DVLOG(1) << __FUNCTION__ << "=" << this; 54 DVLOG(1) << __FUNCTION__ << "=" << this;
89 Initialize(vr_context); 55 Initialize(vr_context);
90 Reset(); 56 Reset();
91 } 57 }
92 58
93 VrController::~VrController() { 59 VrController::~VrController() {
94 DVLOG(1) << __FUNCTION__ << "=" << this; 60 DVLOG(1) << __FUNCTION__ << "=" << this;
95 } 61 }
96 62
97 void VrController::OnResume() { 63 void VrController::OnResume() {
98 if (controller_api_) 64 if (controller_api_)
99 controller_api_->Resume(); 65 controller_api_->Resume();
100 } 66 }
101 67
102 void VrController::OnPause() { 68 void VrController::OnPause() {
103 if (controller_api_) 69 if (controller_api_)
104 controller_api_->Pause(); 70 controller_api_->Pause();
105 } 71 }
106 72
107 device::GvrGamepadData VrController::GetGamepadData() { 73 device::GvrGamepadData VrController::GetGamepadData() {
108 device::GvrGamepadData pad; 74 device::GvrGamepadData pad;
109 75
110 pad.timestamp = controller_state_->GetLastOrientationTimestamp(); 76 pad.timestamp = controller_state_->GetLastOrientationTimestamp();
111 pad.touch_pos = controller_state_->GetTouchPos(); 77 pad.touch_pos.set_x(TouchPosX());
112 pad.orientation = controller_state_->GetOrientation(); 78 pad.touch_pos.set_y(TouchPosY());
79 pad.orientation = Orientation();
113 80
114 // Use orientation to rotate acceleration/gyro into seated space. 81 // Use orientation to rotate acceleration/gyro into seated space.
115 gvr::Mat4f pose_mat = QuatToMatrix(pad.orientation); 82 vr::Mat4f pose_mat;
116 pad.accel = MatrixVectorMul(pose_mat, controller_state_->GetAccel()); 83 vr::QuatToMatrix(pad.orientation, &pose_mat);
117 pad.gyro = MatrixVectorMul(pose_mat, controller_state_->GetGyro()); 84 const gvr::Vec3f& accel = controller_state_->GetAccel();
85 const gvr::Vec3f& gyro = controller_state_->GetGyro();
86 pad.accel =
87 vr::MatrixVectorMul(pose_mat, gfx::Vector3dF(accel.x, accel.y, accel.z));
88 pad.gyro =
89 vr::MatrixVectorMul(pose_mat, gfx::Vector3dF(gyro.x, gyro.y, gyro.z));
118 90
119 pad.is_touching = controller_state_->IsTouching(); 91 pad.is_touching = controller_state_->IsTouching();
120 pad.controller_button_pressed = 92 pad.controller_button_pressed =
121 controller_state_->GetButtonState(GVR_CONTROLLER_BUTTON_CLICK); 93 controller_state_->GetButtonState(GVR_CONTROLLER_BUTTON_CLICK);
122 pad.right_handed = handedness_ == GVR_CONTROLLER_RIGHT_HANDED; 94 pad.right_handed = handedness_ == GVR_CONTROLLER_RIGHT_HANDED;
123 95
124 return pad; 96 return pad;
125 } 97 }
126 98
127 bool VrController::IsTouching() { 99 bool VrController::IsTouching() {
128 return controller_state_->IsTouching(); 100 return controller_state_->IsTouching();
129 } 101 }
130 102
131 float VrController::TouchPosX() { 103 float VrController::TouchPosX() {
132 return controller_state_->GetTouchPos().x; 104 return controller_state_->GetTouchPos().x;
133 } 105 }
134 106
135 float VrController::TouchPosY() { 107 float VrController::TouchPosY() {
136 return controller_state_->GetTouchPos().y; 108 return controller_state_->GetTouchPos().y;
137 } 109 }
138 110
139 gvr::Quatf VrController::Orientation() const { 111 vr::Quatf VrController::Orientation() const {
140 return controller_state_->GetOrientation(); 112 const gvr::Quatf& orientation = controller_state_->GetOrientation();
113 return *reinterpret_cast<vr::Quatf*>(const_cast<gvr::Quatf*>(&orientation));
141 } 114 }
142 115
143 gvr::Mat4f VrController::GetTransform() const { 116 void VrController::GetTransform(vr::Mat4f* out) const {
144 // TODO(acondor): Position and orientation needs to be obtained 117 // TODO(acondor): Position and orientation needs to be obtained
145 // from an elbow model. 118 // from an elbow model.
146 // Placing the controller in a fixed position for now. 119 // Placing the controller in a fixed position for now.
147 gvr::Mat4f mat; 120 vr::SetIdentityM(out);
148 SetIdentityM(mat);
149 // Changing rotation point. 121 // Changing rotation point.
150 TranslateM(mat, mat, 0, 0, 0.05); 122 vr::TranslateM(*out, gfx::Vector3dF(0, 0, 0.05), out);
151 mat = MatrixMul(QuatToMatrix(Orientation()), mat); 123 vr::Mat4f quat_to_matrix;
152 TranslateM(mat, mat, kControllerPosition.x, kControllerPosition.y, 124 vr::QuatToMatrix(Orientation(), &quat_to_matrix);
153 kControllerPosition.z - 0.05); 125 vr::MatrixMul(quat_to_matrix, *out, out);
154 return mat; 126 gfx::Vector3dF translation(kControllerPosition.x(), kControllerPosition.y(),
127 kControllerPosition.z() - 0.05);
128 vr::TranslateM(*out, translation, out);
155 } 129 }
156 130
157 VrControllerModel::State VrController::GetModelState() const { 131 VrControllerModel::State VrController::GetModelState() const {
158 if (ButtonState(gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK)) 132 if (ButtonState(gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK))
159 return VrControllerModel::TOUCHPAD; 133 return VrControllerModel::TOUCHPAD;
160 if (ButtonState(gvr::ControllerButton::GVR_CONTROLLER_BUTTON_APP)) 134 if (ButtonState(gvr::ControllerButton::GVR_CONTROLLER_BUTTON_APP))
161 return VrControllerModel::APP; 135 return VrControllerModel::APP;
162 if (ButtonState(gvr::ControllerButton::GVR_CONTROLLER_BUTTON_HOME)) 136 if (ButtonState(gvr::ControllerButton::GVR_CONTROLLER_BUTTON_HOME))
163 return VrControllerModel::SYSTEM; 137 return VrControllerModel::SYSTEM;
164 return VrControllerModel::IDLE; 138 return VrControllerModel::IDLE;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 VLOG(1) << "Controller Connection status: " 173 VLOG(1) << "Controller Connection status: "
200 << gvr_controller_connection_state_to_string( 174 << gvr_controller_connection_state_to_string(
201 controller_state_->GetConnectionState()); 175 controller_state_->GetConnectionState());
202 } 176 }
203 } 177 }
204 178
205 void VrController::UpdateTouchInfo() { 179 void VrController::UpdateTouchInfo() {
206 CHECK(touch_info_ != nullptr) << "touch_info_ not initialized properly."; 180 CHECK(touch_info_ != nullptr) << "touch_info_ not initialized properly.";
207 if (IsTouching() && state_ == SCROLLING && 181 if (IsTouching() && state_ == SCROLLING &&
208 (controller_state_->GetLastTouchTimestamp() == last_touch_timestamp_ || 182 (controller_state_->GetLastTouchTimestamp() == last_touch_timestamp_ ||
209 (Vector::Equal(cur_touch_point_->position, 183 (cur_touch_point_->position == prev_touch_point_->position &&
210 prev_touch_point_->position) &&
211 extrapolated_touch_ < kMaxNumOfExtrapolations))) { 184 extrapolated_touch_ < kMaxNumOfExtrapolations))) {
212 extrapolated_touch_++; 185 extrapolated_touch_++;
213 touch_position_changed_ = true; 186 touch_position_changed_ = true;
214 // Fill the touch_info 187 // Fill the touch_info
215 float duration = 188 float duration =
216 (gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos - 189 (gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos -
217 last_timestamp_nanos_) / 190 last_timestamp_nanos_) /
218 kNanoSecondsPerSecond; 191 kNanoSecondsPerSecond;
219 touch_info_->touch_point.position.x = 192 touch_info_->touch_point.position.set_x(cur_touch_point_->position.x() +
220 cur_touch_point_->position.x + overall_velocity_.x * duration; 193 overall_velocity_.x() * duration);
221 touch_info_->touch_point.position.y = 194 touch_info_->touch_point.position.set_y(cur_touch_point_->position.y() +
222 cur_touch_point_->position.y + overall_velocity_.y * duration; 195 overall_velocity_.y() * duration);
223 } else { 196 } else {
224 if (extrapolated_touch_ == kMaxNumOfExtrapolations) { 197 if (extrapolated_touch_ == kMaxNumOfExtrapolations) {
225 Vector::SetZero(&overall_velocity_); 198 overall_velocity_ = {0, 0};
226 } 199 }
227 extrapolated_touch_ = 0; 200 extrapolated_touch_ = 0;
228 } 201 }
229 last_touch_timestamp_ = controller_state_->GetLastTouchTimestamp(); 202 last_touch_timestamp_ = controller_state_->GetLastTouchTimestamp();
230 last_timestamp_nanos_ = 203 last_timestamp_nanos_ =
231 gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos; 204 gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos;
232 } 205 }
233 206
234 void VrController::Initialize(gvr_context* gvr_context) { 207 void VrController::Initialize(gvr_context* gvr_context) {
235 CHECK(gvr_context != nullptr) << "invalid gvr_context"; 208 CHECK(gvr_context != nullptr) << "invalid gvr_context";
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 ButtonUpHappened(gvr::kControllerButtonClick)) { 245 ButtonUpHappened(gvr::kControllerButtonClick)) {
273 gesture->SetType(WebInputEvent::kGestureTapDown); 246 gesture->SetType(WebInputEvent::kGestureTapDown);
274 gesture->x = 0; 247 gesture->x = 0;
275 gesture->y = 0; 248 gesture->y = 0;
276 } 249 }
277 gesture->source_device = blink::kWebGestureDeviceTouchpad; 250 gesture->source_device = blink::kWebGestureDeviceTouchpad;
278 gesture_list.push_back(std::move(gesture)); 251 gesture_list.push_back(std::move(gesture));
279 252
280 if (gesture_list.back()->GetType() == WebInputEvent::kGestureScrollEnd) { 253 if (gesture_list.back()->GetType() == WebInputEvent::kGestureScrollEnd) {
281 if (!ButtonDownHappened(gvr::kControllerButtonClick) && 254 if (!ButtonDownHappened(gvr::kControllerButtonClick) &&
282 (last_velocity_.x != 0.0 || last_velocity_.y != 0.0)) { 255 (last_velocity_.x() != 0.0 || last_velocity_.y() != 0.0)) {
283 std::unique_ptr<WebGestureEvent> fling(new WebGestureEvent( 256 std::unique_ptr<WebGestureEvent> fling(new WebGestureEvent(
284 WebInputEvent::kGestureFlingStart, WebInputEvent::kNoModifiers, 257 WebInputEvent::kGestureFlingStart, WebInputEvent::kNoModifiers,
285 gesture_list.back()->TimeStampSeconds())); 258 gesture_list.back()->TimeStampSeconds()));
286 fling->source_device = blink::kWebGestureDeviceTouchpad; 259 fling->source_device = blink::kWebGestureDeviceTouchpad;
287 if (IsHorizontalGesture()) { 260 if (IsHorizontalGesture()) {
288 fling->data.fling_start.velocity_x = 261 fling->data.fling_start.velocity_x =
289 last_velocity_.x * kDisplacementScaleFactor; 262 last_velocity_.x() * kDisplacementScaleFactor;
290 } else { 263 } else {
291 fling->data.fling_start.velocity_y = 264 fling->data.fling_start.velocity_y =
292 last_velocity_.y * kDisplacementScaleFactor; 265 last_velocity_.y() * kDisplacementScaleFactor;
293 } 266 }
294 gesture_list.push_back(std::move(fling)); 267 gesture_list.push_back(std::move(fling));
295 } 268 }
296 Reset(); 269 Reset();
297 } 270 }
298 271
299 return gesture_list; 272 return gesture_list;
300 } 273 }
301 274
302 void VrController::UpdateGestureFromTouchInfo(WebGestureEvent* gesture) { 275 void VrController::UpdateGestureFromTouchInfo(WebGestureEvent* gesture) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 318
346 // Touch position is changed, the touch point moves outside of slop, 319 // Touch position is changed, the touch point moves outside of slop,
347 // and the Controller's button is not down. 320 // and the Controller's button is not down.
348 if (touch_position_changed_ && touch_info_->is_touching && 321 if (touch_position_changed_ && touch_info_->is_touching &&
349 !InSlop(touch_info_->touch_point.position) && 322 !InSlop(touch_info_->touch_point.position) &&
350 !ButtonDownHappened(gvr::kControllerButtonClick)) { 323 !ButtonDownHappened(gvr::kControllerButtonClick)) {
351 state_ = SCROLLING; 324 state_ = SCROLLING;
352 gesture->SetType(WebInputEvent::kGestureScrollBegin); 325 gesture->SetType(WebInputEvent::kGestureScrollBegin);
353 UpdateGestureParameters(); 326 UpdateGestureParameters();
354 gesture->data.scroll_begin.delta_x_hint = 327 gesture->data.scroll_begin.delta_x_hint =
355 displacement_.x * kDisplacementScaleFactor; 328 displacement_.x() * kDisplacementScaleFactor;
356 gesture->data.scroll_begin.delta_y_hint = 329 gesture->data.scroll_begin.delta_y_hint =
357 displacement_.y * kDisplacementScaleFactor; 330 displacement_.y() * kDisplacementScaleFactor;
358 gesture->data.scroll_begin.delta_hint_units = 331 gesture->data.scroll_begin.delta_hint_units =
359 blink::WebGestureEvent::ScrollUnits::kPrecisePixels; 332 blink::WebGestureEvent::ScrollUnits::kPrecisePixels;
360 } 333 }
361 } 334 }
362 335
363 void VrController::HandleScrollingState(WebGestureEvent* gesture) { 336 void VrController::HandleScrollingState(WebGestureEvent* gesture) {
364 if (touch_info_->touch_up || !(touch_info_->is_touching) || 337 if (touch_info_->touch_up || !(touch_info_->is_touching) ||
365 ButtonDownHappened(gvr::kControllerButtonClick)) { 338 ButtonDownHappened(gvr::kControllerButtonClick)) {
366 // Gesture ends. 339 // Gesture ends.
367 gesture->SetType(WebInputEvent::kGestureScrollEnd); 340 gesture->SetType(WebInputEvent::kGestureScrollEnd);
368 UpdateGestureParameters(); 341 UpdateGestureParameters();
369 } else if (touch_position_changed_) { 342 } else if (touch_position_changed_) {
370 // User continues scrolling and there is a change in touch position. 343 // User continues scrolling and there is a change in touch position.
371 gesture->SetType(WebInputEvent::kGestureScrollUpdate); 344 gesture->SetType(WebInputEvent::kGestureScrollUpdate);
372 UpdateGestureParameters(); 345 UpdateGestureParameters();
373 if (IsHorizontalGesture()) { 346 if (IsHorizontalGesture()) {
374 gesture->data.scroll_update.delta_x = 347 gesture->data.scroll_update.delta_x =
375 displacement_.x * kDisplacementScaleFactor; 348 displacement_.x() * kDisplacementScaleFactor;
376 } else { 349 } else {
377 gesture->data.scroll_update.delta_y = 350 gesture->data.scroll_update.delta_y =
378 displacement_.y * kDisplacementScaleFactor; 351 displacement_.y() * kDisplacementScaleFactor;
379 } 352 }
380 last_velocity_ = overall_velocity_; 353 last_velocity_ = overall_velocity_;
381 } 354 }
382 } 355 }
383 356
384 bool VrController::IsHorizontalGesture() { 357 bool VrController::IsHorizontalGesture() {
385 return std::abs(last_velocity_.x) > std::abs(last_velocity_.y); 358 return std::abs(last_velocity_.x()) > std::abs(last_velocity_.y());
386 } 359 }
387 360
388 bool VrController::InSlop(const gvr::Vec2f touch_position) { 361 bool VrController::InSlop(const gfx::Vector2dF touch_position) {
389 return (std::abs(touch_position.x - init_touch_point_->position.x) < 362 return (std::abs(touch_position.x() - init_touch_point_->position.x()) <
390 kSlopHorizontal) && 363 kSlopHorizontal) &&
391 (std::abs(touch_position.y - init_touch_point_->position.y) < 364 (std::abs(touch_position.y() - init_touch_point_->position.y()) <
392 kSlopVertical); 365 kSlopVertical);
393 } 366 }
394 367
395 void VrController::Reset() { 368 void VrController::Reset() {
396 // Reset state. 369 // Reset state.
397 state_ = WAITING; 370 state_ = WAITING;
398 371
399 // Reset the pointers. 372 // Reset the pointers.
400 prev_touch_point_.reset(new TouchPoint); 373 prev_touch_point_.reset(new TouchPoint);
401 cur_touch_point_.reset(new TouchPoint); 374 cur_touch_point_.reset(new TouchPoint);
402 init_touch_point_.reset(new TouchPoint); 375 init_touch_point_.reset(new TouchPoint);
403 touch_info_.reset(new TouchInfo); 376 touch_info_.reset(new TouchInfo);
404 Vector::SetZero(&overall_velocity_); 377 overall_velocity_ = {0, 0};
405 Vector::SetZero(&last_velocity_); 378 last_velocity_ = {0, 0};
406 } 379 }
407 380
408 void VrController::UpdateGestureParameters() { 381 void VrController::UpdateGestureParameters() {
409 displacement_ = Vector::Subtract(touch_info_->touch_point.position, 382 displacement_ =
410 prev_touch_point_->position); 383 touch_info_->touch_point.position - prev_touch_point_->position;
411 } 384 }
412 385
413 bool VrController::UpdateCurrentTouchpoint() { 386 bool VrController::UpdateCurrentTouchpoint() {
414 touch_info_->touch_up = TouchUpHappened(); 387 touch_info_->touch_up = TouchUpHappened();
415 touch_info_->touch_down = TouchDownHappened(); 388 touch_info_->touch_down = TouchDownHappened();
416 touch_info_->is_touching = IsTouching(); 389 touch_info_->is_touching = IsTouching();
417 touch_info_->touch_point.position.x = TouchPosX(); 390 touch_info_->touch_point.position.set_x(TouchPosX());
418 touch_info_->touch_point.position.y = TouchPosY(); 391 touch_info_->touch_point.position.set_y(TouchPosY());
419 Vector::ClampTouchpadPosition(&touch_info_->touch_point.position); 392 ClampTouchpadPosition(&touch_info_->touch_point.position);
420 touch_info_->touch_point.timestamp = 393 touch_info_->touch_point.timestamp =
421 gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos; 394 gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos;
422 395
423 if (IsTouching() || TouchUpHappened()) { 396 if (IsTouching() || TouchUpHappened()) {
424 // Update the touch point when the touch position has changed. 397 // Update the touch point when the touch position has changed.
425 if (!Vector::Equal(cur_touch_point_->position, 398 if (cur_touch_point_->position != touch_info_->touch_point.position) {
426 touch_info_->touch_point.position)) {
427 prev_touch_point_.swap(cur_touch_point_); 399 prev_touch_point_.swap(cur_touch_point_);
428 cur_touch_point_.reset(new TouchPoint); 400 cur_touch_point_.reset(new TouchPoint);
429 cur_touch_point_->position = touch_info_->touch_point.position; 401 cur_touch_point_->position = touch_info_->touch_point.position;
430 cur_touch_point_->timestamp = touch_info_->touch_point.timestamp; 402 cur_touch_point_->timestamp = touch_info_->touch_point.timestamp;
431 return true; 403 return true;
432 } 404 }
433 } 405 }
434 return false; 406 return false;
435 } 407 }
436 408
437 void VrController::UpdateOverallVelocity() { 409 void VrController::UpdateOverallVelocity() {
438 float duration = 410 float duration =
439 (touch_info_->touch_point.timestamp - prev_touch_point_->timestamp) / 411 (touch_info_->touch_point.timestamp - prev_touch_point_->timestamp) /
440 kNanoSecondsPerSecond; 412 kNanoSecondsPerSecond;
441 413
442 // If the timestamp does not change, do not update velocity. 414 // If the timestamp does not change, do not update velocity.
443 if (duration < kDelta) 415 if (duration < kDelta)
444 return; 416 return;
445 417
446 gvr::Vec2f displacement = Vector::Subtract(touch_info_->touch_point.position, 418 const gfx::Vector2dF& displacement =
447 prev_touch_point_->position); 419 touch_info_->touch_point.position - prev_touch_point_->position;
448 420
449 gvr::Vec2f velocity = Vector::ScalarMult(displacement, 1 / duration); 421 const gfx::Vector2dF& velocity = ScaleVector2d(displacement, (1 / duration));
450 422
451 float weight = duration / (kRC + duration); 423 float weight = duration / (kRC + duration);
452 424
453 overall_velocity_ = 425 overall_velocity_ = ScaleVector2d(overall_velocity_, (1 - weight)) +
454 Vector::Add(Vector::ScalarMult(overall_velocity_, 1 - weight), 426 ScaleVector2d(velocity, weight);
455 Vector::ScalarMult(velocity, weight));
456 } 427 }
457 428
458 } // namespace vr_shell 429 } // namespace vr_shell
OLDNEW
« no previous file with comments | « chrome/browser/android/vr_shell/vr_controller.h ('k') | chrome/browser/android/vr_shell/vr_gl_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698