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 |