| 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 |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 default: | 216 default: |
| 217 LOG(ERROR) << "Shader source requested for unknown shader"; | 217 LOG(ERROR) << "Shader source requested for unknown shader"; |
| 218 return ""; | 218 return ""; |
| 219 } | 219 } |
| 220 } | 220 } |
| 221 | 221 |
| 222 } // namespace | 222 } // namespace |
| 223 | 223 |
| 224 namespace vr_shell { | 224 namespace vr_shell { |
| 225 | 225 |
| 226 BaseRenderer::BaseRenderer(ShaderID vertex_id, | 226 BaseRenderer::BaseRenderer(ShaderID vertex_id, ShaderID fragment_id) { |
| 227 ShaderID fragment_id, | |
| 228 bool setup_vertex_buffer = true) { | |
| 229 std::string error; | 227 std::string error; |
| 230 GLuint vertex_shader_handle = | 228 GLuint vertex_shader_handle = |
| 231 CompileShader(GL_VERTEX_SHADER, GetShaderSource(vertex_id), error); | 229 CompileShader(GL_VERTEX_SHADER, GetShaderSource(vertex_id), error); |
| 232 CHECK(vertex_shader_handle) << error; | 230 CHECK(vertex_shader_handle) << error; |
| 233 | 231 |
| 234 GLuint fragment_shader_handle = | 232 GLuint fragment_shader_handle = |
| 235 CompileShader(GL_FRAGMENT_SHADER, GetShaderSource(fragment_id), error); | 233 CompileShader(GL_FRAGMENT_SHADER, GetShaderSource(fragment_id), error); |
| 236 CHECK(fragment_shader_handle) << error; | 234 CHECK(fragment_shader_handle) << error; |
| 237 | 235 |
| 238 program_handle_ = | 236 program_handle_ = |
| 239 CreateAndLinkProgram(vertex_shader_handle, fragment_shader_handle, error); | 237 CreateAndLinkProgram(vertex_shader_handle, fragment_shader_handle, error); |
| 240 CHECK(program_handle_) << error; | 238 CHECK(program_handle_) << error; |
| 241 | 239 |
| 242 // Once the program is linked the shader objects are no longer needed | 240 // Once the program is linked the shader objects are no longer needed |
| 243 glDeleteShader(vertex_shader_handle); | 241 glDeleteShader(vertex_shader_handle); |
| 244 glDeleteShader(fragment_shader_handle); | 242 glDeleteShader(fragment_shader_handle); |
| 245 | 243 |
| 246 position_handle_ = glGetAttribLocation(program_handle_, "a_Position"); | 244 position_handle_ = glGetAttribLocation(program_handle_, "a_Position"); |
| 247 tex_coord_handle_ = glGetAttribLocation(program_handle_, "a_TexCoordinate"); | 245 tex_coord_handle_ = glGetAttribLocation(program_handle_, "a_TexCoordinate"); |
| 248 | 246 |
| 249 if (setup_vertex_buffer) { | 247 vertex_buffer_ = 0; |
| 250 // Generate the vertex buffer | |
| 251 glGenBuffersARB(1, &vertex_buffer_); | |
| 252 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); | |
| 253 glBufferData(GL_ARRAY_BUFFER, kTextureQuadVerticesSize, | |
| 254 kTextureQuadVertices, GL_STATIC_DRAW); | |
| 255 } else { | |
| 256 vertex_buffer_ = 0; | |
| 257 } | |
| 258 } | 248 } |
| 259 | 249 |
| 260 BaseRenderer::~BaseRenderer() = default; | 250 BaseRenderer::~BaseRenderer() = default; |
| 261 | 251 |
| 262 void BaseRenderer::PrepareToDraw(GLuint view_proj_matrix_handle, | 252 void BaseRenderer::PrepareToDraw(GLuint view_proj_matrix_handle, |
| 263 const gvr::Mat4f& view_proj_matrix) { | 253 const gvr::Mat4f& view_proj_matrix) { |
| 264 glUseProgram(program_handle_); | 254 glUseProgram(program_handle_); |
| 265 | 255 |
| 266 // Pass in model view project matrix. | 256 // Pass in model view project matrix. |
| 267 glUniformMatrix4fv(view_proj_matrix_handle, 1, false, | 257 glUniformMatrix4fv(view_proj_matrix_handle, 1, false, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 278 // Set up texture coordinate attribute. | 268 // Set up texture coordinate attribute. |
| 279 glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT, | 269 glVertexAttribPointer(tex_coord_handle_, kTextureCoordinateDataSize, GL_FLOAT, |
| 280 false, kTextureQuadDataStride, | 270 false, kTextureQuadDataStride, |
| 281 VOID_OFFSET(kTextureCoordinateDataOffset)); | 271 VOID_OFFSET(kTextureCoordinateDataOffset)); |
| 282 glEnableVertexAttribArray(tex_coord_handle_); | 272 glEnableVertexAttribArray(tex_coord_handle_); |
| 283 | 273 |
| 284 glEnable(GL_BLEND); | 274 glEnable(GL_BLEND); |
| 285 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 275 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); |
| 286 } | 276 } |
| 287 | 277 |
| 278 BaseQuadRenderer::BaseQuadRenderer(ShaderID vertex_id, ShaderID fragment_id) |
| 279 : BaseRenderer(vertex_id, fragment_id) { |
| 280 glGenBuffersARB(1, &vertex_buffer_); |
| 281 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); |
| 282 glBufferData(GL_ARRAY_BUFFER, kTextureQuadVerticesSize, kTextureQuadVertices, |
| 283 GL_STATIC_DRAW); |
| 284 } |
| 285 |
| 286 BaseQuadRenderer::~BaseQuadRenderer() = default; |
| 287 |
| 288 TexturedQuadRenderer::TexturedQuadRenderer() | 288 TexturedQuadRenderer::TexturedQuadRenderer() |
| 289 : BaseRenderer(TEXTURE_QUAD_VERTEX_SHADER, TEXTURE_QUAD_FRAGMENT_SHADER) { | 289 : BaseQuadRenderer(TEXTURE_QUAD_VERTEX_SHADER, |
| 290 TEXTURE_QUAD_FRAGMENT_SHADER) { |
| 290 model_view_proj_matrix_handle_ = | 291 model_view_proj_matrix_handle_ = |
| 291 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); | 292 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); |
| 292 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); | 293 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); |
| 293 copy_rect_uniform_handle_ = | 294 copy_rect_uniform_handle_ = |
| 294 glGetUniformLocation(program_handle_, "u_CopyRect"); | 295 glGetUniformLocation(program_handle_, "u_CopyRect"); |
| 295 opacity_handle_ = glGetUniformLocation(program_handle_, "opacity"); | 296 opacity_handle_ = glGetUniformLocation(program_handle_, "opacity"); |
| 296 } | 297 } |
| 297 | 298 |
| 298 void TexturedQuadRenderer::AddQuad(int texture_data_handle, | 299 void TexturedQuadRenderer::AddQuad(int texture_data_handle, |
| 299 const gvr::Mat4f& view_proj_matrix, | 300 const gvr::Mat4f& view_proj_matrix, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 quad_queue_.pop(); | 377 quad_queue_.pop(); |
| 377 } | 378 } |
| 378 | 379 |
| 379 glDisableVertexAttribArray(position_handle_); | 380 glDisableVertexAttribArray(position_handle_); |
| 380 glDisableVertexAttribArray(tex_coord_handle_); | 381 glDisableVertexAttribArray(tex_coord_handle_); |
| 381 } | 382 } |
| 382 | 383 |
| 383 TexturedQuadRenderer::~TexturedQuadRenderer() = default; | 384 TexturedQuadRenderer::~TexturedQuadRenderer() = default; |
| 384 | 385 |
| 385 WebVrRenderer::WebVrRenderer() | 386 WebVrRenderer::WebVrRenderer() |
| 386 : BaseRenderer(WEBVR_VERTEX_SHADER, WEBVR_FRAGMENT_SHADER) { | 387 : BaseQuadRenderer(WEBVR_VERTEX_SHADER, WEBVR_FRAGMENT_SHADER) { |
| 387 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); | 388 tex_uniform_handle_ = glGetUniformLocation(program_handle_, "u_Texture"); |
| 388 } | 389 } |
| 389 | 390 |
| 390 // Draw the stereo WebVR frame | 391 // Draw the stereo WebVR frame |
| 391 void WebVrRenderer::Draw(int texture_handle) { | 392 void WebVrRenderer::Draw(int texture_handle) { |
| 392 glUseProgram(program_handle_); | 393 glUseProgram(program_handle_); |
| 393 | 394 |
| 394 // Bind vertex attributes | 395 // Bind vertex attributes |
| 395 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); | 396 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_); |
| 396 | 397 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 423 glDisableVertexAttribArray(position_handle_); | 424 glDisableVertexAttribArray(position_handle_); |
| 424 glDisableVertexAttribArray(tex_coord_handle_); | 425 glDisableVertexAttribArray(tex_coord_handle_); |
| 425 } | 426 } |
| 426 | 427 |
| 427 // Note that we don't explicitly delete gl objects here, they're deleted | 428 // Note that we don't explicitly delete gl objects here, they're deleted |
| 428 // automatically when we call ShutdownGL, and deleting them here leads to | 429 // automatically when we call ShutdownGL, and deleting them here leads to |
| 429 // segfaults. | 430 // segfaults. |
| 430 WebVrRenderer::~WebVrRenderer() = default; | 431 WebVrRenderer::~WebVrRenderer() = default; |
| 431 | 432 |
| 432 ReticleRenderer::ReticleRenderer() | 433 ReticleRenderer::ReticleRenderer() |
| 433 : BaseRenderer(RETICLE_VERTEX_SHADER, RETICLE_FRAGMENT_SHADER) { | 434 : BaseQuadRenderer(RETICLE_VERTEX_SHADER, RETICLE_FRAGMENT_SHADER) { |
| 434 model_view_proj_matrix_handle_ = | 435 model_view_proj_matrix_handle_ = |
| 435 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); | 436 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); |
| 436 color_handle_ = glGetUniformLocation(program_handle_, "color"); | 437 color_handle_ = glGetUniformLocation(program_handle_, "color"); |
| 437 ring_diameter_handle_ = | 438 ring_diameter_handle_ = |
| 438 glGetUniformLocation(program_handle_, "ring_diameter"); | 439 glGetUniformLocation(program_handle_, "ring_diameter"); |
| 439 inner_hole_handle_ = glGetUniformLocation(program_handle_, "inner_hole"); | 440 inner_hole_handle_ = glGetUniformLocation(program_handle_, "inner_hole"); |
| 440 inner_ring_end_handle_ = | 441 inner_ring_end_handle_ = |
| 441 glGetUniformLocation(program_handle_, "inner_ring_end"); | 442 glGetUniformLocation(program_handle_, "inner_ring_end"); |
| 442 inner_ring_thickness_handle_ = | 443 inner_ring_thickness_handle_ = |
| 443 glGetUniformLocation(program_handle_, "inner_ring_thickness"); | 444 glGetUniformLocation(program_handle_, "inner_ring_thickness"); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 460 | 461 |
| 461 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); | 462 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); |
| 462 | 463 |
| 463 glDisableVertexAttribArray(position_handle_); | 464 glDisableVertexAttribArray(position_handle_); |
| 464 glDisableVertexAttribArray(tex_coord_handle_); | 465 glDisableVertexAttribArray(tex_coord_handle_); |
| 465 } | 466 } |
| 466 | 467 |
| 467 ReticleRenderer::~ReticleRenderer() = default; | 468 ReticleRenderer::~ReticleRenderer() = default; |
| 468 | 469 |
| 469 LaserRenderer::LaserRenderer() | 470 LaserRenderer::LaserRenderer() |
| 470 : BaseRenderer(LASER_VERTEX_SHADER, LASER_FRAGMENT_SHADER) { | 471 : BaseQuadRenderer(LASER_VERTEX_SHADER, LASER_FRAGMENT_SHADER) { |
| 471 model_view_proj_matrix_handle_ = | 472 model_view_proj_matrix_handle_ = |
| 472 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); | 473 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); |
| 473 texture_unit_handle_ = glGetUniformLocation(program_handle_, "texture_unit"); | 474 texture_unit_handle_ = glGetUniformLocation(program_handle_, "texture_unit"); |
| 474 color_handle_ = glGetUniformLocation(program_handle_, "color"); | 475 color_handle_ = glGetUniformLocation(program_handle_, "color"); |
| 475 fade_point_handle_ = glGetUniformLocation(program_handle_, "fade_point"); | 476 fade_point_handle_ = glGetUniformLocation(program_handle_, "fade_point"); |
| 476 fade_end_handle_ = glGetUniformLocation(program_handle_, "fade_end"); | 477 fade_end_handle_ = glGetUniformLocation(program_handle_, "fade_end"); |
| 477 | 478 |
| 478 glGenTextures(1, &texture_data_handle_); | 479 glGenTextures(1, &texture_data_handle_); |
| 479 glBindTexture(GL_TEXTURE_2D, texture_data_handle_); | 480 glBindTexture(GL_TEXTURE_2D, texture_data_handle_); |
| 480 | 481 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 502 | 503 |
| 503 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); | 504 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); |
| 504 | 505 |
| 505 glDisableVertexAttribArray(position_handle_); | 506 glDisableVertexAttribArray(position_handle_); |
| 506 glDisableVertexAttribArray(tex_coord_handle_); | 507 glDisableVertexAttribArray(tex_coord_handle_); |
| 507 } | 508 } |
| 508 | 509 |
| 509 LaserRenderer::~LaserRenderer() = default; | 510 LaserRenderer::~LaserRenderer() = default; |
| 510 | 511 |
| 511 GradientQuadRenderer::GradientQuadRenderer() | 512 GradientQuadRenderer::GradientQuadRenderer() |
| 512 : BaseRenderer(GRADIENT_QUAD_VERTEX_SHADER, GRADIENT_QUAD_FRAGMENT_SHADER) { | 513 : BaseQuadRenderer(GRADIENT_QUAD_VERTEX_SHADER, |
| 514 GRADIENT_QUAD_FRAGMENT_SHADER) { |
| 513 model_view_proj_matrix_handle_ = | 515 model_view_proj_matrix_handle_ = |
| 514 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); | 516 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); |
| 515 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius"); | 517 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius"); |
| 516 center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor"); | 518 center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor"); |
| 517 edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor"); | 519 edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor"); |
| 518 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity"); | 520 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity"); |
| 519 } | 521 } |
| 520 | 522 |
| 521 void GradientQuadRenderer::Draw(const gvr::Mat4f& view_proj_matrix, | 523 void GradientQuadRenderer::Draw(const gvr::Mat4f& view_proj_matrix, |
| 522 const Colorf& edge_color, | 524 const Colorf& edge_color, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 536 | 538 |
| 537 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); | 539 glDrawArrays(GL_TRIANGLES, 0, kVerticesNumber); |
| 538 | 540 |
| 539 glDisableVertexAttribArray(position_handle_); | 541 glDisableVertexAttribArray(position_handle_); |
| 540 glDisableVertexAttribArray(tex_coord_handle_); | 542 glDisableVertexAttribArray(tex_coord_handle_); |
| 541 } | 543 } |
| 542 | 544 |
| 543 GradientQuadRenderer::~GradientQuadRenderer() = default; | 545 GradientQuadRenderer::~GradientQuadRenderer() = default; |
| 544 | 546 |
| 545 GradientGridRenderer::GradientGridRenderer() | 547 GradientGridRenderer::GradientGridRenderer() |
| 546 : BaseRenderer(GRADIENT_QUAD_VERTEX_SHADER, | 548 : BaseRenderer(GRADIENT_QUAD_VERTEX_SHADER, GRADIENT_QUAD_FRAGMENT_SHADER) { |
| 547 GRADIENT_QUAD_FRAGMENT_SHADER, | |
| 548 false) { | |
| 549 model_view_proj_matrix_handle_ = | 549 model_view_proj_matrix_handle_ = |
| 550 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); | 550 glGetUniformLocation(program_handle_, "u_ModelViewProjMatrix"); |
| 551 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius"); | 551 scene_radius_handle_ = glGetUniformLocation(program_handle_, "u_SceneRadius"); |
| 552 center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor"); | 552 center_color_handle_ = glGetUniformLocation(program_handle_, "u_CenterColor"); |
| 553 edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor"); | 553 edge_color_handle_ = glGetUniformLocation(program_handle_, "u_EdgeColor"); |
| 554 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity"); | 554 opacity_handle_ = glGetUniformLocation(program_handle_, "u_Opacity"); |
| 555 } | 555 } |
| 556 | 556 |
| 557 void GradientGridRenderer::Draw(const gvr::Mat4f& view_proj_matrix, | 557 void GradientGridRenderer::Draw(const gvr::Mat4f& view_proj_matrix, |
| 558 const Colorf& edge_color, | 558 const Colorf& edge_color, |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 : textured_quad_renderer_(new TexturedQuadRenderer), | 634 : textured_quad_renderer_(new TexturedQuadRenderer), |
| 635 webvr_renderer_(new WebVrRenderer), | 635 webvr_renderer_(new WebVrRenderer), |
| 636 reticle_renderer_(new ReticleRenderer), | 636 reticle_renderer_(new ReticleRenderer), |
| 637 laser_renderer_(new LaserRenderer), | 637 laser_renderer_(new LaserRenderer), |
| 638 gradient_quad_renderer_(new GradientQuadRenderer), | 638 gradient_quad_renderer_(new GradientQuadRenderer), |
| 639 gradient_grid_renderer_(new GradientGridRenderer) {} | 639 gradient_grid_renderer_(new GradientGridRenderer) {} |
| 640 | 640 |
| 641 VrShellRenderer::~VrShellRenderer() = default; | 641 VrShellRenderer::~VrShellRenderer() = default; |
| 642 | 642 |
| 643 } // namespace vr_shell | 643 } // namespace vr_shell |
| OLD | NEW |