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; |
cjgrant
2017/03/21 16:16:47
This could now be done in the header file, FWIW.
acondor_
2017/03/21 19:31:30
Done.
| |
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 |