305 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			305 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        oglpfuncs.h
 | |
| // Purpose:     Types, constants, and pointers to OpenGL functions
 | |
| // Author:      Manuel Martin
 | |
| // Created:     2015/11/16
 | |
| // Copyright:   (c) 2015 Manuel Martin
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| #ifndef OGLPFUNCS_H
 | |
| #define OGLPFUNCS_H
 | |
| 
 | |
| /* What is this file for?
 | |
| You would expect the OS to provide constants and functions used in OpenGL.
 | |
| That was so up to OGL version 1.1; you just needed to include 'gl.h'. But for
 | |
| newer versions things are not so simple. Constants and function prototypes (well,
 | |
| typedefs for their pointers) are included in 'glext.h', a file provided by the
 | |
| OpenGL Registry, and 'glcorearb.h' (also from OGL, only Core Profile definitions).
 | |
| The functions "live" in the graphics card driver, and they are used through their
 | |
| pointers.
 | |
| The reason of this file is to retrieve those pointers, and also to define the
 | |
| types, constants, and functions used in this sample, so as to avoid the inclusion
 | |
| of glext.h, which is a very big file.
 | |
| 
 | |
| In the OpenGL Registry we can find also glxext.h and wglext.h (MSW/UXs versions).
 | |
| These files are used for "extensions", or functions provided by GPU vendors instead
 | |
| of the OpenGL Consortium. This sample doesn't use them.
 | |
| 
 | |
| OK, there are some good libraries to do this job (GLEW, GL3W, etc). Why do we
 | |
| reinvent the wheel? Just because for this sample we need a small subset, and not
 | |
| all of thousands of lines of code that those libraries consist of.
 | |
| */
 | |
| 
 | |
| /*
 | |
| ** Copyright (c) 2013-2015 The Khronos Group Inc.
 | |
| **
 | |
| ** Permission is hereby granted, free of charge, to any person obtaining a
 | |
| ** copy of this software and/or associated documentation files (the
 | |
| ** "Materials"), to deal in the Materials without restriction, including
 | |
| ** without limitation the rights to use, copy, modify, merge, publish,
 | |
| ** distribute, sublicense, and/or sell copies of the Materials, and to
 | |
| ** permit persons to whom the Materials are furnished to do so, subject to
 | |
| ** the following conditions:
 | |
| **
 | |
| ** The above copyright notice and this permission notice shall be included
 | |
| ** in all copies or substantial portions of the Materials.
 | |
| **
 | |
| ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | |
| ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
| ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 | |
| ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 | |
| ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 | |
| ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 | |
| ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 | |
| */
 | |
| 
 | |
| #if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H)
 | |
|     #error gl.h included before oglpfuncs.h
 | |
| #endif
 | |
| 
 | |
| // Apple defines everything on his own
 | |
| #ifdef __APPLE__
 | |
|     // Suppress warnings when including gl3.h
 | |
|     #define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
 | |
|     #include <OpenGL/gl3.h> // For Core Profile
 | |
| #else
 | |
| // The rest of the world needs the rest of this file
 | |
| 
 | |
| // Avoid gl.h definitions, may clash with our own definitions
 | |
| #define __gl_h_
 | |
| #define __GL_H__
 | |
| #define _GL_H
 | |
| #define __X_GL_H
 | |
| 
 | |
| // APIENTRY and GLAPI definitions
 | |
| #if defined(_WIN32) || defined(__WIN32__)
 | |
|     // MS Windows needs APIENTRY.
 | |
|     #ifndef APIENTRY
 | |
|         #define APIENTRY __stdcall
 | |
|     #endif
 | |
| 
 | |
|     #ifndef GLAPI
 | |
|         #if defined(_MSC_VER) //VC++
 | |
|             #define GLAPI __declspec(dllimport)
 | |
|         #else
 | |
|             #define GLAPI extern
 | |
|         #endif
 | |
|     #endif
 | |
| #endif // _WIN32 / __WIN32__
 | |
| 
 | |
| // Other platforms are simpler
 | |
| #ifndef APIENTRY
 | |
|     #define APIENTRY
 | |
| #endif
 | |
| #ifndef GLAPI
 | |
|     #define GLAPI extern
 | |
| #endif
 | |
| 
 | |
| // For ptrdiff_t
 | |
| #include <stddef.h>
 | |
| 
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| // GL types
 | |
| typedef void GLvoid;
 | |
| typedef unsigned char GLubyte;
 | |
| typedef char GLchar;
 | |
| typedef unsigned char GLboolean;
 | |
| typedef unsigned short GLushort;
 | |
| typedef int GLint;
 | |
| typedef int GLsizei;
 | |
| typedef unsigned int GLenum;
 | |
| typedef unsigned int GLuint;
 | |
| typedef unsigned int GLbitfield;
 | |
| typedef float GLfloat;
 | |
| typedef ptrdiff_t GLsizeiptr;
 | |
| typedef ptrdiff_t GLintptr;
 | |
| 
 | |
| // Constants
 | |
| #define GL_ARRAY_BUFFER                   0x8892
 | |
| #define GL_BLEND                          0x0BE2
 | |
| #define GL_CLAMP_TO_EDGE                  0x812F
 | |
| #define GL_COLOR_BUFFER_BIT               0x00004000
 | |
| #define GL_COMPILE_STATUS                 0x8B81
 | |
| #define GL_DEPTH_BUFFER_BIT               0x00000100
 | |
| #define GL_DEPTH_TEST                     0x0B71
 | |
| #define GL_ELEMENT_ARRAY_BUFFER           0x8893
 | |
| #define GL_FALSE                          0
 | |
| #define GL_FIRST_VERTEX_CONVENTION        0x8E4D
 | |
| #define GL_FLOAT                          0x1406
 | |
| #define GL_FRAGMENT_SHADER                0x8B30
 | |
| #define GL_INFO_LOG_LENGTH                0x8B84
 | |
| #define GL_LEQUAL                         0x0203
 | |
| #define GL_LINK_STATUS                    0x8B82
 | |
| #define GL_LINEAR                         0x2601
 | |
| #define GL_NO_ERROR                       0
 | |
| #define GL_ONE_MINUS_SRC_ALPHA            0x0303
 | |
| #define GL_RENDERER                       0x1F01
 | |
| #define GL_RGBA                           0x1908
 | |
| #define GL_SRC_ALPHA                      0x0302
 | |
| #define GL_STATIC_DRAW                    0x88E4
 | |
| #define GL_TEXTURE0                       0x84C0
 | |
| #define GL_TEXTURE_2D                     0x0DE1
 | |
| #define GL_TEXTURE_BASE_LEVEL             0x813C
 | |
| #define GL_TEXTURE_MAX_LEVEL              0x813D
 | |
| #define GL_TEXTURE_MAG_FILTER             0x2800
 | |
| #define GL_TEXTURE_MIN_FILTER             0x2801
 | |
| #define GL_TEXTURE_WRAP_S                 0x2802
 | |
| #define GL_TEXTURE_WRAP_T                 0x2803
 | |
| #define GL_TRIANGLE_STRIP                 0x0005
 | |
| #define GL_UNSIGNED_BYTE                  0x1401
 | |
| #define GL_UNSIGNED_SHORT                 0x1403
 | |
| #define GL_VENDOR                         0x1F00
 | |
| #define GL_VERSION                        0x1F02
 | |
| #define GL_VERTEX_SHADER                  0x8B31
 | |
| 
 | |
| // This functions exist since OpenGL 1.1, and they don't need typedefs nor pointers.
 | |
| // Trying to retrieve their pointers with wglGetProcAddress() will fail.
 | |
| GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);
 | |
| GLAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
 | |
| GLAPI void APIENTRY glClear (GLbitfield mask);
 | |
| GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
 | |
| GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
 | |
| GLAPI void APIENTRY glDepthFunc (GLenum func);
 | |
| GLAPI void APIENTRY glDisable (GLenum cap);
 | |
| GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
 | |
| GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
 | |
| GLAPI void APIENTRY glEnable (GLenum cap);
 | |
| GLAPI void APIENTRY glFinish (void);
 | |
| GLAPI void APIENTRY glFlush (void);
 | |
| GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures);
 | |
| GLAPI GLenum APIENTRY glGetError (void);
 | |
| GLAPI const GLubyte* APIENTRY glGetString (GLenum name);
 | |
| GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
 | |
| GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
 | |
| GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
 | |
| 
 | |
| // Typedefs for functions for OpenGL > 1.1
 | |
| typedef void (APIENTRY* PFNGLACTIVETEXTUREPROC) (GLenum texture);
 | |
| typedef void (APIENTRY* PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
 | |
| typedef void (APIENTRY* PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
 | |
| typedef void (APIENTRY* PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
 | |
| typedef void (APIENTRY* PFNGLBINDVERTEXARRAYPROC) (GLuint array);
 | |
| typedef void (APIENTRY* PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
 | |
| typedef void (APIENTRY* PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
 | |
| typedef void (APIENTRY* PFNGLCOMPILESHADERPROC) (GLuint shader);
 | |
| typedef GLuint (APIENTRY* PFNGLCREATEPROGRAMPROC) (void);
 | |
| typedef GLuint (APIENTRY* PFNGLCREATESHADERPROC) (GLenum type);
 | |
| typedef void (APIENTRY* PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
 | |
| typedef void (APIENTRY* PFNGLDELETEPROGRAMPROC) (GLuint program);
 | |
| typedef void (APIENTRY* PFNGLDELETESHADERPROC) (GLuint shader);
 | |
| typedef void (APIENTRY* PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
 | |
| typedef void (APIENTRY* PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
 | |
| typedef void (APIENTRY* PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
 | |
| typedef void (APIENTRY* PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
 | |
| typedef void (APIENTRY* PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
 | |
| typedef void (APIENTRY* PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
 | |
| typedef void (APIENTRY* PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
 | |
| typedef void (APIENTRY* PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
 | |
| typedef void (APIENTRY* PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
 | |
| typedef void (APIENTRY* PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
 | |
| typedef GLint (APIENTRY* PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
 | |
| typedef void (APIENTRY* PFNGLLINKPROGRAMPROC) (GLuint program);
 | |
| typedef void (APIENTRY* PFNGLPROVOKINGVERTEXPROC) (GLenum mode);
 | |
| typedef void (APIENTRY* PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
 | |
| typedef void (APIENTRY* PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
 | |
| typedef void (APIENTRY* PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
 | |
| typedef void (APIENTRY* PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
 | |
| typedef void (APIENTRY* PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
 | |
| typedef void (APIENTRY* PFNGLUSEPROGRAMPROC) (GLuint program);
 | |
| typedef void (APIENTRY* PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
 | |
| 
 | |
| // Pointers to functions
 | |
| // NOTE:
 | |
| //   For each glFunction we use a pointer name which is not the name of the function.
 | |
| //   This is needed in some Linux [old] drivers, which define also these function
 | |
| //   names, leading to a crash because of function vs pointer use.
 | |
| 
 | |
| #define glActiveTexture            my_glActiveTexture
 | |
| #define glAttachShader             my_glAttachShader
 | |
| #define glBindAttribLocation       my_glBindAttribLocation
 | |
| #define glBindBuffer               my_glBindBuffer
 | |
| #define glBindVertexArray          my_glBindVertexArray
 | |
| #define glBufferData               my_glBufferData
 | |
| #define glBufferSubData            my_glBufferSubData
 | |
| #define glCompileShader            my_glCompileShader
 | |
| #define glCreateProgram            my_glCreateProgram
 | |
| #define glCreateShader             my_glCreateShader
 | |
| #define glDeleteBuffers            my_glDeleteBuffers
 | |
| #define glDeleteProgram            my_glDeleteProgram
 | |
| #define glDeleteShader             my_glDeleteShader
 | |
| #define glDeleteVertexArrays       my_glDeleteVertexArrays
 | |
| #define glDetachShader             my_glDetachShader
 | |
| #define glDisableVertexAttribArray my_glDisableVertexAttribArray
 | |
| #define glEnableVertexAttribArray  my_glEnableVertexAttribArray
 | |
| #define glGenBuffers               my_glGenBuffers
 | |
| #define glGenVertexArrays          my_glGenVertexArrays
 | |
| #define glGetProgramInfoLog        my_glGetProgramInfoLog
 | |
| #define glGetProgramiv             my_glGetProgramiv
 | |
| #define glGetShaderInfoLog         my_glGetShaderInfoLog
 | |
| #define glGetShaderiv              my_glGetShaderiv
 | |
| #define glGetUniformLocation       my_glGetUniformLocation
 | |
| #define glLinkProgram              my_glLinkProgram
 | |
| #define glProvokingVertex          my_glProvokingVertex
 | |
| #define glShaderSource             my_glShaderSource
 | |
| #define glUniform1i                my_glUniform1i
 | |
| #define glUniform3fv               my_glUniform3fv
 | |
| #define glUniform4fv               my_glUniform4fv
 | |
| #define glUniformMatrix4fv         my_glUniformMatrix4fv
 | |
| #define glUseProgram               my_glUseProgram
 | |
| #define glVertexAttribPointer      my_glVertexAttribPointer
 | |
| 
 | |
| // NOTE:
 | |
| //   Windows uses different pointers for different OGLcontexts.
 | |
| //   If multi-context was used, these pointers must be used inside some
 | |
| //   structure, something like activeOGLcontext->my_glTheFunction
 | |
| 
 | |
| extern PFNGLACTIVETEXTUREPROC my_glActiveTexture;
 | |
| extern PFNGLATTACHSHADERPROC my_glAttachShader;
 | |
| extern PFNGLBINDATTRIBLOCATIONPROC my_glBindAttribLocation;
 | |
| extern PFNGLBINDBUFFERPROC my_glBindBuffer;
 | |
| extern PFNGLBINDVERTEXARRAYPROC my_glBindVertexArray;
 | |
| extern PFNGLBUFFERDATAPROC my_glBufferData;
 | |
| extern PFNGLBUFFERSUBDATAPROC my_glBufferSubData;
 | |
| extern PFNGLCOMPILESHADERPROC my_glCompileShader;
 | |
| extern PFNGLCREATEPROGRAMPROC my_glCreateProgram;
 | |
| extern PFNGLCREATESHADERPROC my_glCreateShader;
 | |
| extern PFNGLDELETEBUFFERSPROC my_glDeleteBuffers;
 | |
| extern PFNGLDELETEPROGRAMPROC my_glDeleteProgram;
 | |
| extern PFNGLDELETESHADERPROC my_glDeleteShader;
 | |
| extern PFNGLDELETEVERTEXARRAYSPROC my_glDeleteVertexArrays;
 | |
| extern PFNGLDETACHSHADERPROC my_glDetachShader;
 | |
| extern PFNGLDISABLEVERTEXATTRIBARRAYPROC my_glDisableVertexAttribArray;
 | |
| extern PFNGLENABLEVERTEXATTRIBARRAYPROC my_glEnableVertexAttribArray;
 | |
| extern PFNGLGENBUFFERSPROC my_glGenBuffers;
 | |
| extern PFNGLGENVERTEXARRAYSPROC my_glGenVertexArrays;
 | |
| extern PFNGLGETPROGRAMINFOLOGPROC my_glGetProgramInfoLog;
 | |
| extern PFNGLGETPROGRAMIVPROC my_glGetProgramiv;
 | |
| extern PFNGLGETSHADERINFOLOGPROC my_glGetShaderInfoLog;
 | |
| extern PFNGLGETSHADERIVPROC my_glGetShaderiv;
 | |
| extern PFNGLGETUNIFORMLOCATIONPROC my_glGetUniformLocation;
 | |
| extern PFNGLLINKPROGRAMPROC my_glLinkProgram;
 | |
| extern PFNGLPROVOKINGVERTEXPROC my_glProvokingVertex;
 | |
| extern PFNGLSHADERSOURCEPROC my_glShaderSource;
 | |
| extern PFNGLUNIFORM1IPROC my_glUniform1i;
 | |
| extern PFNGLUNIFORM3FVPROC my_glUniform3fv;
 | |
| extern PFNGLUNIFORM4FVPROC my_glUniform4fv;
 | |
| extern PFNGLUNIFORMMATRIX4FVPROC my_glUniformMatrix4fv;
 | |
| extern PFNGLUSEPROGRAMPROC my_glUseProgram;
 | |
| extern PFNGLVERTEXATTRIBPOINTERPROC my_glVertexAttribPointer;
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif // __APPLE__ and rest
 | |
| 
 | |
| // This is the function to use in oglstuff.cpp
 | |
| bool MyInitGLPointers();
 | |
| 
 | |
| #endif // OGLPFUNCS_H
 |