Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Side by Side Diff: chrome/browser/android/vr_shell/vr_shell_renderer.cc

Issue 2363553003: VrShell: implement insecure content warning display (Closed)
Patch Set: Replace GIMP images with PNG file resources Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h" 5 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h"
6 6
7 #include "chrome/browser/android/vr_shell/vr_gl_util.h" 7 #include "chrome/browser/android/vr_shell/vr_gl_util.h"
8 #include "chrome/grit/browser_resources.h"
9 #include "ui/base/resource/resource_bundle.h"
10 #include "ui/gfx/codec/png_codec.h"
8 #include "ui/gl/gl_bindings.h" 11 #include "ui/gl/gl_bindings.h"
9 12
10 namespace { 13 namespace {
11 14
12 #define RECTANGULAR_TEXTURE_BUFFER(left, right, bottom, top) \ 15 #define RECTANGULAR_TEXTURE_BUFFER(left, right, bottom, top) \
13 { left, bottom, left, top, right, bottom, left, top, right, top, right, \ 16 { left, bottom, left, top, right, bottom, left, top, right, top, right, \
14 bottom } 17 bottom }
15 18
16 static constexpr float kHalfHeight = 0.5f; 19 static constexpr float kHalfHeight = 0.5f;
17 static constexpr float kHalfWidth = 0.5f; 20 static constexpr float kHalfWidth = 0.5f;
(...skipping 16 matching lines...) Expand all
34 -1.f, -1.f, 0.f, 1.f, 37 -1.f, -1.f, 0.f, 1.f,
35 0.f, -1.f, 1.f, 1.f, 38 0.f, -1.f, 1.f, 1.f,
36 0.f, 1.f, 1.f, 0.f, 39 0.f, 1.f, 1.f, 0.f,
37 40
38 0.f, 1.f, 0.f, 0.f, // Right Eye 41 0.f, 1.f, 0.f, 0.f, // Right Eye
39 0.f, -1.f, 0.f, 1.f, 42 0.f, -1.f, 0.f, 1.f,
40 1.f, -1.f, 1.f, 1.f, 43 1.f, -1.f, 1.f, 1.f,
41 1.f, 1.f, 1.f, 0.f }; 44 1.f, 1.f, 1.f, 0.f };
42 const int kWebVrVerticesSize = sizeof(float) * 32; 45 const int kWebVrVerticesSize = sizeof(float) * 32;
43 46
47 const float kOverlayIconVertices[32] = {
48 // x y u, v
49 -1.f, 1.f, 0.f, 0.f,
50 -1.f, -1.f, 0.f, 1.f,
51 1.f, -1.f, 1.f, 1.f,
52 1.f, 1.f, 1.f, 0.f};
53 const int kOverlayIconVerticesSize = sizeof(float) * 16;
54
44 // Reticle constants 55 // Reticle constants
45 static constexpr float kRingDiameter = 1.0f; 56 static constexpr float kRingDiameter = 1.0f;
46 static constexpr float kInnerHole = 0.0f; 57 static constexpr float kInnerHole = 0.0f;
47 static constexpr float kInnerRingEnd = 0.177f; 58 static constexpr float kInnerRingEnd = 0.177f;
48 static constexpr float kInnerRingThickness = 0.14f; 59 static constexpr float kInnerRingThickness = 0.14f;
49 static constexpr float kMidRingEnd = 0.177f; 60 static constexpr float kMidRingEnd = 0.177f;
50 static constexpr float kMidRingOpacity = 0.22f; 61 static constexpr float kMidRingOpacity = 0.22f;
51 static constexpr float kReticleColor[] = {1.0f, 1.0f, 1.0f, 1.0f}; 62 static constexpr float kReticleColor[] = {1.0f, 1.0f, 1.0f, 1.0f};
52 63
53 // Laser constants 64 // Laser constants
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 mediump vec2 uv = v_TexCoordinate; 178 mediump vec2 uv = v_TexCoordinate;
168 mediump float front_fade_factor = 1.0 - 179 mediump float front_fade_factor = 1.0 -
169 clamp(1.0 - (uv.y - fade_point) / (1.0 - fade_point), 0.0, 1.0); 180 clamp(1.0 - (uv.y - fade_point) / (1.0 - fade_point), 0.0, 1.0);
170 mediump float back_fade_factor = 181 mediump float back_fade_factor =
171 clamp((uv.y - fade_point) / (fade_end - fade_point), 0.0, 1.0); 182 clamp((uv.y - fade_point) / (fade_end - fade_point), 0.0, 1.0);
172 mediump float total_fade = front_fade_factor * back_fade_factor; 183 mediump float total_fade = front_fade_factor * back_fade_factor;
173 lowp vec4 texture_color = texture2D(texture_unit, uv); 184 lowp vec4 texture_color = texture2D(texture_unit, uv);
174 lowp vec4 final_color = color * texture_color; 185 lowp vec4 final_color = color * texture_color;
175 gl_FragColor = vec4(final_color.xyz, final_color.w * total_fade); 186 gl_FragColor = vec4(final_color.xyz, final_color.w * total_fade);
176 }); 187 });
188 case vr_shell::ShaderID::OVERLAY_ICON_VERTEX_SHADER:
189 return SHADER(
190 uniform mat4 u_CombinedMatrix;
191 attribute vec2 a_Position;
192 attribute vec2 a_TexCoordinate;
193 uniform vec4 u_SrcRect;
194 varying vec2 v_TexCoordinate;
195
196 void main() {
197 v_TexCoordinate = u_SrcRect.xy + (a_TexCoordinate * u_SrcRect.zw);
198 gl_Position = u_CombinedMatrix * vec4(a_Position, 0.0, 1.0);
199 });
200 case vr_shell::ShaderID::OVERLAY_ICON_FRAGMENT_SHADER:
201 return SHADER(
202 precision highp float;
203 uniform sampler2D u_Texture;
204 varying vec2 v_TexCoordinate;
205
206 void main() {
207 gl_FragColor = texture2D(u_Texture, v_TexCoordinate);
208 });
177 default: 209 default:
178 LOG(ERROR) << "Shader source requested for unknown shader"; 210 LOG(ERROR) << "Shader source requested for unknown shader";
179 return ""; 211 return "";
180 } 212 }
181 } 213 }
182 214
183 #undef RECTANGULAR_TEXTURE_BUFFER 215 #undef RECTANGULAR_TEXTURE_BUFFER
184 } // namespace 216 } // namespace
185 217
186 namespace vr_shell { 218 namespace vr_shell {
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 glUniform1f(fade_end_handle_, kFadeEnd); 464 glUniform1f(fade_end_handle_, kFadeEnd);
433 465
434 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); 466 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
435 467
436 glDisableVertexAttribArray(position_handle_); 468 glDisableVertexAttribArray(position_handle_);
437 glDisableVertexAttribArray(tex_coord_handle_); 469 glDisableVertexAttribArray(tex_coord_handle_);
438 } 470 }
439 471
440 LaserRenderer::~LaserRenderer() = default; 472 LaserRenderer::~LaserRenderer() = default;
441 473
474 void MakeTexImage(int resource_id,
475 GLuint texture_data_handles[],
476 int icon_id) {
477 std::string data_str = ResourceBundle::GetSharedInstance().GetRawDataResource(
478 resource_id).as_string();
479 std::vector<unsigned char> data(data_str.begin(), data_str.end());
billorr 2016/09/23 17:52:11 this is doing a copy, right? do we need to copy?
480 std::vector<unsigned char> decoded;
481 int width, height;
482
483 // This decoder isn't suitable for externally-supplied data, but in
484 // this case we're using it to decode a built-in resource supplied
485 // at build time. Don't use this for untrusted images.
486 gfx::PNGCodec::Decode(&data[0], data.size(),
billorr 2016/09/23 17:52:11 why not data.data()? I believe our coding convent
487 gfx::PNGCodec::FORMAT_RGBA,
488 &decoded, &width, &height);
489
490 glBindTexture(GL_TEXTURE_2D, texture_data_handles[icon_id]);
491
492 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height,
493 0, GL_RGBA, GL_UNSIGNED_BYTE, &decoded[0]);
494
495 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
496 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
497 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
498 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
499 }
500
501 OverlayIconRenderer::OverlayIconRenderer() {
502 bounds_ = { 0.0f, 0.0f, 1.0f, 1.0f };
503
504 std::string error;
505 GLuint vertex_shader_handle = CompileShader(
506 GL_VERTEX_SHADER, GetShaderSource(OVERLAY_ICON_VERTEX_SHADER), error);
507 CHECK(vertex_shader_handle) << error;
508
509 GLuint fragment_shader_handle = CompileShader(
510 GL_FRAGMENT_SHADER, GetShaderSource(OVERLAY_ICON_FRAGMENT_SHADER), error);
511 CHECK(fragment_shader_handle) << error;
512
513 program_handle_ = CreateAndLinkProgram(
514 vertex_shader_handle, fragment_shader_handle, error);
515 CHECK(program_handle_) << error;
516
517 // Once the program is linked the shader objects are no longer needed
518 glDeleteShader(vertex_shader_handle);
519 glDeleteShader(fragment_shader_handle);
520
521 combined_matrix_handle_ =
522 glGetUniformLocation(program_handle_, "u_CombinedMatrix");
523 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
524 src_rect_uniform_handle_ = glGetUniformLocation(program_handle_, "u_SrcRect");
525 position_handle_ = glGetAttribLocation(program_handle_, "a_Position");
526 texcoord_handle_ = glGetAttribLocation(program_handle_, "a_TexCoordinate");
527
528 // TODO(bajones): Figure out why this need to be restored.
529 GLint old_buffer;
530 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &old_buffer);
531
532 glGenBuffersARB(1, &vertex_buffer_);
533 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
534 glBufferData(GL_ARRAY_BUFFER, kOverlayIconVerticesSize, kOverlayIconVertices,
535 GL_STATIC_DRAW);
536
537 glBindBuffer(GL_ARRAY_BUFFER, old_buffer);
538
539 glGenTextures(ICON_ID_MAX, texture_data_handles_);
540
541 MakeTexImage(IDR_VR_SHELL_WEBVR_NOT_SECURE_PERMANENT_PNG,
542 texture_data_handles_,
543 ICON_INSECURE_PERMANENT);
544 MakeTexImage(IDR_VR_SHELL_WEBVR_NOT_SECURE_TRANSIENT_PNG,
545 texture_data_handles_,
546 ICON_INSECURE_TRANSIENT);
547 }
548
549 void OverlayIconRenderer::Draw(const gvr::Mat4f& combined_matrix,
550 int icon_num) {
551 // TODO(bajones): Figure out why this need to be restored.
552 GLint old_buffer;
553 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &old_buffer);
554
555 glUseProgram(program_handle_);
556
557 // Bind vertex attributes
558 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
559
560 glEnableVertexAttribArray(position_handle_);
561 glEnableVertexAttribArray(texcoord_handle_);
562
563 // Pass in model view project matrix.
564 glUniformMatrix4fv(combined_matrix_handle_, 1, false,
565 MatrixToGLArray(combined_matrix).data());
566
567 glVertexAttribPointer(position_handle_, POSITION_ELEMENTS, GL_FLOAT, false,
568 VERTEX_STRIDE, VOID_OFFSET(POSITION_OFFSET));
569 glVertexAttribPointer(texcoord_handle_, TEXCOORD_ELEMENTS, GL_FLOAT, false,
570 VERTEX_STRIDE, VOID_OFFSET(TEXCOORD_OFFSET));
571
572 // Bind texture.
573 glActiveTexture(GL_TEXTURE0);
574 glBindTexture(GL_TEXTURE_2D, texture_data_handles_[icon_num]);
575 glUniform1i(tex_uniform_handle_, 0);
576
577 glEnable(GL_BLEND);
578 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
579
580 glUniform4fv(src_rect_uniform_handle_, 1, (float*)(&bounds_));
581 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
582
583 glDisableVertexAttribArray(position_handle_);
584 glDisableVertexAttribArray(texcoord_handle_);
585
586 glBindBuffer(GL_ARRAY_BUFFER, old_buffer);
587 }
588
589 OverlayIconRenderer::~OverlayIconRenderer() = default;
590
442 VrShellRenderer::VrShellRenderer() 591 VrShellRenderer::VrShellRenderer()
443 : textured_quad_renderer_(new TexturedQuadRenderer), 592 : textured_quad_renderer_(new TexturedQuadRenderer),
444 webvr_renderer_(new WebVrRenderer), 593 webvr_renderer_(new WebVrRenderer),
445 reticle_renderer_(new ReticleRenderer), 594 reticle_renderer_(new ReticleRenderer),
446 laser_renderer_(new LaserRenderer) {} 595 laser_renderer_(new LaserRenderer),
596 overlay_icon_renderer_(new OverlayIconRenderer) {}
447 597
448 VrShellRenderer::~VrShellRenderer() = default; 598 VrShellRenderer::~VrShellRenderer() = default;
449 599
450 } // namespace vr_shell 600 } // namespace vr_shell
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698