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 |