Index: third_party/gles_book_examples/Chapter_15/Hello_Triangle_KD/Hello_Triangle_KD.c |
=================================================================== |
--- third_party/gles_book_examples/Chapter_15/Hello_Triangle_KD/Hello_Triangle_KD.c (revision 35873) |
+++ third_party/gles_book_examples/Chapter_15/Hello_Triangle_KD/Hello_Triangle_KD.c (working copy) |
@@ -1,306 +0,0 @@ |
-// |
-// Book: OpenGL(R) ES 2.0 Programming Guide |
-// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner |
-// ISBN-10: 0321502795 |
-// ISBN-13: 9780321502797 |
-// Publisher: Addison-Wesley Professional |
-// URLs: http://safari.informit.com/9780321563835 |
-// http://www.opengles-book.com |
-// |
- |
-// Hello_Triangle_KD.c |
-// |
-// This is a simple example that draws a single triangle with |
-// a minimal vertex/fragment shader using OpenKODE. |
-// |
-#include <KD/kd.h> |
-#include <EGL/egl.h> |
-#include <GLES2/gl2.h> |
- |
-typedef struct |
-{ |
- // Handle to a program object |
- GLuint programObject; |
- |
- // EGL handles |
- EGLDisplay eglDisplay; |
- EGLContext eglContext; |
- EGLSurface eglSurface; |
- |
-} UserData; |
- |
-/// |
-// 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 = kdMalloc (sizeof(char) * infoLen ); |
- |
- glGetShaderInfoLog ( shader, infoLen, NULL, infoLog ); |
- kdLogMessage ( infoLog ); |
- |
- kdFree ( infoLog ); |
- } |
- |
- glDeleteShader ( shader ); |
- return 0; |
- } |
- |
- return shader; |
- |
-} |
- |
-/// |
-// Initialize the shader and program object |
-// |
-int Init ( UserData *userData ) |
-{ |
- GLbyte vShaderStr[] = |
- "attribute vec4 vPosition; \n" |
- "void main() \n" |
- "{ \n" |
- " gl_Position = vPosition; \n" |
- "} \n"; |
- |
- 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; |
- |
- // Load the vertex/fragment shaders |
- vertexShader = LoadShader ( GL_VERTEX_SHADER, vShaderStr ); |
- fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, fShaderStr ); |
- |
- // 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" ); |
- |
- // Link the program |
- glLinkProgram ( programObject ); |
- |
- // 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 = kdMalloc (sizeof(char) * infoLen ); |
- |
- glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog ); |
- kdLogMessage ( infoLog ); |
- |
- kdFree ( infoLog ); |
- } |
- |
- glDeleteProgram ( programObject ); |
- return FALSE; |
- } |
- |
- // Store the program object |
- userData->programObject = programObject; |
- |
- glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f ); |
- return TRUE; |
-} |
- |
-/// |
-// Draw a triangle using the shader pair created in Init() |
-// |
-void Draw ( UserData *userData ) |
-{ |
- GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, |
- -0.5f, -0.5f, 0.0f, |
- 0.5f, -0.5f, 0.0f }; |
- |
- // Set the viewport |
- glViewport ( 0, 0, 320, 240 ); |
- |
- // Clear the color buffer |
- glClear ( GL_COLOR_BUFFER_BIT ); |
- |
- // Use the program object |
- glUseProgram ( userData->programObject ); |
- |
- // Load the vertex data |
- glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices ); |
- glEnableVertexAttribArray ( 0 ); |
- |
- glDrawArrays ( GL_TRIANGLES, 0, 3 ); |
- |
- eglSwapBuffers ( userData->eglDisplay, userData->eglSurface ); |
-} |
- |
- |
-/// |
-// InitEGLContext() |
-// |
-// Initialize an EGL rendering context and all associated elements |
-// |
-EGLBoolean InitEGLContext ( UserData *userData, |
- KDWindow *window, |
- EGLConfig config ) |
-{ |
- EGLContext context; |
- EGLSurface surface; |
- EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE }; |
- |
- // Get native window handle |
- EGLNativeWindowType hWnd; |
- if(kdRealizeWindow(window, &hWnd) != 0) |
- { |
- return EGL_FALSE; |
- } |
- surface = eglCreateWindowSurface(userData->eglDisplay, config, hWnd, NULL); |
- if ( surface == EGL_NO_SURFACE ) |
- { |
- return EGL_FALSE; |
- } |
- |
- // Create a GL context |
- context = eglCreateContext(userData->eglDisplay, config, EGL_NO_CONTEXT, contextAttribs ); |
- if ( context == EGL_NO_CONTEXT ) |
- { |
- return EGL_FALSE; |
- } |
- |
- // Make the context current |
- if ( !eglMakeCurrent(userData->eglDisplay, surface, surface, context) ) |
- { |
- return EGL_FALSE; |
- } |
- |
- userData->eglContext = context; |
- userData->eglSurface = surface; |
- |
- return EGL_TRUE; |
-} |
- |
-/// |
-// kdMain() |
-// |
-// Main function for OpenKODE application |
-// |
-KDint kdMain ( KDint argc, const KDchar *const *argv ) |
-{ |
- EGLint attribList[] = |
- { |
- EGL_RED_SIZE, 8, |
- EGL_GREEN_SIZE, 8, |
- EGL_BLUE_SIZE, 8, |
- EGL_ALPHA_SIZE, EGL_DONT_CARE, |
- EGL_DEPTH_SIZE, EGL_DONT_CARE, |
- EGL_STENCIL_SIZE, EGL_DONT_CARE, |
- EGL_NONE |
- }; |
- EGLint majorVersion, |
- minorVersion; |
- UserData userData; |
- EGLint numConfigs; |
- EGLConfig config; |
- KDWindow *window = KD_NULL; |
- |
- userData.eglDisplay = eglGetDisplay( EGL_DEFAULT_DISPLAY ); |
- |
- // Initialize EGL |
- if ( !eglInitialize(userData.eglDisplay, &majorVersion, &minorVersion) ) |
- { |
- return EGL_FALSE; |
- } |
- |
- // Get configs |
- if ( !eglGetConfigs(userData.eglDisplay, NULL, 0, &numConfigs) ) |
- { |
- return EGL_FALSE; |
- } |
- |
- // Choose config |
- if ( !eglChooseConfig(userData.eglDisplay, attribList, &config, 1, &numConfigs) ) |
- { |
- return EGL_FALSE; |
- } |
- |
- |
- // Use OpenKODE to create a Window |
- window = kdCreateWindow ( userData.eglDisplay, config, KD_NULL ); |
- if( !window ) |
- kdExit ( 0 ); |
- |
- if ( !InitEGLContext ( &userData, window, config ) ) |
- kdExit ( 0 ); |
- |
- if ( !Init ( &userData ) ) |
- kdExit ( 0 ); |
- |
- // Main Loop |
- while ( 1 ) |
- { |
- // Wait for an event |
- const KDEvent *evt = kdWaitEvent ( 0 ); |
- if ( evt ) |
- { |
- // Exit app |
- if ( evt->type == KD_EVENT_WINDOW_CLOSE) |
- break; |
- } |
- |
- // Draw frame |
- Draw ( &userData ); |
- } |
- |
- // EGL clean up |
- eglMakeCurrent ( 0, 0, 0, 0 ); |
- eglDestroySurface ( userData.eglDisplay, userData.eglSurface ); |
- eglDestroyContext ( userData.eglDisplay, userData.eglContext ); |
- |
- // Destroy the window |
- kdDestroyWindow(window); |
- |
- return 0; |
-} |