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