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

Unified 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 side-by-side diff with in-line comments
Download patch
« 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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/android/vr_shell/vr_controller.cc
diff --git a/chrome/browser/android/vr_shell/vr_controller.cc b/chrome/browser/android/vr_shell/vr_controller.cc
index 25228b93be69b4c57999c7665cb8c2b94ccc94ff..177b3b6e1020e97daff0345751969ec81e2c5455 100644
--- a/chrome/browser/android/vr_shell/vr_controller.cc
+++ b/chrome/browser/android/vr_shell/vr_controller.cc
@@ -10,7 +10,7 @@
#include "base/logging.h"
#include "base/time/time.h"
-#include "chrome/browser/android/vr_shell/vr_math.h"
+#include "device/vr/vr_math.h"
#include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr.h"
#include "third_party/gvr-android-sdk/src/libraries/headers/vr/gvr/capi/include/gvr_controller.h"
@@ -41,46 +41,12 @@ constexpr float kNanoSecondsPerSecond = 1.0e9f;
constexpr int kMaxNumOfExtrapolations = 2;
-static constexpr gvr::Vec3f kControllerPosition = {0.2f, -0.5f, -0.15f};
+static constexpr gfx::Point3F kControllerPosition = {0.2f, -0.5f, -0.15f};
-class Vector {
- public:
- static inline void ClampTouchpadPosition(gvr::Vec2f* position) {
- position->x = std::min(std::max(0.0f, position->x), 1.0f);
- position->y = std::min(std::max(0.0f, position->y), 1.0f);
- }
-
- static inline void SetZero(gvr::Vec2f* v) {
- v->x = 0;
- v->y = 0;
- }
-
- static inline gvr::Vec2f Subtract(gvr::Vec2f v1, gvr::Vec2f v2) {
- gvr::Vec2f result;
- result.x = v1.x - v2.x;
- result.y = v1.y - v2.y;
- return result;
- }
-
- static inline gvr::Vec2f Add(gvr::Vec2f v1, gvr::Vec2f v2) {
- gvr::Vec2f result;
- result.x = v1.x + v2.x;
- result.y = v1.y + v2.y;
- return result;
- }
-
- static inline bool Equal(const gvr::Vec2f v1, const gvr::Vec2f v2) {
- return (std::abs(v1.x - v2.x) < kDelta) && (std::abs(v1.y - v2.y) < kDelta);
- }
-
- static inline gvr::Vec2f ScalarMult(gvr::Vec2f v, float scalar) {
- gvr::Vec2f vect_prod;
- vect_prod.x = v.x * scalar;
- vect_prod.y = v.y * scalar;
- return vect_prod;
- }
-
-}; // Vector
+void ClampTouchpadPosition(gfx::Vector2dF* position) {
+ position->set_x(std::min(std::max(0.0f, position->x()), 1.0f));
+ position->set_y(std::min(std::max(0.0f, position->y()), 1.0f));
+}
} // namespace
@@ -108,13 +74,19 @@ device::GvrGamepadData VrController::GetGamepadData() {
device::GvrGamepadData pad;
pad.timestamp = controller_state_->GetLastOrientationTimestamp();
- pad.touch_pos = controller_state_->GetTouchPos();
- pad.orientation = controller_state_->GetOrientation();
+ pad.touch_pos.set_x(TouchPosX());
+ pad.touch_pos.set_y(TouchPosY());
+ pad.orientation = Orientation();
// Use orientation to rotate acceleration/gyro into seated space.
- gvr::Mat4f pose_mat = QuatToMatrix(pad.orientation);
- pad.accel = MatrixVectorMul(pose_mat, controller_state_->GetAccel());
- pad.gyro = MatrixVectorMul(pose_mat, controller_state_->GetGyro());
+ vr::Mat4f pose_mat;
+ vr::QuatToMatrix(pad.orientation, &pose_mat);
+ const gvr::Vec3f& accel = controller_state_->GetAccel();
+ const gvr::Vec3f& gyro = controller_state_->GetGyro();
+ pad.accel =
+ vr::MatrixVectorMul(pose_mat, gfx::Vector3dF(accel.x, accel.y, accel.z));
+ pad.gyro =
+ vr::MatrixVectorMul(pose_mat, gfx::Vector3dF(gyro.x, gyro.y, gyro.z));
pad.is_touching = controller_state_->IsTouching();
pad.controller_button_pressed =
@@ -136,22 +108,24 @@ float VrController::TouchPosY() {
return controller_state_->GetTouchPos().y;
}
-gvr::Quatf VrController::Orientation() const {
- return controller_state_->GetOrientation();
+vr::Quatf VrController::Orientation() const {
+ const gvr::Quatf& orientation = controller_state_->GetOrientation();
+ return *reinterpret_cast<vr::Quatf*>(const_cast<gvr::Quatf*>(&orientation));
}
-gvr::Mat4f VrController::GetTransform() const {
+void VrController::GetTransform(vr::Mat4f* out) const {
// TODO(acondor): Position and orientation needs to be obtained
// from an elbow model.
// Placing the controller in a fixed position for now.
- gvr::Mat4f mat;
- SetIdentityM(mat);
+ vr::SetIdentityM(out);
// Changing rotation point.
- TranslateM(mat, mat, 0, 0, 0.05);
- mat = MatrixMul(QuatToMatrix(Orientation()), mat);
- TranslateM(mat, mat, kControllerPosition.x, kControllerPosition.y,
- kControllerPosition.z - 0.05);
- return mat;
+ vr::TranslateM(*out, gfx::Vector3dF(0, 0, 0.05), out);
+ vr::Mat4f quat_to_matrix;
+ vr::QuatToMatrix(Orientation(), &quat_to_matrix);
+ vr::MatrixMul(quat_to_matrix, *out, out);
+ gfx::Vector3dF translation(kControllerPosition.x(), kControllerPosition.y(),
+ kControllerPosition.z() - 0.05);
+ vr::TranslateM(*out, translation, out);
}
VrControllerModel::State VrController::GetModelState() const {
@@ -206,8 +180,7 @@ void VrController::UpdateTouchInfo() {
CHECK(touch_info_ != nullptr) << "touch_info_ not initialized properly.";
if (IsTouching() && state_ == SCROLLING &&
(controller_state_->GetLastTouchTimestamp() == last_touch_timestamp_ ||
- (Vector::Equal(cur_touch_point_->position,
- prev_touch_point_->position) &&
+ (cur_touch_point_->position == prev_touch_point_->position &&
extrapolated_touch_ < kMaxNumOfExtrapolations))) {
extrapolated_touch_++;
touch_position_changed_ = true;
@@ -216,13 +189,13 @@ void VrController::UpdateTouchInfo() {
(gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos -
last_timestamp_nanos_) /
kNanoSecondsPerSecond;
- touch_info_->touch_point.position.x =
- cur_touch_point_->position.x + overall_velocity_.x * duration;
- touch_info_->touch_point.position.y =
- cur_touch_point_->position.y + overall_velocity_.y * duration;
+ touch_info_->touch_point.position.set_x(cur_touch_point_->position.x() +
+ overall_velocity_.x() * duration);
+ touch_info_->touch_point.position.set_y(cur_touch_point_->position.y() +
+ overall_velocity_.y() * duration);
} else {
if (extrapolated_touch_ == kMaxNumOfExtrapolations) {
- Vector::SetZero(&overall_velocity_);
+ overall_velocity_ = {0, 0};
}
extrapolated_touch_ = 0;
}
@@ -279,17 +252,17 @@ std::vector<std::unique_ptr<WebGestureEvent>> VrController::DetectGestures() {
if (gesture_list.back()->GetType() == WebInputEvent::kGestureScrollEnd) {
if (!ButtonDownHappened(gvr::kControllerButtonClick) &&
- (last_velocity_.x != 0.0 || last_velocity_.y != 0.0)) {
+ (last_velocity_.x() != 0.0 || last_velocity_.y() != 0.0)) {
std::unique_ptr<WebGestureEvent> fling(new WebGestureEvent(
WebInputEvent::kGestureFlingStart, WebInputEvent::kNoModifiers,
gesture_list.back()->TimeStampSeconds()));
fling->source_device = blink::kWebGestureDeviceTouchpad;
if (IsHorizontalGesture()) {
fling->data.fling_start.velocity_x =
- last_velocity_.x * kDisplacementScaleFactor;
+ last_velocity_.x() * kDisplacementScaleFactor;
} else {
fling->data.fling_start.velocity_y =
- last_velocity_.y * kDisplacementScaleFactor;
+ last_velocity_.y() * kDisplacementScaleFactor;
}
gesture_list.push_back(std::move(fling));
}
@@ -352,9 +325,9 @@ void VrController::HandleDetectingState(WebGestureEvent* gesture) {
gesture->SetType(WebInputEvent::kGestureScrollBegin);
UpdateGestureParameters();
gesture->data.scroll_begin.delta_x_hint =
- displacement_.x * kDisplacementScaleFactor;
+ displacement_.x() * kDisplacementScaleFactor;
gesture->data.scroll_begin.delta_y_hint =
- displacement_.y * kDisplacementScaleFactor;
+ displacement_.y() * kDisplacementScaleFactor;
gesture->data.scroll_begin.delta_hint_units =
blink::WebGestureEvent::ScrollUnits::kPrecisePixels;
}
@@ -372,23 +345,23 @@ void VrController::HandleScrollingState(WebGestureEvent* gesture) {
UpdateGestureParameters();
if (IsHorizontalGesture()) {
gesture->data.scroll_update.delta_x =
- displacement_.x * kDisplacementScaleFactor;
+ displacement_.x() * kDisplacementScaleFactor;
} else {
gesture->data.scroll_update.delta_y =
- displacement_.y * kDisplacementScaleFactor;
+ displacement_.y() * kDisplacementScaleFactor;
}
last_velocity_ = overall_velocity_;
}
}
bool VrController::IsHorizontalGesture() {
- return std::abs(last_velocity_.x) > std::abs(last_velocity_.y);
+ return std::abs(last_velocity_.x()) > std::abs(last_velocity_.y());
}
-bool VrController::InSlop(const gvr::Vec2f touch_position) {
- return (std::abs(touch_position.x - init_touch_point_->position.x) <
+bool VrController::InSlop(const gfx::Vector2dF touch_position) {
+ return (std::abs(touch_position.x() - init_touch_point_->position.x()) <
kSlopHorizontal) &&
- (std::abs(touch_position.y - init_touch_point_->position.y) <
+ (std::abs(touch_position.y() - init_touch_point_->position.y()) <
kSlopVertical);
}
@@ -401,29 +374,28 @@ void VrController::Reset() {
cur_touch_point_.reset(new TouchPoint);
init_touch_point_.reset(new TouchPoint);
touch_info_.reset(new TouchInfo);
- Vector::SetZero(&overall_velocity_);
- Vector::SetZero(&last_velocity_);
+ overall_velocity_ = {0, 0};
+ last_velocity_ = {0, 0};
}
void VrController::UpdateGestureParameters() {
- displacement_ = Vector::Subtract(touch_info_->touch_point.position,
- prev_touch_point_->position);
+ displacement_ =
+ touch_info_->touch_point.position - prev_touch_point_->position;
}
bool VrController::UpdateCurrentTouchpoint() {
touch_info_->touch_up = TouchUpHappened();
touch_info_->touch_down = TouchDownHappened();
touch_info_->is_touching = IsTouching();
- touch_info_->touch_point.position.x = TouchPosX();
- touch_info_->touch_point.position.y = TouchPosY();
- Vector::ClampTouchpadPosition(&touch_info_->touch_point.position);
+ touch_info_->touch_point.position.set_x(TouchPosX());
+ touch_info_->touch_point.position.set_y(TouchPosY());
+ ClampTouchpadPosition(&touch_info_->touch_point.position);
touch_info_->touch_point.timestamp =
gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos;
if (IsTouching() || TouchUpHappened()) {
// Update the touch point when the touch position has changed.
- if (!Vector::Equal(cur_touch_point_->position,
- touch_info_->touch_point.position)) {
+ if (cur_touch_point_->position != touch_info_->touch_point.position) {
prev_touch_point_.swap(cur_touch_point_);
cur_touch_point_.reset(new TouchPoint);
cur_touch_point_->position = touch_info_->touch_point.position;
@@ -443,16 +415,15 @@ void VrController::UpdateOverallVelocity() {
if (duration < kDelta)
return;
- gvr::Vec2f displacement = Vector::Subtract(touch_info_->touch_point.position,
- prev_touch_point_->position);
+ const gfx::Vector2dF& displacement =
+ touch_info_->touch_point.position - prev_touch_point_->position;
- gvr::Vec2f velocity = Vector::ScalarMult(displacement, 1 / duration);
+ const gfx::Vector2dF& velocity = ScaleVector2d(displacement, (1 / duration));
float weight = duration / (kRC + duration);
- overall_velocity_ =
- Vector::Add(Vector::ScalarMult(overall_velocity_, 1 - weight),
- Vector::ScalarMult(velocity, weight));
+ overall_velocity_ = ScaleVector2d(overall_velocity_, (1 - weight)) +
+ ScaleVector2d(velocity, weight);
}
} // namespace vr_shell
« 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