Last active
January 16, 2020 15:21
-
-
Save Daft-Freak/a99f163bf7f3b2189e648fc1cf1c678a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * Copyright 2014 The Emscripten Authors. All rights reserved. | |
| * Emscripten is available under two separate licenses, the MIT license and the | |
| * University of Illinois/NCSA Open Source License. Both these licenses can be | |
| * found in the LICENSE file. | |
| */ | |
| /* | |
| THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION | |
| AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN. | |
| THE ORIGINAL AUTHOR IS KYLE FOLEY. | |
| THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY | |
| OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF | |
| MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE, | |
| ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE | |
| RESULTING FROM THE USE, MODIFICATION, OR | |
| REDISTRIBUTION OF THIS SOFTWARE. | |
| */ | |
| #include <emscripten/emscripten.h> | |
| #include <emscripten/html5.h> | |
| #include <GL/gl.h> | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <assert.h> | |
| void* emscripten_GetProcAddress(const char *name_); | |
| // GL_ARB_shading_language_100, GL_ARB_shader_objects, GL_ARB_fragment_shader, GL_ARB_vertex_shader | |
| PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObject_ = NULL; | |
| PFNGLDELETEOBJECTARBPROC glDeleteObject_ = NULL; | |
| PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObject_ = NULL; | |
| PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObject_ = NULL; | |
| PFNGLSHADERSOURCEARBPROC glShaderSource_ = NULL; | |
| PFNGLCOMPILESHADERARBPROC glCompileShader_ = NULL; | |
| PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameteriv_ = NULL; | |
| PFNGLATTACHOBJECTARBPROC glAttachObject_ = NULL; | |
| PFNGLGETINFOLOGARBPROC glGetInfoLog_ = NULL; | |
| PFNGLLINKPROGRAMARBPROC glLinkProgram_ = NULL; | |
| PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocation_ = NULL; | |
| PFNGLUNIFORM1FARBPROC glUniform1f_ = NULL; | |
| PFNGLUNIFORM2FARBPROC glUniform2f_ = NULL; | |
| PFNGLUNIFORM3FARBPROC glUniform3f_ = NULL; | |
| PFNGLUNIFORM4FARBPROC glUniform4f_ = NULL; | |
| PFNGLUNIFORM1FVARBPROC glUniform1fv_ = NULL; | |
| PFNGLUNIFORM2FVARBPROC glUniform2fv_ = NULL; | |
| PFNGLUNIFORM3FVARBPROC glUniform3fv_ = NULL; | |
| PFNGLUNIFORM4FVARBPROC glUniform4fv_ = NULL; | |
| PFNGLUNIFORM1IARBPROC glUniform1i_ = NULL; | |
| PFNGLBINDATTRIBLOCATIONARBPROC glBindAttribLocation_ = NULL; | |
| PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniform_ = NULL; | |
| void initARB() { | |
| glCreateProgramObject_ = (PFNGLCREATEPROGRAMOBJECTARBPROC) emscripten_GetProcAddress("glCreateProgramObjectARB"); | |
| glDeleteObject_ = (PFNGLDELETEOBJECTARBPROC) emscripten_GetProcAddress("glDeleteObjectARB"); | |
| glUseProgramObject_ = (PFNGLUSEPROGRAMOBJECTARBPROC) emscripten_GetProcAddress("glUseProgramObjectARB"); | |
| glCreateShaderObject_ = (PFNGLCREATESHADEROBJECTARBPROC) emscripten_GetProcAddress("glCreateShaderObjectARB"); | |
| glShaderSource_ = (PFNGLSHADERSOURCEARBPROC) emscripten_GetProcAddress("glShaderSourceARB"); | |
| glCompileShader_ = (PFNGLCOMPILESHADERARBPROC) emscripten_GetProcAddress("glCompileShaderARB"); | |
| glGetObjectParameteriv_ = (PFNGLGETOBJECTPARAMETERIVARBPROC) emscripten_GetProcAddress("glGetObjectParameterivARB"); | |
| glAttachObject_ = (PFNGLATTACHOBJECTARBPROC) emscripten_GetProcAddress("glAttachObjectARB"); | |
| glGetInfoLog_ = (PFNGLGETINFOLOGARBPROC) emscripten_GetProcAddress("glGetInfoLogARB"); | |
| glLinkProgram_ = (PFNGLLINKPROGRAMARBPROC) emscripten_GetProcAddress("glLinkProgramARB"); | |
| glGetUniformLocation_ = (PFNGLGETUNIFORMLOCATIONARBPROC) emscripten_GetProcAddress("glGetUniformLocationARB"); | |
| glUniform1f_ = (PFNGLUNIFORM1FARBPROC) emscripten_GetProcAddress("glUniform1fARB"); | |
| glUniform2f_ = (PFNGLUNIFORM2FARBPROC) emscripten_GetProcAddress("glUniform2fARB"); | |
| glUniform3f_ = (PFNGLUNIFORM3FARBPROC) emscripten_GetProcAddress("glUniform3fARB"); | |
| glUniform4f_ = (PFNGLUNIFORM4FARBPROC) emscripten_GetProcAddress("glUniform4fARB"); | |
| glUniform1fv_ = (PFNGLUNIFORM1FVARBPROC) emscripten_GetProcAddress("glUniform1fvARB"); | |
| glUniform2fv_ = (PFNGLUNIFORM2FVARBPROC) emscripten_GetProcAddress("glUniform2fvARB"); | |
| glUniform3fv_ = (PFNGLUNIFORM3FVARBPROC) emscripten_GetProcAddress("glUniform3fvARB"); | |
| glUniform4fv_ = (PFNGLUNIFORM4FVARBPROC) emscripten_GetProcAddress("glUniform4fvARB"); | |
| glUniform1i_ = (PFNGLUNIFORM1IARBPROC) emscripten_GetProcAddress("glUniform1iARB"); | |
| glBindAttribLocation_ = (PFNGLBINDATTRIBLOCATIONARBPROC) emscripten_GetProcAddress("glBindAttribLocationARB"); | |
| glGetActiveUniform_ = (PFNGLGETACTIVEUNIFORMARBPROC) emscripten_GetProcAddress("glGetActiveUniformARB"); | |
| } | |
| void setShaders() { | |
| GLuint v, f, p; | |
| GLint ok; | |
| const char *vv = "void main() \n" | |
| "{ \n" | |
| " gl_Position = ftransform() + vec4(0.1, -0.25, 0, 0); \n" | |
| "}"; | |
| const char *ff = "void main() \n" | |
| "{ \n" | |
| " gl_FragColor = vec4(gl_FragCoord.y/480.0, gl_FragCoord.x/640.0, 0.66, 1.0); \n" | |
| "}"; | |
| v = glCreateShaderObject_(GL_VERTEX_SHADER); | |
| f = glCreateShaderObject_(GL_FRAGMENT_SHADER); | |
| glShaderSource_(v, 1, &vv,NULL); | |
| glShaderSource_(f, 1, &ff,NULL); | |
| glCompileShader_(v); | |
| glGetObjectParameteriv_(v, GL_OBJECT_COMPILE_STATUS_ARB, &ok); | |
| if (!ok) { | |
| char msg[512]; | |
| glGetInfoLog_(v, sizeof msg, NULL, msg); | |
| printf("shader compilation issue: %s\n", msg); | |
| } | |
| assert(ok); | |
| glCompileShader_(f); | |
| glGetObjectParameteriv_(f, GL_OBJECT_COMPILE_STATUS_ARB, &ok); | |
| assert(ok); | |
| p = glCreateProgramObject_(); | |
| glAttachObject_(p,f); | |
| glAttachObject_(p,v); | |
| glLinkProgram_(p); | |
| glGetObjectParameteriv_(p, GL_OBJECT_LINK_STATUS_ARB, &ok); | |
| assert(ok); | |
| glUseProgramObject_(p); | |
| } | |
| int main(int argc, char *argv[]) | |
| { | |
| emscripten_set_canvas_element_size("#canvas", 640, 480); | |
| EmscriptenWebGLContextAttributes attribs; | |
| emscripten_webgl_init_context_attributes(&attribs); | |
| EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context = emscripten_webgl_create_context("#canvas", &attribs); | |
| emscripten_webgl_make_context_current(context); | |
| glClearColor(0, 0, 0, 0); | |
| glViewport(0, 0, 640, 480); | |
| glMatrixMode(GL_PROJECTION); | |
| glLoadIdentity(); | |
| glOrtho(0, 640, 480, 0, -1, 1); | |
| glMatrixMode(GL_MODELVIEW); | |
| glLoadIdentity(); | |
| glClear(GL_COLOR_BUFFER_BIT); | |
| initARB(); | |
| setShaders(); | |
| glColor3f(0, 1, 1); // is overridden by the shader, useful for debugging native builds | |
| glBegin( GL_TRIANGLES ); | |
| glTexCoord2i(0, 0); glVertex3f( 10, 10, 0); | |
| glTexCoord2i(1, 0); glVertex3f( 300, 10, 0); | |
| glTexCoord2i(1, 1); glVertex3f( 300, 328, 0); | |
| glEnd(); | |
| glColor3f(1, 1, 0); // is overridden by the shader, useful for debugging native builds | |
| glBegin( GL_TRIANGLES ); | |
| glTexCoord2f(0, 0.5); glVertex3f(410, 10, 0); | |
| glTexCoord2f(1, 0.5); glVertex3f(600, 10, 0); | |
| glTexCoord2f(1, 1 ); glVertex3f(630, 400, 0); | |
| glEnd(); | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment