Avi Drissman | 4a8573c | 2022-09-09 19:35:54 | [diff] [blame] | 1 | // Copyright 2016 The Chromium Authors |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 2 | // 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 Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 11 | #include "base/trace_event/trace_event.h" |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 12 | #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 Culquicondor | 1ec0f8a | 2018-05-16 16:39:37 | [diff] [blame] | 15 | #include "chrome/browser/vr/renderers/radial_gradient_quad_renderer.h" |
Aldo Culquicondor | 4ca61bf | 2018-08-14 00:08:05 | [diff] [blame] | 16 | #include "chrome/browser/vr/renderers/texture_copy_renderer.h" |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 17 | #include "chrome/browser/vr/renderers/textured_quad_renderer.h" |
Michael Thiessen | bc382ac | 2018-04-20 20:39:17 | [diff] [blame] | 18 | #include "chrome/browser/vr/renderers/transparent_quad_renderer.h" |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 19 | #include "ui/gfx/geometry/point3_f.h" |
| 20 | #include "ui/gfx/geometry/vector3d_f.h" |
| 21 | |
| 22 | namespace vr { |
| 23 | |
| 24 | UiElementRenderer::UiElementRenderer() : UiElementRenderer(true) {} |
| 25 | |
| 26 | UiElementRenderer::UiElementRenderer(bool use_gl) { |
| 27 | if (!use_gl) |
| 28 | return; |
| 29 | Init(); |
| 30 | BaseQuadRenderer::CreateBuffers(); |
| 31 | TexturedQuadRenderer::CreateBuffers(); |
Ian Vollick | 8e4a824f | 2018-01-06 05:15:12 | [diff] [blame] | 32 | Stars::Renderer::CreateBuffers(); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 33 | } |
| 34 | |
| 35 | UiElementRenderer::~UiElementRenderer() = default; |
| 36 | |
| 37 | void UiElementRenderer::Init() { |
| 38 | external_textured_quad_renderer_ = |
Jinho Bang | a6bfaaa | 2018-01-15 18:04:42 | [diff] [blame] | 39 | std::make_unique<ExternalTexturedQuadRenderer>(); |
Michael Thiessen | bc382ac | 2018-04-20 20:39:17 | [diff] [blame] | 40 | transparent_quad_renderer_ = std::make_unique<TransparentQuadRenderer>(); |
Jinho Bang | a6bfaaa | 2018-01-15 18:04:42 | [diff] [blame] | 41 | textured_quad_renderer_ = std::make_unique<TexturedQuadRenderer>(); |
Aldo Culquicondor | 1ec0f8a | 2018-05-16 16:39:37 | [diff] [blame] | 42 | radial_gradient_quad_renderer_ = |
| 43 | std::make_unique<RadialGradientQuadRenderer>(); |
Aldo Culquicondor | 4ca61bf | 2018-08-14 00:08:05 | [diff] [blame] | 44 | texture_copy_renderer_ = std::make_unique<TextureCopyRenderer>(); |
Jinho Bang | a6bfaaa | 2018-01-15 18:04:42 | [diff] [blame] | 45 | 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 Grant | 7542024 | 2018-02-23 20:48:47 | [diff] [blame] | 52 | keyboard_renderer_ = std::make_unique<Keyboard::Renderer>(); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 53 | } |
| 54 | |
| 55 | void UiElementRenderer::DrawTexturedQuad( |
| 56 | int texture_data_handle, |
Ian Vollick | faa8271 | 2018-03-20 18:48:07 | [diff] [blame] | 57 | int overlay_texture_data_handle, |
Aldo Culquicondor | 3c315ea0 | 2018-08-13 20:45:09 | [diff] [blame] | 58 | GlTextureLocation texture_location, |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 59 | const gfx::Transform& model_view_proj_matrix, |
Aldo Culquicondor | ee5a9c7 | 2018-05-11 21:22:51 | [diff] [blame] | 60 | const gfx::RectF& clip_rect, |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 61 | float opacity, |
Ian Vollick | f2ac186 | 2017-12-14 17:14:21 | [diff] [blame] | 62 | const gfx::SizeF& element_size, |
Michael Thiessen | 52565af | 2018-04-19 16:20:57 | [diff] [blame] | 63 | float corner_radius, |
| 64 | bool blend) { |
Tibor Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 65 | TRACE_EVENT0("gpu", "UiElementRenderer::DrawTexturedQuad"); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 66 | // 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 Culquicondor | 3c315ea0 | 2018-08-13 20:45:09 | [diff] [blame] | 71 | TexturedQuadRenderer* renderer = |
| 72 | texture_location == kGlTextureLocationExternal |
| 73 | ? external_textured_quad_renderer_.get() |
| 74 | : textured_quad_renderer_.get(); |
Michael Thiessen | bc382ac | 2018-04-20 20:39:17 | [diff] [blame] | 75 | 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 Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 80 | FlushIfNecessary(renderer); |
Ian Vollick | faa8271 | 2018-03-20 18:48:07 | [diff] [blame] | 81 | renderer->AddQuad(texture_data_handle, overlay_texture_data_handle, |
Aldo Culquicondor | ee5a9c7 | 2018-05-11 21:22:51 | [diff] [blame] | 82 | model_view_proj_matrix, clip_rect, opacity, element_size, |
Michael Thiessen | 52565af | 2018-04-19 16:20:57 | [diff] [blame] | 83 | corner_radius, blend); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 84 | } |
| 85 | |
Aldo Culquicondor | 1ec0f8a | 2018-05-16 16:39:37 | [diff] [blame] | 86 | void UiElementRenderer::DrawRadialGradientQuad( |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 87 | const gfx::Transform& model_view_proj_matrix, |
| 88 | const SkColor edge_color, |
| 89 | const SkColor center_color, |
Aldo Culquicondor | ee5a9c7 | 2018-05-11 21:22:51 | [diff] [blame] | 90 | const gfx::RectF& clip_rect, |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 91 | float opacity, |
Ian Vollick | f2ac186 | 2017-12-14 17:14:21 | [diff] [blame] | 92 | const gfx::SizeF& element_size, |
| 93 | const CornerRadii& radii) { |
Aldo Culquicondor | 1ec0f8a | 2018-05-16 16:39:37 | [diff] [blame] | 94 | 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 Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 99 | } |
| 100 | |
| 101 | void UiElementRenderer::DrawGradientGridQuad( |
| 102 | const gfx::Transform& model_view_proj_matrix, |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 103 | const SkColor grid_color, |
| 104 | int gridline_count, |
| 105 | float opacity) { |
Tibor Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 106 | TRACE_EVENT0("gpu", "UiElementRenderer::DrawGradientGridQuad"); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 107 | FlushIfNecessary(gradient_grid_renderer_.get()); |
Aldo Culquicondor | f99d167 | 2018-05-23 21:50:27 | [diff] [blame] | 108 | gradient_grid_renderer_->Draw(model_view_proj_matrix, grid_color, |
| 109 | gridline_count, opacity); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 110 | } |
| 111 | |
Tibor Goldschwendt | 18e1cd6 | 2018-02-01 19:15:06 | [diff] [blame] | 112 | void UiElementRenderer::DrawController( |
| 113 | float opacity, |
| 114 | const gfx::Transform& model_view_proj_matrix) { |
Tibor Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 115 | TRACE_EVENT0("gpu", "UiElementRenderer::DrawController"); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 116 | FlushIfNecessary(controller_renderer_.get()); |
Tibor Goldschwendt | 18e1cd6 | 2018-02-01 19:15:06 | [diff] [blame] | 117 | controller_renderer_->Draw(opacity, model_view_proj_matrix); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 118 | } |
| 119 | |
Yash Malik | 79907ed | 2017-11-15 21:11:02 | [diff] [blame] | 120 | void UiElementRenderer::DrawLaser( |
| 121 | float opacity, |
| 122 | const gfx::Transform& model_view_proj_matrix) { |
Tibor Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 123 | TRACE_EVENT0("gpu", "UiElementRenderer::DrawLaser"); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 124 | FlushIfNecessary(laser_renderer_.get()); |
Yash Malik | 79907ed | 2017-11-15 21:11:02 | [diff] [blame] | 125 | laser_renderer_->Draw(opacity, model_view_proj_matrix); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 126 | } |
| 127 | |
Yash Malik | 79907ed | 2017-11-15 21:11:02 | [diff] [blame] | 128 | void UiElementRenderer::DrawReticle( |
| 129 | float opacity, |
| 130 | const gfx::Transform& model_view_proj_matrix) { |
Tibor Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 131 | TRACE_EVENT0("gpu", "UiElementRenderer::DrawReticle"); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 132 | FlushIfNecessary(reticle_renderer_.get()); |
Yash Malik | 79907ed | 2017-11-15 21:11:02 | [diff] [blame] | 133 | reticle_renderer_->Draw(opacity, model_view_proj_matrix); |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 134 | } |
| 135 | |
Aldo Culquicondor | 4ca61bf | 2018-08-14 00:08:05 | [diff] [blame] | 136 | void 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 Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 143 | } |
| 144 | |
Ian Vollick | 161b1ed | 2017-11-16 01:34:04 | [diff] [blame] | 145 | void 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 Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 153 | TRACE_EVENT0("gpu", "UiElementRenderer::DrawShadow"); |
Ian Vollick | 161b1ed | 2017-11-16 01:34:04 | [diff] [blame] | 154 | 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 Vollick | 8e4a824f | 2018-01-06 05:15:12 | [diff] [blame] | 159 | void UiElementRenderer::DrawStars( |
| 160 | float t, |
| 161 | const gfx::Transform& model_view_proj_matrix) { |
Tibor Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 162 | TRACE_EVENT0("gpu", "UiElementRenderer::DrawStars"); |
Ian Vollick | 8e4a824f | 2018-01-06 05:15:12 | [diff] [blame] | 163 | FlushIfNecessary(stars_renderer_.get()); |
| 164 | stars_renderer_->Draw(t, model_view_proj_matrix); |
| 165 | } |
| 166 | |
Christopher Grant | 0b1544ce | 2017-12-21 16:14:14 | [diff] [blame] | 167 | void UiElementRenderer::DrawBackground( |
| 168 | const gfx::Transform& model_view_proj_matrix, |
Ian Vollick | 8e4a824f | 2018-01-06 05:15:12 | [diff] [blame] | 169 | 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 Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 176 | TRACE_EVENT0("gpu", "UiElementRenderer::DrawBackground"); |
Christopher Grant | 0b1544ce | 2017-12-21 16:14:14 | [diff] [blame] | 177 | FlushIfNecessary(background_renderer_.get()); |
Ian Vollick | 8e4a824f | 2018-01-06 05:15:12 | [diff] [blame] | 178 | 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 Grant | 0b1544ce | 2017-12-21 16:14:14 | [diff] [blame] | 184 | } |
| 185 | |
Christopher Grant | 7542024 | 2018-02-23 20:48:47 | [diff] [blame] | 186 | void UiElementRenderer::DrawKeyboard(const CameraModel& camera_model, |
| 187 | KeyboardDelegate* delegate) { |
Tibor Goldschwendt | fe6b786 | 2018-03-06 16:02:45 | [diff] [blame] | 188 | TRACE_EVENT0("gpu", "UiElementRenderer::DrawKeyboard"); |
Christopher Grant | 7542024 | 2018-02-23 20:48:47 | [diff] [blame] | 189 | FlushIfNecessary(keyboard_renderer_.get()); |
| 190 | keyboard_renderer_->Draw(camera_model, delegate); |
| 191 | } |
| 192 | |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 193 | void UiElementRenderer::Flush() { |
| 194 | textured_quad_renderer_->Flush(); |
| 195 | external_textured_quad_renderer_->Flush(); |
| 196 | last_renderer_ = nullptr; |
| 197 | } |
| 198 | |
Ian Vollick | 826f56b0 | 2017-11-13 19:53:57 | [diff] [blame] | 199 | void 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 |