├── .gitignore ├── README.md ├── dev └── cpp │ ├── Context.cpp │ ├── Context.h │ ├── emscripten.cpp │ └── html5.h ├── dist ├── appWASM.js └── appWASM.wasm ├── gruntfile.js ├── image.png ├── image2.jpg ├── index.html ├── package-lock.json ├── package.json ├── server.js └── wasm-arrays.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WebAssembly WebGL Shaders 2 | 3 | Example project for using WebGL shaders in a WebAssembly program. 4 | 5 | --- 6 | ## Article link 7 | https://medium.freecodecamp.org/how-to-use-webgl-shaders-in-webassembly-1e6c5effc813 8 | 9 | --- 10 | 11 | Run ```npm install```, for dependencies, ```node server``` to serve files, and ```grunt``` for compiling changes. 12 | 13 | To compile: 14 | 15 | `emcc -o ./dist/appWASM.js ./dev/cpp/emscripten.cpp -O3 -s ALLOW_MEMORY_GROWTH=1 -s USE_WEBGL2=1 -s FULL_ES3=1 -s WASM=1 -s NO_EXIT_RUNTIME=1 -std=c++1z -s EXTRA_EXPORTED_RUNTIME_METHODS="['ccall','stringToUTF8']" -s ASSERTIONS=1` 16 | 17 | or compile with DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=0 ([Thank you veslam](https://github.com/DanRuta/webassembly-webgl-shaders/pull/2)) 18 | -------------------------------------------------------------------------------- /dev/cpp/Context.cpp: -------------------------------------------------------------------------------- 1 | #include "Context.h" 2 | 3 | // Shaders 4 | std::string vertex_source = 5 | "attribute vec4 position; \n" 6 | "attribute vec2 texCoord; \n" 7 | "varying vec2 v_texCoord; \n" 8 | "void main() \n" 9 | "{ \n" 10 | " gl_Position = position; \n" 11 | " v_texCoord = texCoord; \n" 12 | "} \n"; 13 | 14 | std::string texture_load_fragment_source = 15 | "precision mediump float; \n" 16 | "varying vec2 v_texCoord; \n" 17 | "uniform sampler2D texture; \n" 18 | "void main() \n" 19 | "{ \n" 20 | " gl_FragColor = texture2D( texture, v_texCoord ); \n" 21 | "} \n"; 22 | 23 | 24 | std::string edge_detect_fragment_source = 25 | "precision mediump float; \n" 26 | "varying vec2 v_texCoord; \n" 27 | "uniform sampler2D texture; \n" 28 | "uniform float width; \n" 29 | "uniform float height; \n" 30 | "void main() \n" 31 | "{ \n" 32 | " vec4 pixel = texture2D(texture, v_texCoord); \n" 33 | " vec4 n[9];\n" 34 | 35 | " float w = 1.0 / width;\n" 36 | " float h = 1.0 / height;\n" 37 | 38 | " n[0] = texture2D(texture, v_texCoord + vec2(0.0, 0.0) );\n" 39 | " n[1] = texture2D(texture, v_texCoord + vec2(w, 0.0) );\n" 40 | " n[2] = texture2D(texture, v_texCoord + vec2(2.0*w, 0.0) );\n" 41 | " n[3] = texture2D(texture, v_texCoord + vec2(0.0*w, h) );\n" 42 | " n[4] = texture2D(texture, v_texCoord + vec2(w, h) );\n" 43 | " n[5] = texture2D(texture, v_texCoord + vec2(2.0*w, h) );\n" 44 | " n[6] = texture2D(texture, v_texCoord + vec2(0.0, 2.0*h) );\n" 45 | " n[7] = texture2D(texture, v_texCoord + vec2(w, 2.0*h) );\n" 46 | " n[8] = texture2D(texture, v_texCoord + vec2(2.0*w, 2.0*h) );\n" 47 | 48 | " vec4 sobel_x = n[2] + (2.0*n[5]) + n[8] - (n[0] + (2.0*n[3]) + n[6]);\n" 49 | " vec4 sobel_y = n[0] + (2.0*n[1]) + n[2] - (n[6] + (2.0*n[7]) + n[8]);\n" 50 | 51 | " float avg_x = (sobel_x.r + sobel_x.g + sobel_x.b) / 3.0;\n" 52 | " float avg_y = (sobel_y.r + sobel_y.g + sobel_y.b) / 3.0;\n" 53 | 54 | " sobel_x.r = avg_x;\n" 55 | " sobel_x.g = avg_x;\n" 56 | " sobel_x.b = avg_x;\n" 57 | " sobel_y.r = avg_y;\n" 58 | " sobel_y.g = avg_y;\n" 59 | " sobel_y.b = avg_y;\n" 60 | 61 | " vec3 sobel = vec3(sqrt((sobel_x.rgb * sobel_x.rgb) + (sobel_y.rgb * sobel_y.rgb)));\n" 62 | " gl_FragColor = vec4( sobel, 1.0 ); \n" 63 | "} \n"; 64 | 65 | 66 | 67 | GLuint CompileShader (GLenum type, std::string *source) { 68 | 69 | // Create shader object 70 | const GLchar* sourceString[1]; 71 | GLint sourceStringLengths[1]; 72 | 73 | sourceString[0] = source->c_str(); 74 | sourceStringLengths[0] = source->length(); 75 | GLuint shader = glCreateShader(type); 76 | 77 | if (shader == 0) { 78 | return 0; 79 | } 80 | 81 | // Assign and compile the source to the shader object 82 | glShaderSource(shader, 1, sourceString, sourceStringLengths); 83 | glCompileShader(shader); 84 | 85 | // Check if there were errors 86 | int infoLen = 0; 87 | glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &infoLen ); 88 | 89 | if (infoLen > 1) { 90 | 91 | char infoLog[infoLen]; 92 | 93 | // And print them out 94 | glGetShaderInfoLog( shader, infoLen, NULL, infoLog ); 95 | printf("%s\n", infoLog); 96 | 97 | free ( infoLog ); 98 | } 99 | 100 | return shader; 101 | } 102 | 103 | 104 | Context::Context (int w, int h, char * id) { 105 | 106 | width = w; 107 | height = h; 108 | 109 | // Context configurations 110 | EmscriptenWebGLContextAttributes attrs; 111 | attrs.explicitSwapControl = 0; 112 | attrs.depth = 1; 113 | attrs.stencil = 1; 114 | attrs.antialias = 1; 115 | attrs.majorVersion = 2; 116 | attrs.minorVersion = 0; 117 | 118 | std::string id_str = id; 119 | std::string sharp_id_str = "#" + id_str; 120 | 121 | context = emscripten_webgl_create_context(sharp_id_str.c_str(), &attrs); 122 | emscripten_webgl_make_context_current(context); 123 | 124 | // Compile shaders 125 | if (std::string(id) == "textureLoad") { 126 | fragmentShader = CompileShader(GL_FRAGMENT_SHADER, &texture_load_fragment_source); 127 | vertexShader = CompileShader(GL_VERTEX_SHADER, &vertex_source); 128 | 129 | } else if (std::string(id) == "edgeDetect") { 130 | fragmentShader = CompileShader(GL_FRAGMENT_SHADER, &edge_detect_fragment_source); 131 | vertexShader = CompileShader(GL_VERTEX_SHADER, &vertex_source); 132 | } 133 | 134 | // Build program 135 | programObject = glCreateProgram(); 136 | 137 | glAttachShader(programObject, vertexShader); 138 | glAttachShader(programObject, fragmentShader); 139 | 140 | glBindAttribLocation(programObject, 0, "position"); 141 | 142 | glLinkProgram(programObject); 143 | glValidateProgram(programObject); 144 | } 145 | 146 | Context::~Context (void) { 147 | emscripten_webgl_destroy_context(context); 148 | } 149 | 150 | 151 | void Context::run (uint8_t* buffer) { 152 | 153 | // Make the context current and use the program 154 | emscripten_webgl_make_context_current(context); 155 | glUseProgram( programObject ); 156 | 157 | GLuint texId; 158 | GLuint vertexObject; 159 | GLuint indexObject; 160 | 161 | // Get the attribute/sampler locations 162 | GLint positionLoc = glGetAttribLocation(programObject, "position"); 163 | GLint texCoordLoc = glGetAttribLocation(programObject, "texCoord"); 164 | GLint textureLoc = glGetUniformLocation(programObject, "texture"); 165 | 166 | // For "ERROR :GL_INVALID_OPERATION : glUniform1i: wrong uniform function for type" 167 | // https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glUniform.xhtml 168 | float widthUniform = glGetUniformLocation(programObject, "width"); 169 | float heightUniform = glGetUniformLocation(programObject, "height"); 170 | glUniform1f(widthUniform, (float) width); 171 | glUniform1f(heightUniform, (float) height); 172 | 173 | 174 | // Generate a texture object 175 | glGenTextures(1, &texId); 176 | glUniform1i(textureLoc, 0); 177 | 178 | // Bind it 179 | glActiveTexture(GL_TEXTURE0); 180 | glBindTexture(GL_TEXTURE_2D, texId); 181 | 182 | // Load the texture from the image buffer 183 | glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 184 | glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 185 | glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 186 | 187 | // Vertex data of texture bounds 188 | GLfloat vVertices[] = { -1.0, 1.0, 0.0, 0.0, 0.0, -1.0, -1.0, 0.0, 0.0, 1.0, 189 | 1.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0}; 190 | GLushort indices[] = { 0, 1, 2, 0, 2, 3 }; 191 | 192 | glGenBuffers(1, &vertexObject); 193 | glBindBuffer(GL_ARRAY_BUFFER, vertexObject); 194 | glBufferData(GL_ARRAY_BUFFER, sizeof(vVertices), vVertices, GL_STATIC_DRAW); 195 | 196 | glGenBuffers(1, &indexObject); 197 | glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexObject); 198 | glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); 199 | 200 | // Set the viewport 201 | glViewport(0, 0, width, height); 202 | glClear(GL_COLOR_BUFFER_BIT); 203 | 204 | // Load and enable the vertex position and texture coordinates 205 | glVertexAttribPointer(positionLoc, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), 0); 206 | glVertexAttribPointer(texCoordLoc, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*) (3 * sizeof(GLfloat))); 207 | 208 | glEnableVertexAttribArray(positionLoc); 209 | glEnableVertexAttribArray(texCoordLoc); 210 | 211 | // Draw 212 | glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 213 | } 214 | -------------------------------------------------------------------------------- /dev/cpp/Context.h: -------------------------------------------------------------------------------- 1 | 2 | 3 | class Context { 4 | public: 5 | Context (int width, int height, char * id); 6 | 7 | ~Context (void); 8 | 9 | void run (uint8_t* buffer); 10 | 11 | private: 12 | int width; 13 | int height; 14 | 15 | GLuint programObject; 16 | GLuint vertexShader; 17 | GLuint fragmentShader; 18 | 19 | EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context; 20 | 21 | }; -------------------------------------------------------------------------------- /dev/cpp/emscripten.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | extern "C" { 6 | #include "html5.h" 7 | } 8 | #include "Context.cpp" 9 | 10 | Context* contexts[2]; 11 | 12 | int main(int argc, char const *argv[]) { 13 | printf("[WASM] Loaded\n"); 14 | 15 | EM_ASM( 16 | if (typeof window!="undefined") { 17 | window.dispatchEvent(new CustomEvent("wasmLoaded")) 18 | } else { 19 | global.onWASMLoaded && global.onWASMLoaded() 20 | } 21 | ); 22 | 23 | return 0; 24 | } 25 | 26 | 27 | extern "C" { 28 | 29 | EMSCRIPTEN_KEEPALIVE 30 | void clearContexts (void) { 31 | if (contexts[0]) delete contexts[0]; 32 | if (contexts[1]) delete contexts[1]; 33 | } 34 | 35 | EMSCRIPTEN_KEEPALIVE 36 | void createContext (int width, int height, char * id, int index) { 37 | contexts[index] = new Context(width, height, id); 38 | free(id); 39 | } 40 | 41 | EMSCRIPTEN_KEEPALIVE 42 | void loadTexture (uint8_t *buf, int bufSize) { 43 | printf("[WASM] Loading Texture \n"); 44 | 45 | contexts[0]->run(buf); 46 | free(buf); 47 | } 48 | 49 | EMSCRIPTEN_KEEPALIVE 50 | void detectEdges (uint8_t *buf, int bufSize) { 51 | printf("[WASM] Detecting edges \n"); 52 | 53 | contexts[1]->run(buf); 54 | free(buf); 55 | } 56 | 57 | } -------------------------------------------------------------------------------- /dev/cpp/html5.h: -------------------------------------------------------------------------------- 1 | // #ifndef __emscripten_events_h__ 2 | // #define __emscripten_events_h__ 3 | 4 | // #ifdef __cplusplus 5 | // extern "C" { 6 | // #endif 7 | 8 | /* This file defines Emscripten low-level glue bindings for interfacing with HTML5 APIs 9 | * 10 | * Documentation for the public APIs defined in this file must be updated in: 11 | * site/source/docs/api_reference/html5.h.rst 12 | * A prebuilt local version of the documentation is available at: 13 | * site/build/text/docs/api_reference/html5.h.txt 14 | * You can also build docs locally as HTML or other formats in site/ 15 | * An online HTML version (which may be of a different version of Emscripten) 16 | * is up at http://kripken.github.io/emscripten-site/docs/api_reference/html5.h.html 17 | */ 18 | 19 | #define EMSCRIPTEN_EVENT_KEYPRESS 1 20 | #define EMSCRIPTEN_EVENT_KEYDOWN 2 21 | #define EMSCRIPTEN_EVENT_KEYUP 3 22 | #define EMSCRIPTEN_EVENT_CLICK 4 23 | #define EMSCRIPTEN_EVENT_MOUSEDOWN 5 24 | #define EMSCRIPTEN_EVENT_MOUSEUP 6 25 | #define EMSCRIPTEN_EVENT_DBLCLICK 7 26 | #define EMSCRIPTEN_EVENT_MOUSEMOVE 8 27 | #define EMSCRIPTEN_EVENT_WHEEL 9 28 | #define EMSCRIPTEN_EVENT_RESIZE 10 29 | #define EMSCRIPTEN_EVENT_SCROLL 11 30 | #define EMSCRIPTEN_EVENT_BLUR 12 31 | #define EMSCRIPTEN_EVENT_FOCUS 13 32 | #define EMSCRIPTEN_EVENT_FOCUSIN 14 33 | #define EMSCRIPTEN_EVENT_FOCUSOUT 15 34 | #define EMSCRIPTEN_EVENT_DEVICEORIENTATION 16 35 | #define EMSCRIPTEN_EVENT_DEVICEMOTION 17 36 | #define EMSCRIPTEN_EVENT_ORIENTATIONCHANGE 18 37 | #define EMSCRIPTEN_EVENT_FULLSCREENCHANGE 19 38 | #define EMSCRIPTEN_EVENT_POINTERLOCKCHANGE 20 39 | #define EMSCRIPTEN_EVENT_VISIBILITYCHANGE 21 40 | #define EMSCRIPTEN_EVENT_TOUCHSTART 22 41 | #define EMSCRIPTEN_EVENT_TOUCHEND 23 42 | #define EMSCRIPTEN_EVENT_TOUCHMOVE 24 43 | #define EMSCRIPTEN_EVENT_TOUCHCANCEL 25 44 | #define EMSCRIPTEN_EVENT_GAMEPADCONNECTED 26 45 | #define EMSCRIPTEN_EVENT_GAMEPADDISCONNECTED 27 46 | #define EMSCRIPTEN_EVENT_BEFOREUNLOAD 28 47 | #define EMSCRIPTEN_EVENT_BATTERYCHARGINGCHANGE 29 48 | #define EMSCRIPTEN_EVENT_BATTERYLEVELCHANGE 30 49 | #define EMSCRIPTEN_EVENT_WEBGLCONTEXTLOST 31 50 | #define EMSCRIPTEN_EVENT_WEBGLCONTEXTRESTORED 32 51 | #define EMSCRIPTEN_EVENT_MOUSEENTER 33 52 | #define EMSCRIPTEN_EVENT_MOUSELEAVE 34 53 | #define EMSCRIPTEN_EVENT_MOUSEOVER 35 54 | #define EMSCRIPTEN_EVENT_MOUSEOUT 36 55 | #define EMSCRIPTEN_EVENT_CANVASRESIZED 37 56 | #define EMSCRIPTEN_EVENT_POINTERLOCKERROR 38 57 | 58 | #define EMSCRIPTEN_RESULT int 59 | 60 | 61 | #define EMSCRIPTEN_RESULT_SUCCESS 0 62 | #define EMSCRIPTEN_RESULT_DEFERRED 1 63 | #define EMSCRIPTEN_RESULT_NOT_SUPPORTED -1 64 | #define EMSCRIPTEN_RESULT_FAILED_NOT_DEFERRED -2 65 | #define EMSCRIPTEN_RESULT_INVALID_TARGET -3 66 | #define EMSCRIPTEN_RESULT_UNKNOWN_TARGET -4 67 | #define EMSCRIPTEN_RESULT_INVALID_PARAM -5 68 | #define EMSCRIPTEN_RESULT_FAILED -6 69 | #define EMSCRIPTEN_RESULT_NO_DATA -7 70 | #define EMSCRIPTEN_RESULT_TIMED_OUT -8 71 | 72 | #define EM_BOOL int 73 | #define EM_TRUE 1 74 | #define EM_FALSE 0 75 | #define EM_UTF8 char 76 | 77 | #define DOM_KEY_LOCATION int 78 | #define DOM_KEY_LOCATION_STANDARD 0x00 79 | #define DOM_KEY_LOCATION_LEFT 0x01 80 | #define DOM_KEY_LOCATION_RIGHT 0x02 81 | #define DOM_KEY_LOCATION_NUMPAD 0x03 82 | 83 | #define EM_HTML5_SHORT_STRING_LEN_BYTES 32 84 | #define EM_HTML5_MEDIUM_STRING_LEN_BYTES 64 85 | #define EM_HTML5_LONG_STRING_LEN_BYTES 128 86 | 87 | typedef struct EmscriptenKeyboardEvent { 88 | EM_UTF8 key[EM_HTML5_SHORT_STRING_LEN_BYTES]; 89 | EM_UTF8 code[EM_HTML5_SHORT_STRING_LEN_BYTES]; 90 | unsigned long location; 91 | EM_BOOL ctrlKey; 92 | EM_BOOL shiftKey; 93 | EM_BOOL altKey; 94 | EM_BOOL metaKey; 95 | EM_BOOL repeat; 96 | EM_UTF8 locale[EM_HTML5_SHORT_STRING_LEN_BYTES]; 97 | EM_UTF8 charValue[EM_HTML5_SHORT_STRING_LEN_BYTES]; 98 | unsigned long charCode; 99 | unsigned long keyCode; 100 | unsigned long which; 101 | } EmscriptenKeyboardEvent; 102 | 103 | 104 | typedef EM_BOOL (*em_key_callback_func)(int eventType, const EmscriptenKeyboardEvent *keyEvent, void *userData); 105 | extern EMSCRIPTEN_RESULT emscripten_set_keypress_callback(const char *target, void *userData, EM_BOOL useCapture, em_key_callback_func callback); 106 | extern EMSCRIPTEN_RESULT emscripten_set_keydown_callback(const char *target, void *userData, EM_BOOL useCapture, em_key_callback_func callback); 107 | extern EMSCRIPTEN_RESULT emscripten_set_keyup_callback(const char *target, void *userData, EM_BOOL useCapture, em_key_callback_func callback); 108 | 109 | 110 | typedef struct EmscriptenMouseEvent { 111 | double timestamp; 112 | long screenX; 113 | long screenY; 114 | long clientX; 115 | long clientY; 116 | EM_BOOL ctrlKey; 117 | EM_BOOL shiftKey; 118 | EM_BOOL altKey; 119 | EM_BOOL metaKey; 120 | unsigned short button; 121 | unsigned short buttons; 122 | long movementX; 123 | long movementY; 124 | long targetX; 125 | long targetY; 126 | long canvasX; 127 | long canvasY; 128 | long padding; 129 | } EmscriptenMouseEvent; 130 | 131 | 132 | typedef EM_BOOL (*em_mouse_callback_func)(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData); 133 | extern EMSCRIPTEN_RESULT emscripten_set_click_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); 134 | extern EMSCRIPTEN_RESULT emscripten_set_mousedown_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); 135 | extern EMSCRIPTEN_RESULT emscripten_set_mouseup_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); 136 | extern EMSCRIPTEN_RESULT emscripten_set_dblclick_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); 137 | extern EMSCRIPTEN_RESULT emscripten_set_mousemove_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); 138 | extern EMSCRIPTEN_RESULT emscripten_set_mouseenter_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); 139 | extern EMSCRIPTEN_RESULT emscripten_set_mouseleave_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); 140 | extern EMSCRIPTEN_RESULT emscripten_set_mouseover_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); 141 | extern EMSCRIPTEN_RESULT emscripten_set_mouseout_callback(const char *target, void *userData, EM_BOOL useCapture, em_mouse_callback_func callback); 142 | 143 | extern EMSCRIPTEN_RESULT emscripten_get_mouse_status(EmscriptenMouseEvent *mouseState); 144 | 145 | #define DOM_DELTA_PIXEL 0x00 146 | #define DOM_DELTA_LINE 0x01 147 | #define DOM_DELTA_PAGE 0x02 148 | 149 | typedef struct EmscriptenWheelEvent { 150 | EmscriptenMouseEvent mouse; 151 | double deltaX; 152 | double deltaY; 153 | double deltaZ; 154 | unsigned long deltaMode; 155 | } EmscriptenWheelEvent; 156 | 157 | 158 | typedef EM_BOOL (*em_wheel_callback_func)(int eventType, const EmscriptenWheelEvent *wheelEvent, void *userData); 159 | extern EMSCRIPTEN_RESULT emscripten_set_wheel_callback(const char *target, void *userData, EM_BOOL useCapture, em_wheel_callback_func callback); 160 | 161 | typedef struct EmscriptenUiEvent { 162 | long detail; 163 | int documentBodyClientWidth; 164 | int documentBodyClientHeight; 165 | int windowInnerWidth; 166 | int windowInnerHeight; 167 | int windowOuterWidth; 168 | int windowOuterHeight; 169 | int scrollTop; 170 | int scrollLeft; 171 | } EmscriptenUiEvent; 172 | 173 | 174 | typedef EM_BOOL (*em_ui_callback_func)(int eventType, const EmscriptenUiEvent *uiEvent, void *userData); 175 | extern EMSCRIPTEN_RESULT emscripten_set_resize_callback(const char *target, void *userData, EM_BOOL useCapture, em_ui_callback_func callback); 176 | extern EMSCRIPTEN_RESULT emscripten_set_scroll_callback(const char *target, void *userData, EM_BOOL useCapture, em_ui_callback_func callback); 177 | 178 | typedef struct EmscriptenFocusEvent { 179 | EM_UTF8 nodeName[EM_HTML5_LONG_STRING_LEN_BYTES]; 180 | EM_UTF8 id[EM_HTML5_LONG_STRING_LEN_BYTES]; 181 | } EmscriptenFocusEvent; 182 | 183 | typedef EM_BOOL (*em_focus_callback_func)(int eventType, const EmscriptenFocusEvent *focusEvent, void *userData); 184 | extern EMSCRIPTEN_RESULT emscripten_set_blur_callback(const char *target, void *userData, EM_BOOL useCapture, em_focus_callback_func callback); 185 | extern EMSCRIPTEN_RESULT emscripten_set_focus_callback(const char *target, void *userData, EM_BOOL useCapture, em_focus_callback_func callback); 186 | extern EMSCRIPTEN_RESULT emscripten_set_focusin_callback(const char *target, void *userData, EM_BOOL useCapture, em_focus_callback_func callback); 187 | extern EMSCRIPTEN_RESULT emscripten_set_focusout_callback(const char *target, void *userData, EM_BOOL useCapture, em_focus_callback_func callback); 188 | 189 | typedef struct EmscriptenDeviceOrientationEvent { 190 | double timestamp; 191 | double alpha; 192 | double beta; 193 | double gamma; 194 | EM_BOOL absolute; 195 | } EmscriptenDeviceOrientationEvent; 196 | 197 | 198 | typedef EM_BOOL (*em_deviceorientation_callback_func)(int eventType, const EmscriptenDeviceOrientationEvent *deviceOrientationEvent, void *userData); 199 | extern EMSCRIPTEN_RESULT emscripten_set_deviceorientation_callback(void *userData, EM_BOOL useCapture, em_deviceorientation_callback_func callback); 200 | extern EMSCRIPTEN_RESULT emscripten_get_deviceorientation_status(EmscriptenDeviceOrientationEvent *orientationState); 201 | 202 | 203 | typedef struct EmscriptenDeviceMotionEvent { 204 | double timestamp; 205 | double accelerationX; 206 | double accelerationY; 207 | double accelerationZ; 208 | double accelerationIncludingGravityX; 209 | double accelerationIncludingGravityY; 210 | double accelerationIncludingGravityZ; 211 | double rotationRateAlpha; 212 | double rotationRateBeta; 213 | double rotationRateGamma; 214 | } EmscriptenDeviceMotionEvent; 215 | 216 | 217 | typedef EM_BOOL (*em_devicemotion_callback_func)(int eventType, const EmscriptenDeviceMotionEvent *deviceMotionEvent, void *userData); 218 | extern EMSCRIPTEN_RESULT emscripten_set_devicemotion_callback(void *userData, EM_BOOL useCapture, em_devicemotion_callback_func callback); 219 | extern EMSCRIPTEN_RESULT emscripten_get_devicemotion_status(EmscriptenDeviceMotionEvent *motionState); 220 | 221 | #define EMSCRIPTEN_ORIENTATION_PORTRAIT_PRIMARY 1 222 | #define EMSCRIPTEN_ORIENTATION_PORTRAIT_SECONDARY 2 223 | #define EMSCRIPTEN_ORIENTATION_LANDSCAPE_PRIMARY 4 224 | #define EMSCRIPTEN_ORIENTATION_LANDSCAPE_SECONDARY 8 225 | 226 | typedef struct EmscriptenOrientationChangeEvent { 227 | int orientationIndex; 228 | int orientationAngle; 229 | } EmscriptenOrientationChangeEvent; 230 | 231 | 232 | typedef EM_BOOL (*em_orientationchange_callback_func)(int eventType, const EmscriptenOrientationChangeEvent *orientationChangeEvent, void *userData); 233 | extern EMSCRIPTEN_RESULT emscripten_set_orientationchange_callback(void *userData, EM_BOOL useCapture, em_orientationchange_callback_func callback); 234 | extern EMSCRIPTEN_RESULT emscripten_get_orientation_status(EmscriptenOrientationChangeEvent *orientationStatus); 235 | extern EMSCRIPTEN_RESULT emscripten_lock_orientation(int allowedOrientations); 236 | extern EMSCRIPTEN_RESULT emscripten_unlock_orientation(void); 237 | 238 | typedef struct EmscriptenFullscreenChangeEvent { 239 | EM_BOOL isFullscreen; 240 | EM_BOOL fullscreenEnabled; 241 | EM_UTF8 nodeName[EM_HTML5_LONG_STRING_LEN_BYTES]; 242 | EM_UTF8 id[EM_HTML5_LONG_STRING_LEN_BYTES]; 243 | int elementWidth; 244 | int elementHeight; 245 | int screenWidth; 246 | int screenHeight; 247 | } EmscriptenFullscreenChangeEvent; 248 | 249 | 250 | typedef EM_BOOL (*em_fullscreenchange_callback_func)(int eventType, const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent, void *userData); 251 | extern EMSCRIPTEN_RESULT emscripten_set_fullscreenchange_callback(const char *target, void *userData, EM_BOOL useCapture, em_fullscreenchange_callback_func callback); 252 | 253 | extern EMSCRIPTEN_RESULT emscripten_get_fullscreen_status(EmscriptenFullscreenChangeEvent *fullscreenStatus); 254 | 255 | #define EMSCRIPTEN_FULLSCREEN_SCALE int 256 | #define EMSCRIPTEN_FULLSCREEN_SCALE_DEFAULT 0 257 | #define EMSCRIPTEN_FULLSCREEN_SCALE_STRETCH 1 258 | #define EMSCRIPTEN_FULLSCREEN_SCALE_ASPECT 2 259 | #define EMSCRIPTEN_FULLSCREEN_SCALE_CENTER 3 260 | 261 | #define EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE int 262 | #define EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE 0 263 | #define EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_STDDEF 1 264 | #define EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_HIDEF 2 265 | 266 | #define EMSCRIPTEN_FULLSCREEN_FILTERING int 267 | #define EMSCRIPTEN_FULLSCREEN_FILTERING_DEFAULT 0 268 | #define EMSCRIPTEN_FULLSCREEN_FILTERING_NEAREST 1 269 | #define EMSCRIPTEN_FULLSCREEN_FILTERING_BILINEAR 2 270 | 271 | typedef EM_BOOL (*em_canvasresized_callback_func)(int eventType, const void *reserved, void *userData); 272 | 273 | typedef struct EmscriptenFullscreenStrategy { 274 | EMSCRIPTEN_FULLSCREEN_SCALE scaleMode; 275 | EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE canvasResolutionScaleMode; 276 | EMSCRIPTEN_FULLSCREEN_FILTERING filteringMode; 277 | em_canvasresized_callback_func canvasResizedCallback; 278 | void *canvasResizedCallbackUserData; 279 | } EmscriptenFullscreenStrategy; 280 | 281 | extern EMSCRIPTEN_RESULT emscripten_request_fullscreen(const char *target, EM_BOOL deferUntilInEventHandler); 282 | extern EMSCRIPTEN_RESULT emscripten_request_fullscreen_strategy(const char *target, EM_BOOL deferUntilInEventHandler, const EmscriptenFullscreenStrategy *fullscreenStrategy); 283 | 284 | extern EMSCRIPTEN_RESULT emscripten_exit_fullscreen(void); 285 | 286 | extern EMSCRIPTEN_RESULT emscripten_enter_soft_fullscreen(const char *target, const EmscriptenFullscreenStrategy *fullscreenStrategy); 287 | 288 | extern EMSCRIPTEN_RESULT emscripten_exit_soft_fullscreen(void); 289 | 290 | typedef struct EmscriptenPointerlockChangeEvent { 291 | EM_BOOL isActive; 292 | EM_UTF8 nodeName[EM_HTML5_LONG_STRING_LEN_BYTES]; 293 | EM_UTF8 id[EM_HTML5_LONG_STRING_LEN_BYTES]; 294 | } EmscriptenPointerlockChangeEvent; 295 | 296 | 297 | typedef EM_BOOL (*em_pointerlockchange_callback_func)(int eventType, const EmscriptenPointerlockChangeEvent *pointerlockChangeEvent, void *userData); 298 | extern EMSCRIPTEN_RESULT emscripten_set_pointerlockchange_callback(const char *target, void *userData, EM_BOOL useCapture, em_pointerlockchange_callback_func callback); 299 | 300 | typedef EM_BOOL (*em_pointerlockerror_callback_func)(int eventType, const void *reserved, void *userData); 301 | extern EMSCRIPTEN_RESULT emscripten_set_pointerlockerror_callback(const char *target, void *userData, EM_BOOL useCapture, em_pointerlockerror_callback_func callback); 302 | 303 | extern EMSCRIPTEN_RESULT emscripten_get_pointerlock_status(EmscriptenPointerlockChangeEvent *pointerlockStatus); 304 | 305 | extern EMSCRIPTEN_RESULT emscripten_request_pointerlock(const char *target, EM_BOOL deferUntilInEventHandler); 306 | 307 | extern EMSCRIPTEN_RESULT emscripten_exit_pointerlock(void); 308 | 309 | #define EMSCRIPTEN_VISIBILITY_HIDDEN 0 310 | #define EMSCRIPTEN_VISIBILITY_VISIBLE 1 311 | #define EMSCRIPTEN_VISIBILITY_PRERENDER 2 312 | #define EMSCRIPTEN_VISIBILITY_UNLOADED 3 313 | 314 | typedef struct EmscriptenVisibilityChangeEvent { 315 | EM_BOOL hidden; 316 | int visibilityState; 317 | } EmscriptenVisibilityChangeEvent; 318 | 319 | typedef EM_BOOL (*em_visibilitychange_callback_func)(int eventType, const EmscriptenVisibilityChangeEvent *visibilityChangeEvent, void *userData); 320 | extern EMSCRIPTEN_RESULT emscripten_set_visibilitychange_callback(void *userData, EM_BOOL useCapture, em_visibilitychange_callback_func callback); 321 | 322 | extern EMSCRIPTEN_RESULT emscripten_get_visibility_status(EmscriptenVisibilityChangeEvent *visibilityStatus); 323 | 324 | 325 | typedef struct EmscriptenTouchPoint 326 | { 327 | long identifier; 328 | long screenX; 329 | long screenY; 330 | long clientX; 331 | long clientY; 332 | long pageX; 333 | long pageY; 334 | EM_BOOL isChanged; 335 | EM_BOOL onTarget; 336 | long targetX; 337 | long targetY; 338 | long canvasX; 339 | long canvasY; 340 | } EmscriptenTouchPoint; 341 | 342 | typedef struct EmscriptenTouchEvent { 343 | int numTouches; 344 | EM_BOOL ctrlKey; 345 | EM_BOOL shiftKey; 346 | EM_BOOL altKey; 347 | EM_BOOL metaKey; 348 | EmscriptenTouchPoint touches[32]; 349 | } EmscriptenTouchEvent; 350 | 351 | 352 | typedef EM_BOOL (*em_touch_callback_func)(int eventType, const EmscriptenTouchEvent *touchEvent, void *userData); 353 | extern EMSCRIPTEN_RESULT emscripten_set_touchstart_callback(const char *target, void *userData, EM_BOOL useCapture, em_touch_callback_func callback); 354 | extern EMSCRIPTEN_RESULT emscripten_set_touchend_callback(const char *target, void *userData, EM_BOOL useCapture, em_touch_callback_func callback); 355 | extern EMSCRIPTEN_RESULT emscripten_set_touchmove_callback(const char *target, void *userData, EM_BOOL useCapture, em_touch_callback_func callback); 356 | extern EMSCRIPTEN_RESULT emscripten_set_touchcancel_callback(const char *target, void *userData, EM_BOOL useCapture, em_touch_callback_func callback); 357 | 358 | 359 | typedef struct EmscriptenGamepadEvent { 360 | double timestamp; 361 | int numAxes; 362 | int numButtons; 363 | double axis[64]; 364 | double analogButton[64]; 365 | EM_BOOL digitalButton[64]; 366 | EM_BOOL connected; 367 | long index; 368 | EM_UTF8 id[EM_HTML5_MEDIUM_STRING_LEN_BYTES]; 369 | EM_UTF8 mapping[EM_HTML5_MEDIUM_STRING_LEN_BYTES]; 370 | } EmscriptenGamepadEvent; 371 | 372 | 373 | typedef EM_BOOL (*em_gamepad_callback_func)(int eventType, const EmscriptenGamepadEvent *gamepadEvent, void *userData); 374 | extern EMSCRIPTEN_RESULT emscripten_set_gamepadconnected_callback(void *userData, EM_BOOL useCapture, em_gamepad_callback_func callback); 375 | extern EMSCRIPTEN_RESULT emscripten_set_gamepaddisconnected_callback(void *userData, EM_BOOL useCapture, em_gamepad_callback_func callback); 376 | 377 | extern int emscripten_get_num_gamepads(void); 378 | extern EMSCRIPTEN_RESULT emscripten_get_gamepad_status(int index, EmscriptenGamepadEvent *gamepadState); 379 | 380 | typedef struct EmscriptenBatteryEvent { 381 | double chargingTime; 382 | double dischargingTime; 383 | double level; 384 | EM_BOOL charging; 385 | } EmscriptenBatteryEvent; 386 | 387 | typedef EM_BOOL (*em_battery_callback_func)(int eventType, const EmscriptenBatteryEvent *batteryEvent, void *userData); 388 | extern EMSCRIPTEN_RESULT emscripten_set_batterychargingchange_callback(void *userData, em_battery_callback_func callback); 389 | extern EMSCRIPTEN_RESULT emscripten_set_batterylevelchange_callback(void *userData, em_battery_callback_func callback); 390 | 391 | extern EMSCRIPTEN_RESULT emscripten_get_battery_status(EmscriptenBatteryEvent *batteryState); 392 | 393 | 394 | extern EMSCRIPTEN_RESULT emscripten_vibrate(int msecs); 395 | extern EMSCRIPTEN_RESULT emscripten_vibrate_pattern(int *msecsArray, int numEntries); 396 | 397 | typedef const char *(*em_beforeunload_callback)(int eventType, const void *reserved, void *userData); 398 | extern EMSCRIPTEN_RESULT emscripten_set_beforeunload_callback(void *userData, em_beforeunload_callback callback); 399 | 400 | typedef int EMSCRIPTEN_WEBGL_CONTEXT_HANDLE; 401 | 402 | typedef struct EmscriptenWebGLContextAttributes { 403 | EM_BOOL alpha; 404 | EM_BOOL depth; 405 | EM_BOOL stencil; 406 | EM_BOOL antialias; 407 | EM_BOOL premultipliedAlpha; 408 | EM_BOOL preserveDrawingBuffer; 409 | EM_BOOL preferLowPowerToHighPerformance; 410 | EM_BOOL failIfMajorPerformanceCaveat; 411 | 412 | int majorVersion; 413 | int minorVersion; 414 | 415 | EM_BOOL enableExtensionsByDefault; 416 | EM_BOOL explicitSwapControl; 417 | } EmscriptenWebGLContextAttributes; 418 | 419 | extern void emscripten_webgl_init_context_attributes(EmscriptenWebGLContextAttributes *attributes); 420 | 421 | extern EMSCRIPTEN_WEBGL_CONTEXT_HANDLE emscripten_webgl_create_context(const char *target, const EmscriptenWebGLContextAttributes *attributes); 422 | 423 | extern EMSCRIPTEN_RESULT emscripten_webgl_make_context_current(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context); 424 | 425 | extern EMSCRIPTEN_WEBGL_CONTEXT_HANDLE emscripten_webgl_get_current_context(); 426 | 427 | extern EMSCRIPTEN_RESULT emscripten_webgl_destroy_context(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context); 428 | 429 | extern EM_BOOL emscripten_webgl_enable_extension(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context, const char *extension); 430 | 431 | typedef EM_BOOL (*em_webgl_context_callback)(int eventType, const void *reserved, void *userData); 432 | extern EMSCRIPTEN_RESULT emscripten_set_webglcontextlost_callback(const char *target, void *userData, EM_BOOL useCapture, em_webgl_context_callback callback); 433 | extern EMSCRIPTEN_RESULT emscripten_set_webglcontextrestored_callback(const char *target, void *userData, EM_BOOL useCapture, em_webgl_context_callback callback); 434 | 435 | extern EM_BOOL emscripten_is_webgl_context_lost(const char *target); 436 | 437 | extern EMSCRIPTEN_RESULT emscripten_webgl_commit_frame(); 438 | 439 | extern EMSCRIPTEN_RESULT emscripten_set_element_css_size(const char *target, double width, double height); 440 | extern EMSCRIPTEN_RESULT emscripten_get_element_css_size(const char *target, double *width, double *height); 441 | 442 | // #ifdef __cplusplus 443 | // } // ~extern "C" 444 | // #endif 445 | 446 | // #endif 447 | -------------------------------------------------------------------------------- /dist/appWASM.js: -------------------------------------------------------------------------------- 1 | function globalEval(x){eval.call(null,x)}function assert(condition,text){condition||abort("Assertion failed: "+text)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(e){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}function setValue(ptr,value,type,noSafe){switch("*"===(type=type||"i8").charAt(type.length-1)&&(type="i32"),type){case"i1":case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(0|Math_min(+Math_floor(tempDouble/4294967296),4294967295))>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function getValue(ptr,type,noSafe){switch("*"===(type=type||"i8").charAt(type.length-1)&&(type="i32"),type){case"i1":case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}function allocate(slab,types,allocator,ptr){var zeroinit,size;"number"==typeof slab?(zeroinit=!0,size=slab):(zeroinit=!1,size=slab.length);var ret,singleType="string"==typeof types?types:null;if(ret=allocator==ALLOC_NONE?ptr:["function"==typeof _malloc?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][void 0===allocator?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length)),zeroinit){var stop;ptr=ret;for(assert(0==(3&ret)),stop=ret+(-4&size);ptr>2]=0;for(stop=ret+size;ptr>0]=0;return ret}if("i8"===singleType)return slab.subarray||slab.slice?HEAPU8.set(slab,ret):HEAPU8.set(new Uint8Array(slab),ret),ret;for(var type,typeSize,previousType,i=0;i>0],hasUtf|=t,(0!=t||length)&&(i++,!length||i!=length););length||(length=i);var ret="";if(hasUtf<128){for(var curr;length>0;)curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,1024))),ret=ret?ret+curr:curr,ptr+=1024,length-=1024;return ret}return Module.UTF8ToString(ptr)}function AsciiToString(ptr){for(var str="";;){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,!1)}function UTF8ArrayToString(u8Array,idx){for(var endPtr=idx;u8Array[endPtr];)++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder)return UTF8Decoder.decode(u8Array.subarray(idx,endPtr));for(var u0,u1,u2,u3,u4,str="";;){if(!(u0=u8Array[idx++]))return str;if(128&u0)if(u1=63&u8Array[idx++],192!=(224&u0))if(u2=63&u8Array[idx++],224==(240&u0)?u0=(15&u0)<<12|u1<<6|u2:(u3=63&u8Array[idx++],240==(248&u0)?u0=(7&u0)<<18|u1<<12|u2<<6|u3:(u4=63&u8Array[idx++],u0=248==(252&u0)?(3&u0)<<24|u1<<18|u2<<12|u3<<6|u4:(1&u0)<<30|u1<<24|u2<<18|u3<<12|u4<<6|63&u8Array[idx++])),u0<65536)str+=String.fromCharCode(u0);else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|1023&ch)}else str+=String.fromCharCode((31&u0)<<6|u1);else str+=String.fromCharCode(u0)}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;for(var startIdx=outIdx,endIdx=outIdx+maxBytesToWrite-1,i=0;i=55296&&u<=57343&&(u=65536+((1023&u)<<10)|1023&str.charCodeAt(++i)),u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6,outU8Array[outIdx++]=128|63&u}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12,outU8Array[outIdx++]=128|u>>6&63,outU8Array[outIdx++]=128|63&u}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18,outU8Array[outIdx++]=128|u>>12&63,outU8Array[outIdx++]=128|u>>6&63,outU8Array[outIdx++]=128|63&u}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24,outU8Array[outIdx++]=128|u>>18&63,outU8Array[outIdx++]=128|u>>12&63,outU8Array[outIdx++]=128|u>>6&63,outU8Array[outIdx++]=128|63&u}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30,outU8Array[outIdx++]=128|u>>24&63,outU8Array[outIdx++]=128|u>>18&63,outU8Array[outIdx++]=128|u>>12&63,outU8Array[outIdx++]=128|u>>6&63,outU8Array[outIdx++]=128|63&u}}return outU8Array[outIdx]=0,outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){for(var len=0,i=0;i=55296&&u<=57343&&(u=65536+((1023&u)<<10)|1023&str.charCodeAt(++i)),u<=127?++len:len+=u<=2047?2:u<=65535?3:u<=2097151?4:u<=67108863?5:6}return len}function demangle(func){var __cxa_demangle_func=Module.___cxa_demangle||Module.__cxa_demangle;if(__cxa_demangle_func){try{var s=func.substr(1),len=lengthBytesUTF8(s)+1,buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4),ret=__cxa_demangle_func(buf,0,0,status);if(0===getValue(status,"i32")&&ret)return Pointer_stringify(ret)}catch(e){}finally{buf&&_free(buf),status&&_free(status),ret&&_free(ret)}return func}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),func}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack)return"(no stack trace available)"}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();return Module.extraStackTrace&&(js+="\n"+Module.extraStackTrace()),demangleAll(js)}function alignUp(x,multiple){return x%multiple>0&&(x+=multiple-x%multiple),x}function updateGlobalBuffer(buf){Module.buffer=buffer=buf}function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){var PAGE_MULTIPLE=Module.usingWasm?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE,LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT)return!1;var OLD_TOTAL_MEMORY=TOTAL_MEMORY;for(TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);TOTAL_MEMORY>2];)TOTAL_MEMORY=TOTAL_MEMORY<=536870912?alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE):Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT);var replacement=Module.reallocBuffer(TOTAL_MEMORY);return replacement&&replacement.byteLength==TOTAL_MEMORY?(updateGlobalBuffer(replacement),updateGlobalBufferViews(),!0):(TOTAL_MEMORY=OLD_TOTAL_MEMORY,!1)}function getTotalMemory(){return TOTAL_MEMORY}function callRuntimeCallbacks(callbacks){for(;callbacks.length>0;){var callback=callbacks.shift();if("function"!=typeof callback){var func=callback.func;"number"==typeof func?void 0===callback.arg?Module.dynCall_v(func):Module.dynCall_vi(func,callback.arg):func(void 0===callback.arg?null:callback.arg)}else callback()}}function preRun(){if(Module.preRun)for("function"==typeof Module.preRun&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for("function"==typeof Module.postRun&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPreMain(cb){__ATMAIN__.unshift(cb)}function addOnExit(cb){__ATEXIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1,u8array=new Array(len),numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);return dontAddNull&&(u8array.length=numBytesWritten),u8array}function intArrayToString(array){for(var ret=[],i=0;i255&&(chr&=255),ret.push(String.fromCharCode(chr))}return ret.join("")}function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var lastChar,end;dontAddNull&&(end=buffer+lengthBytesUTF8(string),lastChar=HEAP8[end]),stringToUTF8(string,buffer,1/0),dontAddNull&&(HEAP8[end]=lastChar)}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i);dontAddNull||(HEAP8[buffer>>0]=0)}function addRunDependency(id){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}function removeRunDependency(id){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),0==runDependencies&&(null!==runDependencyWatcher&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var callback=dependenciesFulfilled;dependenciesFulfilled=null,callback()}}function integrateWasmJS(Module){function fixImports(imports){return imports}function getBinaryPromise(){return Module.wasmBinary||"function"!=typeof fetch?new Promise(function(resolve,reject){resolve(function(){try{var binary;if(Module.wasmBinary)binary=Module.wasmBinary,binary=new Uint8Array(binary);else{if(!Module.readBinary)throw"on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)";binary=Module.readBinary(wasmBinaryFile)}return binary}catch(err){abort(err)}}())}):fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response.ok)throw"failed to load wasm binary file at '"+wasmBinaryFile+"'";return response.arrayBuffer()})}function doNativeWasm(global,env,providedBuffer){function receiveInstance(instance){(exports=instance.exports).memory&&function(newBuffer){var oldBuffer=Module.buffer;newBuffer.byteLength>>0)/(y>>>0)>>>0},"i32s-rem":function(x,y){return(0|x)%(0|y)|0},"i32u-rem":function(x,y){return(x>>>0)%(y>>>0)>>>0},debugger:function(){}},parent:Module},exports=null;Module.asmPreload=Module.asm;var asmjsReallocBuffer=Module.reallocBuffer;Module.reallocBuffer=function(size){return"asmjs"===finalMethod?asmjsReallocBuffer(size):function(size){size=alignUp(size,Module.usingWasm?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE);var old=Module.buffer,oldSize=old.byteLength;if(!Module.usingWasm)return exports.__growWasmMemory((size-oldSize)/65536),Module.buffer!==old?Module.buffer:null;try{return-1!==Module.wasmMemory.grow((size-oldSize)/65536)?Module.buffer=Module.wasmMemory.buffer:null}catch(e){return null}}(size)};var finalMethod="";Module.asm=function(global,env,providedBuffer){if(global=fixImports(global),!(env=fixImports(env)).table){var TABLE_SIZE=Module.wasmTableSize;void 0===TABLE_SIZE&&(TABLE_SIZE=1024);var MAX_TABLE_SIZE=Module.wasmMaxTableSize;"object"==typeof WebAssembly&&"function"==typeof WebAssembly.Table?env.table=void 0!==MAX_TABLE_SIZE?new WebAssembly.Table({initial:TABLE_SIZE,maximum:MAX_TABLE_SIZE,element:"anyfunc"}):new WebAssembly.Table({initial:TABLE_SIZE,element:"anyfunc"}):env.table=new Array(TABLE_SIZE),Module.wasmTable=env.table}env.memoryBase||(env.memoryBase=Module.STATIC_BASE),env.tableBase||(env.tableBase=0);return doNativeWasm(global,env)};Module.asm}function _emscripten_asm_const_i(code){return ASM_CONSTS[code]()}function emscriptenWebGLComputeImageSize(width,height,sizePerPixel,alignment){var plainRowSize=width*sizePerPixel,alignedRowSize=function(x,y){return Math.floor((x+y-1)/y)*y}(plainRowSize,alignment);return height<=0?0:(height-1)*alignedRowSize+plainRowSize}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var sizePerPixel,numChannels;switch(format){case 6406:case 6409:case 6402:case 6403:case 36244:numChannels=1;break;case 6410:case 33319:case 33320:numChannels=2;break;case 6407:case 35904:case 36248:numChannels=3;break;case 6408:case 35906:case 36249:numChannels=4;break;default:return GL.recordError(1280),null}switch(type){case 5121:case 5120:sizePerPixel=1*numChannels;break;case 5123:case 36193:case 5131:case 5122:sizePerPixel=2*numChannels;break;case 5125:case 5126:case 5124:sizePerPixel=4*numChannels;break;case 34042:case 35902:case 33640:case 35899:case 34042:sizePerPixel=4;break;case 33635:case 32819:case 32820:sizePerPixel=2;break;default:return GL.recordError(1280),null}var bytes=emscriptenWebGLComputeImageSize(width,height,sizePerPixel,GL.unpackAlignment);switch(type){case 5120:return HEAP8.subarray(pixels,pixels+bytes);case 5121:return HEAPU8.subarray(pixels,pixels+bytes);case 5122:return HEAP16.subarray(pixels>>1,pixels+bytes>>1);case 5124:return HEAP32.subarray(pixels>>2,pixels+bytes>>2);case 5126:return HEAPF32.subarray(pixels>>2,pixels+bytes>>2);case 5125:case 34042:case 35902:case 33640:case 35899:case 34042:return HEAPU32.subarray(pixels>>2,pixels+bytes>>2);case 5123:case 33635:case 32819:case 32820:case 36193:case 5131:return HEAPU16.subarray(pixels>>1,pixels+bytes>>1);default:return GL.recordError(1280),null}}function emscriptenWebGLGetHeapForType(type){switch(type){case 5120:return HEAP8;case 5121:return HEAPU8;case 5122:return HEAP16;case 5123:case 33635:case 32819:case 32820:case 36193:case 5131:return HEAPU16;case 5124:return HEAP32;case 5125:case 34042:case 35902:case 33640:case 35899:case 34042:return HEAPU32;case 5126:return HEAPF32;default:return null}}function emscriptenWebGLGetShiftForType(type){switch(type){case 5120:case 5121:return 0;case 5122:case 5123:case 33635:case 32819:case 32820:case 36193:case 5131:return 1;case 5124:case 5126:case 5125:case 34042:case 35902:case 33640:case 35899:case 34042:return 2;default:return 0}}function _glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(GL.currentContext.supportsWebGL2EntryPoints)GLctx.currentPixelUnpackBufferBinding?GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels):0!=pixels?GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,emscriptenWebGLGetHeapForType(type),pixels>>emscriptenWebGLGetShiftForType(type)):GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null);else{var pixelData=null;pixels&&(pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat)),GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixelData)}}function _glUseProgram(program){GLctx.useProgram(program?GL.programs[program]:null)}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(null===log&&(log="(unknown error)"),maxLength>0&&infoLog){var numBytesWrittenExclNull=stringToUTF8(log,infoLog,maxLength);length&&(HEAP32[length>>2]=numBytesWrittenExclNull)}else length&&(HEAP32[length>>2]=0)}function _glGetUniformLocation(program,name){var arrayOffset=0;if(-1!==(name=Pointer_stringify(name)).indexOf("]",name.length-1)){var ls=name.lastIndexOf("["),arrayIndex=name.slice(ls+1,-1);if(arrayIndex.length>0&&(arrayOffset=parseInt(arrayIndex))<0)return-1;name=name.slice(0,ls)}var ptable=GL.programInfos[program];if(!ptable)return-1;var uniformInfo=ptable.uniforms[name];return uniformInfo&&arrayOffset>2]=PTHREAD_SPECIFIC_NEXT_KEY,PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0,PTHREAD_SPECIFIC_NEXT_KEY++,0)}function _glClear(x0){GLctx.clear(x0)}function _glGenBuffers(n,buffers){for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.buffers);buffer.name=id,GL.buffers[id]=buffer,HEAP32[buffers+4*i>>2]=id}}function _glActiveTexture(x0){GLctx.activeTexture(x0)}function _glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _glGetAttribLocation(program,name){return program=GL.programs[program],name=Pointer_stringify(name),GLctx.getAttribLocation(program,name)}function _glBindBuffer(target,buffer){var bufferObj=buffer?GL.buffers[buffer]:null;35051==target?GLctx.currentPixelPackBufferBinding=buffer:35052==target&&(GLctx.currentPixelUnpackBufferBinding=buffer),GLctx.bindBuffer(target,bufferObj)}function _emscripten_webgl_destroy_context(contextHandle){GL.deleteContext(contextHandle)}function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function _glCreateProgram(){var id=GL.getNewId(GL.programs),program=GLctx.createProgram();return program.name=id,GL.programs[id]=program,id}function _pthread_setspecific(key,value){return key in PTHREAD_SPECIFIC?(PTHREAD_SPECIFIC[key]=value,0):ERRNO_CODES.EINVAL}function _glBufferData(target,size,data,usage){if(data){if(GL.currentContext.supportsWebGL2EntryPoints)return void GLctx.bufferData(target,HEAPU8,usage,data,size);GLctx.bufferData(target,HEAPU8.subarray(data,data+size),usage)}else GLctx.bufferData(target,size,usage)}function _glViewport(x0,x1,x2,x3){GLctx.viewport(x0,x1,x2,x3)}function _emscripten_webgl_create_context(target,attributes){var contextAttributes={};contextAttributes.alpha=!!HEAP32[attributes>>2],contextAttributes.depth=!!HEAP32[attributes+4>>2],contextAttributes.stencil=!!HEAP32[attributes+8>>2],contextAttributes.antialias=!!HEAP32[attributes+12>>2],contextAttributes.premultipliedAlpha=!!HEAP32[attributes+16>>2],contextAttributes.preserveDrawingBuffer=!!HEAP32[attributes+20>>2],contextAttributes.preferLowPowerToHighPerformance=!!HEAP32[attributes+24>>2],contextAttributes.failIfMajorPerformanceCaveat=!!HEAP32[attributes+28>>2],contextAttributes.majorVersion=HEAP32[attributes+32>>2],contextAttributes.minorVersion=HEAP32[attributes+36>>2],contextAttributes.explicitSwapControl=HEAP32[attributes+44>>2];var canvas;if(!(canvas=(target=Pointer_stringify(target))&&"#canvas"!==target||!Module.canvas?GL.offscreenCanvases[target]||JSEvents.findEventTarget(target):Module.canvas.id?GL.offscreenCanvases[Module.canvas.id]||JSEvents.findEventTarget(Module.canvas.id):Module.canvas))return 0;if(contextAttributes.explicitSwapControl)return console.error("emscripten_webgl_create_context failed: explicitSwapControl is not supported, please rebuild with -s OFFSCREENCANVAS_SUPPORT=1 to enable targeting the experimental OffscreenCanvas specification!"),0;return GL.createContext(canvas,contextAttributes)}function _glBindAttribLocation(program,index,name){name=Pointer_stringify(name),GLctx.bindAttribLocation(GL.programs[program],index,name)}function _glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];return info&&!info.caught&&(info.caught=!0,__ZSt18uncaught_exceptionv.uncaught_exception--),info&&(info.rethrown=!1),EXCEPTIONS.caught.push(ptr),EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr)),ptr}function _emscripten_memcpy_big(dest,src,num){return HEAPU8.set(HEAPU8.subarray(src,src+num),dest),dest}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();return FS.close(stream),0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function ___setErrNo(value){return Module.___errno_location&&(HEAP32[Module.___errno_location()>>2]=value),value}function _llvm_stacksave(){var self=_llvm_stacksave;return self.LLVM_SAVEDSTACKS||(self.LLVM_SAVEDSTACKS=[]),self.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),self.LLVM_SAVEDSTACKS.length-1}function _glGenTextures(n,textures){for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.textures);texture.name=id,GL.textures[id]=texture,HEAP32[textures+4*i>>2]=id}}function _glTexParameteri(x0,x1,x2){GLctx.texParameteri(x0,x1,x2)}function _emscripten_webgl_make_context_current(contextHandle){return GL.makeContextCurrent(contextHandle)?0:-5}function ___resumeException(ptr){throw EXCEPTIONS.last||(EXCEPTIONS.last=ptr),ptr+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown)return 0|(Runtime.setTempRet0(0),0);var info=EXCEPTIONS.infos[thrown],throwntype=info.type;if(!throwntype)return 0|(Runtime.setTempRet0(0),thrown);var typeArray=Array.prototype.slice.call(arguments);Module.___cxa_is_pointer_type(throwntype);___cxa_find_matching_catch.buffer||(___cxa_find_matching_catch.buffer=_malloc(4)),HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown,thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2],info.adjusted=thrown,0|(Runtime.setTempRet0(typeArray[i]),thrown);return thrown=HEAP32[thrown>>2],0|(Runtime.setTempRet0(throwntype),thrown)}function ___gxx_personality_v0(){}function _glUniform1f(location,v0){GLctx.uniform1f(GL.uniforms[location],v0)}function _pthread_once(ptr,func){_pthread_once.seen||(_pthread_once.seen={}),ptr in _pthread_once.seen||(Module.dynCall_v(func),_pthread_once.seen[ptr]=1)}function _glValidateProgram(program){GLctx.validateProgram(GL.programs[program])}function _glGetShaderiv(shader,pname,p){if(p)if(35716==pname){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);null===log&&(log="(unknown error)"),HEAP32[p>>2]=log.length+1}else if(35720==pname){var source=GLctx.getShaderSource(GL.shaders[shader]),sourceLength=null===source||0==source.length?0:source.length+1;HEAP32[p>>2]=sourceLength}else HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname);else GL.recordError(1281)}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);return GL.shaders[id]=GLctx.createShader(shaderType),id}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_low=(SYSCALLS.get(),SYSCALLS.get()),result=SYSCALLS.get(),whence=SYSCALLS.get(),offset=offset_low;return FS.llseek(stream,offset,whence),HEAP32[result>>2]=stream.position,stream.getdents&&0===offset&&0===whence&&(stream.getdents=null),0}catch(e){return"undefined"!=typeof FS&&e instanceof FS.ErrnoError||abort(e),-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get(),ret=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer),0===curr||10===curr?((1===stream?Module.print:Module.printErr)(UTF8ArrayToString(buffer,0)),buffer.length=0):buffer.push(curr)});for(var i=0;i>2],len=HEAP32[iov+(8*i+4)>>2],j=0;j0||(preRun(),runDependencies>0||Module.calledRun||(Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),doRun()},1)):doRun()))}function exit(status,implicit){implicit&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=status,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(status)),ENVIRONMENT_IS_NODE&&process.exit(status),Module.quit(status,new ExitStatus(status)))}function abort(what){Module.onAbort&&Module.onAbort(what),void 0!==what?(Module.print(what),Module.printErr(what),what=JSON.stringify(what)):what="",ABORT=!0,EXITSTATUS=1;var output="abort("+what+") at "+stackTrace()+"\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";throw abortDecorators&&abortDecorators.forEach(function(decorator){output=decorator(output,what)}),output}var Module;Module||(Module=(void 0!==Module?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if("WEB"===Module.ENVIRONMENT)ENVIRONMENT_IS_WEB=!0;else if("WORKER"===Module.ENVIRONMENT)ENVIRONMENT_IS_WORKER=!0;else if("NODE"===Module.ENVIRONMENT)ENVIRONMENT_IS_NODE=!0;else{if("SHELL"!==Module.ENVIRONMENT)throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");ENVIRONMENT_IS_SHELL=!0}else ENVIRONMENT_IS_WEB="object"==typeof window,ENVIRONMENT_IS_WORKER="function"==typeof importScripts,ENVIRONMENT_IS_NODE="object"==typeof process&&"function"==typeof require&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(filename,binary){nodeFS||(nodeFS=require("fs")),nodePath||(nodePath=require("path")),filename=nodePath.normalize(filename);var ret=nodeFS.readFileSync(filename);return binary?ret:ret.toString()},Module.readBinary=function(filename){var ret=Module.read(filename,!0);return ret.buffer||(ret=new Uint8Array(ret)),assert(ret.buffer),ret},Module.load=function(f){globalEval(read(f))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),"undefined"!=typeof module&&(module.exports=Module),process.on("uncaughtException",function(ex){if(!(ex instanceof ExitStatus))throw ex}),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),"undefined"!=typeof printErr&&(Module.printErr=printErr),"undefined"!=typeof read?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(f){if("function"==typeof readbuffer)return new Uint8Array(readbuffer(f));var data=read(f,"binary");return assert("object"==typeof data),data},"undefined"!=typeof scriptArgs?Module.arguments=scriptArgs:"undefined"!=typeof arguments&&(Module.arguments=arguments),"function"==typeof quit&&(Module.quit=function(status,toThrow){quit(status)});else{if(!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER)throw"Unknown runtime environment. Where are we?";if(Module.read=function(url){var xhr=new XMLHttpRequest;return xhr.open("GET",url,!1),xhr.send(null),xhr.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(url){var xhr=new XMLHttpRequest;return xhr.open("GET",url,!1),xhr.responseType="arraybuffer",xhr.send(null),new Uint8Array(xhr.response)}),Module.readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,!0),xhr.responseType="arraybuffer",xhr.onload=function(){200==xhr.status||0==xhr.status&&xhr.response?onload(xhr.response):onerror()},xhr.onerror=onerror,xhr.send(null)},"undefined"!=typeof arguments&&(Module.arguments=arguments),"undefined"!=typeof console)Module.print||(Module.print=function(x){console.log(x)}),Module.printErr||(Module.printErr=function(x){console.warn(x)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&"undefined"!=typeof dump?function(x){dump(x)}:function(x){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),void 0===Module.setWindowTitle&&(Module.setWindowTitle=function(title){document.title=title})}!Module.load&&Module.read&&(Module.load=function(f){globalEval(Module.read(f))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(status,toThrow){throw toThrow}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(value){return tempRet0=value,value},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(stackTop){STACKTOP=stackTop},getNativeTypeSize:function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:if("*"===type[type.length-1])return Runtime.QUANTUM_SIZE;if("i"===type[0]){var bits=parseInt(type.substr(1));return assert(bits%8==0),bits/8}return 0}},getNativeFieldSize:function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(ptr,type){return"double"===type||"i64"===type?7&ptr&&(assert(4==(7&ptr)),ptr+=4):assert(0==(3&ptr)),ptr},getAlignSize:function(type,size,vararg){return vararg||"i64"!=type&&"double"!=type?type?Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE):Math.min(size,8):8},dynCall:function(sig,ptr,args){return args&&args.length?Module["dynCall_"+sig].apply(null,[ptr].concat(args)):Module["dynCall_"+sig].call(null,ptr)},functionPointers:[],addFunction:function(func){for(var i=0;i>2],end=-16&(ret+size+15|0);if(HEAP32[DYNAMICTOP_PTR>>2]=end,end>=TOTAL_MEMORY){if(!enlargeMemory())return HEAP32[DYNAMICTOP_PTR>>2]=ret,0}return ret},alignMemory:function(size,quantum){return size=Math.ceil(size/(quantum||16))*(quantum||16)},makeBigInt:function(low,high,unsigned){return unsigned?+(low>>>0)+4294967296*+(high>>>0):+(low>>>0)+4294967296*+(0|high)},GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0,cwrap,ccall;!function(){function parseJSFunc(jsfunc){var parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}function ensureJSsource(){if(!JSsource){JSsource={};for(var fun in JSfuncs)JSfuncs.hasOwnProperty(fun)&&(JSsource[fun]=parseJSFunc(JSfuncs[fun]))}}var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(arr){var ret=Runtime.stackAlloc(arr.length);return writeArrayToMemory(arr,ret),ret},stringToC:function(str){var ret=0;if(null!==str&&void 0!==str&&0!==str){var len=1+(str.length<<2);stringToUTF8(str,ret=Runtime.stackAlloc(len),len)}return ret}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(ident,returnType,argTypes,args,opts){var func=getCFunc(ident),cArgs=[],stack=0;if(args)for(var i=0;i>>16)*bl+al*(b>>>16)<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(x){return froundBuffer[0]=x,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(x){x>>>=0;for(var i=0;i<32;i++)if(x&1<<31-i)return i;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(x){return x<0?Math.ceil(x):Math.floor(x)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;Module.addRunDependency=addRunDependency,Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var memoryInitializer=null;integrateWasmJS(Module);var ASM_CONSTS=[function(){"undefined"!=typeof window?window.dispatchEvent(new CustomEvent("wasmLoaded")):global.onWASMLoaded&&global.onWASMLoaded()}];STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+8832,__ATINIT__.push({func:function(){__GLOBAL__sub_I_emscripten_cpp()}}),memoryInitializer=Module.wasmJSMethod.indexOf("asmjs")>=0||Module.wasmJSMethod.indexOf("interpret-asm2wasm")>=0?"appWASM.js.mem":null;var STATIC_BUMP=8832;Module.STATIC_BASE=STATIC_BASE,Module.STATIC_BUMP=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;var GL={counter:1,lastError:0,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:[],currentContext:null,offscreenCanvases:{},timerQueriesEXT:[],queries:[],samplers:[],transformFeedbacks:[],syncs:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],programInfos:{},stringCache:{},stringiCache:{},tempFixedLengthArray:[],packAlignment:4,unpackAlignment:4,init:function(){GL.miniTempBuffer=new Float32Array(GL.MINI_TEMP_BUFFER_SIZE);for(var i=0;i>2];frag=len<0?Pointer_stringify(HEAP32[string+4*i>>2]):Pointer_stringify(HEAP32[string+4*i>>2],len)}else frag=Pointer_stringify(HEAP32[string+4*i>>2]);source+=frag}return source},createContext:function(canvas,webGLContextAttributes){function onContextCreationError(event){errorInfo=event.statusMessage||errorInfo}void 0===webGLContextAttributes.majorVersion&&void 0===webGLContextAttributes.minorVersion&&("undefined"!=typeof WebGL2RenderingContext?webGLContextAttributes.majorVersion=2:webGLContextAttributes.majorVersion=1,webGLContextAttributes.minorVersion=0);var ctx,errorInfo="?";try{canvas.addEventListener("webglcontextcreationerror",onContextCreationError,!1);try{if(1==webGLContextAttributes.majorVersion&&0==webGLContextAttributes.minorVersion)ctx=canvas.getContext("webgl",webGLContextAttributes)||canvas.getContext("experimental-webgl",webGLContextAttributes);else{if(2!=webGLContextAttributes.majorVersion||0!=webGLContextAttributes.minorVersion)throw"Unsupported WebGL context version "+majorVersion+"."+minorVersion+"!";ctx=canvas.getContext("webgl2",webGLContextAttributes)}}finally{canvas.removeEventListener("webglcontextcreationerror",onContextCreationError,!1)}if(!ctx)throw":("}catch(e){return Module.print("Could not create canvas: "+[errorInfo,e,JSON.stringify(webGLContextAttributes)]),0}return ctx?GL.registerContext(ctx,webGLContextAttributes):0},registerContext:function(ctx,webGLContextAttributes){function getChromeVersion(){var raw=navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);return!!raw&&parseInt(raw[2],10)}var handle=GL.getNewId(GL.contexts),context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};return context.supportsWebGL2EntryPoints=context.version>=2&&(!1===getChromeVersion()||getChromeVersion()>=58),ctx.canvas&&(ctx.canvas.GLctxObject=context),GL.contexts[handle]=context,(void 0===webGLContextAttributes.enableExtensionsByDefault||webGLContextAttributes.enableExtensionsByDefault)&&GL.initExtensions(context),handle},makeContextCurrent:function(contextHandle){var context=GL.contexts[contextHandle];return!!context&&(GLctx=Module.ctx=context.GLctx,GL.currentContext=context,!0)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){GL.currentContext===GL.contexts[contextHandle]&&(GL.currentContext=null),"object"==typeof JSEvents&&JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas),GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas&&(GL.contexts[contextHandle].GLctx.canvas.GLctxObject=void 0),GL.contexts[contextHandle]=null},initExtensions:function(context){if(context||(context=GL.currentContext),!context.initExtensionsDone){context.initExtensionsDone=!0;var GLctx=context.GLctx;if(context.maxVertexAttribs=GLctx.getParameter(GLctx.MAX_VERTEX_ATTRIBS),context.version<2){var instancedArraysExt=GLctx.getExtension("ANGLE_instanced_arrays");instancedArraysExt&&(GLctx.vertexAttribDivisor=function(index,divisor){instancedArraysExt.vertexAttribDivisorANGLE(index,divisor)},GLctx.drawArraysInstanced=function(mode,first,count,primcount){instancedArraysExt.drawArraysInstancedANGLE(mode,first,count,primcount)},GLctx.drawElementsInstanced=function(mode,count,type,indices,primcount){instancedArraysExt.drawElementsInstancedANGLE(mode,count,type,indices,primcount)});var vaoExt=GLctx.getExtension("OES_vertex_array_object");vaoExt&&(GLctx.createVertexArray=function(){return vaoExt.createVertexArrayOES()},GLctx.deleteVertexArray=function(vao){vaoExt.deleteVertexArrayOES(vao)},GLctx.bindVertexArray=function(vao){vaoExt.bindVertexArrayOES(vao)},GLctx.isVertexArray=function(vao){return vaoExt.isVertexArrayOES(vao)});var drawBuffersExt=GLctx.getExtension("WEBGL_draw_buffers");drawBuffersExt&&(GLctx.drawBuffers=function(n,bufs){drawBuffersExt.drawBuffersWEBGL(n,bufs)})}GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query");var automaticallyEnabledExtensions=["OES_texture_float","OES_texture_half_float","OES_standard_derivatives","OES_vertex_array_object","WEBGL_compressed_texture_s3tc","WEBGL_depth_texture","OES_element_index_uint","EXT_texture_filter_anisotropic","ANGLE_instanced_arrays","OES_texture_float_linear","OES_texture_half_float_linear","WEBGL_compressed_texture_atc","WEBGL_compressed_texture_pvrtc","EXT_color_buffer_half_float","WEBGL_color_buffer_float","EXT_frag_depth","EXT_sRGB","WEBGL_draw_buffers","WEBGL_shared_resources","EXT_shader_texture_lod","EXT_color_buffer_float"],exts=GLctx.getSupportedExtensions();exts&&exts.length>0&&GLctx.getSupportedExtensions().forEach(function(ext){-1!=automaticallyEnabledExtensions.indexOf(ext)&&GLctx.getExtension(ext)})}},populateUniformTable:function(program){var p=GL.programs[program];GL.programInfos[program]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1};for(var ptable=GL.programInfos[program],utable=ptable.uniforms,numUniforms=GLctx.getProgramParameter(p,GLctx.ACTIVE_UNIFORMS),i=0;i=0;--i)JSEvents._removeHandler(i)}),JSEvents.removeEventListenersRegistered=!0)},findEventTarget:function(target){return target?("number"==typeof target&&(target=Pointer_stringify(target)),"#window"==target?window:"#document"==target?document:"#screen"==target?window.screen:"#canvas"==target?Module.canvas:"string"==typeof target?document.getElementById(target):target):window},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return!1;for(var i in arrA)if(arrA[i]!=arrB[i])return!1;return!0}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList))return}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList}),JSEvents.deferredCalls.sort(function(x,y){return x.precedence0},removeAllHandlersOnTarget:function(target,eventTypeString){for(var i=0;i>2]=e.location,HEAP32[JSEvents.keyEvent+68>>2]=e.ctrlKey,HEAP32[JSEvents.keyEvent+72>>2]=e.shiftKey,HEAP32[JSEvents.keyEvent+76>>2]=e.altKey,HEAP32[JSEvents.keyEvent+80>>2]=e.metaKey,HEAP32[JSEvents.keyEvent+84>>2]=e.repeat,stringToUTF8(e.locale?e.locale:"",JSEvents.keyEvent+88,32),stringToUTF8(e.char?e.char:"",JSEvents.keyEvent+120,32),HEAP32[JSEvents.keyEvent+152>>2]=e.charCode,HEAP32[JSEvents.keyEvent+156>>2]=e.keyCode,HEAP32[JSEvents.keyEvent+160>>2]=e.which;Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.keyEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},getBoundingClientRectOrZeros:function(target){return target.getBoundingClientRect?target.getBoundingClientRect():{left:0,top:0}},fillMouseEventData:function(eventStruct,e,target){if(HEAPF64[eventStruct>>3]=JSEvents.tick(),HEAP32[eventStruct+8>>2]=e.screenX,HEAP32[eventStruct+12>>2]=e.screenY,HEAP32[eventStruct+16>>2]=e.clientX,HEAP32[eventStruct+20>>2]=e.clientY,HEAP32[eventStruct+24>>2]=e.ctrlKey,HEAP32[eventStruct+28>>2]=e.shiftKey,HEAP32[eventStruct+32>>2]=e.altKey,HEAP32[eventStruct+36>>2]=e.metaKey,HEAP16[eventStruct+40>>1]=e.button,HEAP16[eventStruct+42>>1]=e.buttons,HEAP32[eventStruct+44>>2]=e.movementX||e.mozMovementX||e.webkitMovementX||e.screenX-JSEvents.previousScreenX,HEAP32[eventStruct+48>>2]=e.movementY||e.mozMovementY||e.webkitMovementY||e.screenY-JSEvents.previousScreenY,Module.canvas){var rect=Module.canvas.getBoundingClientRect();HEAP32[eventStruct+60>>2]=e.clientX-rect.left,HEAP32[eventStruct+64>>2]=e.clientY-rect.top}else HEAP32[eventStruct+60>>2]=0,HEAP32[eventStruct+64>>2]=0;if(target){rect=JSEvents.getBoundingClientRectOrZeros(target);HEAP32[eventStruct+52>>2]=e.clientX-rect.left,HEAP32[eventStruct+56>>2]=e.clientY-rect.top}else HEAP32[eventStruct+52>>2]=0,HEAP32[eventStruct+56>>2]=0;"wheel"!==e.type&&"mousewheel"!==e.type&&(JSEvents.previousScreenX=e.screenX,JSEvents.previousScreenY=e.screenY)},registerMouseEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.mouseEvent||(JSEvents.mouseEvent=_malloc(72));var eventHandler={target:target=JSEvents.findEventTarget(target),allowsDeferredCalls:"mousemove"!=eventTypeString&&"mouseenter"!=eventTypeString&&"mouseleave"!=eventTypeString,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;JSEvents.fillMouseEventData(JSEvents.mouseEvent,e,target);Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.mouseEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.isInternetExplorer()&&"mousedown"==eventTypeString&&(eventHandler.allowsDeferredCalls=!1),JSEvents.registerOrRemoveHandler(eventHandler)},registerWheelEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.wheelEvent||(JSEvents.wheelEvent=_malloc(104));var eventHandler={target:target=JSEvents.findEventTarget(target),allowsDeferredCalls:!0,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:"wheel"==eventTypeString?function(event){var e=event||window.event;JSEvents.fillMouseEventData(JSEvents.wheelEvent,e,target),HEAPF64[JSEvents.wheelEvent+72>>3]=e.deltaX,HEAPF64[JSEvents.wheelEvent+80>>3]=e.deltaY,HEAPF64[JSEvents.wheelEvent+88>>3]=e.deltaZ,HEAP32[JSEvents.wheelEvent+96>>2]=e.deltaMode;Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.wheelEvent,userData)&&e.preventDefault()}:function(event){var e=event||window.event;JSEvents.fillMouseEventData(JSEvents.wheelEvent,e,target),HEAPF64[JSEvents.wheelEvent+72>>3]=e.wheelDeltaX||0,HEAPF64[JSEvents.wheelEvent+80>>3]=-(e.wheelDeltaY?e.wheelDeltaY:e.wheelDelta),HEAPF64[JSEvents.wheelEvent+88>>3]=0,HEAP32[JSEvents.wheelEvent+96>>2]=0;Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.wheelEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},pageScrollPos:function(){return window.pageXOffset>0||window.pageYOffset>0?[window.pageXOffset,window.pageYOffset]:void 0!==document.documentElement.scrollLeft||void 0!==document.documentElement.scrollTop?[document.documentElement.scrollLeft,document.documentElement.scrollTop]:[0|document.body.scrollLeft,0|document.body.scrollTop]},registerUiEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.uiEvent||(JSEvents.uiEvent=_malloc(36));var eventHandler={target:target="scroll"!=eventTypeString||target?JSEvents.findEventTarget(target):document,allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;if(e.target==target){var scrollPos=JSEvents.pageScrollPos();HEAP32[JSEvents.uiEvent>>2]=e.detail,HEAP32[JSEvents.uiEvent+4>>2]=document.body.clientWidth,HEAP32[JSEvents.uiEvent+8>>2]=document.body.clientHeight,HEAP32[JSEvents.uiEvent+12>>2]=window.innerWidth,HEAP32[JSEvents.uiEvent+16>>2]=window.innerHeight,HEAP32[JSEvents.uiEvent+20>>2]=window.outerWidth,HEAP32[JSEvents.uiEvent+24>>2]=window.outerHeight,HEAP32[JSEvents.uiEvent+28>>2]=scrollPos[0],HEAP32[JSEvents.uiEvent+32>>2]=scrollPos[1],Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.uiEvent,userData)&&e.preventDefault()}},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},getNodeNameForTarget:function(target){return target?target==window?"#window":target==window.screen?"#screen":target&&target.nodeName?target.nodeName:"":""},registerFocusEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.focusEvent||(JSEvents.focusEvent=_malloc(256));var eventHandler={target:JSEvents.findEventTarget(target),allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event,nodeName=JSEvents.getNodeNameForTarget(e.target),id=e.target.id?e.target.id:"";stringToUTF8(nodeName,JSEvents.focusEvent+0,128),stringToUTF8(id,JSEvents.focusEvent+128,128);Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.focusEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},tick:function(){return window.performance&&window.performance.now?window.performance.now():Date.now()},registerDeviceOrientationEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.deviceOrientationEvent||(JSEvents.deviceOrientationEvent=_malloc(40));var eventHandler={target:JSEvents.findEventTarget(target),allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;HEAPF64[JSEvents.deviceOrientationEvent>>3]=JSEvents.tick(),HEAPF64[JSEvents.deviceOrientationEvent+8>>3]=e.alpha,HEAPF64[JSEvents.deviceOrientationEvent+16>>3]=e.beta,HEAPF64[JSEvents.deviceOrientationEvent+24>>3]=e.gamma,HEAP32[JSEvents.deviceOrientationEvent+32>>2]=e.absolute;Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.deviceOrientationEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},registerDeviceMotionEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.deviceMotionEvent||(JSEvents.deviceMotionEvent=_malloc(80));var eventHandler={target:JSEvents.findEventTarget(target),allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;HEAPF64[JSEvents.deviceMotionEvent>>3]=JSEvents.tick(),HEAPF64[JSEvents.deviceMotionEvent+8>>3]=e.acceleration.x,HEAPF64[JSEvents.deviceMotionEvent+16>>3]=e.acceleration.y,HEAPF64[JSEvents.deviceMotionEvent+24>>3]=e.acceleration.z,HEAPF64[JSEvents.deviceMotionEvent+32>>3]=e.accelerationIncludingGravity.x,HEAPF64[JSEvents.deviceMotionEvent+40>>3]=e.accelerationIncludingGravity.y,HEAPF64[JSEvents.deviceMotionEvent+48>>3]=e.accelerationIncludingGravity.z,HEAPF64[JSEvents.deviceMotionEvent+56>>3]=e.rotationRate.alpha,HEAPF64[JSEvents.deviceMotionEvent+64>>3]=e.rotationRate.beta,HEAPF64[JSEvents.deviceMotionEvent+72>>3]=e.rotationRate.gamma;Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.deviceMotionEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},screenOrientation:function(){if(window.screen)return window.screen.orientation||window.screen.mozOrientation||window.screen.webkitOrientation||window.screen.msOrientation},fillOrientationChangeEventData:function(eventStruct,e){var orientations2=["portrait","portrait","landscape","landscape"],orientationString=JSEvents.screenOrientation(),orientation=["portrait-primary","portrait-secondary","landscape-primary","landscape-secondary"].indexOf(orientationString);-1==orientation&&(orientation=orientations2.indexOf(orientationString)),HEAP32[eventStruct>>2]=1<>2]=window.orientation},registerOrientationChangeEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.orientationChangeEvent||(JSEvents.orientationChangeEvent=_malloc(8)),target=target?JSEvents.findEventTarget(target):window.screen;"orientationchange"==eventTypeString&&void 0!==window.screen.mozOrientation&&(eventTypeString="mozorientationchange");var eventHandler={target:target,allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;JSEvents.fillOrientationChangeEventData(JSEvents.orientationChangeEvent,e);Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.orientationChangeEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},fullscreenEnabled:function(){return document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled||document.msFullscreenEnabled},fillFullscreenChangeEventData:function(eventStruct,e){var fullscreenElement=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement,isFullscreen=!!fullscreenElement;HEAP32[eventStruct>>2]=isFullscreen,HEAP32[eventStruct+4>>2]=JSEvents.fullscreenEnabled();var reportedElement=isFullscreen?fullscreenElement:JSEvents.previousFullscreenElement,nodeName=JSEvents.getNodeNameForTarget(reportedElement),id=reportedElement&&reportedElement.id?reportedElement.id:"";stringToUTF8(nodeName,eventStruct+8,128),stringToUTF8(id,eventStruct+136,128),HEAP32[eventStruct+264>>2]=reportedElement?reportedElement.clientWidth:0,HEAP32[eventStruct+268>>2]=reportedElement?reportedElement.clientHeight:0,HEAP32[eventStruct+272>>2]=screen.width,HEAP32[eventStruct+276>>2]=screen.height,isFullscreen&&(JSEvents.previousFullscreenElement=fullscreenElement)},registerFullscreenChangeEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.fullscreenChangeEvent||(JSEvents.fullscreenChangeEvent=_malloc(280));var eventHandler={target:target=target?JSEvents.findEventTarget(target):document,allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;JSEvents.fillFullscreenChangeEventData(JSEvents.fullscreenChangeEvent,e);Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.fullscreenChangeEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},resizeCanvasForFullscreen:function(target,strategy){var restoreOldStyle=__registerRestoreOldStyle(target),cssWidth=strategy.softFullscreen?window.innerWidth:screen.width,cssHeight=strategy.softFullscreen?window.innerHeight:screen.height,rect=target.getBoundingClientRect(),windowedCssWidth=rect.right-rect.left,windowedCssHeight=rect.bottom-rect.top,windowedRttWidth=target.width,windowedRttHeight=target.height;if(3==strategy.scaleMode)__setLetterbox(target,(cssHeight-windowedCssHeight)/2,(cssWidth-windowedCssWidth)/2),cssWidth=windowedCssWidth,cssHeight=windowedCssHeight;else if(2==strategy.scaleMode)if(cssWidth*windowedRttHeight>2]=isPointerlocked;var nodeName=JSEvents.getNodeNameForTarget(pointerLockElement),id=pointerLockElement&&pointerLockElement.id?pointerLockElement.id:"";stringToUTF8(nodeName,eventStruct+4,128),stringToUTF8(id,eventStruct+132,128)},registerPointerlockChangeEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.pointerlockChangeEvent||(JSEvents.pointerlockChangeEvent=_malloc(260));var eventHandler={target:target=target?JSEvents.findEventTarget(target):document,allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;JSEvents.fillPointerlockChangeEventData(JSEvents.pointerlockChangeEvent,e);Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.pointerlockChangeEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},registerPointerlockErrorEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){var eventHandler={target:target=target?JSEvents.findEventTarget(target):document,allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;Module.dynCall_iiii(callbackfunc,eventTypeId,0,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},requestPointerLock:function(target){if(target.requestPointerLock)target.requestPointerLock();else if(target.mozRequestPointerLock)target.mozRequestPointerLock();else if(target.webkitRequestPointerLock)target.webkitRequestPointerLock();else{if(!target.msRequestPointerLock)return document.body.requestPointerLock||document.body.mozRequestPointerLock||document.body.webkitRequestPointerLock||document.body.msRequestPointerLock?-3:-1;target.msRequestPointerLock()}return 0},fillVisibilityChangeEventData:function(eventStruct,e){var visibilityState=["hidden","visible","prerender","unloaded"].indexOf(document.visibilityState);HEAP32[eventStruct>>2]=document.hidden,HEAP32[eventStruct+4>>2]=visibilityState},registerVisibilityChangeEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.visibilityChangeEvent||(JSEvents.visibilityChangeEvent=_malloc(8));var eventHandler={target:target=target?JSEvents.findEventTarget(target):document,allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;JSEvents.fillVisibilityChangeEventData(JSEvents.visibilityChangeEvent,e);Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.visibilityChangeEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},registerTouchEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.touchEvent||(JSEvents.touchEvent=_malloc(1684));var eventHandler={target:target=JSEvents.findEventTarget(target),allowsDeferredCalls:"touchstart"==eventTypeString||"touchend"==eventTypeString,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){for(var e=event||window.event,touches={},i=0;i>2]=e.ctrlKey,HEAP32[ptr+8>>2]=e.shiftKey,HEAP32[ptr+12>>2]=e.altKey,HEAP32[ptr+16>>2]=e.metaKey,ptr+=20;var canvasRect=Module.canvas?Module.canvas.getBoundingClientRect():void 0,targetRect=JSEvents.getBoundingClientRectOrZeros(target),numTouches=0;for(var i in touches){var t=touches[i];if(HEAP32[ptr>>2]=t.identifier,HEAP32[ptr+4>>2]=t.screenX,HEAP32[ptr+8>>2]=t.screenY,HEAP32[ptr+12>>2]=t.clientX,HEAP32[ptr+16>>2]=t.clientY,HEAP32[ptr+20>>2]=t.pageX,HEAP32[ptr+24>>2]=t.pageY,HEAP32[ptr+28>>2]=t.changed,HEAP32[ptr+32>>2]=t.onTarget,canvasRect?(HEAP32[ptr+44>>2]=t.clientX-canvasRect.left,HEAP32[ptr+48>>2]=t.clientY-canvasRect.top):(HEAP32[ptr+44>>2]=0,HEAP32[ptr+48>>2]=0),HEAP32[ptr+36>>2]=t.clientX-targetRect.left,HEAP32[ptr+40>>2]=t.clientY-targetRect.top,ptr+=52,++numTouches>=32)break}HEAP32[JSEvents.touchEvent>>2]=numTouches;Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.touchEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},fillGamepadEventData:function(eventStruct,e){HEAPF64[eventStruct>>3]=e.timestamp;for(var i=0;i>3]=e.axes[i];for(i=0;i>3]=e.buttons[i].value:HEAPF64[eventStruct+8*i+528>>3]=e.buttons[i];for(i=0;i>2]=e.buttons[i].pressed:HEAP32[eventStruct+4*i+1040>>2]=1==e.buttons[i];HEAP32[eventStruct+1296>>2]=e.connected,HEAP32[eventStruct+1300>>2]=e.index,HEAP32[eventStruct+8>>2]=e.axes.length,HEAP32[eventStruct+12>>2]=e.buttons.length,stringToUTF8(e.id,eventStruct+1304,64),stringToUTF8(e.mapping,eventStruct+1368,64)},registerGamepadEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.gamepadEvent||(JSEvents.gamepadEvent=_malloc(1432));var eventHandler={target:JSEvents.findEventTarget(target),allowsDeferredCalls:!0,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;JSEvents.fillGamepadEventData(JSEvents.gamepadEvent,e.gamepad);Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.gamepadEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},registerBeforeUnloadEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){var eventHandler={target:JSEvents.findEventTarget(target),allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event,confirmationMessage=Module.dynCall_iiii(callbackfunc,eventTypeId,0,userData);if(confirmationMessage&&(confirmationMessage=Pointer_stringify(confirmationMessage)),confirmationMessage)return e.preventDefault(),e.returnValue=confirmationMessage,confirmationMessage},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},battery:function(){return navigator.battery||navigator.mozBattery||navigator.webkitBattery},fillBatteryEventData:function(eventStruct,e){HEAPF64[eventStruct>>3]=e.chargingTime,HEAPF64[eventStruct+8>>3]=e.dischargingTime,HEAPF64[eventStruct+16>>3]=e.level,HEAP32[eventStruct+24>>2]=e.charging},registerBatteryEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){JSEvents.batteryEvent||(JSEvents.batteryEvent=_malloc(32));var eventHandler={target:JSEvents.findEventTarget(target),allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;JSEvents.fillBatteryEventData(JSEvents.batteryEvent,JSEvents.battery());Module.dynCall_iiii(callbackfunc,eventTypeId,JSEvents.batteryEvent,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)},registerWebGlEventCallback:function(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString){target||(target=Module.canvas);var eventHandler={target:JSEvents.findEventTarget(target),allowsDeferredCalls:!1,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:function(event){var e=event||window.event;Module.dynCall_iiii(callbackfunc,eventTypeId,0,userData)&&e.preventDefault()},useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}},SYSCALLS={varargs:0,get:function(varargs){SYSCALLS.varargs+=4;return HEAP32[SYSCALLS.varargs-4>>2]},getStr:function(){return Pointer_stringify(SYSCALLS.get())},get64:function(){var low=SYSCALLS.get(),high=SYSCALLS.get();return assert(low>=0?0===high:-1===high),low},getZero:function(){assert(0===SYSCALLS.get())}},EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){if(EXCEPTIONS.infos[ptr].adjusted===adjusted)return ptr}return adjusted},addRef:function(ptr){if(ptr){EXCEPTIONS.infos[ptr].refcount++}},decRef:function(ptr){if(ptr){var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0),info.refcount--,0!==info.refcount||info.rethrown||(info.destructor&&Module.dynCall_vi(info.destructor,ptr),delete EXCEPTIONS.infos[ptr],___cxa_free_exception(ptr))}},clearRef:function(ptr){if(ptr){EXCEPTIONS.infos[ptr].refcount=0}}},GLctx;GL.init(),JSEvents.staticInit(),__ATEXIT__.push(function(){var fflush=Module._fflush;fflush&&fflush(0);var printChar=___syscall146.printChar;if(printChar){var buffers=___syscall146.buffers;buffers[1].length&&printChar(1,10),buffers[2].length&&printChar(2,10)}}),DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC),STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP),STACK_MAX=STACK_BASE+TOTAL_STACK,DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX),HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE,staticSealed=!0,Module.wasmTableSize=34,Module.wasmMaxTableSize=34,Module.asmGlobalArg={Math:Math,Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array,NaN:NaN,Infinity:1/0,byteLength:byteLength},Module.asmLibraryArg={abort:abort,assert:assert,enlargeMemory:enlargeMemory,getTotalMemory:getTotalMemory,abortOnCannotGrowMemory:abortOnCannotGrowMemory,invoke_iiii:invoke_iiii,invoke_viiiii:invoke_viiiii,invoke_vi:invoke_vi,invoke_ii:invoke_ii,invoke_v:invoke_v,invoke_viiiiii:invoke_viiiiii,invoke_viiii:invoke_viiii,_glUseProgram:_glUseProgram,_glVertexAttribPointer:_glVertexAttribPointer,_pthread_key_create:_pthread_key_create,_abort:_abort,_glValidateProgram:_glValidateProgram,emscriptenWebGLComputeImageSize:emscriptenWebGLComputeImageSize,_emscripten_webgl_create_context:_emscripten_webgl_create_context,___gxx_personality_v0:___gxx_personality_v0,_llvm_stackrestore:_llvm_stackrestore,__ZSt18uncaught_exceptionv:__ZSt18uncaught_exceptionv,_glBindBuffer:_glBindBuffer,_glGetShaderInfoLog:_glGetShaderInfoLog,_glViewport:_glViewport,_glBindTexture:_glBindTexture,___setErrNo:___setErrNo,_glGetUniformLocation:_glGetUniformLocation,_glGetAttribLocation:_glGetAttribLocation,_glClear:_glClear,_emscripten_memcpy_big:_emscripten_memcpy_big,___resumeException:___resumeException,___cxa_find_matching_catch:___cxa_find_matching_catch,_glUniform1i:_glUniform1i,_glActiveTexture:_glActiveTexture,___cxa_begin_catch:___cxa_begin_catch,_pthread_getspecific:_pthread_getspecific,_glBindAttribLocation:_glBindAttribLocation,_glCreateShader:_glCreateShader,_glShaderSource:_glShaderSource,_emscripten_webgl_destroy_context:_emscripten_webgl_destroy_context,_llvm_stacksave:_llvm_stacksave,_pthread_once:_pthread_once,_glGenTextures:_glGenTextures,___syscall54:___syscall54,_glDrawElements:_glDrawElements,_emscripten_webgl_make_context_current:_emscripten_webgl_make_context_current,_glGenBuffers:_glGenBuffers,_glAttachShader:_glAttachShader,_pthread_setspecific:_pthread_setspecific,_glCreateProgram:_glCreateProgram,_glCompileShader:_glCompileShader,emscriptenWebGLGetShiftForType:emscriptenWebGLGetShiftForType,_glLinkProgram:_glLinkProgram,emscriptenWebGLGetTexPixelData:emscriptenWebGLGetTexPixelData,___syscall6:___syscall6,_emscripten_asm_const_i:_emscripten_asm_const_i,_glTexParameteri:_glTexParameteri,_glBufferData:_glBufferData,_glGetShaderiv:_glGetShaderiv,_glTexImage2D:_glTexImage2D,___syscall140:___syscall140,_glUniform1f:_glUniform1f,emscriptenWebGLGetHeapForType:emscriptenWebGLGetHeapForType,_glEnableVertexAttribArray:_glEnableVertexAttribArray,___syscall146:___syscall146,DYNAMICTOP_PTR:DYNAMICTOP_PTR,tempDoublePtr:tempDoublePtr,ABORT:ABORT,STACKTOP:STACKTOP,STACK_MAX:STACK_MAX};var asm=Module.asm(Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module.asm=asm;var _llvm_bswap_i32=Module._llvm_bswap_i32=function(){return Module.asm._llvm_bswap_i32.apply(null,arguments)},_main=Module._main=function(){return Module.asm._main.apply(null,arguments)},setThrew=Module.setThrew=function(){return Module.asm.setThrew.apply(null,arguments)},_loadTexture=Module._loadTexture=function(){return Module.asm._loadTexture.apply(null,arguments)},__GLOBAL__sub_I_emscripten_cpp=Module.__GLOBAL__sub_I_emscripten_cpp=function(){return Module.asm.__GLOBAL__sub_I_emscripten_cpp.apply(null,arguments)},___cxa_is_pointer_type=Module.___cxa_is_pointer_type=function(){return Module.asm.___cxa_is_pointer_type.apply(null,arguments)},___errno_location=Module.___errno_location=function(){return Module.asm.___errno_location.apply(null,arguments)},_memset=Module._memset=function(){return Module.asm._memset.apply(null,arguments)},_sbrk=Module._sbrk=function(){return Module.asm._sbrk.apply(null,arguments)},_memcpy=Module._memcpy=function(){return Module.asm._memcpy.apply(null,arguments)},stackAlloc=Module.stackAlloc=function(){return Module.asm.stackAlloc.apply(null,arguments)},getTempRet0=Module.getTempRet0=function(){return Module.asm.getTempRet0.apply(null,arguments)},setTempRet0=Module.setTempRet0=function(){return Module.asm.setTempRet0.apply(null,arguments)},_detectEdges=Module._detectEdges=function(){return Module.asm._detectEdges.apply(null,arguments)},_emscripten_get_global_libc=Module._emscripten_get_global_libc=function(){return Module.asm._emscripten_get_global_libc.apply(null,arguments)},_createContext=Module._createContext=function(){return Module.asm._createContext.apply(null,arguments)},stackSave=Module.stackSave=function(){return Module.asm.stackSave.apply(null,arguments)},___cxa_can_catch=Module.___cxa_can_catch=function(){return Module.asm.___cxa_can_catch.apply(null,arguments)},_free=Module._free=function(){return Module.asm._free.apply(null,arguments)},runPostSets=Module.runPostSets=function(){return Module.asm.runPostSets.apply(null,arguments)},_clearContexts=Module._clearContexts=function(){return Module.asm._clearContexts.apply(null,arguments)},stackRestore=Module.stackRestore=function(){return Module.asm.stackRestore.apply(null,arguments)},_malloc=Module._malloc=function(){return Module.asm._malloc.apply(null,arguments)},establishStackSpace=Module.establishStackSpace=function(){return Module.asm.establishStackSpace.apply(null,arguments)},_emscripten_replace_memory=Module._emscripten_replace_memory=function(){return Module.asm._emscripten_replace_memory.apply(null,arguments)},dynCall_iiii=Module.dynCall_iiii=function(){return Module.asm.dynCall_iiii.apply(null,arguments)},dynCall_viiiii=Module.dynCall_viiiii=function(){return Module.asm.dynCall_viiiii.apply(null,arguments)},dynCall_vi=Module.dynCall_vi=function(){return Module.asm.dynCall_vi.apply(null,arguments)},dynCall_ii=Module.dynCall_ii=function(){return Module.asm.dynCall_ii.apply(null,arguments)},dynCall_v=Module.dynCall_v=function(){return Module.asm.dynCall_v.apply(null,arguments)},dynCall_viiiiii=Module.dynCall_viiiiii=function(){return Module.asm.dynCall_viiiiii.apply(null,arguments)},dynCall_viiii=Module.dynCall_viiii=function(){return Module.asm.dynCall_viiii.apply(null,arguments)};if(Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm,memoryInitializer)if("function"==typeof Module.locateFile?memoryInitializer=Module.locateFile(memoryInitializer):Module.memoryInitializerPrefixURL&&(memoryInitializer=Module.memoryInitializerPrefixURL+memoryInitializer),ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module.readBinary(memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=function(data){data.byteLength&&(data=new Uint8Array(data)),HEAPU8.set(data,Runtime.GLOBAL_BASE),Module.memoryInitializerRequest&&delete Module.memoryInitializerRequest.response,removeRunDependency("memory initializer")};function doBrowserLoad(){Module.readAsync(memoryInitializer,applyMemoryInitializer,function(){throw"could not load memory initializer "+memoryInitializer})}if(Module.memoryInitializerRequest){function useRequest(){var request=Module.memoryInitializerRequest;if(200!==request.status&&0!==request.status)return console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer),void doBrowserLoad();applyMemoryInitializer(request.response)}Module.memoryInitializerRequest.response?setTimeout(useRequest,0):Module.memoryInitializerRequest.addEventListener("load",useRequest)}else doBrowserLoad()}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function runCaller(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=runCaller)},Module.callMain=Module.callMain=function(args){function pad(){for(var i=0;i<3;i++)argv.push(0)}args=args||[],ensureInitRuntime();var argc=args.length+1,argv=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),Module.noExitRuntime=!0,run(); -------------------------------------------------------------------------------- /dist/appWASM.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DanRuta/webassembly-webgl-shaders/c21f88f2166ae32e1ea5c1e31c35b62f3cf36780/dist/appWASM.wasm -------------------------------------------------------------------------------- /gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = grunt => { 2 | grunt.initConfig({ 3 | 4 | uglify: { 5 | my_target: { 6 | options: { 7 | sourceMap: false, 8 | mangle: false, 9 | }, 10 | files: { 11 | "dist/appWASM.js" : ["dist/appWASM.js"] 12 | } 13 | } 14 | }, 15 | 16 | exec: { 17 | build: "C:/emsdk/emsdk_env.bat & echo Building... & emcc -o ./dist/appWASM.js ./dev/cpp/emscripten.cpp -O3 -s ALLOW_MEMORY_GROWTH=1 -s USE_WEBGL2=1 -s WASM=1 -s NO_EXIT_RUNTIME=1 -std=c++1z" 18 | }, 19 | 20 | watch: { 21 | cpp: { 22 | files: ["dev/cpp/*.cpp", "dev/cpp/*.h"], 23 | tasks: ["exec:build", "uglify"] 24 | } 25 | } 26 | }) 27 | 28 | grunt.loadNpmTasks("grunt-contrib-watch") 29 | grunt.loadNpmTasks('grunt-contrib-uglify') 30 | grunt.loadNpmTasks("grunt-exec") 31 | 32 | grunt.registerTask("default", ["watch"]) 33 | } -------------------------------------------------------------------------------- /image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DanRuta/webassembly-webgl-shaders/c21f88f2166ae32e1ea5c1e31c35b62f3cf36780/image.png -------------------------------------------------------------------------------- /image2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DanRuta/webassembly-webgl-shaders/c21f88f2166ae32e1ea5c1e31c35b62f3cf36780/image2.jpg -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | WebAssembly WebGL Shaders 5 | 6 | 7 | 69 | 70 | 71 | 72 | 73 | 74 |
75 |
76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webassembly-webgl-shaders", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 11 | "dev": true 12 | }, 13 | "ansi-regex": { 14 | "version": "2.1.1", 15 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 16 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 17 | "dev": true 18 | }, 19 | "ansi-styles": { 20 | "version": "2.2.1", 21 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 22 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 23 | "dev": true 24 | }, 25 | "argparse": { 26 | "version": "1.0.9", 27 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 28 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 29 | "dev": true, 30 | "requires": { 31 | "sprintf-js": "1.0.3" 32 | } 33 | }, 34 | "array-find-index": { 35 | "version": "1.0.2", 36 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 37 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", 38 | "dev": true 39 | }, 40 | "async": { 41 | "version": "1.5.2", 42 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 43 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 44 | "dev": true 45 | }, 46 | "balanced-match": { 47 | "version": "1.0.0", 48 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 49 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 50 | "dev": true 51 | }, 52 | "body-parser": { 53 | "version": "1.14.2", 54 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", 55 | "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", 56 | "dev": true, 57 | "requires": { 58 | "bytes": "2.2.0", 59 | "content-type": "1.0.4", 60 | "debug": "2.2.0", 61 | "depd": "1.1.1", 62 | "http-errors": "1.3.1", 63 | "iconv-lite": "0.4.13", 64 | "on-finished": "2.3.0", 65 | "qs": "5.2.0", 66 | "raw-body": "2.1.7", 67 | "type-is": "1.6.15" 68 | }, 69 | "dependencies": { 70 | "iconv-lite": { 71 | "version": "0.4.13", 72 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", 73 | "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", 74 | "dev": true 75 | }, 76 | "qs": { 77 | "version": "5.2.0", 78 | "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", 79 | "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", 80 | "dev": true 81 | } 82 | } 83 | }, 84 | "brace-expansion": { 85 | "version": "1.1.8", 86 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 87 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 88 | "dev": true, 89 | "requires": { 90 | "balanced-match": "1.0.0", 91 | "concat-map": "0.0.1" 92 | } 93 | }, 94 | "browserify-zlib": { 95 | "version": "0.1.4", 96 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", 97 | "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", 98 | "dev": true, 99 | "requires": { 100 | "pako": "0.2.9" 101 | } 102 | }, 103 | "builtin-modules": { 104 | "version": "1.1.1", 105 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 106 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 107 | "dev": true 108 | }, 109 | "bytes": { 110 | "version": "2.2.0", 111 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", 112 | "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", 113 | "dev": true 114 | }, 115 | "camelcase": { 116 | "version": "2.1.1", 117 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 118 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", 119 | "dev": true 120 | }, 121 | "camelcase-keys": { 122 | "version": "2.1.0", 123 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 124 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 125 | "dev": true, 126 | "requires": { 127 | "camelcase": "2.1.1", 128 | "map-obj": "1.0.1" 129 | } 130 | }, 131 | "chalk": { 132 | "version": "1.1.3", 133 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 134 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 135 | "dev": true, 136 | "requires": { 137 | "ansi-styles": "2.2.1", 138 | "escape-string-regexp": "1.0.5", 139 | "has-ansi": "2.0.0", 140 | "strip-ansi": "3.0.1", 141 | "supports-color": "2.0.0" 142 | } 143 | }, 144 | "coffee-script": { 145 | "version": "1.10.0", 146 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", 147 | "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA=", 148 | "dev": true 149 | }, 150 | "colors": { 151 | "version": "1.1.2", 152 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 153 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", 154 | "dev": true 155 | }, 156 | "commander": { 157 | "version": "2.12.2", 158 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", 159 | "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", 160 | "dev": true 161 | }, 162 | "concat-map": { 163 | "version": "0.0.1", 164 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 165 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 166 | "dev": true 167 | }, 168 | "concat-stream": { 169 | "version": "1.6.0", 170 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 171 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 172 | "dev": true, 173 | "requires": { 174 | "inherits": "2.0.3", 175 | "readable-stream": "2.3.3", 176 | "typedarray": "0.0.6" 177 | } 178 | }, 179 | "content-type": { 180 | "version": "1.0.4", 181 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 182 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 183 | "dev": true 184 | }, 185 | "core-util-is": { 186 | "version": "1.0.2", 187 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 188 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 189 | "dev": true 190 | }, 191 | "currently-unhandled": { 192 | "version": "0.4.1", 193 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 194 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 195 | "dev": true, 196 | "requires": { 197 | "array-find-index": "1.0.2" 198 | } 199 | }, 200 | "dateformat": { 201 | "version": "1.0.12", 202 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", 203 | "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", 204 | "dev": true, 205 | "requires": { 206 | "get-stdin": "4.0.1", 207 | "meow": "3.7.0" 208 | } 209 | }, 210 | "debug": { 211 | "version": "2.2.0", 212 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 213 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 214 | "dev": true, 215 | "requires": { 216 | "ms": "0.7.1" 217 | } 218 | }, 219 | "decamelize": { 220 | "version": "1.2.0", 221 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 222 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 223 | "dev": true 224 | }, 225 | "depd": { 226 | "version": "1.1.1", 227 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 228 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", 229 | "dev": true 230 | }, 231 | "ee-first": { 232 | "version": "1.1.1", 233 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 234 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 235 | "dev": true 236 | }, 237 | "error-ex": { 238 | "version": "1.3.1", 239 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 240 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 241 | "dev": true, 242 | "requires": { 243 | "is-arrayish": "0.2.1" 244 | } 245 | }, 246 | "escape-string-regexp": { 247 | "version": "1.0.5", 248 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 249 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 250 | "dev": true 251 | }, 252 | "esprima": { 253 | "version": "2.7.3", 254 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 255 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 256 | "dev": true 257 | }, 258 | "eventemitter2": { 259 | "version": "0.4.14", 260 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 261 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", 262 | "dev": true 263 | }, 264 | "exit": { 265 | "version": "0.1.2", 266 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 267 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 268 | "dev": true 269 | }, 270 | "faye-websocket": { 271 | "version": "0.10.0", 272 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", 273 | "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", 274 | "dev": true, 275 | "requires": { 276 | "websocket-driver": "0.7.0" 277 | } 278 | }, 279 | "figures": { 280 | "version": "1.7.0", 281 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 282 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 283 | "dev": true, 284 | "requires": { 285 | "escape-string-regexp": "1.0.5", 286 | "object-assign": "4.1.1" 287 | } 288 | }, 289 | "find-up": { 290 | "version": "1.1.2", 291 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 292 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 293 | "dev": true, 294 | "requires": { 295 | "path-exists": "2.1.0", 296 | "pinkie-promise": "2.0.1" 297 | } 298 | }, 299 | "findup-sync": { 300 | "version": "0.3.0", 301 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", 302 | "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", 303 | "dev": true, 304 | "requires": { 305 | "glob": "5.0.15" 306 | }, 307 | "dependencies": { 308 | "glob": { 309 | "version": "5.0.15", 310 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 311 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 312 | "dev": true, 313 | "requires": { 314 | "inflight": "1.0.6", 315 | "inherits": "2.0.3", 316 | "minimatch": "3.0.4", 317 | "once": "1.4.0", 318 | "path-is-absolute": "1.0.1" 319 | } 320 | } 321 | } 322 | }, 323 | "fs.realpath": { 324 | "version": "1.0.0", 325 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 326 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 327 | "dev": true 328 | }, 329 | "gaze": { 330 | "version": "1.1.2", 331 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", 332 | "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", 333 | "dev": true, 334 | "requires": { 335 | "globule": "1.2.0" 336 | } 337 | }, 338 | "get-stdin": { 339 | "version": "4.0.1", 340 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 341 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 342 | "dev": true 343 | }, 344 | "getobject": { 345 | "version": "0.1.0", 346 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", 347 | "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", 348 | "dev": true 349 | }, 350 | "glob": { 351 | "version": "7.0.6", 352 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", 353 | "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", 354 | "dev": true, 355 | "requires": { 356 | "fs.realpath": "1.0.0", 357 | "inflight": "1.0.6", 358 | "inherits": "2.0.3", 359 | "minimatch": "3.0.4", 360 | "once": "1.4.0", 361 | "path-is-absolute": "1.0.1" 362 | } 363 | }, 364 | "globule": { 365 | "version": "1.2.0", 366 | "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", 367 | "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", 368 | "dev": true, 369 | "requires": { 370 | "glob": "7.1.2", 371 | "lodash": "4.17.4", 372 | "minimatch": "3.0.4" 373 | }, 374 | "dependencies": { 375 | "glob": { 376 | "version": "7.1.2", 377 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 378 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 379 | "dev": true, 380 | "requires": { 381 | "fs.realpath": "1.0.0", 382 | "inflight": "1.0.6", 383 | "inherits": "2.0.3", 384 | "minimatch": "3.0.4", 385 | "once": "1.4.0", 386 | "path-is-absolute": "1.0.1" 387 | } 388 | }, 389 | "lodash": { 390 | "version": "4.17.4", 391 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 392 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 393 | "dev": true 394 | } 395 | } 396 | }, 397 | "graceful-fs": { 398 | "version": "4.1.11", 399 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 400 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 401 | "dev": true 402 | }, 403 | "grunt": { 404 | "version": "1.0.1", 405 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz", 406 | "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=", 407 | "dev": true, 408 | "requires": { 409 | "coffee-script": "1.10.0", 410 | "dateformat": "1.0.12", 411 | "eventemitter2": "0.4.14", 412 | "exit": "0.1.2", 413 | "findup-sync": "0.3.0", 414 | "glob": "7.0.6", 415 | "grunt-cli": "1.2.0", 416 | "grunt-known-options": "1.1.0", 417 | "grunt-legacy-log": "1.0.0", 418 | "grunt-legacy-util": "1.0.0", 419 | "iconv-lite": "0.4.19", 420 | "js-yaml": "3.5.5", 421 | "minimatch": "3.0.4", 422 | "nopt": "3.0.6", 423 | "path-is-absolute": "1.0.1", 424 | "rimraf": "2.2.8" 425 | } 426 | }, 427 | "grunt-cli": { 428 | "version": "1.2.0", 429 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", 430 | "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", 431 | "dev": true, 432 | "requires": { 433 | "findup-sync": "0.3.0", 434 | "grunt-known-options": "1.1.0", 435 | "nopt": "3.0.6", 436 | "resolve": "1.1.7" 437 | } 438 | }, 439 | "grunt-contrib-uglify": { 440 | "version": "git://github.com/gruntjs/grunt-contrib-uglify.git#9315efca3bf977a35ce2f29ee34b00b14dafa171", 441 | "dev": true, 442 | "requires": { 443 | "chalk": "1.1.3", 444 | "maxmin": "1.1.0", 445 | "uglify-es": "3.2.2", 446 | "uri-path": "1.0.0" 447 | } 448 | }, 449 | "grunt-contrib-watch": { 450 | "version": "1.0.0", 451 | "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz", 452 | "integrity": "sha1-hKGnodar0m7VaEE0lscxM+mQAY8=", 453 | "dev": true, 454 | "requires": { 455 | "async": "1.5.2", 456 | "gaze": "1.1.2", 457 | "lodash": "3.10.1", 458 | "tiny-lr": "0.2.1" 459 | } 460 | }, 461 | "grunt-exec": { 462 | "version": "3.0.0", 463 | "resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-3.0.0.tgz", 464 | "integrity": "sha512-cgAlreXf3muSYS5LzW0Cc4xHK03BjFOYk0MqCQ/MZ3k1Xz2GU7D+IAJg4UKicxpO+XdONJdx/NJ6kpy2wI+uHg==", 465 | "dev": true 466 | }, 467 | "grunt-known-options": { 468 | "version": "1.1.0", 469 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", 470 | "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", 471 | "dev": true 472 | }, 473 | "grunt-legacy-log": { 474 | "version": "1.0.0", 475 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz", 476 | "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=", 477 | "dev": true, 478 | "requires": { 479 | "colors": "1.1.2", 480 | "grunt-legacy-log-utils": "1.0.0", 481 | "hooker": "0.2.3", 482 | "lodash": "3.10.1", 483 | "underscore.string": "3.2.3" 484 | } 485 | }, 486 | "grunt-legacy-log-utils": { 487 | "version": "1.0.0", 488 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", 489 | "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", 490 | "dev": true, 491 | "requires": { 492 | "chalk": "1.1.3", 493 | "lodash": "4.3.0" 494 | }, 495 | "dependencies": { 496 | "lodash": { 497 | "version": "4.3.0", 498 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", 499 | "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", 500 | "dev": true 501 | } 502 | } 503 | }, 504 | "grunt-legacy-util": { 505 | "version": "1.0.0", 506 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", 507 | "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", 508 | "dev": true, 509 | "requires": { 510 | "async": "1.5.2", 511 | "exit": "0.1.2", 512 | "getobject": "0.1.0", 513 | "hooker": "0.2.3", 514 | "lodash": "4.3.0", 515 | "underscore.string": "3.2.3", 516 | "which": "1.2.14" 517 | }, 518 | "dependencies": { 519 | "lodash": { 520 | "version": "4.3.0", 521 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", 522 | "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", 523 | "dev": true 524 | } 525 | } 526 | }, 527 | "gzip-size": { 528 | "version": "1.0.0", 529 | "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", 530 | "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", 531 | "dev": true, 532 | "requires": { 533 | "browserify-zlib": "0.1.4", 534 | "concat-stream": "1.6.0" 535 | } 536 | }, 537 | "has-ansi": { 538 | "version": "2.0.0", 539 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 540 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 541 | "dev": true, 542 | "requires": { 543 | "ansi-regex": "2.1.1" 544 | } 545 | }, 546 | "hooker": { 547 | "version": "0.2.3", 548 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 549 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", 550 | "dev": true 551 | }, 552 | "hosted-git-info": { 553 | "version": "2.5.0", 554 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", 555 | "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", 556 | "dev": true 557 | }, 558 | "http-errors": { 559 | "version": "1.3.1", 560 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", 561 | "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", 562 | "dev": true, 563 | "requires": { 564 | "inherits": "2.0.3", 565 | "statuses": "1.4.0" 566 | } 567 | }, 568 | "http-parser-js": { 569 | "version": "0.4.9", 570 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", 571 | "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", 572 | "dev": true 573 | }, 574 | "iconv-lite": { 575 | "version": "0.4.19", 576 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 577 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", 578 | "dev": true 579 | }, 580 | "indent-string": { 581 | "version": "2.1.0", 582 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 583 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 584 | "dev": true, 585 | "requires": { 586 | "repeating": "2.0.1" 587 | } 588 | }, 589 | "inflight": { 590 | "version": "1.0.6", 591 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 592 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 593 | "dev": true, 594 | "requires": { 595 | "once": "1.4.0", 596 | "wrappy": "1.0.2" 597 | } 598 | }, 599 | "inherits": { 600 | "version": "2.0.3", 601 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 602 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 603 | "dev": true 604 | }, 605 | "is-arrayish": { 606 | "version": "0.2.1", 607 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 608 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 609 | "dev": true 610 | }, 611 | "is-builtin-module": { 612 | "version": "1.0.0", 613 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 614 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 615 | "dev": true, 616 | "requires": { 617 | "builtin-modules": "1.1.1" 618 | } 619 | }, 620 | "is-finite": { 621 | "version": "1.0.2", 622 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 623 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 624 | "dev": true, 625 | "requires": { 626 | "number-is-nan": "1.0.1" 627 | } 628 | }, 629 | "is-utf8": { 630 | "version": "0.2.1", 631 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 632 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 633 | "dev": true 634 | }, 635 | "isarray": { 636 | "version": "1.0.0", 637 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 638 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 639 | "dev": true 640 | }, 641 | "isexe": { 642 | "version": "2.0.0", 643 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 644 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 645 | "dev": true 646 | }, 647 | "js-yaml": { 648 | "version": "3.5.5", 649 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", 650 | "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", 651 | "dev": true, 652 | "requires": { 653 | "argparse": "1.0.9", 654 | "esprima": "2.7.3" 655 | } 656 | }, 657 | "livereload-js": { 658 | "version": "2.2.2", 659 | "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz", 660 | "integrity": "sha1-bIclfmSKtHW8JOoldFftzB+NC8I=", 661 | "dev": true 662 | }, 663 | "load-json-file": { 664 | "version": "1.1.0", 665 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 666 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 667 | "dev": true, 668 | "requires": { 669 | "graceful-fs": "4.1.11", 670 | "parse-json": "2.2.0", 671 | "pify": "2.3.0", 672 | "pinkie-promise": "2.0.1", 673 | "strip-bom": "2.0.0" 674 | } 675 | }, 676 | "lodash": { 677 | "version": "3.10.1", 678 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 679 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 680 | "dev": true 681 | }, 682 | "loud-rejection": { 683 | "version": "1.6.0", 684 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 685 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 686 | "dev": true, 687 | "requires": { 688 | "currently-unhandled": "0.4.1", 689 | "signal-exit": "3.0.2" 690 | } 691 | }, 692 | "map-obj": { 693 | "version": "1.0.1", 694 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 695 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", 696 | "dev": true 697 | }, 698 | "maxmin": { 699 | "version": "1.1.0", 700 | "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", 701 | "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", 702 | "dev": true, 703 | "requires": { 704 | "chalk": "1.1.3", 705 | "figures": "1.7.0", 706 | "gzip-size": "1.0.0", 707 | "pretty-bytes": "1.0.4" 708 | } 709 | }, 710 | "media-typer": { 711 | "version": "0.3.0", 712 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 713 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 714 | "dev": true 715 | }, 716 | "meow": { 717 | "version": "3.7.0", 718 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 719 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 720 | "dev": true, 721 | "requires": { 722 | "camelcase-keys": "2.1.0", 723 | "decamelize": "1.2.0", 724 | "loud-rejection": "1.6.0", 725 | "map-obj": "1.0.1", 726 | "minimist": "1.2.0", 727 | "normalize-package-data": "2.4.0", 728 | "object-assign": "4.1.1", 729 | "read-pkg-up": "1.0.1", 730 | "redent": "1.0.0", 731 | "trim-newlines": "1.0.0" 732 | } 733 | }, 734 | "mime-db": { 735 | "version": "1.30.0", 736 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 737 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", 738 | "dev": true 739 | }, 740 | "mime-types": { 741 | "version": "2.1.17", 742 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 743 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 744 | "dev": true, 745 | "requires": { 746 | "mime-db": "1.30.0" 747 | } 748 | }, 749 | "minimatch": { 750 | "version": "3.0.4", 751 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 752 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 753 | "dev": true, 754 | "requires": { 755 | "brace-expansion": "1.1.8" 756 | } 757 | }, 758 | "minimist": { 759 | "version": "1.2.0", 760 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 761 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 762 | "dev": true 763 | }, 764 | "ms": { 765 | "version": "0.7.1", 766 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 767 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 768 | "dev": true 769 | }, 770 | "nopt": { 771 | "version": "3.0.6", 772 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 773 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 774 | "dev": true, 775 | "requires": { 776 | "abbrev": "1.1.1" 777 | } 778 | }, 779 | "normalize-package-data": { 780 | "version": "2.4.0", 781 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 782 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 783 | "dev": true, 784 | "requires": { 785 | "hosted-git-info": "2.5.0", 786 | "is-builtin-module": "1.0.0", 787 | "semver": "5.4.1", 788 | "validate-npm-package-license": "3.0.1" 789 | } 790 | }, 791 | "number-is-nan": { 792 | "version": "1.0.1", 793 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 794 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 795 | "dev": true 796 | }, 797 | "object-assign": { 798 | "version": "4.1.1", 799 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 800 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 801 | "dev": true 802 | }, 803 | "on-finished": { 804 | "version": "2.3.0", 805 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 806 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 807 | "dev": true, 808 | "requires": { 809 | "ee-first": "1.1.1" 810 | } 811 | }, 812 | "once": { 813 | "version": "1.4.0", 814 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 815 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 816 | "dev": true, 817 | "requires": { 818 | "wrappy": "1.0.2" 819 | } 820 | }, 821 | "pako": { 822 | "version": "0.2.9", 823 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 824 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", 825 | "dev": true 826 | }, 827 | "parse-json": { 828 | "version": "2.2.0", 829 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 830 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 831 | "dev": true, 832 | "requires": { 833 | "error-ex": "1.3.1" 834 | } 835 | }, 836 | "parseurl": { 837 | "version": "1.3.2", 838 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 839 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", 840 | "dev": true 841 | }, 842 | "path-exists": { 843 | "version": "2.1.0", 844 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 845 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 846 | "dev": true, 847 | "requires": { 848 | "pinkie-promise": "2.0.1" 849 | } 850 | }, 851 | "path-is-absolute": { 852 | "version": "1.0.1", 853 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 854 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 855 | "dev": true 856 | }, 857 | "path-type": { 858 | "version": "1.1.0", 859 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 860 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 861 | "dev": true, 862 | "requires": { 863 | "graceful-fs": "4.1.11", 864 | "pify": "2.3.0", 865 | "pinkie-promise": "2.0.1" 866 | } 867 | }, 868 | "pify": { 869 | "version": "2.3.0", 870 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 871 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 872 | "dev": true 873 | }, 874 | "pinkie": { 875 | "version": "2.0.4", 876 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 877 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 878 | "dev": true 879 | }, 880 | "pinkie-promise": { 881 | "version": "2.0.1", 882 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 883 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 884 | "dev": true, 885 | "requires": { 886 | "pinkie": "2.0.4" 887 | } 888 | }, 889 | "pretty-bytes": { 890 | "version": "1.0.4", 891 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", 892 | "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", 893 | "dev": true, 894 | "requires": { 895 | "get-stdin": "4.0.1", 896 | "meow": "3.7.0" 897 | } 898 | }, 899 | "process-nextick-args": { 900 | "version": "1.0.7", 901 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 902 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 903 | "dev": true 904 | }, 905 | "qs": { 906 | "version": "5.1.0", 907 | "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", 908 | "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", 909 | "dev": true 910 | }, 911 | "raw-body": { 912 | "version": "2.1.7", 913 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", 914 | "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", 915 | "dev": true, 916 | "requires": { 917 | "bytes": "2.4.0", 918 | "iconv-lite": "0.4.13", 919 | "unpipe": "1.0.0" 920 | }, 921 | "dependencies": { 922 | "bytes": { 923 | "version": "2.4.0", 924 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", 925 | "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", 926 | "dev": true 927 | }, 928 | "iconv-lite": { 929 | "version": "0.4.13", 930 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", 931 | "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", 932 | "dev": true 933 | } 934 | } 935 | }, 936 | "read-pkg": { 937 | "version": "1.1.0", 938 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 939 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 940 | "dev": true, 941 | "requires": { 942 | "load-json-file": "1.1.0", 943 | "normalize-package-data": "2.4.0", 944 | "path-type": "1.1.0" 945 | } 946 | }, 947 | "read-pkg-up": { 948 | "version": "1.0.1", 949 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 950 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 951 | "dev": true, 952 | "requires": { 953 | "find-up": "1.1.2", 954 | "read-pkg": "1.1.0" 955 | } 956 | }, 957 | "readable-stream": { 958 | "version": "2.3.3", 959 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 960 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 961 | "dev": true, 962 | "requires": { 963 | "core-util-is": "1.0.2", 964 | "inherits": "2.0.3", 965 | "isarray": "1.0.0", 966 | "process-nextick-args": "1.0.7", 967 | "safe-buffer": "5.1.1", 968 | "string_decoder": "1.0.3", 969 | "util-deprecate": "1.0.2" 970 | } 971 | }, 972 | "redent": { 973 | "version": "1.0.0", 974 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 975 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 976 | "dev": true, 977 | "requires": { 978 | "indent-string": "2.1.0", 979 | "strip-indent": "1.0.1" 980 | } 981 | }, 982 | "repeating": { 983 | "version": "2.0.1", 984 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 985 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 986 | "dev": true, 987 | "requires": { 988 | "is-finite": "1.0.2" 989 | } 990 | }, 991 | "resolve": { 992 | "version": "1.1.7", 993 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 994 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 995 | "dev": true 996 | }, 997 | "rimraf": { 998 | "version": "2.2.8", 999 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 1000 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", 1001 | "dev": true 1002 | }, 1003 | "safe-buffer": { 1004 | "version": "5.1.1", 1005 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1006 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1007 | "dev": true 1008 | }, 1009 | "semver": { 1010 | "version": "5.4.1", 1011 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 1012 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 1013 | "dev": true 1014 | }, 1015 | "signal-exit": { 1016 | "version": "3.0.2", 1017 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1018 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1019 | "dev": true 1020 | }, 1021 | "source-map": { 1022 | "version": "0.6.1", 1023 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1024 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1025 | "dev": true 1026 | }, 1027 | "spdx-correct": { 1028 | "version": "1.0.2", 1029 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 1030 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 1031 | "dev": true, 1032 | "requires": { 1033 | "spdx-license-ids": "1.2.2" 1034 | } 1035 | }, 1036 | "spdx-expression-parse": { 1037 | "version": "1.0.4", 1038 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 1039 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 1040 | "dev": true 1041 | }, 1042 | "spdx-license-ids": { 1043 | "version": "1.2.2", 1044 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 1045 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 1046 | "dev": true 1047 | }, 1048 | "sprintf-js": { 1049 | "version": "1.0.3", 1050 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1051 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1052 | "dev": true 1053 | }, 1054 | "statuses": { 1055 | "version": "1.4.0", 1056 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1057 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", 1058 | "dev": true 1059 | }, 1060 | "string_decoder": { 1061 | "version": "1.0.3", 1062 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1063 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1064 | "dev": true, 1065 | "requires": { 1066 | "safe-buffer": "5.1.1" 1067 | } 1068 | }, 1069 | "strip-ansi": { 1070 | "version": "3.0.1", 1071 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1072 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1073 | "dev": true, 1074 | "requires": { 1075 | "ansi-regex": "2.1.1" 1076 | } 1077 | }, 1078 | "strip-bom": { 1079 | "version": "2.0.0", 1080 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1081 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 1082 | "dev": true, 1083 | "requires": { 1084 | "is-utf8": "0.2.1" 1085 | } 1086 | }, 1087 | "strip-indent": { 1088 | "version": "1.0.1", 1089 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 1090 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 1091 | "dev": true, 1092 | "requires": { 1093 | "get-stdin": "4.0.1" 1094 | } 1095 | }, 1096 | "supports-color": { 1097 | "version": "2.0.0", 1098 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1099 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1100 | "dev": true 1101 | }, 1102 | "tiny-lr": { 1103 | "version": "0.2.1", 1104 | "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", 1105 | "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", 1106 | "dev": true, 1107 | "requires": { 1108 | "body-parser": "1.14.2", 1109 | "debug": "2.2.0", 1110 | "faye-websocket": "0.10.0", 1111 | "livereload-js": "2.2.2", 1112 | "parseurl": "1.3.2", 1113 | "qs": "5.1.0" 1114 | } 1115 | }, 1116 | "trim-newlines": { 1117 | "version": "1.0.0", 1118 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 1119 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", 1120 | "dev": true 1121 | }, 1122 | "type-is": { 1123 | "version": "1.6.15", 1124 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", 1125 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", 1126 | "dev": true, 1127 | "requires": { 1128 | "media-typer": "0.3.0", 1129 | "mime-types": "2.1.17" 1130 | } 1131 | }, 1132 | "typedarray": { 1133 | "version": "0.0.6", 1134 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1135 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1136 | "dev": true 1137 | }, 1138 | "uglify-es": { 1139 | "version": "3.2.2", 1140 | "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.2.2.tgz", 1141 | "integrity": "sha512-l+s5VLzFwGJfS+fbqaGf/Dfwo1MF13jLOF2ekL0PytzqEqQ6cVppvHf4jquqFok+35USMpKjqkYxy6pQyUcuug==", 1142 | "dev": true, 1143 | "requires": { 1144 | "commander": "2.12.2", 1145 | "source-map": "0.6.1" 1146 | } 1147 | }, 1148 | "underscore.string": { 1149 | "version": "3.2.3", 1150 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", 1151 | "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", 1152 | "dev": true 1153 | }, 1154 | "unpipe": { 1155 | "version": "1.0.0", 1156 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1157 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 1158 | "dev": true 1159 | }, 1160 | "uri-path": { 1161 | "version": "1.0.0", 1162 | "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", 1163 | "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", 1164 | "dev": true 1165 | }, 1166 | "util-deprecate": { 1167 | "version": "1.0.2", 1168 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1169 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1170 | "dev": true 1171 | }, 1172 | "validate-npm-package-license": { 1173 | "version": "3.0.1", 1174 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 1175 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 1176 | "dev": true, 1177 | "requires": { 1178 | "spdx-correct": "1.0.2", 1179 | "spdx-expression-parse": "1.0.4" 1180 | } 1181 | }, 1182 | "websocket-driver": { 1183 | "version": "0.7.0", 1184 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", 1185 | "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", 1186 | "dev": true, 1187 | "requires": { 1188 | "http-parser-js": "0.4.9", 1189 | "websocket-extensions": "0.1.3" 1190 | } 1191 | }, 1192 | "websocket-extensions": { 1193 | "version": "0.1.3", 1194 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", 1195 | "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", 1196 | "dev": true 1197 | }, 1198 | "which": { 1199 | "version": "1.2.14", 1200 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 1201 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", 1202 | "dev": true, 1203 | "requires": { 1204 | "isexe": "2.0.0" 1205 | } 1206 | }, 1207 | "wrappy": { 1208 | "version": "1.0.2", 1209 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1210 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1211 | "dev": true 1212 | } 1213 | } 1214 | } 1215 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webassembly-webgl-shaders", 3 | "version": "1.0.0", 4 | "description": "Demo project for using WebGL shaders in WebAssembly", 5 | "scripts": { 6 | "build": "rm -rf build && mkdir build && cd build && cmake -G\"MSYS Makefiles\" .. && npm install" 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/DanRuta/webassembly-webgl-shaders.git" 11 | }, 12 | "keywords": [], 13 | "author": "Dan Ruta", 14 | "license": "MIT", 15 | "directories": {}, 16 | "bugs": { 17 | "url": "https://github.com/DanRuta/webassembly-webgl-shaders/issues" 18 | }, 19 | "engines": { 20 | "node": ">= 8.4.0" 21 | }, 22 | "homepage": "https://github.com/DanRuta/webassembly-webgl-shaders#readme", 23 | "devDependencies": { 24 | "grunt": "^1.0.1", 25 | "grunt-cli": "^1.2.0", 26 | "grunt-contrib-uglify": "git://github.com/gruntjs/grunt-contrib-uglify.git#harmony", 27 | "grunt-contrib-watch": "^1.0.0", 28 | "grunt-exec": "^3.0.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | 3 | const http = require("http") 4 | const fs = require("fs") 5 | const url = require("url") 6 | 7 | http.createServer((request, response) => { 8 | 9 | let path = url.parse(request.url).pathname 10 | let data 11 | 12 | path = (path=="/"?"/index.html":path) 13 | 14 | console.log(path) 15 | 16 | if (path=="/appWASM.wasm") { 17 | path = "/dist"+path 18 | } 19 | 20 | try{ 21 | data = fs.readFileSync(__dirname+path) 22 | }catch(e){} 23 | 24 | response.end(data) 25 | 26 | }).listen(1337, () => console.log("Server listening on port 1337")) 27 | 28 | -------------------------------------------------------------------------------- /wasm-arrays.js: -------------------------------------------------------------------------------- 1 | "use strict";const ccallArrays=(r,e,a,t,{heapIn:A="HEAPF32",heapOut:s="HEAPF32",returnArraySize:n=1}={})=>{const l={};l.HEAP8=Int8Array,l.HEAPU8=Uint8Array,l.HEAP16=Int16Array,l.HEAPU16=Uint16Array,l.HEAP32=Int32Array,l.HEAPU32=Uint32Array,l.HEAPF32=Float32Array,l.HEAPF64=Float64Array;let u,c;a=a||[];const E="array"==e?"number":e,y=[],h=[],o=[];try{if(t)for(let r=0;r>1);break;case"HEAP32":case"HEAPU32":case"HEAPF32":Module[A].set(e,a>>2);break;case"HEAPF64":Module[A].set(e,a>>3)}o.push(a),y.push(a),y.push(t[r].length),h.push("number"),h.push("number")}else y.push(t[r]),h.push(void 0==a[r]?"number":a[r]);u=Module.ccall(r,E,h,y)}catch(r){c=r}finally{for(let r=0;rn=>ccallArrays(r,e,a,n,{heapIn:t,heapOut:A,returnArraySize:s});"undefined"==typeof window&&(exports.ccallArrays=ccallArrays,exports.cwrapArrays=((r,e,a,{heapIn:t="HEAPF32",heapOut:A="HEAPF32",returnArraySize:s=1}={})=>n=>ccallArrays(r,e,a,n,{heapIn:t,heapOut:A,returnArraySize:s}))); --------------------------------------------------------------------------------