| Index: chrome/browser/android/vr_shell/vr_shell.cc
|
| diff --git a/chrome/browser/android/vr_shell/vr_shell.cc b/chrome/browser/android/vr_shell/vr_shell.cc
|
| index 62c7a1dcbbd5f7719de1f23f088dfb4124892a00..8900a45abb60bfae03667cf025f9b79beaa4552b 100644
|
| --- a/chrome/browser/android/vr_shell/vr_shell.cc
|
| +++ b/chrome/browser/android/vr_shell/vr_shell.cc
|
| @@ -38,15 +38,9 @@ static constexpr long kPredictionTimeWithoutVsyncNanos = 50000000;
|
| static constexpr float kZNear = 0.1f;
|
| static constexpr float kZFar = 1000.0f;
|
|
|
| -static constexpr gvr::Vec3f kDesktopPositionDefault = {0.0f, 0.0f, -2.0f};
|
| -static constexpr float kDesktopHeightDefault = 1.6f;
|
| -
|
| // Screen angle in degrees. 0 = vertical, positive = top closer.
|
| static constexpr float kDesktopScreenTiltDefault = 0;
|
|
|
| -static constexpr float kScreenHeightRatio = 1.0f;
|
| -static constexpr float kScreenWidthRatio = 16.0f / 9.0f;
|
| -
|
| static constexpr float kReticleWidth = 0.025f;
|
| static constexpr float kReticleHeight = 0.025f;
|
|
|
| @@ -61,6 +55,10 @@ static constexpr gvr::Vec3f kOrigin = {0.0f, 0.0f, 0.0f};
|
| // TODO(mthiesse): Handedness options.
|
| static constexpr gvr::Vec3f kHandPosition = {0.2f, -0.5f, -0.2f};
|
|
|
| +// If there is no content quad, and the reticle isn't hitting another element,
|
| +// draw the reticle at this distance.
|
| +static constexpr float kDefaultReticleDistance = 2.0f;
|
| +
|
| // Fraction of the distance to the object the cursor is drawn at to avoid
|
| // rounding errors drawing the cursor behind the object.
|
| static constexpr float kReticleOffset = 0.99f;
|
| @@ -70,9 +68,6 @@ static constexpr float kReticleOffset = 0.99f;
|
| // adjust according to content quad placement.
|
| static constexpr float kReticleDistanceMultiplier = 1.5f;
|
|
|
| -// UI element 0 is the browser content rectangle.
|
| -static constexpr int kBrowserUiElementId = 0;
|
| -
|
| static constexpr int kFramePrimaryBuffer = 0;
|
| static constexpr int kFrameHeadlockedBuffer = 1;
|
|
|
| @@ -120,9 +115,7 @@ VrShell::VrShell(JNIEnv* env, jobject obj,
|
| ui::WindowAndroid* content_window,
|
| content::WebContents* ui_contents,
|
| ui::WindowAndroid* ui_window)
|
| - : desktop_screen_tilt_(kDesktopScreenTiltDefault),
|
| - desktop_height_(kDesktopHeightDefault),
|
| - main_contents_(main_contents),
|
| + : main_contents_(main_contents),
|
| ui_contents_(ui_contents),
|
| weak_ptr_factory_(this) {
|
| DCHECK(g_instance == nullptr);
|
| @@ -133,14 +126,6 @@ VrShell::VrShell(JNIEnv* env, jobject obj,
|
| content_compositor_.reset(new VrCompositor(content_window, false));
|
| ui_compositor_.reset(new VrCompositor(ui_window, true));
|
|
|
| - float screen_width = kScreenWidthRatio * desktop_height_;
|
| - float screen_height = kScreenHeightRatio * desktop_height_;
|
| - std::unique_ptr<ContentRectangle> rect(new ContentRectangle());
|
| - rect->id = kBrowserUiElementId;
|
| - rect->size = {screen_width, screen_height, 1.0f};
|
| - rect->translation = kDesktopPositionDefault;
|
| - scene_->AddUiElement(rect);
|
| -
|
| LoadUIContent();
|
|
|
| gvr::Mat4f identity;
|
| @@ -289,13 +274,6 @@ void VrShell::UpdateController(const gvr::Vec3f& forward_vector) {
|
| gvr::Vec3f forward = MatrixVectorMul(mat, ergo_neutral_pose);
|
| gvr::Vec3f origin = kHandPosition;
|
|
|
| - target_element_ = nullptr;
|
| -
|
| - ContentRectangle* content_plane =
|
| - scene_->GetUiElementById(kBrowserUiElementId);
|
| -
|
| - float distance = content_plane->GetRayDistance(origin, forward);
|
| -
|
| // If we place the reticle based on elements intersecting the controller beam,
|
| // we can end up with the reticle hiding behind elements, or jumping laterally
|
| // in the field of view. This is physically correct, but hard to use. For
|
| @@ -313,12 +291,18 @@ void VrShell::UpdateController(const gvr::Vec3f& forward_vector) {
|
| // in other directions. Note that this approach uses distance from controller,
|
| // rather than eye, for simplicity. This will make the sphere slightly
|
| // off-center.
|
| - gvr::Vec3f corner = {0.5f, 0.5f, 0.0f};
|
| - corner = MatrixVectorMul(content_plane->transform.to_world, corner);
|
| - float max_distance = Distance(origin, corner) * kReticleDistanceMultiplier;
|
| - if (distance > max_distance || distance <= 0.0f) {
|
| - distance = max_distance;
|
| + float distance = kDefaultReticleDistance;
|
| + ContentRectangle* content_plane = scene_->GetContentQuad();
|
| + if (content_plane) {
|
| + distance = content_plane->GetRayDistance(origin, forward);
|
| + gvr::Vec3f corner = {0.5f, 0.5f, 0.0f};
|
| + corner = MatrixVectorMul(content_plane->transform.to_world, corner);
|
| + float max_distance = Distance(origin, corner) * kReticleDistanceMultiplier;
|
| + if (distance > max_distance || distance <= 0.0f) {
|
| + distance = max_distance;
|
| + }
|
| }
|
| +
|
| target_point_ = GetRayPoint(origin, forward, distance);
|
| gvr::Vec3f eye_to_target = target_point_;
|
| NormalizeVector(eye_to_target);
|
| @@ -328,6 +312,7 @@ void VrShell::UpdateController(const gvr::Vec3f& forward_vector) {
|
| float closest_element_distance = std::numeric_limits<float>::infinity();
|
| int pixel_x = 0;
|
| int pixel_y = 0;
|
| + target_element_ = nullptr;
|
| VrInputManager* input_target = nullptr;
|
|
|
| for (std::size_t i = 0; i < scene_->GetUiElements().size(); ++i) {
|
| @@ -354,8 +339,8 @@ void VrShell::UpdateController(const gvr::Vec3f& forward_vector) {
|
|
|
| target_point_ = plane_intersection_point;
|
| target_element_ = plane;
|
| - input_target = (plane->id == kBrowserUiElementId)
|
| - ? content_input_manager_.get() : ui_input_manager_.get();
|
| + input_target = plane->content_quad ? content_input_manager_.get() :
|
| + ui_input_manager_.get();
|
| }
|
| }
|
| }
|
| @@ -430,7 +415,7 @@ void VrShell::DrawFrame(JNIEnv* env, const JavaParamRef<jobject>& obj) {
|
| HandleQueuedTasks();
|
|
|
| // Update the render position of all UI elements (including desktop).
|
| - float screen_tilt = desktop_screen_tilt_ * M_PI / 180.0f;
|
| + const float screen_tilt = kDesktopScreenTiltDefault * M_PI / 180.0f;
|
| scene_->UpdateTransforms(screen_tilt, UiScene::TimeInMicroseconds());
|
|
|
| UpdateController(GetForwardVector(head_pose));
|
| @@ -465,9 +450,6 @@ void VrShell::DrawVrShell(const gvr::Mat4f& head_pose,
|
| if (!rect->visible) {
|
| continue;
|
| }
|
| - if (webvr_mode_ && rect->id == kBrowserUiElementId) {
|
| - continue;
|
| - }
|
| if (rect->lock_to_fov) {
|
| head_locked_elements.push_back(rect.get());
|
| } else {
|
| @@ -543,7 +525,7 @@ void VrShell::DrawElements(
|
| for (const auto& rect : elements) {
|
| Rectf copy_rect;
|
| jint texture_handle;
|
| - if (rect->id == kBrowserUiElementId) {
|
| + if (rect->content_quad) {
|
| copy_rect = {0, 0, 1, 1};
|
| texture_handle = content_texture_id_;
|
| } else {
|
| @@ -729,12 +711,6 @@ void VrShell::ContentSurfaceChanged(JNIEnv* env,
|
| jint height,
|
| const JavaParamRef<jobject>& surface) {
|
| content_compositor_->SurfaceChanged((int)width, (int)height, surface);
|
| - content::ScreenInfo result;
|
| - main_contents_->GetRenderWidgetHostView()->GetRenderWidgetHost()->
|
| - GetScreenInfo(&result);
|
| - float dpr = result.device_scale_factor;
|
| - scene_->GetUiElementById(kBrowserUiElementId)->copy_rect =
|
| - { 0, 0, width / dpr, height / dpr };
|
| }
|
|
|
| void VrShell::UiSurfaceChanged(JNIEnv* env,
|
|
|