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 177b3b6e1020e97daff0345751969ec81e2c5455..89584100cf1dfd1b731c699ed3fa9d71c66a22b0 100644 |
--- a/chrome/browser/android/vr_shell/vr_controller.cc |
+++ b/chrome/browser/android/vr_shell/vr_controller.cc |
@@ -9,7 +9,9 @@ |
#include <utility> |
#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
#include "base/time/time.h" |
+#include "chrome/browser/android/vr_shell/elbow_model.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,11 +43,18 @@ constexpr float kNanoSecondsPerSecond = 1.0e9f; |
constexpr int kMaxNumOfExtrapolations = 2; |
-static constexpr gfx::Point3F kControllerPosition = {0.2f, -0.5f, -0.15f}; |
+// Distance from the center of the controller to start rendering the laser. |
+constexpr float kLaserStartDisplacement = 0.045; |
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)); |
+ position->set_x(vr::Clampf(position->x(), 0.0f, 1.0f)); |
+ position->set_y(vr::Clampf(position->y(), 0.0f, 1.0f)); |
+} |
+ |
+float DeltaTimeSeconds(int64_t last_timestamp_nanos) { |
+ return (gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos - |
+ last_timestamp_nanos) / |
+ kNanoSecondsPerSecond; |
} |
} // namespace |
@@ -53,7 +62,10 @@ void ClampTouchpadPosition(gfx::Vector2dF* position) { |
VrController::VrController(gvr_context* vr_context) { |
DVLOG(1) << __FUNCTION__ << "=" << this; |
Initialize(vr_context); |
+ elbow_model_ = base::MakeUnique<ElbowModel>(handedness_); |
Reset(); |
+ last_timestamp_nanos_ = |
+ gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos; |
} |
VrController::~VrController() { |
@@ -114,18 +126,24 @@ vr::Quatf VrController::Orientation() 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. |
- vr::SetIdentityM(out); |
- // Changing rotation point. |
- 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); |
+ QuatToMatrix(elbow_model_->GetControllerRotation(), out); |
+ auto position = elbow_model_->GetControllerPosition(); |
+ vr::TranslateM(*out, vr::ToVector(position), out); |
+} |
+ |
+float VrController::GetOpacity() const { |
+ return elbow_model_->GetAlphaValue(); |
+} |
+ |
+gfx::Point3F VrController::GetPointerStart() const { |
+ auto controller_position = elbow_model_->GetControllerPosition(); |
+ gfx::Vector3dF pointer_direction{0.0f, -sin(kErgoAngleOffset), |
+ -cos(kErgoAngleOffset)}; |
+ vr::Mat4f rotation_mat; |
+ vr::QuatToMatrix(Orientation(), &rotation_mat); |
+ pointer_direction = vr::MatrixVectorRotate(rotation_mat, pointer_direction); |
+ return controller_position + |
+ gfx::ScaleVector3d(pointer_direction, kLaserStartDisplacement); |
} |
VrControllerModel::State VrController::GetModelState() const { |
@@ -162,7 +180,7 @@ bool VrController::IsConnected() { |
return controller_state_->GetConnectionState() == gvr::kControllerConnected; |
} |
-void VrController::UpdateState() { |
+void VrController::UpdateState(const gfx::Vector3dF& head_direction) { |
const int32_t old_status = controller_state_->GetApiStatus(); |
const int32_t old_connection_state = controller_state_->GetConnectionState(); |
// Read current controller state. |
@@ -174,6 +192,12 @@ void VrController::UpdateState() { |
<< gvr_controller_connection_state_to_string( |
controller_state_->GetConnectionState()); |
} |
+ |
+ const gvr::Vec3f& gvr_gyro = controller_state_->GetGyro(); |
+ elbow_model_->Update({IsConnected(), Orientation(), |
+ gfx::Vector3dF(gvr_gyro.x, gvr_gyro.y, gvr_gyro.z), |
+ head_direction, |
+ DeltaTimeSeconds(last_timestamp_nanos_)}); |
} |
void VrController::UpdateTouchInfo() { |
@@ -185,10 +209,7 @@ void VrController::UpdateTouchInfo() { |
extrapolated_touch_++; |
touch_position_changed_ = true; |
// Fill the touch_info |
- float duration = |
- (gvr::GvrApi::GetTimePointNow().monotonic_system_time_nanos - |
- last_timestamp_nanos_) / |
- kNanoSecondsPerSecond; |
+ float duration = DeltaTimeSeconds(last_timestamp_nanos_); |
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() + |