1 // Copyright 2017 The Chromium Authors. All rights reserved.
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/elements/environment/grid.h"
6 
7 #include "chrome/browser/vr/target_property.h"
8 #include "chrome/browser/vr/ui_element_renderer.h"
9 #include "device/vr/vr_gl_util.h"
10 
11 namespace vr {
12 
13 namespace {
14 
15 // clang-format off
16 static constexpr char const* kVertexShader = SHADER(
17   precision highp float;
18   uniform mat4 u_ModelViewProjMatrix;
19   attribute vec4 a_Position;
20   varying vec2 v_GridPosition;
21 
22   void main() {
23     v_GridPosition = a_Position.xy;
24     gl_Position = u_ModelViewProjMatrix * a_Position;
25   }
26 );
27 
28 static constexpr char const* kFragmentShader = SHADER(
29   precision highp float;
30   varying vec2 v_GridPosition;
31   uniform vec4 u_GridColor;
32   uniform mediump float u_Opacity;
33   uniform float u_LinesCount;
34 
35   void main() {
36     vec2 tile_pos = fract(u_LinesCount * abs(v_GridPosition));
37     vec2 border_dist = min(tile_pos, 1.0 - tile_pos);
38     float diff = min(border_dist.x, border_dist.y);
39     if (diff > 0.01)
40       discard;
41     lowp float radialOpacity = 1.0 - clamp(length(v_GridPosition), 0.0, 1.0);
42     lowp float opacity = 1.0 - diff / 0.01;
43     opacity = u_Opacity * opacity * opacity * radialOpacity * u_GridColor.w;
44     gl_FragColor = vec4(u_GridColor.xyz * opacity, opacity);
45   }
46 );
47 // clang-format on
48 
49 }  // namespace
50 
Grid()51 Grid::Grid() {}
~Grid()52 Grid::~Grid() {}
53 
SetGridColor(SkColor color)54 void Grid::SetGridColor(SkColor color) {
55   animation().TransitionColorTo(last_frame_time(), GRID_COLOR, grid_color_,
56                                 color);
57 }
58 
NotifyClientColorAnimated(SkColor color,int target_property_id,cc::KeyframeModel * keyframe_model)59 void Grid::NotifyClientColorAnimated(SkColor color,
60                                      int target_property_id,
61                                      cc::KeyframeModel* keyframe_model) {
62   if (target_property_id == GRID_COLOR) {
63     grid_color_ = color;
64   } else {
65     Rect::NotifyClientColorAnimated(color, target_property_id, keyframe_model);
66   }
67 }
68 
Render(UiElementRenderer * renderer,const CameraModel & model) const69 void Grid::Render(UiElementRenderer* renderer, const CameraModel& model) const {
70   renderer->DrawGradientGridQuad(
71       model.view_proj_matrix * world_space_transform(), grid_color_,
72       gridline_count_, computed_opacity());
73 }
74 
75 Grid::Renderer::~Renderer() = default;
76 
Renderer()77 Grid::Renderer::Renderer() : BaseQuadRenderer(kVertexShader, kFragmentShader) {
78   model_view_proj_matrix_handle_ =
79       glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
80   grid_color_handle_ = glGetUniformLocation(program_handle_, "u_GridColor");
81   opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity");
82   lines_count_handle_ = glGetUniformLocation(program_handle_, "u_LinesCount");
83 }
84 
Draw(const gfx::Transform & model_view_proj_matrix,SkColor grid_color,int gridline_count,float opacity)85 void Grid::Renderer::Draw(const gfx::Transform& model_view_proj_matrix,
86                           SkColor grid_color,
87                           int gridline_count,
88                           float opacity) {
89   PrepareToDraw(model_view_proj_matrix_handle_, model_view_proj_matrix);
90 
91   glUniform1f(lines_count_handle_, static_cast<float>(gridline_count));
92 
93   SetColorUniform(grid_color_handle_, grid_color);
94   glUniform1f(opacity_handle_, opacity);
95 
96   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer_);
97   glDrawElements(GL_TRIANGLES, BaseQuadRenderer::NumQuadIndices(),
98                  GL_UNSIGNED_SHORT, 0);
99 
100   glDisableVertexAttribArray(position_handle_);
101 }
102 
103 }  // namespace vr
104