Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |