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,
std::vector<const UiElement*> overlay_elements;
if (is_webvr_frame) {
overlay_elements = ui_->scene()->GetVisibleWebVrOverlayElementsToDraw();
overlay_elements = ui_->scene()->GetWebVrOverlayElementsToDraw();
}
TRACE_COUNTER1("gpu", "VR overlay element count", overlay_elements.size());
......
......@@ -60,14 +60,12 @@ bool IsScrollEvent(const GestureList& list) {
void HitTestElements(UiScene* scene,
ReticleModel* reticle_model,
HitTestRequest* request) {
std::vector<const UiElement*> elements = scene->GetVisibleElements();
std::vector<const UiElement*> elements = scene->GetElementsToHitTest();
std::vector<const UiElement*> sorted =
UiRenderer::GetElementsInDrawOrder(elements);
for (const auto* element : base::Reversed(sorted)) {
if (!element->IsHitTestable()) {
continue;
}
DCHECK(element->IsHitTestable());
HitTestResult result;
element->HitTest(*request, &result);
......
......@@ -22,7 +22,7 @@ UiRenderer::~UiRenderer() = default;
// itself correctly.
void UiRenderer::Draw(const RenderInfo& render_info) {
glEnable(GL_CULL_FACE);
DrawUiView(render_info, scene_->GetVisibleElementsToDraw());
DrawUiView(render_info, scene_->GetElementsToDraw());
}
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);
glClear(GL_COLOR_BUFFER_BIT);
DrawUiView(render_info, scene_->GetVisibleWebVrOverlayElementsToDraw());
DrawUiView(render_info, scene_->GetWebVrOverlayElementsToDraw());
}
void UiRenderer::DrawUiView(const RenderInfo& render_info,
......
......@@ -212,9 +212,10 @@ std::vector<UiElement*>& UiScene::GetAllElements() {
return all_elements_;
}
UiScene::Elements UiScene::GetVisibleElements() {
UiScene::Elements UiScene::GetElementsToHitTest() {
return GetVisibleElementsWithPredicate(
root_element_.get(), [](UiElement* element) { return true; });
root_element_.get(),
[](UiElement* element) { return element->IsHitTestable(); });
}
UiScene::MutableElements UiScene::GetVisibleElementsMutable() {
......@@ -222,7 +223,7 @@ UiScene::MutableElements UiScene::GetVisibleElementsMutable() {
root_element_.get(), [](UiElement* element) { return true; });
}
UiScene::Elements UiScene::GetVisibleElementsToDraw() {
UiScene::Elements UiScene::GetElementsToDraw() {
return GetVisibleElementsWithPredicate(
root_element_.get(), [](UiElement* element) {
return element->draw_phase() == kPhaseForeground ||
......@@ -231,7 +232,7 @@ UiScene::Elements UiScene::GetVisibleElementsToDraw() {
});
}
UiScene::Elements UiScene::GetVisibleWebVrOverlayElementsToDraw() {
UiScene::Elements UiScene::GetWebVrOverlayElementsToDraw() {
auto* webvr_root = GetUiElementByName(kWebVrRoot);
return GetVisibleElementsWithPredicate(webvr_root, [](UiElement* element) {
return element->draw_phase() == kPhaseOverlayForeground;
......
......@@ -61,10 +61,9 @@ class UiScene {
typedef std::vector<UiElement*> MutableElements;
std::vector<UiElement*>& GetAllElements();
Elements GetVisibleElements();
MutableElements GetVisibleElementsMutable();
Elements GetVisibleElementsToDraw();
Elements GetVisibleWebVrOverlayElementsToDraw();
Elements GetElementsToHitTest();
Elements GetElementsToDraw();
Elements GetWebVrOverlayElementsToDraw();
float background_distance() const { return background_distance_; }
void set_background_distance(float d) { background_distance_ = d; }
......@@ -81,6 +80,8 @@ class UiScene {
private:
void InitializeElement(UiElement* element);
MutableElements GetVisibleElementsMutable();
std::unique_ptr<UiElement> root_element_;
float background_distance_ = 10.0f;
......
......@@ -190,10 +190,10 @@ TEST(UiScene, NoViewportAwareElementWhenNoVisibleChild) {
element->SetDrawPhase(kPhaseOverlayForeground);
child->AddChild(std::move(element));
EXPECT_FALSE(scene.GetVisibleWebVrOverlayElementsToDraw().empty());
EXPECT_FALSE(scene.GetWebVrOverlayElementsToDraw().empty());
child->SetVisible(false);
scene.OnBeginFrame(MsToTicks(0), kStartHeadPose);
EXPECT_TRUE(scene.GetVisibleWebVrOverlayElementsToDraw().empty());
EXPECT_TRUE(scene.GetWebVrOverlayElementsToDraw().empty());
}
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