#ifndef _oglExtensions_H_
#define _oglExtensions_H_

/* fixed function shader */

typedef char			GLchar;
typedef unsigned char   GLboolean;
typedef int             GLsizei;
typedef int				GLint;
typedef unsigned int    GLuint;
typedef float           GLfloat;
typedef unsigned int    GLenum;

#define GL_FRAGMENT_SHADER                  0x8B30
#define GL_VERTEX_SHADER                    0x8B31

	//attrib/uniform types - todo matrix types
#define GL_FLOAT                          0x1406
#define GL_FLOAT_VEC2                       0x8B50
#define GL_FLOAT_VEC3                       0x8B51
#define GL_FLOAT_VEC4                       0x8B52
#define GL_FLOAT_MAT3                       0x8B5B
#define GL_FLOAT_MAT4                       0x8B5C
#define GL_SAMPLER_2D                       0x8B5E

#define GL_ATTRIB_VERTEX					0x1
#define GL_ATTRIB_NORMAL					0x2
#define GL_ATTRIB_COLOR						0x3
#define GL_ATTRIB_MULTITEXCOORD0			0x4
#define GL_ATTRIB_MULTITEXCOORD1			0x5

	//GetProgramiv
#define GL_VERTEX_INFO_LOG_LENGTH           0x01
#define GL_FRAGMENT_INFO_LOG_LENGTH         0x02
#define GL_ACTIVE_UNIFORMS                  0x8B86
#define GL_ACTIVE_UNIFORM_MAX_LENGTH        0x8B87
#define GL_ACTIVE_ATTRIBUTES                0x8B89
#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH      0x8B8A

GLuint glCreateProgram(void);
void glDeleteProgram (GLuint program);
void glUseProgram (GLuint program);

	// program is a valid program id created with glCreateProgram
	// returns GL_TRUE on success and GL_FALSE on error (get shaderinfolog for more info)
GLint glCompileShaders(GLuint program, const char* vertexShaderSource, const char* fragmentShaderSource);

	// program is a valid program id created with glCreateProgram
	// pname is GL_VERTEX_SHADER or GL_FRAGMENT_SHADER
void glGetShaderInfoLog(GLuint program, GLuint pname, GLsizei bufSize, GLsizei *length, GLchar *infoLog);

void glGetProgramiv(GLuint program, GLenum pname, GLint *params);

void glGetActiveAttrib(GLuint program, GLuint index, GLenum* attr, GLenum *type, 
							GLsizei bufSize, GLsizei *length, GLchar *semantic);	
								//semantic is extra info for client

GLint glGetUniformLocation(GLuint program, const GLchar *name);
void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length,
 	GLint *size, GLenum *type,GLchar *name);

void glUniform1f(GLint location, GLfloat v0);
void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);

void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);

#endif