/* San Angeles Observation OpenGL ES version example
 * Copyright 2004-2005 Jetro Lauha
 * All rights reserved.
 * Web: http://iki.fi/jetro/
 *
 * This source is free software; you can redistribute it and/or
 * modify it under the terms of EITHER:
 *   (1) The GNU Lesser General Public License as published by the Free
 *       Software Foundation; either version 2.1 of the License, or (at
 *       your option) any later version. The text of the GNU Lesser
 *       General Public License is included with this source in the
 *       file LICENSE-LGPL.txt.
 *   (2) The BSD-style license that is included with this source in
 *       the file LICENSE-BSD.txt.
 *
 * This source is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
 * LICENSE-LGPL.txt and LICENSE-BSD.txt for more details.
 *
 * $Id: importgl.h,v 1.4 2005/02/24 20:29:33 tonic Exp $
 * $Revision: 1.4 $
 */

#ifndef IMPORTGL_H_INCLUDED
#define IMPORTGL_H_INCLUDED


#ifdef __cplusplus
extern "C" {
#endif

#include <GLES2/gl2.h>

/* Use DISABLE_IMPORTGL if you want to link the OpenGL ES at
 * compile/link time and not import it dynamically runtime.
 */
#ifndef DISABLE_IMPORTGL


/* Dynamically fetches pointers to the gl functions.
 * Should be called once on application initialization.
 * Returns non-zero on success and 0 on failure.
 */
extern int importGLInit();


#ifndef IMPORTGL_API
#define IMPORTGL_API extern
#endif
#ifndef IMPORTGL_FNPTRINIT
#define IMPORTGL_FNPTRINIT
#endif

#define FNDEF(retType, funcName, args) \
        IMPORTGL_API retType (*funcPtr_##funcName) args IMPORTGL_FNPTRINIT;\
        typedef retType (*funcType_##funcName) args


FNDEF(void, glAttachShader, (GLuint program, GLuint shader));
FNDEF(void, glBindBuffer, (GLenum target, GLuint buffer));
FNDEF(void, glBlendFunc, (GLenum sfactor, GLenum dfactor));
FNDEF(void, glBufferData, (GLenum target, GLsizeiptr size,
                           const void* data, GLenum usage));
FNDEF(void, glBufferSubData, (GLenum target, GLintptr offset,
                              GLsizeiptr size, const void* data));
FNDEF(void, glClear, (GLbitfield mask));
FNDEF(void, glClearColor, (GLclampf red, GLclampf green, GLclampf blue,
                           GLclampf alpha));
FNDEF(void, glCompileShader, (GLuint shader));
FNDEF(GLuint, glCreateProgram, (void));
FNDEF(GLuint, glCreateShader, (GLenum type));
FNDEF(void, glDeleteBuffers, (GLsizei n, const GLuint* buffers));
FNDEF(void, glDeleteProgram, (GLuint program));
FNDEF(void, glDeleteShader, (GLuint shader));
FNDEF(void, glDisable, (GLenum cap));
FNDEF(void, glDisableVertexAttribArray, (GLuint index));
FNDEF(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count));
FNDEF(void, glEnable, (GLenum cap));
FNDEF(void, glEnableVertexAttribArray, (GLuint index));
FNDEF(void, glGenBuffers, (GLsizei n, GLuint* buffers));
FNDEF(int, glGetAttribLocation, (GLuint program, const char* name));
FNDEF(GLenum, glGetError, (void));
FNDEF(void, glGetShaderiv, (GLuint shader, GLenum pname, GLint* params));
FNDEF(void, glGetShaderInfoLog, (GLuint shader, GLsizei bufsize,
                                 GLsizei* length, char* infolog));
FNDEF(int, glGetUniformLocation, (GLuint program, const char* name));
FNDEF(void, glLinkProgram, (GLuint program));
FNDEF(void, glShaderSource, (GLuint shader, GLsizei count,
                             const char** string, const GLint* length));
FNDEF(void, glUniform1f, (GLint location, GLfloat x));
FNDEF(void, glUniform3fv, (GLint location, GLsizei count, const GLfloat* v));
FNDEF(void, glUniform4fv, (GLint location, GLsizei count, const GLfloat* v));
FNDEF(void, glUniformMatrix3fv, (GLint location, GLsizei count,
                                 GLboolean transpose, const GLfloat* value));
FNDEF(void, glUniformMatrix4fv, (GLint location, GLsizei count,
                                 GLboolean transpose, const GLfloat* value));
FNDEF(void, glUseProgram, (GLuint program));
FNDEF(void, glVertexAttribPointer, (GLuint indx, GLint size, GLenum type,
                                    GLboolean normalized, GLsizei stride,
                                    const void* ptr));
FNDEF(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height));

#undef FN
#define FNPTR(name) funcPtr_##name

#ifndef IMPORTGL_NO_FNPTR_DEFS

// Redirect gl* function calls to funcPtr_gl*.

#define glAttachShader              FNPTR(glAttachShader)
#define glBindBuffer                FNPTR(glBindBuffer)
#define glBlendFunc                 FNPTR(glBlendFunc)
#define glBufferData                FNPTR(glBufferData)
#define glBufferSubData             FNPTR(glBufferSubData)
#define glClear                     FNPTR(glClear)
#define glClearColor                FNPTR(glClearColor)
#define glCompileShader             FNPTR(glCompileShader)
#define glCreateProgram             FNPTR(glCreateProgram)
#define glCreateShader              FNPTR(glCreateShader)
#define glDeleteBuffers             FNPTR(glDeleteBuffers)
#define glDeleteProgram             FNPTR(glDeleteProgram)
#define glDeleteShader              FNPTR(glDeleteShader)
#define glDisable                   FNPTR(glDisable)
#define glDisableVertexAttribArray  FNPTR(glDisableVertexAttribArray)
#define glDrawArrays                FNPTR(glDrawArrays)
#define glEnable                    FNPTR(glEnable)
#define glEnableVertexAttribArray   FNPTR(glEnableVertexAttribArray)
#define glGenBuffers                FNPTR(glGenBuffers)
#define glGetAttribLocation         FNPTR(glGetAttribLocation)
#define glGetError                  FNPTR(glGetError)
#define glGetShaderiv               FNPTR(glGetShaderiv)
#define glGetShaderInfoLog          FNPTR(glGetShaderInfoLog)
#define glGetUniformLocation        FNPTR(glGetUniformLocation)

#define glLinkProgram               FNPTR(glLinkProgram)
#define glShaderSource              FNPTR(glShaderSource)
#define glUniform1f                 FNPTR(glUniform1f)
#define glUniform3fv                FNPTR(glUniform3fv)
#define glUniform4fv                FNPTR(glUniform4fv)
#define glUniformMatrix3fv          FNPTR(glUniformMatrix3fv)
#define glUniformMatrix4fv          FNPTR(glUniformMatrix4fv)
#define glUseProgram                FNPTR(glUseProgram)
#define glViewport                  FNPTR(glViewport)
#define glVertexAttribPointer       FNPTR(glVertexAttribPointer)

#endif // !IMPORTGL_NO_FNPTR_DEFS


#endif // !DISABLE_IMPORTGL


#ifdef __cplusplus
}
#endif


#endif // !IMPORTGL_H_INCLUDED