| Index: chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| index 336d2b0472f4ce8c03bafe98d7629b20023598a8..c9585acc3c7ca41f33e27c276feb5e5796b4e3be 100644
|
| --- a/chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| +++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| @@ -40,9 +40,6 @@ static constexpr int64_t kPredictionTimeWithoutVsyncNanos = 50000000;
|
| static constexpr float kZNear = 0.1f;
|
| static constexpr float kZFar = 1000.0f;
|
|
|
| -// Screen angle in degrees. 0 = vertical, positive = top closer.
|
| -static constexpr float kDesktopScreenTiltDefault = 0;
|
| -
|
| static constexpr float kReticleWidth = 0.025f;
|
| static constexpr float kReticleHeight = 0.025f;
|
|
|
| @@ -488,50 +485,56 @@ void VrShellGl::UpdateController(const gvr::Vec3f& forward_vector) {
|
| // Determine which UI element (if any) intersects the line between the eyes
|
| // and the controller target position.
|
| float closest_element_distance = VectorLength(target_point_);
|
| - int pixel_x = 0;
|
| - int pixel_y = 0;
|
| target_element_ = nullptr;
|
| + float target_x;
|
| + float target_y;
|
|
|
| for (const auto& plane : scene_->GetUiElements()) {
|
| if (!plane->IsHitTestable())
|
| continue;
|
|
|
| - float distance_to_plane = plane->GetRayDistance(kOrigin, eye_to_target);
|
| - gvr::Vec3f plane_intersection_point =
|
| - GetRayPoint(kOrigin, eye_to_target, distance_to_plane);
|
| + float distance_to_plane;
|
| + if (!plane->GetRayDistance(kOrigin, eye_to_target, &distance_to_plane))
|
| + continue;
|
|
|
| - gvr::Vec3f rect_2d_point =
|
| - MatrixVectorMul(plane->transform.from_world, plane_intersection_point);
|
| - if (distance_to_plane < 0 ||
|
| - distance_to_plane >= closest_element_distance) {
|
| + if (distance_to_plane < 0 || distance_to_plane >= closest_element_distance)
|
| continue;
|
| - }
|
|
|
| - float x = rect_2d_point.x + 0.5f;
|
| - float y = 0.5f - rect_2d_point.y;
|
| - bool is_inside = x >= 0.0f && x < 1.0f && y >= 0.0f && y < 1.0f;
|
| - if (!is_inside)
|
| + gvr::Vec3f plane_intersection_point =
|
| + GetRayPoint(kOrigin, eye_to_target, distance_to_plane);
|
| + gvr::Vec2f unit_xy_point =
|
| + plane->GetUnitRectangleCoordinates(plane_intersection_point);
|
| +
|
| + float x = 0.5f + unit_xy_point.x;
|
| + float y = 0.5f - unit_xy_point.y;
|
| + if (x < 0.0f || x >= 1.0f || y < 0.0f || y >= 1.0f)
|
| continue;
|
|
|
| closest_element_distance = distance_to_plane;
|
| - Rectf pixel_rect;
|
| - if (plane->fill == Fill::CONTENT) {
|
| - pixel_rect = {0, 0, content_tex_css_width_, content_tex_css_height_};
|
| - } else {
|
| - pixel_rect = {plane->copy_rect.x, plane->copy_rect.y,
|
| - plane->copy_rect.width, plane->copy_rect.height};
|
| - }
|
| - pixel_x = pixel_rect.width * x + pixel_rect.x;
|
| - pixel_y = pixel_rect.height * y + pixel_rect.y;
|
| -
|
| target_point_ = plane_intersection_point;
|
| target_element_ = plane.get();
|
| + target_x = x;
|
| + target_y = y;
|
| }
|
|
|
| // Treat UI elements, which do not show web content, as NONE input
|
| // targets since they cannot make use of the input anyway.
|
| InputTarget input_target = InputTarget::NONE;
|
| + int pixel_x = 0;
|
| + int pixel_y = 0;
|
| +
|
| if (target_element_ != nullptr) {
|
| + Rectf pixel_rect;
|
| + if (target_element_->fill == Fill::CONTENT) {
|
| + pixel_rect = {0, 0, content_tex_css_width_, content_tex_css_height_};
|
| + } else {
|
| + pixel_rect = {target_element_->copy_rect.x, target_element_->copy_rect.y,
|
| + target_element_->copy_rect.width,
|
| + target_element_->copy_rect.height};
|
| + }
|
| + pixel_x = pixel_rect.x + pixel_rect.width * target_x;
|
| + pixel_y = pixel_rect.y + pixel_rect.height * target_y;
|
| +
|
| switch (target_element_->fill) {
|
| case Fill::CONTENT:
|
| input_target = InputTarget::CONTENT;
|
| @@ -540,7 +543,6 @@ void VrShellGl::UpdateController(const gvr::Vec3f& forward_vector) {
|
| input_target = InputTarget::UI;
|
| break;
|
| default:
|
| - input_target = InputTarget::NONE;
|
| break;
|
| }
|
| }
|
| @@ -708,8 +710,7 @@ void VrShellGl::DrawFrame() {
|
| }
|
|
|
| // Update the render position of all UI elements (including desktop).
|
| - const float screen_tilt = kDesktopScreenTiltDefault * M_PI / 180.0f;
|
| - scene_->UpdateTransforms(screen_tilt, TimeInMicroseconds());
|
| + scene_->UpdateTransforms(TimeInMicroseconds());
|
|
|
| UpdateController(GetForwardVector(head_pose));
|
|
|
| @@ -834,8 +835,7 @@ void VrShellGl::DrawElements(
|
| const gvr::Mat4f& view_matrix,
|
| const std::vector<const ContentRectangle*>& elements) {
|
| for (const auto* rect : elements) {
|
| - gvr::Mat4f transform =
|
| - MatrixMul(view_proj_matrix, rect->transform.to_world);
|
| + gvr::Mat4f transform = MatrixMul(view_proj_matrix, rect->TransformMatrix());
|
|
|
| switch (rect->fill) {
|
| case Fill::SPRITE: {
|
| @@ -890,7 +890,7 @@ std::vector<const ContentRectangle*> VrShellGl::GetElementsInDrawOrder(
|
|
|
| for (const auto* element : elements) {
|
| // Distance is the abs(z) value in view space.
|
| - gvr::Vec3f element_position = GetTranslation(element->transform.to_world);
|
| + gvr::Vec3f element_position = GetTranslation(element->TransformMatrix());
|
| float distance =
|
| std::fabs(MatrixVectorMul(view_matrix, element_position).z);
|
| zOrderedElementPairs.push_back(std::make_pair(distance, element));
|
|
|