Index: third_party/gles_book_examples/Chapter_2/Hello_Triangle/Hello_Triangle.c |
=================================================================== |
--- third_party/gles_book_examples/Chapter_2/Hello_Triangle/Hello_Triangle.c (revision 35627) |
+++ third_party/gles_book_examples/Chapter_2/Hello_Triangle/Hello_Triangle.c (working copy) |
@@ -14,70 +14,18 @@ |
// a minimal vertex/fragment shader. The purpose of this |
// example is to demonstrate the basic concepts of |
// OpenGL ES 2.0 rendering. |
-#include <stdlib.h> |
-#include "esUtil.h" |
-typedef struct |
-{ |
- // Handle to a program object |
- GLuint programObject; |
+#include "Hello_Triangle.h" |
-} UserData; |
+#include <stdlib.h> |
/// |
-// Create a shader object, load the shader source, and |
-// compile the shader. |
-// |
-GLuint LoadShader ( GLenum type, const char *shaderSrc ) |
-{ |
- GLuint shader; |
- GLint compiled; |
- |
- // Create the shader object |
- shader = glCreateShader ( type ); |
- |
- if ( shader == 0 ) |
- return 0; |
- |
- // Load the shader source |
- glShaderSource ( shader, 1, &shaderSrc, NULL ); |
- |
- // Compile the shader |
- glCompileShader ( shader ); |
- |
- // Check the compile status |
- glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled ); |
- |
- if ( !compiled ) |
- { |
- GLint infoLen = 0; |
- |
- glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen ); |
- |
- if ( infoLen > 1 ) |
- { |
- char* infoLog = malloc (sizeof(char) * infoLen ); |
- |
- glGetShaderInfoLog ( shader, infoLen, NULL, infoLog ); |
- esLogMessage ( "Error compiling shader:\n%s\n", infoLog ); |
- |
- free ( infoLog ); |
- } |
- |
- glDeleteShader ( shader ); |
- return 0; |
- } |
- |
- return shader; |
- |
-} |
- |
-/// |
// Initialize the shader and program object |
// |
-int Init ( ESContext *esContext ) |
+int htInit ( ESContext *esContext ) |
{ |
- UserData *userData = esContext->userData; |
+ HTUserData *userData = esContext->userData; |
+ |
GLbyte vShaderStr[] = |
"attribute vec4 vPosition; \n" |
"void main() \n" |
@@ -85,63 +33,29 @@ |
" gl_Position = vPosition; \n" |
"} \n"; |
+ // TODO(alokp): Shaders containing "precision" do not compile. |
GLbyte fShaderStr[] = |
- "precision mediump float;\n"\ |
"void main() \n" |
"{ \n" |
" gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );\n" |
"} \n"; |
- GLuint vertexShader; |
- GLuint fragmentShader; |
- GLuint programObject; |
- GLint linked; |
+ // TODO(alokp): Client-side vertex arrays do not work. |
+ GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, |
+ -0.5f, -0.5f, 0.0f, |
+ 0.5f, -0.5f, 0.0f }; |
- // Load the vertex/fragment shaders |
- vertexShader = LoadShader ( GL_VERTEX_SHADER, vShaderStr ); |
- fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, fShaderStr ); |
+ userData->programObject = esLoadProgram ( vShaderStr, fShaderStr ); |
+ if ( userData->programObject == 0 ) return FALSE; |
- // Create the program object |
- programObject = glCreateProgram ( ); |
- |
- if ( programObject == 0 ) |
- return 0; |
- |
- glAttachShader ( programObject, vertexShader ); |
- glAttachShader ( programObject, fragmentShader ); |
- |
// Bind vPosition to attribute 0 |
- glBindAttribLocation ( programObject, 0, "vPosition" ); |
+ glBindAttribLocation ( userData->programObject, 0, "vPosition" ); |
- // Link the program |
- glLinkProgram ( programObject ); |
+ glGenBuffers ( 1, &userData->vbo ); |
+ glBindBuffer ( GL_ARRAY_BUFFER, userData->vbo ); |
+ glBufferData ( GL_ARRAY_BUFFER, sizeof(vVertices), NULL, GL_STATIC_DRAW ); |
+ glBufferSubData ( GL_ARRAY_BUFFER, 0, sizeof(vVertices), vVertices ); |
- // Check the link status |
- glGetProgramiv ( programObject, GL_LINK_STATUS, &linked ); |
- |
- if ( !linked ) |
- { |
- GLint infoLen = 0; |
- |
- glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen ); |
- |
- if ( infoLen > 1 ) |
- { |
- char* infoLog = malloc (sizeof(char) * infoLen ); |
- |
- glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog ); |
- esLogMessage ( "Error linking program:\n%s\n", infoLog ); |
- |
- free ( infoLog ); |
- } |
- |
- glDeleteProgram ( programObject ); |
- return FALSE; |
- } |
- |
- // Store the program object |
- userData->programObject = programObject; |
- |
glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f ); |
return TRUE; |
} |
@@ -149,13 +63,10 @@ |
/// |
// Draw a triangle using the shader pair created in Init() |
// |
-void Draw ( ESContext *esContext ) |
+void htDraw ( ESContext *esContext ) |
{ |
- UserData *userData = esContext->userData; |
- GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, |
- -0.5f, -0.5f, 0.0f, |
- 0.5f, -0.5f, 0.0f }; |
- |
+ HTUserData *userData = esContext->userData; |
+ |
// Set the viewport |
glViewport ( 0, 0, esContext->width, esContext->height ); |
@@ -166,29 +77,33 @@ |
glUseProgram ( userData->programObject ); |
// Load the vertex data |
- glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices ); |
+ glBindBuffer ( GL_ARRAY_BUFFER, userData->vbo ); |
glEnableVertexAttribArray ( 0 ); |
+ glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, 0 ); |
glDrawArrays ( GL_TRIANGLES, 0, 3 ); |
- eglSwapBuffers ( esContext->eglDisplay, esContext->eglSurface ); |
+ // Nothing is drawn or application crashes without glFlush. |
+ // TODO(alokp): glFlush should not be necessary with SwapBuffers(). |
+ glFlush(); |
} |
- |
-int main ( int argc, char *argv[] ) |
+/// |
+// Cleanup |
+// |
+void htShutDown ( ESContext *esContext ) |
{ |
- ESContext esContext; |
- UserData userData; |
+ HTUserData *userData = esContext->userData; |
- esInitContext ( &esContext ); |
- esContext.userData = &userData; |
- |
- esCreateWindow ( &esContext, "Hello Triangle", 320, 240, ES_WINDOW_RGB ); |
- |
- if ( !Init ( &esContext ) ) |
- return 0; |
- |
- esRegisterDrawFunc ( &esContext, Draw ); |
- |
- esMainLoop ( &esContext ); |
+ // Delete program object |
+ if ( userData->programObject != 0 ) |
+ { |
+ glDeleteProgram ( userData->programObject ); |
+ userData->programObject = 0; |
+ } |
+ if ( userData->vbo != 0 ) |
+ { |
+ glDeleteBuffers ( 1, &userData->vbo ); |
+ userData->vbo = 0; |
+ } |
} |