Commit cd8d48e7 authored by Christopher Grant's avatar Christopher Grant Committed by Commit Bot

VR: Clean up selection of hit-testable elements.

This furthers previous lifecycle framework cleanup, and fixes an
outstanding technical-debt bug in the process.

BUG=768079
R=ymalik

Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_vr
Change-Id: I6743ed68e16f437d68ccc27849f3694af347617a
Reviewed-on: https://chromium-review.googlesource.com/1015645
Commit-Queue: Christopher Grant <cjgrant@chromium.org>
Reviewed-by: default avatarYash Malik <ymalik@chromium.org>
Cr-Commit-Position: refs/heads/master@{#553664}
parent e0c32460
...@@ -1658,7 +1658,7 @@ void VrShellGl::DrawIntoAcquiredFrame(int16_t frame_index, ...@@ -1658,7 +1658,7 @@ void VrShellGl::DrawIntoAcquiredFrame(int16_t frame_index,
std::vector<const UiElement*> overlay_elements; std::vector<const UiElement*> overlay_elements;
if (is_webvr_frame) { if (is_webvr_frame) {
overlay_elements = ui_->scene()->GetVisibleWebVrOverlayElementsToDraw(); overlay_elements = ui_->scene()->GetWebVrOverlayElementsToDraw();
} }
TRACE_COUNTER1("gpu", "VR overlay element count", overlay_elements.size()); TRACE_COUNTER1("gpu", "VR overlay element count", overlay_elements.size());
......
...@@ -60,14 +60,12 @@ bool IsScrollEvent(const GestureList& list) { ...@@ -60,14 +60,12 @@ bool IsScrollEvent(const GestureList& list) {
void HitTestElements(UiScene* scene, void HitTestElements(UiScene* scene,
ReticleModel* reticle_model, ReticleModel* reticle_model,
HitTestRequest* request) { HitTestRequest* request) {
std::vector<const UiElement*> elements = scene->GetVisibleElements(); std::vector<const UiElement*> elements = scene->GetElementsToHitTest();
std::vector<const UiElement*> sorted = std::vector<const UiElement*> sorted =
UiRenderer::GetElementsInDrawOrder(elements); UiRenderer::GetElementsInDrawOrder(elements);
for (const auto* element : base::Reversed(sorted)) { for (const auto* element : base::Reversed(sorted)) {
if (!element->IsHitTestable()) { DCHECK(element->IsHitTestable());
continue;
}
HitTestResult result; HitTestResult result;
element->HitTest(*request, &result); element->HitTest(*request, &result);
......
...@@ -22,7 +22,7 @@ UiRenderer::~UiRenderer() = default; ...@@ -22,7 +22,7 @@ UiRenderer::~UiRenderer() = default;
// itself correctly. // itself correctly.
void UiRenderer::Draw(const RenderInfo& render_info) { void UiRenderer::Draw(const RenderInfo& render_info) {
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
DrawUiView(render_info, scene_->GetVisibleElementsToDraw()); DrawUiView(render_info, scene_->GetElementsToDraw());
} }
void UiRenderer::DrawWebVrOverlayForeground(const RenderInfo& render_info) { void UiRenderer::DrawWebVrOverlayForeground(const RenderInfo& render_info) {
...@@ -32,7 +32,7 @@ void UiRenderer::DrawWebVrOverlayForeground(const RenderInfo& render_info) { ...@@ -32,7 +32,7 @@ void UiRenderer::DrawWebVrOverlayForeground(const RenderInfo& render_info) {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
DrawUiView(render_info, scene_->GetVisibleWebVrOverlayElementsToDraw()); DrawUiView(render_info, scene_->GetWebVrOverlayElementsToDraw());
} }
void UiRenderer::DrawUiView(const RenderInfo& render_info, void UiRenderer::DrawUiView(const RenderInfo& render_info,
......
...@@ -212,9 +212,10 @@ std::vector<UiElement*>& UiScene::GetAllElements() { ...@@ -212,9 +212,10 @@ std::vector<UiElement*>& UiScene::GetAllElements() {
return all_elements_; return all_elements_;
} }
UiScene::Elements UiScene::GetVisibleElements() { UiScene::Elements UiScene::GetElementsToHitTest() {
return GetVisibleElementsWithPredicate( return GetVisibleElementsWithPredicate(
root_element_.get(), [](UiElement* element) { return true; }); root_element_.get(),
[](UiElement* element) { return element->IsHitTestable(); });
} }
UiScene::MutableElements UiScene::GetVisibleElementsMutable() { UiScene::MutableElements UiScene::GetVisibleElementsMutable() {
...@@ -222,7 +223,7 @@ UiScene::MutableElements UiScene::GetVisibleElementsMutable() { ...@@ -222,7 +223,7 @@ UiScene::MutableElements UiScene::GetVisibleElementsMutable() {
root_element_.get(), [](UiElement* element) { return true; }); root_element_.get(), [](UiElement* element) { return true; });
} }
UiScene::Elements UiScene::GetVisibleElementsToDraw() { UiScene::Elements UiScene::GetElementsToDraw() {
return GetVisibleElementsWithPredicate( return GetVisibleElementsWithPredicate(
root_element_.get(), [](UiElement* element) { root_element_.get(), [](UiElement* element) {
return element->draw_phase() == kPhaseForeground || return element->draw_phase() == kPhaseForeground ||
...@@ -231,7 +232,7 @@ UiScene::Elements UiScene::GetVisibleElementsToDraw() { ...@@ -231,7 +232,7 @@ UiScene::Elements UiScene::GetVisibleElementsToDraw() {
}); });
} }
UiScene::Elements UiScene::GetVisibleWebVrOverlayElementsToDraw() { UiScene::Elements UiScene::GetWebVrOverlayElementsToDraw() {
auto* webvr_root = GetUiElementByName(kWebVrRoot); auto* webvr_root = GetUiElementByName(kWebVrRoot);
return GetVisibleElementsWithPredicate(webvr_root, [](UiElement* element) { return GetVisibleElementsWithPredicate(webvr_root, [](UiElement* element) {
return element->draw_phase() == kPhaseOverlayForeground; return element->draw_phase() == kPhaseOverlayForeground;
......
...@@ -61,10 +61,9 @@ class UiScene { ...@@ -61,10 +61,9 @@ class UiScene {
typedef std::vector<UiElement*> MutableElements; typedef std::vector<UiElement*> MutableElements;
std::vector<UiElement*>& GetAllElements(); std::vector<UiElement*>& GetAllElements();
Elements GetVisibleElements(); Elements GetElementsToHitTest();
MutableElements GetVisibleElementsMutable(); Elements GetElementsToDraw();
Elements GetVisibleElementsToDraw(); Elements GetWebVrOverlayElementsToDraw();
Elements GetVisibleWebVrOverlayElementsToDraw();
float background_distance() const { return background_distance_; } float background_distance() const { return background_distance_; }
void set_background_distance(float d) { background_distance_ = d; } void set_background_distance(float d) { background_distance_ = d; }
...@@ -81,6 +80,8 @@ class UiScene { ...@@ -81,6 +80,8 @@ class UiScene {
private: private:
void InitializeElement(UiElement* element); void InitializeElement(UiElement* element);
MutableElements GetVisibleElementsMutable();
std::unique_ptr<UiElement> root_element_; std::unique_ptr<UiElement> root_element_;
float background_distance_ = 10.0f; float background_distance_ = 10.0f;
......
...@@ -190,10 +190,10 @@ TEST(UiScene, NoViewportAwareElementWhenNoVisibleChild) { ...@@ -190,10 +190,10 @@ TEST(UiScene, NoViewportAwareElementWhenNoVisibleChild) {
element->SetDrawPhase(kPhaseOverlayForeground); element->SetDrawPhase(kPhaseOverlayForeground);
child->AddChild(std::move(element)); child->AddChild(std::move(element));
EXPECT_FALSE(scene.GetVisibleWebVrOverlayElementsToDraw().empty()); EXPECT_FALSE(scene.GetWebVrOverlayElementsToDraw().empty());
child->SetVisible(false); child->SetVisible(false);
scene.OnBeginFrame(MsToTicks(0), kStartHeadPose); scene.OnBeginFrame(MsToTicks(0), kStartHeadPose);
EXPECT_TRUE(scene.GetVisibleWebVrOverlayElementsToDraw().empty()); EXPECT_TRUE(scene.GetWebVrOverlayElementsToDraw().empty());
} }
TEST(UiScene, InvisibleElementsDoNotCauseAnimationDirtiness) { TEST(UiScene, InvisibleElementsDoNotCauseAnimationDirtiness) {
......
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