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

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

Issue 2775283004: Rendering Daydream controller in a fixed position. (Closed)
Patch Set: Using textures for corresponding button states. Created 3 years, 8 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 <math.h> 7 #include <math.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <string> 9 #include <string>
10 10
11 #include "base/memory/ptr_util.h"
11 #include "chrome/browser/android/vr_shell/vr_gl_util.h" 12 #include "chrome/browser/android/vr_shell/vr_gl_util.h"
12 13
13 namespace { 14 namespace {
14 15
15 static constexpr float kHalfSize = 0.5f; 16 static constexpr float kHalfSize = 0.5f;
16 /* clang-format off */ 17 /* clang-format off */
17 static constexpr float kTextureQuadVertices[30] = { 18 static constexpr float kTextureQuadVertices[30] = {
18 // x y z, u, v 19 // x y z, u, v
19 -kHalfSize, kHalfSize, 0.0f, 0.0f, 0.0f, 20 -kHalfSize, kHalfSize, 0.0f, 0.0f, 0.0f,
20 -kHalfSize, -kHalfSize, 0.0f, 0.0f, 1.0f, 21 -kHalfSize, -kHalfSize, 0.0f, 0.0f, 1.0f,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 67
67 #define SHADER(Src) #Src 68 #define SHADER(Src) #Src
68 #define OEIE_SHADER(Src) "#extension GL_OES_EGL_image_external : require\n" #Src 69 #define OEIE_SHADER(Src) "#extension GL_OES_EGL_image_external : require\n" #Src
69 #define VOID_OFFSET(x) reinterpret_cast<void*>(x) 70 #define VOID_OFFSET(x) reinterpret_cast<void*>(x)
70 71
71 const char* GetShaderSource(vr_shell::ShaderID shader) { 72 const char* GetShaderSource(vr_shell::ShaderID shader) {
72 switch (shader) { 73 switch (shader) {
73 case vr_shell::ShaderID::TEXTURE_QUAD_VERTEX_SHADER: 74 case vr_shell::ShaderID::TEXTURE_QUAD_VERTEX_SHADER:
74 case vr_shell::ShaderID::RETICLE_VERTEX_SHADER: 75 case vr_shell::ShaderID::RETICLE_VERTEX_SHADER:
75 case vr_shell::ShaderID::LASER_VERTEX_SHADER: 76 case vr_shell::ShaderID::LASER_VERTEX_SHADER:
77 case vr_shell::ShaderID::CONTROLLER_VERTEX_SHADER:
76 return SHADER( 78 return SHADER(
77 /* clang-format off */ 79 /* clang-format off */
78 uniform mat4 u_ModelViewProjMatrix; 80 uniform mat4 u_ModelViewProjMatrix;
79 attribute vec4 a_Position; 81 attribute vec4 a_Position;
80 attribute vec2 a_TexCoordinate; 82 attribute vec2 a_TexCoordinate;
81 varying vec2 v_TexCoordinate; 83 varying vec2 v_TexCoordinate;
82 84
83 void main() { 85 void main() {
84 v_TexCoordinate = a_TexCoordinate; 86 v_TexCoordinate = a_TexCoordinate;
85 gl_Position = u_ModelViewProjMatrix * a_Position; 87 gl_Position = u_ModelViewProjMatrix * a_Position;
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 uniform vec4 u_EdgeColor; 208 uniform vec4 u_EdgeColor;
207 uniform mediump float u_Opacity; 209 uniform mediump float u_Opacity;
208 210
209 void main() { 211 void main() {
210 float edgeColorWeight = clamp(length(v_GridPosition), 0.0, 1.0); 212 float edgeColorWeight = clamp(length(v_GridPosition), 0.0, 1.0);
211 float centerColorWeight = 1.0 - edgeColorWeight; 213 float centerColorWeight = 1.0 - edgeColorWeight;
212 gl_FragColor = (u_CenterColor * centerColorWeight + 214 gl_FragColor = (u_CenterColor * centerColorWeight +
213 u_EdgeColor * edgeColorWeight) * vec4(1.0, 1.0, 1.0, u_Opacity); 215 u_EdgeColor * edgeColorWeight) * vec4(1.0, 1.0, 1.0, u_Opacity);
214 } 216 }
215 /* clang-format on */); 217 /* clang-format on */);
218 case vr_shell::ShaderID::CONTROLLER_FRAGMENT_SHADER:
219 return SHADER(
220 /* clang-format off */
221 uniform sampler2D u_texture;
222 varying vec2 v_TexCoordinate;
223
224 void main() {
225 gl_FragColor = texture2D(u_texture, v_TexCoordinate);
226 }
227 /* clang-format on */);
216 default: 228 default:
217 LOG(ERROR) << "Shader source requested for unknown shader"; 229 LOG(ERROR) << "Shader source requested for unknown shader";
218 return ""; 230 return "";
219 } 231 }
220 } 232 }
221 233
222 } // namespace 234 } // namespace
223 235
224 namespace vr_shell { 236 namespace vr_shell {
225 237
(...skipping 14 matching lines...) Expand all
240 // Once the program is linked the shader objects are no longer needed 252 // Once the program is linked the shader objects are no longer needed
241 glDeleteShader(vertex_shader_handle); 253 glDeleteShader(vertex_shader_handle);
242 glDeleteShader(fragment_shader_handle); 254 glDeleteShader(fragment_shader_handle);
243 255
244 position_handle_ = glGetAttribLocation(program_handle_, "a_Position"); 256 position_handle_ = glGetAttribLocation(program_handle_, "a_Position");
245 tex_coord_handle_ = glGetAttribLocation(program_handle_, "a_TexCoordinate"); 257 tex_coord_handle_ = glGetAttribLocation(program_handle_, "a_TexCoordinate");
246 } 258 }
247 259
248 BaseRenderer::~BaseRenderer() = default; 260 BaseRenderer::~BaseRenderer() = default;
249 261
250 void BaseRenderer::PrepareToDraw(GLuint view_proj_matrix_handle, 262 BaseQuadRenderer::BaseQuadRenderer(ShaderID vertex_id, ShaderID fragment_id)
251 const gvr::Mat4f& view_proj_matrix) { 263 : BaseRenderer(vertex_id, fragment_id) {}
264
265 GLuint BaseQuadRenderer::vertex_buffer_ = 0;
266
267 BaseQuadRenderer::~BaseQuadRenderer() = default;
268
269 void BaseQuadRenderer::PrepareToDraw(GLuint view_proj_matrix_handle,
270 const gvr::Mat4f& view_proj_matrix) {
252 glUseProgram(program_handle_); 271 glUseProgram(program_handle_);
253 272
254 // Pass in model view project matrix. 273 // Pass in model view project matrix.
255 glUniformMatrix4fv(view_proj_matrix_handle, 1, false, 274 glUniformMatrix4fv(view_proj_matrix_handle, 1, false,
256 MatrixToGLArray(view_proj_matrix).data()); 275 MatrixToGLArray(view_proj_matrix).data());
257 276
258 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); 277 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
259 278
260 // Set up position attribute. 279 // Set up position attribute.
261 glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false, 280 glVertexAttribPointer(position_handle_, kPositionDataSize, GL_FLOAT, false,
262 kTextureQuadDataStride, 281 kTextureQuadDataStride,
263 VOID_OFFSET(kPositionDataOffset)); 282 VOID_OFFSET(kPositionDataOffset));
264 glEnableVertexAttribArray(position_handle_); 283 glEnableVertexAttribArray(position_handle_);
265 284
266 // Set up texture coordinate attribute. 285 // Set up texture coordinate attribute.
267 glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT, 286 glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT,
268 false, kTextureQuadDataStride, 287 false, kTextureQuadDataStride,
269 VOID_OFFSET(kTextureCoordinateDataOffset)); 288 VOID_OFFSET(kTextureCoordinateDataOffset));
270 glEnableVertexAttribArray(tex_coord_handle_); 289 glEnableVertexAttribArray(tex_coord_handle_);
271 290
272 glEnable(GL_BLEND); 291 glEnable(GL_BLEND);
273 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 292 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
274 } 293 }
275 294
276 BaseQuadRenderer::BaseQuadRenderer(ShaderID vertex_id, ShaderID fragment_id) 295 void BaseQuadRenderer::SetVertexBuffer() {
277 : BaseRenderer(vertex_id, fragment_id) {
278 glGenBuffersARB(1, &vertex_buffer_); 296 glGenBuffersARB(1, &vertex_buffer_);
279 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); 297 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
280 glBufferData(GL_ARRAY_BUFFER, kTextureQuadVerticesSize, kTextureQuadVertices, 298 glBufferData(GL_ARRAY_BUFFER, kTextureQuadVerticesSize, kTextureQuadVertices,
281 GL_STATIC_DRAW); 299 GL_STATIC_DRAW);
282 } 300 }
283 301
284 BaseQuadRenderer::~BaseQuadRenderer() = default;
285
286 TexturedQuadRenderer::TexturedQuadRenderer() 302 TexturedQuadRenderer::TexturedQuadRenderer()
287 : BaseQuadRenderer(TEXTURE_QUAD_VERTEX_SHADER, 303 : BaseQuadRenderer(TEXTURE_QUAD_VERTEX_SHADER,
288 TEXTURE_QUAD_FRAGMENT_SHADER) { 304 TEXTURE_QUAD_FRAGMENT_SHADER) {
289 model_view_proj_matrix_handle_ = 305 model_view_proj_matrix_handle_ =
290 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); 306 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
291 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); 307 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
292 copy_rect_uniform_handle_ = 308 copy_rect_uniform_handle_ =
293 glGetUniformLocation(program_handle_, "u_CopyRect"); 309 glGetUniformLocation(program_handle_, "u_CopyRect");
294 opacity_handle_ = glGetUniformLocation(program_handle_, "opacity"); 310 opacity_handle_ = glGetUniformLocation(program_handle_, "opacity");
295 } 311 }
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 glUniform1f(fade_end_handle_, kFadeEnd); 516 glUniform1f(fade_end_handle_, kFadeEnd);
501 517
502 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); 518 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber);
503 519
504 glDisableVertexAttribArray(position_handle_); 520 glDisableVertexAttribArray(position_handle_);
505 glDisableVertexAttribArray(tex_coord_handle_); 521 glDisableVertexAttribArray(tex_coord_handle_);
506 } 522 }
507 523
508 LaserRenderer::~LaserRenderer() = default; 524 LaserRenderer::~LaserRenderer() = default;
509 525
526 ControllerRenderer::ControllerRenderer()
527 : BaseRenderer(CONTROLLER_VERTEX_SHADER, CONTROLLER_FRAGMENT_SHADER),
528 texture_handles_(VrControllerModel::STATE_COUNT) {
529 model_view_proj_matrix_handle_ =
530 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
531 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture");
532 }
533
534 ControllerRenderer::~ControllerRenderer() = default;
535
536 void ControllerRenderer::SetUp(const VrControllerModel& model) {
537 glGenBuffersARB(1, &indices_buffer_);
538 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer_);
539 glBufferData(GL_ELEMENT_ARRAY_BUFFER, model.IndicesBufferSize(),
540 model.IndicesBuffer(), GL_STATIC_DRAW);
541
542 glGenBuffersARB(1, &vertex_buffer_);
543 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
544 glBufferData(GL_ARRAY_BUFFER, model.ElementsBufferSize(),
545 model.ElementsBuffer(), GL_STATIC_DRAW);
546
547 glGenTextures(VrControllerModel::STATE_COUNT, texture_handles_.data());
548 for (int i = 0; i < VrControllerModel::STATE_COUNT; i++) {
549 glBindTexture(GL_TEXTURE_2D, texture_handles_[i]);
550 const SkBitmap* bitmap = model.GetTexture(i);
551 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap->width(), bitmap->height(),
552 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap->getPixels());
553 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
554 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
555 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
556 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
557 }
558 }
559
560 void ControllerRenderer::Draw(const VrControllerModel& model,
561 VrControllerModel::State state,
562 const gvr::Mat4f& view_proj_matrix) {
563 glUseProgram(program_handle_);
564
565 glUniformMatrix4fv(model_view_proj_matrix_handle_, 1, false,
566 MatrixToGLArray(view_proj_matrix).data());
567
568 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
569
570 const gltf::Accessor* accessor = model.PositionAccessor();
571 glVertexAttribPointer(
572 position_handle_, gltf::GetTypeComponents(accessor->type),
573 accessor->component_type, GL_FALSE, accessor->byte_stride,
574 VOID_OFFSET(accessor->byte_offset));
575 glEnableVertexAttribArray(position_handle_);
576
577 accessor = model.TextureCoordinateAccessor();
578 glVertexAttribPointer(
579 tex_coord_handle_, gltf::GetTypeComponents(accessor->type),
580 accessor->component_type, GL_FALSE, accessor->byte_stride,
581 VOID_OFFSET(accessor->byte_offset));
582 glEnableVertexAttribArray(tex_coord_handle_);
583
584 glEnable(GL_BLEND);
585 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
586
587 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer_);
588
589 glActiveTexture(GL_TEXTURE0);
590 glBindTexture(GL_TEXTURE_2D, texture_handles_[state]);
591 glUniform1i(tex_uniform_handle_, 0);
592
593 accessor = model.IndicesAccessor();
594 glDrawElements(model.DrawMode(), accessor->count, accessor->component_type,
595 VOID_OFFSET(accessor->byte_offset));
596 }
597
510 GradientQuadRenderer::GradientQuadRenderer() 598 GradientQuadRenderer::GradientQuadRenderer()
511 : BaseQuadRenderer(GRADIENT_QUAD_VERTEX_SHADER, 599 : BaseQuadRenderer(GRADIENT_QUAD_VERTEX_SHADER,
512 GRADIENT_QUAD_FRAGMENT_SHADER) { 600 GRADIENT_QUAD_FRAGMENT_SHADER) {
513 model_view_proj_matrix_handle_ = 601 model_view_proj_matrix_handle_ =
514 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); 602 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
515 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius"); 603 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius");
516 center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor"); 604 center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor");
517 edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor"); 605 edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor");
518 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity"); 606 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity");
519 } 607 }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 710
623 size_t vertex_buffer_size = sizeof(Line3d) * linesNumber; 711 size_t vertex_buffer_size = sizeof(Line3d) * linesNumber;
624 712
625 glGenBuffersARB(1, &vertex_buffer_); 713 glGenBuffersARB(1, &vertex_buffer_);
626 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); 714 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
627 glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size, grid_lines_.data(), 715 glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size, grid_lines_.data(),
628 GL_STATIC_DRAW); 716 GL_STATIC_DRAW);
629 } 717 }
630 718
631 VrShellRenderer::VrShellRenderer() 719 VrShellRenderer::VrShellRenderer()
632 : textured_quad_renderer_(new TexturedQuadRenderer), 720 : textured_quad_renderer_(base::MakeUnique<TexturedQuadRenderer>()),
cjgrant 2017/03/29 13:20:54 Thank you. :)
acondor_ 2017/03/29 20:13:26 :)
633 webvr_renderer_(new WebVrRenderer), 721 webvr_renderer_(base::MakeUnique<WebVrRenderer>()),
634 reticle_renderer_(new ReticleRenderer), 722 reticle_renderer_(base::MakeUnique<ReticleRenderer>()),
635 laser_renderer_(new LaserRenderer), 723 laser_renderer_(base::MakeUnique<LaserRenderer>()),
636 gradient_quad_renderer_(new GradientQuadRenderer), 724 controller_renderer_(base::MakeUnique<ControllerRenderer>()),
637 gradient_grid_renderer_(new GradientGridRenderer) {} 725 gradient_quad_renderer_(base::MakeUnique<GradientQuadRenderer>()),
726 gradient_grid_renderer_(base::MakeUnique<GradientGridRenderer>()) {
727 BaseQuadRenderer::SetVertexBuffer();
728 }
638 729
639 VrShellRenderer::~VrShellRenderer() = default; 730 VrShellRenderer::~VrShellRenderer() = default;
640 731
641 } // namespace vr_shell 732 } // namespace vr_shell
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698