OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 public: | 307 public: |
308 GLState(); | 308 GLState(); |
309 | 309 |
310 void OnGLContextLost(); | 310 void OnGLContextLost(); |
311 | 311 |
312 GLfloat angle_; // Survives losing the GL context. | 312 GLfloat angle_; // Survives losing the GL context. |
313 | 313 |
314 GLuint program_object_; | 314 GLuint program_object_; |
315 GLint position_location_; | 315 GLint position_location_; |
316 GLint mvp_location_; | 316 GLint mvp_location_; |
| 317 GLint color_location_; |
317 GLuint vbo_vertices_; | 318 GLuint vbo_vertices_; |
318 GLuint vbo_indices_; | 319 GLuint vbo_indices_; |
319 int num_indices_; | 320 int num_indices_; |
320 ESMatrix mvp_matrix_; | 321 ESMatrix mvp_matrix_; |
321 }; | 322 }; |
322 | 323 |
323 SpinningCube::GLState::GLState() | 324 SpinningCube::GLState::GLState() |
324 : angle_(0) { | 325 : angle_(0) { |
325 OnGLContextLost(); | 326 OnGLContextLost(); |
326 } | 327 } |
327 | 328 |
328 void SpinningCube::GLState::OnGLContextLost() { | 329 void SpinningCube::GLState::OnGLContextLost() { |
329 program_object_ = 0; | 330 program_object_ = 0; |
330 position_location_ = 0; | 331 position_location_ = 0; |
331 mvp_location_ = 0; | 332 mvp_location_ = 0; |
| 333 color_location_ = 0; |
332 vbo_vertices_ = 0; | 334 vbo_vertices_ = 0; |
333 vbo_indices_ = 0; | 335 vbo_indices_ = 0; |
334 num_indices_ = 0; | 336 num_indices_ = 0; |
335 } | 337 } |
336 | 338 |
337 SpinningCube::SpinningCube() | 339 SpinningCube::SpinningCube() |
338 : initialized_(false), | 340 : initialized_(false), |
339 width_(0), | 341 width_(0), |
340 height_(0), | 342 height_(0), |
341 state_(new GLState()), | 343 state_(new GLState()), |
342 fling_multiplier_(1.0f), | 344 fling_multiplier_(1.0f), |
343 direction_(1) { | 345 direction_(1), |
| 346 color_() { |
344 state_->angle_ = 45.0f; | 347 state_->angle_ = 45.0f; |
| 348 set_color(0.0, 1.0, 0.0); |
345 } | 349 } |
346 | 350 |
347 SpinningCube::~SpinningCube() { | 351 SpinningCube::~SpinningCube() { |
348 if (!initialized_) | 352 if (!initialized_) |
349 return; | 353 return; |
350 if (state_->vbo_vertices_) | 354 if (state_->vbo_vertices_) |
351 glDeleteBuffers(1, &state_->vbo_vertices_); | 355 glDeleteBuffers(1, &state_->vbo_vertices_); |
352 if (state_->vbo_indices_) | 356 if (state_->vbo_indices_) |
353 glDeleteBuffers(1, &state_->vbo_indices_); | 357 glDeleteBuffers(1, &state_->vbo_indices_); |
354 if (state_->program_object_) | 358 if (state_->program_object_) |
355 glDeleteProgram(state_->program_object_); | 359 glDeleteProgram(state_->program_object_); |
356 } | 360 } |
357 | 361 |
358 void SpinningCube::Init(uint32_t width, uint32_t height) { | 362 void SpinningCube::Init(uint32_t width, uint32_t height) { |
359 width_ = width; | 363 width_ = width; |
360 height_ = height; | 364 height_ = height; |
361 | 365 |
362 const char vertext_shader_source[] = | 366 const char vertext_shader_source[] = |
363 "uniform mat4 u_mvpMatrix; \n" | 367 "uniform mat4 u_mvpMatrix; \n" |
364 "attribute vec4 a_position; \n" | 368 "attribute vec4 a_position; \n" |
365 "void main() \n" | 369 "void main() \n" |
366 "{ \n" | 370 "{ \n" |
367 " gl_Position = u_mvpMatrix * a_position; \n" | 371 " gl_Position = u_mvpMatrix * a_position; \n" |
368 "} \n"; | 372 "} \n"; |
369 | 373 |
370 const char fragment_shader_source[] = | 374 const char fragment_shader_source[] = |
371 "precision mediump float; \n" | 375 "precision mediump float; \n" |
| 376 "uniform vec4 u_color; \n" |
372 "void main() \n" | 377 "void main() \n" |
373 "{ \n" | 378 "{ \n" |
374 " gl_FragColor = vec4( 0.0, 1.0, 0.0, 1.0 ); \n" | 379 " gl_FragColor = u_color; \n" |
375 "} \n"; | 380 "} \n"; |
376 | 381 |
377 state_->program_object_ = LoadProgram( | 382 state_->program_object_ = LoadProgram( |
378 vertext_shader_source, fragment_shader_source); | 383 vertext_shader_source, fragment_shader_source); |
379 state_->position_location_ = glGetAttribLocation( | 384 state_->position_location_ = glGetAttribLocation( |
380 state_->program_object_, "a_position"); | 385 state_->program_object_, "a_position"); |
381 state_->mvp_location_ = glGetUniformLocation( | 386 state_->mvp_location_ = glGetUniformLocation( |
382 state_->program_object_, "u_mvpMatrix"); | 387 state_->program_object_, "u_mvpMatrix"); |
| 388 state_->color_location_ = glGetUniformLocation( |
| 389 state_->program_object_, "u_color"); |
383 state_->num_indices_ = GenerateCube( | 390 state_->num_indices_ = GenerateCube( |
384 &state_->vbo_vertices_, &state_->vbo_indices_); | 391 &state_->vbo_vertices_, &state_->vbo_indices_); |
385 | 392 |
386 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); | 393 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |
387 initialized_ = true; | 394 initialized_ = true; |
388 } | 395 } |
389 | 396 |
390 void SpinningCube::OnGLContextLost() { | 397 void SpinningCube::OnGLContextLost() { |
391 initialized_ = false; | 398 initialized_ = false; |
392 height_ = 0; | 399 height_ = 0; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 glVertexAttribPointer(state_->position_location_, | 439 glVertexAttribPointer(state_->position_location_, |
433 3, | 440 3, |
434 GL_FLOAT, | 441 GL_FLOAT, |
435 GL_FALSE, 3 * sizeof(GLfloat), | 442 GL_FALSE, 3 * sizeof(GLfloat), |
436 0); | 443 0); |
437 glEnableVertexAttribArray(state_->position_location_); | 444 glEnableVertexAttribArray(state_->position_location_); |
438 glUniformMatrix4fv(state_->mvp_location_, | 445 glUniformMatrix4fv(state_->mvp_location_, |
439 1, | 446 1, |
440 GL_FALSE, | 447 GL_FALSE, |
441 (GLfloat*) &state_->mvp_matrix_.m[0][0]); | 448 (GLfloat*) &state_->mvp_matrix_.m[0][0]); |
| 449 glUniform4f(state_->color_location_, color_[0], color_[1], color_[2], 1.0); |
442 glDrawElements(GL_TRIANGLES, | 450 glDrawElements(GL_TRIANGLES, |
443 state_->num_indices_, | 451 state_->num_indices_, |
444 GL_UNSIGNED_SHORT, | 452 GL_UNSIGNED_SHORT, |
445 0); | 453 0); |
446 } | 454 } |
447 | 455 |
448 void SpinningCube::Update() { | 456 void SpinningCube::Update() { |
449 float aspect = static_cast<GLfloat>(width_) / static_cast<GLfloat>(height_); | 457 float aspect = static_cast<GLfloat>(width_) / static_cast<GLfloat>(height_); |
450 | 458 |
451 ESMatrix perspective; | 459 ESMatrix perspective; |
452 perspective.LoadIdentity(); | 460 perspective.LoadIdentity(); |
453 perspective.Perspective(60.0f, aspect, 1.0f, 20.0f ); | 461 perspective.Perspective(60.0f, aspect, 1.0f, 20.0f ); |
454 | 462 |
455 ESMatrix modelview; | 463 ESMatrix modelview; |
456 modelview.LoadIdentity(); | 464 modelview.LoadIdentity(); |
457 modelview.Translate(0.0, 0.0, -2.0); | 465 modelview.Translate(0.0, 0.0, -2.0); |
458 modelview.Rotate(state_->angle_ * direction_, 1.0, 0.0, 1.0); | 466 modelview.Rotate(state_->angle_ * direction_, 1.0, 0.0, 1.0); |
459 | 467 |
460 state_->mvp_matrix_.Multiply(&modelview, &perspective); | 468 state_->mvp_matrix_.Multiply(&modelview, &perspective); |
461 } | 469 } |
462 | 470 |
463 } // namespace examples | 471 } // namespace examples |
464 } // namespace mojo | 472 } // namespace mojo |
OLD | NEW |