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