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

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: Moving code to more appropriate locations. 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
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell_renderer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(std::unique_ptr<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 const gltf::Accessor* accessor = model->PositionAccessor();
560 position_components_ = gltf::GetTypeComponents(accessor->type);
561 position_type_ = accessor->component_type;
562 position_stride_ = accessor->byte_stride;
563 position_offset_ = VOID_OFFSET(accessor->byte_offset);
564
565 accessor = model->TextureCoordinateAccessor();
566 tex_coord_components_ = gltf::GetTypeComponents(accessor->type);
567 tex_coord_type_ = accessor->component_type;
568 tex_coord_stride_ = accessor->byte_stride;
569 tex_coord_offset_ = VOID_OFFSET(accessor->byte_offset);
570
571 draw_mode_ = model->DrawMode();
572 accessor = model->IndicesAccessor();
573 indices_count_ = accessor->count;
574 indices_type_ = accessor->component_type;
575 indices_offset_ = VOID_OFFSET(accessor->byte_offset);
576 setup_ = true;
577 }
578
579 void ControllerRenderer::Draw(VrControllerModel::State state,
580 const gvr::Mat4f& view_proj_matrix) {
581 glUseProgram(program_handle_);
582
583 glUniformMatrix4fv(model_view_proj_matrix_handle_, 1, false,
584 MatrixToGLArray(view_proj_matrix).data());
585
586 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
587
588 glVertexAttribPointer(position_handle_, position_components_, position_type_,
589 GL_FALSE, position_stride_, position_offset_);
590 glEnableVertexAttribArray(position_handle_);
591
592 glVertexAttribPointer(tex_coord_handle_, tex_coord_components_,
593 tex_coord_type_, GL_FALSE, tex_coord_stride_,
594 tex_coord_offset_);
595 glEnableVertexAttribArray(tex_coord_handle_);
596
597 glEnable(GL_BLEND);
598 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
599
600 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices_buffer_);
601
602 glActiveTexture(GL_TEXTURE0);
603 glBindTexture(GL_TEXTURE_2D, texture_handles_[state]);
604 glUniform1i(tex_uniform_handle_, 0);
605
606 glDrawElements(draw_mode_, indices_count_, indices_type_, indices_offset_);
607 }
608
510 GradientQuadRenderer::GradientQuadRenderer() 609 GradientQuadRenderer::GradientQuadRenderer()
511 : BaseQuadRenderer(GRADIENT_QUAD_VERTEX_SHADER, 610 : BaseQuadRenderer(GRADIENT_QUAD_VERTEX_SHADER,
512 GRADIENT_QUAD_FRAGMENT_SHADER) { 611 GRADIENT_QUAD_FRAGMENT_SHADER) {
513 model_view_proj_matrix_handle_ = 612 model_view_proj_matrix_handle_ =
514 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); 613 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix");
515 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius"); 614 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius");
516 center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor"); 615 center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor");
517 edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor"); 616 edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor");
518 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity"); 617 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity");
519 } 618 }
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 721
623 size_t vertex_buffer_size = sizeof(Line3d) * linesNumber; 722 size_t vertex_buffer_size = sizeof(Line3d) * linesNumber;
624 723
625 glGenBuffersARB(1, &vertex_buffer_); 724 glGenBuffersARB(1, &vertex_buffer_);
626 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); 725 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_);
627 glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size, grid_lines_.data(), 726 glBufferData(GL_ARRAY_BUFFER, vertex_buffer_size, grid_lines_.data(),
628 GL_STATIC_DRAW); 727 GL_STATIC_DRAW);
629 } 728 }
630 729
631 VrShellRenderer::VrShellRenderer() 730 VrShellRenderer::VrShellRenderer()
632 : textured_quad_renderer_(new TexturedQuadRenderer), 731 : textured_quad_renderer_(base::MakeUnique<TexturedQuadRenderer>()),
633 webvr_renderer_(new WebVrRenderer), 732 webvr_renderer_(base::MakeUnique<WebVrRenderer>()),
634 reticle_renderer_(new ReticleRenderer), 733 reticle_renderer_(base::MakeUnique<ReticleRenderer>()),
635 laser_renderer_(new LaserRenderer), 734 laser_renderer_(base::MakeUnique<LaserRenderer>()),
636 gradient_quad_renderer_(new GradientQuadRenderer), 735 controller_renderer_(base::MakeUnique<ControllerRenderer>()),
637 gradient_grid_renderer_(new GradientGridRenderer) {} 736 gradient_quad_renderer_(base::MakeUnique<GradientQuadRenderer>()),
737 gradient_grid_renderer_(base::MakeUnique<GradientGridRenderer>()) {
738 BaseQuadRenderer::SetVertexBuffer();
739 }
638 740
639 VrShellRenderer::~VrShellRenderer() = default; 741 VrShellRenderer::~VrShellRenderer() = default;
640 742
641 } // namespace vr_shell 743 } // namespace vr_shell
OLDNEW
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell_renderer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698