Chromium Code Reviews| 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 |
| 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 "examples/spinning_cube/spinning_cube.h" | 17 #include "examples/spinning_cube/spinning_cube.h" |
| 18 | 18 |
| 19 #include <GLES2/gl2.h> | 19 #include <GLES2/gl2.h> |
| 20 #include <GLES2/gl2ext.h> | 20 #include <GLES2/gl2ext.h> |
| 21 #include <math.h> | 21 #include <math.h> |
| 22 #include <stdlib.h> | 22 #include <stdlib.h> |
| 23 #include <string.h> | 23 #include <string.h> |
| 24 | 24 |
| 25 #include "mojo/public/c/gpu/MGL/mgl.h" | |
| 25 #include "mojo/public/cpp/environment/logging.h" | 26 #include "mojo/public/cpp/environment/logging.h" |
| 26 | 27 |
| 27 namespace examples { | 28 namespace examples { |
| 28 | 29 |
| 30 #define VISIT_GL_CALL(Function, ReturnType, PARAMETERS, ARGUMENTS) \ | |
| 31 typedef ReturnType (*Function##Type) PARAMETERS; | |
|
jamesr
2015/10/21 19:58:53
nit: i find 'using' easier to read for function ty
Petr Hosek
2015/10/21 21:12:03
Done.
| |
| 32 #include "mojo/public/platform/native/gles2/call_visitor_autogen.h" | |
| 33 #undef VISIT_GL_CALL | |
| 34 | |
| 35 class SpinningCube::GLInterface { | |
| 36 private: | |
|
jamesr
2015/10/21 19:58:53
style guide has an order for public / private, thi
Petr Hosek
2015/10/21 21:12:03
I need this to be defined before I declare the mem
| |
| 37 // This is a wrapper class that initializes pointer to nullptr. | |
| 38 template <typename T> class GLProcPtr { | |
| 39 public: | |
| 40 GLProcPtr() : ptr_(nullptr) {} | |
| 41 GLProcPtr operator=(T ptr) { ptr_ = ptr; return *this; } | |
| 42 operator T() const { return ptr_; } | |
| 43 private: | |
| 44 T ptr_; | |
| 45 }; | |
| 46 | |
| 47 public: | |
| 48 GLInterface() {} | |
| 49 | |
| 50 void Init() { | |
| 51 #define VISIT_GL_CALL(Function, ReturnType, PARAMETERS, ARGUMENTS) \ | |
| 52 Function = reinterpret_cast<Function##Type>( \ | |
| 53 MGLGetProcAddress("gl"#Function)); | |
| 54 #include "mojo/public/platform/native/gles2/call_visitor_autogen.h" | |
| 55 #undef VISIT_GL_CALL | |
| 56 } | |
| 57 | |
| 58 #define VISIT_GL_CALL(Function, ReturnType, PARAMETERS, ARGUMENTS) \ | |
| 59 GLProcPtr<Function##Type> Function; | |
| 60 #include "mojo/public/platform/native/gles2/call_visitor_autogen.h" | |
| 61 #undef VISIT_GL_CALL | |
| 62 }; | |
| 63 | |
| 29 namespace { | 64 namespace { |
| 30 | 65 |
| 31 const float kPi = 3.14159265359f; | 66 const float kPi = 3.14159265359f; |
| 32 const int kNumVertices = 24; | 67 const int kNumVertices = 24; |
| 33 | 68 |
| 34 int GenerateCube(GLuint *vbo_vertices, | 69 int GenerateCube(const scoped_ptr<SpinningCube::GLInterface>& gl, |
| 70 GLuint *vbo_vertices, | |
| 35 GLuint *vbo_indices) { | 71 GLuint *vbo_indices) { |
| 36 const int num_indices = 36; | 72 const int num_indices = 36; |
| 37 | 73 |
| 38 const GLfloat cube_vertices[kNumVertices * 3] = { | 74 const GLfloat cube_vertices[kNumVertices * 3] = { |
| 39 // -Y side. | 75 // -Y side. |
| 40 -0.5f, -0.5f, -0.5f, | 76 -0.5f, -0.5f, -0.5f, |
| 41 -0.5f, -0.5f, 0.5f, | 77 -0.5f, -0.5f, 0.5f, |
| 42 0.5f, -0.5f, 0.5f, | 78 0.5f, -0.5f, 0.5f, |
| 43 0.5f, -0.5f, -0.5f, | 79 0.5f, -0.5f, -0.5f, |
| 44 | 80 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 // -X side. | 167 // -X side. |
| 132 16, 17, 18, | 168 16, 17, 18, |
| 133 16, 18, 19, | 169 16, 18, 19, |
| 134 | 170 |
| 135 // +X side. | 171 // +X side. |
| 136 20, 23, 22, | 172 20, 23, 22, |
| 137 20, 22, 21 | 173 20, 22, 21 |
| 138 }; | 174 }; |
| 139 | 175 |
| 140 if (vbo_vertices) { | 176 if (vbo_vertices) { |
| 141 glGenBuffers(1, vbo_vertices); | 177 gl->GenBuffers(1, vbo_vertices); |
| 142 glBindBuffer(GL_ARRAY_BUFFER, *vbo_vertices); | 178 gl->BindBuffer(GL_ARRAY_BUFFER, *vbo_vertices); |
| 143 glBufferData(GL_ARRAY_BUFFER, | 179 gl->BufferData(GL_ARRAY_BUFFER, |
| 144 sizeof(cube_vertices) + sizeof(vertex_normals), | 180 sizeof(cube_vertices) + sizeof(vertex_normals), |
| 145 nullptr, | 181 nullptr, |
| 146 GL_STATIC_DRAW); | 182 GL_STATIC_DRAW); |
| 147 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(cube_vertices), cube_vertices); | 183 gl->BufferSubData(GL_ARRAY_BUFFER, 0, sizeof(cube_vertices), cube_vertices); |
| 148 glBufferSubData(GL_ARRAY_BUFFER, sizeof(cube_vertices), | 184 gl->BufferSubData(GL_ARRAY_BUFFER, sizeof(cube_vertices), |
| 149 sizeof(vertex_normals), vertex_normals); | 185 sizeof(vertex_normals), vertex_normals); |
| 150 glBindBuffer(GL_ARRAY_BUFFER, 0); | 186 gl->BindBuffer(GL_ARRAY_BUFFER, 0); |
| 151 } | 187 } |
| 152 | 188 |
| 153 if (vbo_indices) { | 189 if (vbo_indices) { |
| 154 glGenBuffers(1, vbo_indices); | 190 gl->GenBuffers(1, vbo_indices); |
| 155 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *vbo_indices); | 191 gl->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, *vbo_indices); |
| 156 glBufferData(GL_ELEMENT_ARRAY_BUFFER, | 192 gl->BufferData(GL_ELEMENT_ARRAY_BUFFER, |
| 157 sizeof(cube_indices), | 193 sizeof(cube_indices), |
| 158 cube_indices, | 194 cube_indices, |
| 159 GL_STATIC_DRAW); | 195 GL_STATIC_DRAW); |
| 160 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); | 196 gl->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); |
| 161 } | 197 } |
| 162 | 198 |
| 163 return num_indices; | 199 return num_indices; |
| 164 } | 200 } |
| 165 | 201 |
| 166 GLuint LoadShader(GLenum type, | 202 GLuint LoadShader(const scoped_ptr<SpinningCube::GLInterface>& gl, |
| 203 GLenum type, | |
| 167 const char* shader_source) { | 204 const char* shader_source) { |
| 168 GLuint shader = glCreateShader(type); | 205 GLuint shader = gl->CreateShader(type); |
| 169 glShaderSource(shader, 1, &shader_source, NULL); | 206 gl->ShaderSource(shader, 1, &shader_source, NULL); |
| 170 glCompileShader(shader); | 207 gl->CompileShader(shader); |
| 171 | 208 |
| 172 GLint compiled = 0; | 209 GLint compiled = 0; |
| 173 glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); | 210 gl->GetShaderiv(shader, GL_COMPILE_STATUS, &compiled); |
| 174 | 211 |
| 175 if (!compiled) { | 212 if (!compiled) { |
| 176 GLsizei expected_length = 0; | 213 GLsizei expected_length = 0; |
| 177 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &expected_length); | 214 gl->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &expected_length); |
| 178 std::string log; | 215 std::string log; |
| 179 log.resize(expected_length); // Includes null terminator. | 216 log.resize(expected_length); // Includes null terminator. |
| 180 GLsizei actual_length = 0; | 217 GLsizei actual_length = 0; |
| 181 glGetShaderInfoLog(shader, expected_length, &actual_length, &log[0]); | 218 gl->GetShaderInfoLog(shader, expected_length, &actual_length, &log[0]); |
| 182 log.resize(actual_length); // Excludes null terminator. | 219 log.resize(actual_length); // Excludes null terminator. |
| 183 MOJO_LOG(FATAL) << "Compilation of shader failed: " << log; | 220 MOJO_LOG(FATAL) << "Compilation of shader failed: " << log; |
| 184 glDeleteShader(shader); | 221 gl->DeleteShader(shader); |
| 185 return 0; | 222 return 0; |
| 186 } | 223 } |
| 187 | 224 |
| 188 return shader; | 225 return shader; |
| 189 } | 226 } |
| 190 | 227 |
| 191 GLuint LoadProgram(const char* vertex_shader_source, | 228 GLuint LoadProgram(const scoped_ptr<SpinningCube::GLInterface>& gl, |
| 229 const char* vertex_shader_source, | |
| 192 const char* fragment_shader_source) { | 230 const char* fragment_shader_source) { |
| 193 GLuint vertex_shader = LoadShader(GL_VERTEX_SHADER, | 231 GLuint vertex_shader = LoadShader(gl, |
| 232 GL_VERTEX_SHADER, | |
| 194 vertex_shader_source); | 233 vertex_shader_source); |
| 195 if (!vertex_shader) | 234 if (!vertex_shader) |
| 196 return 0; | 235 return 0; |
| 197 | 236 |
| 198 GLuint fragment_shader = LoadShader(GL_FRAGMENT_SHADER, | 237 GLuint fragment_shader = LoadShader(gl, |
| 238 GL_FRAGMENT_SHADER, | |
| 199 fragment_shader_source); | 239 fragment_shader_source); |
| 200 if (!fragment_shader) { | 240 if (!fragment_shader) { |
| 201 glDeleteShader(vertex_shader); | 241 gl->DeleteShader(vertex_shader); |
| 202 return 0; | 242 return 0; |
| 203 } | 243 } |
| 204 | 244 |
| 205 GLuint program_object = glCreateProgram(); | 245 GLuint program_object = gl->CreateProgram(); |
| 206 glAttachShader(program_object, vertex_shader); | 246 gl->AttachShader(program_object, vertex_shader); |
| 207 glAttachShader(program_object, fragment_shader); | 247 gl->AttachShader(program_object, fragment_shader); |
| 208 glLinkProgram(program_object); | 248 gl->LinkProgram(program_object); |
| 209 glDeleteShader(vertex_shader); | 249 gl->DeleteShader(vertex_shader); |
| 210 glDeleteShader(fragment_shader); | 250 gl->DeleteShader(fragment_shader); |
| 211 | 251 |
| 212 GLint linked = 0; | 252 GLint linked = 0; |
| 213 glGetProgramiv(program_object, GL_LINK_STATUS, &linked); | 253 gl->GetProgramiv(program_object, GL_LINK_STATUS, &linked); |
| 214 if (!linked) { | 254 if (!linked) { |
| 215 GLsizei expected_length = 0; | 255 GLsizei expected_length = 0; |
| 216 glGetProgramiv(program_object, GL_INFO_LOG_LENGTH, &expected_length); | 256 gl->GetProgramiv(program_object, GL_INFO_LOG_LENGTH, &expected_length); |
| 217 std::string log; | 257 std::string log; |
| 218 log.resize(expected_length); // Includes null terminator. | 258 log.resize(expected_length); // Includes null terminator. |
| 219 GLsizei actual_length = 0; | 259 GLsizei actual_length = 0; |
| 220 glGetProgramInfoLog(program_object, expected_length, &actual_length, | 260 gl->GetProgramInfoLog(program_object, expected_length, &actual_length, |
| 221 &log[0]); | 261 &log[0]); |
| 222 log.resize(actual_length); // Excludes null terminator. | 262 log.resize(actual_length); // Excludes null terminator. |
| 223 MOJO_LOG(FATAL) << "Linking program failed: " << log; | 263 MOJO_LOG(FATAL) << "Linking program failed: " << log; |
| 224 glDeleteProgram(program_object); | 264 gl->DeleteProgram(program_object); |
| 225 return 0; | 265 return 0; |
| 226 } | 266 } |
| 227 | 267 |
| 228 return program_object; | 268 return program_object; |
| 229 } | 269 } |
| 230 | 270 |
| 231 class ESMatrix { | 271 class ESMatrix { |
| 232 public: | 272 public: |
| 233 GLfloat m[4][4]; | 273 GLfloat m[4][4]; |
| 234 | 274 |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 414 mvp_location_ = 0; | 454 mvp_location_ = 0; |
| 415 vbo_vertices_ = 0; | 455 vbo_vertices_ = 0; |
| 416 vbo_indices_ = 0; | 456 vbo_indices_ = 0; |
| 417 num_indices_ = 0; | 457 num_indices_ = 0; |
| 418 } | 458 } |
| 419 | 459 |
| 420 SpinningCube::SpinningCube() | 460 SpinningCube::SpinningCube() |
| 421 : initialized_(false), | 461 : initialized_(false), |
| 422 width_(0), | 462 width_(0), |
| 423 height_(0), | 463 height_(0), |
| 464 gl_(new GLInterface()), | |
| 424 state_(new GLState()), | 465 state_(new GLState()), |
| 425 fling_multiplier_(1.0f), | 466 fling_multiplier_(1.0f), |
| 426 direction_(1), | 467 direction_(1), |
| 427 color_() { | 468 color_() { |
| 428 state_->angle_ = 45.0f; | 469 state_->angle_ = 45.0f; |
| 429 set_color(1.0, 1.0, 1.0); | 470 set_color(1.0, 1.0, 1.0); |
| 430 } | 471 } |
| 431 | 472 |
| 432 SpinningCube::~SpinningCube() { | 473 SpinningCube::~SpinningCube() { |
| 433 if (!initialized_) | 474 if (!initialized_) |
| 434 return; | 475 return; |
| 435 if (state_->vbo_vertices_) | 476 if (state_->vbo_vertices_) |
| 436 glDeleteBuffers(1, &state_->vbo_vertices_); | 477 gl_->DeleteBuffers(1, &state_->vbo_vertices_); |
| 437 if (state_->vbo_indices_) | 478 if (state_->vbo_indices_) |
| 438 glDeleteBuffers(1, &state_->vbo_indices_); | 479 gl_->DeleteBuffers(1, &state_->vbo_indices_); |
| 439 if (state_->program_object_) | 480 if (state_->program_object_) |
| 440 glDeleteProgram(state_->program_object_); | 481 gl_->DeleteProgram(state_->program_object_); |
| 441 } | 482 } |
| 442 | 483 |
| 443 void SpinningCube::Init() { | 484 void SpinningCube::Init() { |
| 444 const char vertex_shader_source[] = | 485 const char vertex_shader_source[] = |
| 445 "uniform mat4 u_mvpMatrix; \n" | 486 "uniform mat4 u_mvpMatrix; \n" |
| 446 "attribute vec4 a_position; \n" | 487 "attribute vec4 a_position; \n" |
| 447 "attribute vec4 a_normal; \n" | 488 "attribute vec4 a_normal; \n" |
| 448 "uniform vec3 u_color; \n" | 489 "uniform vec3 u_color; \n" |
| 449 "varying vec4 v_color; \n" | 490 "varying vec4 v_color; \n" |
| 450 "void main() \n" | 491 "void main() \n" |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 461 "} \n"; | 502 "} \n"; |
| 462 | 503 |
| 463 const char fragment_shader_source[] = | 504 const char fragment_shader_source[] = |
| 464 "precision mediump float; \n" | 505 "precision mediump float; \n" |
| 465 "varying vec4 v_color; \n" | 506 "varying vec4 v_color; \n" |
| 466 "void main() \n" | 507 "void main() \n" |
| 467 "{ \n" | 508 "{ \n" |
| 468 " gl_FragColor = v_color; \n" | 509 " gl_FragColor = v_color; \n" |
| 469 "} \n"; | 510 "} \n"; |
| 470 | 511 |
| 512 gl_->Init(); | |
| 471 state_->program_object_ = LoadProgram( | 513 state_->program_object_ = LoadProgram( |
| 472 vertex_shader_source, fragment_shader_source); | 514 gl_, vertex_shader_source, fragment_shader_source); |
| 473 state_->position_location_ = glGetAttribLocation( | 515 state_->position_location_ = gl_->GetAttribLocation( |
| 474 state_->program_object_, "a_position"); | 516 state_->program_object_, "a_position"); |
| 475 state_->normal_location_ = glGetAttribLocation( | 517 state_->normal_location_ = gl_->GetAttribLocation( |
| 476 state_->program_object_, "a_normal"); | 518 state_->program_object_, "a_normal"); |
| 477 state_->color_location_ = glGetUniformLocation( | 519 state_->color_location_ = gl_->GetUniformLocation( |
| 478 state_->program_object_, "u_color"); | 520 state_->program_object_, "u_color"); |
| 479 state_->mvp_location_ = glGetUniformLocation( | 521 state_->mvp_location_ = gl_->GetUniformLocation( |
| 480 state_->program_object_, "u_mvpMatrix"); | 522 state_->program_object_, "u_mvpMatrix"); |
| 481 state_->num_indices_ = GenerateCube( | 523 state_->num_indices_ = GenerateCube( |
| 482 &state_->vbo_vertices_, &state_->vbo_indices_); | 524 gl_, &state_->vbo_vertices_, &state_->vbo_indices_); |
| 483 | 525 |
| 484 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); | 526 gl_->ClearColor(0.0f, 0.0f, 0.0f, 0.0f); |
| 485 glEnable(GL_DEPTH_TEST); | 527 gl_->Enable(GL_DEPTH_TEST); |
| 486 initialized_ = true; | 528 initialized_ = true; |
| 487 } | 529 } |
| 488 | 530 |
| 489 void SpinningCube::OnGLContextLost() { | 531 void SpinningCube::OnGLContextLost() { |
| 490 initialized_ = false; | 532 initialized_ = false; |
| 491 state_->OnGLContextLost(); | 533 state_->OnGLContextLost(); |
| 492 } | 534 } |
| 493 | 535 |
| 494 void SpinningCube::SetFlingMultiplier(float drag_distance, | 536 void SpinningCube::SetFlingMultiplier(float drag_distance, |
| 495 float drag_time) { | 537 float drag_time) { |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 518 | 560 |
| 519 void SpinningCube::UpdateForDragDistance(float distance) { | 561 void SpinningCube::UpdateForDragDistance(float distance) { |
| 520 state_->angle_ += RotationForDragDistance(distance); | 562 state_->angle_ += RotationForDragDistance(distance); |
| 521 if (state_->angle_ >= 360.0f ) | 563 if (state_->angle_ >= 360.0f ) |
| 522 state_->angle_ -= 360.0f; | 564 state_->angle_ -= 360.0f; |
| 523 | 565 |
| 524 Update(); | 566 Update(); |
| 525 } | 567 } |
| 526 | 568 |
| 527 void SpinningCube::Draw() { | 569 void SpinningCube::Draw() { |
| 528 glViewport(0, 0, width_, height_); | 570 gl_->Viewport(0, 0, width_, height_); |
| 529 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | 571 gl_->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| 530 glUseProgram(state_->program_object_); | 572 gl_->UseProgram(state_->program_object_); |
| 531 glBindBuffer(GL_ARRAY_BUFFER, state_->vbo_vertices_); | 573 gl_->BindBuffer(GL_ARRAY_BUFFER, state_->vbo_vertices_); |
| 532 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, state_->vbo_indices_); | 574 gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, state_->vbo_indices_); |
| 533 glVertexAttribPointer(state_->position_location_, 3, GL_FLOAT, GL_FALSE, | 575 gl_->VertexAttribPointer(state_->position_location_, 3, GL_FLOAT, GL_FALSE, |
| 534 3 * sizeof(GLfloat), 0); | 576 3 * sizeof(GLfloat), 0); |
| 535 glVertexAttribPointer(state_->normal_location_, 3, GL_FLOAT, GL_FALSE, | 577 gl_->VertexAttribPointer(state_->normal_location_, 3, GL_FLOAT, GL_FALSE, |
| 536 3 * sizeof(GLfloat), | 578 3 * sizeof(GLfloat), |
| 537 reinterpret_cast<void*>(3 * sizeof(GLfloat) * | 579 reinterpret_cast<void*>(3 * sizeof(GLfloat) * |
| 538 kNumVertices)); | 580 kNumVertices)); |
| 539 glEnableVertexAttribArray(state_->position_location_); | 581 gl_->EnableVertexAttribArray(state_->position_location_); |
| 540 glEnableVertexAttribArray(state_->normal_location_); | 582 gl_->EnableVertexAttribArray(state_->normal_location_); |
| 541 glUniformMatrix4fv(state_->mvp_location_, 1, GL_FALSE, | 583 gl_->UniformMatrix4fv(state_->mvp_location_, 1, GL_FALSE, |
| 542 static_cast<GLfloat*>(&state_->mvp_matrix_.m[0][0])); | 584 static_cast<GLfloat*>(&state_->mvp_matrix_.m[0][0])); |
| 543 glUniform3fv(state_->color_location_, 1, color_); | 585 gl_->Uniform3fv(state_->color_location_, 1, color_); |
| 544 glDrawElements(GL_TRIANGLES, state_->num_indices_, GL_UNSIGNED_SHORT, 0); | 586 gl_->DrawElements(GL_TRIANGLES, state_->num_indices_, GL_UNSIGNED_SHORT, 0); |
| 545 } | 587 } |
| 546 | 588 |
| 547 void SpinningCube::Update() { | 589 void SpinningCube::Update() { |
| 548 float aspect = static_cast<GLfloat>(width_) / static_cast<GLfloat>(height_); | 590 float aspect = static_cast<GLfloat>(width_) / static_cast<GLfloat>(height_); |
| 549 | 591 |
| 550 ESMatrix perspective; | 592 ESMatrix perspective; |
| 551 perspective.LoadIdentity(); | 593 perspective.LoadIdentity(); |
| 552 perspective.Perspective(60.0f, aspect, 1.0f, 20.0f ); | 594 perspective.Perspective(60.0f, aspect, 1.0f, 20.0f ); |
| 553 | 595 |
| 554 ESMatrix modelview; | 596 ESMatrix modelview; |
| 555 modelview.LoadIdentity(); | 597 modelview.LoadIdentity(); |
| 556 modelview.Translate(0.0, 0.0, -2.0); | 598 modelview.Translate(0.0, 0.0, -2.0); |
| 557 modelview.Rotate(state_->angle_ * direction_, 1.0, 0.0, 1.0); | 599 modelview.Rotate(state_->angle_ * direction_, 1.0, 0.0, 1.0); |
| 558 | 600 |
| 559 state_->mvp_matrix_.Multiply(&modelview, &perspective); | 601 state_->mvp_matrix_.Multiply(&modelview, &perspective); |
| 560 } | 602 } |
| 561 | 603 |
| 562 } // namespace examples | 604 } // namespace examples |
| OLD | NEW |