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(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 Loading... |
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 |
OLD | NEW |