blob: 9798fe143f1ae982ea317df8d945e93c279ec2a8 [file] [log] [blame]
Avi Drissman4a8573c2022-09-09 19:35:541// Copyright 2016 The Chromium Authors
Ian Vollick826f56b02017-11-13 19:53:572// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/vr/ui_element_renderer.h"
6
7#include <math.h>
8#include <algorithm>
9#include <string>
10
Tibor Goldschwendtfe6b7862018-03-06 16:02:4511#include "base/trace_event/trace_event.h"
Ian Vollick826f56b02017-11-13 19:53:5712#include "chrome/browser/vr/renderers/base_quad_renderer.h"
13#include "chrome/browser/vr/renderers/base_renderer.h"
14#include "chrome/browser/vr/renderers/external_textured_quad_renderer.h"
Aldo Culquicondor1ec0f8a2018-05-16 16:39:3715#include "chrome/browser/vr/renderers/radial_gradient_quad_renderer.h"
Aldo Culquicondor4ca61bf2018-08-14 00:08:0516#include "chrome/browser/vr/renderers/texture_copy_renderer.h"
Ian Vollick826f56b02017-11-13 19:53:5717#include "chrome/browser/vr/renderers/textured_quad_renderer.h"
Michael Thiessenbc382ac2018-04-20 20:39:1718#include "chrome/browser/vr/renderers/transparent_quad_renderer.h"
Ian Vollick826f56b02017-11-13 19:53:5719#include "ui/gfx/geometry/point3_f.h"
20#include "ui/gfx/geometry/vector3d_f.h"
21
22namespace vr {
23
24UiElementRenderer::UiElementRenderer() : UiElementRenderer(true) {}
25
26UiElementRenderer::UiElementRenderer(bool use_gl) {
27 if (!use_gl)
28 return;
29 Init();
30 BaseQuadRenderer::CreateBuffers();
31 TexturedQuadRenderer::CreateBuffers();
Ian Vollick8e4a824f2018-01-06 05:15:1232 Stars::Renderer::CreateBuffers();
Ian Vollick826f56b02017-11-13 19:53:5733}
34
35UiElementRenderer::~UiElementRenderer() = default;
36
37void UiElementRenderer::Init() {
38 external_textured_quad_renderer_ =
Jinho Banga6bfaaa2018-01-15 18:04:4239 std::make_unique<ExternalTexturedQuadRenderer>();
Michael Thiessenbc382ac2018-04-20 20:39:1740 transparent_quad_renderer_ = std::make_unique<TransparentQuadRenderer>();
Jinho Banga6bfaaa2018-01-15 18:04:4241 textured_quad_renderer_ = std::make_unique<TexturedQuadRenderer>();
Aldo Culquicondor1ec0f8a2018-05-16 16:39:3742 radial_gradient_quad_renderer_ =
43 std::make_unique<RadialGradientQuadRenderer>();
Aldo Culquicondor4ca61bf2018-08-14 00:08:0544 texture_copy_renderer_ = std::make_unique<TextureCopyRenderer>();
Jinho Banga6bfaaa2018-01-15 18:04:4245 reticle_renderer_ = std::make_unique<Reticle::Renderer>();
46 laser_renderer_ = std::make_unique<Laser::Renderer>();
47 controller_renderer_ = std::make_unique<Controller::Renderer>();
48 gradient_grid_renderer_ = std::make_unique<Grid::Renderer>();
49 shadow_renderer_ = std::make_unique<Shadow::Renderer>();
50 stars_renderer_ = std::make_unique<Stars::Renderer>();
51 background_renderer_ = std::make_unique<Background::Renderer>();
Christopher Grant75420242018-02-23 20:48:4752 keyboard_renderer_ = std::make_unique<Keyboard::Renderer>();
Ian Vollick826f56b02017-11-13 19:53:5753}
54
55void UiElementRenderer::DrawTexturedQuad(
56 int texture_data_handle,
Ian Vollickfaa82712018-03-20 18:48:0757 int overlay_texture_data_handle,
Aldo Culquicondor3c315ea02018-08-13 20:45:0958 GlTextureLocation texture_location,
Ian Vollick826f56b02017-11-13 19:53:5759 const gfx::Transform& model_view_proj_matrix,
Aldo Culquicondoree5a9c72018-05-11 21:22:5160 const gfx::RectF& clip_rect,
Ian Vollick826f56b02017-11-13 19:53:5761 float opacity,
Ian Vollickf2ac1862017-12-14 17:14:2162 const gfx::SizeF& element_size,
Michael Thiessen52565af2018-04-19 16:20:5763 float corner_radius,
64 bool blend) {
Tibor Goldschwendtfe6b7862018-03-06 16:02:4565 TRACE_EVENT0("gpu", "UiElementRenderer::DrawTexturedQuad");
Ian Vollick826f56b02017-11-13 19:53:5766 // TODO(vollick): handle drawing this degenerate situation crbug.com/768922
67 if (corner_radius * 2.0 > element_size.width() ||
68 corner_radius * 2.0 > element_size.height()) {
69 return;
70 }
Aldo Culquicondor3c315ea02018-08-13 20:45:0971 TexturedQuadRenderer* renderer =
72 texture_location == kGlTextureLocationExternal
73 ? external_textured_quad_renderer_.get()
74 : textured_quad_renderer_.get();
Michael Thiessenbc382ac2018-04-20 20:39:1775 if (!texture_data_handle && !overlay_texture_data_handle) {
76 // If we're blending, why are we even drawing a transparent quad?
77 DCHECK(!blend);
78 renderer = transparent_quad_renderer_.get();
79 }
Ian Vollick826f56b02017-11-13 19:53:5780 FlushIfNecessary(renderer);
Ian Vollickfaa82712018-03-20 18:48:0781 renderer->AddQuad(texture_data_handle, overlay_texture_data_handle,
Aldo Culquicondoree5a9c72018-05-11 21:22:5182 model_view_proj_matrix, clip_rect, opacity, element_size,
Michael Thiessen52565af2018-04-19 16:20:5783 corner_radius, blend);
Ian Vollick826f56b02017-11-13 19:53:5784}
85
Aldo Culquicondor1ec0f8a2018-05-16 16:39:3786void UiElementRenderer::DrawRadialGradientQuad(
Ian Vollick826f56b02017-11-13 19:53:5787 const gfx::Transform& model_view_proj_matrix,
88 const SkColor edge_color,
89 const SkColor center_color,
Aldo Culquicondoree5a9c72018-05-11 21:22:5190 const gfx::RectF& clip_rect,
Ian Vollick826f56b02017-11-13 19:53:5791 float opacity,
Ian Vollickf2ac1862017-12-14 17:14:2192 const gfx::SizeF& element_size,
93 const CornerRadii& radii) {
Aldo Culquicondor1ec0f8a2018-05-16 16:39:3794 TRACE_EVENT0("gpu", "UiElementRenderer::DrawRadialGradientQuad");
95 FlushIfNecessary(radial_gradient_quad_renderer_.get());
96 radial_gradient_quad_renderer_->Draw(model_view_proj_matrix, edge_color,
97 center_color, clip_rect, opacity,
98 element_size, radii);
Ian Vollick826f56b02017-11-13 19:53:5799}
100
101void UiElementRenderer::DrawGradientGridQuad(
102 const gfx::Transform& model_view_proj_matrix,
Ian Vollick826f56b02017-11-13 19:53:57103 const SkColor grid_color,
104 int gridline_count,
105 float opacity) {
Tibor Goldschwendtfe6b7862018-03-06 16:02:45106 TRACE_EVENT0("gpu", "UiElementRenderer::DrawGradientGridQuad");
Ian Vollick826f56b02017-11-13 19:53:57107 FlushIfNecessary(gradient_grid_renderer_.get());
Aldo Culquicondorf99d1672018-05-23 21:50:27108 gradient_grid_renderer_->Draw(model_view_proj_matrix, grid_color,
109 gridline_count, opacity);
Ian Vollick826f56b02017-11-13 19:53:57110}
111
Tibor Goldschwendt18e1cd62018-02-01 19:15:06112void UiElementRenderer::DrawController(
113 float opacity,
114 const gfx::Transform& model_view_proj_matrix) {
Tibor Goldschwendtfe6b7862018-03-06 16:02:45115 TRACE_EVENT0("gpu", "UiElementRenderer::DrawController");
Ian Vollick826f56b02017-11-13 19:53:57116 FlushIfNecessary(controller_renderer_.get());
Tibor Goldschwendt18e1cd62018-02-01 19:15:06117 controller_renderer_->Draw(opacity, model_view_proj_matrix);
Ian Vollick826f56b02017-11-13 19:53:57118}
119
Yash Malik79907ed2017-11-15 21:11:02120void UiElementRenderer::DrawLaser(
121 float opacity,
122 const gfx::Transform& model_view_proj_matrix) {
Tibor Goldschwendtfe6b7862018-03-06 16:02:45123 TRACE_EVENT0("gpu", "UiElementRenderer::DrawLaser");
Ian Vollick826f56b02017-11-13 19:53:57124 FlushIfNecessary(laser_renderer_.get());
Yash Malik79907ed2017-11-15 21:11:02125 laser_renderer_->Draw(opacity, model_view_proj_matrix);
Ian Vollick826f56b02017-11-13 19:53:57126}
127
Yash Malik79907ed2017-11-15 21:11:02128void UiElementRenderer::DrawReticle(
129 float opacity,
130 const gfx::Transform& model_view_proj_matrix) {
Tibor Goldschwendtfe6b7862018-03-06 16:02:45131 TRACE_EVENT0("gpu", "UiElementRenderer::DrawReticle");
Ian Vollick826f56b02017-11-13 19:53:57132 FlushIfNecessary(reticle_renderer_.get());
Yash Malik79907ed2017-11-15 21:11:02133 reticle_renderer_->Draw(opacity, model_view_proj_matrix);
Ian Vollick826f56b02017-11-13 19:53:57134}
135
Aldo Culquicondor4ca61bf2018-08-14 00:08:05136void UiElementRenderer::DrawTextureCopy(int texture_data_handle,
137 const float (&uv_transform)[16],
138 float xborder,
139 float yborder) {
140 FlushIfNecessary(texture_copy_renderer_.get());
141 texture_copy_renderer_->Draw(texture_data_handle, uv_transform, xborder,
142 yborder);
Ian Vollick826f56b02017-11-13 19:53:57143}
144
Ian Vollick161b1ed2017-11-16 01:34:04145void UiElementRenderer::DrawShadow(const gfx::Transform& model_view_proj_matrix,
146 const gfx::SizeF& element_size,
147 float x_padding,
148 float y_padding,
149 float y_offset,
150 SkColor color,
151 float opacity,
152 float corner_radius) {
Tibor Goldschwendtfe6b7862018-03-06 16:02:45153 TRACE_EVENT0("gpu", "UiElementRenderer::DrawShadow");
Ian Vollick161b1ed2017-11-16 01:34:04154 FlushIfNecessary(shadow_renderer_.get());
155 shadow_renderer_->Draw(model_view_proj_matrix, element_size, x_padding,
156 y_padding, y_offset, color, opacity, corner_radius);
157}
158
Ian Vollick8e4a824f2018-01-06 05:15:12159void UiElementRenderer::DrawStars(
160 float t,
161 const gfx::Transform& model_view_proj_matrix) {
Tibor Goldschwendtfe6b7862018-03-06 16:02:45162 TRACE_EVENT0("gpu", "UiElementRenderer::DrawStars");
Ian Vollick8e4a824f2018-01-06 05:15:12163 FlushIfNecessary(stars_renderer_.get());
164 stars_renderer_->Draw(t, model_view_proj_matrix);
165}
166
Christopher Grant0b1544ce2017-12-21 16:14:14167void UiElementRenderer::DrawBackground(
168 const gfx::Transform& model_view_proj_matrix,
Ian Vollick8e4a824f2018-01-06 05:15:12169 int texture_data_handle,
170 int normal_gradient_texture_data_handle,
171 int incognito_gradient_texture_data_handle,
172 int fullscreen_gradient_texture_data_handle,
173 float normal_factor,
174 float incognito_factor,
175 float fullscreen_factor) {
Tibor Goldschwendtfe6b7862018-03-06 16:02:45176 TRACE_EVENT0("gpu", "UiElementRenderer::DrawBackground");
Christopher Grant0b1544ce2017-12-21 16:14:14177 FlushIfNecessary(background_renderer_.get());
Ian Vollick8e4a824f2018-01-06 05:15:12178 background_renderer_->Draw(model_view_proj_matrix, texture_data_handle,
179 normal_gradient_texture_data_handle,
180 incognito_gradient_texture_data_handle,
181 fullscreen_gradient_texture_data_handle,
182 normal_factor, incognito_factor,
183 fullscreen_factor);
Christopher Grant0b1544ce2017-12-21 16:14:14184}
185
Christopher Grant75420242018-02-23 20:48:47186void UiElementRenderer::DrawKeyboard(const CameraModel& camera_model,
187 KeyboardDelegate* delegate) {
Tibor Goldschwendtfe6b7862018-03-06 16:02:45188 TRACE_EVENT0("gpu", "UiElementRenderer::DrawKeyboard");
Christopher Grant75420242018-02-23 20:48:47189 FlushIfNecessary(keyboard_renderer_.get());
190 keyboard_renderer_->Draw(camera_model, delegate);
191}
192
Ian Vollick826f56b02017-11-13 19:53:57193void UiElementRenderer::Flush() {
194 textured_quad_renderer_->Flush();
195 external_textured_quad_renderer_->Flush();
196 last_renderer_ = nullptr;
197}
198
Ian Vollick826f56b02017-11-13 19:53:57199void UiElementRenderer::FlushIfNecessary(BaseRenderer* renderer) {
200 if (last_renderer_ && renderer != last_renderer_) {
201 last_renderer_->Flush();
202 }
203 last_renderer_ = renderer;
204}
205
206} // namespace vr