Commit 76346c14 authored by Ian Vollick's avatar Ian Vollick Committed by Commit Bot

Revert "[vr] Ensure that hit testing uses the same stacking order as rendering"

This reverts commit 053d939f.

Reason for revert: Hit testing artifacts.

Original change's description:
> [vr] Ensure that hit testing uses the same stacking order as rendering
>
> The rendering code was updated to sort elements in tree rather than
> depth order in this cl:
> https://chromium-review.googlesource.com/c/chromium/src/+/727342
>
> The hit testing code, however, was not similarly updated. Consequently,
> there can be discrepancies. This CL updates the hit testing code to
> use nearly the same stacking order as rendering. Note: it is not quite
> perfect because the ui renderer still summons swaths of elements from
> the scene explicitly. Eventually, the ui renderer will simply sort
> and render all elements in the tree and these will be truly identical.
> However, until then, this ensures we do use the same element sorting
> routines.
>
> Bug: None
> Change-Id: I12483713f19b678aa9a69b91e5d910e408b73007
> Reviewed-on: https://chromium-review.googlesource.com/754554
> Reviewed-by: Michael Thiessen <mthiesse@chromium.org>
> Commit-Queue: Ian Vollick <vollick@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#514136}

TBR=vollick@chromium.org,mthiesse@chromium.org,cjgrant@chromium.org

Change-Id: I920d8ffcb2dc7aad53ed021d272302cad060f083
Reviewed-on: https://chromium-review.googlesource.com/763007
Commit-Queue: Ian Vollick <vollick@chromium.org>
Reviewed-by: default avatarIan Vollick <vollick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#515465}
parent e5592bcf
...@@ -6,12 +6,10 @@ ...@@ -6,12 +6,10 @@
#include <algorithm> #include <algorithm>
#include "base/containers/adapters.h"
#include "base/macros.h" #include "base/macros.h"
#include "chrome/browser/vr/elements/ui_element.h" #include "chrome/browser/vr/elements/ui_element.h"
#include "chrome/browser/vr/model/controller_model.h" #include "chrome/browser/vr/model/controller_model.h"
#include "chrome/browser/vr/model/reticle_model.h" #include "chrome/browser/vr/model/reticle_model.h"
#include "chrome/browser/vr/ui_renderer.h"
#include "chrome/browser/vr/ui_scene.h" #include "chrome/browser/vr/ui_scene.h"
// TODO(tiborg): Remove include once we use a generic type to pass scroll/fling // TODO(tiborg): Remove include once we use a generic type to pass scroll/fling
// gestures. // gestures.
...@@ -53,6 +51,7 @@ bool IsScrollEvent(const GestureList& list) { ...@@ -53,6 +51,7 @@ bool IsScrollEvent(const GestureList& list) {
bool GetTargetLocalPoint(const gfx::Vector3dF& eye_to_target, bool GetTargetLocalPoint(const gfx::Vector3dF& eye_to_target,
const UiElement& element, const UiElement& element,
float max_distance_to_plane,
gfx::PointF* out_target_local_point, gfx::PointF* out_target_local_point,
gfx::Point3F* out_target_point, gfx::Point3F* out_target_point,
float* out_distance_to_plane) { float* out_distance_to_plane) {
...@@ -60,7 +59,8 @@ bool GetTargetLocalPoint(const gfx::Vector3dF& eye_to_target, ...@@ -60,7 +59,8 @@ bool GetTargetLocalPoint(const gfx::Vector3dF& eye_to_target,
return false; return false;
} }
if (*out_distance_to_plane < 0) { if (*out_distance_to_plane < 0 ||
*out_distance_to_plane >= max_distance_to_plane) {
return false; return false;
} }
...@@ -74,6 +74,37 @@ bool GetTargetLocalPoint(const gfx::Vector3dF& eye_to_target, ...@@ -74,6 +74,37 @@ bool GetTargetLocalPoint(const gfx::Vector3dF& eye_to_target,
return true; return true;
} }
void HitTestElements(UiElement* element,
ReticleModel* reticle_model,
gfx::Vector3dF* out_eye_to_target,
float* out_closest_element_distance) {
for (auto& child : element->children()) {
HitTestElements(child.get(), reticle_model, out_eye_to_target,
out_closest_element_distance);
}
if (!element->IsHitTestable()) {
return;
}
gfx::PointF local_point;
gfx::Point3F plane_intersection_point;
float distance_to_plane;
if (!GetTargetLocalPoint(*out_eye_to_target, *element,
*out_closest_element_distance, &local_point,
&plane_intersection_point, &distance_to_plane)) {
return;
}
if (!element->HitTest(local_point)) {
return;
}
*out_closest_element_distance = distance_to_plane;
reticle_model->target_point = plane_intersection_point;
reticle_model->target_element_id = element->id();
reticle_model->target_local_point = local_point;
}
} // namespace } // namespace
UiInputManager::UiInputManager(UiScene* scene) : scene_(scene) {} UiInputManager::UiInputManager(UiScene* scene) : scene_(scene) {}
...@@ -99,6 +130,7 @@ void UiInputManager::HandleInput(base::TimeTicks current_time, ...@@ -99,6 +130,7 @@ void UiInputManager::HandleInput(base::TimeTicks current_time,
gfx::Point3F plane_intersection_point; gfx::Point3F plane_intersection_point;
float distance_to_plane; float distance_to_plane;
if (!GetTargetLocalPoint(eye_to_target, *target_element, if (!GetTargetLocalPoint(eye_to_target, *target_element,
2 * scene_->background_distance(),
&reticle_model->target_local_point, &reticle_model->target_local_point,
&plane_intersection_point, &distance_to_plane)) { &plane_intersection_point, &distance_to_plane)) {
reticle_model->target_local_point = kInvalidTargetPoint; reticle_model->target_local_point = kInvalidTargetPoint;
...@@ -371,37 +403,13 @@ void UiInputManager::GetVisualTargetElement( ...@@ -371,37 +403,13 @@ void UiInputManager::GetVisualTargetElement(
*out_eye_to_target = reticle_model->target_point - kOrigin; *out_eye_to_target = reticle_model->target_point - kOrigin;
out_eye_to_target->GetNormalized(out_eye_to_target); out_eye_to_target->GetNormalized(out_eye_to_target);
std::vector<const UiElement*> elements; // Determine which UI element (if any) intersects the line between the eyes
for (auto& element : scene_->root_element()) { // and the controller target position.
if (element.IsVisible()) { float closest_element_distance =
elements.push_back(&element); (reticle_model->target_point - kOrigin).Length();
}
}
std::vector<const UiElement*> sorted =
UiRenderer::GetElementsInDrawOrder(elements);
for (const auto* element : base::Reversed(sorted)) {
if (!element->IsHitTestable()) {
continue;
}
gfx::PointF local_point; HitTestElements(&scene_->root_element(), reticle_model, out_eye_to_target,
gfx::Point3F plane_intersection_point; &closest_element_distance);
float distance_to_plane;
if (!GetTargetLocalPoint(*out_eye_to_target, *element, &local_point,
&plane_intersection_point, &distance_to_plane)) {
continue;
}
if (!element->HitTest(local_point)) {
continue;
}
reticle_model->target_point = plane_intersection_point;
reticle_model->target_element_id = element->id();
reticle_model->target_local_point = local_point;
break;
}
} }
void UiInputManager::UpdateQuiescenceState( void UiInputManager::UpdateQuiescenceState(
......
...@@ -265,42 +265,6 @@ TEST_F(UiInputManagerContentTest, NoMouseMovesDuringClick) { ...@@ -265,42 +265,6 @@ TEST_F(UiInputManagerContentTest, NoMouseMovesDuringClick) {
&gesture_list); &gesture_list);
} }
TEST_F(UiInputManagerContentTest, TreeVsZOrder) {
EXPECT_TRUE(AnimateBy(MsToDelta(500)));
// It would be nice if the controller weren't platform specific and we could
// mock out the underlying sensor data. For now, we will hallucinate
// parameters to HandleInput.
UiElement* content_quad =
scene_->GetUiElementByName(UiElementName::kContentQuad);
gfx::Point3F content_quad_center;
content_quad->world_space_transform().TransformPoint(&content_quad_center);
gfx::Point3F origin;
ControllerModel controller_model;
controller_model.laser_direction = content_quad_center - origin;
controller_model.laser_origin = origin;
controller_model.touchpad_button_state = UiInputManager::ButtonState::DOWN;
ReticleModel reticle_model;
GestureList gesture_list;
input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
&gesture_list);
// We should have hit the content quad if our math was correct.
ASSERT_NE(0, reticle_model.target_element_id);
EXPECT_EQ(content_quad->id(), reticle_model.target_element_id);
// We will now move the content quad behind the backplane.
content_quad->SetTranslate(0, 0, -2.0 * kTextureOffset);
scene_->root_element().UpdateWorldSpaceTransformRecursive();
input_manager_->HandleInput(MsToTicks(1), controller_model, &reticle_model,
&gesture_list);
// We should have hit the content quad even though, geometrically, it stacks
// behind the backplane.
ASSERT_NE(0, reticle_model.target_element_id);
EXPECT_EQ(content_quad->id(), reticle_model.target_element_id);
}
TEST_F(UiInputManagerContentTest, ExitPromptHitTesting) { TEST_F(UiInputManagerContentTest, ExitPromptHitTesting) {
manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo); manager_->SetExitVrPromptEnabled(true, UiUnsupportedMode::kUnhandledPageInfo);
EXPECT_TRUE(AnimateBy(MsToDelta(500))); EXPECT_TRUE(AnimateBy(MsToDelta(500)));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment