| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 // This example program is based on Simple_VertexShader.c from: | 5 // This example program is based on Simple_VertexShader.c from: |
| 6 | 6 |
| 7 // | 7 // |
| 8 // Book: OpenGL(R) ES 2.0 Programming Guide | 8 // Book: OpenGL(R) ES 2.0 Programming Guide |
| 9 // Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner | 9 // Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner |
| 10 // ISBN-10: 0321502795 | 10 // ISBN-10: 0321502795 |
| 11 // ISBN-13: 9780321502797 | 11 // ISBN-13: 9780321502797 |
| 12 // Publisher: Addison-Wesley Professional | 12 // Publisher: Addison-Wesley Professional |
| 13 // URLs: http://safari.informit.com/9780321563835 | 13 // URLs: http://safari.informit.com/9780321563835 |
| 14 // http://www.opengles-book.com | 14 // http://www.opengles-book.com |
| 15 // | 15 // |
| 16 | 16 |
| 17 #include "ppapi/examples/gles2_spinning_cube/spinning_cube.h" | 17 #include "ppapi/examples/compositor/spinning_cube.h" |
| 18 | 18 |
| 19 #include <math.h> | 19 #include <math.h> |
| 20 #include <stdlib.h> | 20 #include <stdlib.h> |
| 21 #include <string.h> | 21 #include <string.h> |
| 22 | 22 |
| 23 #include <algorithm> | 23 #include <algorithm> |
| 24 | 24 |
| 25 #include "ppapi/lib/gl/include/GLES2/gl2.h" | 25 #include "ppapi/lib/gl/include/GLES2/gl2.h" |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 const float kPi = 3.14159265359f; | 29 const float kPi = 3.14159265359f; |
| 30 | 30 |
| 31 int GenerateCube(GLuint *vbo_vertices, | 31 int GenerateCube(GLuint *vbo_vertices, |
| 32 GLuint *vbo_indices) { | 32 GLuint *vbo_indices) { |
| 33 const int num_indices = 36; | 33 const int num_indices = 36; |
| 34 | 34 |
| 35 const GLfloat cube_vertices[] = { | 35 const GLfloat cube_vertices[] = { |
| 36 -0.5f, -0.5f, -0.5f, | 36 -0.5f, -0.5f, -0.5f, |
| 37 0.5f, -0.5f, -0.5f, |
| 38 0.5f, -0.5f, 0.5f, |
| 37 -0.5f, -0.5f, 0.5f, | 39 -0.5f, -0.5f, 0.5f, |
| 38 0.5f, -0.5f, 0.5f, | |
| 39 0.5f, -0.5f, -0.5f, | |
| 40 -0.5f, 0.5f, -0.5f, | 40 -0.5f, 0.5f, -0.5f, |
| 41 0.5f, 0.5f, -0.5f, |
| 42 0.5f, 0.5f, 0.5f, |
| 41 -0.5f, 0.5f, 0.5f, | 43 -0.5f, 0.5f, 0.5f, |
| 42 0.5f, 0.5f, 0.5f, | |
| 43 0.5f, 0.5f, -0.5f, | |
| 44 -0.5f, -0.5f, -0.5f, | |
| 45 -0.5f, 0.5f, -0.5f, | |
| 46 0.5f, 0.5f, -0.5f, | |
| 47 0.5f, -0.5f, -0.5f, | |
| 48 -0.5f, -0.5f, 0.5f, | |
| 49 -0.5f, 0.5f, 0.5f, | |
| 50 0.5f, 0.5f, 0.5f, | |
| 51 0.5f, -0.5f, 0.5f, | |
| 52 -0.5f, -0.5f, -0.5f, | |
| 53 -0.5f, -0.5f, 0.5f, | |
| 54 -0.5f, 0.5f, 0.5f, | |
| 55 -0.5f, 0.5f, -0.5f, | |
| 56 0.5f, -0.5f, -0.5f, | |
| 57 0.5f, -0.5f, 0.5f, | |
| 58 0.5f, 0.5f, 0.5f, | |
| 59 0.5f, 0.5f, -0.5f, | |
| 60 }; | 44 }; |
| 61 | 45 |
| 62 const GLushort cube_indices[] = { | 46 const GLushort cube_indices[] = { |
| 63 0, 2, 1, | 47 0, 2, 1, |
| 64 0, 3, 2, | 48 0, 3, 2, |
| 65 4, 5, 6, | 49 4, 5, 6, |
| 66 4, 6, 7, | 50 4, 6, 7, |
| 67 8, 9, 10, | 51 3, 6, 2, |
| 68 8, 10, 11, | 52 3, 7, 6, |
| 69 12, 15, 14, | 53 0, 1, 5, |
| 70 12, 14, 13, | 54 0, 5, 4, |
| 71 16, 17, 18, | 55 0, 7, 3, |
| 72 16, 18, 19, | 56 0, 4, 7, |
| 73 20, 23, 22, | 57 1, 2, 6, |
| 74 20, 22, 21 | 58 1, 6, 5, |
| 75 }; | 59 }; |
| 76 | 60 |
| 77 if (vbo_vertices) { | 61 if (vbo_vertices) { |
| 78 glGenBuffers(1, vbo_vertices); | 62 glGenBuffers(1, vbo_vertices); |
| 79 glBindBuffer(GL_ARRAY_BUFFER, *vbo_vertices); | 63 glBindBuffer(GL_ARRAY_BUFFER, *vbo_vertices); |
| 80 glBufferData(GL_ARRAY_BUFFER, | 64 glBufferData(GL_ARRAY_BUFFER, |
| 81 sizeof(cube_vertices), | 65 sizeof(cube_vertices), |
| 82 cube_vertices, | 66 cube_vertices, |
| 83 GL_STATIC_DRAW); | 67 GL_STATIC_DRAW); |
| 84 glBindBuffer(GL_ARRAY_BUFFER, 0); | 68 glBindBuffer(GL_ARRAY_BUFFER, 0); |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 | 342 |
| 359 void SpinningCube::Init(uint32_t width, uint32_t height) { | 343 void SpinningCube::Init(uint32_t width, uint32_t height) { |
| 360 width_ = width; | 344 width_ = width; |
| 361 height_ = height; | 345 height_ = height; |
| 362 | 346 |
| 363 if (!initialized_) { | 347 if (!initialized_) { |
| 364 initialized_ = true; | 348 initialized_ = true; |
| 365 const char vertext_shader_source[] = | 349 const char vertext_shader_source[] = |
| 366 "uniform mat4 u_mvpMatrix; \n" | 350 "uniform mat4 u_mvpMatrix; \n" |
| 367 "attribute vec4 a_position; \n" | 351 "attribute vec4 a_position; \n" |
| 352 "varying vec4 v_color; \n" |
| 368 "void main() \n" | 353 "void main() \n" |
| 369 "{ \n" | 354 "{ \n" |
| 370 " gl_Position = u_mvpMatrix * a_position; \n" | 355 " gl_Position = u_mvpMatrix * a_position; \n" |
| 356 " v_color = vec4(a_position.x + 0.5, \n" |
| 357 " a_position.y + 0.5, \n" |
| 358 " a_position.z + 0.5, \n" |
| 359 " 0.8); \n" |
| 371 "} \n"; | 360 "} \n"; |
| 372 | 361 |
| 373 const char fragment_shader_source[] = | 362 const char fragment_shader_source[] = |
| 374 "precision mediump float; \n" | 363 "precision mediump float; \n" |
| 375 "void main() \n" | 364 "varying vec4 v_color; \n" |
| 376 "{ \n" | 365 "void main() \n" |
| 377 " gl_FragColor = vec4( 0.0, 0.0, 1.0, 1.0 ); \n" | 366 "{ \n" |
| 378 "} \n"; | 367 " gl_FragColor = v_color; \n" |
| 368 "} \n"; |
| 379 | 369 |
| 380 state_->program_object_ = LoadProgram( | 370 state_->program_object_ = LoadProgram( |
| 381 vertext_shader_source, fragment_shader_source); | 371 vertext_shader_source, fragment_shader_source); |
| 382 state_->position_location_ = glGetAttribLocation( | 372 state_->position_location_ = glGetAttribLocation( |
| 383 state_->program_object_, "a_position"); | 373 state_->program_object_, "a_position"); |
| 384 state_->mvp_location_ = glGetUniformLocation( | 374 state_->mvp_location_ = glGetUniformLocation( |
| 385 state_->program_object_, "u_mvpMatrix"); | 375 state_->program_object_, "u_mvpMatrix"); |
| 386 state_->num_indices_ = GenerateCube( | 376 state_->num_indices_ = GenerateCube(&state_->vbo_vertices_, |
| 387 &state_->vbo_vertices_, &state_->vbo_indices_); | 377 &state_->vbo_indices_); |
| 388 | 378 |
| 389 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); | 379 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |
| 390 } | 380 } |
| 391 } | 381 } |
| 392 | 382 |
| 393 void SpinningCube::OnGLContextLost() { | 383 void SpinningCube::OnGLContextLost() { |
| 394 // TODO(yzshen): Is it correct that in this case we don't need to do cleanup | 384 // TODO(yzshen): Is it correct that in this case we don't need to do cleanup |
| 395 // for program and buffers? | 385 // for program and buffers? |
| 396 initialized_ = false; | 386 initialized_ = false; |
| 397 height_ = 0; | 387 height_ = 0; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 423 void SpinningCube::UpdateForDragDistance(float distance) { | 413 void SpinningCube::UpdateForDragDistance(float distance) { |
| 424 state_->angle_ += RotationForDragDistance(distance); | 414 state_->angle_ += RotationForDragDistance(distance); |
| 425 if (state_->angle_ >= 360.0f ) | 415 if (state_->angle_ >= 360.0f ) |
| 426 state_->angle_ -= 360.0f; | 416 state_->angle_ -= 360.0f; |
| 427 | 417 |
| 428 Update(); | 418 Update(); |
| 429 } | 419 } |
| 430 | 420 |
| 431 void SpinningCube::Draw() { | 421 void SpinningCube::Draw() { |
| 432 glViewport(0, 0, width_, height_); | 422 glViewport(0, 0, width_, height_); |
| 433 glClear(GL_COLOR_BUFFER_BIT); | 423 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| 424 glEnable(GL_DEPTH_TEST); |
| 434 glUseProgram(state_->program_object_); | 425 glUseProgram(state_->program_object_); |
| 426 |
| 435 glBindBuffer(GL_ARRAY_BUFFER, state_->vbo_vertices_); | 427 glBindBuffer(GL_ARRAY_BUFFER, state_->vbo_vertices_); |
| 428 glVertexAttribPointer(state_->position_location_, |
| 429 3, |
| 430 GL_FLOAT, |
| 431 GL_FALSE, 3 * sizeof(GLfloat), |
| 432 0); |
| 433 glEnableVertexAttribArray(state_->position_location_); |
| 434 |
| 435 glUniformMatrix4fv(state_->mvp_location_, |
| 436 1, |
| 437 GL_FALSE, |
| 438 (GLfloat*) &state_->mvp_matrix_.m[0][0]); |
| 436 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state_->vbo_indices_); | 439 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state_->vbo_indices_); |
| 437 glVertexAttribPointer(state_->position_location_, | |
| 438 3, | |
| 439 GL_FLOAT, | |
| 440 GL_FALSE, 3 * sizeof(GLfloat), | |
| 441 0); | |
| 442 glEnableVertexAttribArray(state_->position_location_); | |
| 443 glUniformMatrix4fv(state_->mvp_location_, | |
| 444 1, | |
| 445 GL_FALSE, | |
| 446 (GLfloat*) &state_->mvp_matrix_.m[0][0]); | |
| 447 glDrawElements(GL_TRIANGLES, | 440 glDrawElements(GL_TRIANGLES, |
| 448 state_->num_indices_, | 441 state_->num_indices_, |
| 449 GL_UNSIGNED_SHORT, | 442 GL_UNSIGNED_SHORT, |
| 450 0); | 443 0); |
| 451 } | 444 } |
| 452 | 445 |
| 453 void SpinningCube::Update() { | 446 void SpinningCube::Update() { |
| 454 float aspect = static_cast<GLfloat>(width_) / static_cast<GLfloat>(height_); | 447 float aspect = static_cast<GLfloat>(width_) / static_cast<GLfloat>(height_); |
| 455 | 448 |
| 456 ESMatrix perspective; | 449 ESMatrix perspective; |
| 457 perspective.LoadIdentity(); | 450 perspective.LoadIdentity(); |
| 458 perspective.Perspective(60.0f, aspect, 1.0f, 20.0f ); | 451 perspective.Perspective(60.0f, aspect, 1.0f, 20.0f ); |
| 459 | 452 |
| 460 ESMatrix modelview; | 453 ESMatrix modelview; |
| 461 modelview.LoadIdentity(); | 454 modelview.LoadIdentity(); |
| 462 modelview.Translate(0.0, 0.0, -2.0); | 455 modelview.Translate(0.0, 0.0, -2.0); |
| 463 modelview.Rotate(state_->angle_ * direction_, 1.0, 0.0, 1.0); | 456 modelview.Rotate(state_->angle_ * direction_, 1.0, 0.0, 1.0); |
| 464 | 457 |
| 465 state_->mvp_matrix_.Multiply(&modelview, &perspective); | 458 state_->mvp_matrix_.Multiply(&modelview, &perspective); |
| 466 } | 459 } |
| OLD | NEW |