#if GL_ENABLE_GET_PROC_ADDRESS
#include <string.h>
#include <stdlib.h>
#include <emscripten.h>
#include <emscripten/html5_webgl.h>
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>
#ifdef LEGACY_GL_EMULATION
#include <webgl/webgl1_ext.h>
#include "webgl_internal_funcs.h"
#define RETURN_GL_EMU_FN(functionName) if (!strcmp(name, #functionName)) return emscripten_##functionName;
void* emscripten_legacy_gl_emulation_GetProcAddress(const char *name) {
if (!strcmp(name, "glCreateProgramObject")) return emscripten_glCreateProgram;
if (!strcmp(name, "glUseProgramObject")) return emscripten_glUseProgram;
if (!strcmp(name, "glCreateShaderObject")) return emscripten_glCreateShader;
if (!strcmp(name, "glAttachObject")) return emscripten_glAttachShader;
if (!strcmp(name, "glDetachObject")) return emscripten_glDetachShader;
RETURN_GL_EMU_FN(glDeleteObject);
RETURN_GL_EMU_FN(glGetObjectParameteriv);
RETURN_GL_EMU_FN(glGetInfoLog);
RETURN_GL_EMU_FN(glBindProgram);
RETURN_GL_EMU_FN(glGetPointerv);
RETURN_GL_EMU_FN(glBegin);
RETURN_GL_EMU_FN(glEnd);
RETURN_GL_EMU_FN(glVertex2f);
RETURN_GL_EMU_FN(glVertex2i);
RETURN_GL_EMU_FN(glVertex3f);
RETURN_GL_EMU_FN(glVertex3i);
RETURN_GL_EMU_FN(glVertex4f);
RETURN_GL_EMU_FN(glVertex4i);
RETURN_GL_EMU_FN(glVertex2fv);
RETURN_GL_EMU_FN(glVertex3fv);
RETURN_GL_EMU_FN(glVertex4fv);
RETURN_GL_EMU_FN(glColor3d);
RETURN_GL_EMU_FN(glColor3f);
RETURN_GL_EMU_FN(glColor3ub);
RETURN_GL_EMU_FN(glColor3ui);
RETURN_GL_EMU_FN(glColor3us);
RETURN_GL_EMU_FN(glColor4d);
RETURN_GL_EMU_FN(glColor4f);
RETURN_GL_EMU_FN(glColor4ub);
RETURN_GL_EMU_FN(glColor4ui);
RETURN_GL_EMU_FN(glColor4us);
RETURN_GL_EMU_FN(glColor3fv);
RETURN_GL_EMU_FN(glColor3ubv);
RETURN_GL_EMU_FN(glColor3uiv);
RETURN_GL_EMU_FN(glColor3usv);
RETURN_GL_EMU_FN(glColor4fv);
RETURN_GL_EMU_FN(glColor4ubv);
RETURN_GL_EMU_FN(glPolygonMode);
RETURN_GL_EMU_FN(glAlphaFunc);
RETURN_GL_EMU_FN(glNormal3f);
RETURN_GL_EMU_FN(glDrawRangeElements);
RETURN_GL_EMU_FN(glEnableClientState);
RETURN_GL_EMU_FN(glDisableClientState);
RETURN_GL_EMU_FN(glVertexPointer);
RETURN_GL_EMU_FN(glNormalPointer);
RETURN_GL_EMU_FN(glColorPointer);
RETURN_GL_EMU_FN(glTexCoordPointer);
RETURN_GL_EMU_FN(glClientActiveTexture);
RETURN_GL_EMU_FN(glMatrixMode);
RETURN_GL_EMU_FN(glPushMatrix);
RETURN_GL_EMU_FN(glPopMatrix);
RETURN_GL_EMU_FN(glLoadIdentity);
RETURN_GL_EMU_FN(glLoadMatrixd);
RETURN_GL_EMU_FN(glLoadMatrixf);
RETURN_GL_EMU_FN(glLoadTransposeMatrixf);
RETURN_GL_EMU_FN(glLoadTransposeMatrixd);
RETURN_GL_EMU_FN(glMultTransposeMatrixf);
RETURN_GL_EMU_FN(glMultTransposeMatrixd);
RETURN_GL_EMU_FN(glMultMatrixd);
RETURN_GL_EMU_FN(glMultMatrixf);
RETURN_GL_EMU_FN(glOrtho);
RETURN_GL_EMU_FN(glFrustum);
RETURN_GL_EMU_FN(glRotated);
RETURN_GL_EMU_FN(glRotatef);
RETURN_GL_EMU_FN(glScaled);
RETURN_GL_EMU_FN(glScalef);
RETURN_GL_EMU_FN(glTranslated);
RETURN_GL_EMU_FN(glTranslatef);
RETURN_GL_EMU_FN(glClipPlane);
RETURN_GL_EMU_FN(glDrawBuffer);
RETURN_GL_EMU_FN(glReadBuffer);
RETURN_GL_EMU_FN(glLightfv);
RETURN_GL_EMU_FN(glLightModelf);
RETURN_GL_EMU_FN(glLightModelfv);
RETURN_GL_EMU_FN(glMaterialfv);
RETURN_GL_EMU_FN(glTexGeni);
RETURN_GL_EMU_FN(glTexGenfv);
RETURN_GL_EMU_FN(glGetTexEnvfv);
RETURN_GL_EMU_FN(glGetTexEnviv);
RETURN_GL_EMU_FN(glTexImage1D);
RETURN_GL_EMU_FN(glTexCoord2f);
RETURN_GL_EMU_FN(glTexCoord2i);
RETURN_GL_EMU_FN(glTexCoord3f);
RETURN_GL_EMU_FN(glTexCoord4f);
RETURN_GL_EMU_FN(glTexCoord2fv);
RETURN_GL_EMU_FN(glGetTexLevelParameteriv);
RETURN_GL_EMU_FN(glShadeModel);
if (!strcmp(name, "glBindVertexArray")) return emscripten_glBindVertexArrayOES;
if (!strcmp(name, "glDeleteVertexArrays")) return emscripten_glDeleteVertexArraysOES;
if (!strcmp(name, "glGenVertexArrays")) return emscripten_glGenVertexArraysOES;
if (!strcmp(name, "glIsVertexArray")) return emscripten_glIsVertexArrayOES;
if (!strcmp(name, "glDrawBuffers")) return emscripten_glDrawBuffersWEBGL;
if (!strcmp(name, "glDrawArraysInstanced")) return emscripten_glDrawArraysInstancedANGLE;
if (!strcmp(name, "glDrawElementsInstanced")) return emscripten_glDrawElementsInstancedANGLE;
if (!strcmp(name, "glVertexAttribDivisor")) return emscripten_glVertexAttribDivisorANGLE;
if (!strcmp(name, "glGenQueries")) return emscripten_glGenQueriesEXT;
if (!strcmp(name, "glDeleteQueries")) return emscripten_glDeleteQueriesEXT;
if (!strcmp(name, "glIsQuery")) return emscripten_glIsQueryEXT;
if (!strcmp(name, "glBeginQuery")) return emscripten_glBeginQueryEXT;
if (!strcmp(name, "glEndQuery")) return emscripten_glEndQueryEXT;
if (!strcmp(name, "glQueryCounter")) return emscripten_glQueryCounterEXT;
if (!strcmp(name, "glGetQueryiv")) return emscripten_glGetQueryivEXT;
if (!strcmp(name, "glGetQueryObjectiv")) return emscripten_glGetQueryObjectivEXT;
if (!strcmp(name, "glGetQueryObjectuiv")) return emscripten_glGetQueryObjectuivEXT;
if (!strcmp(name, "glGetQueryObjecti64v")) return emscripten_glGetQueryObjecti64vEXT;
if (!strcmp(name, "glGetQueryObjectui64v")) return emscripten_glGetQueryObjectui64vEXT;
return 0;
}
#endif
void *_webgl1_match_ext_proc_address_without_suffix(const char *name);
void *_webgl2_match_ext_proc_address_without_suffix(const char *name);
void* emscripten_GetProcAddress(const char *name_) {
char *name = malloc(strlen(name_)+1);
strcpy(name, name_);
char *end = strstr(name, "EXT");
if (end) *end = 0;
end = strstr(name, "ARB");
if (end) *end = 0;
end = strstr(name, "OES");
if (end) *end = 0;
end = strstr(name, "ANGLE");
if (end) *end = 0;
end = strstr(name, "WEBGL");
if (end) *end = 0;
void *ptr = emscripten_webgl1_get_proc_address(name);
if (!ptr) ptr = _webgl1_match_ext_proc_address_without_suffix(name);
#if LEGACY_GL_EMULATION
if (!ptr) ptr = emscripten_legacy_gl_emulation_GetProcAddress(name);
#endif
#if MAX_WEBGL_VERSION >= 2
if (!ptr) ptr = emscripten_webgl2_get_proc_address(name);
if (!ptr) ptr = _webgl2_match_ext_proc_address_without_suffix(name);
#endif
free(name);
return ptr;
}
extern void *emscripten_webgl_get_proc_address(const char *name)
{
void *ptr = emscripten_webgl1_get_proc_address(name);
#if MAX_WEBGL_VERSION >= 2
if (!ptr) ptr = emscripten_webgl2_get_proc_address(name);
#endif
return ptr;
}
#endif