summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/client/gles2_demo_cc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer/client/gles2_demo_cc.cc')
-rw-r--r--gpu/command_buffer/client/gles2_demo_cc.cc40
1 files changed, 39 insertions, 1 deletions
diff --git a/gpu/command_buffer/client/gles2_demo_cc.cc b/gpu/command_buffer/client/gles2_demo_cc.cc
index 0478e32..2544f42 100644
--- a/gpu/command_buffer/client/gles2_demo_cc.cc
+++ b/gpu/command_buffer/client/gles2_demo_cc.cc
@@ -5,6 +5,7 @@
// This file is here so other GLES2 related files can have a common set of
// includes where appropriate.
+#include <math.h>
#include <GLES2/gl2.h>
#include "gpu/command_buffer/client/gles2_demo_cc.h"
@@ -13,8 +14,10 @@ namespace {
GLuint g_texture = 0;
int g_textureLoc = -1;
GLuint g_programObject = 0;
+GLuint g_worldMatrixLoc = 0;
GLuint g_vbo = 0;
GLsizei g_texCoordOffset = 0;
+int g_angle = 0;
void CheckGLError() {
GLenum error = glGetError();
@@ -49,12 +52,14 @@ GLuint LoadShader(GLenum type, const char* shaderSrc) {
void InitShaders() {
static const char* vShaderStr =
+ "uniform mat4 worldMatrix;\n"
"attribute vec3 g_Position;\n"
"attribute vec2 g_TexCoord0;\n"
"varying vec2 texCoord;\n"
"void main()\n"
"{\n"
- " gl_Position = vec4(g_Position.x, g_Position.y, g_Position.z, 1.0);\n"
+ " gl_Position = worldMatrix *\n"
+ " vec4(g_Position.x, g_Position.y, g_Position.z, 1.0);\n"
" texCoord = g_TexCoord0;\n"
"}\n";
static const char* fShaderStr =
@@ -94,6 +99,7 @@ void InitShaders() {
return;
}
g_programObject = programObject;
+ g_worldMatrixLoc = glGetUniformLocation(g_programObject, "worldMatrix");
g_textureLoc = glGetUniformLocation(g_programObject, "tex");
glGenBuffers(1, &g_vbo);
glBindBuffer(GL_ARRAY_BUFFER, g_vbo);
@@ -124,7 +130,36 @@ void InitShaders() {
CheckGLError();
}
+#define PI 3.1415926535897932384626433832795f
+
void Draw() {
+ // TODO(kbr): base the angle on time rather than on ticks
+ g_angle = (g_angle + 1) % 360;
+ // Rotate about the Z axis
+ GLfloat rot_matrix[16];
+ GLfloat cos_angle = cosf(static_cast<GLfloat>(g_angle) * PI / 180.0f);
+ GLfloat sin_angle = sinf(static_cast<GLfloat>(g_angle) * PI / 180.0f);
+ // OpenGL matrices are column-major
+ rot_matrix[0] = cos_angle;
+ rot_matrix[1] = sin_angle;
+ rot_matrix[2] = 0.0f;
+ rot_matrix[3] = 0.0f;
+
+ rot_matrix[4] = -sin_angle;
+ rot_matrix[5] = cos_angle;
+ rot_matrix[6] = 0.0f;
+ rot_matrix[7] = 0.0f;
+
+ rot_matrix[8] = 0.0f;
+ rot_matrix[9] = 0.0f;
+ rot_matrix[10] = 1.0f;
+ rot_matrix[11] = 0.0f;
+
+ rot_matrix[12] = 0.0f;
+ rot_matrix[13] = 0.0f;
+ rot_matrix[14] = 0.0f;
+ rot_matrix[15] = 1.0f;
+
// Note: the viewport is automatically set up to cover the entire Canvas.
// Clear the color buffer
glClear(GL_COLOR_BUFFER_BIT);
@@ -132,6 +167,9 @@ void Draw() {
// Use the program object
glUseProgram(g_programObject);
CheckGLError();
+ // Set up the model matrix
+ glUniformMatrix4fv(g_worldMatrixLoc, 1, GL_FALSE, rot_matrix);
+
// Load the vertex data
glBindBuffer(GL_ARRAY_BUFFER, g_vbo);
glEnableVertexAttribArray(0);