summaryrefslogtreecommitdiffhomepage
path: root/games
diff options
context:
space:
mode:
authorRay <[email protected]>2018-11-30 01:59:14 +0100
committerRay <[email protected]>2018-11-30 01:59:14 +0100
commit3e98497003ff2ebcc6c03a3841d25f9677ec5212 (patch)
tree900cfccb5a3809c0c9a56f06927b343d1cc6268b /games
parent5c8e72685cb7a26381deb032dd1b9486e2ce2921 (diff)
downloadraylib.com-3e98497003ff2ebcc6c03a3841d25f9677ec5212.tar.gz
raylib.com-3e98497003ff2ebcc6c03a3841d25f9677ec5212.zip
Updated game
Diffstat (limited to 'games')
-rw-r--r--games/money.databin4514037 -> 4539143 bytes
-rw-r--r--games/money.html18
-rw-r--r--games/money.js3509
-rw-r--r--games/money.wasmbin358452 -> 941308 bytes
4 files changed, 1726 insertions, 1801 deletions
diff --git a/games/money.data b/games/money.data
index 337c3b7..b1ddc95 100644
--- a/games/money.data
+++ b/games/money.data
Binary files differ
diff --git a/games/money.html b/games/money.html
index 4e6aa1b..efc0242 100644
--- a/games/money.html
+++ b/games/money.html
@@ -159,6 +159,24 @@
<textarea id="output" rows="8"></textarea>
+ <script type='text/javascript' src="https://cdn.jsdelivr.net/gh/eligrey/FileSaver.js/dist/FileSaver.min.js"> </script>
+ <script type='text/javascript'>
+ function SaveFileFromMEMFSToDisk(memoryFSname, localFSname) // This can be called by C/C++ code
+ {
+ var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
+ var data = FS.readFile(memoryFSname);
+ var blob;
+
+ if (isSafari) blob = new Blob([data.buffer], {type: "application/octet-stream"});
+ else blob = new Blob([data.buffer], {type: "application/octet-binary"});
+
+ // NOTE: SaveAs Dialog is a browser setting. For example, in Google Chrome,
+ // in Settings/Advanced/Downloads section you have a setting:
+ // 'Ask where to save each file before downloading' - which you can set true/false.
+ // If you enable this setting it would always ask you and bring the SaveAs Dialog
+ saveAs(blob, localFSname);
+ }
+ </script>
<script type='text/javascript'>
var statusElement = document.getElementById('status');
var progressElement = document.getElementById('progress');
diff --git a/games/money.js b/games/money.js
index 8a20dbb..16c2014 100644
--- a/games/money.js
+++ b/games/money.js
@@ -192,7 +192,7 @@ Module['FS_createPath']('/resources', 'audio', true, true);
}
}
- loadPackage({"files": [{"start": 0, "audio": 0, "end": 94360, "filename": "/resources/answers_back.png"}, {"start": 94360, "audio": 0, "end": 1137122, "filename": "/resources/background.png"}, {"start": 1137122, "audio": 0, "end": 1165010, "filename": "/resources/helper_fifty.png"}, {"start": 1165010, "audio": 0, "end": 1192371, "filename": "/resources/helper_people.png"}, {"start": 1192371, "audio": 0, "end": 1220213, "filename": "/resources/helper_phone.png"}, {"start": 1220213, "audio": 0, "end": 1242287, "filename": "/resources/keepcalm.fnt"}, {"start": 1242287, "audio": 0, "end": 1335011, "filename": "/resources/keepcalm.png"}, {"start": 1335011, "audio": 0, "end": 1336298, "filename": "/resources/money_bars_off.png"}, {"start": 1336298, "audio": 0, "end": 1340296, "filename": "/resources/money_bars_on.png"}, {"start": 1340296, "audio": 0, "end": 1377541, "filename": "/resources/money_prize.png"}, {"start": 1377541, "audio": 0, "end": 1377734, "filename": "/resources/money_rec.png"}, {"start": 1377734, "audio": 0, "end": 1381231, "filename": "/resources/money_slider_back.png"}, {"start": 1381231, "audio": 0, "end": 1411403, "filename": "/resources/questions_back.png"}, {"start": 1411403, "audio": 0, "end": 1507150, "filename": "/resources/spinning_coin.png"}, {"start": 1507150, "audio": 0, "end": 1692559, "filename": "/resources/title_back.png"}, {"start": 1692559, "audio": 0, "end": 1704090, "filename": "/resources/title_boda.png"}, {"start": 1704090, "audio": 0, "end": 1724989, "filename": "/resources/title_menu_back.png"}, {"start": 1724989, "audio": 0, "end": 1776863, "filename": "/resources/title_pasta.png"}, {"start": 1776863, "audio": 1, "end": 1890839, "filename": "/resources/audio/checking.mp3"}, {"start": 1890839, "audio": 1, "end": 1949226, "filename": "/resources/audio/fail.mp3"}, {"start": 1949226, "audio": 1, "end": 3491651, "filename": "/resources/audio/game.mp3"}, {"start": 3491651, "audio": 1, "end": 3578877, "filename": "/resources/audio/interludio.mp3"}, {"start": 3578877, "audio": 1, "end": 4266785, "filename": "/resources/audio/main.mp3"}, {"start": 4266785, "audio": 1, "end": 4471950, "filename": "/resources/audio/perfect.mp3"}, {"start": 4471950, "audio": 1, "end": 4514037, "filename": "/resources/audio/success.mp3"}], "remote_package_size": 4514037, "package_uuid": "f100c444-786a-4c02-84f7-609c5f17e856"});
+ loadPackage({"files": [{"start": 0, "audio": 0, "end": 109416, "filename": "/resources/answers_back.png"}, {"start": 109416, "audio": 0, "end": 1152178, "filename": "/resources/background.png"}, {"start": 1152178, "audio": 0, "end": 1189423, "filename": "/resources/final_prize.png"}, {"start": 1189423, "audio": 0, "end": 1217311, "filename": "/resources/helper_fifty.png"}, {"start": 1217311, "audio": 0, "end": 1244672, "filename": "/resources/helper_people.png"}, {"start": 1244672, "audio": 0, "end": 1272514, "filename": "/resources/helper_phone.png"}, {"start": 1272514, "audio": 0, "end": 1294588, "filename": "/resources/keepcalm.fnt"}, {"start": 1294588, "audio": 0, "end": 1387312, "filename": "/resources/keepcalm.png"}, {"start": 1387312, "audio": 0, "end": 1387549, "filename": "/resources/qbar.png"}, {"start": 1387549, "audio": 0, "end": 1417721, "filename": "/resources/questions_back.png"}, {"start": 1417721, "audio": 0, "end": 1417960, "filename": "/resources/sbar.png"}, {"start": 1417960, "audio": 0, "end": 1422307, "filename": "/resources/slider_back.png"}, {"start": 1422307, "audio": 0, "end": 1422781, "filename": "/resources/slider_bar.png"}, {"start": 1422781, "audio": 0, "end": 1518528, "filename": "/resources/spinning_coin.png"}, {"start": 1518528, "audio": 0, "end": 1682737, "filename": "/resources/title_back.png"}, {"start": 1682737, "audio": 0, "end": 1694268, "filename": "/resources/title_boda.png"}, {"start": 1694268, "audio": 0, "end": 1715167, "filename": "/resources/title_menu_back.png"}, {"start": 1715167, "audio": 0, "end": 1797877, "filename": "/resources/title_pasta.png"}, {"start": 1797877, "audio": 0, "end": 1801969, "filename": "/resources/videogames.rqm"}, {"start": 1801969, "audio": 1, "end": 1915945, "filename": "/resources/audio/checking.mp3"}, {"start": 1915945, "audio": 1, "end": 1974332, "filename": "/resources/audio/fail.mp3"}, {"start": 1974332, "audio": 1, "end": 3516757, "filename": "/resources/audio/game.mp3"}, {"start": 3516757, "audio": 1, "end": 3603983, "filename": "/resources/audio/interludio.mp3"}, {"start": 3603983, "audio": 1, "end": 4291891, "filename": "/resources/audio/main.mp3"}, {"start": 4291891, "audio": 1, "end": 4497056, "filename": "/resources/audio/perfect.mp3"}, {"start": 4497056, "audio": 1, "end": 4539143, "filename": "/resources/audio/success.mp3"}], "remote_package_size": 4539143, "package_uuid": "e39678cc-1970-4e3e-aaf3-17d212dec3be"});
})();
@@ -545,6 +545,15 @@ function dynCall(sig, ptr, args) {
}
}
+var tempRet0 = 0;
+
+var setTempRet0 = function(value) {
+ tempRet0 = value;
+}
+
+var getTempRet0 = function() {
+ return tempRet0;
+}
var Runtime = {
@@ -1817,7 +1826,7 @@ function integrateWasmJS() {
// Provide an "asm.js function" for the application, called to "link" the asm.js module. We instantiate
// the wasm module at that time, and it receives imports and provides exports and so forth, the app
- // doesn't need to care that it is wasm or olyfilled wasm or asm.js.
+ // doesn't need to care that it is wasm or polyfilled wasm or asm.js.
Module['asm'] = function(global, env, providedBuffer) {
// import table
@@ -1862,16 +1871,54 @@ integrateWasmJS();
// === Body ===
-var ASM_CONSTS = [];
+var ASM_CONSTS = [function() { return screen.width; },
+ function() { return screen.height; },
+ function($0) { if (typeof Module['setWindowTitle'] !== 'undefined') { Module['setWindowTitle'](Module['Pointer_stringify']($0)); } return 0; },
+ function($0, $1, $2) { var w = $0; var h = $1; var pixels = $2; if (!Module['SDL2']) Module['SDL2'] = {}; var SDL2 = Module['SDL2']; if (SDL2.ctxCanvas !== Module['canvas']) { SDL2.ctx = Module['createContext'](Module['canvas'], false, true); SDL2.ctxCanvas = Module['canvas']; } if (SDL2.w !== w || SDL2.h !== h || SDL2.imageCtx !== SDL2.ctx) { SDL2.image = SDL2.ctx.createImageData(w, h); SDL2.w = w; SDL2.h = h; SDL2.imageCtx = SDL2.ctx; } var data = SDL2.image.data; var src = pixels >> 2; var dst = 0; var num; if (typeof CanvasPixelArray !== 'undefined' && data instanceof CanvasPixelArray) { num = data.length; while (dst < num) { var val = HEAP32[src]; data[dst ] = val & 0xff; data[dst+1] = (val >> 8) & 0xff; data[dst+2] = (val >> 16) & 0xff; data[dst+3] = 0xff; src++; dst += 4; } } else { if (SDL2.data32Data !== data) { SDL2.data32 = new Int32Array(data.buffer); SDL2.data8 = new Uint8Array(data.buffer); } var data32 = SDL2.data32; num = data32.length; data32.set(HEAP32.subarray(src, src + num)); var data8 = SDL2.data8; var i = 3; var j = i + 4*num; if (num % 8 == 0) { while (i < j) { data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; } } else { while (i < j) { data8[i] = 0xff; i = i + 4 | 0; } } } SDL2.ctx.putImageData(SDL2.image, 0, 0); return 0; },
+ function($0, $1, $2, $3, $4) { var w = $0; var h = $1; var hot_x = $2; var hot_y = $3; var pixels = $4; var canvas = document.createElement("canvas"); canvas.width = w; canvas.height = h; var ctx = canvas.getContext("2d"); var image = ctx.createImageData(w, h); var data = image.data; var src = pixels >> 2; var dst = 0; var num; if (typeof CanvasPixelArray !== 'undefined' && data instanceof CanvasPixelArray) { num = data.length; while (dst < num) { var val = HEAP32[src]; data[dst ] = val & 0xff; data[dst+1] = (val >> 8) & 0xff; data[dst+2] = (val >> 16) & 0xff; data[dst+3] = (val >> 24) & 0xff; src++; dst += 4; } } else { var data32 = new Int32Array(data.buffer); num = data32.length; data32.set(HEAP32.subarray(src, src + num)); } ctx.putImageData(image, 0, 0); var url = hot_x === 0 && hot_y === 0 ? "url(" + canvas.toDataURL() + "), auto" : "url(" + canvas.toDataURL() + ") " + hot_x + " " + hot_y + ", auto"; var urlBuf = _malloc(url.length + 1); stringToUTF8(url, urlBuf, url.length + 1); return urlBuf; },
+ function($0) { if (Module['canvas']) { Module['canvas'].style['cursor'] = Module['Pointer_stringify']($0); } return 0; },
+ function() { if (Module['canvas']) { Module['canvas'].style['cursor'] = 'none'; } },
+ function() { if (typeof(AudioContext) !== 'undefined') { return 1; } else if (typeof(webkitAudioContext) !== 'undefined') { return 1; } return 0; },
+ function() { if ((typeof(navigator.mediaDevices) !== 'undefined') && (typeof(navigator.mediaDevices.getUserMedia) !== 'undefined')) { return 1; } else if (typeof(navigator.webkitGetUserMedia) !== 'undefined') { return 1; } return 0; },
+ function($0) { if(typeof(SDL2) === 'undefined') { SDL2 = {}; } if (!$0) { SDL2.audio = {}; } else { SDL2.capture = {}; } if (!SDL2.audioContext) { if (typeof(AudioContext) !== 'undefined') { SDL2.audioContext = new AudioContext(); } else if (typeof(webkitAudioContext) !== 'undefined') { SDL2.audioContext = new webkitAudioContext(); } } return SDL2.audioContext === undefined ? -1 : 0; },
+ function() { return SDL2.audioContext.sampleRate; },
+ function($0, $1, $2, $3) { var have_microphone = function(stream) { if (SDL2.capture.silenceTimer !== undefined) { clearTimeout(SDL2.capture.silenceTimer); SDL2.capture.silenceTimer = undefined; } SDL2.capture.mediaStreamNode = SDL2.audioContext.createMediaStreamSource(stream); SDL2.capture.scriptProcessorNode = SDL2.audioContext.createScriptProcessor($1, $0, 1); SDL2.capture.scriptProcessorNode.onaudioprocess = function(audioProcessingEvent) { if ((SDL2 === undefined) || (SDL2.capture === undefined)) { return; } audioProcessingEvent.outputBuffer.getChannelData(0).fill(0.0); SDL2.capture.currentCaptureBuffer = audioProcessingEvent.inputBuffer; Runtime.dynCall('vi', $2, [$3]); }; SDL2.capture.mediaStreamNode.connect(SDL2.capture.scriptProcessorNode); SDL2.capture.scriptProcessorNode.connect(SDL2.audioContext.destination); SDL2.capture.stream = stream; }; var no_microphone = function(error) { }; SDL2.capture.silenceBuffer = SDL2.audioContext.createBuffer($0, $1, SDL2.audioContext.sampleRate); SDL2.capture.silenceBuffer.getChannelData(0).fill(0.0); var silence_callback = function() { SDL2.capture.currentCaptureBuffer = SDL2.capture.silenceBuffer; Runtime.dynCall('vi', $2, [$3]); }; SDL2.capture.silenceTimer = setTimeout(silence_callback, ($1 / SDL2.audioContext.sampleRate) * 1000); if ((navigator.mediaDevices !== undefined) && (navigator.mediaDevices.getUserMedia !== undefined)) { navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(have_microphone).catch(no_microphone); } else if (navigator.webkitGetUserMedia !== undefined) { navigator.webkitGetUserMedia({ audio: true, video: false }, have_microphone, no_microphone); } },
+ function($0, $1, $2, $3) { SDL2.audio.scriptProcessorNode = SDL2.audioContext['createScriptProcessor']($1, 0, $0); SDL2.audio.scriptProcessorNode['onaudioprocess'] = function (e) { if ((SDL2 === undefined) || (SDL2.audio === undefined)) { return; } SDL2.audio.currentOutputBuffer = e['outputBuffer']; Runtime.dynCall('vi', $2, [$3]); }; SDL2.audio.scriptProcessorNode['connect'](SDL2.audioContext['destination']); },
+ function($0) { if ($0) { if (SDL2.capture.silenceTimer !== undefined) { clearTimeout(SDL2.capture.silenceTimer); } if (SDL2.capture.stream !== undefined) { var tracks = SDL2.capture.stream.getAudioTracks(); for (var i = 0; i < tracks.length; i++) { SDL2.capture.stream.removeTrack(tracks[i]); } SDL2.capture.stream = undefined; } if (SDL2.capture.scriptProcessorNode !== undefined) { SDL2.capture.scriptProcessorNode.onaudioprocess = function(audioProcessingEvent) {}; SDL2.capture.scriptProcessorNode.disconnect(); SDL2.capture.scriptProcessorNode = undefined; } if (SDL2.capture.mediaStreamNode !== undefined) { SDL2.capture.mediaStreamNode.disconnect(); SDL2.capture.mediaStreamNode = undefined; } if (SDL2.capture.silenceBuffer !== undefined) { SDL2.capture.silenceBuffer = undefined } SDL2.capture = undefined; } else { if (SDL2.audio.scriptProcessorNode != undefined) { SDL2.audio.scriptProcessorNode.disconnect(); SDL2.audio.scriptProcessorNode = undefined; } SDL2.audio = undefined; } if ((SDL2.audioContext !== undefined) && (SDL2.audio === undefined) && (SDL2.capture === undefined)) { SDL2.audioContext.close(); SDL2.audioContext = undefined; } },
+ function($0, $1) { var numChannels = SDL2.capture.currentCaptureBuffer.numberOfChannels; for (var c = 0; c < numChannels; ++c) { var channelData = SDL2.capture.currentCaptureBuffer.getChannelData(c); if (channelData.length != $1) { throw 'Web Audio capture buffer length mismatch! Destination size: ' + channelData.length + ' samples vs expected ' + $1 + ' samples!'; } if (numChannels == 1) { for (var j = 0; j < $1; ++j) { setValue($0 + (j * 4), channelData[j], 'float'); } } else { for (var j = 0; j < $1; ++j) { setValue($0 + (((j * numChannels) + c) * 4), channelData[j], 'float'); } } } },
+ function($0, $1) { var numChannels = SDL2.audio.currentOutputBuffer['numberOfChannels']; for (var c = 0; c < numChannels; ++c) { var channelData = SDL2.audio.currentOutputBuffer['getChannelData'](c); if (channelData.length != $1) { throw 'Web Audio output buffer length mismatch! Destination size: ' + channelData.length + ' samples vs expected ' + $1 + ' samples!'; } for (var j = 0; j < $1; ++j) { channelData[j] = HEAPF32[$0 + ((j*numChannels + c) << 2) >> 2]; } } }];
+
+function _emscripten_asm_const_i(code) {
+ return ASM_CONSTS[code]();
+}
+
+function _emscripten_asm_const_iiiii(code, a0, a1, a2, a3) {
+ return ASM_CONSTS[code](a0, a1, a2, a3);
+}
+
+function _emscripten_asm_const_ii(code, a0) {
+ return ASM_CONSTS[code](a0);
+}
+
+function _emscripten_asm_const_iii(code, a0, a1) {
+ return ASM_CONSTS[code](a0, a1);
+}
+function _emscripten_asm_const_iiiiii(code, a0, a1, a2, a3, a4) {
+ return ASM_CONSTS[code](a0, a1, a2, a3, a4);
+}
+
+function _emscripten_asm_const_iiii(code, a0, a1, a2) {
+ return ASM_CONSTS[code](a0, a1, a2);
+}
STATIC_BASE = GLOBAL_BASE;
-STATICTOP = STATIC_BASE + 110048;
-/* global initializers */ __ATINIT__.push();
+STATICTOP = STATIC_BASE + 155824;
+/* global initializers */ __ATINIT__.push({ func: function() { ___emscripten_environ_constructor() } });
@@ -1879,7 +1926,7 @@ STATICTOP = STATIC_BASE + 110048;
-var STATIC_BUMP = 110048;
+var STATIC_BUMP = 155824;
Module["STATIC_BASE"] = STATIC_BASE;
Module["STATIC_BUMP"] = STATIC_BUMP;
@@ -1887,41 +1934,85 @@ Module["STATIC_BUMP"] = STATIC_BUMP;
var tempDoublePtr = STATICTOP; STATICTOP += 16;
function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much
-
HEAP8[tempDoublePtr] = HEAP8[ptr];
-
HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
-
HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
-
HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
-
}
function copyTempDouble(ptr) {
-
HEAP8[tempDoublePtr] = HEAP8[ptr];
-
HEAP8[tempDoublePtr+1] = HEAP8[ptr+1];
-
HEAP8[tempDoublePtr+2] = HEAP8[ptr+2];
-
HEAP8[tempDoublePtr+3] = HEAP8[ptr+3];
-
HEAP8[tempDoublePtr+4] = HEAP8[ptr+4];
-
HEAP8[tempDoublePtr+5] = HEAP8[ptr+5];
-
HEAP8[tempDoublePtr+6] = HEAP8[ptr+6];
-
HEAP8[tempDoublePtr+7] = HEAP8[ptr+7];
-
}
// {{PRE_LIBRARY}}
+ function ___assert_fail(condition, filename, line, func) {
+ abort('Assertion failed: ' + Pointer_stringify(condition) + ', at: ' + [filename ? Pointer_stringify(filename) : 'unknown filename', line, func ? Pointer_stringify(func) : 'unknown function']);
+ }
+
+
+ var ENV={};function ___buildEnvironment(environ) {
+ // WARNING: Arbitrary limit!
+ var MAX_ENV_VALUES = 64;
+ var TOTAL_ENV_SIZE = 1024;
+
+ // Statically allocate memory for the environment.
+ var poolPtr;
+ var envPtr;
+ if (!___buildEnvironment.called) {
+ ___buildEnvironment.called = true;
+ // Set default values. Use string keys for Closure Compiler compatibility.
+ ENV['USER'] = ENV['LOGNAME'] = 'web_user';
+ ENV['PATH'] = '/';
+ ENV['PWD'] = '/';
+ ENV['HOME'] = '/home/web_user';
+ ENV['LANG'] = 'C.UTF-8';
+ ENV['_'] = Module['thisProgram'];
+ // Allocate memory.
+ poolPtr = getMemory(TOTAL_ENV_SIZE);
+ envPtr = getMemory(MAX_ENV_VALUES * 4);
+ HEAP32[((envPtr)>>2)]=poolPtr;
+ HEAP32[((environ)>>2)]=envPtr;
+ } else {
+ envPtr = HEAP32[((environ)>>2)];
+ poolPtr = HEAP32[((envPtr)>>2)];
+ }
+ // Collect key=value lines.
+ var strings = [];
+ var totalSize = 0;
+ for (var key in ENV) {
+ if (typeof ENV[key] === 'string') {
+ var line = key + '=' + ENV[key];
+ strings.push(line);
+ totalSize += line.length;
+ }
+ }
+ if (totalSize > TOTAL_ENV_SIZE) {
+ throw new Error('Environment size exceeded TOTAL_ENV_SIZE!');
+ }
+
+ // Make new.
+ var ptrSize = 4;
+ for (var i = 0; i < strings.length; i++) {
+ var line = strings[i];
+ writeAsciiToMemory(line, poolPtr);
+ HEAP32[(((envPtr)+(i * ptrSize))>>2)]=poolPtr;
+ poolPtr += line.length + 1;
+ }
+ HEAP32[(((envPtr)+(strings.length * ptrSize))>>2)]=0;
+ }
+
+ function ___lock() {}
+
@@ -4880,7 +4971,413 @@ function copyTempDouble(ptr) {
transaction.onerror = onerror;
};
openRequest.onerror = onerror;
- }};
+ }};var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:function (dirfd, path) {
+ if (path[0] !== '/') {
+ // relative path
+ var dir;
+ if (dirfd === -100) {
+ dir = FS.cwd();
+ } else {
+ var dirstream = FS.getStream(dirfd);
+ if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
+ dir = dirstream.path;
+ }
+ path = PATH.join2(dir, path);
+ }
+ return path;
+ },doStat:function (func, path, buf) {
+ try {
+ var stat = func(path);
+ } catch (e) {
+ if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
+ // an error occurred while trying to look up the path; we should just report ENOTDIR
+ return -ERRNO_CODES.ENOTDIR;
+ }
+ throw e;
+ }
+ HEAP32[((buf)>>2)]=stat.dev;
+ HEAP32[(((buf)+(4))>>2)]=0;
+ HEAP32[(((buf)+(8))>>2)]=stat.ino;
+ HEAP32[(((buf)+(12))>>2)]=stat.mode;
+ HEAP32[(((buf)+(16))>>2)]=stat.nlink;
+ HEAP32[(((buf)+(20))>>2)]=stat.uid;
+ HEAP32[(((buf)+(24))>>2)]=stat.gid;
+ HEAP32[(((buf)+(28))>>2)]=stat.rdev;
+ HEAP32[(((buf)+(32))>>2)]=0;
+ HEAP32[(((buf)+(36))>>2)]=stat.size;
+ HEAP32[(((buf)+(40))>>2)]=4096;
+ HEAP32[(((buf)+(44))>>2)]=stat.blocks;
+ HEAP32[(((buf)+(48))>>2)]=(stat.atime.getTime() / 1000)|0;
+ HEAP32[(((buf)+(52))>>2)]=0;
+ HEAP32[(((buf)+(56))>>2)]=(stat.mtime.getTime() / 1000)|0;
+ HEAP32[(((buf)+(60))>>2)]=0;
+ HEAP32[(((buf)+(64))>>2)]=(stat.ctime.getTime() / 1000)|0;
+ HEAP32[(((buf)+(68))>>2)]=0;
+ HEAP32[(((buf)+(72))>>2)]=stat.ino;
+ return 0;
+ },doMsync:function (addr, stream, len, flags) {
+ var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len));
+ FS.msync(stream, buffer, 0, len, flags);
+ },doMkdir:function (path, mode) {
+ // remove a trailing slash, if one - /a/b/ has basename of '', but
+ // we want to create b in the context of this function
+ path = PATH.normalize(path);
+ if (path[path.length-1] === '/') path = path.substr(0, path.length-1);
+ FS.mkdir(path, mode, 0);
+ return 0;
+ },doMknod:function (path, mode, dev) {
+ // we don't want this in the JS API as it uses mknod to create all nodes.
+ switch (mode & 61440) {
+ case 32768:
+ case 8192:
+ case 24576:
+ case 4096:
+ case 49152:
+ break;
+ default: return -ERRNO_CODES.EINVAL;
+ }
+ FS.mknod(path, mode, dev);
+ return 0;
+ },doReadlink:function (path, buf, bufsize) {
+ if (bufsize <= 0) return -ERRNO_CODES.EINVAL;
+ var ret = FS.readlink(path);
+
+ var len = Math.min(bufsize, lengthBytesUTF8(ret));
+ var endChar = HEAP8[buf+len];
+ stringToUTF8(ret, buf, bufsize+1);
+ // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!)
+ // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write.
+ HEAP8[buf+len] = endChar;
+
+ return len;
+ },doAccess:function (path, amode) {
+ if (amode & ~7) {
+ // need a valid mode
+ return -ERRNO_CODES.EINVAL;
+ }
+ var node;
+ var lookup = FS.lookupPath(path, { follow: true });
+ node = lookup.node;
+ var perms = '';
+ if (amode & 4) perms += 'r';
+ if (amode & 2) perms += 'w';
+ if (amode & 1) perms += 'x';
+ if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) {
+ return -ERRNO_CODES.EACCES;
+ }
+ return 0;
+ },doDup:function (path, flags, suggestFD) {
+ var suggest = FS.getStream(suggestFD);
+ if (suggest) FS.close(suggest);
+ return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
+ },doReadv:function (stream, iov, iovcnt, offset) {
+ var ret = 0;
+ for (var i = 0; i < iovcnt; i++) {
+ var ptr = HEAP32[(((iov)+(i*8))>>2)];
+ var len = HEAP32[(((iov)+(i*8 + 4))>>2)];
+ var curr = FS.read(stream, HEAP8,ptr, len, offset);
+ if (curr < 0) return -1;
+ ret += curr;
+ if (curr < len) break; // nothing more to read
+ }
+ return ret;
+ },doWritev:function (stream, iov, iovcnt, offset) {
+ var ret = 0;
+ for (var i = 0; i < iovcnt; i++) {
+ var ptr = HEAP32[(((iov)+(i*8))>>2)];
+ var len = HEAP32[(((iov)+(i*8 + 4))>>2)];
+ var curr = FS.write(stream, HEAP8,ptr, len, offset);
+ if (curr < 0) return -1;
+ ret += curr;
+ }
+ return ret;
+ },varargs:0,get:function (varargs) {
+ SYSCALLS.varargs += 4;
+ var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
+ return ret;
+ },getStr:function () {
+ var ret = Pointer_stringify(SYSCALLS.get());
+ return ret;
+ },getStreamFromFD:function () {
+ var stream = FS.getStream(SYSCALLS.get());
+ if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
+ return stream;
+ },getSocketFromFD:function () {
+ var socket = SOCKFS.getSocket(SYSCALLS.get());
+ if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
+ return socket;
+ },getSocketAddress:function (allowNull) {
+ var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get();
+ if (allowNull && addrp === 0) return null;
+ var info = __read_sockaddr(addrp, addrlen);
+ if (info.errno) throw new FS.ErrnoError(info.errno);
+ info.addr = DNS.lookup_addr(info.addr) || info.addr;
+ return info;
+ },get64:function () {
+ var low = SYSCALLS.get(), high = SYSCALLS.get();
+ if (low >= 0) assert(high === 0);
+ else assert(high === -1);
+ return low;
+ },getZero:function () {
+ assert(SYSCALLS.get() === 0);
+ }};function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs;
+ try {
+ // llseek
+ var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get();
+ // NOTE: offset_high is unused - Emscripten's off_t is 32-bit
+ var offset = offset_low;
+ FS.llseek(stream, offset, whence);
+ HEAP32[((result)>>2)]=stream.position;
+ if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state
+ return 0;
+ } catch (e) {
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
+ return -e.errno;
+ }
+ }
+
+ function ___syscall145(which, varargs) {SYSCALLS.varargs = varargs;
+ try {
+ // readv
+ var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
+ return SYSCALLS.doReadv(stream, iov, iovcnt);
+ } catch (e) {
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
+ return -e.errno;
+ }
+ }
+
+ function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs;
+ try {
+ // writev
+ var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
+ return SYSCALLS.doWritev(stream, iov, iovcnt);
+ } catch (e) {
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
+ return -e.errno;
+ }
+ }
+
+ function ___syscall221(which, varargs) {SYSCALLS.varargs = varargs;
+ try {
+ // fcntl64
+ var stream = SYSCALLS.getStreamFromFD(), cmd = SYSCALLS.get();
+ switch (cmd) {
+ case 0: {
+ var arg = SYSCALLS.get();
+ if (arg < 0) {
+ return -ERRNO_CODES.EINVAL;
+ }
+ var newStream;
+ newStream = FS.open(stream.path, stream.flags, 0, arg);
+ return newStream.fd;
+ }
+ case 1:
+ case 2:
+ return 0; // FD_CLOEXEC makes no sense for a single process.
+ case 3:
+ return stream.flags;
+ case 4: {
+ var arg = SYSCALLS.get();
+ stream.flags |= arg;
+ return 0;
+ }
+ case 12:
+ case 12: {
+ var arg = SYSCALLS.get();
+ var offset = 0;
+ // We're always unlocked.
+ HEAP16[(((arg)+(offset))>>1)]=2;
+ return 0;
+ }
+ case 13:
+ case 14:
+ case 13:
+ case 14:
+ return 0; // Pretend that the locking is successful.
+ case 16:
+ case 8:
+ return -ERRNO_CODES.EINVAL; // These are for sockets. We don't have them fully implemented yet.
+ case 9:
+ // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves.
+ ___setErrNo(ERRNO_CODES.EINVAL);
+ return -1;
+ default: {
+ return -ERRNO_CODES.EINVAL;
+ }
+ }
+ } catch (e) {
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
+ return -e.errno;
+ }
+ }
+
+ function ___syscall5(which, varargs) {SYSCALLS.varargs = varargs;
+ try {
+ // open
+ var pathname = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get() // optional TODO
+ var stream = FS.open(pathname, flags, mode);
+ return stream.fd;
+ } catch (e) {
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
+ return -e.errno;
+ }
+ }
+
+ function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs;
+ try {
+ // ioctl
+ var stream = SYSCALLS.getStreamFromFD(), op = SYSCALLS.get();
+ switch (op) {
+ case 21509:
+ case 21505: {
+ if (!stream.tty) return -ERRNO_CODES.ENOTTY;
+ return 0;
+ }
+ case 21510:
+ case 21511:
+ case 21512:
+ case 21506:
+ case 21507:
+ case 21508: {
+ if (!stream.tty) return -ERRNO_CODES.ENOTTY;
+ return 0; // no-op, not actually adjusting terminal settings
+ }
+ case 21519: {
+ if (!stream.tty) return -ERRNO_CODES.ENOTTY;
+ var argp = SYSCALLS.get();
+ HEAP32[((argp)>>2)]=0;
+ return 0;
+ }
+ case 21520: {
+ if (!stream.tty) return -ERRNO_CODES.ENOTTY;
+ return -ERRNO_CODES.EINVAL; // not supported
+ }
+ case 21531: {
+ var argp = SYSCALLS.get();
+ return FS.ioctl(stream, op, argp);
+ }
+ case 21523: {
+ // TODO: in theory we should write to the winsize struct that gets
+ // passed in, but for now musl doesn't read anything on it
+ if (!stream.tty) return -ERRNO_CODES.ENOTTY;
+ return 0;
+ }
+ case 21524: {
+ // TODO: technically, this ioctl call should change the window size.
+ // but, since emscripten doesn't have any concept of a terminal window
+ // yet, we'll just silently throw it away as we do TIOCGWINSZ
+ if (!stream.tty) return -ERRNO_CODES.ENOTTY;
+ return 0;
+ }
+ default: abort('bad ioctl syscall ' + op);
+ }
+ } catch (e) {
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
+ return -e.errno;
+ }
+ }
+
+ function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs;
+ try {
+ // close
+ var stream = SYSCALLS.getStreamFromFD();
+ FS.close(stream);
+ return 0;
+ } catch (e) {
+ if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
+ return -e.errno;
+ }
+ }
+
+ function ___unlock() {}
+
+
+ function _emscripten_get_now() { abort() }
+
+ function _emscripten_get_now_is_monotonic() {
+ // return whether emscripten_get_now is guaranteed monotonic; the Date.now
+ // implementation is not :(
+ return ENVIRONMENT_IS_NODE || (typeof dateNow !== 'undefined') ||
+ ((ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && self['performance'] && self['performance']['now']);
+ }function _clock_gettime(clk_id, tp) {
+ // int clock_gettime(clockid_t clk_id, struct timespec *tp);
+ var now;
+ if (clk_id === 0) {
+ now = Date.now();
+ } else if (clk_id === 1 && _emscripten_get_now_is_monotonic()) {
+ now = _emscripten_get_now();
+ } else {
+ ___setErrNo(ERRNO_CODES.EINVAL);
+ return -1;
+ }
+ HEAP32[((tp)>>2)]=(now/1000)|0; // seconds
+ HEAP32[(((tp)+(4))>>2)]=((now % 1000)*1000*1000)|0; // nanoseconds
+ return 0;
+ }
+
+
+ var DLFCN={error:null,errorMsg:null,nextHandle:1,loadedLibs:{},loadedLibNames:{}};function _dlclose(handle) {
+ // int dlclose(void *handle);
+ // http://pubs.opengroup.org/onlinepubs/009695399/functions/dlclose.html
+ if (!DLFCN.loadedLibs[handle]) {
+ DLFCN.errorMsg = 'Tried to dlclose() unopened handle: ' + handle;
+ return 1;
+ } else {
+ var lib_record = DLFCN.loadedLibs[handle];
+ if (--lib_record.refcount == 0) {
+ if (lib_record.module.cleanups) {
+ lib_record.module.cleanups.forEach(function(cleanup) { cleanup() });
+ }
+ delete DLFCN.loadedLibNames[lib_record.name];
+ delete DLFCN.loadedLibs[handle];
+ }
+ return 0;
+ }
+ }
+
+ function _dlerror() {
+ // char *dlerror(void);
+ // http://pubs.opengroup.org/onlinepubs/009695399/functions/dlerror.html
+ if (DLFCN.errorMsg === null) {
+ return 0;
+ } else {
+ if (DLFCN.error) _free(DLFCN.error);
+ var msgArr = intArrayFromString(DLFCN.errorMsg);
+ DLFCN.error = allocate(msgArr, 'i8', ALLOC_NORMAL);
+ DLFCN.errorMsg = null;
+ return DLFCN.error;
+ }
+ }
+
+ function _dlsym(handle, symbol) {
+ // void *dlsym(void *restrict handle, const char *restrict name);
+ // http://pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html
+ symbol = Pointer_stringify(symbol);
+
+ if (!DLFCN.loadedLibs[handle]) {
+ DLFCN.errorMsg = 'Tried to dlsym() from an unopened handle: ' + handle;
+ return 0;
+ } else {
+ var lib = DLFCN.loadedLibs[handle];
+ symbol = '_' + symbol;
+ if (!lib.module.hasOwnProperty(symbol)) {
+ DLFCN.errorMsg = ('Tried to lookup unknown symbol "' + symbol +
+ '" in dynamic lib: ' + lib.name);
+ return 0;
+ } else {
+ var result = lib.module[symbol];
+ if (typeof result === 'function') {
+ // convert the exported function into a function pointer using our generic
+ // JS mechanism.
+ return addFunction(result);
+ }
+ return result;
+ }
+ }
+ }
+
+
@@ -4932,9 +5429,7 @@ function copyTempDouble(ptr) {
Browser.mainLoop.method = 'immediate';
}
return 0;
- }
-
- function _emscripten_get_now() { abort() }function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop, arg, noSetTiming) {
+ }function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop, arg, noSetTiming) {
Module['noExitRuntime'] = true;
assert(!Browser.mainLoop.func, 'emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.');
@@ -5643,1624 +6138,948 @@ function copyTempDouble(ptr) {
var handle = Browser.nextWgetRequestHandle;
Browser.nextWgetRequestHandle++;
return handle;
- }};
-
- function _SDL_GetTicks() {
- return (Date.now() - SDL.startTime)|0;
- }
-
- function _SDL_LockSurface(surf) {
- var surfData = SDL.surfaces[surf];
-
- surfData.locked++;
- if (surfData.locked > 1) return 0;
-
- if (!surfData.buffer) {
- surfData.buffer = _malloc(surfData.width * surfData.height * 4);
- HEAP32[(((surf)+(20))>>2)]=surfData.buffer;
- }
-
- // Mark in C/C++-accessible SDL structure
- // SDL_Surface has the following fields: Uint32 flags, SDL_PixelFormat *format; int w, h; Uint16 pitch; void *pixels; ...
- // So we have fields all of the same size, and 5 of them before us.
- // TODO: Use macros like in library.js
- HEAP32[(((surf)+(20))>>2)]=surfData.buffer;
-
- if (surf == SDL.screen && Module.screenIsReadOnly && surfData.image) return 0;
-
- if (SDL.defaults.discardOnLock) {
- if (!surfData.image) {
- surfData.image = surfData.ctx.createImageData(surfData.width, surfData.height);
- }
- if (!SDL.defaults.opaqueFrontBuffer) return;
- } else {
- surfData.image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height);
- }
-
- // Emulate desktop behavior and kill alpha values on the locked surface. (very costly!) Set SDL.defaults.opaqueFrontBuffer = false
- // if you don't want this.
- if (surf == SDL.screen && SDL.defaults.opaqueFrontBuffer) {
- var data = surfData.image.data;
- var num = data.length;
- for (var i = 0; i < num/4; i++) {
- data[i*4+3] = 255; // opacity, as canvases blend alpha
- }
- }
-
- if (SDL.defaults.copyOnLock && !SDL.defaults.discardOnLock) {
- // Copy pixel data to somewhere accessible to 'C/C++'
- if (surfData.isFlagSet(0x00200000 /* SDL_HWPALETTE */)) {
- // If this is neaded then
- // we should compact the data from 32bpp to 8bpp index.
- // I think best way to implement this is use
- // additional colorMap hash (color->index).
- // Something like this:
- //
- // var size = surfData.width * surfData.height;
- // var data = '';
- // for (var i = 0; i<size; i++) {
- // var color = SDL.translateRGBAToColor(
- // surfData.image.data[i*4 ],
- // surfData.image.data[i*4 +1],
- // surfData.image.data[i*4 +2],
- // 255);
- // var index = surfData.colorMap[color];
- // HEAP8[(((surfData.buffer)+(i))>>0)]=index;
- // }
- throw 'CopyOnLock is not supported for SDL_LockSurface with SDL_HWPALETTE flag set' + new Error().stack;
- } else {
- HEAPU8.set(surfData.image.data, surfData.buffer);
+ }};var EGL={errorCode:12288,defaultDisplayInitialized:false,currentContext:0,currentReadSurface:0,currentDrawSurface:0,alpha:false,depth:true,stencil:true,antialias:true,stringCache:{},setErrorCode:function (code) {
+ EGL.errorCode = code;
+ },chooseConfig:function (display, attribList, config, config_size, numConfigs) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
}
- }
-
- return 0;
- }var SDL={defaults:{width:320,height:200,copyOnLock:true,discardOnLock:false,opaqueFrontBuffer:true},version:null,surfaces:{},canvasPool:[],events:[],fonts:[null],audios:[null],rwops:[null],music:{audio:null,volume:1},mixerFrequency:22050,mixerFormat:32784,mixerNumChannels:2,mixerChunkSize:1024,channelMinimumNumber:0,GL:false,glAttributes:{0:3,1:3,2:2,3:0,4:0,5:1,6:16,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0,15:1,16:0,17:0,18:0},keyboardState:null,keyboardMap:{},canRequestFullscreen:false,isRequestingFullscreen:false,textInput:false,startTime:null,initFlags:0,buttonState:0,modState:0,DOMButtons:[0,0,0],DOMEventToSDLEvent:{},TOUCH_DEFAULT_ID:0,eventHandler:null,eventHandlerContext:null,eventHandlerTemp:0,keyCodes:{16:1249,17:1248,18:1250,20:1081,33:1099,34:1102,35:1101,36:1098,37:1104,38:1106,39:1103,40:1105,44:316,45:1097,46:127,91:1251,93:1125,96:1122,97:1113,98:1114,99:1115,100:1116,101:1117,102:1118,103:1119,104:1120,105:1121,106:1109,107:1111,109:1110,110:1123,111:1108,112:1082,113:1083,114:1084,115:1085,116:1086,117:1087,118:1088,119:1089,120:1090,121:1091,122:1092,123:1093,124:1128,125:1129,126:1130,127:1131,128:1132,129:1133,130:1134,131:1135,132:1136,133:1137,134:1138,135:1139,144:1107,160:94,161:33,162:34,163:35,164:36,165:37,166:38,167:95,168:40,169:41,170:42,171:43,172:124,173:45,174:123,175:125,176:126,181:127,182:129,183:128,188:44,190:46,191:47,192:96,219:91,220:92,221:93,222:39,224:1251},scanCodes:{8:42,9:43,13:40,27:41,32:44,35:204,39:53,44:54,46:55,47:56,48:39,49:30,50:31,51:32,52:33,53:34,54:35,55:36,56:37,57:38,58:203,59:51,61:46,91:47,92:49,93:48,96:52,97:4,98:5,99:6,100:7,101:8,102:9,103:10,104:11,105:12,106:13,107:14,108:15,109:16,110:17,111:18,112:19,113:20,114:21,115:22,116:23,117:24,118:25,119:26,120:27,121:28,122:29,127:76,305:224,308:226,316:70},loadRect:function (rect) {
- return {
- x: HEAP32[((rect + 0)>>2)],
- y: HEAP32[((rect + 4)>>2)],
- w: HEAP32[((rect + 8)>>2)],
- h: HEAP32[((rect + 12)>>2)]
- };
- },updateRect:function (rect, r) {
- HEAP32[((rect)>>2)]=r.x;
- HEAP32[(((rect)+(4))>>2)]=r.y;
- HEAP32[(((rect)+(8))>>2)]=r.w;
- HEAP32[(((rect)+(12))>>2)]=r.h;
- },intersectionOfRects:function (first, second) {
- var leftX = Math.max(first.x, second.x);
- var leftY = Math.max(first.y, second.y);
- var rightX = Math.min(first.x + first.w, second.x + second.w);
- var rightY = Math.min(first.y + first.h, second.y + second.h);
- return {
- x: leftX,
- y: leftY,
- w: Math.max(leftX, rightX) - leftX,
- h: Math.max(leftY, rightY) - leftY
- }
- },checkPixelFormat:function (fmt) {
- },loadColorToCSSRGB:function (color) {
- var rgba = HEAP32[((color)>>2)];
- return 'rgb(' + (rgba&255) + ',' + ((rgba >> 8)&255) + ',' + ((rgba >> 16)&255) + ')';
- },loadColorToCSSRGBA:function (color) {
- var rgba = HEAP32[((color)>>2)];
- return 'rgba(' + (rgba&255) + ',' + ((rgba >> 8)&255) + ',' + ((rgba >> 16)&255) + ',' + (((rgba >> 24)&255)/255) + ')';
- },translateColorToCSSRGBA:function (rgba) {
- return 'rgba(' + (rgba&0xff) + ',' + (rgba>>8 & 0xff) + ',' + (rgba>>16 & 0xff) + ',' + (rgba>>>24)/0xff + ')';
- },translateRGBAToCSSRGBA:function (r, g, b, a) {
- return 'rgba(' + (r&0xff) + ',' + (g&0xff) + ',' + (b&0xff) + ',' + (a&0xff)/255 + ')';
- },translateRGBAToColor:function (r, g, b, a) {
- return r | g << 8 | b << 16 | a << 24;
- },makeSurface:function (width, height, flags, usePageCanvas, source, rmask, gmask, bmask, amask) {
- flags = flags || 0;
- var is_SDL_HWSURFACE = flags & 0x00000001;
- var is_SDL_HWPALETTE = flags & 0x00200000;
- var is_SDL_OPENGL = flags & 0x04000000;
-
- var surf = _malloc(60);
- var pixelFormat = _malloc(44);
- //surface with SDL_HWPALETTE flag is 8bpp surface (1 byte)
- var bpp = is_SDL_HWPALETTE ? 1 : 4;
- var buffer = 0;
-
- // preemptively initialize this for software surfaces,
- // otherwise it will be lazily initialized inside of SDL_LockSurface
- if (!is_SDL_HWSURFACE && !is_SDL_OPENGL) {
- buffer = _malloc(width * height * 4);
- }
-
- HEAP32[((surf)>>2)]=flags;
- HEAP32[(((surf)+(4))>>2)]=pixelFormat;
- HEAP32[(((surf)+(8))>>2)]=width;
- HEAP32[(((surf)+(12))>>2)]=height;
- HEAP32[(((surf)+(16))>>2)]=width * bpp; // assuming RGBA or indexed for now,
- // since that is what ImageData gives us in browsers
- HEAP32[(((surf)+(20))>>2)]=buffer;
-
- HEAP32[(((surf)+(36))>>2)]=0;
- HEAP32[(((surf)+(40))>>2)]=0;
- HEAP32[(((surf)+(44))>>2)]=Module["canvas"].width;
- HEAP32[(((surf)+(48))>>2)]=Module["canvas"].height;
-
- HEAP32[(((surf)+(56))>>2)]=1;
-
- HEAP32[((pixelFormat)>>2)]=-2042224636;
- HEAP32[(((pixelFormat)+(4))>>2)]=0;// TODO
- HEAP8[(((pixelFormat)+(8))>>0)]=bpp * 8;
- HEAP8[(((pixelFormat)+(9))>>0)]=bpp;
-
- HEAP32[(((pixelFormat)+(12))>>2)]=rmask || 0x000000ff;
- HEAP32[(((pixelFormat)+(16))>>2)]=gmask || 0x0000ff00;
- HEAP32[(((pixelFormat)+(20))>>2)]=bmask || 0x00ff0000;
- HEAP32[(((pixelFormat)+(24))>>2)]=amask || 0xff000000;
-
- // Decide if we want to use WebGL or not
- SDL.GL = SDL.GL || is_SDL_OPENGL;
- var canvas;
- if (!usePageCanvas) {
- if (SDL.canvasPool.length > 0) {
- canvas = SDL.canvasPool.pop();
- } else {
- canvas = document.createElement('canvas');
+ if (attribList) {
+ // read attribList if it is non-null
+ for(;;) {
+ var param = HEAP32[((attribList)>>2)];
+ if (param == 0x3021 /*EGL_ALPHA_SIZE*/) {
+ var alphaSize = HEAP32[(((attribList)+(4))>>2)];
+ EGL.alpha = (alphaSize > 0);
+ } else if (param == 0x3025 /*EGL_DEPTH_SIZE*/) {
+ var depthSize = HEAP32[(((attribList)+(4))>>2)];
+ EGL.depth = (depthSize > 0);
+ } else if (param == 0x3026 /*EGL_STENCIL_SIZE*/) {
+ var stencilSize = HEAP32[(((attribList)+(4))>>2)];
+ EGL.stencil = (stencilSize > 0);
+ } else if (param == 0x3031 /*EGL_SAMPLES*/) {
+ var samples = HEAP32[(((attribList)+(4))>>2)];
+ EGL.antialias = (samples > 0);
+ } else if (param == 0x3032 /*EGL_SAMPLE_BUFFERS*/) {
+ var samples = HEAP32[(((attribList)+(4))>>2)];
+ EGL.antialias = (samples == 1);
+ } else if (param == 0x3038 /*EGL_NONE*/) {
+ break;
+ }
+ attribList += 8;
}
- canvas.width = width;
- canvas.height = height;
- } else {
- canvas = Module['canvas'];
}
- var webGLContextAttributes = {
- antialias: ((SDL.glAttributes[13 /*SDL_GL_MULTISAMPLEBUFFERS*/] != 0) && (SDL.glAttributes[14 /*SDL_GL_MULTISAMPLESAMPLES*/] > 1)),
- depth: (SDL.glAttributes[6 /*SDL_GL_DEPTH_SIZE*/] > 0),
- stencil: (SDL.glAttributes[7 /*SDL_GL_STENCIL_SIZE*/] > 0),
- alpha: (SDL.glAttributes[3 /*SDL_GL_ALPHA_SIZE*/] > 0)
- };
+ if ((!config || !config_size) && !numConfigs) {
+ EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */);
+ return 0;
+ }
+ if (numConfigs) {
+ HEAP32[((numConfigs)>>2)]=1; // Total number of supported configs: 1.
+ }
+ if (config && config_size > 0) {
+ HEAP32[((config)>>2)]=62002;
+ }
+
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1;
+ }};function _eglBindAPI(api) {
+ if (api == 0x30A0 /* EGL_OPENGL_ES_API */) {
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1;
+ } else { // if (api == 0x30A1 /* EGL_OPENVG_API */ || api == 0x30A2 /* EGL_OPENGL_API */) {
+ EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */);
+ return 0;
+ }
+ }
+
+ function _eglChooseConfig(display, attrib_list, configs, config_size, numConfigs) {
+ return EGL.chooseConfig(display, attrib_list, configs, config_size, numConfigs);
+ }
+
- var ctx = Browser.createContext(canvas, is_SDL_OPENGL, usePageCanvas, webGLContextAttributes);
-
- SDL.surfaces[surf] = {
- width: width,
- height: height,
- canvas: canvas,
- ctx: ctx,
- surf: surf,
- buffer: buffer,
- pixelFormat: pixelFormat,
- alpha: 255,
- flags: flags,
- locked: 0,
- usePageCanvas: usePageCanvas,
- source: source,
- isFlagSet: function(flag) {
- return flags & flag;
- }
- };
+ var GLUT={initTime:null,idleFunc:null,displayFunc:null,keyboardFunc:null,keyboardUpFunc:null,specialFunc:null,specialUpFunc:null,reshapeFunc:null,motionFunc:null,passiveMotionFunc:null,mouseFunc:null,buttons:0,modifiers:0,initWindowWidth:256,initWindowHeight:256,initDisplayMode:18,windowX:0,windowY:0,windowWidth:0,windowHeight:0,requestedAnimationFrame:false,saveModifiers:function (event) {
+ GLUT.modifiers = 0;
+ if (event['shiftKey'])
+ GLUT.modifiers += 1; /* GLUT_ACTIVE_SHIFT */
+ if (event['ctrlKey'])
+ GLUT.modifiers += 2; /* GLUT_ACTIVE_CTRL */
+ if (event['altKey'])
+ GLUT.modifiers += 4; /* GLUT_ACTIVE_ALT */
+ },onMousemove:function (event) {
+ /* Send motion event only if the motion changed, prevents
+ * spamming our app with uncessary callback call. It does happen in
+ * Chrome on Windows.
+ */
+ var lastX = Browser.mouseX;
+ var lastY = Browser.mouseY;
+ Browser.calculateMouseEvent(event);
+ var newX = Browser.mouseX;
+ var newY = Browser.mouseY;
+ if (newX == lastX && newY == lastY) return;
- return surf;
- },copyIndexedColorData:function (surfData, rX, rY, rW, rH) {
- // HWPALETTE works with palette
- // setted by SDL_SetColors
- if (!surfData.colors) {
- return;
- }
+ if (GLUT.buttons == 0 && event.target == Module["canvas"] && GLUT.passiveMotionFunc) {
+ event.preventDefault();
+ GLUT.saveModifiers(event);
+ Module['dynCall_vii'](GLUT.passiveMotionFunc, lastX, lastY);
+ } else if (GLUT.buttons != 0 && GLUT.motionFunc) {
+ event.preventDefault();
+ GLUT.saveModifiers(event);
+ Module['dynCall_vii'](GLUT.motionFunc, lastX, lastY);
+ }
+ },getSpecialKey:function (keycode) {
+ var key = null;
+ switch (keycode) {
+ case 8: key = 120 /* backspace */; break;
+ case 46: key = 111 /* delete */; break;
+
+ case 0x70 /*DOM_VK_F1*/: key = 1 /* GLUT_KEY_F1 */; break;
+ case 0x71 /*DOM_VK_F2*/: key = 2 /* GLUT_KEY_F2 */; break;
+ case 0x72 /*DOM_VK_F3*/: key = 3 /* GLUT_KEY_F3 */; break;
+ case 0x73 /*DOM_VK_F4*/: key = 4 /* GLUT_KEY_F4 */; break;
+ case 0x74 /*DOM_VK_F5*/: key = 5 /* GLUT_KEY_F5 */; break;
+ case 0x75 /*DOM_VK_F6*/: key = 6 /* GLUT_KEY_F6 */; break;
+ case 0x76 /*DOM_VK_F7*/: key = 7 /* GLUT_KEY_F7 */; break;
+ case 0x77 /*DOM_VK_F8*/: key = 8 /* GLUT_KEY_F8 */; break;
+ case 0x78 /*DOM_VK_F9*/: key = 9 /* GLUT_KEY_F9 */; break;
+ case 0x79 /*DOM_VK_F10*/: key = 10 /* GLUT_KEY_F10 */; break;
+ case 0x7a /*DOM_VK_F11*/: key = 11 /* GLUT_KEY_F11 */; break;
+ case 0x7b /*DOM_VK_F12*/: key = 12 /* GLUT_KEY_F12 */; break;
+ case 0x25 /*DOM_VK_LEFT*/: key = 100 /* GLUT_KEY_LEFT */; break;
+ case 0x26 /*DOM_VK_UP*/: key = 101 /* GLUT_KEY_UP */; break;
+ case 0x27 /*DOM_VK_RIGHT*/: key = 102 /* GLUT_KEY_RIGHT */; break;
+ case 0x28 /*DOM_VK_DOWN*/: key = 103 /* GLUT_KEY_DOWN */; break;
+ case 0x21 /*DOM_VK_PAGE_UP*/: key = 104 /* GLUT_KEY_PAGE_UP */; break;
+ case 0x22 /*DOM_VK_PAGE_DOWN*/: key = 105 /* GLUT_KEY_PAGE_DOWN */; break;
+ case 0x24 /*DOM_VK_HOME*/: key = 106 /* GLUT_KEY_HOME */; break;
+ case 0x23 /*DOM_VK_END*/: key = 107 /* GLUT_KEY_END */; break;
+ case 0x2d /*DOM_VK_INSERT*/: key = 108 /* GLUT_KEY_INSERT */; break;
+
+ case 16 /*DOM_VK_SHIFT*/:
+ case 0x05 /*DOM_VK_LEFT_SHIFT*/:
+ key = 112 /* GLUT_KEY_SHIFT_L */;
+ break;
+ case 0x06 /*DOM_VK_RIGHT_SHIFT*/:
+ key = 113 /* GLUT_KEY_SHIFT_R */;
+ break;
- var fullWidth = Module['canvas'].width;
- var fullHeight = Module['canvas'].height;
+ case 17 /*DOM_VK_CONTROL*/:
+ case 0x03 /*DOM_VK_LEFT_CONTROL*/:
+ key = 114 /* GLUT_KEY_CONTROL_L */;
+ break;
+ case 0x04 /*DOM_VK_RIGHT_CONTROL*/:
+ key = 115 /* GLUT_KEY_CONTROL_R */;
+ break;
- var startX = rX || 0;
- var startY = rY || 0;
- var endX = (rW || (fullWidth - startX)) + startX;
- var endY = (rH || (fullHeight - startY)) + startY;
+ case 18 /*DOM_VK_ALT*/:
+ case 0x02 /*DOM_VK_LEFT_ALT*/:
+ key = 116 /* GLUT_KEY_ALT_L */;
+ break;
+ case 0x01 /*DOM_VK_RIGHT_ALT*/:
+ key = 117 /* GLUT_KEY_ALT_R */;
+ break;
+ };
+ return key;
+ },getASCIIKey:function (event) {
+ if (event['ctrlKey'] || event['altKey'] || event['metaKey']) return null;
- var buffer = surfData.buffer;
+ var keycode = event['keyCode'];
- if (!surfData.image.data32) {
- surfData.image.data32 = new Uint32Array(surfData.image.data.buffer);
- }
- var data32 = surfData.image.data32;
+ /* The exact list is soooo hard to find in a canonical place! */
- var colors32 = surfData.colors32;
+ if (48 <= keycode && keycode <= 57)
+ return keycode; // numeric TODO handle shift?
+ if (65 <= keycode && keycode <= 90)
+ return event['shiftKey'] ? keycode : keycode + 32;
+ if (96 <= keycode && keycode <= 105)
+ return keycode - 48; // numpad numbers
+ if (106 <= keycode && keycode <= 111)
+ return keycode - 106 + 42; // *,+-./ TODO handle shift?
- for (var y = startY; y < endY; ++y) {
- var base = y * fullWidth;
- for (var x = startX; x < endX; ++x) {
- data32[base + x] = colors32[HEAPU8[((buffer + base + x)>>0)]];
- }
- }
- },freeSurface:function (surf) {
- var refcountPointer = surf + 56;
- var refcount = HEAP32[((refcountPointer)>>2)];
- if (refcount > 1) {
- HEAP32[((refcountPointer)>>2)]=refcount - 1;
- return;
+ switch (keycode) {
+ case 9: // tab key
+ case 13: // return key
+ case 27: // escape
+ case 32: // space
+ case 61: // equal
+ return keycode;
}
- var info = SDL.surfaces[surf];
- if (!info.usePageCanvas && info.canvas) SDL.canvasPool.push(info.canvas);
- if (info.buffer) _free(info.buffer);
- _free(info.pixelFormat);
- _free(surf);
- SDL.surfaces[surf] = null;
-
- if (surf === SDL.screen) {
- SDL.screen = null;
- }
- },blitSurface:function (src, srcrect, dst, dstrect, scale) {
- var srcData = SDL.surfaces[src];
- var dstData = SDL.surfaces[dst];
- var sr, dr;
- if (srcrect) {
- sr = SDL.loadRect(srcrect);
- } else {
- sr = { x: 0, y: 0, w: srcData.width, h: srcData.height };
- }
- if (dstrect) {
- dr = SDL.loadRect(dstrect);
- } else {
- dr = { x: 0, y: 0, w: srcData.width, h: srcData.height };
+ var s = event['shiftKey'];
+ switch (keycode) {
+ case 186: return s ? 58 : 59; // colon / semi-colon
+ case 187: return s ? 43 : 61; // add / equal (these two may be wrong)
+ case 188: return s ? 60 : 44; // less-than / comma
+ case 189: return s ? 95 : 45; // dash
+ case 190: return s ? 62 : 46; // greater-than / period
+ case 191: return s ? 63 : 47; // forward slash
+ case 219: return s ? 123 : 91; // open bracket
+ case 220: return s ? 124 : 47; // back slash
+ case 221: return s ? 125 : 93; // close braket
+ case 222: return s ? 34 : 39; // single quote
}
- if (dstData.clipRect) {
- var widthScale = (!scale || sr.w === 0) ? 1 : sr.w / dr.w;
- var heightScale = (!scale || sr.h === 0) ? 1 : sr.h / dr.h;
- dr = SDL.intersectionOfRects(dstData.clipRect, dr);
-
- sr.w = dr.w * widthScale;
- sr.h = dr.h * heightScale;
-
- if (dstrect) {
- SDL.updateRect(dstrect, dr);
- }
- }
- var blitw, blith;
- if (scale) {
- blitw = dr.w; blith = dr.h;
- } else {
- blitw = sr.w; blith = sr.h;
- }
- if (sr.w === 0 || sr.h === 0 || blitw === 0 || blith === 0) {
- return 0;
- }
- var oldAlpha = dstData.ctx.globalAlpha;
- dstData.ctx.globalAlpha = srcData.alpha/255;
- dstData.ctx.drawImage(srcData.canvas, sr.x, sr.y, sr.w, sr.h, dr.x, dr.y, blitw, blith);
- dstData.ctx.globalAlpha = oldAlpha;
- if (dst != SDL.screen) {
- // XXX As in IMG_Load, for compatibility we write out |pixels|
- warnOnce('WARNING: copying canvas data to memory for compatibility');
- _SDL_LockSurface(dst);
- dstData.locked--; // The surface is not actually locked in this hack
- }
- return 0;
- },downFingers:{},savedKeydown:null,receiveEvent:function (event) {
- function unpressAllPressedKeys() {
- // Un-press all pressed keys: TODO
- for (var code in SDL.keyboardMap) {
- SDL.events.push({
- type: 'keyup',
- keyCode: SDL.keyboardMap[code]
- });
+ return null;
+ },onKeydown:function (event) {
+ if (GLUT.specialFunc || GLUT.keyboardFunc) {
+ var key = GLUT.getSpecialKey(event['keyCode']);
+ if (key !== null) {
+ if( GLUT.specialFunc ) {
+ event.preventDefault();
+ GLUT.saveModifiers(event);
+ Module['dynCall_viii'](GLUT.specialFunc, key, Browser.mouseX, Browser.mouseY);
+ }
}
- };
- switch(event.type) {
- case 'touchstart': case 'touchmove': {
- event.preventDefault();
-
- var touches = [];
-
- // Clear out any touchstart events that we've already processed
- if (event.type === 'touchstart') {
- for (var i = 0; i < event.touches.length; i++) {
- var touch = event.touches[i];
- if (SDL.downFingers[touch.identifier] != true) {
- SDL.downFingers[touch.identifier] = true;
- touches.push(touch);
- }
- }
- } else {
- touches = event.touches;
+ else
+ {
+ key = GLUT.getASCIIKey(event);
+ if( key !== null && GLUT.keyboardFunc ) {
+ event.preventDefault();
+ GLUT.saveModifiers(event);
+ Module['dynCall_viii'](GLUT.keyboardFunc, key, Browser.mouseX, Browser.mouseY);
}
-
- var firstTouch = touches[0];
- if (firstTouch) {
- if (event.type == 'touchstart') {
- SDL.DOMButtons[0] = 1;
- }
- var mouseEventType;
- switch(event.type) {
- case 'touchstart': mouseEventType = 'mousedown'; break;
- case 'touchmove': mouseEventType = 'mousemove'; break;
- }
- var mouseEvent = {
- type: mouseEventType,
- button: 0,
- pageX: firstTouch.clientX,
- pageY: firstTouch.clientY
- };
- SDL.events.push(mouseEvent);
+ }
+ }
+ },onKeyup:function (event) {
+ if (GLUT.specialUpFunc || GLUT.keyboardUpFunc) {
+ var key = GLUT.getSpecialKey(event['keyCode']);
+ if (key !== null) {
+ if(GLUT.specialUpFunc) {
+ event.preventDefault ();
+ GLUT.saveModifiers(event);
+ Module['dynCall_viii'](GLUT.specialUpFunc, key, Browser.mouseX, Browser.mouseY);
}
-
- for (var i = 0; i < touches.length; i++) {
- var touch = touches[i];
- SDL.events.push({
- type: event.type,
- touch: touch
- });
- };
- break;
}
- case 'touchend': {
- event.preventDefault();
-
- // Remove the entry in the SDL.downFingers hash
- // because the finger is no longer down.
- for(var i = 0; i < event.changedTouches.length; i++) {
- var touch = event.changedTouches[i];
- if (SDL.downFingers[touch.identifier] === true) {
- delete SDL.downFingers[touch.identifier];
- }
+ else
+ {
+ key = GLUT.getASCIIKey(event);
+ if( key !== null && GLUT.keyboardUpFunc ) {
+ event.preventDefault ();
+ GLUT.saveModifiers(event);
+ Module['dynCall_viii'](GLUT.keyboardUpFunc, key, Browser.mouseX, Browser.mouseY);
}
-
- var mouseEvent = {
- type: 'mouseup',
- button: 0,
- pageX: event.changedTouches[0].clientX,
- pageY: event.changedTouches[0].clientY
- };
- SDL.DOMButtons[0] = 0;
- SDL.events.push(mouseEvent);
-
- for (var i = 0; i < event.changedTouches.length; i++) {
- var touch = event.changedTouches[i];
- SDL.events.push({
- type: 'touchend',
- touch: touch
- });
- };
- break;
}
- case 'DOMMouseScroll': case 'mousewheel': case 'wheel':
- var delta = -Browser.getMouseWheelDelta(event); // Flip the wheel direction to translate from browser wheel direction (+:down) to SDL direction (+:up)
- delta = (delta == 0) ? 0 : (delta > 0 ? Math.max(delta, 1) : Math.min(delta, -1)); // Quantize to integer so that minimum scroll is at least +/- 1.
-
- // Simulate old-style SDL events representing mouse wheel input as buttons
- var button = delta > 0 ? 3 /*SDL_BUTTON_WHEELUP-1*/ : 4 /*SDL_BUTTON_WHEELDOWN-1*/; // Subtract one since JS->C marshalling is defined to add one back.
- SDL.events.push({ type: 'mousedown', button: button, pageX: event.pageX, pageY: event.pageY });
- SDL.events.push({ type: 'mouseup', button: button, pageX: event.pageX, pageY: event.pageY });
+ }
+ },touchHandler:function (event) {
+ if (event.target != Module['canvas']) {
+ return;
+ }
- // Pass a delta motion event.
- SDL.events.push({ type: 'wheel', deltaX: 0, deltaY: delta });
- event.preventDefault(); // If we don't prevent this, then 'wheel' event will be sent again by the browser as 'DOMMouseScroll' and we will receive this same event the second time.
- break;
- case 'mousemove':
- if (SDL.DOMButtons[0] === 1) {
- SDL.events.push({
- type: 'touchmove',
- touch: {
- identifier: 0,
- deviceID: -1,
- pageX: event.pageX,
- pageY: event.pageY
- }
- });
- }
- if (Browser.pointerLock) {
- // workaround for firefox bug 750111
- if ('mozMovementX' in event) {
- event['movementX'] = event['mozMovementX'];
- event['movementY'] = event['mozMovementY'];
- }
- // workaround for Firefox bug 782777
- if (event['movementX'] == 0 && event['movementY'] == 0) {
- // ignore a mousemove event if it doesn't contain any movement info
- // (without pointer lock, we infer movement from pageX/pageY, so this check is unnecessary)
- event.preventDefault();
- return;
- }
- }
- // fall through
- case 'keydown': case 'keyup': case 'keypress': case 'mousedown': case 'mouseup':
- // If we preventDefault on keydown events, the subsequent keypress events
- // won't fire. However, it's fine (and in some cases necessary) to
- // preventDefault for keys that don't generate a character. Otherwise,
- // preventDefault is the right thing to do in general.
- if (event.type !== 'keydown' || (!SDL.unicode && !SDL.textInput) || (event.keyCode === 8 /* backspace */ || event.keyCode === 9 /* tab */)) {
- event.preventDefault();
- }
+ var touches = event.changedTouches,
+ main = touches[0],
+ type = "";
- if (event.type == 'mousedown') {
- SDL.DOMButtons[event.button] = 1;
- SDL.events.push({
- type: 'touchstart',
- touch: {
- identifier: 0,
- deviceID: -1,
- pageX: event.pageX,
- pageY: event.pageY
- }
- });
- } else if (event.type == 'mouseup') {
- // ignore extra ups, can happen if we leave the canvas while pressing down, then return,
- // since we add a mouseup in that case
- if (!SDL.DOMButtons[event.button]) {
- return;
- }
+ switch(event.type) {
+ case "touchstart": type = "mousedown"; break;
+ case "touchmove": type = "mousemove"; break;
+ case "touchend": type = "mouseup"; break;
+ default: return;
+ }
- SDL.events.push({
- type: 'touchend',
- touch: {
- identifier: 0,
- deviceID: -1,
- pageX: event.pageX,
- pageY: event.pageY
- }
- });
- SDL.DOMButtons[event.button] = 0;
- }
+ var simulatedEvent = document.createEvent("MouseEvent");
+ simulatedEvent.initMouseEvent(type, true, true, window, 1,
+ main.screenX, main.screenY,
+ main.clientX, main.clientY, false,
+ false, false, false, 0/*main*/, null);
- // We can only request fullscreen as the result of user input.
- // Due to this limitation, we toggle a boolean on keydown which
- // SDL_WM_ToggleFullScreen will check and subsequently set another
- // flag indicating for us to request fullscreen on the following
- // keyup. This isn't perfect, but it enables SDL_WM_ToggleFullScreen
- // to work as the result of a keypress (which is an extremely
- // common use case).
- if (event.type === 'keydown' || event.type === 'mousedown') {
- SDL.canRequestFullscreen = true;
- } else if (event.type === 'keyup' || event.type === 'mouseup') {
- if (SDL.isRequestingFullscreen) {
- Module['requestFullscreen'](/*lockPointer=*/true, /*resizeCanvas=*/true);
- SDL.isRequestingFullscreen = false;
- }
- SDL.canRequestFullscreen = false;
- }
+ main.target.dispatchEvent(simulatedEvent);
+ event.preventDefault();
+ },onMouseButtonDown:function (event) {
+ Browser.calculateMouseEvent(event);
- // SDL expects a unicode character to be passed to its keydown events.
- // Unfortunately, the browser APIs only provide a charCode property on
- // keypress events, so we must backfill in keydown events with their
- // subsequent keypress event's charCode.
- if (event.type === 'keypress' && SDL.savedKeydown) {
- // charCode is read-only
- SDL.savedKeydown.keypressCharCode = event.charCode;
- SDL.savedKeydown = null;
- } else if (event.type === 'keydown') {
- SDL.savedKeydown = event;
- }
+ GLUT.buttons |= (1 << event['button']);
- // Don't push keypress events unless SDL_StartTextInput has been called.
- if (event.type !== 'keypress' || SDL.textInput) {
- SDL.events.push(event);
- }
- break;
- case 'mouseout':
- // Un-press all pressed mouse buttons, because we might miss the release outside of the canvas
- for (var i = 0; i < 3; i++) {
- if (SDL.DOMButtons[i]) {
- SDL.events.push({
- type: 'mouseup',
- button: i,
- pageX: event.pageX,
- pageY: event.pageY
- });
- SDL.DOMButtons[i] = 0;
- }
- }
- event.preventDefault();
- break;
- case 'focus':
- SDL.events.push(event);
- event.preventDefault();
- break;
- case 'blur':
- SDL.events.push(event);
- unpressAllPressedKeys();
- event.preventDefault();
- break;
- case 'visibilitychange':
- SDL.events.push({
- type: 'visibilitychange',
- visible: !document.hidden
- });
- unpressAllPressedKeys();
- event.preventDefault();
- break;
- case 'unload':
- if (Browser.mainLoop.runner) {
- SDL.events.push(event);
- // Force-run a main event loop, since otherwise this event will never be caught!
- Browser.mainLoop.runner();
- }
- return;
- case 'resize':
- SDL.events.push(event);
- // manually triggered resize event doesn't have a preventDefault member
- if (event.preventDefault) {
- event.preventDefault();
- }
- break;
- }
- if (SDL.events.length >= 10000) {
- err('SDL event queue full, dropping events');
- SDL.events = SDL.events.slice(0, 10000);
+ if (event.target == Module["canvas"] && GLUT.mouseFunc) {
+ try {
+ event.target.setCapture();
+ } catch (e) {}
+ event.preventDefault();
+ GLUT.saveModifiers(event);
+ Module['dynCall_viiii'](GLUT.mouseFunc, event['button'], 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY);
}
- // If we have a handler installed, this will push the events to the app
- // instead of the app polling for them.
- SDL.flushEventsToHandler();
- return;
- },lookupKeyCodeForEvent:function (event) {
- var code = event.keyCode;
- if (code >= 65 && code <= 90) {
- code += 32; // make lowercase for SDL
- } else {
- code = SDL.keyCodes[event.keyCode] || event.keyCode;
- // If this is one of the modifier keys (224 | 1<<10 - 227 | 1<<10), and the event specifies that it is
- // a right key, add 4 to get the right key SDL key code.
- if (event.location === KeyboardEvent.DOM_KEY_LOCATION_RIGHT && code >= (224 | 1<<10) && code <= (227 | 1<<10)) {
- code += 4;
- }
- }
- return code;
- },handleEvent:function (event) {
- if (event.handled) return;
- event.handled = true;
+ },onMouseButtonUp:function (event) {
+ Browser.calculateMouseEvent(event);
- switch (event.type) {
- case 'touchstart': case 'touchend': case 'touchmove': {
- Browser.calculateMouseEvent(event);
- break;
- }
- case 'keydown': case 'keyup': {
- var down = event.type === 'keydown';
- var code = SDL.lookupKeyCodeForEvent(event);
- HEAP8[(((SDL.keyboardState)+(code))>>0)]=down;
- // TODO: lmeta, rmeta, numlock, capslock, KMOD_MODE, KMOD_RESERVED
- SDL.modState = (HEAP8[(((SDL.keyboardState)+(1248))>>0)] ? 0x0040 : 0) | // KMOD_LCTRL
- (HEAP8[(((SDL.keyboardState)+(1249))>>0)] ? 0x0001 : 0) | // KMOD_LSHIFT
- (HEAP8[(((SDL.keyboardState)+(1250))>>0)] ? 0x0100 : 0) | // KMOD_LALT
- (HEAP8[(((SDL.keyboardState)+(1252))>>0)] ? 0x0080 : 0) | // KMOD_RCTRL
- (HEAP8[(((SDL.keyboardState)+(1253))>>0)] ? 0x0002 : 0) | // KMOD_RSHIFT
- (HEAP8[(((SDL.keyboardState)+(1254))>>0)] ? 0x0200 : 0); // KMOD_RALT
- if (down) {
- SDL.keyboardMap[code] = event.keyCode; // save the DOM input, which we can use to unpress it during blur
- } else {
- delete SDL.keyboardMap[code];
- }
+ GLUT.buttons &= ~(1 << event['button']);
- break;
- }
- case 'mousedown': case 'mouseup':
- if (event.type == 'mousedown') {
- // SDL_BUTTON(x) is defined as (1 << ((x)-1)). SDL buttons are 1-3,
- // and DOM buttons are 0-2, so this means that the below formula is
- // correct.
- SDL.buttonState |= 1 << event.button;
- } else if (event.type == 'mouseup') {
- SDL.buttonState &= ~(1 << event.button);
- }
- // fall through
- case 'mousemove': {
- Browser.calculateMouseEvent(event);
- break;
- }
+ if (GLUT.mouseFunc) {
+ event.preventDefault();
+ GLUT.saveModifiers(event);
+ Module['dynCall_viiii'](GLUT.mouseFunc, event['button'], 1/*GLUT_UP*/, Browser.mouseX, Browser.mouseY);
}
- },flushEventsToHandler:function () {
- if (!SDL.eventHandler) return;
+ },onMouseWheel:function (event) {
+ Browser.calculateMouseEvent(event);
+
+ // cross-browser wheel delta
+ var e = window.event || event; // old IE support
+ // Note the minus sign that flips browser wheel direction (positive direction scrolls page down) to native wheel direction (positive direction is mouse wheel up)
+ var delta = -Browser.getMouseWheelDelta(event);
+ delta = (delta == 0) ? 0 : (delta > 0 ? Math.max(delta, 1) : Math.min(delta, -1)); // Quantize to integer so that minimum scroll is at least +/- 1.
- while (SDL.pollEvent(SDL.eventHandlerTemp)) {
- Module['dynCall_iii'](SDL.eventHandler, SDL.eventHandlerContext, SDL.eventHandlerTemp);
+ var button = 3; // wheel up
+ if (delta < 0) {
+ button = 4; // wheel down
}
- },pollEvent:function (ptr) {
- if (SDL.initFlags & 0x200 && SDL.joystickEventState) {
- // If SDL_INIT_JOYSTICK was supplied AND the joystick system is configured
- // to automatically query for events, query for joystick events.
- SDL.queryJoysticks();
+
+ if (GLUT.mouseFunc) {
+ event.preventDefault();
+ GLUT.saveModifiers(event);
+ Module['dynCall_viiii'](GLUT.mouseFunc, button, 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY);
}
- if (ptr) {
- while (SDL.events.length > 0) {
- if (SDL.makeCEvent(SDL.events.shift(), ptr) !== false) return 1;
- }
- return 0;
+ },onFullscreenEventChange:function (event) {
+ var width;
+ var height;
+ if (document["fullscreen"] || document["fullScreen"] || document["mozFullScreen"] || document["webkitIsFullScreen"]) {
+ width = screen["width"];
+ height = screen["height"];
} else {
- // XXX: somewhat risky in that we do not check if the event is real or not (makeCEvent returns false) if no pointer supplied
- return SDL.events.length > 0;
- }
- },makeCEvent:function (event, ptr) {
- if (typeof event === 'number') {
- // This is a pointer to a copy of a native C event that was SDL_PushEvent'ed
- _memcpy(ptr, event, 28);
- _free(event); // the copy is no longer needed
- return;
+ width = GLUT.windowWidth;
+ height = GLUT.windowHeight;
+ // TODO set position
+ document.removeEventListener('fullscreenchange', GLUT.onFullscreenEventChange, true);
+ document.removeEventListener('mozfullscreenchange', GLUT.onFullscreenEventChange, true);
+ document.removeEventListener('webkitfullscreenchange', GLUT.onFullscreenEventChange, true);
+ }
+ Browser.setCanvasSize(width, height, true); // N.B. GLUT.reshapeFunc is also registered as a canvas resize callback.
+ // Just call it once here.
+ /* Can't call _glutReshapeWindow as that requests cancelling fullscreen. */
+ if (GLUT.reshapeFunc) {
+ // console.log("GLUT.reshapeFunc (from FS): " + width + ", " + height);
+ Module['dynCall_vii'](GLUT.reshapeFunc, width, height);
+ }
+ _glutPostRedisplay();
+ },requestFullscreen:function () {
+ Browser.requestFullscreen(/*lockPointer=*/false, /*resizeCanvas=*/false);
+ },requestFullScreen:function () {
+ err('GLUT.requestFullScreen() is deprecated. Please call GLUT.requestFullscreen instead.');
+ GLUT.requestFullScreen = function() {
+ return GLUT.requestFullscreen();
}
+ return GLUT.requestFullscreen();
+ },exitFullscreen:function () {
+ var CFS = document['exitFullscreen'] ||
+ document['cancelFullScreen'] ||
+ document['mozCancelFullScreen'] ||
+ document['webkitCancelFullScreen'] ||
+ (function() {});
+ CFS.apply(document, []);
+ },cancelFullScreen:function () {
+ err('GLUT.cancelFullScreen() is deprecated. Please call GLUT.exitFullscreen instead.');
+ GLUT.cancelFullScreen = function() {
+ return GLUT.exitFullscreen();
+ }
+ return GLUT.exitFullscreen();
+ }};function _glutInitDisplayMode(mode) {
+ GLUT.initDisplayMode = mode;
+ }
- SDL.handleEvent(event);
-
- switch (event.type) {
- case 'keydown': case 'keyup': {
- var down = event.type === 'keydown';
- //out('Received key event: ' + event.keyCode);
- var key = SDL.lookupKeyCodeForEvent(event);
- var scan;
- if (key >= 1024) {
- scan = key - 1024;
- } else {
- scan = SDL.scanCodes[key] || key;
- }
+ function _glutCreateWindow(name) {
+ var contextAttributes = {
+ antialias: ((GLUT.initDisplayMode & 0x0080 /*GLUT_MULTISAMPLE*/) != 0),
+ depth: ((GLUT.initDisplayMode & 0x0010 /*GLUT_DEPTH*/) != 0),
+ stencil: ((GLUT.initDisplayMode & 0x0020 /*GLUT_STENCIL*/) != 0),
+ alpha: ((GLUT.initDisplayMode & 0x0008 /*GLUT_ALPHA*/) != 0)
+ };
+ Module.ctx = Browser.createContext(Module['canvas'], true, true, contextAttributes);
+ return Module.ctx ? 1 /* a new GLUT window ID for the created context */ : 0 /* failure */;
+ }
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP8[(((ptr)+(8))>>0)]=down ? 1 : 0;
- HEAP8[(((ptr)+(9))>>0)]=0; // TODO
- HEAP32[(((ptr)+(12))>>2)]=scan;
- HEAP32[(((ptr)+(16))>>2)]=key;
- HEAP16[(((ptr)+(20))>>1)]=SDL.modState;
- // some non-character keys (e.g. backspace and tab) won't have keypressCharCode set, fill in with the keyCode.
- HEAP32[(((ptr)+(24))>>2)]=event.keypressCharCode || key;
+ var GL={counter:1,lastError:0,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},currentContext:null,offscreenCanvases:{},timerQueriesEXT:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],programInfos:{},stringCache:{},tempFixedLengthArray:[],packAlignment:4,unpackAlignment:4,init:function () {
+ GL.miniTempBuffer = new Float32Array(GL.MINI_TEMP_BUFFER_SIZE);
+ for (var i = 0; i < GL.MINI_TEMP_BUFFER_SIZE; i++) {
+ GL.miniTempBufferViews[i] = GL.miniTempBuffer.subarray(0, i+1);
+ }
- break;
- }
- case 'keypress': {
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- // Not filling in windowID for now
- var cStr = intArrayFromString(String.fromCharCode(event.charCode));
- for (var i = 0; i < cStr.length; ++i) {
- HEAP8[(((ptr)+(8 + i))>>0)]=cStr[i];
- }
- break;
- }
- case 'mousedown': case 'mouseup': case 'mousemove': {
- if (event.type != 'mousemove') {
- var down = event.type === 'mousedown';
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP32[(((ptr)+(4))>>2)]=0;
- HEAP32[(((ptr)+(8))>>2)]=0;
- HEAP32[(((ptr)+(12))>>2)]=0;
- HEAP8[(((ptr)+(16))>>0)]=event.button+1; // DOM buttons are 0-2, SDL 1-3
- HEAP8[(((ptr)+(17))>>0)]=down ? 1 : 0;
- HEAP32[(((ptr)+(20))>>2)]=Browser.mouseX;
- HEAP32[(((ptr)+(24))>>2)]=Browser.mouseY;
- } else {
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP32[(((ptr)+(4))>>2)]=0;
- HEAP32[(((ptr)+(8))>>2)]=0;
- HEAP32[(((ptr)+(12))>>2)]=0;
- HEAP32[(((ptr)+(16))>>2)]=SDL.buttonState;
- HEAP32[(((ptr)+(20))>>2)]=Browser.mouseX;
- HEAP32[(((ptr)+(24))>>2)]=Browser.mouseY;
- HEAP32[(((ptr)+(28))>>2)]=Browser.mouseMovementX;
- HEAP32[(((ptr)+(32))>>2)]=Browser.mouseMovementY;
- }
- break;
- }
- case 'wheel': {
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP32[(((ptr)+(16))>>2)]=event.deltaX;
- HEAP32[(((ptr)+(20))>>2)]=event.deltaY;
- break;
- }
- case 'touchstart': case 'touchend': case 'touchmove': {
- var touch = event.touch;
- if (!Browser.touches[touch.identifier]) break;
- var w = Module['canvas'].width;
- var h = Module['canvas'].height;
- var x = Browser.touches[touch.identifier].x / w;
- var y = Browser.touches[touch.identifier].y / h;
- var lx = Browser.lastTouches[touch.identifier].x / w;
- var ly = Browser.lastTouches[touch.identifier].y / h;
- var dx = x - lx;
- var dy = y - ly;
- if (touch['deviceID'] === undefined) touch.deviceID = SDL.TOUCH_DEFAULT_ID;
- if (dx === 0 && dy === 0 && event.type === 'touchmove') return false; // don't send these if nothing happened
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP32[(((ptr)+(4))>>2)]=_SDL_GetTicks();
- (tempI64 = [touch.deviceID>>>0,(tempDouble=touch.deviceID,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((ptr)+(8))>>2)]=tempI64[0],HEAP32[(((ptr)+(12))>>2)]=tempI64[1]);
- (tempI64 = [touch.identifier>>>0,(tempDouble=touch.identifier,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((ptr)+(16))>>2)]=tempI64[0],HEAP32[(((ptr)+(20))>>2)]=tempI64[1]);
- HEAPF32[(((ptr)+(24))>>2)]=x;
- HEAPF32[(((ptr)+(28))>>2)]=y;
- HEAPF32[(((ptr)+(32))>>2)]=dx;
- HEAPF32[(((ptr)+(36))>>2)]=dy;
- if (touch.force !== undefined) {
- HEAPF32[(((ptr)+(40))>>2)]=touch.force;
- } else { // No pressure data, send a digital 0/1 pressure.
- HEAPF32[(((ptr)+(40))>>2)]=event.type == "touchend" ? 0 : 1;
- }
- break;
- }
- case 'unload': {
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- break;
- }
- case 'resize': {
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP32[(((ptr)+(4))>>2)]=event.w;
- HEAP32[(((ptr)+(8))>>2)]=event.h;
- break;
- }
- case 'joystick_button_up': case 'joystick_button_down': {
- var state = event.type === 'joystick_button_up' ? 0 : 1;
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP8[(((ptr)+(4))>>0)]=event.index;
- HEAP8[(((ptr)+(5))>>0)]=event.button;
- HEAP8[(((ptr)+(6))>>0)]=state;
- break;
- }
- case 'joystick_axis_motion': {
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP8[(((ptr)+(4))>>0)]=event.index;
- HEAP8[(((ptr)+(5))>>0)]=event.axis;
- HEAP32[(((ptr)+(8))>>2)]=SDL.joystickAxisValueConversion(event.value);
- break;
- }
- case 'focus': {
- var SDL_WINDOWEVENT_FOCUS_GAINED = 12 /* SDL_WINDOWEVENT_FOCUS_GAINED */;
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP32[(((ptr)+(4))>>2)]=0;
- HEAP8[(((ptr)+(8))>>0)]=SDL_WINDOWEVENT_FOCUS_GAINED;
- break;
- }
- case 'blur': {
- var SDL_WINDOWEVENT_FOCUS_LOST = 13 /* SDL_WINDOWEVENT_FOCUS_LOST */;
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP32[(((ptr)+(4))>>2)]=0;
- HEAP8[(((ptr)+(8))>>0)]=SDL_WINDOWEVENT_FOCUS_LOST;
- break;
- }
- case 'visibilitychange': {
- var SDL_WINDOWEVENT_SHOWN = 1 /* SDL_WINDOWEVENT_SHOWN */;
- var SDL_WINDOWEVENT_HIDDEN = 2 /* SDL_WINDOWEVENT_HIDDEN */;
- var visibilityEventID = event.visible ? SDL_WINDOWEVENT_SHOWN : SDL_WINDOWEVENT_HIDDEN;
- HEAP32[((ptr)>>2)]=SDL.DOMEventToSDLEvent[event.type];
- HEAP32[(((ptr)+(4))>>2)]=0;
- HEAP8[(((ptr)+(8))>>0)]=visibilityEventID;
- break;
- }
- default: throw 'Unhandled SDL event: ' + event.type;
- }
- },makeFontString:function (height, fontName) {
- if (fontName.charAt(0) != "'" && fontName.charAt(0) != '"') {
- // https://developer.mozilla.org/ru/docs/Web/CSS/font-family
- // Font family names containing whitespace should be quoted.
- // BTW, quote all font names is easier than searching spaces
- fontName = '"' + fontName + '"';
- }
- return height + 'px ' + fontName + ', serif';
- },estimateTextWidth:function (fontData, text) {
- var h = fontData.size;
- var fontString = SDL.makeFontString(h, fontData.name);
- var tempCtx = SDL.ttfContext;
- tempCtx.save();
- tempCtx.font = fontString;
- var ret = tempCtx.measureText(text).width | 0;
- tempCtx.restore();
- return ret;
- },allocateChannels:function (num) { // called from Mix_AllocateChannels and init
- if (SDL.numChannels && SDL.numChannels >= num && num != 0) return;
- SDL.numChannels = num;
- SDL.channels = [];
- for (var i = 0; i < num; i++) {
- SDL.channels[i] = {
- audio: null,
- volume: 1.0
- };
+ // For functions such as glDrawBuffers, glInvalidateFramebuffer and glInvalidateSubFramebuffer that need to pass a short array to the WebGL API,
+ // create a set of short fixed-length arrays to avoid having to generate any garbage when calling those functions.
+ for (var i = 0; i < 32; i++) {
+ GL.tempFixedLengthArray.push(new Array(i));
}
- },setGetVolume:function (info, volume) {
- if (!info) return 0;
- var ret = info.volume * 128; // MIX_MAX_VOLUME
- if (volume != -1) {
- info.volume = Math.min(Math.max(volume, 0), 128) / 128;
- if (info.audio) {
- try {
- info.audio.volume = info.volume; // For <audio> element
- if (info.audio.webAudioGainNode) info.audio.webAudioGainNode['gain']['value'] = info.volume; // For WebAudio playback
- } catch(e) {
- err('setGetVolume failed to set audio volume: ' + e);
- }
- }
+ },recordError:function recordError(errorCode) {
+ if (!GL.lastError) {
+ GL.lastError = errorCode;
+ }
+ },getNewId:function (table) {
+ var ret = GL.counter++;
+ for (var i = table.length; i < ret; i++) {
+ table[i] = null;
}
return ret;
- },setPannerPosition:function (info, x, y, z) {
- if (!info) return;
- if (info.audio) {
- if (info.audio.webAudioPannerNode) {
- info.audio.webAudioPannerNode['setPosition'](x, y, z);
+ },MINI_TEMP_BUFFER_SIZE:256,miniTempBuffer:null,miniTempBufferViews:[0],getSource:function (shader, count, string, length) {
+ var source = '';
+ for (var i = 0; i < count; ++i) {
+ var frag;
+ if (length) {
+ var len = HEAP32[(((length)+(i*4))>>2)];
+ if (len < 0) {
+ frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)]);
+ } else {
+ frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)], len);
+ }
+ } else {
+ frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)]);
}
+ source += frag;
+ }
+ return source;
+ },createContext:function (canvas, webGLContextAttributes) {
+ if (typeof webGLContextAttributes['majorVersion'] === 'undefined' && typeof webGLContextAttributes['minorVersion'] === 'undefined') {
+ webGLContextAttributes['majorVersion'] = 1;
+ webGLContextAttributes['minorVersion'] = 0;
}
- },playWebAudio:function (audio) {
- if (!audio) return;
- if (audio.webAudioNode) return; // This instance is already playing, don't start again.
- if (!SDL.webAudioAvailable()) return;
- try {
- var webAudio = audio.resource.webAudio;
- audio.paused = false;
- if (!webAudio.decodedBuffer) {
- if (webAudio.onDecodeComplete === undefined) abort("Cannot play back audio object that was not loaded");
- webAudio.onDecodeComplete.push(function() { if (!audio.paused) SDL.playWebAudio(audio); });
- return;
- }
- audio.webAudioNode = SDL.audioContext['createBufferSource']();
- audio.webAudioNode['buffer'] = webAudio.decodedBuffer;
- audio.webAudioNode['loop'] = audio.loop;
- audio.webAudioNode['onended'] = function() { audio['onended'](); } // For <media> element compatibility, route the onended signal to the instance.
-
- audio.webAudioPannerNode = SDL.audioContext['createPanner']();
- // avoid Chrome bug
- // If posz = 0, the sound will come from only the right.
- // By posz = -0.5 (slightly ahead), the sound will come from right and left correctly.
- audio.webAudioPannerNode["setPosition"](0, 0, -.5);
- audio.webAudioPannerNode['panningModel'] = 'equalpower';
- // Add an intermediate gain node to control volume.
- audio.webAudioGainNode = SDL.audioContext['createGain']();
- audio.webAudioGainNode['gain']['value'] = audio.volume;
- audio.webAudioNode['connect'](audio.webAudioPannerNode);
- audio.webAudioPannerNode['connect'](audio.webAudioGainNode);
- audio.webAudioGainNode['connect'](SDL.audioContext['destination']);
- audio.webAudioNode['start'](0, audio.currentPosition);
- audio.startTime = SDL.audioContext['currentTime'] - audio.currentPosition;
- } catch(e) {
- err('playWebAudio failed: ' + e);
+ var ctx;
+ var errorInfo = '?';
+ function onContextCreationError(event) {
+ errorInfo = event.statusMessage || errorInfo;
}
- },pauseWebAudio:function (audio) {
- if (!audio) return;
- if (audio.webAudioNode) {
+ try {
+ canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);
try {
- // Remember where we left off, so that if/when we resume, we can restart the playback at a proper place.
- audio.currentPosition = (SDL.audioContext['currentTime'] - audio.startTime) % audio.resource.webAudio.decodedBuffer.duration;
- // Important: When we reach here, the audio playback is stopped by the user. But when calling .stop() below, the Web Audio
- // graph will send the onended signal, but we don't want to process that, since pausing should not clear/destroy the audio
- // channel.
- audio.webAudioNode['onended'] = undefined;
- audio.webAudioNode.stop(0); // 0 is a default parameter, but WebKit is confused by it #3861
- audio.webAudioNode = undefined;
- } catch(e) {
- err('pauseWebAudio failed: ' + e);
- }
- }
- audio.paused = true;
- },openAudioContext:function () {
- // Initialize Web Audio API if we haven't done so yet. Note: Only initialize Web Audio context ever once on the web page,
- // since initializing multiple times fails on Chrome saying 'audio resources have been exhausted'.
- if (!SDL.audioContext) {
- if (typeof(AudioContext) !== 'undefined') SDL.audioContext = new AudioContext();
- else if (typeof(webkitAudioContext) !== 'undefined') SDL.audioContext = new webkitAudioContext();
- }
- },webAudioAvailable:function () { return !!SDL.audioContext; },fillWebAudioBufferFromHeap:function (heapPtr, sizeSamplesPerChannel, dstAudioBuffer) {
- // The input audio data is interleaved across the channels, i.e. [L, R, L, R, L, R, ...] and is either 8-bit, 16-bit or float as
- // supported by the SDL API. The output audio wave data for Web Audio API must be in planar buffers of [-1,1]-normalized Float32 data,
- // so perform a buffer conversion for the data.
- var numChannels = SDL.audio.channels;
- for(var c = 0; c < numChannels; ++c) {
- var channelData = dstAudioBuffer['getChannelData'](c);
- if (channelData.length != sizeSamplesPerChannel) {
- throw 'Web Audio output buffer length mismatch! Destination size: ' + channelData.length + ' samples vs expected ' + sizeSamplesPerChannel + ' samples!';
- }
- if (SDL.audio.format == 0x8010 /*AUDIO_S16LSB*/) {
- for(var j = 0; j < sizeSamplesPerChannel; ++j) {
- channelData[j] = (HEAP16[(((heapPtr)+((j*numChannels + c)*2))>>1)]) / 0x8000;
- }
- } else if (SDL.audio.format == 0x0008 /*AUDIO_U8*/) {
- for(var j = 0; j < sizeSamplesPerChannel; ++j) {
- var v = (HEAP8[(((heapPtr)+(j*numChannels + c))>>0)]);
- channelData[j] = ((v >= 0) ? v-128 : v+128) /128;
- }
- } else if (SDL.audio.format == 0x8120 /*AUDIO_F32*/) {
- for(var j = 0; j < sizeSamplesPerChannel; ++j) {
- channelData[j] = (HEAPF32[(((heapPtr)+((j*numChannels + c)*4))>>2)]);
- }
- } else {
- throw 'Invalid SDL audio format ' + SDL.audio.format + '!';
- }
- }
- },debugSurface:function (surfData) {
- console.log('dumping surface ' + [surfData.surf, surfData.source, surfData.width, surfData.height]);
- var image = surfData.ctx.getImageData(0, 0, surfData.width, surfData.height);
- var data = image.data;
- var num = Math.min(surfData.width, surfData.height);
- for (var i = 0; i < num; i++) {
- console.log(' diagonal ' + i + ':' + [data[i*surfData.width*4 + i*4 + 0], data[i*surfData.width*4 + i*4 + 1], data[i*surfData.width*4 + i*4 + 2], data[i*surfData.width*4 + i*4 + 3]]);
- }
- },joystickEventState:1,lastJoystickState:{},joystickNamePool:{},recordJoystickState:function (joystick, state) {
- // Standardize button state.
- var buttons = new Array(state.buttons.length);
- for (var i = 0; i < state.buttons.length; i++) {
- buttons[i] = SDL.getJoystickButtonState(state.buttons[i]);
- }
-
- SDL.lastJoystickState[joystick] = {
- buttons: buttons,
- axes: state.axes.slice(0),
- timestamp: state.timestamp,
- index: state.index,
- id: state.id
- };
- },getJoystickButtonState:function (button) {
- if (typeof button === 'object') {
- // Current gamepad API editor's draft (Firefox Nightly)
- // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#idl-def-GamepadButton
- return button['pressed'];
- } else {
- // Current gamepad API working draft (Firefox / Chrome Stable)
- // http://www.w3.org/TR/2012/WD-gamepad-20120529/#gamepad-interface
- return button > 0;
- }
- },queryJoysticks:function () {
- for (var joystick in SDL.lastJoystickState) {
- var state = SDL.getGamepad(joystick - 1);
- var prevState = SDL.lastJoystickState[joystick];
- // If joystick was removed, state returns null.
- if (typeof state === 'undefined') return;
- if (state === null) return;
- // Check only if the timestamp has differed.
- // NOTE: Timestamp is not available in Firefox.
- // NOTE: Timestamp is currently not properly set for the GearVR controller
- // on Samsung Internet: it is always zero.
- if (typeof state.timestamp !== 'number' || state.timestamp !== prevState.timestamp || !state.timestamp) {
- var i;
- for (i = 0; i < state.buttons.length; i++) {
- var buttonState = SDL.getJoystickButtonState(state.buttons[i]);
- // NOTE: The previous state already has a boolean representation of
- // its button, so no need to standardize its button state here.
- if (buttonState !== prevState.buttons[i]) {
- // Insert button-press event.
- SDL.events.push({
- type: buttonState ? 'joystick_button_down' : 'joystick_button_up',
- joystick: joystick,
- index: joystick - 1,
- button: i
- });
- }
- }
- for (i = 0; i < state.axes.length; i++) {
- if (state.axes[i] !== prevState.axes[i]) {
- // Insert axes-change event.
- SDL.events.push({
- type: 'joystick_axis_motion',
- joystick: joystick,
- index: joystick - 1,
- axis: i,
- value: state.axes[i]
- });
- }
+ if (webGLContextAttributes['majorVersion'] == 1 && webGLContextAttributes['minorVersion'] == 0) {
+ ctx = canvas.getContext("webgl", webGLContextAttributes) || canvas.getContext("experimental-webgl", webGLContextAttributes);
+ } else if (webGLContextAttributes['majorVersion'] == 2 && webGLContextAttributes['minorVersion'] == 0) {
+ ctx = canvas.getContext("webgl2", webGLContextAttributes);
+ } else {
+ throw 'Unsupported WebGL context version ' + majorVersion + '.' + minorVersion + '!'
}
-
- SDL.recordJoystickState(joystick, state);
+ } finally {
+ canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);
}
+ if (!ctx) throw ':(';
+ } catch (e) {
+ return 0;
}
- },joystickAxisValueConversion:function (value) {
- // Make sure value is properly clamped
- value = Math.min(1, Math.max(value, -1));
- // Ensures that 0 is 0, 1 is 32767, and -1 is 32768.
- return Math.ceil(((value+1) * 32767.5) - 32768);
- },getGamepads:function () {
- var fcn = navigator.getGamepads || navigator.webkitGamepads || navigator.mozGamepads || navigator.gamepads || navigator.webkitGetGamepads;
- if (fcn !== undefined) {
- // The function must be applied on the navigator object.
- return fcn.apply(navigator);
- } else {
- return [];
- }
- },getGamepad:function (deviceIndex) {
- var gamepads = SDL.getGamepads();
- if (gamepads.length > deviceIndex && deviceIndex >= 0) {
- return gamepads[deviceIndex];
- }
- return null;
- }};function _SDL_PauseAudio(pauseOn) {
- if (!SDL.audio) {
- return;
- }
- if (pauseOn) {
- if (SDL.audio.timer !== undefined) {
- clearTimeout(SDL.audio.timer);
- SDL.audio.numAudioTimersPending = 0;
- SDL.audio.timer = undefined;
- }
- } else if (!SDL.audio.timer) {
- // Start the audio playback timer callback loop.
- SDL.audio.numAudioTimersPending = 1;
- SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, 1);
- }
- SDL.audio.paused = pauseOn;
- }function _SDL_CloseAudio() {
- if (SDL.audio) {
- _SDL_PauseAudio(1);
- _free(SDL.audio.buffer);
- SDL.audio = null;
- SDL.allocateChannels(0);
- }
- }
-
- function _SDL_InitSubSystem(flags) { return 0 }
-
- function _SDL_OpenAudio(desired, obtained) {
- try {
- SDL.audio = {
- freq: HEAPU32[((desired)>>2)],
- format: HEAPU16[(((desired)+(4))>>1)],
- channels: HEAPU8[(((desired)+(6))>>0)],
- samples: HEAPU16[(((desired)+(8))>>1)], // Samples in the CB buffer per single sound channel.
- callback: HEAPU32[(((desired)+(16))>>2)],
- userdata: HEAPU32[(((desired)+(20))>>2)],
- paused: true,
- timer: null
+
+ if (!ctx) return 0;
+ var context = GL.registerContext(ctx, webGLContextAttributes);
+ return context;
+ },registerContext:function (ctx, webGLContextAttributes) {
+ var handle = _malloc(8); // Make space on the heap to store GL context attributes that need to be accessible as shared between threads.
+ HEAP32[((handle)>>2)]=webGLContextAttributes["explicitSwapControl"]; // explicitSwapControl
+ var context = {
+ handle: handle,
+ attributes: webGLContextAttributes,
+ version: webGLContextAttributes['majorVersion'],
+ GLctx: ctx
};
- // The .silence field tells the constant sample value that corresponds to the safe un-skewed silence value for the wave data.
- if (SDL.audio.format == 0x0008 /*AUDIO_U8*/) {
- SDL.audio.silence = 128; // Audio ranges in [0, 255], so silence is half-way in between.
- } else if (SDL.audio.format == 0x8010 /*AUDIO_S16LSB*/) {
- SDL.audio.silence = 0; // Signed data in range [-32768, 32767], silence is 0.
- } else if (SDL.audio.format == 0x8120 /*AUDIO_F32*/) {
- SDL.audio.silence = 0.0; // Float data in range [-1.0, 1.0], silence is 0.0
- } else {
- throw 'Invalid SDL audio format ' + SDL.audio.format + '!';
- }
- // Round the desired audio frequency up to the next 'common' frequency value.
- // Web Audio API spec states 'An implementation must support sample-rates in at least the range 22050 to 96000.'
- if (SDL.audio.freq <= 0) {
- throw 'Unsupported sound frequency ' + SDL.audio.freq + '!';
- } else if (SDL.audio.freq <= 22050) {
- SDL.audio.freq = 22050; // Take it safe and clamp everything lower than 22kHz to that.
- } else if (SDL.audio.freq <= 32000) {
- SDL.audio.freq = 32000;
- } else if (SDL.audio.freq <= 44100) {
- SDL.audio.freq = 44100;
- } else if (SDL.audio.freq <= 48000) {
- SDL.audio.freq = 48000;
- } else if (SDL.audio.freq <= 96000) {
- SDL.audio.freq = 96000;
- } else {
- throw 'Unsupported sound frequency ' + SDL.audio.freq + '!';
- }
- if (SDL.audio.channels == 0) {
- SDL.audio.channels = 1; // In SDL both 0 and 1 mean mono.
- } else if (SDL.audio.channels < 0 || SDL.audio.channels > 32) {
- throw 'Unsupported number of audio channels for SDL audio: ' + SDL.audio.channels + '!';
- } else if (SDL.audio.channels != 1 && SDL.audio.channels != 2) { // Unsure what SDL audio spec supports. Web Audio spec supports up to 32 channels.
- console.log('Warning: Using untested number of audio channels ' + SDL.audio.channels);
- }
- if (SDL.audio.samples < 128 || SDL.audio.samples > 524288 /* arbitrary cap */) {
- throw 'Unsupported audio callback buffer size ' + SDL.audio.samples + '!';
- } else if ((SDL.audio.samples & (SDL.audio.samples-1)) != 0) {
- throw 'Audio callback buffer size ' + SDL.audio.samples + ' must be a power-of-two!';
- }
-
- var totalSamples = SDL.audio.samples*SDL.audio.channels;
- if (SDL.audio.format == 0x0008 /*AUDIO_U8*/) {
- SDL.audio.bytesPerSample = 1;
- } else if (SDL.audio.format == 0x8010 /*AUDIO_S16LSB*/) {
- SDL.audio.bytesPerSample = 2;
- } else if (SDL.audio.format == 0x8120 /*AUDIO_F32*/) {
- SDL.audio.bytesPerSample = 4;
- } else {
- throw 'Invalid SDL audio format ' + SDL.audio.format + '!';
+
+
+
+ // Store the created context object so that we can access the context given a canvas without having to pass the parameters again.
+ if (ctx.canvas) ctx.canvas.GLctxObject = context;
+ GL.contexts[handle] = context;
+ if (typeof webGLContextAttributes['enableExtensionsByDefault'] === 'undefined' || webGLContextAttributes['enableExtensionsByDefault']) {
+ GL.initExtensions(context);
}
- SDL.audio.bufferSize = totalSamples*SDL.audio.bytesPerSample;
- SDL.audio.bufferDurationSecs = SDL.audio.bufferSize / SDL.audio.bytesPerSample / SDL.audio.channels / SDL.audio.freq; // Duration of a single queued buffer in seconds.
- SDL.audio.bufferingDelay = 50 / 1000; // Audio samples are played with a constant delay of this many seconds to account for browser and jitter.
- SDL.audio.buffer = _malloc(SDL.audio.bufferSize);
- // To account for jittering in frametimes, always have multiple audio buffers queued up for the audio output device.
- // This helps that we won't starve that easily if a frame takes long to complete.
- SDL.audio.numSimultaneouslyQueuedBuffers = Module['SDL_numSimultaneouslyQueuedBuffers'] || 5;
- // Pulls and queues new audio data if appropriate. This function gets "over-called" in both requestAnimationFrames and
- // setTimeouts to ensure that we get the finest granularity possible and as many chances from the browser to fill
- // new audio data. This is because setTimeouts alone have very poor granularity for audio streaming purposes, but also
- // the application might not be using emscripten_set_main_loop to drive the main loop, so we cannot rely on that alone.
- SDL.audio.queueNewAudioData = function SDL_queueNewAudioData() {
- if (!SDL.audio) return;
- for(var i = 0; i < SDL.audio.numSimultaneouslyQueuedBuffers; ++i) {
- // Only queue new data if we don't have enough audio data already in queue. Otherwise skip this time slot
- // and wait to queue more in the next time the callback is run.
- var secsUntilNextPlayStart = SDL.audio.nextPlayTime - SDL.audioContext['currentTime'];
- if (secsUntilNextPlayStart >= SDL.audio.bufferingDelay + SDL.audio.bufferDurationSecs*SDL.audio.numSimultaneouslyQueuedBuffers) return;
- // Ask SDL audio data from the user code.
- Module['dynCall_viii'](SDL.audio.callback, SDL.audio.userdata, SDL.audio.buffer, SDL.audio.bufferSize);
- // And queue it to be played after the currently playing audio stream.
- SDL.audio.pushAudio(SDL.audio.buffer, SDL.audio.bufferSize);
- }
+ return handle;
+ },makeContextCurrent:function (contextHandle) {
+ // Deactivating current context?
+ if (!contextHandle) {
+ GLctx = Module.ctx = GL.currentContext = null;
+ return true;
}
+ var context = GL.contexts[contextHandle];
+ if (!context) {
+ return false;
+ }
+ GLctx = Module.ctx = context.GLctx; // Active WebGL context object.
+ GL.currentContext = context; // Active Emscripten GL layer context object.
+ return true;
+ },getContext:function (contextHandle) {
+ return GL.contexts[contextHandle];
+ },deleteContext:function (contextHandle) {
+ if (GL.currentContext === GL.contexts[contextHandle]) GL.currentContext = null;
+ if (typeof JSEvents === 'object') JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); // Release all JS event handlers on the DOM element that the GL context is associated with since the context is now deleted.
+ if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) GL.contexts[contextHandle].GLctx.canvas.GLctxObject = undefined; // Make sure the canvas object no longer refers to the context object so there are no GC surprises.
+ _free(GL.contexts[contextHandle]);
+ GL.contexts[contextHandle] = null;
+ },initExtensions:function (context) {
+ // If this function is called without a specific context object, init the extensions of the currently active context.
+ if (!context) context = GL.currentContext;
+ if (context.initExtensionsDone) return;
+ context.initExtensionsDone = true;
- // Create a callback function that will be routinely called to ask more audio data from the user application.
- SDL.audio.caller = function SDL_audioCaller() {
- if (!SDL.audio) return;
+ var GLctx = context.GLctx;
- --SDL.audio.numAudioTimersPending;
+ // Detect the presence of a few extensions manually, this GL interop layer itself will need to know if they exist.
- SDL.audio.queueNewAudioData();
+ if (context.version < 2) {
+ // Extension available from Firefox 26 and Google Chrome 30
+ var instancedArraysExt = GLctx.getExtension('ANGLE_instanced_arrays');
+ if (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); };
+ }
- // Queue this callback function to be called again later to pull more audio data.
- var secsUntilNextPlayStart = SDL.audio.nextPlayTime - SDL.audioContext['currentTime'];
+ // Extension available from Firefox 25 and WebKit
+ var vaoExt = GLctx.getExtension('OES_vertex_array_object');
+ if (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); };
+ }
- // Queue the next audio frame push to be performed half-way when the previously queued buffer has finished playing.
- var preemptBufferFeedSecs = SDL.audio.bufferDurationSecs/2.0;
+ var drawBuffersExt = GLctx.getExtension('WEBGL_draw_buffers');
+ if (drawBuffersExt) {
+ GLctx['drawBuffers'] = function(n, bufs) { drawBuffersExt['drawBuffersWEBGL'](n, bufs); };
+ }
+ }
- if (SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) {
- ++SDL.audio.numAudioTimersPending;
- SDL.audio.timer = Browser.safeSetTimeout(SDL.audio.caller, Math.max(0.0, 1000.0*(secsUntilNextPlayStart-preemptBufferFeedSecs)));
+ GLctx.disjointTimerQueryExt = GLctx.getExtension("EXT_disjoint_timer_query");
- // If we are risking starving, immediately queue an extra buffer.
- if (SDL.audio.numAudioTimersPending < SDL.audio.numSimultaneouslyQueuedBuffers) {
- ++SDL.audio.numAudioTimersPending;
- Browser.safeSetTimeout(SDL.audio.caller, 1.0);
+ // These are the 'safe' feature-enabling extensions that don't add any performance impact related to e.g. debugging, and
+ // should be enabled by default so that client GLES2/GL code will not need to go through extra hoops to get its stuff working.
+ // As new extensions are ratified at http://www.khronos.org/registry/webgl/extensions/ , feel free to add your new extensions
+ // here, as long as they don't produce a performance impact for users that might not be using those extensions.
+ // E.g. debugging-related extensions should probably be off by default.
+ var automaticallyEnabledExtensions = [ // Khronos ratified WebGL extensions ordered by number (no debug extensions):
+ "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", "EXT_frag_depth",
+ "WEBGL_draw_buffers", "ANGLE_instanced_arrays", "OES_texture_float_linear",
+ "OES_texture_half_float_linear", "EXT_blend_minmax", "EXT_shader_texture_lod",
+ // Community approved WebGL extensions ordered by number:
+ "WEBGL_compressed_texture_pvrtc", "EXT_color_buffer_half_float", "WEBGL_color_buffer_float",
+ "EXT_sRGB", "WEBGL_compressed_texture_etc1", "EXT_disjoint_timer_query",
+ "WEBGL_compressed_texture_etc", "WEBGL_compressed_texture_astc", "EXT_color_buffer_float",
+ "WEBGL_compressed_texture_s3tc_srgb", "EXT_disjoint_timer_query_webgl2"];
+
+ function shouldEnableAutomatically(extension) {
+ var ret = false;
+ automaticallyEnabledExtensions.forEach(function(include) {
+ if (extension.indexOf(include) != -1) {
+ ret = true;
}
- }
+ });
+ return ret;
+ }
+
+ var exts = GLctx.getSupportedExtensions();
+ if (exts && exts.length > 0) {
+ GLctx.getSupportedExtensions().forEach(function(ext) {
+ if (automaticallyEnabledExtensions.indexOf(ext) != -1) {
+ GLctx.getExtension(ext); // Calling .getExtension enables that extension permanently, no need to store the return value to be enabled.
+ }
+ });
+ }
+ },populateUniformTable:function (program) {
+ var p = GL.programs[program];
+ GL.programInfos[program] = {
+ uniforms: {},
+ maxUniformLength: 0, // This is eagerly computed below, since we already enumerate all uniforms anyway.
+ maxAttributeLength: -1, // This is lazily computed and cached, computed when/if first asked, "-1" meaning not computed yet.
+ maxUniformBlockNameLength: -1 // Lazily computed as well
};
- SDL.audio.audioOutput = new Audio();
+ var ptable = GL.programInfos[program];
+ var utable = ptable.uniforms;
+ // A program's uniform table maps the string name of an uniform to an integer location of that uniform.
+ // The global GL.uniforms map maps integer locations to WebGLUniformLocations.
+ var numUniforms = GLctx.getProgramParameter(p, GLctx.ACTIVE_UNIFORMS);
+ for (var i = 0; i < numUniforms; ++i) {
+ var u = GLctx.getActiveUniform(p, i);
- // Initialize Web Audio API if we haven't done so yet. Note: Only initialize Web Audio context ever once on the web page,
- // since initializing multiple times fails on Chrome saying 'audio resources have been exhausted'.
- SDL.openAudioContext();
- if (!SDL.audioContext) throw 'Web Audio API is not available!';
- SDL.audio.nextPlayTime = 0; // Time in seconds when the next audio block is due to start.
+ var name = u.name;
+ ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length+1);
- // The pushAudio function with a new audio buffer whenever there is new audio data to schedule to be played back on the device.
- SDL.audio.pushAudio=function(ptr,sizeBytes) {
- try {
- if (SDL.audio.paused) return;
+ // Strip off any trailing array specifier we might have got, e.g. "[0]".
+ if (name.indexOf(']', name.length-1) !== -1) {
+ var ls = name.lastIndexOf('[');
+ name = name.slice(0, ls);
+ }
- var sizeSamples = sizeBytes / SDL.audio.bytesPerSample; // How many samples fit in the callback buffer?
- var sizeSamplesPerChannel = sizeSamples / SDL.audio.channels; // How many samples per a single channel fit in the cb buffer?
- if (sizeSamplesPerChannel != SDL.audio.samples) {
- throw 'Received mismatching audio buffer size!';
- }
- // Allocate new sound buffer to be played.
- var source = SDL.audioContext['createBufferSource']();
- var soundBuffer = SDL.audioContext['createBuffer'](SDL.audio.channels,sizeSamplesPerChannel,SDL.audio.freq);
- source['connect'](SDL.audioContext['destination']);
-
- SDL.fillWebAudioBufferFromHeap(ptr, sizeSamplesPerChannel, soundBuffer);
- // Workaround https://bugzilla.mozilla.org/show_bug.cgi?id=883675 by setting the buffer only after filling. The order is important here!
- source['buffer'] = soundBuffer;
-
- // Schedule the generated sample buffer to be played out at the correct time right after the previously scheduled
- // sample buffer has finished.
- var curtime = SDL.audioContext['currentTime'];
- // Don't ever start buffer playbacks earlier from current time than a given constant 'SDL.audio.bufferingDelay', since a browser
- // may not be able to mix that audio clip in immediately, and there may be subsequent jitter that might cause the stream to starve.
- var playtime = Math.max(curtime + SDL.audio.bufferingDelay, SDL.audio.nextPlayTime);
- if (typeof source['start'] !== 'undefined') {
- source['start'](playtime); // New Web Audio API: sound sources are started with a .start() call.
- } else if (typeof source['noteOn'] !== 'undefined') {
- source['noteOn'](playtime); // Support old Web Audio API specification which had the .noteOn() API.
- }
- /*
- // Uncomment to debug SDL buffer feed starves.
- if (SDL.audio.curBufferEnd) {
- var thisBufferStart = Math.round(playtime * SDL.audio.freq);
- if (thisBufferStart != SDL.audio.curBufferEnd) console.log('SDL starved ' + (thisBufferStart - SDL.audio.curBufferEnd) + ' samples!');
- }
- SDL.audio.curBufferEnd = Math.round(playtime * SDL.audio.freq + sizeSamplesPerChannel);
- */
+ // Optimize memory usage slightly: If we have an array of uniforms, e.g. 'vec3 colors[3];', then
+ // only store the string 'colors' in utable, and 'colors[0]', 'colors[1]' and 'colors[2]' will be parsed as 'colors'+i.
+ // Note that for the GL.uniforms table, we still need to fetch the all WebGLUniformLocations for all the indices.
+ var loc = GLctx.getUniformLocation(p, name);
+ if (loc != null)
+ {
+ var id = GL.getNewId(GL.uniforms);
+ utable[name] = [u.size, id];
+ GL.uniforms[id] = loc;
- SDL.audio.nextPlayTime = playtime + SDL.audio.bufferDurationSecs;
- } catch(e) {
- console.log('Web Audio API error playing back audio: ' + e.toString());
+ for (var j = 1; j < u.size; ++j) {
+ var n = name + '['+j+']';
+ loc = GLctx.getUniformLocation(p, n);
+ id = GL.getNewId(GL.uniforms);
+
+ GL.uniforms[id] = loc;
+ }
}
}
+ }};function _eglCreateContext(display, config, hmm, contextAttribs) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
- if (obtained) {
- // Report back the initialized audio parameters.
- HEAP32[((obtained)>>2)]=SDL.audio.freq;
- HEAP16[(((obtained)+(4))>>1)]=SDL.audio.format;
- HEAP8[(((obtained)+(6))>>0)]=SDL.audio.channels;
- HEAP8[(((obtained)+(7))>>0)]=SDL.audio.silence;
- HEAP16[(((obtained)+(8))>>1)]=SDL.audio.samples;
- HEAP32[(((obtained)+(16))>>2)]=SDL.audio.callback;
- HEAP32[(((obtained)+(20))>>2)]=SDL.audio.userdata;
+ // EGL 1.4 spec says default EGL_CONTEXT_CLIENT_VERSION is GLES1, but this is not supported by Emscripten.
+ // So user must pass EGL_CONTEXT_CLIENT_VERSION == 2 to initialize EGL.
+ var glesContextVersion = 1;
+ for(;;) {
+ var param = HEAP32[((contextAttribs)>>2)];
+ if (param == 0x3098 /*EGL_CONTEXT_CLIENT_VERSION*/) {
+ glesContextVersion = HEAP32[(((contextAttribs)+(4))>>2)];
+ } else if (param == 0x3038 /*EGL_NONE*/) {
+ break;
+ } else {
+ /* EGL1.4 specifies only EGL_CONTEXT_CLIENT_VERSION as supported attribute */
+ EGL.setErrorCode(0x3004 /*EGL_BAD_ATTRIBUTE*/);
+ return 0;
}
- SDL.allocateChannels(32);
+ contextAttribs += 8;
+ }
+ if (glesContextVersion != 2) {
+ EGL.setErrorCode(0x3005 /* EGL_BAD_CONFIG */);
+ return 0; /* EGL_NO_CONTEXT */
+ }
- } catch(e) {
- console.log('Initializing SDL audio threw an exception: "' + e.toString() + '"! Continuing without audio.');
- SDL.audio = null;
- SDL.allocateChannels(0);
- if (obtained) {
- HEAP32[((obtained)>>2)]=0;
- HEAP16[(((obtained)+(4))>>1)]=0;
- HEAP8[(((obtained)+(6))>>0)]=0;
- HEAP8[(((obtained)+(7))>>0)]=0;
- HEAP16[(((obtained)+(8))>>1)]=0;
- HEAP32[(((obtained)+(16))>>2)]=0;
- HEAP32[(((obtained)+(20))>>2)]=0;
- }
- }
- if (!SDL.audio) {
- return -1;
+ // convert configuration to GLUT flags
+ var displayMode = 0x0000; /*GLUT_RGB/GLUT_RGBA*/
+ displayMode |= 0x0002; /*GLUT_DOUBLE*/
+ if (EGL.alpha) displayMode |= 0x0008; /*GLUT_ALPHA*/
+ if (EGL.depth) displayMode |= 0x0010; /*GLUT_DEPTH*/
+ if (EGL.stencil) displayMode |= 0x0020; /*GLUT_STENCIL*/
+ if (EGL.antialias) displayMode |= 0x0080; /*GLUT_MULTISAMPLE*/
+
+ _glutInitDisplayMode(displayMode);
+ EGL.windowID = _glutCreateWindow();
+ if (EGL.windowID != 0) {
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ // Note: This function only creates a context, but it shall not make it active.
+ return 62004; // Magic ID for Emscripten EGLContext
+ } else {
+ EGL.setErrorCode(0x3009 /* EGL_BAD_MATCH */); // By the EGL 1.4 spec, an implementation that does not support GLES2 (WebGL in this case), this error code is set.
+ return 0; /* EGL_NO_CONTEXT */
}
- return 0;
}
-
- function _SDL_QuitSubSystem(flags) {
- out('SDL_QuitSubSystem called (and ignored)');
+ function _eglCreateWindowSurface(display, config, win, attrib_list) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
+ if (config != 62002 /* Magic ID for the only EGLConfig supported by Emscripten */) {
+ EGL.setErrorCode(0x3005 /* EGL_BAD_CONFIG */);
+ return 0;
+ }
+ // TODO: Examine attrib_list! Parameters that can be present there are:
+ // - EGL_RENDER_BUFFER (must be EGL_BACK_BUFFER)
+ // - EGL_VG_COLORSPACE (can't be set)
+ // - EGL_VG_ALPHA_FORMAT (can't be set)
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 62006; /* Magic ID for Emscripten 'default surface' */
}
- function ___assert_fail(condition, filename, line, func) {
- abort('Assertion failed: ' + Pointer_stringify(condition) + ', at: ' + [filename ? Pointer_stringify(filename) : 'unknown filename', line, func ? Pointer_stringify(func) : 'unknown function']);
+
+ function _glutDestroyWindow(name) {
+ Module.ctx = Browser.destroyContext(Module['canvas'], true, true);
+ return 1;
+ }function _eglDestroyContext(display, context) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
+
+ if (context != 62004 /* Magic ID for Emscripten EGLContext */) {
+ EGL.setErrorCode(0x3006 /* EGL_BAD_CONTEXT */);
+ return 0;
+ }
+
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1;
}
- function ___lock() {}
+ function _eglDestroySurface(display, surface) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
+ if (surface != 62006 /* Magic ID for the only EGLSurface supported by Emscripten */) {
+ EGL.setErrorCode(0x300D /* EGL_BAD_SURFACE */);
+ return 1;
+ }
+ if (EGL.currentReadSurface == surface) {
+ EGL.currentReadSurface = 0;
+ }
+ if (EGL.currentDrawSurface == surface) {
+ EGL.currentDrawSurface = 0;
+ }
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1; /* Magic ID for Emscripten 'default surface' */
+ }
-
- var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:function (dirfd, path) {
- if (path[0] !== '/') {
- // relative path
- var dir;
- if (dirfd === -100) {
- dir = FS.cwd();
- } else {
- var dirstream = FS.getStream(dirfd);
- if (!dirstream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
- dir = dirstream.path;
- }
- path = PATH.join2(dir, path);
- }
- return path;
- },doStat:function (func, path, buf) {
- try {
- var stat = func(path);
- } catch (e) {
- if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
- // an error occurred while trying to look up the path; we should just report ENOTDIR
- return -ERRNO_CODES.ENOTDIR;
- }
- throw e;
- }
- HEAP32[((buf)>>2)]=stat.dev;
- HEAP32[(((buf)+(4))>>2)]=0;
- HEAP32[(((buf)+(8))>>2)]=stat.ino;
- HEAP32[(((buf)+(12))>>2)]=stat.mode;
- HEAP32[(((buf)+(16))>>2)]=stat.nlink;
- HEAP32[(((buf)+(20))>>2)]=stat.uid;
- HEAP32[(((buf)+(24))>>2)]=stat.gid;
- HEAP32[(((buf)+(28))>>2)]=stat.rdev;
- HEAP32[(((buf)+(32))>>2)]=0;
- HEAP32[(((buf)+(36))>>2)]=stat.size;
- HEAP32[(((buf)+(40))>>2)]=4096;
- HEAP32[(((buf)+(44))>>2)]=stat.blocks;
- HEAP32[(((buf)+(48))>>2)]=(stat.atime.getTime() / 1000)|0;
- HEAP32[(((buf)+(52))>>2)]=0;
- HEAP32[(((buf)+(56))>>2)]=(stat.mtime.getTime() / 1000)|0;
- HEAP32[(((buf)+(60))>>2)]=0;
- HEAP32[(((buf)+(64))>>2)]=(stat.ctime.getTime() / 1000)|0;
- HEAP32[(((buf)+(68))>>2)]=0;
- HEAP32[(((buf)+(72))>>2)]=stat.ino;
+ function _eglGetConfigAttrib(display, config, attribute, value) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
return 0;
- },doMsync:function (addr, stream, len, flags) {
- var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len));
- FS.msync(stream, buffer, 0, len, flags);
- },doMkdir:function (path, mode) {
- // remove a trailing slash, if one - /a/b/ has basename of '', but
- // we want to create b in the context of this function
- path = PATH.normalize(path);
- if (path[path.length-1] === '/') path = path.substr(0, path.length-1);
- FS.mkdir(path, mode, 0);
+ }
+ if (config != 62002 /* Magic ID for the only EGLConfig supported by Emscripten */) {
+ EGL.setErrorCode(0x3005 /* EGL_BAD_CONFIG */);
return 0;
- },doMknod:function (path, mode, dev) {
- // we don't want this in the JS API as it uses mknod to create all nodes.
- switch (mode & 61440) {
- case 32768:
- case 8192:
- case 24576:
- case 4096:
- case 49152:
- break;
- default: return -ERRNO_CODES.EINVAL;
- }
- FS.mknod(path, mode, dev);
+ }
+ if (!value) {
+ EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */);
return 0;
- },doReadlink:function (path, buf, bufsize) {
- if (bufsize <= 0) return -ERRNO_CODES.EINVAL;
- var ret = FS.readlink(path);
-
- var len = Math.min(bufsize, lengthBytesUTF8(ret));
- var endChar = HEAP8[buf+len];
- stringToUTF8(ret, buf, bufsize+1);
- // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!)
- // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write.
- HEAP8[buf+len] = endChar;
-
- return len;
- },doAccess:function (path, amode) {
- if (amode & ~7) {
- // need a valid mode
- return -ERRNO_CODES.EINVAL;
- }
- var node;
- var lookup = FS.lookupPath(path, { follow: true });
- node = lookup.node;
- var perms = '';
- if (amode & 4) perms += 'r';
- if (amode & 2) perms += 'w';
- if (amode & 1) perms += 'x';
- if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) {
- return -ERRNO_CODES.EACCES;
- }
+ }
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ switch(attribute) {
+ case 0x3020: // EGL_BUFFER_SIZE
+ HEAP32[((value)>>2)]=32;
+ return 1;
+ case 0x3021: // EGL_ALPHA_SIZE
+ HEAP32[((value)>>2)]=8;
+ return 1;
+ case 0x3022: // EGL_BLUE_SIZE
+ HEAP32[((value)>>2)]=8;
+ return 1;
+ case 0x3023: // EGL_GREEN_SIZE
+ HEAP32[((value)>>2)]=8;
+ return 1;
+ case 0x3024: // EGL_RED_SIZE
+ HEAP32[((value)>>2)]=8;
+ return 1;
+ case 0x3025: // EGL_DEPTH_SIZE
+ HEAP32[((value)>>2)]=24;
+ return 1;
+ case 0x3026: // EGL_STENCIL_SIZE
+ HEAP32[((value)>>2)]=8;
+ return 1;
+ case 0x3027: // EGL_CONFIG_CAVEAT
+ // We can return here one of EGL_NONE (0x3038), EGL_SLOW_CONFIG (0x3050) or EGL_NON_CONFORMANT_CONFIG (0x3051).
+ HEAP32[((value)>>2)]=0x3038;
+ return 1;
+ case 0x3028: // EGL_CONFIG_ID
+ HEAP32[((value)>>2)]=62002;
+ return 1;
+ case 0x3029: // EGL_LEVEL
+ HEAP32[((value)>>2)]=0;
+ return 1;
+ case 0x302A: // EGL_MAX_PBUFFER_HEIGHT
+ HEAP32[((value)>>2)]=4096;
+ return 1;
+ case 0x302B: // EGL_MAX_PBUFFER_PIXELS
+ HEAP32[((value)>>2)]=16777216;
+ return 1;
+ case 0x302C: // EGL_MAX_PBUFFER_WIDTH
+ HEAP32[((value)>>2)]=4096;
+ return 1;
+ case 0x302D: // EGL_NATIVE_RENDERABLE
+ HEAP32[((value)>>2)]=0;
+ return 1;
+ case 0x302E: // EGL_NATIVE_VISUAL_ID
+ HEAP32[((value)>>2)]=0;
+ return 1;
+ case 0x302F: // EGL_NATIVE_VISUAL_TYPE
+ HEAP32[((value)>>2)]=0x3038;
+ return 1;
+ case 0x3031: // EGL_SAMPLES
+ HEAP32[((value)>>2)]=4;
+ return 1;
+ case 0x3032: // EGL_SAMPLE_BUFFERS
+ HEAP32[((value)>>2)]=1;
+ return 1;
+ case 0x3033: // EGL_SURFACE_TYPE
+ HEAP32[((value)>>2)]=0x0004;
+ return 1;
+ case 0x3034: // EGL_TRANSPARENT_TYPE
+ // If this returns EGL_TRANSPARENT_RGB (0x3052), transparency is used through color-keying. No such thing applies to Emscripten canvas.
+ HEAP32[((value)>>2)]=0x3038;
+ return 1;
+ case 0x3035: // EGL_TRANSPARENT_BLUE_VALUE
+ case 0x3036: // EGL_TRANSPARENT_GREEN_VALUE
+ case 0x3037: // EGL_TRANSPARENT_RED_VALUE
+ // "If EGL_TRANSPARENT_TYPE is EGL_NONE, then the values for EGL_TRANSPARENT_RED_VALUE, EGL_TRANSPARENT_GREEN_VALUE, and EGL_TRANSPARENT_BLUE_VALUE are undefined."
+ HEAP32[((value)>>2)]=-1;
+ return 1;
+ case 0x3039: // EGL_BIND_TO_TEXTURE_RGB
+ case 0x303A: // EGL_BIND_TO_TEXTURE_RGBA
+ HEAP32[((value)>>2)]=0;
+ return 1;
+ case 0x303B: // EGL_MIN_SWAP_INTERVAL
+ case 0x303C: // EGL_MAX_SWAP_INTERVAL
+ HEAP32[((value)>>2)]=1;
+ return 1;
+ case 0x303D: // EGL_LUMINANCE_SIZE
+ case 0x303E: // EGL_ALPHA_MASK_SIZE
+ HEAP32[((value)>>2)]=0;
+ return 1;
+ case 0x303F: // EGL_COLOR_BUFFER_TYPE
+ // EGL has two types of buffers: EGL_RGB_BUFFER and EGL_LUMINANCE_BUFFER.
+ HEAP32[((value)>>2)]=0x308E;
+ return 1;
+ case 0x3040: // EGL_RENDERABLE_TYPE
+ // A bit combination of EGL_OPENGL_ES_BIT,EGL_OPENVG_BIT,EGL_OPENGL_ES2_BIT and EGL_OPENGL_BIT.
+ HEAP32[((value)>>2)]=0x0004;
+ return 1;
+ case 0x3042: // EGL_CONFORMANT
+ // "EGL_CONFORMANT is a mask indicating if a client API context created with respect to the corresponding EGLConfig will pass the required conformance tests for that API."
+ HEAP32[((value)>>2)]=0;
+ return 1;
+ default:
+ EGL.setErrorCode(0x3004 /* EGL_BAD_ATTRIBUTE */);
return 0;
- },doDup:function (path, flags, suggestFD) {
- var suggest = FS.getStream(suggestFD);
- if (suggest) FS.close(suggest);
- return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
- },doReadv:function (stream, iov, iovcnt, offset) {
- var ret = 0;
- for (var i = 0; i < iovcnt; i++) {
- var ptr = HEAP32[(((iov)+(i*8))>>2)];
- var len = HEAP32[(((iov)+(i*8 + 4))>>2)];
- var curr = FS.read(stream, HEAP8,ptr, len, offset);
- if (curr < 0) return -1;
- ret += curr;
- if (curr < len) break; // nothing more to read
- }
- return ret;
- },doWritev:function (stream, iov, iovcnt, offset) {
- var ret = 0;
- for (var i = 0; i < iovcnt; i++) {
- var ptr = HEAP32[(((iov)+(i*8))>>2)];
- var len = HEAP32[(((iov)+(i*8 + 4))>>2)];
- var curr = FS.write(stream, HEAP8,ptr, len, offset);
- if (curr < 0) return -1;
- ret += curr;
- }
- return ret;
- },varargs:0,get:function (varargs) {
- SYSCALLS.varargs += 4;
- var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
- return ret;
- },getStr:function () {
- var ret = Pointer_stringify(SYSCALLS.get());
- return ret;
- },getStreamFromFD:function () {
- var stream = FS.getStream(SYSCALLS.get());
- if (!stream) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
- return stream;
- },getSocketFromFD:function () {
- var socket = SOCKFS.getSocket(SYSCALLS.get());
- if (!socket) throw new FS.ErrnoError(ERRNO_CODES.EBADF);
- return socket;
- },getSocketAddress:function (allowNull) {
- var addrp = SYSCALLS.get(), addrlen = SYSCALLS.get();
- if (allowNull && addrp === 0) return null;
- var info = __read_sockaddr(addrp, addrlen);
- if (info.errno) throw new FS.ErrnoError(info.errno);
- info.addr = DNS.lookup_addr(info.addr) || info.addr;
- return info;
- },get64:function () {
- var low = SYSCALLS.get(), high = SYSCALLS.get();
- if (low >= 0) assert(high === 0);
- else assert(high === -1);
- return low;
- },getZero:function () {
- assert(SYSCALLS.get() === 0);
- }};function ___syscall140(which, varargs) {SYSCALLS.varargs = varargs;
- try {
- // llseek
- var stream = SYSCALLS.getStreamFromFD(), offset_high = SYSCALLS.get(), offset_low = SYSCALLS.get(), result = SYSCALLS.get(), whence = SYSCALLS.get();
- // NOTE: offset_high is unused - Emscripten's off_t is 32-bit
- var offset = offset_low;
- FS.llseek(stream, offset, whence);
- HEAP32[((result)>>2)]=stream.position;
- if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state
- return 0;
- } catch (e) {
- if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
- return -e.errno;
- }
- }
+ }
+ }
- function ___syscall145(which, varargs) {SYSCALLS.varargs = varargs;
- try {
- // readv
- var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
- return SYSCALLS.doReadv(stream, iov, iovcnt);
- } catch (e) {
- if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
- return -e.errno;
- }
- }
+ function _eglGetDisplay(nativeDisplayType) {
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ // Note: As a 'conformant' implementation of EGL, we would prefer to init here only if the user
+ // calls this function with EGL_DEFAULT_DISPLAY. Other display IDs would be preferred to be unsupported
+ // and EGL_NO_DISPLAY returned. Uncomment the following code lines to do this.
+ // Instead, an alternative route has been preferred, namely that the Emscripten EGL implementation
+ // "emulates" X11, and eglGetDisplay is expected to accept/receive a pointer to an X11 Display object.
+ // Therefore, be lax and allow anything to be passed in, and return the magic handle to our default EGLDisplay object.
+
+ // if (nativeDisplayType == 0 /* EGL_DEFAULT_DISPLAY */) {
+ return 62000; // Magic ID for Emscripten 'default display'
+ // }
+ // else
+ // return 0; // EGL_NO_DISPLAY
+ }
- function ___syscall146(which, varargs) {SYSCALLS.varargs = varargs;
- try {
- // writev
- var stream = SYSCALLS.getStreamFromFD(), iov = SYSCALLS.get(), iovcnt = SYSCALLS.get();
- return SYSCALLS.doWritev(stream, iov, iovcnt);
- } catch (e) {
- if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
- return -e.errno;
- }
- }
+ function _eglGetError() {
+ return EGL.errorCode;
+ }
- function ___syscall221(which, varargs) {SYSCALLS.varargs = varargs;
- try {
- // fcntl64
- var stream = SYSCALLS.getStreamFromFD(), cmd = SYSCALLS.get();
- switch (cmd) {
- case 0: {
- var arg = SYSCALLS.get();
- if (arg < 0) {
- return -ERRNO_CODES.EINVAL;
- }
- var newStream;
- newStream = FS.open(stream.path, stream.flags, 0, arg);
- return newStream.fd;
- }
- case 1:
- case 2:
- return 0; // FD_CLOEXEC makes no sense for a single process.
- case 3:
- return stream.flags;
- case 4: {
- var arg = SYSCALLS.get();
- stream.flags |= arg;
- return 0;
- }
- case 12:
- case 12: {
- var arg = SYSCALLS.get();
- var offset = 0;
- // We're always unlocked.
- HEAP16[(((arg)+(offset))>>1)]=2;
- return 0;
+ function _eglGetProcAddress(name_) {
+ return _emscripten_GetProcAddress(name_);
+ }
+
+ function _eglInitialize(display, majorVersion, minorVersion) {
+ if (display == 62000 /* Magic ID for Emscripten 'default display' */) {
+ if (majorVersion) {
+ HEAP32[((majorVersion)>>2)]=1; // Advertise EGL Major version: '1'
}
- case 13:
- case 14:
- case 13:
- case 14:
- return 0; // Pretend that the locking is successful.
- case 16:
- case 8:
- return -ERRNO_CODES.EINVAL; // These are for sockets. We don't have them fully implemented yet.
- case 9:
- // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves.
- ___setErrNo(ERRNO_CODES.EINVAL);
- return -1;
- default: {
- return -ERRNO_CODES.EINVAL;
+ if (minorVersion) {
+ HEAP32[((minorVersion)>>2)]=4; // Advertise EGL Minor version: '4'
}
+ EGL.defaultDisplayInitialized = true;
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1;
+ }
+ else {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
}
- } catch (e) {
- if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
- return -e.errno;
- }
- }
+ }
- function ___syscall5(which, varargs) {SYSCALLS.varargs = varargs;
- try {
- // open
- var pathname = SYSCALLS.getStr(), flags = SYSCALLS.get(), mode = SYSCALLS.get() // optional TODO
- var stream = FS.open(pathname, flags, mode);
- return stream.fd;
- } catch (e) {
- if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
- return -e.errno;
- }
- }
+ function _eglMakeCurrent(display, draw, read, context) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0 /* EGL_FALSE */;
+ }
+ //\todo An EGL_NOT_INITIALIZED error is generated if EGL is not initialized for dpy.
+ if (context != 0 && context != 62004 /* Magic ID for Emscripten EGLContext */) {
+ EGL.setErrorCode(0x3006 /* EGL_BAD_CONTEXT */);
+ return 0;
+ }
+ if ((read != 0 && read != 62006) || (draw != 0 && draw != 62006 /* Magic ID for Emscripten 'default surface' */)) {
+ EGL.setErrorCode(0x300D /* EGL_BAD_SURFACE */);
+ return 0;
+ }
+ EGL.currentContext = context;
+ EGL.currentDrawSurface = draw;
+ EGL.currentReadSurface = read;
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1 /* EGL_TRUE */;
+ }
- function ___syscall54(which, varargs) {SYSCALLS.varargs = varargs;
- try {
- // ioctl
- var stream = SYSCALLS.getStreamFromFD(), op = SYSCALLS.get();
- switch (op) {
- case 21509:
- case 21505: {
- if (!stream.tty) return -ERRNO_CODES.ENOTTY;
- return 0;
- }
- case 21510:
- case 21511:
- case 21512:
- case 21506:
- case 21507:
- case 21508: {
- if (!stream.tty) return -ERRNO_CODES.ENOTTY;
- return 0; // no-op, not actually adjusting terminal settings
- }
- case 21519: {
- if (!stream.tty) return -ERRNO_CODES.ENOTTY;
- var argp = SYSCALLS.get();
- HEAP32[((argp)>>2)]=0;
- return 0;
- }
- case 21520: {
- if (!stream.tty) return -ERRNO_CODES.ENOTTY;
- return -ERRNO_CODES.EINVAL; // not supported
- }
- case 21531: {
- var argp = SYSCALLS.get();
- return FS.ioctl(stream, op, argp);
- }
- case 21523: {
- // TODO: in theory we should write to the winsize struct that gets
- // passed in, but for now musl doesn't read anything on it
- if (!stream.tty) return -ERRNO_CODES.ENOTTY;
- return 0;
- }
- case 21524: {
- // TODO: technically, this ioctl call should change the window size.
- // but, since emscripten doesn't have any concept of a terminal window
- // yet, we'll just silently throw it away as we do TIOCGWINSZ
- if (!stream.tty) return -ERRNO_CODES.ENOTTY;
+ function _eglQueryString(display, name) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
+ //\todo An EGL_NOT_INITIALIZED error is generated if EGL is not initialized for dpy.
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ if (EGL.stringCache[name]) return EGL.stringCache[name];
+ var ret;
+ switch(name) {
+ case 0x3053 /* EGL_VENDOR */: ret = allocate(intArrayFromString("Emscripten"), 'i8', ALLOC_NORMAL); break;
+ case 0x3054 /* EGL_VERSION */: ret = allocate(intArrayFromString("1.4 Emscripten EGL"), 'i8', ALLOC_NORMAL); break;
+ case 0x3055 /* EGL_EXTENSIONS */: ret = allocate(intArrayFromString(""), 'i8', ALLOC_NORMAL); break; // Currently not supporting any EGL extensions.
+ case 0x308D /* EGL_CLIENT_APIS */: ret = allocate(intArrayFromString("OpenGL_ES"), 'i8', ALLOC_NORMAL); break;
+ default:
+ EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */);
return 0;
- }
- default: abort('bad ioctl syscall ' + op);
}
- } catch (e) {
- if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
- return -e.errno;
- }
- }
-
- function ___syscall6(which, varargs) {SYSCALLS.varargs = varargs;
- try {
- // close
- var stream = SYSCALLS.getStreamFromFD();
- FS.close(stream);
- return 0;
- } catch (e) {
- if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e);
- return -e.errno;
- }
- }
-
- function ___unlock() {}
+ EGL.stringCache[name] = ret;
+ return ret;
+ }
+ function _eglSwapBuffers() {
- var EGL={errorCode:12288,defaultDisplayInitialized:false,currentContext:0,currentReadSurface:0,currentDrawSurface:0,alpha:false,depth:true,stencil:true,antialias:true,stringCache:{},setErrorCode:function (code) {
- EGL.errorCode = code;
- },chooseConfig:function (display, attribList, config, config_size, numConfigs) {
- if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
- EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
- return 0;
- }
+ if (!EGL.defaultDisplayInitialized) {
+ EGL.setErrorCode(0x3001 /* EGL_NOT_INITIALIZED */);
+ } else if (!Module.ctx) {
+ EGL.setErrorCode(0x3002 /* EGL_BAD_ACCESS */);
+ } else if (Module.ctx.isContextLost()) {
+ EGL.setErrorCode(0x300E /* EGL_CONTEXT_LOST */);
+ } else {
+ // According to documentation this does an implicit flush.
+ // Due to discussion at https://github.com/kripken/emscripten/pull/1871
+ // the flush was removed since this _may_ result in slowing code down.
+ //_glFlush();
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1 /* EGL_TRUE */;
+ }
+ return 0 /* EGL_FALSE */;
+ }
+
+ function _eglSwapInterval(display, interval) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
+ if (interval == 0) _emscripten_set_main_loop_timing(0/*EM_TIMING_SETTIMEOUT*/, 0);
+ else _emscripten_set_main_loop_timing(1/*EM_TIMING_RAF*/, interval);
- if (attribList) {
- // read attribList if it is non-null
- for(;;) {
- var param = HEAP32[((attribList)>>2)];
- if (param == 0x3021 /*EGL_ALPHA_SIZE*/) {
- var alphaSize = HEAP32[(((attribList)+(4))>>2)];
- EGL.alpha = (alphaSize > 0);
- } else if (param == 0x3025 /*EGL_DEPTH_SIZE*/) {
- var depthSize = HEAP32[(((attribList)+(4))>>2)];
- EGL.depth = (depthSize > 0);
- } else if (param == 0x3026 /*EGL_STENCIL_SIZE*/) {
- var stencilSize = HEAP32[(((attribList)+(4))>>2)];
- EGL.stencil = (stencilSize > 0);
- } else if (param == 0x3031 /*EGL_SAMPLES*/) {
- var samples = HEAP32[(((attribList)+(4))>>2)];
- EGL.antialias = (samples > 0);
- } else if (param == 0x3032 /*EGL_SAMPLE_BUFFERS*/) {
- var samples = HEAP32[(((attribList)+(4))>>2)];
- EGL.antialias = (samples == 1);
- } else if (param == 0x3038 /*EGL_NONE*/) {
- break;
- }
- attribList += 8;
- }
- }
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1;
+ }
+
+ function _eglTerminate(display) {
+ if (display != 62000 /* Magic ID for Emscripten 'default display' */) {
+ EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */);
+ return 0;
+ }
+ EGL.currentContext = 0;
+ EGL.currentReadSurface = 0;
+ EGL.currentDrawSurface = 0;
+ EGL.defaultDisplayInitialized = false;
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1;
+ }
+
- if ((!config || !config_size) && !numConfigs) {
- EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */);
- return 0;
- }
- if (numConfigs) {
- HEAP32[((numConfigs)>>2)]=1; // Total number of supported configs: 1.
- }
- if (config && config_size > 0) {
- HEAP32[((config)>>2)]=62002;
- }
-
- EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
- return 1;
- }};function _eglGetProcAddress(name_) {
- return _emscripten_GetProcAddress(name_);
+ function _eglWaitClient() {
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1;
+ }function _eglWaitGL() {
+ return _eglWaitClient.apply(null, arguments)
+ }
+
+ function _eglWaitNative(nativeEngineId) {
+ EGL.setErrorCode(0x3000 /* EGL_SUCCESS */);
+ return 1;
}
+ var _emscripten_asm_const_int=true;
+
+
@@ -8179,7 +7998,31 @@ function copyTempDouble(ptr) {
useCapture: useCapture
};
JSEvents.registerOrRemoveHandler(eventHandler);
- }};function _emscripten_exit_pointerlock() {
+ }};var __currentFullscreenStrategy={};function _emscripten_exit_fullscreen() {
+ if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1;
+ // Make sure no queued up calls will fire after this.
+ JSEvents.removeDeferredCalls(JSEvents.requestFullscreen);
+
+ if (document.exitFullscreen) {
+ document.exitFullscreen();
+ } else if (document.msExitFullscreen) {
+ document.msExitFullscreen();
+ } else if (document.mozCancelFullScreen) {
+ document.mozCancelFullScreen();
+ } else if (document.webkitExitFullscreen) {
+ document.webkitExitFullscreen();
+ } else {
+ return -1;
+ }
+
+ if (__currentFullscreenStrategy.canvasResizedCallback) {
+ Module['dynCall_iiii'](__currentFullscreenStrategy.canvasResizedCallback, 37, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData);
+ }
+
+ return 0;
+ }
+
+ function _emscripten_exit_pointerlock() {
// Make sure no queued up calls will fire after this.
JSEvents.removeDeferredCalls(JSEvents.requestPointerLock);
@@ -8197,6 +8040,27 @@ function copyTempDouble(ptr) {
return 0;
}
+ function _emscripten_get_device_pixel_ratio() {
+ return window.devicePixelRatio || 1.0;
+ }
+
+ function _emscripten_get_element_css_size(target, width, height) {
+ if (target) target = JSEvents.findEventTarget(target);
+ else target = Module['canvas'];
+ if (!target) return -4;
+
+ if (target.getBoundingClientRect) {
+ var rect = target.getBoundingClientRect();
+ HEAPF64[((width)>>3)]=rect.right - rect.left;
+ HEAPF64[((height)>>3)]=rect.bottom - rect.top;
+ } else {
+ HEAPF64[((width)>>3)]=target.clientWidth;
+ HEAPF64[((height)>>3)]=target.clientHeight;
+ }
+
+ return 0;
+ }
+
function __emscripten_sample_gamepad_data() {
// Polling gamepads generates garbage, so don't do it when we know there are no gamepads connected.
@@ -8245,241 +8109,7 @@ function copyTempDouble(ptr) {
err('missing function: emscripten_glAccum'); abort(-1);
}
-
- var GL={counter:1,lastError:0,buffers:[],mappedBuffers:{},programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},currentContext:null,offscreenCanvases:{},timerQueriesEXT:[],byteSizeByTypeRoot:5120,byteSizeByType:[1,1,2,2,4,4,4,2,3,4,8],programInfos:{},stringCache:{},tempFixedLengthArray:[],packAlignment:4,unpackAlignment:4,init:function () {
- GL.miniTempBuffer = new Float32Array(GL.MINI_TEMP_BUFFER_SIZE);
- for (var i = 0; i < GL.MINI_TEMP_BUFFER_SIZE; i++) {
- GL.miniTempBufferViews[i] = GL.miniTempBuffer.subarray(0, i+1);
- }
-
- // For functions such as glDrawBuffers, glInvalidateFramebuffer and glInvalidateSubFramebuffer that need to pass a short array to the WebGL API,
- // create a set of short fixed-length arrays to avoid having to generate any garbage when calling those functions.
- for (var i = 0; i < 32; i++) {
- GL.tempFixedLengthArray.push(new Array(i));
- }
- },recordError:function recordError(errorCode) {
- if (!GL.lastError) {
- GL.lastError = errorCode;
- }
- },getNewId:function (table) {
- var ret = GL.counter++;
- for (var i = table.length; i < ret; i++) {
- table[i] = null;
- }
- return ret;
- },MINI_TEMP_BUFFER_SIZE:256,miniTempBuffer:null,miniTempBufferViews:[0],getSource:function (shader, count, string, length) {
- var source = '';
- for (var i = 0; i < count; ++i) {
- var frag;
- if (length) {
- var len = HEAP32[(((length)+(i*4))>>2)];
- if (len < 0) {
- frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)]);
- } else {
- frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)], len);
- }
- } else {
- frag = Pointer_stringify(HEAP32[(((string)+(i*4))>>2)]);
- }
- source += frag;
- }
- return source;
- },createContext:function (canvas, webGLContextAttributes) {
- if (typeof webGLContextAttributes['majorVersion'] === 'undefined' && typeof webGLContextAttributes['minorVersion'] === 'undefined') {
- webGLContextAttributes['majorVersion'] = 1;
- webGLContextAttributes['minorVersion'] = 0;
- }
-
-
-
- var ctx;
- var errorInfo = '?';
- function onContextCreationError(event) {
- errorInfo = event.statusMessage || errorInfo;
- }
- try {
- canvas.addEventListener('webglcontextcreationerror', onContextCreationError, false);
- try {
- if (webGLContextAttributes['majorVersion'] == 1 && webGLContextAttributes['minorVersion'] == 0) {
- ctx = canvas.getContext("webgl", webGLContextAttributes) || canvas.getContext("experimental-webgl", webGLContextAttributes);
- } else if (webGLContextAttributes['majorVersion'] == 2 && webGLContextAttributes['minorVersion'] == 0) {
- ctx = canvas.getContext("webgl2", webGLContextAttributes);
- } else {
- throw 'Unsupported WebGL context version ' + majorVersion + '.' + minorVersion + '!'
- }
- } finally {
- canvas.removeEventListener('webglcontextcreationerror', onContextCreationError, false);
- }
- if (!ctx) throw ':(';
- } catch (e) {
- return 0;
- }
-
- if (!ctx) return 0;
- var context = GL.registerContext(ctx, webGLContextAttributes);
- return context;
- },registerContext:function (ctx, webGLContextAttributes) {
- var handle = _malloc(8); // Make space on the heap to store GL context attributes that need to be accessible as shared between threads.
- HEAP32[((handle)>>2)]=webGLContextAttributes["explicitSwapControl"]; // explicitSwapControl
- var context = {
- handle: handle,
- attributes: webGLContextAttributes,
- version: webGLContextAttributes['majorVersion'],
- GLctx: ctx
- };
-
-
-
- // Store the created context object so that we can access the context given a canvas without having to pass the parameters again.
- if (ctx.canvas) ctx.canvas.GLctxObject = context;
- GL.contexts[handle] = context;
- if (typeof webGLContextAttributes['enableExtensionsByDefault'] === 'undefined' || webGLContextAttributes['enableExtensionsByDefault']) {
- GL.initExtensions(context);
- }
-
-
-
-
- return handle;
- },makeContextCurrent:function (contextHandle) {
- // Deactivating current context?
- if (!contextHandle) {
- GLctx = Module.ctx = GL.currentContext = null;
- return true;
- }
- var context = GL.contexts[contextHandle];
- if (!context) {
- return false;
- }
- GLctx = Module.ctx = context.GLctx; // Active WebGL context object.
- GL.currentContext = context; // Active Emscripten GL layer context object.
- return true;
- },getContext:function (contextHandle) {
- return GL.contexts[contextHandle];
- },deleteContext:function (contextHandle) {
- if (GL.currentContext === GL.contexts[contextHandle]) GL.currentContext = null;
- if (typeof JSEvents === 'object') JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); // Release all JS event handlers on the DOM element that the GL context is associated with since the context is now deleted.
- if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) GL.contexts[contextHandle].GLctx.canvas.GLctxObject = undefined; // Make sure the canvas object no longer refers to the context object so there are no GC surprises.
- _free(GL.contexts[contextHandle]);
- GL.contexts[contextHandle] = null;
- },initExtensions:function (context) {
- // If this function is called without a specific context object, init the extensions of the currently active context.
- if (!context) context = GL.currentContext;
-
- if (context.initExtensionsDone) return;
- context.initExtensionsDone = true;
-
- var GLctx = context.GLctx;
-
- // Detect the presence of a few extensions manually, this GL interop layer itself will need to know if they exist.
-
- if (context.version < 2) {
- // Extension available from Firefox 26 and Google Chrome 30
- var instancedArraysExt = GLctx.getExtension('ANGLE_instanced_arrays');
- if (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); };
- }
-
- // Extension available from Firefox 25 and WebKit
- var vaoExt = GLctx.getExtension('OES_vertex_array_object');
- if (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');
- if (drawBuffersExt) {
- GLctx['drawBuffers'] = function(n, bufs) { drawBuffersExt['drawBuffersWEBGL'](n, bufs); };
- }
- }
-
- GLctx.disjointTimerQueryExt = GLctx.getExtension("EXT_disjoint_timer_query");
-
- // These are the 'safe' feature-enabling extensions that don't add any performance impact related to e.g. debugging, and
- // should be enabled by default so that client GLES2/GL code will not need to go through extra hoops to get its stuff working.
- // As new extensions are ratified at http://www.khronos.org/registry/webgl/extensions/ , feel free to add your new extensions
- // here, as long as they don't produce a performance impact for users that might not be using those extensions.
- // E.g. debugging-related extensions should probably be off by default.
- var automaticallyEnabledExtensions = [ // Khronos ratified WebGL extensions ordered by number (no debug extensions):
- "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", "EXT_frag_depth",
- "WEBGL_draw_buffers", "ANGLE_instanced_arrays", "OES_texture_float_linear",
- "OES_texture_half_float_linear", "EXT_blend_minmax", "EXT_shader_texture_lod",
- // Community approved WebGL extensions ordered by number:
- "WEBGL_compressed_texture_pvrtc", "EXT_color_buffer_half_float", "WEBGL_color_buffer_float",
- "EXT_sRGB", "WEBGL_compressed_texture_etc1", "EXT_disjoint_timer_query",
- "WEBGL_compressed_texture_etc", "WEBGL_compressed_texture_astc", "EXT_color_buffer_float",
- "WEBGL_compressed_texture_s3tc_srgb", "EXT_disjoint_timer_query_webgl2"];
-
- function shouldEnableAutomatically(extension) {
- var ret = false;
- automaticallyEnabledExtensions.forEach(function(include) {
- if (extension.indexOf(include) != -1) {
- ret = true;
- }
- });
- return ret;
- }
-
- var exts = GLctx.getSupportedExtensions();
- if (exts && exts.length > 0) {
- GLctx.getSupportedExtensions().forEach(function(ext) {
- if (automaticallyEnabledExtensions.indexOf(ext) != -1) {
- GLctx.getExtension(ext); // Calling .getExtension enables that extension permanently, no need to store the return value to be enabled.
- }
- });
- }
- },populateUniformTable:function (program) {
- var p = GL.programs[program];
- GL.programInfos[program] = {
- uniforms: {},
- maxUniformLength: 0, // This is eagerly computed below, since we already enumerate all uniforms anyway.
- maxAttributeLength: -1, // This is lazily computed and cached, computed when/if first asked, "-1" meaning not computed yet.
- maxUniformBlockNameLength: -1 // Lazily computed as well
- };
-
- var ptable = GL.programInfos[program];
- var utable = ptable.uniforms;
- // A program's uniform table maps the string name of an uniform to an integer location of that uniform.
- // The global GL.uniforms map maps integer locations to WebGLUniformLocations.
- var numUniforms = GLctx.getProgramParameter(p, GLctx.ACTIVE_UNIFORMS);
- for (var i = 0; i < numUniforms; ++i) {
- var u = GLctx.getActiveUniform(p, i);
-
- var name = u.name;
- ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length+1);
-
- // Strip off any trailing array specifier we might have got, e.g. "[0]".
- if (name.indexOf(']', name.length-1) !== -1) {
- var ls = name.lastIndexOf('[');
- name = name.slice(0, ls);
- }
-
- // Optimize memory usage slightly: If we have an array of uniforms, e.g. 'vec3 colors[3];', then
- // only store the string 'colors' in utable, and 'colors[0]', 'colors[1]' and 'colors[2]' will be parsed as 'colors'+i.
- // Note that for the GL.uniforms table, we still need to fetch the all WebGLUniformLocations for all the indices.
- var loc = GLctx.getUniformLocation(p, name);
- if (loc != null)
- {
- var id = GL.getNewId(GL.uniforms);
- utable[name] = [u.size, id];
- GL.uniforms[id] = loc;
-
- for (var j = 1; j < u.size; ++j) {
- var n = name + '['+j+']';
- loc = GLctx.getUniformLocation(p, n);
- id = GL.getNewId(GL.uniforms);
-
- GL.uniforms[id] = loc;
- }
- }
- }
- }};function _emscripten_glActiveTexture(x0) { GLctx['activeTexture'](x0) }
+ function _emscripten_glActiveTexture(x0) { GLctx['activeTexture'](x0) }
function _emscripten_glAlphaFunc() {
err('missing function: emscripten_glAlphaFunc'); abort(-1);
@@ -12004,6 +11634,126 @@ function copyTempDouble(ptr) {
err('missing function: emscripten_glWindowPos3sv'); abort(-1);
}
+
+
+ function __setLetterbox(element, topBottom, leftRight) {
+ if (JSEvents.isInternetExplorer()) {
+ // Cannot use padding on IE11, because IE11 computes padding in addition to the size, unlike
+ // other browsers, which treat padding to be part of the size.
+ // e.g.
+ // FF, Chrome: If CSS size = 1920x1080, padding-leftright = 460, padding-topbottomx40, then content size = (1920 - 2*460) x (1080-2*40) = 1000x1000px, and total element size = 1920x1080px.
+ // IE11: If CSS size = 1920x1080, padding-leftright = 460, padding-topbottomx40, then content size = 1920x1080px and total element size = (1920+2*460) x (1080+2*40)px.
+ // IE11 treats margin like Chrome and FF treat padding.
+ element.style.marginLeft = element.style.marginRight = leftRight + 'px';
+ element.style.marginTop = element.style.marginBottom = topBottom + 'px';
+ } else {
+ // Cannot use margin to specify letterboxes in FF or Chrome, since those ignore margins in fullscreen mode.
+ element.style.paddingLeft = element.style.paddingRight = leftRight + 'px';
+ element.style.paddingTop = element.style.paddingBottom = topBottom + 'px';
+ }
+ }function __emscripten_do_request_fullscreen(target, strategy) {
+ if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1;
+ if (!JSEvents.fullscreenEnabled()) return -3;
+ if (!target) target = '#canvas';
+ target = JSEvents.findEventTarget(target);
+ if (!target) return -4;
+
+ if (!target.requestFullscreen && !target.msRequestFullscreen && !target.mozRequestFullScreen && !target.mozRequestFullscreen && !target.webkitRequestFullscreen) {
+ return -3;
+ }
+
+ var canPerformRequests = JSEvents.canPerformEventHandlerRequests();
+
+ // Queue this function call if we're not currently in an event handler and the user saw it appropriate to do so.
+ if (!canPerformRequests) {
+ if (strategy.deferUntilInEventHandler) {
+ JSEvents.deferCall(JSEvents.requestFullscreen, 1 /* priority over pointer lock */, [target, strategy]);
+ return 1;
+ } else {
+ return -2;
+ }
+ }
+
+ return JSEvents.requestFullscreen(target, strategy);
+ }
+
+ function __registerRestoreOldStyle(canvas) {
+ var canvasSize = __get_canvas_element_size(canvas);
+ var oldWidth = canvasSize[0];
+ var oldHeight = canvasSize[1];
+ var oldCssWidth = canvas.style.width;
+ var oldCssHeight = canvas.style.height;
+ var oldBackgroundColor = canvas.style.backgroundColor; // Chrome reads color from here.
+ var oldDocumentBackgroundColor = document.body.style.backgroundColor; // IE11 reads color from here.
+ // Firefox always has black background color.
+ var oldPaddingLeft = canvas.style.paddingLeft; // Chrome, FF, Safari
+ var oldPaddingRight = canvas.style.paddingRight;
+ var oldPaddingTop = canvas.style.paddingTop;
+ var oldPaddingBottom = canvas.style.paddingBottom;
+ var oldMarginLeft = canvas.style.marginLeft; // IE11
+ var oldMarginRight = canvas.style.marginRight;
+ var oldMarginTop = canvas.style.marginTop;
+ var oldMarginBottom = canvas.style.marginBottom;
+ var oldDocumentBodyMargin = document.body.style.margin;
+ var oldDocumentOverflow = document.documentElement.style.overflow; // Chrome, Firefox
+ var oldDocumentScroll = document.body.scroll; // IE
+ var oldImageRendering = canvas.style.imageRendering;
+
+ function restoreOldStyle() {
+ var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
+ if (!fullscreenElement) {
+ document.removeEventListener('fullscreenchange', restoreOldStyle);
+ document.removeEventListener('mozfullscreenchange', restoreOldStyle);
+ document.removeEventListener('webkitfullscreenchange', restoreOldStyle);
+ document.removeEventListener('MSFullscreenChange', restoreOldStyle);
+
+ __set_canvas_element_size(canvas, oldWidth, oldHeight);
+
+ canvas.style.width = oldCssWidth;
+ canvas.style.height = oldCssHeight;
+ canvas.style.backgroundColor = oldBackgroundColor; // Chrome
+ // IE11 hack: assigning 'undefined' or an empty string to document.body.style.backgroundColor has no effect, so first assign back the default color
+ // before setting the undefined value. Setting undefined value is also important, or otherwise we would later treat that as something that the user
+ // had explicitly set so subsequent fullscreen transitions would not set background color properly.
+ if (!oldDocumentBackgroundColor) document.body.style.backgroundColor = 'white';
+ document.body.style.backgroundColor = oldDocumentBackgroundColor; // IE11
+ canvas.style.paddingLeft = oldPaddingLeft; // Chrome, FF, Safari
+ canvas.style.paddingRight = oldPaddingRight;
+ canvas.style.paddingTop = oldPaddingTop;
+ canvas.style.paddingBottom = oldPaddingBottom;
+ canvas.style.marginLeft = oldMarginLeft; // IE11
+ canvas.style.marginRight = oldMarginRight;
+ canvas.style.marginTop = oldMarginTop;
+ canvas.style.marginBottom = oldMarginBottom;
+ document.body.style.margin = oldDocumentBodyMargin;
+ document.documentElement.style.overflow = oldDocumentOverflow; // Chrome, Firefox
+ document.body.scroll = oldDocumentScroll; // IE
+ canvas.style.imageRendering = oldImageRendering;
+ if (canvas.GLctxObject) canvas.GLctxObject.GLctx.viewport(0, 0, oldWidth, oldHeight);
+
+ if (__currentFullscreenStrategy.canvasResizedCallback) {
+ Module['dynCall_iiii'](__currentFullscreenStrategy.canvasResizedCallback, 37, 0, __currentFullscreenStrategy.canvasResizedCallbackUserData);
+ }
+ }
+ }
+ document.addEventListener('fullscreenchange', restoreOldStyle);
+ document.addEventListener('mozfullscreenchange', restoreOldStyle);
+ document.addEventListener('webkitfullscreenchange', restoreOldStyle);
+ document.addEventListener('MSFullscreenChange', restoreOldStyle);
+ return restoreOldStyle;
+ }function _emscripten_request_fullscreen_strategy(target, deferUntilInEventHandler, fullscreenStrategy) {
+ var strategy = {};
+ strategy.scaleMode = HEAP32[((fullscreenStrategy)>>2)];
+ strategy.canvasResolutionScaleMode = HEAP32[(((fullscreenStrategy)+(4))>>2)];
+ strategy.filteringMode = HEAP32[(((fullscreenStrategy)+(8))>>2)];
+ strategy.deferUntilInEventHandler = deferUntilInEventHandler;
+ strategy.canvasResizedCallback = HEAP32[(((fullscreenStrategy)+(12))>>2)];
+ strategy.canvasResizedCallbackUserData = HEAP32[(((fullscreenStrategy)+(16))>>2)];
+ __currentFullscreenStrategy = strategy;
+
+ return __emscripten_do_request_fullscreen(target, strategy);
+ }
+
function _emscripten_request_pointerlock(target, deferUntilInEventHandler) {
if (!target) target = '#canvas';
target = JSEvents.findEventTarget(target);
@@ -12027,11 +11777,36 @@ function copyTempDouble(ptr) {
return JSEvents.requestPointerLock(target);
}
+ function _emscripten_set_blur_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerFocusEventCallback(target, userData, useCapture, callbackfunc, 12, "blur", targetThread);
+ return 0;
+ }
+
+ function _emscripten_set_canvas_size(width, height) {
+ Browser.setCanvasSize(width, height);
+ }
+
function _emscripten_set_click_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 4, "click", targetThread);
return 0;
}
+ function _emscripten_set_element_css_size(target, width, height) {
+ if (target) target = JSEvents.findEventTarget(target);
+ else target = Module['canvas'];
+ if (!target) return -4;
+
+ target.style.setProperty("width", width + "px");
+ target.style.setProperty("height", height + "px");
+
+ return 0;
+ }
+
+ function _emscripten_set_focus_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerFocusEventCallback(target, userData, useCapture, callbackfunc, 13, "focus", targetThread);
+ return 0;
+ }
+
function _emscripten_set_fullscreenchange_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
if (typeof JSEvents.fullscreenEnabled() === 'undefined') return -1;
if (!target) target = document;
@@ -12058,11 +11833,68 @@ function copyTempDouble(ptr) {
return 0;
}
+ function _emscripten_set_keydown_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerKeyEventCallback(target, userData, useCapture, callbackfunc, 2, "keydown", targetThread);
+ return 0;
+ }
+
function _emscripten_set_keypress_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
JSEvents.registerKeyEventCallback(target, userData, useCapture, callbackfunc, 1, "keypress", targetThread);
return 0;
}
+ function _emscripten_set_keyup_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerKeyEventCallback(target, userData, useCapture, callbackfunc, 3, "keyup", targetThread);
+ return 0;
+ }
+
+
+ function _emscripten_set_mousedown_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 5, "mousedown", targetThread);
+ return 0;
+ }
+
+ function _emscripten_set_mouseenter_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 33, "mouseenter", targetThread);
+ return 0;
+ }
+
+ function _emscripten_set_mouseleave_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 34, "mouseleave", targetThread);
+ return 0;
+ }
+
+ function _emscripten_set_mousemove_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 8, "mousemove", targetThread);
+ return 0;
+ }
+
+ function _emscripten_set_mouseup_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerMouseEventCallback(target, userData, useCapture, callbackfunc, 6, "mouseup", targetThread);
+ return 0;
+ }
+
+ function _emscripten_set_pointerlockchange_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ // TODO: Currently not supported in pthreads or in --proxy-to-worker mode. (In pthreads mode, document object is not defined)
+ if (!document || !document.body || (!document.body.requestPointerLock && !document.body.mozRequestPointerLock && !document.body.webkitRequestPointerLock && !document.body.msRequestPointerLock)) {
+ return -1;
+ }
+ if (!target) target = document;
+ else {
+ target = JSEvents.findEventTarget(target);
+ if (!target) return -4;
+ }
+ JSEvents.registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "pointerlockchange", targetThread);
+ JSEvents.registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "mozpointerlockchange", targetThread);
+ JSEvents.registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "webkitpointerlockchange", targetThread);
+ JSEvents.registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "mspointerlockchange", targetThread);
+ return 0;
+ }
+
+ function _emscripten_set_resize_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerUiEventCallback(target, userData, useCapture, callbackfunc, 10, "resize", targetThread);
+ return 0;
+ }
function _emscripten_set_touchcancel_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
JSEvents.registerTouchEventCallback(target, userData, useCapture, callbackfunc, 25, "touchcancel", targetThread);
@@ -12084,6 +11916,24 @@ function copyTempDouble(ptr) {
return 0;
}
+ function _emscripten_set_visibilitychange_callback_on_thread(userData, useCapture, callbackfunc, targetThread) {
+ JSEvents.registerVisibilityChangeEventCallback(document, userData, useCapture, callbackfunc, 21, "visibilitychange", targetThread);
+ return 0;
+ }
+
+ function _emscripten_set_wheel_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) {
+ target = JSEvents.findEventTarget(target);
+ if (typeof target.onwheel !== 'undefined') {
+ JSEvents.registerWheelEventCallback(target, userData, useCapture, callbackfunc, 9, "wheel", targetThread);
+ return 0;
+ } else if (typeof target.onmousewheel !== 'undefined') {
+ JSEvents.registerWheelEventCallback(target, userData, useCapture, callbackfunc, 9, "mousewheel", targetThread);
+ return 0;
+ } else {
+ return -1;
+ }
+ }
+
function __exit(status) {
// void _exit(int status);
@@ -12093,6 +11943,25 @@ function copyTempDouble(ptr) {
__exit(status);
}
+ function _getenv(name) {
+ // char *getenv(const char *name);
+ // http://pubs.opengroup.org/onlinepubs/009695399/functions/getenv.html
+ if (name === 0) return 0;
+ name = Pointer_stringify(name);
+ if (!ENV.hasOwnProperty(name)) return 0;
+
+ if (_getenv.ret) _free(_getenv.ret);
+ _getenv.ret = allocateUTF8(ENV[name]);
+ return _getenv.ret;
+ }
+
+ function _gettimeofday(ptr) {
+ var now = Date.now();
+ HEAP32[((ptr)>>2)]=(now/1000)|0; // seconds
+ HEAP32[(((ptr)+(4))>>2)]=((now % 1000)*1000)|0; // microseconds
+ return 0;
+ }
+
function _glActiveTexture(x0) { GLctx['activeTexture'](x0) }
function _glAttachShader(program, shader) {
@@ -13369,6 +13238,10 @@ function copyTempDouble(ptr) {
GLFW.setCursorPosCallback(winid, cbfun);
}
+ function _glfwSetDropCallback(winid, cbfun) {
+ GLFW.setDropCallback(winid, cbfun);
+ }
+
function _glfwSetErrorCallback(cbfun) {
GLFW.errorFunc = cbfun;
}
@@ -13440,6 +13313,8 @@ function copyTempDouble(ptr) {
+
+
function _llvm_exp2_f32(x) {
return Math.pow(2, x);
}
@@ -13472,6 +13347,35 @@ function copyTempDouble(ptr) {
+
+ function _usleep(useconds) {
+ // int usleep(useconds_t useconds);
+ // http://pubs.opengroup.org/onlinepubs/000095399/functions/usleep.html
+ // We're single-threaded, so use a busy loop. Super-ugly.
+ var msec = useconds / 1000;
+ if ((ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && self['performance'] && self['performance']['now']) {
+ var start = self['performance']['now']();
+ while (self['performance']['now']() - start < msec) {
+ // Do nothing.
+ }
+ } else {
+ var start = Date.now();
+ while (Date.now() - start < msec) {
+ // Do nothing.
+ }
+ }
+ return 0;
+ }function _nanosleep(rqtp, rmtp) {
+ // int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
+ var seconds = HEAP32[((rqtp)>>2)];
+ var nanoseconds = HEAP32[(((rqtp)+(4))>>2)];
+ if (rmtp !== 0) {
+ HEAP32[((rmtp)>>2)]=0;
+ HEAP32[(((rmtp)+(4))>>2)]=0;
+ }
+ return _usleep((seconds * 1e6) + (nanoseconds / 1000));
+ }
+
function _pthread_attr_destroy(attr) {
/* int pthread_attr_destroy(pthread_attr_t *attr); */
//FIXME: should destroy the pthread_attr_t struct
@@ -13508,6 +13412,20 @@ function copyTempDouble(ptr) {
+ function _sigaction(signum, act, oldact) {
+ //int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
+ return 0;
+ }
+
+
+ var __sigalrm_handler=0;function _signal(sig, func) {
+ if (sig == 14 /*SIGALRM*/) {
+ __sigalrm_handler = func;
+ } else {
+ }
+ return 0;
+ }
+
function _time(ptr) {
var ret = (Date.now()/1000)|0;
if (ptr) {
@@ -13516,36 +13434,10 @@ function copyTempDouble(ptr) {
return ret;
}
- function _usleep(useconds) {
- // int usleep(useconds_t useconds);
- // http://pubs.opengroup.org/onlinepubs/000095399/functions/usleep.html
- // We're single-threaded, so use a busy loop. Super-ugly.
- var msec = useconds / 1000;
- if ((ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && self['performance'] && self['performance']['now']) {
- var start = self['performance']['now']();
- while (self['performance']['now']() - start < msec) {
- // Do nothing.
- }
- } else {
- var start = Date.now();
- while (Date.now() - start < msec) {
- // Do nothing.
- }
- }
- return 0;
- }
FS.staticInit();__ATINIT__.unshift(function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() });__ATMAIN__.push(function() { FS.ignorePermissions = false });__ATEXIT__.push(function() { FS.quit() });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice;Module["FS_unlink"] = FS.unlink;;
__ATINIT__.unshift(function() { TTY.init() });__ATEXIT__.push(function() { TTY.shutdown() });;
if (ENVIRONMENT_IS_NODE) { var fs = require("fs"); var NODEJS_PATH = require("path"); NODEFS.staticInit(); };
-Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas, vrDevice) { err("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead."); Module["requestFullScreen"] = Module["requestFullscreen"]; Browser.requestFullScreen(lockPointer, resizeCanvas, vrDevice) };
- Module["requestFullscreen"] = function Module_requestFullscreen(lockPointer, resizeCanvas, vrDevice) { Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice) };
- Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };
- Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };
- Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };
- Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };
- Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() }
- Module["createContext"] = function Module_createContext(canvas, useWebGL, setInModule, webGLContextAttributes) { return Browser.createContext(canvas, useWebGL, setInModule, webGLContextAttributes) };
if (ENVIRONMENT_IS_NODE) {
_emscripten_get_now = function _emscripten_get_now_actual() {
var t = process['hrtime']();
@@ -13560,8 +13452,16 @@ if (ENVIRONMENT_IS_NODE) {
} else {
_emscripten_get_now = Date.now;
};
-JSEvents.staticInit();;
+Module["requestFullScreen"] = function Module_requestFullScreen(lockPointer, resizeCanvas, vrDevice) { err("Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead."); Module["requestFullScreen"] = Module["requestFullscreen"]; Browser.requestFullScreen(lockPointer, resizeCanvas, vrDevice) };
+ Module["requestFullscreen"] = function Module_requestFullscreen(lockPointer, resizeCanvas, vrDevice) { Browser.requestFullscreen(lockPointer, resizeCanvas, vrDevice) };
+ Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) };
+ Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) };
+ Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() };
+ Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() };
+ Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() }
+ Module["createContext"] = function Module_createContext(canvas, useWebGL, setInModule, webGLContextAttributes) { return Browser.createContext(canvas, useWebGL, setInModule, webGLContextAttributes) };
var GLctx; GL.init();
+JSEvents.staticInit();;
DYNAMICTOP_PTR = staticAlloc(4);
STACK_BASE = STACKTOP = alignMemory(STATICTOP);
@@ -13607,22 +13507,25 @@ function intArrayToString(array) {
-Module['wasmTableSize'] = 1478;
+Module['wasmTableSize'] = 1972;
-Module['wasmMaxTableSize'] = 1478;
+Module['wasmMaxTableSize'] = 1972;
Module.asmGlobalArg = {};
-Module.asmLibraryArg = { "abort": abort, "assert": assert, "enlargeMemory": enlargeMemory, "getTotalMemory": getTotalMemory, "abortOnCannotGrowMemory": abortOnCannotGrowMemory, "_SDL_CloseAudio": _SDL_CloseAudio, "_SDL_GetTicks": _SDL_GetTicks, "_SDL_InitSubSystem": _SDL_InitSubSystem, "_SDL_LockSurface": _SDL_LockSurface, "_SDL_OpenAudio": _SDL_OpenAudio, "_SDL_PauseAudio": _SDL_PauseAudio, "_SDL_QuitSubSystem": _SDL_QuitSubSystem, "___assert_fail": ___assert_fail, "___lock": ___lock, "___setErrNo": ___setErrNo, "___syscall140": ___syscall140, "___syscall145": ___syscall145, "___syscall146": ___syscall146, "___syscall221": ___syscall221, "___syscall5": ___syscall5, "___syscall54": ___syscall54, "___syscall6": ___syscall6, "___unlock": ___unlock, "__emscripten_sample_gamepad_data": __emscripten_sample_gamepad_data, "__exit": __exit, "__get_canvas_element_size": __get_canvas_element_size, "__set_canvas_element_size": __set_canvas_element_size, "_eglGetProcAddress": _eglGetProcAddress, "_emscripten_exit_pointerlock": _emscripten_exit_pointerlock, "_emscripten_get_canvas_element_size": _emscripten_get_canvas_element_size, "_emscripten_get_gamepad_status": _emscripten_get_gamepad_status, "_emscripten_get_now": _emscripten_get_now, "_emscripten_get_num_gamepads": _emscripten_get_num_gamepads, "_emscripten_get_pointerlock_status": _emscripten_get_pointerlock_status, "_emscripten_glAccum": _emscripten_glAccum, "_emscripten_glActiveTexture": _emscripten_glActiveTexture, "_emscripten_glAlphaFunc": _emscripten_glAlphaFunc, "_emscripten_glAreTexturesResident": _emscripten_glAreTexturesResident, "_emscripten_glArrayElement": _emscripten_glArrayElement, "_emscripten_glAttachObjectARB": _emscripten_glAttachObjectARB, "_emscripten_glAttachShader": _emscripten_glAttachShader, "_emscripten_glBegin": _emscripten_glBegin, "_emscripten_glBeginConditionalRender": _emscripten_glBeginConditionalRender, "_emscripten_glBeginQuery": _emscripten_glBeginQuery, "_emscripten_glBeginTransformFeedback": _emscripten_glBeginTransformFeedback, "_emscripten_glBindAttribLocation": _emscripten_glBindAttribLocation, "_emscripten_glBindBuffer": _emscripten_glBindBuffer, "_emscripten_glBindBufferBase": _emscripten_glBindBufferBase, "_emscripten_glBindBufferRange": _emscripten_glBindBufferRange, "_emscripten_glBindFragDataLocation": _emscripten_glBindFragDataLocation, "_emscripten_glBindFramebuffer": _emscripten_glBindFramebuffer, "_emscripten_glBindProgramARB": _emscripten_glBindProgramARB, "_emscripten_glBindRenderbuffer": _emscripten_glBindRenderbuffer, "_emscripten_glBindTexture": _emscripten_glBindTexture, "_emscripten_glBindVertexArray": _emscripten_glBindVertexArray, "_emscripten_glBitmap": _emscripten_glBitmap, "_emscripten_glBlendColor": _emscripten_glBlendColor, "_emscripten_glBlendEquation": _emscripten_glBlendEquation, "_emscripten_glBlendEquationSeparate": _emscripten_glBlendEquationSeparate, "_emscripten_glBlendFunc": _emscripten_glBlendFunc, "_emscripten_glBlendFuncSeparate": _emscripten_glBlendFuncSeparate, "_emscripten_glBlitFramebuffer": _emscripten_glBlitFramebuffer, "_emscripten_glBufferData": _emscripten_glBufferData, "_emscripten_glBufferSubData": _emscripten_glBufferSubData, "_emscripten_glCallList": _emscripten_glCallList, "_emscripten_glCallLists": _emscripten_glCallLists, "_emscripten_glCheckFramebufferStatus": _emscripten_glCheckFramebufferStatus, "_emscripten_glClampColor": _emscripten_glClampColor, "_emscripten_glClear": _emscripten_glClear, "_emscripten_glClearAccum": _emscripten_glClearAccum, "_emscripten_glClearBufferfi": _emscripten_glClearBufferfi, "_emscripten_glClearBufferfv": _emscripten_glClearBufferfv, "_emscripten_glClearBufferiv": _emscripten_glClearBufferiv, "_emscripten_glClearBufferuiv": _emscripten_glClearBufferuiv, "_emscripten_glClearColor": _emscripten_glClearColor, "_emscripten_glClearDepth": _emscripten_glClearDepth, "_emscripten_glClearDepthf": _emscripten_glClearDepthf, "_emscripten_glClearIndex": _emscripten_glClearIndex, "_emscripten_glClearStencil": _emscripten_glClearStencil, "_emscripten_glClientActiveTexture": _emscripten_glClientActiveTexture, "_emscripten_glClipPlane": _emscripten_glClipPlane, "_emscripten_glColor3b": _emscripten_glColor3b, "_emscripten_glColor3bv": _emscripten_glColor3bv, "_emscripten_glColor3d": _emscripten_glColor3d, "_emscripten_glColor3dv": _emscripten_glColor3dv, "_emscripten_glColor3f": _emscripten_glColor3f, "_emscripten_glColor3fv": _emscripten_glColor3fv, "_emscripten_glColor3i": _emscripten_glColor3i, "_emscripten_glColor3iv": _emscripten_glColor3iv, "_emscripten_glColor3s": _emscripten_glColor3s, "_emscripten_glColor3sv": _emscripten_glColor3sv, "_emscripten_glColor3ub": _emscripten_glColor3ub, "_emscripten_glColor3ubv": _emscripten_glColor3ubv, "_emscripten_glColor3ui": _emscripten_glColor3ui, "_emscripten_glColor3uiv": _emscripten_glColor3uiv, "_emscripten_glColor3us": _emscripten_glColor3us, "_emscripten_glColor3usv": _emscripten_glColor3usv, "_emscripten_glColor4b": _emscripten_glColor4b, "_emscripten_glColor4bv": _emscripten_glColor4bv, "_emscripten_glColor4d": _emscripten_glColor4d, "_emscripten_glColor4dv": _emscripten_glColor4dv, "_emscripten_glColor4f": _emscripten_glColor4f, "_emscripten_glColor4fv": _emscripten_glColor4fv, "_emscripten_glColor4i": _emscripten_glColor4i, "_emscripten_glColor4iv": _emscripten_glColor4iv, "_emscripten_glColor4s": _emscripten_glColor4s, "_emscripten_glColor4sv": _emscripten_glColor4sv, "_emscripten_glColor4ub": _emscripten_glColor4ub, "_emscripten_glColor4ubv": _emscripten_glColor4ubv, "_emscripten_glColor4ui": _emscripten_glColor4ui, "_emscripten_glColor4uiv": _emscripten_glColor4uiv, "_emscripten_glColor4us": _emscripten_glColor4us, "_emscripten_glColor4usv": _emscripten_glColor4usv, "_emscripten_glColorMask": _emscripten_glColorMask, "_emscripten_glColorMaski": _emscripten_glColorMaski, "_emscripten_glColorMaterial": _emscripten_glColorMaterial, "_emscripten_glColorPointer": _emscripten_glColorPointer, "_emscripten_glColorSubTable": _emscripten_glColorSubTable, "_emscripten_glColorTable": _emscripten_glColorTable, "_emscripten_glColorTableParameterfv": _emscripten_glColorTableParameterfv, "_emscripten_glColorTableParameteriv": _emscripten_glColorTableParameteriv, "_emscripten_glCompileShader": _emscripten_glCompileShader, "_emscripten_glCompressedTexImage1D": _emscripten_glCompressedTexImage1D, "_emscripten_glCompressedTexImage2D": _emscripten_glCompressedTexImage2D, "_emscripten_glCompressedTexImage3D": _emscripten_glCompressedTexImage3D, "_emscripten_glCompressedTexSubImage1D": _emscripten_glCompressedTexSubImage1D, "_emscripten_glCompressedTexSubImage2D": _emscripten_glCompressedTexSubImage2D, "_emscripten_glCompressedTexSubImage3D": _emscripten_glCompressedTexSubImage3D, "_emscripten_glConvolutionFilter1D": _emscripten_glConvolutionFilter1D, "_emscripten_glConvolutionFilter2D": _emscripten_glConvolutionFilter2D, "_emscripten_glConvolutionParameterf": _emscripten_glConvolutionParameterf, "_emscripten_glConvolutionParameterfv": _emscripten_glConvolutionParameterfv, "_emscripten_glConvolutionParameteri": _emscripten_glConvolutionParameteri, "_emscripten_glConvolutionParameteriv": _emscripten_glConvolutionParameteriv, "_emscripten_glCopyColorSubTable": _emscripten_glCopyColorSubTable, "_emscripten_glCopyColorTable": _emscripten_glCopyColorTable, "_emscripten_glCopyConvolutionFilter1D": _emscripten_glCopyConvolutionFilter1D, "_emscripten_glCopyConvolutionFilter2D": _emscripten_glCopyConvolutionFilter2D, "_emscripten_glCopyPixels": _emscripten_glCopyPixels, "_emscripten_glCopyTexImage1D": _emscripten_glCopyTexImage1D, "_emscripten_glCopyTexImage2D": _emscripten_glCopyTexImage2D, "_emscripten_glCopyTexSubImage1D": _emscripten_glCopyTexSubImage1D, "_emscripten_glCopyTexSubImage2D": _emscripten_glCopyTexSubImage2D, "_emscripten_glCopyTexSubImage3D": _emscripten_glCopyTexSubImage3D, "_emscripten_glCreateProgram": _emscripten_glCreateProgram, "_emscripten_glCreateProgramObjectARB": _emscripten_glCreateProgramObjectARB, "_emscripten_glCreateShader": _emscripten_glCreateShader, "_emscripten_glCreateShaderObjectARB": _emscripten_glCreateShaderObjectARB, "_emscripten_glCullFace": _emscripten_glCullFace, "_emscripten_glDeleteBuffers": _emscripten_glDeleteBuffers, "_emscripten_glDeleteFramebuffers": _emscripten_glDeleteFramebuffers, "_emscripten_glDeleteLists": _emscripten_glDeleteLists, "_emscripten_glDeleteObjectARB": _emscripten_glDeleteObjectARB, "_emscripten_glDeleteProgram": _emscripten_glDeleteProgram, "_emscripten_glDeleteProgramsARB": _emscripten_glDeleteProgramsARB, "_emscripten_glDeleteQueries": _emscripten_glDeleteQueries, "_emscripten_glDeleteRenderbuffers": _emscripten_glDeleteRenderbuffers, "_emscripten_glDeleteShader": _emscripten_glDeleteShader, "_emscripten_glDeleteTextures": _emscripten_glDeleteTextures, "_emscripten_glDeleteVertexArrays": _emscripten_glDeleteVertexArrays, "_emscripten_glDepthFunc": _emscripten_glDepthFunc, "_emscripten_glDepthMask": _emscripten_glDepthMask, "_emscripten_glDepthRange": _emscripten_glDepthRange, "_emscripten_glDepthRangef": _emscripten_glDepthRangef, "_emscripten_glDetachObjectARB": _emscripten_glDetachObjectARB, "_emscripten_glDetachShader": _emscripten_glDetachShader, "_emscripten_glDisable": _emscripten_glDisable, "_emscripten_glDisableClientState": _emscripten_glDisableClientState, "_emscripten_glDisableVertexAttribArray": _emscripten_glDisableVertexAttribArray, "_emscripten_glDisablei": _emscripten_glDisablei, "_emscripten_glDrawArrays": _emscripten_glDrawArrays, "_emscripten_glDrawArraysInstanced": _emscripten_glDrawArraysInstanced, "_emscripten_glDrawBuffer": _emscripten_glDrawBuffer, "_emscripten_glDrawBuffers": _emscripten_glDrawBuffers, "_emscripten_glDrawElements": _emscripten_glDrawElements, "_emscripten_glDrawElementsInstanced": _emscripten_glDrawElementsInstanced, "_emscripten_glDrawPixels": _emscripten_glDrawPixels, "_emscripten_glDrawRangeElements": _emscripten_glDrawRangeElements, "_emscripten_glEdgeFlag": _emscripten_glEdgeFlag, "_emscripten_glEdgeFlagPointer": _emscripten_glEdgeFlagPointer, "_emscripten_glEdgeFlagv": _emscripten_glEdgeFlagv, "_emscripten_glEnable": _emscripten_glEnable, "_emscripten_glEnableClientState": _emscripten_glEnableClientState, "_emscripten_glEnableVertexAttribArray": _emscripten_glEnableVertexAttribArray, "_emscripten_glEnablei": _emscripten_glEnablei, "_emscripten_glEnd": _emscripten_glEnd, "_emscripten_glEndConditionalRender": _emscripten_glEndConditionalRender, "_emscripten_glEndList": _emscripten_glEndList, "_emscripten_glEndQuery": _emscripten_glEndQuery, "_emscripten_glEndTransformFeedback": _emscripten_glEndTransformFeedback, "_emscripten_glEvalCoord1d": _emscripten_glEvalCoord1d, "_emscripten_glEvalCoord1dv": _emscripten_glEvalCoord1dv, "_emscripten_glEvalCoord1f": _emscripten_glEvalCoord1f, "_emscripten_glEvalCoord1fv": _emscripten_glEvalCoord1fv, "_emscripten_glEvalCoord2d": _emscripten_glEvalCoord2d, "_emscripten_glEvalCoord2dv": _emscripten_glEvalCoord2dv, "_emscripten_glEvalCoord2f": _emscripten_glEvalCoord2f, "_emscripten_glEvalCoord2fv": _emscripten_glEvalCoord2fv, "_emscripten_glEvalMesh1": _emscripten_glEvalMesh1, "_emscripten_glEvalMesh2": _emscripten_glEvalMesh2, "_emscripten_glEvalPoint1": _emscripten_glEvalPoint1, "_emscripten_glEvalPoint2": _emscripten_glEvalPoint2, "_emscripten_glFeedbackBuffer": _emscripten_glFeedbackBuffer, "_emscripten_glFinish": _emscripten_glFinish, "_emscripten_glFlush": _emscripten_glFlush, "_emscripten_glFogCoordPointer": _emscripten_glFogCoordPointer, "_emscripten_glFogCoordd": _emscripten_glFogCoordd, "_emscripten_glFogCoorddv": _emscripten_glFogCoorddv, "_emscripten_glFogCoordf": _emscripten_glFogCoordf, "_emscripten_glFogCoordfv": _emscripten_glFogCoordfv, "_emscripten_glFogf": _emscripten_glFogf, "_emscripten_glFogfv": _emscripten_glFogfv, "_emscripten_glFogi": _emscripten_glFogi, "_emscripten_glFogiv": _emscripten_glFogiv, "_emscripten_glFramebufferRenderbuffer": _emscripten_glFramebufferRenderbuffer, "_emscripten_glFramebufferTexture1D": _emscripten_glFramebufferTexture1D, "_emscripten_glFramebufferTexture2D": _emscripten_glFramebufferTexture2D, "_emscripten_glFramebufferTexture3D": _emscripten_glFramebufferTexture3D, "_emscripten_glFramebufferTextureLayer": _emscripten_glFramebufferTextureLayer, "_emscripten_glFrontFace": _emscripten_glFrontFace, "_emscripten_glFrustum": _emscripten_glFrustum, "_emscripten_glGenBuffers": _emscripten_glGenBuffers, "_emscripten_glGenFramebuffers": _emscripten_glGenFramebuffers, "_emscripten_glGenLists": _emscripten_glGenLists, "_emscripten_glGenProgramsARB": _emscripten_glGenProgramsARB, "_emscripten_glGenQueries": _emscripten_glGenQueries, "_emscripten_glGenRenderbuffers": _emscripten_glGenRenderbuffers, "_emscripten_glGenTextures": _emscripten_glGenTextures, "_emscripten_glGenVertexArrays": _emscripten_glGenVertexArrays, "_emscripten_glGenerateMipmap": _emscripten_glGenerateMipmap, "_emscripten_glGetActiveAttrib": _emscripten_glGetActiveAttrib, "_emscripten_glGetActiveUniform": _emscripten_glGetActiveUniform, "_emscripten_glGetActiveUniformBlockName": _emscripten_glGetActiveUniformBlockName, "_emscripten_glGetActiveUniformBlockiv": _emscripten_glGetActiveUniformBlockiv, "_emscripten_glGetActiveUniformName": _emscripten_glGetActiveUniformName, "_emscripten_glGetActiveUniformsiv": _emscripten_glGetActiveUniformsiv, "_emscripten_glGetAttachedObjectsARB": _emscripten_glGetAttachedObjectsARB, "_emscripten_glGetAttachedShaders": _emscripten_glGetAttachedShaders, "_emscripten_glGetAttribLocation": _emscripten_glGetAttribLocation, "_emscripten_glGetBooleani_v": _emscripten_glGetBooleani_v, "_emscripten_glGetBooleanv": _emscripten_glGetBooleanv, "_emscripten_glGetBufferParameteriv": _emscripten_glGetBufferParameteriv, "_emscripten_glGetBufferPointerv": _emscripten_glGetBufferPointerv, "_emscripten_glGetBufferSubData": _emscripten_glGetBufferSubData, "_emscripten_glGetClipPlane": _emscripten_glGetClipPlane, "_emscripten_glGetColorTable": _emscripten_glGetColorTable, "_emscripten_glGetColorTableParameterfv": _emscripten_glGetColorTableParameterfv, "_emscripten_glGetColorTableParameteriv": _emscripten_glGetColorTableParameteriv, "_emscripten_glGetCompressedTexImage": _emscripten_glGetCompressedTexImage, "_emscripten_glGetConvolutionFilter": _emscripten_glGetConvolutionFilter, "_emscripten_glGetConvolutionParameterfv": _emscripten_glGetConvolutionParameterfv, "_emscripten_glGetConvolutionParameteriv": _emscripten_glGetConvolutionParameteriv, "_emscripten_glGetDoublev": _emscripten_glGetDoublev, "_emscripten_glGetError": _emscripten_glGetError, "_emscripten_glGetFloatv": _emscripten_glGetFloatv, "_emscripten_glGetFragDataLocation": _emscripten_glGetFragDataLocation, "_emscripten_glGetFramebufferAttachmentParameteriv": _emscripten_glGetFramebufferAttachmentParameteriv, "_emscripten_glGetHandleARB": _emscripten_glGetHandleARB, "_emscripten_glGetHistogram": _emscripten_glGetHistogram, "_emscripten_glGetHistogramParameterfv": _emscripten_glGetHistogramParameterfv, "_emscripten_glGetHistogramParameteriv": _emscripten_glGetHistogramParameteriv, "_emscripten_glGetInfoLogARB": _emscripten_glGetInfoLogARB, "_emscripten_glGetIntegeri_v": _emscripten_glGetIntegeri_v, "_emscripten_glGetIntegerv": _emscripten_glGetIntegerv, "_emscripten_glGetLightfv": _emscripten_glGetLightfv, "_emscripten_glGetLightiv": _emscripten_glGetLightiv, "_emscripten_glGetMapdv": _emscripten_glGetMapdv, "_emscripten_glGetMapfv": _emscripten_glGetMapfv, "_emscripten_glGetMapiv": _emscripten_glGetMapiv, "_emscripten_glGetMaterialfv": _emscripten_glGetMaterialfv, "_emscripten_glGetMaterialiv": _emscripten_glGetMaterialiv, "_emscripten_glGetMinmax": _emscripten_glGetMinmax, "_emscripten_glGetMinmaxParameterfv": _emscripten_glGetMinmaxParameterfv, "_emscripten_glGetMinmaxParameteriv": _emscripten_glGetMinmaxParameteriv, "_emscripten_glGetObjectParameterfvARB": _emscripten_glGetObjectParameterfvARB, "_emscripten_glGetObjectParameterivARB": _emscripten_glGetObjectParameterivARB, "_emscripten_glGetPixelMapfv": _emscripten_glGetPixelMapfv, "_emscripten_glGetPixelMapuiv": _emscripten_glGetPixelMapuiv, "_emscripten_glGetPixelMapusv": _emscripten_glGetPixelMapusv, "_emscripten_glGetPointerv": _emscripten_glGetPointerv, "_emscripten_glGetPolygonStipple": _emscripten_glGetPolygonStipple, "_emscripten_glGetProgramEnvParameterdvARB": _emscripten_glGetProgramEnvParameterdvARB, "_emscripten_glGetProgramEnvParameterfvARB": _emscripten_glGetProgramEnvParameterfvARB, "_emscripten_glGetProgramInfoLog": _emscripten_glGetProgramInfoLog, "_emscripten_glGetProgramLocalParameterdvARB": _emscripten_glGetProgramLocalParameterdvARB, "_emscripten_glGetProgramLocalParameterfvARB": _emscripten_glGetProgramLocalParameterfvARB, "_emscripten_glGetProgramStringARB": _emscripten_glGetProgramStringARB, "_emscripten_glGetProgramiv": _emscripten_glGetProgramiv, "_emscripten_glGetQueryObjectiv": _emscripten_glGetQueryObjectiv, "_emscripten_glGetQueryObjectuiv": _emscripten_glGetQueryObjectuiv, "_emscripten_glGetQueryiv": _emscripten_glGetQueryiv, "_emscripten_glGetRenderbufferParameteriv": _emscripten_glGetRenderbufferParameteriv, "_emscripten_glGetSeparableFilter": _emscripten_glGetSeparableFilter, "_emscripten_glGetShaderInfoLog": _emscripten_glGetShaderInfoLog, "_emscripten_glGetShaderPrecisionFormat": _emscripten_glGetShaderPrecisionFormat, "_emscripten_glGetShaderSource": _emscripten_glGetShaderSource, "_emscripten_glGetShaderiv": _emscripten_glGetShaderiv, "_emscripten_glGetString": _emscripten_glGetString, "_emscripten_glGetStringi": _emscripten_glGetStringi, "_emscripten_glGetTexEnvfv": _emscripten_glGetTexEnvfv, "_emscripten_glGetTexEnviv": _emscripten_glGetTexEnviv, "_emscripten_glGetTexGendv": _emscripten_glGetTexGendv, "_emscripten_glGetTexGenfv": _emscripten_glGetTexGenfv, "_emscripten_glGetTexGeniv": _emscripten_glGetTexGeniv, "_emscripten_glGetTexImage": _emscripten_glGetTexImage, "_emscripten_glGetTexLevelParameterfv": _emscripten_glGetTexLevelParameterfv, "_emscripten_glGetTexLevelParameteriv": _emscripten_glGetTexLevelParameteriv, "_emscripten_glGetTexParameterIiv": _emscripten_glGetTexParameterIiv, "_emscripten_glGetTexParameterIuiv": _emscripten_glGetTexParameterIuiv, "_emscripten_glGetTexParameterfv": _emscripten_glGetTexParameterfv, "_emscripten_glGetTexParameteriv": _emscripten_glGetTexParameteriv, "_emscripten_glGetTransformFeedbackVarying": _emscripten_glGetTransformFeedbackVarying, "_emscripten_glGetUniformBlockIndex": _emscripten_glGetUniformBlockIndex, "_emscripten_glGetUniformIndices": _emscripten_glGetUniformIndices, "_emscripten_glGetUniformLocation": _emscripten_glGetUniformLocation, "_emscripten_glGetUniformfv": _emscripten_glGetUniformfv, "_emscripten_glGetUniformiv": _emscripten_glGetUniformiv, "_emscripten_glGetUniformuiv": _emscripten_glGetUniformuiv, "_emscripten_glGetVertexAttribIiv": _emscripten_glGetVertexAttribIiv, "_emscripten_glGetVertexAttribIuiv": _emscripten_glGetVertexAttribIuiv, "_emscripten_glGetVertexAttribPointerv": _emscripten_glGetVertexAttribPointerv, "_emscripten_glGetVertexAttribdv": _emscripten_glGetVertexAttribdv, "_emscripten_glGetVertexAttribfv": _emscripten_glGetVertexAttribfv, "_emscripten_glGetVertexAttribiv": _emscripten_glGetVertexAttribiv, "_emscripten_glHint": _emscripten_glHint, "_emscripten_glHistogram": _emscripten_glHistogram, "_emscripten_glIndexMask": _emscripten_glIndexMask, "_emscripten_glIndexPointer": _emscripten_glIndexPointer, "_emscripten_glIndexd": _emscripten_glIndexd, "_emscripten_glIndexdv": _emscripten_glIndexdv, "_emscripten_glIndexf": _emscripten_glIndexf, "_emscripten_glIndexfv": _emscripten_glIndexfv, "_emscripten_glIndexi": _emscripten_glIndexi, "_emscripten_glIndexiv": _emscripten_glIndexiv, "_emscripten_glIndexs": _emscripten_glIndexs, "_emscripten_glIndexsv": _emscripten_glIndexsv, "_emscripten_glIndexub": _emscripten_glIndexub, "_emscripten_glIndexubv": _emscripten_glIndexubv, "_emscripten_glInitNames": _emscripten_glInitNames, "_emscripten_glInterleavedArrays": _emscripten_glInterleavedArrays, "_emscripten_glIsBuffer": _emscripten_glIsBuffer, "_emscripten_glIsEnabled": _emscripten_glIsEnabled, "_emscripten_glIsEnabledi": _emscripten_glIsEnabledi, "_emscripten_glIsFramebuffer": _emscripten_glIsFramebuffer, "_emscripten_glIsList": _emscripten_glIsList, "_emscripten_glIsProgram": _emscripten_glIsProgram, "_emscripten_glIsQuery": _emscripten_glIsQuery, "_emscripten_glIsRenderbuffer": _emscripten_glIsRenderbuffer, "_emscripten_glIsShader": _emscripten_glIsShader, "_emscripten_glIsTexture": _emscripten_glIsTexture, "_emscripten_glIsVertexArray": _emscripten_glIsVertexArray, "_emscripten_glLightModelf": _emscripten_glLightModelf, "_emscripten_glLightModelfv": _emscripten_glLightModelfv, "_emscripten_glLightModeli": _emscripten_glLightModeli, "_emscripten_glLightModeliv": _emscripten_glLightModeliv, "_emscripten_glLightf": _emscripten_glLightf, "_emscripten_glLightfv": _emscripten_glLightfv, "_emscripten_glLighti": _emscripten_glLighti, "_emscripten_glLightiv": _emscripten_glLightiv, "_emscripten_glLineStipple": _emscripten_glLineStipple, "_emscripten_glLineWidth": _emscripten_glLineWidth, "_emscripten_glLinkProgram": _emscripten_glLinkProgram, "_emscripten_glListBase": _emscripten_glListBase, "_emscripten_glLoadIdentity": _emscripten_glLoadIdentity, "_emscripten_glLoadMatrixd": _emscripten_glLoadMatrixd, "_emscripten_glLoadMatrixf": _emscripten_glLoadMatrixf, "_emscripten_glLoadName": _emscripten_glLoadName, "_emscripten_glLoadTransposeMatrixd": _emscripten_glLoadTransposeMatrixd, "_emscripten_glLoadTransposeMatrixf": _emscripten_glLoadTransposeMatrixf, "_emscripten_glLogicOp": _emscripten_glLogicOp, "_emscripten_glMap1d": _emscripten_glMap1d, "_emscripten_glMap1f": _emscripten_glMap1f, "_emscripten_glMap2d": _emscripten_glMap2d, "_emscripten_glMap2f": _emscripten_glMap2f, "_emscripten_glMapBuffer": _emscripten_glMapBuffer, "_emscripten_glMapGrid1d": _emscripten_glMapGrid1d, "_emscripten_glMapGrid1f": _emscripten_glMapGrid1f, "_emscripten_glMapGrid2d": _emscripten_glMapGrid2d, "_emscripten_glMapGrid2f": _emscripten_glMapGrid2f, "_emscripten_glMaterialf": _emscripten_glMaterialf, "_emscripten_glMaterialfv": _emscripten_glMaterialfv, "_emscripten_glMateriali": _emscripten_glMateriali, "_emscripten_glMaterialiv": _emscripten_glMaterialiv, "_emscripten_glMatrixMode": _emscripten_glMatrixMode, "_emscripten_glMinmax": _emscripten_glMinmax, "_emscripten_glMultMatrixd": _emscripten_glMultMatrixd, "_emscripten_glMultMatrixf": _emscripten_glMultMatrixf, "_emscripten_glMultTransposeMatrixd": _emscripten_glMultTransposeMatrixd, "_emscripten_glMultTransposeMatrixf": _emscripten_glMultTransposeMatrixf, "_emscripten_glMultiDrawArrays": _emscripten_glMultiDrawArrays, "_emscripten_glMultiDrawElements": _emscripten_glMultiDrawElements, "_emscripten_glMultiTexCoord1d": _emscripten_glMultiTexCoord1d, "_emscripten_glMultiTexCoord1dv": _emscripten_glMultiTexCoord1dv, "_emscripten_glMultiTexCoord1f": _emscripten_glMultiTexCoord1f, "_emscripten_glMultiTexCoord1fv": _emscripten_glMultiTexCoord1fv, "_emscripten_glMultiTexCoord1i": _emscripten_glMultiTexCoord1i, "_emscripten_glMultiTexCoord1iv": _emscripten_glMultiTexCoord1iv, "_emscripten_glMultiTexCoord1s": _emscripten_glMultiTexCoord1s, "_emscripten_glMultiTexCoord1sv": _emscripten_glMultiTexCoord1sv, "_emscripten_glMultiTexCoord2d": _emscripten_glMultiTexCoord2d, "_emscripten_glMultiTexCoord2dv": _emscripten_glMultiTexCoord2dv, "_emscripten_glMultiTexCoord2f": _emscripten_glMultiTexCoord2f, "_emscripten_glMultiTexCoord2fv": _emscripten_glMultiTexCoord2fv, "_emscripten_glMultiTexCoord2i": _emscripten_glMultiTexCoord2i, "_emscripten_glMultiTexCoord2iv": _emscripten_glMultiTexCoord2iv, "_emscripten_glMultiTexCoord2s": _emscripten_glMultiTexCoord2s, "_emscripten_glMultiTexCoord2sv": _emscripten_glMultiTexCoord2sv, "_emscripten_glMultiTexCoord3d": _emscripten_glMultiTexCoord3d, "_emscripten_glMultiTexCoord3dv": _emscripten_glMultiTexCoord3dv, "_emscripten_glMultiTexCoord3f": _emscripten_glMultiTexCoord3f, "_emscripten_glMultiTexCoord3fv": _emscripten_glMultiTexCoord3fv, "_emscripten_glMultiTexCoord3i": _emscripten_glMultiTexCoord3i, "_emscripten_glMultiTexCoord3iv": _emscripten_glMultiTexCoord3iv, "_emscripten_glMultiTexCoord3s": _emscripten_glMultiTexCoord3s, "_emscripten_glMultiTexCoord3sv": _emscripten_glMultiTexCoord3sv, "_emscripten_glMultiTexCoord4d": _emscripten_glMultiTexCoord4d, "_emscripten_glMultiTexCoord4dv": _emscripten_glMultiTexCoord4dv, "_emscripten_glMultiTexCoord4f": _emscripten_glMultiTexCoord4f, "_emscripten_glMultiTexCoord4fv": _emscripten_glMultiTexCoord4fv, "_emscripten_glMultiTexCoord4i": _emscripten_glMultiTexCoord4i, "_emscripten_glMultiTexCoord4iv": _emscripten_glMultiTexCoord4iv, "_emscripten_glMultiTexCoord4s": _emscripten_glMultiTexCoord4s, "_emscripten_glMultiTexCoord4sv": _emscripten_glMultiTexCoord4sv, "_emscripten_glNewList": _emscripten_glNewList, "_emscripten_glNormal3b": _emscripten_glNormal3b, "_emscripten_glNormal3bv": _emscripten_glNormal3bv, "_emscripten_glNormal3d": _emscripten_glNormal3d, "_emscripten_glNormal3dv": _emscripten_glNormal3dv, "_emscripten_glNormal3f": _emscripten_glNormal3f, "_emscripten_glNormal3fv": _emscripten_glNormal3fv, "_emscripten_glNormal3i": _emscripten_glNormal3i, "_emscripten_glNormal3iv": _emscripten_glNormal3iv, "_emscripten_glNormal3s": _emscripten_glNormal3s, "_emscripten_glNormal3sv": _emscripten_glNormal3sv, "_emscripten_glNormalPointer": _emscripten_glNormalPointer, "_emscripten_glOrtho": _emscripten_glOrtho, "_emscripten_glPassThrough": _emscripten_glPassThrough, "_emscripten_glPixelMapfv": _emscripten_glPixelMapfv, "_emscripten_glPixelMapuiv": _emscripten_glPixelMapuiv, "_emscripten_glPixelMapusv": _emscripten_glPixelMapusv, "_emscripten_glPixelStoref": _emscripten_glPixelStoref, "_emscripten_glPixelStorei": _emscripten_glPixelStorei, "_emscripten_glPixelTransferf": _emscripten_glPixelTransferf, "_emscripten_glPixelTransferi": _emscripten_glPixelTransferi, "_emscripten_glPixelZoom": _emscripten_glPixelZoom, "_emscripten_glPointParameterf": _emscripten_glPointParameterf, "_emscripten_glPointParameterfv": _emscripten_glPointParameterfv, "_emscripten_glPointParameteri": _emscripten_glPointParameteri, "_emscripten_glPointParameteriv": _emscripten_glPointParameteriv, "_emscripten_glPointSize": _emscripten_glPointSize, "_emscripten_glPolygonMode": _emscripten_glPolygonMode, "_emscripten_glPolygonOffset": _emscripten_glPolygonOffset, "_emscripten_glPolygonStipple": _emscripten_glPolygonStipple, "_emscripten_glPopAttrib": _emscripten_glPopAttrib, "_emscripten_glPopClientAttrib": _emscripten_glPopClientAttrib, "_emscripten_glPopMatrix": _emscripten_glPopMatrix, "_emscripten_glPopName": _emscripten_glPopName, "_emscripten_glPrimitiveRestartIndex": _emscripten_glPrimitiveRestartIndex, "_emscripten_glPrioritizeTextures": _emscripten_glPrioritizeTextures, "_emscripten_glProgramEnvParameter4dARB": _emscripten_glProgramEnvParameter4dARB, "_emscripten_glProgramEnvParameter4dvARB": _emscripten_glProgramEnvParameter4dvARB, "_emscripten_glProgramEnvParameter4fARB": _emscripten_glProgramEnvParameter4fARB, "_emscripten_glProgramEnvParameter4fvARB": _emscripten_glProgramEnvParameter4fvARB, "_emscripten_glProgramLocalParameter4dARB": _emscripten_glProgramLocalParameter4dARB, "_emscripten_glProgramLocalParameter4dvARB": _emscripten_glProgramLocalParameter4dvARB, "_emscripten_glProgramLocalParameter4fARB": _emscripten_glProgramLocalParameter4fARB, "_emscripten_glProgramLocalParameter4fvARB": _emscripten_glProgramLocalParameter4fvARB, "_emscripten_glProgramStringARB": _emscripten_glProgramStringARB, "_emscripten_glPushAttrib": _emscripten_glPushAttrib, "_emscripten_glPushClientAttrib": _emscripten_glPushClientAttrib, "_emscripten_glPushMatrix": _emscripten_glPushMatrix, "_emscripten_glPushName": _emscripten_glPushName, "_emscripten_glRasterPos2d": _emscripten_glRasterPos2d, "_emscripten_glRasterPos2dv": _emscripten_glRasterPos2dv, "_emscripten_glRasterPos2f": _emscripten_glRasterPos2f, "_emscripten_glRasterPos2fv": _emscripten_glRasterPos2fv, "_emscripten_glRasterPos2i": _emscripten_glRasterPos2i, "_emscripten_glRasterPos2iv": _emscripten_glRasterPos2iv, "_emscripten_glRasterPos2s": _emscripten_glRasterPos2s, "_emscripten_glRasterPos2sv": _emscripten_glRasterPos2sv, "_emscripten_glRasterPos3d": _emscripten_glRasterPos3d, "_emscripten_glRasterPos3dv": _emscripten_glRasterPos3dv, "_emscripten_glRasterPos3f": _emscripten_glRasterPos3f, "_emscripten_glRasterPos3fv": _emscripten_glRasterPos3fv, "_emscripten_glRasterPos3i": _emscripten_glRasterPos3i, "_emscripten_glRasterPos3iv": _emscripten_glRasterPos3iv, "_emscripten_glRasterPos3s": _emscripten_glRasterPos3s, "_emscripten_glRasterPos3sv": _emscripten_glRasterPos3sv, "_emscripten_glRasterPos4d": _emscripten_glRasterPos4d, "_emscripten_glRasterPos4dv": _emscripten_glRasterPos4dv, "_emscripten_glRasterPos4f": _emscripten_glRasterPos4f, "_emscripten_glRasterPos4fv": _emscripten_glRasterPos4fv, "_emscripten_glRasterPos4i": _emscripten_glRasterPos4i, "_emscripten_glRasterPos4iv": _emscripten_glRasterPos4iv, "_emscripten_glRasterPos4s": _emscripten_glRasterPos4s, "_emscripten_glRasterPos4sv": _emscripten_glRasterPos4sv, "_emscripten_glReadBuffer": _emscripten_glReadBuffer, "_emscripten_glReadPixels": _emscripten_glReadPixels, "_emscripten_glRectd": _emscripten_glRectd, "_emscripten_glRectdv": _emscripten_glRectdv, "_emscripten_glRectf": _emscripten_glRectf, "_emscripten_glRectfv": _emscripten_glRectfv, "_emscripten_glRecti": _emscripten_glRecti, "_emscripten_glRectiv": _emscripten_glRectiv, "_emscripten_glRects": _emscripten_glRects, "_emscripten_glRectsv": _emscripten_glRectsv, "_emscripten_glReleaseShaderCompiler": _emscripten_glReleaseShaderCompiler, "_emscripten_glRenderMode": _emscripten_glRenderMode, "_emscripten_glRenderbufferStorage": _emscripten_glRenderbufferStorage, "_emscripten_glRenderbufferStorageMultisample": _emscripten_glRenderbufferStorageMultisample, "_emscripten_glResetHistogram": _emscripten_glResetHistogram, "_emscripten_glResetMinmax": _emscripten_glResetMinmax, "_emscripten_glRotated": _emscripten_glRotated, "_emscripten_glRotatef": _emscripten_glRotatef, "_emscripten_glSampleCoverage": _emscripten_glSampleCoverage, "_emscripten_glScaled": _emscripten_glScaled, "_emscripten_glScalef": _emscripten_glScalef, "_emscripten_glScissor": _emscripten_glScissor, "_emscripten_glSecondaryColor3b": _emscripten_glSecondaryColor3b, "_emscripten_glSecondaryColor3bv": _emscripten_glSecondaryColor3bv, "_emscripten_glSecondaryColor3d": _emscripten_glSecondaryColor3d, "_emscripten_glSecondaryColor3dv": _emscripten_glSecondaryColor3dv, "_emscripten_glSecondaryColor3f": _emscripten_glSecondaryColor3f, "_emscripten_glSecondaryColor3fv": _emscripten_glSecondaryColor3fv, "_emscripten_glSecondaryColor3i": _emscripten_glSecondaryColor3i, "_emscripten_glSecondaryColor3iv": _emscripten_glSecondaryColor3iv, "_emscripten_glSecondaryColor3s": _emscripten_glSecondaryColor3s, "_emscripten_glSecondaryColor3sv": _emscripten_glSecondaryColor3sv, "_emscripten_glSecondaryColor3ub": _emscripten_glSecondaryColor3ub, "_emscripten_glSecondaryColor3ubv": _emscripten_glSecondaryColor3ubv, "_emscripten_glSecondaryColor3ui": _emscripten_glSecondaryColor3ui, "_emscripten_glSecondaryColor3uiv": _emscripten_glSecondaryColor3uiv, "_emscripten_glSecondaryColor3us": _emscripten_glSecondaryColor3us, "_emscripten_glSecondaryColor3usv": _emscripten_glSecondaryColor3usv, "_emscripten_glSecondaryColorPointer": _emscripten_glSecondaryColorPointer, "_emscripten_glSelectBuffer": _emscripten_glSelectBuffer, "_emscripten_glSeparableFilter2D": _emscripten_glSeparableFilter2D, "_emscripten_glShadeModel": _emscripten_glShadeModel, "_emscripten_glShaderBinary": _emscripten_glShaderBinary, "_emscripten_glShaderSource": _emscripten_glShaderSource, "_emscripten_glStencilFunc": _emscripten_glStencilFunc, "_emscripten_glStencilFuncSeparate": _emscripten_glStencilFuncSeparate, "_emscripten_glStencilMask": _emscripten_glStencilMask, "_emscripten_glStencilMaskSeparate": _emscripten_glStencilMaskSeparate, "_emscripten_glStencilOp": _emscripten_glStencilOp, "_emscripten_glStencilOpSeparate": _emscripten_glStencilOpSeparate, "_emscripten_glTexBuffer": _emscripten_glTexBuffer, "_emscripten_glTexCoord1d": _emscripten_glTexCoord1d, "_emscripten_glTexCoord1dv": _emscripten_glTexCoord1dv, "_emscripten_glTexCoord1f": _emscripten_glTexCoord1f, "_emscripten_glTexCoord1fv": _emscripten_glTexCoord1fv, "_emscripten_glTexCoord1i": _emscripten_glTexCoord1i, "_emscripten_glTexCoord1iv": _emscripten_glTexCoord1iv, "_emscripten_glTexCoord1s": _emscripten_glTexCoord1s, "_emscripten_glTexCoord1sv": _emscripten_glTexCoord1sv, "_emscripten_glTexCoord2d": _emscripten_glTexCoord2d, "_emscripten_glTexCoord2dv": _emscripten_glTexCoord2dv, "_emscripten_glTexCoord2f": _emscripten_glTexCoord2f, "_emscripten_glTexCoord2fv": _emscripten_glTexCoord2fv, "_emscripten_glTexCoord2i": _emscripten_glTexCoord2i, "_emscripten_glTexCoord2iv": _emscripten_glTexCoord2iv, "_emscripten_glTexCoord2s": _emscripten_glTexCoord2s, "_emscripten_glTexCoord2sv": _emscripten_glTexCoord2sv, "_emscripten_glTexCoord3d": _emscripten_glTexCoord3d, "_emscripten_glTexCoord3dv": _emscripten_glTexCoord3dv, "_emscripten_glTexCoord3f": _emscripten_glTexCoord3f, "_emscripten_glTexCoord3fv": _emscripten_glTexCoord3fv, "_emscripten_glTexCoord3i": _emscripten_glTexCoord3i, "_emscripten_glTexCoord3iv": _emscripten_glTexCoord3iv, "_emscripten_glTexCoord3s": _emscripten_glTexCoord3s, "_emscripten_glTexCoord3sv": _emscripten_glTexCoord3sv, "_emscripten_glTexCoord4d": _emscripten_glTexCoord4d, "_emscripten_glTexCoord4dv": _emscripten_glTexCoord4dv, "_emscripten_glTexCoord4f": _emscripten_glTexCoord4f, "_emscripten_glTexCoord4fv": _emscripten_glTexCoord4fv, "_emscripten_glTexCoord4i": _emscripten_glTexCoord4i, "_emscripten_glTexCoord4iv": _emscripten_glTexCoord4iv, "_emscripten_glTexCoord4s": _emscripten_glTexCoord4s, "_emscripten_glTexCoord4sv": _emscripten_glTexCoord4sv, "_emscripten_glTexCoordPointer": _emscripten_glTexCoordPointer, "_emscripten_glTexEnvf": _emscripten_glTexEnvf, "_emscripten_glTexEnvfv": _emscripten_glTexEnvfv, "_emscripten_glTexEnvi": _emscripten_glTexEnvi, "_emscripten_glTexEnviv": _emscripten_glTexEnviv, "_emscripten_glTexGend": _emscripten_glTexGend, "_emscripten_glTexGendv": _emscripten_glTexGendv, "_emscripten_glTexGenf": _emscripten_glTexGenf, "_emscripten_glTexGenfv": _emscripten_glTexGenfv, "_emscripten_glTexGeni": _emscripten_glTexGeni, "_emscripten_glTexGeniv": _emscripten_glTexGeniv, "_emscripten_glTexImage1D": _emscripten_glTexImage1D, "_emscripten_glTexImage2D": _emscripten_glTexImage2D, "_emscripten_glTexImage3D": _emscripten_glTexImage3D, "_emscripten_glTexParameterIiv": _emscripten_glTexParameterIiv, "_emscripten_glTexParameterIuiv": _emscripten_glTexParameterIuiv, "_emscripten_glTexParameterf": _emscripten_glTexParameterf, "_emscripten_glTexParameterfv": _emscripten_glTexParameterfv, "_emscripten_glTexParameteri": _emscripten_glTexParameteri, "_emscripten_glTexParameteriv": _emscripten_glTexParameteriv, "_emscripten_glTexStorage2D": _emscripten_glTexStorage2D, "_emscripten_glTexStorage3D": _emscripten_glTexStorage3D, "_emscripten_glTexSubImage1D": _emscripten_glTexSubImage1D, "_emscripten_glTexSubImage2D": _emscripten_glTexSubImage2D, "_emscripten_glTexSubImage3D": _emscripten_glTexSubImage3D, "_emscripten_glTransformFeedbackVaryings": _emscripten_glTransformFeedbackVaryings, "_emscripten_glTranslated": _emscripten_glTranslated, "_emscripten_glTranslatef": _emscripten_glTranslatef, "_emscripten_glUniform1f": _emscripten_glUniform1f, "_emscripten_glUniform1fv": _emscripten_glUniform1fv, "_emscripten_glUniform1i": _emscripten_glUniform1i, "_emscripten_glUniform1iv": _emscripten_glUniform1iv, "_emscripten_glUniform1ui": _emscripten_glUniform1ui, "_emscripten_glUniform1uiv": _emscripten_glUniform1uiv, "_emscripten_glUniform2f": _emscripten_glUniform2f, "_emscripten_glUniform2fv": _emscripten_glUniform2fv, "_emscripten_glUniform2i": _emscripten_glUniform2i, "_emscripten_glUniform2iv": _emscripten_glUniform2iv, "_emscripten_glUniform2ui": _emscripten_glUniform2ui, "_emscripten_glUniform2uiv": _emscripten_glUniform2uiv, "_emscripten_glUniform3f": _emscripten_glUniform3f, "_emscripten_glUniform3fv": _emscripten_glUniform3fv, "_emscripten_glUniform3i": _emscripten_glUniform3i, "_emscripten_glUniform3iv": _emscripten_glUniform3iv, "_emscripten_glUniform3ui": _emscripten_glUniform3ui, "_emscripten_glUniform3uiv": _emscripten_glUniform3uiv, "_emscripten_glUniform4f": _emscripten_glUniform4f, "_emscripten_glUniform4fv": _emscripten_glUniform4fv, "_emscripten_glUniform4i": _emscripten_glUniform4i, "_emscripten_glUniform4iv": _emscripten_glUniform4iv, "_emscripten_glUniform4ui": _emscripten_glUniform4ui, "_emscripten_glUniform4uiv": _emscripten_glUniform4uiv, "_emscripten_glUniformBlockBinding": _emscripten_glUniformBlockBinding, "_emscripten_glUniformMatrix2fv": _emscripten_glUniformMatrix2fv, "_emscripten_glUniformMatrix2x3fv": _emscripten_glUniformMatrix2x3fv, "_emscripten_glUniformMatrix2x4fv": _emscripten_glUniformMatrix2x4fv, "_emscripten_glUniformMatrix3fv": _emscripten_glUniformMatrix3fv, "_emscripten_glUniformMatrix3x2fv": _emscripten_glUniformMatrix3x2fv, "_emscripten_glUniformMatrix3x4fv": _emscripten_glUniformMatrix3x4fv, "_emscripten_glUniformMatrix4fv": _emscripten_glUniformMatrix4fv, "_emscripten_glUniformMatrix4x2fv": _emscripten_glUniformMatrix4x2fv, "_emscripten_glUniformMatrix4x3fv": _emscripten_glUniformMatrix4x3fv, "_emscripten_glUnmapBuffer": _emscripten_glUnmapBuffer, "_emscripten_glUseProgram": _emscripten_glUseProgram, "_emscripten_glUseProgramObjectARB": _emscripten_glUseProgramObjectARB, "_emscripten_glValidateProgram": _emscripten_glValidateProgram, "_emscripten_glVertex2d": _emscripten_glVertex2d, "_emscripten_glVertex2dv": _emscripten_glVertex2dv, "_emscripten_glVertex2f": _emscripten_glVertex2f, "_emscripten_glVertex2fv": _emscripten_glVertex2fv, "_emscripten_glVertex2i": _emscripten_glVertex2i, "_emscripten_glVertex2iv": _emscripten_glVertex2iv, "_emscripten_glVertex2s": _emscripten_glVertex2s, "_emscripten_glVertex2sv": _emscripten_glVertex2sv, "_emscripten_glVertex3d": _emscripten_glVertex3d, "_emscripten_glVertex3dv": _emscripten_glVertex3dv, "_emscripten_glVertex3f": _emscripten_glVertex3f, "_emscripten_glVertex3fv": _emscripten_glVertex3fv, "_emscripten_glVertex3i": _emscripten_glVertex3i, "_emscripten_glVertex3iv": _emscripten_glVertex3iv, "_emscripten_glVertex3s": _emscripten_glVertex3s, "_emscripten_glVertex3sv": _emscripten_glVertex3sv, "_emscripten_glVertex4d": _emscripten_glVertex4d, "_emscripten_glVertex4dv": _emscripten_glVertex4dv, "_emscripten_glVertex4f": _emscripten_glVertex4f, "_emscripten_glVertex4fv": _emscripten_glVertex4fv, "_emscripten_glVertex4i": _emscripten_glVertex4i, "_emscripten_glVertex4iv": _emscripten_glVertex4iv, "_emscripten_glVertex4s": _emscripten_glVertex4s, "_emscripten_glVertex4sv": _emscripten_glVertex4sv, "_emscripten_glVertexAttrib1d": _emscripten_glVertexAttrib1d, "_emscripten_glVertexAttrib1dv": _emscripten_glVertexAttrib1dv, "_emscripten_glVertexAttrib1f": _emscripten_glVertexAttrib1f, "_emscripten_glVertexAttrib1fv": _emscripten_glVertexAttrib1fv, "_emscripten_glVertexAttrib1s": _emscripten_glVertexAttrib1s, "_emscripten_glVertexAttrib1sv": _emscripten_glVertexAttrib1sv, "_emscripten_glVertexAttrib2d": _emscripten_glVertexAttrib2d, "_emscripten_glVertexAttrib2dv": _emscripten_glVertexAttrib2dv, "_emscripten_glVertexAttrib2f": _emscripten_glVertexAttrib2f, "_emscripten_glVertexAttrib2fv": _emscripten_glVertexAttrib2fv, "_emscripten_glVertexAttrib2s": _emscripten_glVertexAttrib2s, "_emscripten_glVertexAttrib2sv": _emscripten_glVertexAttrib2sv, "_emscripten_glVertexAttrib3d": _emscripten_glVertexAttrib3d, "_emscripten_glVertexAttrib3dv": _emscripten_glVertexAttrib3dv, "_emscripten_glVertexAttrib3f": _emscripten_glVertexAttrib3f, "_emscripten_glVertexAttrib3fv": _emscripten_glVertexAttrib3fv, "_emscripten_glVertexAttrib3s": _emscripten_glVertexAttrib3s, "_emscripten_glVertexAttrib3sv": _emscripten_glVertexAttrib3sv, "_emscripten_glVertexAttrib4Nbv": _emscripten_glVertexAttrib4Nbv, "_emscripten_glVertexAttrib4Niv": _emscripten_glVertexAttrib4Niv, "_emscripten_glVertexAttrib4Nsv": _emscripten_glVertexAttrib4Nsv, "_emscripten_glVertexAttrib4Nub": _emscripten_glVertexAttrib4Nub, "_emscripten_glVertexAttrib4Nubv": _emscripten_glVertexAttrib4Nubv, "_emscripten_glVertexAttrib4Nuiv": _emscripten_glVertexAttrib4Nuiv, "_emscripten_glVertexAttrib4Nusv": _emscripten_glVertexAttrib4Nusv, "_emscripten_glVertexAttrib4bv": _emscripten_glVertexAttrib4bv, "_emscripten_glVertexAttrib4d": _emscripten_glVertexAttrib4d, "_emscripten_glVertexAttrib4dv": _emscripten_glVertexAttrib4dv, "_emscripten_glVertexAttrib4f": _emscripten_glVertexAttrib4f, "_emscripten_glVertexAttrib4fv": _emscripten_glVertexAttrib4fv, "_emscripten_glVertexAttrib4iv": _emscripten_glVertexAttrib4iv, "_emscripten_glVertexAttrib4s": _emscripten_glVertexAttrib4s, "_emscripten_glVertexAttrib4sv": _emscripten_glVertexAttrib4sv, "_emscripten_glVertexAttrib4ubv": _emscripten_glVertexAttrib4ubv, "_emscripten_glVertexAttrib4uiv": _emscripten_glVertexAttrib4uiv, "_emscripten_glVertexAttrib4usv": _emscripten_glVertexAttrib4usv, "_emscripten_glVertexAttribDivisor": _emscripten_glVertexAttribDivisor, "_emscripten_glVertexAttribI1i": _emscripten_glVertexAttribI1i, "_emscripten_glVertexAttribI1iv": _emscripten_glVertexAttribI1iv, "_emscripten_glVertexAttribI1ui": _emscripten_glVertexAttribI1ui, "_emscripten_glVertexAttribI1uiv": _emscripten_glVertexAttribI1uiv, "_emscripten_glVertexAttribI2i": _emscripten_glVertexAttribI2i, "_emscripten_glVertexAttribI2iv": _emscripten_glVertexAttribI2iv, "_emscripten_glVertexAttribI2ui": _emscripten_glVertexAttribI2ui, "_emscripten_glVertexAttribI2uiv": _emscripten_glVertexAttribI2uiv, "_emscripten_glVertexAttribI3i": _emscripten_glVertexAttribI3i, "_emscripten_glVertexAttribI3iv": _emscripten_glVertexAttribI3iv, "_emscripten_glVertexAttribI3ui": _emscripten_glVertexAttribI3ui, "_emscripten_glVertexAttribI3uiv": _emscripten_glVertexAttribI3uiv, "_emscripten_glVertexAttribI4bv": _emscripten_glVertexAttribI4bv, "_emscripten_glVertexAttribI4i": _emscripten_glVertexAttribI4i, "_emscripten_glVertexAttribI4iv": _emscripten_glVertexAttribI4iv, "_emscripten_glVertexAttribI4sv": _emscripten_glVertexAttribI4sv, "_emscripten_glVertexAttribI4ubv": _emscripten_glVertexAttribI4ubv, "_emscripten_glVertexAttribI4ui": _emscripten_glVertexAttribI4ui, "_emscripten_glVertexAttribI4uiv": _emscripten_glVertexAttribI4uiv, "_emscripten_glVertexAttribI4usv": _emscripten_glVertexAttribI4usv, "_emscripten_glVertexAttribIPointer": _emscripten_glVertexAttribIPointer, "_emscripten_glVertexAttribPointer": _emscripten_glVertexAttribPointer, "_emscripten_glVertexPointer": _emscripten_glVertexPointer, "_emscripten_glViewport": _emscripten_glViewport, "_emscripten_glWindowPos2d": _emscripten_glWindowPos2d, "_emscripten_glWindowPos2dv": _emscripten_glWindowPos2dv, "_emscripten_glWindowPos2f": _emscripten_glWindowPos2f, "_emscripten_glWindowPos2fv": _emscripten_glWindowPos2fv, "_emscripten_glWindowPos2i": _emscripten_glWindowPos2i, "_emscripten_glWindowPos2iv": _emscripten_glWindowPos2iv, "_emscripten_glWindowPos2s": _emscripten_glWindowPos2s, "_emscripten_glWindowPos2sv": _emscripten_glWindowPos2sv, "_emscripten_glWindowPos3d": _emscripten_glWindowPos3d, "_emscripten_glWindowPos3dv": _emscripten_glWindowPos3dv, "_emscripten_glWindowPos3f": _emscripten_glWindowPos3f, "_emscripten_glWindowPos3fv": _emscripten_glWindowPos3fv, "_emscripten_glWindowPos3i": _emscripten_glWindowPos3i, "_emscripten_glWindowPos3iv": _emscripten_glWindowPos3iv, "_emscripten_glWindowPos3s": _emscripten_glWindowPos3s, "_emscripten_glWindowPos3sv": _emscripten_glWindowPos3sv, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_emscripten_request_pointerlock": _emscripten_request_pointerlock, "_emscripten_set_canvas_element_size": _emscripten_set_canvas_element_size, "_emscripten_set_click_callback_on_thread": _emscripten_set_click_callback_on_thread, "_emscripten_set_fullscreenchange_callback_on_thread": _emscripten_set_fullscreenchange_callback_on_thread, "_emscripten_set_gamepadconnected_callback_on_thread": _emscripten_set_gamepadconnected_callback_on_thread, "_emscripten_set_gamepaddisconnected_callback_on_thread": _emscripten_set_gamepaddisconnected_callback_on_thread, "_emscripten_set_keypress_callback_on_thread": _emscripten_set_keypress_callback_on_thread, "_emscripten_set_main_loop": _emscripten_set_main_loop, "_emscripten_set_main_loop_timing": _emscripten_set_main_loop_timing, "_emscripten_set_touchcancel_callback_on_thread": _emscripten_set_touchcancel_callback_on_thread, "_emscripten_set_touchend_callback_on_thread": _emscripten_set_touchend_callback_on_thread, "_emscripten_set_touchmove_callback_on_thread": _emscripten_set_touchmove_callback_on_thread, "_emscripten_set_touchstart_callback_on_thread": _emscripten_set_touchstart_callback_on_thread, "_exit": _exit, "_glActiveTexture": _glActiveTexture, "_glAttachShader": _glAttachShader, "_glBindAttribLocation": _glBindAttribLocation, "_glBindBuffer": _glBindBuffer, "_glBindTexture": _glBindTexture, "_glBlendFunc": _glBlendFunc, "_glBufferData": _glBufferData, "_glBufferSubData": _glBufferSubData, "_glClear": _glClear, "_glClearColor": _glClearColor, "_glClearDepthf": _glClearDepthf, "_glCompileShader": _glCompileShader, "_glCompressedTexImage2D": _glCompressedTexImage2D, "_glCreateProgram": _glCreateProgram, "_glCreateShader": _glCreateShader, "_glCullFace": _glCullFace, "_glDeleteBuffers": _glDeleteBuffers, "_glDeleteProgram": _glDeleteProgram, "_glDeleteShader": _glDeleteShader, "_glDeleteTextures": _glDeleteTextures, "_glDepthFunc": _glDepthFunc, "_glDetachShader": _glDetachShader, "_glDisable": _glDisable, "_glDisableVertexAttribArray": _glDisableVertexAttribArray, "_glDrawArrays": _glDrawArrays, "_glDrawElements": _glDrawElements, "_glEnable": _glEnable, "_glEnableVertexAttribArray": _glEnableVertexAttribArray, "_glFrontFace": _glFrontFace, "_glGenBuffers": _glGenBuffers, "_glGenTextures": _glGenTextures, "_glGetAttribLocation": _glGetAttribLocation, "_glGetFloatv": _glGetFloatv, "_glGetProgramInfoLog": _glGetProgramInfoLog, "_glGetProgramiv": _glGetProgramiv, "_glGetShaderInfoLog": _glGetShaderInfoLog, "_glGetShaderiv": _glGetShaderiv, "_glGetString": _glGetString, "_glGetUniformLocation": _glGetUniformLocation, "_glLinkProgram": _glLinkProgram, "_glPixelStorei": _glPixelStorei, "_glShaderSource": _glShaderSource, "_glTexImage2D": _glTexImage2D, "_glTexParameterf": _glTexParameterf, "_glTexParameteri": _glTexParameteri, "_glUniform1i": _glUniform1i, "_glUniform4f": _glUniform4f, "_glUniformMatrix4fv": _glUniformMatrix4fv, "_glUseProgram": _glUseProgram, "_glVertexAttribPointer": _glVertexAttribPointer, "_glViewport": _glViewport, "_glfwCreateWindow": _glfwCreateWindow, "_glfwDefaultWindowHints": _glfwDefaultWindowHints, "_glfwDestroyWindow": _glfwDestroyWindow, "_glfwGetCursorPos": _glfwGetCursorPos, "_glfwGetKey": _glfwGetKey, "_glfwGetPrimaryMonitor": _glfwGetPrimaryMonitor, "_glfwGetTime": _glfwGetTime, "_glfwGetVideoModes": _glfwGetVideoModes, "_glfwInit": _glfwInit, "_glfwMakeContextCurrent": _glfwMakeContextCurrent, "_glfwSetCharCallback": _glfwSetCharCallback, "_glfwSetCursorEnterCallback": _glfwSetCursorEnterCallback, "_glfwSetCursorPosCallback": _glfwSetCursorPosCallback, "_glfwSetErrorCallback": _glfwSetErrorCallback, "_glfwSetKeyCallback": _glfwSetKeyCallback, "_glfwSetMouseButtonCallback": _glfwSetMouseButtonCallback, "_glfwSetScrollCallback": _glfwSetScrollCallback, "_glfwSetWindowIconifyCallback": _glfwSetWindowIconifyCallback, "_glfwSetWindowShouldClose": _glfwSetWindowShouldClose, "_glfwSetWindowSizeCallback": _glfwSetWindowSizeCallback, "_glfwSwapBuffers": _glfwSwapBuffers, "_glfwSwapInterval": _glfwSwapInterval, "_glfwTerminate": _glfwTerminate, "_glfwWindowHint": _glfwWindowHint, "_llvm_exp2_f32": _llvm_exp2_f32, "_llvm_stackrestore": _llvm_stackrestore, "_llvm_stacksave": _llvm_stacksave, "_pthread_attr_destroy": _pthread_attr_destroy, "_pthread_attr_init": _pthread_attr_init, "_pthread_cond_destroy": _pthread_cond_destroy, "_pthread_cond_init": _pthread_cond_init, "_pthread_cond_signal": _pthread_cond_signal, "_pthread_cond_wait": _pthread_cond_wait, "_pthread_create": _pthread_create, "_pthread_join": _pthread_join, "_pthread_mutex_destroy": _pthread_mutex_destroy, "_pthread_mutex_init": _pthread_mutex_init, "_time": _time, "_usleep": _usleep, "emscriptenWebGLComputeImageSize": emscriptenWebGLComputeImageSize, "emscriptenWebGLGet": emscriptenWebGLGet, "emscriptenWebGLGetTexPixelData": emscriptenWebGLGetTexPixelData, "emscriptenWebGLGetUniform": emscriptenWebGLGetUniform, "emscriptenWebGLGetVertexAttrib": emscriptenWebGLGetVertexAttrib, "DYNAMICTOP_PTR": DYNAMICTOP_PTR, "tempDoublePtr": tempDoublePtr, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX };
+Module.asmLibraryArg = { "abort": abort, "assert": assert, "enlargeMemory": enlargeMemory, "getTotalMemory": getTotalMemory, "setTempRet0": setTempRet0, "getTempRet0": getTempRet0, "abortOnCannotGrowMemory": abortOnCannotGrowMemory, "___assert_fail": ___assert_fail, "___buildEnvironment": ___buildEnvironment, "___lock": ___lock, "___setErrNo": ___setErrNo, "___syscall140": ___syscall140, "___syscall145": ___syscall145, "___syscall146": ___syscall146, "___syscall221": ___syscall221, "___syscall5": ___syscall5, "___syscall54": ___syscall54, "___syscall6": ___syscall6, "___unlock": ___unlock, "__emscripten_do_request_fullscreen": __emscripten_do_request_fullscreen, "__emscripten_sample_gamepad_data": __emscripten_sample_gamepad_data, "__exit": __exit, "__get_canvas_element_size": __get_canvas_element_size, "__registerRestoreOldStyle": __registerRestoreOldStyle, "__setLetterbox": __setLetterbox, "__set_canvas_element_size": __set_canvas_element_size, "_clock_gettime": _clock_gettime, "_dlclose": _dlclose, "_dlerror": _dlerror, "_dlsym": _dlsym, "_eglBindAPI": _eglBindAPI, "_eglChooseConfig": _eglChooseConfig, "_eglCreateContext": _eglCreateContext, "_eglCreateWindowSurface": _eglCreateWindowSurface, "_eglDestroyContext": _eglDestroyContext, "_eglDestroySurface": _eglDestroySurface, "_eglGetConfigAttrib": _eglGetConfigAttrib, "_eglGetDisplay": _eglGetDisplay, "_eglGetError": _eglGetError, "_eglGetProcAddress": _eglGetProcAddress, "_eglInitialize": _eglInitialize, "_eglMakeCurrent": _eglMakeCurrent, "_eglQueryString": _eglQueryString, "_eglSwapBuffers": _eglSwapBuffers, "_eglSwapInterval": _eglSwapInterval, "_eglTerminate": _eglTerminate, "_eglWaitClient": _eglWaitClient, "_eglWaitGL": _eglWaitGL, "_eglWaitNative": _eglWaitNative, "_emscripten_asm_const_i": _emscripten_asm_const_i, "_emscripten_asm_const_ii": _emscripten_asm_const_ii, "_emscripten_asm_const_iii": _emscripten_asm_const_iii, "_emscripten_asm_const_iiii": _emscripten_asm_const_iiii, "_emscripten_asm_const_iiiii": _emscripten_asm_const_iiiii, "_emscripten_asm_const_iiiiii": _emscripten_asm_const_iiiiii, "_emscripten_exit_fullscreen": _emscripten_exit_fullscreen, "_emscripten_exit_pointerlock": _emscripten_exit_pointerlock, "_emscripten_get_canvas_element_size": _emscripten_get_canvas_element_size, "_emscripten_get_device_pixel_ratio": _emscripten_get_device_pixel_ratio, "_emscripten_get_element_css_size": _emscripten_get_element_css_size, "_emscripten_get_gamepad_status": _emscripten_get_gamepad_status, "_emscripten_get_now": _emscripten_get_now, "_emscripten_get_now_is_monotonic": _emscripten_get_now_is_monotonic, "_emscripten_get_num_gamepads": _emscripten_get_num_gamepads, "_emscripten_get_pointerlock_status": _emscripten_get_pointerlock_status, "_emscripten_glAccum": _emscripten_glAccum, "_emscripten_glActiveTexture": _emscripten_glActiveTexture, "_emscripten_glAlphaFunc": _emscripten_glAlphaFunc, "_emscripten_glAreTexturesResident": _emscripten_glAreTexturesResident, "_emscripten_glArrayElement": _emscripten_glArrayElement, "_emscripten_glAttachObjectARB": _emscripten_glAttachObjectARB, "_emscripten_glAttachShader": _emscripten_glAttachShader, "_emscripten_glBegin": _emscripten_glBegin, "_emscripten_glBeginConditionalRender": _emscripten_glBeginConditionalRender, "_emscripten_glBeginQuery": _emscripten_glBeginQuery, "_emscripten_glBeginTransformFeedback": _emscripten_glBeginTransformFeedback, "_emscripten_glBindAttribLocation": _emscripten_glBindAttribLocation, "_emscripten_glBindBuffer": _emscripten_glBindBuffer, "_emscripten_glBindBufferBase": _emscripten_glBindBufferBase, "_emscripten_glBindBufferRange": _emscripten_glBindBufferRange, "_emscripten_glBindFragDataLocation": _emscripten_glBindFragDataLocation, "_emscripten_glBindFramebuffer": _emscripten_glBindFramebuffer, "_emscripten_glBindProgramARB": _emscripten_glBindProgramARB, "_emscripten_glBindRenderbuffer": _emscripten_glBindRenderbuffer, "_emscripten_glBindTexture": _emscripten_glBindTexture, "_emscripten_glBindVertexArray": _emscripten_glBindVertexArray, "_emscripten_glBitmap": _emscripten_glBitmap, "_emscripten_glBlendColor": _emscripten_glBlendColor, "_emscripten_glBlendEquation": _emscripten_glBlendEquation, "_emscripten_glBlendEquationSeparate": _emscripten_glBlendEquationSeparate, "_emscripten_glBlendFunc": _emscripten_glBlendFunc, "_emscripten_glBlendFuncSeparate": _emscripten_glBlendFuncSeparate, "_emscripten_glBlitFramebuffer": _emscripten_glBlitFramebuffer, "_emscripten_glBufferData": _emscripten_glBufferData, "_emscripten_glBufferSubData": _emscripten_glBufferSubData, "_emscripten_glCallList": _emscripten_glCallList, "_emscripten_glCallLists": _emscripten_glCallLists, "_emscripten_glCheckFramebufferStatus": _emscripten_glCheckFramebufferStatus, "_emscripten_glClampColor": _emscripten_glClampColor, "_emscripten_glClear": _emscripten_glClear, "_emscripten_glClearAccum": _emscripten_glClearAccum, "_emscripten_glClearBufferfi": _emscripten_glClearBufferfi, "_emscripten_glClearBufferfv": _emscripten_glClearBufferfv, "_emscripten_glClearBufferiv": _emscripten_glClearBufferiv, "_emscripten_glClearBufferuiv": _emscripten_glClearBufferuiv, "_emscripten_glClearColor": _emscripten_glClearColor, "_emscripten_glClearDepth": _emscripten_glClearDepth, "_emscripten_glClearDepthf": _emscripten_glClearDepthf, "_emscripten_glClearIndex": _emscripten_glClearIndex, "_emscripten_glClearStencil": _emscripten_glClearStencil, "_emscripten_glClientActiveTexture": _emscripten_glClientActiveTexture, "_emscripten_glClipPlane": _emscripten_glClipPlane, "_emscripten_glColor3b": _emscripten_glColor3b, "_emscripten_glColor3bv": _emscripten_glColor3bv, "_emscripten_glColor3d": _emscripten_glColor3d, "_emscripten_glColor3dv": _emscripten_glColor3dv, "_emscripten_glColor3f": _emscripten_glColor3f, "_emscripten_glColor3fv": _emscripten_glColor3fv, "_emscripten_glColor3i": _emscripten_glColor3i, "_emscripten_glColor3iv": _emscripten_glColor3iv, "_emscripten_glColor3s": _emscripten_glColor3s, "_emscripten_glColor3sv": _emscripten_glColor3sv, "_emscripten_glColor3ub": _emscripten_glColor3ub, "_emscripten_glColor3ubv": _emscripten_glColor3ubv, "_emscripten_glColor3ui": _emscripten_glColor3ui, "_emscripten_glColor3uiv": _emscripten_glColor3uiv, "_emscripten_glColor3us": _emscripten_glColor3us, "_emscripten_glColor3usv": _emscripten_glColor3usv, "_emscripten_glColor4b": _emscripten_glColor4b, "_emscripten_glColor4bv": _emscripten_glColor4bv, "_emscripten_glColor4d": _emscripten_glColor4d, "_emscripten_glColor4dv": _emscripten_glColor4dv, "_emscripten_glColor4f": _emscripten_glColor4f, "_emscripten_glColor4fv": _emscripten_glColor4fv, "_emscripten_glColor4i": _emscripten_glColor4i, "_emscripten_glColor4iv": _emscripten_glColor4iv, "_emscripten_glColor4s": _emscripten_glColor4s, "_emscripten_glColor4sv": _emscripten_glColor4sv, "_emscripten_glColor4ub": _emscripten_glColor4ub, "_emscripten_glColor4ubv": _emscripten_glColor4ubv, "_emscripten_glColor4ui": _emscripten_glColor4ui, "_emscripten_glColor4uiv": _emscripten_glColor4uiv, "_emscripten_glColor4us": _emscripten_glColor4us, "_emscripten_glColor4usv": _emscripten_glColor4usv, "_emscripten_glColorMask": _emscripten_glColorMask, "_emscripten_glColorMaski": _emscripten_glColorMaski, "_emscripten_glColorMaterial": _emscripten_glColorMaterial, "_emscripten_glColorPointer": _emscripten_glColorPointer, "_emscripten_glColorSubTable": _emscripten_glColorSubTable, "_emscripten_glColorTable": _emscripten_glColorTable, "_emscripten_glColorTableParameterfv": _emscripten_glColorTableParameterfv, "_emscripten_glColorTableParameteriv": _emscripten_glColorTableParameteriv, "_emscripten_glCompileShader": _emscripten_glCompileShader, "_emscripten_glCompressedTexImage1D": _emscripten_glCompressedTexImage1D, "_emscripten_glCompressedTexImage2D": _emscripten_glCompressedTexImage2D, "_emscripten_glCompressedTexImage3D": _emscripten_glCompressedTexImage3D, "_emscripten_glCompressedTexSubImage1D": _emscripten_glCompressedTexSubImage1D, "_emscripten_glCompressedTexSubImage2D": _emscripten_glCompressedTexSubImage2D, "_emscripten_glCompressedTexSubImage3D": _emscripten_glCompressedTexSubImage3D, "_emscripten_glConvolutionFilter1D": _emscripten_glConvolutionFilter1D, "_emscripten_glConvolutionFilter2D": _emscripten_glConvolutionFilter2D, "_emscripten_glConvolutionParameterf": _emscripten_glConvolutionParameterf, "_emscripten_glConvolutionParameterfv": _emscripten_glConvolutionParameterfv, "_emscripten_glConvolutionParameteri": _emscripten_glConvolutionParameteri, "_emscripten_glConvolutionParameteriv": _emscripten_glConvolutionParameteriv, "_emscripten_glCopyColorSubTable": _emscripten_glCopyColorSubTable, "_emscripten_glCopyColorTable": _emscripten_glCopyColorTable, "_emscripten_glCopyConvolutionFilter1D": _emscripten_glCopyConvolutionFilter1D, "_emscripten_glCopyConvolutionFilter2D": _emscripten_glCopyConvolutionFilter2D, "_emscripten_glCopyPixels": _emscripten_glCopyPixels, "_emscripten_glCopyTexImage1D": _emscripten_glCopyTexImage1D, "_emscripten_glCopyTexImage2D": _emscripten_glCopyTexImage2D, "_emscripten_glCopyTexSubImage1D": _emscripten_glCopyTexSubImage1D, "_emscripten_glCopyTexSubImage2D": _emscripten_glCopyTexSubImage2D, "_emscripten_glCopyTexSubImage3D": _emscripten_glCopyTexSubImage3D, "_emscripten_glCreateProgram": _emscripten_glCreateProgram, "_emscripten_glCreateProgramObjectARB": _emscripten_glCreateProgramObjectARB, "_emscripten_glCreateShader": _emscripten_glCreateShader, "_emscripten_glCreateShaderObjectARB": _emscripten_glCreateShaderObjectARB, "_emscripten_glCullFace": _emscripten_glCullFace, "_emscripten_glDeleteBuffers": _emscripten_glDeleteBuffers, "_emscripten_glDeleteFramebuffers": _emscripten_glDeleteFramebuffers, "_emscripten_glDeleteLists": _emscripten_glDeleteLists, "_emscripten_glDeleteObjectARB": _emscripten_glDeleteObjectARB, "_emscripten_glDeleteProgram": _emscripten_glDeleteProgram, "_emscripten_glDeleteProgramsARB": _emscripten_glDeleteProgramsARB, "_emscripten_glDeleteQueries": _emscripten_glDeleteQueries, "_emscripten_glDeleteRenderbuffers": _emscripten_glDeleteRenderbuffers, "_emscripten_glDeleteShader": _emscripten_glDeleteShader, "_emscripten_glDeleteTextures": _emscripten_glDeleteTextures, "_emscripten_glDeleteVertexArrays": _emscripten_glDeleteVertexArrays, "_emscripten_glDepthFunc": _emscripten_glDepthFunc, "_emscripten_glDepthMask": _emscripten_glDepthMask, "_emscripten_glDepthRange": _emscripten_glDepthRange, "_emscripten_glDepthRangef": _emscripten_glDepthRangef, "_emscripten_glDetachObjectARB": _emscripten_glDetachObjectARB, "_emscripten_glDetachShader": _emscripten_glDetachShader, "_emscripten_glDisable": _emscripten_glDisable, "_emscripten_glDisableClientState": _emscripten_glDisableClientState, "_emscripten_glDisableVertexAttribArray": _emscripten_glDisableVertexAttribArray, "_emscripten_glDisablei": _emscripten_glDisablei, "_emscripten_glDrawArrays": _emscripten_glDrawArrays, "_emscripten_glDrawArraysInstanced": _emscripten_glDrawArraysInstanced, "_emscripten_glDrawBuffer": _emscripten_glDrawBuffer, "_emscripten_glDrawBuffers": _emscripten_glDrawBuffers, "_emscripten_glDrawElements": _emscripten_glDrawElements, "_emscripten_glDrawElementsInstanced": _emscripten_glDrawElementsInstanced, "_emscripten_glDrawPixels": _emscripten_glDrawPixels, "_emscripten_glDrawRangeElements": _emscripten_glDrawRangeElements, "_emscripten_glEdgeFlag": _emscripten_glEdgeFlag, "_emscripten_glEdgeFlagPointer": _emscripten_glEdgeFlagPointer, "_emscripten_glEdgeFlagv": _emscripten_glEdgeFlagv, "_emscripten_glEnable": _emscripten_glEnable, "_emscripten_glEnableClientState": _emscripten_glEnableClientState, "_emscripten_glEnableVertexAttribArray": _emscripten_glEnableVertexAttribArray, "_emscripten_glEnablei": _emscripten_glEnablei, "_emscripten_glEnd": _emscripten_glEnd, "_emscripten_glEndConditionalRender": _emscripten_glEndConditionalRender, "_emscripten_glEndList": _emscripten_glEndList, "_emscripten_glEndQuery": _emscripten_glEndQuery, "_emscripten_glEndTransformFeedback": _emscripten_glEndTransformFeedback, "_emscripten_glEvalCoord1d": _emscripten_glEvalCoord1d, "_emscripten_glEvalCoord1dv": _emscripten_glEvalCoord1dv, "_emscripten_glEvalCoord1f": _emscripten_glEvalCoord1f, "_emscripten_glEvalCoord1fv": _emscripten_glEvalCoord1fv, "_emscripten_glEvalCoord2d": _emscripten_glEvalCoord2d, "_emscripten_glEvalCoord2dv": _emscripten_glEvalCoord2dv, "_emscripten_glEvalCoord2f": _emscripten_glEvalCoord2f, "_emscripten_glEvalCoord2fv": _emscripten_glEvalCoord2fv, "_emscripten_glEvalMesh1": _emscripten_glEvalMesh1, "_emscripten_glEvalMesh2": _emscripten_glEvalMesh2, "_emscripten_glEvalPoint1": _emscripten_glEvalPoint1, "_emscripten_glEvalPoint2": _emscripten_glEvalPoint2, "_emscripten_glFeedbackBuffer": _emscripten_glFeedbackBuffer, "_emscripten_glFinish": _emscripten_glFinish, "_emscripten_glFlush": _emscripten_glFlush, "_emscripten_glFogCoordPointer": _emscripten_glFogCoordPointer, "_emscripten_glFogCoordd": _emscripten_glFogCoordd, "_emscripten_glFogCoorddv": _emscripten_glFogCoorddv, "_emscripten_glFogCoordf": _emscripten_glFogCoordf, "_emscripten_glFogCoordfv": _emscripten_glFogCoordfv, "_emscripten_glFogf": _emscripten_glFogf, "_emscripten_glFogfv": _emscripten_glFogfv, "_emscripten_glFogi": _emscripten_glFogi, "_emscripten_glFogiv": _emscripten_glFogiv, "_emscripten_glFramebufferRenderbuffer": _emscripten_glFramebufferRenderbuffer, "_emscripten_glFramebufferTexture1D": _emscripten_glFramebufferTexture1D, "_emscripten_glFramebufferTexture2D": _emscripten_glFramebufferTexture2D, "_emscripten_glFramebufferTexture3D": _emscripten_glFramebufferTexture3D, "_emscripten_glFramebufferTextureLayer": _emscripten_glFramebufferTextureLayer, "_emscripten_glFrontFace": _emscripten_glFrontFace, "_emscripten_glFrustum": _emscripten_glFrustum, "_emscripten_glGenBuffers": _emscripten_glGenBuffers, "_emscripten_glGenFramebuffers": _emscripten_glGenFramebuffers, "_emscripten_glGenLists": _emscripten_glGenLists, "_emscripten_glGenProgramsARB": _emscripten_glGenProgramsARB, "_emscripten_glGenQueries": _emscripten_glGenQueries, "_emscripten_glGenRenderbuffers": _emscripten_glGenRenderbuffers, "_emscripten_glGenTextures": _emscripten_glGenTextures, "_emscripten_glGenVertexArrays": _emscripten_glGenVertexArrays, "_emscripten_glGenerateMipmap": _emscripten_glGenerateMipmap, "_emscripten_glGetActiveAttrib": _emscripten_glGetActiveAttrib, "_emscripten_glGetActiveUniform": _emscripten_glGetActiveUniform, "_emscripten_glGetActiveUniformBlockName": _emscripten_glGetActiveUniformBlockName, "_emscripten_glGetActiveUniformBlockiv": _emscripten_glGetActiveUniformBlockiv, "_emscripten_glGetActiveUniformName": _emscripten_glGetActiveUniformName, "_emscripten_glGetActiveUniformsiv": _emscripten_glGetActiveUniformsiv, "_emscripten_glGetAttachedObjectsARB": _emscripten_glGetAttachedObjectsARB, "_emscripten_glGetAttachedShaders": _emscripten_glGetAttachedShaders, "_emscripten_glGetAttribLocation": _emscripten_glGetAttribLocation, "_emscripten_glGetBooleani_v": _emscripten_glGetBooleani_v, "_emscripten_glGetBooleanv": _emscripten_glGetBooleanv, "_emscripten_glGetBufferParameteriv": _emscripten_glGetBufferParameteriv, "_emscripten_glGetBufferPointerv": _emscripten_glGetBufferPointerv, "_emscripten_glGetBufferSubData": _emscripten_glGetBufferSubData, "_emscripten_glGetClipPlane": _emscripten_glGetClipPlane, "_emscripten_glGetColorTable": _emscripten_glGetColorTable, "_emscripten_glGetColorTableParameterfv": _emscripten_glGetColorTableParameterfv, "_emscripten_glGetColorTableParameteriv": _emscripten_glGetColorTableParameteriv, "_emscripten_glGetCompressedTexImage": _emscripten_glGetCompressedTexImage, "_emscripten_glGetConvolutionFilter": _emscripten_glGetConvolutionFilter, "_emscripten_glGetConvolutionParameterfv": _emscripten_glGetConvolutionParameterfv, "_emscripten_glGetConvolutionParameteriv": _emscripten_glGetConvolutionParameteriv, "_emscripten_glGetDoublev": _emscripten_glGetDoublev, "_emscripten_glGetError": _emscripten_glGetError, "_emscripten_glGetFloatv": _emscripten_glGetFloatv, "_emscripten_glGetFragDataLocation": _emscripten_glGetFragDataLocation, "_emscripten_glGetFramebufferAttachmentParameteriv": _emscripten_glGetFramebufferAttachmentParameteriv, "_emscripten_glGetHandleARB": _emscripten_glGetHandleARB, "_emscripten_glGetHistogram": _emscripten_glGetHistogram, "_emscripten_glGetHistogramParameterfv": _emscripten_glGetHistogramParameterfv, "_emscripten_glGetHistogramParameteriv": _emscripten_glGetHistogramParameteriv, "_emscripten_glGetInfoLogARB": _emscripten_glGetInfoLogARB, "_emscripten_glGetIntegeri_v": _emscripten_glGetIntegeri_v, "_emscripten_glGetIntegerv": _emscripten_glGetIntegerv, "_emscripten_glGetLightfv": _emscripten_glGetLightfv, "_emscripten_glGetLightiv": _emscripten_glGetLightiv, "_emscripten_glGetMapdv": _emscripten_glGetMapdv, "_emscripten_glGetMapfv": _emscripten_glGetMapfv, "_emscripten_glGetMapiv": _emscripten_glGetMapiv, "_emscripten_glGetMaterialfv": _emscripten_glGetMaterialfv, "_emscripten_glGetMaterialiv": _emscripten_glGetMaterialiv, "_emscripten_glGetMinmax": _emscripten_glGetMinmax, "_emscripten_glGetMinmaxParameterfv": _emscripten_glGetMinmaxParameterfv, "_emscripten_glGetMinmaxParameteriv": _emscripten_glGetMinmaxParameteriv, "_emscripten_glGetObjectParameterfvARB": _emscripten_glGetObjectParameterfvARB, "_emscripten_glGetObjectParameterivARB": _emscripten_glGetObjectParameterivARB, "_emscripten_glGetPixelMapfv": _emscripten_glGetPixelMapfv, "_emscripten_glGetPixelMapuiv": _emscripten_glGetPixelMapuiv, "_emscripten_glGetPixelMapusv": _emscripten_glGetPixelMapusv, "_emscripten_glGetPointerv": _emscripten_glGetPointerv, "_emscripten_glGetPolygonStipple": _emscripten_glGetPolygonStipple, "_emscripten_glGetProgramEnvParameterdvARB": _emscripten_glGetProgramEnvParameterdvARB, "_emscripten_glGetProgramEnvParameterfvARB": _emscripten_glGetProgramEnvParameterfvARB, "_emscripten_glGetProgramInfoLog": _emscripten_glGetProgramInfoLog, "_emscripten_glGetProgramLocalParameterdvARB": _emscripten_glGetProgramLocalParameterdvARB, "_emscripten_glGetProgramLocalParameterfvARB": _emscripten_glGetProgramLocalParameterfvARB, "_emscripten_glGetProgramStringARB": _emscripten_glGetProgramStringARB, "_emscripten_glGetProgramiv": _emscripten_glGetProgramiv, "_emscripten_glGetQueryObjectiv": _emscripten_glGetQueryObjectiv, "_emscripten_glGetQueryObjectuiv": _emscripten_glGetQueryObjectuiv, "_emscripten_glGetQueryiv": _emscripten_glGetQueryiv, "_emscripten_glGetRenderbufferParameteriv": _emscripten_glGetRenderbufferParameteriv, "_emscripten_glGetSeparableFilter": _emscripten_glGetSeparableFilter, "_emscripten_glGetShaderInfoLog": _emscripten_glGetShaderInfoLog, "_emscripten_glGetShaderPrecisionFormat": _emscripten_glGetShaderPrecisionFormat, "_emscripten_glGetShaderSource": _emscripten_glGetShaderSource, "_emscripten_glGetShaderiv": _emscripten_glGetShaderiv, "_emscripten_glGetString": _emscripten_glGetString, "_emscripten_glGetStringi": _emscripten_glGetStringi, "_emscripten_glGetTexEnvfv": _emscripten_glGetTexEnvfv, "_emscripten_glGetTexEnviv": _emscripten_glGetTexEnviv, "_emscripten_glGetTexGendv": _emscripten_glGetTexGendv, "_emscripten_glGetTexGenfv": _emscripten_glGetTexGenfv, "_emscripten_glGetTexGeniv": _emscripten_glGetTexGeniv, "_emscripten_glGetTexImage": _emscripten_glGetTexImage, "_emscripten_glGetTexLevelParameterfv": _emscripten_glGetTexLevelParameterfv, "_emscripten_glGetTexLevelParameteriv": _emscripten_glGetTexLevelParameteriv, "_emscripten_glGetTexParameterIiv": _emscripten_glGetTexParameterIiv, "_emscripten_glGetTexParameterIuiv": _emscripten_glGetTexParameterIuiv, "_emscripten_glGetTexParameterfv": _emscripten_glGetTexParameterfv, "_emscripten_glGetTexParameteriv": _emscripten_glGetTexParameteriv, "_emscripten_glGetTransformFeedbackVarying": _emscripten_glGetTransformFeedbackVarying, "_emscripten_glGetUniformBlockIndex": _emscripten_glGetUniformBlockIndex, "_emscripten_glGetUniformIndices": _emscripten_glGetUniformIndices, "_emscripten_glGetUniformLocation": _emscripten_glGetUniformLocation, "_emscripten_glGetUniformfv": _emscripten_glGetUniformfv, "_emscripten_glGetUniformiv": _emscripten_glGetUniformiv, "_emscripten_glGetUniformuiv": _emscripten_glGetUniformuiv, "_emscripten_glGetVertexAttribIiv": _emscripten_glGetVertexAttribIiv, "_emscripten_glGetVertexAttribIuiv": _emscripten_glGetVertexAttribIuiv, "_emscripten_glGetVertexAttribPointerv": _emscripten_glGetVertexAttribPointerv, "_emscripten_glGetVertexAttribdv": _emscripten_glGetVertexAttribdv, "_emscripten_glGetVertexAttribfv": _emscripten_glGetVertexAttribfv, "_emscripten_glGetVertexAttribiv": _emscripten_glGetVertexAttribiv, "_emscripten_glHint": _emscripten_glHint, "_emscripten_glHistogram": _emscripten_glHistogram, "_emscripten_glIndexMask": _emscripten_glIndexMask, "_emscripten_glIndexPointer": _emscripten_glIndexPointer, "_emscripten_glIndexd": _emscripten_glIndexd, "_emscripten_glIndexdv": _emscripten_glIndexdv, "_emscripten_glIndexf": _emscripten_glIndexf, "_emscripten_glIndexfv": _emscripten_glIndexfv, "_emscripten_glIndexi": _emscripten_glIndexi, "_emscripten_glIndexiv": _emscripten_glIndexiv, "_emscripten_glIndexs": _emscripten_glIndexs, "_emscripten_glIndexsv": _emscripten_glIndexsv, "_emscripten_glIndexub": _emscripten_glIndexub, "_emscripten_glIndexubv": _emscripten_glIndexubv, "_emscripten_glInitNames": _emscripten_glInitNames, "_emscripten_glInterleavedArrays": _emscripten_glInterleavedArrays, "_emscripten_glIsBuffer": _emscripten_glIsBuffer, "_emscripten_glIsEnabled": _emscripten_glIsEnabled, "_emscripten_glIsEnabledi": _emscripten_glIsEnabledi, "_emscripten_glIsFramebuffer": _emscripten_glIsFramebuffer, "_emscripten_glIsList": _emscripten_glIsList, "_emscripten_glIsProgram": _emscripten_glIsProgram, "_emscripten_glIsQuery": _emscripten_glIsQuery, "_emscripten_glIsRenderbuffer": _emscripten_glIsRenderbuffer, "_emscripten_glIsShader": _emscripten_glIsShader, "_emscripten_glIsTexture": _emscripten_glIsTexture, "_emscripten_glIsVertexArray": _emscripten_glIsVertexArray, "_emscripten_glLightModelf": _emscripten_glLightModelf, "_emscripten_glLightModelfv": _emscripten_glLightModelfv, "_emscripten_glLightModeli": _emscripten_glLightModeli, "_emscripten_glLightModeliv": _emscripten_glLightModeliv, "_emscripten_glLightf": _emscripten_glLightf, "_emscripten_glLightfv": _emscripten_glLightfv, "_emscripten_glLighti": _emscripten_glLighti, "_emscripten_glLightiv": _emscripten_glLightiv, "_emscripten_glLineStipple": _emscripten_glLineStipple, "_emscripten_glLineWidth": _emscripten_glLineWidth, "_emscripten_glLinkProgram": _emscripten_glLinkProgram, "_emscripten_glListBase": _emscripten_glListBase, "_emscripten_glLoadIdentity": _emscripten_glLoadIdentity, "_emscripten_glLoadMatrixd": _emscripten_glLoadMatrixd, "_emscripten_glLoadMatrixf": _emscripten_glLoadMatrixf, "_emscripten_glLoadName": _emscripten_glLoadName, "_emscripten_glLoadTransposeMatrixd": _emscripten_glLoadTransposeMatrixd, "_emscripten_glLoadTransposeMatrixf": _emscripten_glLoadTransposeMatrixf, "_emscripten_glLogicOp": _emscripten_glLogicOp, "_emscripten_glMap1d": _emscripten_glMap1d, "_emscripten_glMap1f": _emscripten_glMap1f, "_emscripten_glMap2d": _emscripten_glMap2d, "_emscripten_glMap2f": _emscripten_glMap2f, "_emscripten_glMapBuffer": _emscripten_glMapBuffer, "_emscripten_glMapGrid1d": _emscripten_glMapGrid1d, "_emscripten_glMapGrid1f": _emscripten_glMapGrid1f, "_emscripten_glMapGrid2d": _emscripten_glMapGrid2d, "_emscripten_glMapGrid2f": _emscripten_glMapGrid2f, "_emscripten_glMaterialf": _emscripten_glMaterialf, "_emscripten_glMaterialfv": _emscripten_glMaterialfv, "_emscripten_glMateriali": _emscripten_glMateriali, "_emscripten_glMaterialiv": _emscripten_glMaterialiv, "_emscripten_glMatrixMode": _emscripten_glMatrixMode, "_emscripten_glMinmax": _emscripten_glMinmax, "_emscripten_glMultMatrixd": _emscripten_glMultMatrixd, "_emscripten_glMultMatrixf": _emscripten_glMultMatrixf, "_emscripten_glMultTransposeMatrixd": _emscripten_glMultTransposeMatrixd, "_emscripten_glMultTransposeMatrixf": _emscripten_glMultTransposeMatrixf, "_emscripten_glMultiDrawArrays": _emscripten_glMultiDrawArrays, "_emscripten_glMultiDrawElements": _emscripten_glMultiDrawElements, "_emscripten_glMultiTexCoord1d": _emscripten_glMultiTexCoord1d, "_emscripten_glMultiTexCoord1dv": _emscripten_glMultiTexCoord1dv, "_emscripten_glMultiTexCoord1f": _emscripten_glMultiTexCoord1f, "_emscripten_glMultiTexCoord1fv": _emscripten_glMultiTexCoord1fv, "_emscripten_glMultiTexCoord1i": _emscripten_glMultiTexCoord1i, "_emscripten_glMultiTexCoord1iv": _emscripten_glMultiTexCoord1iv, "_emscripten_glMultiTexCoord1s": _emscripten_glMultiTexCoord1s, "_emscripten_glMultiTexCoord1sv": _emscripten_glMultiTexCoord1sv, "_emscripten_glMultiTexCoord2d": _emscripten_glMultiTexCoord2d, "_emscripten_glMultiTexCoord2dv": _emscripten_glMultiTexCoord2dv, "_emscripten_glMultiTexCoord2f": _emscripten_glMultiTexCoord2f, "_emscripten_glMultiTexCoord2fv": _emscripten_glMultiTexCoord2fv, "_emscripten_glMultiTexCoord2i": _emscripten_glMultiTexCoord2i, "_emscripten_glMultiTexCoord2iv": _emscripten_glMultiTexCoord2iv, "_emscripten_glMultiTexCoord2s": _emscripten_glMultiTexCoord2s, "_emscripten_glMultiTexCoord2sv": _emscripten_glMultiTexCoord2sv, "_emscripten_glMultiTexCoord3d": _emscripten_glMultiTexCoord3d, "_emscripten_glMultiTexCoord3dv": _emscripten_glMultiTexCoord3dv, "_emscripten_glMultiTexCoord3f": _emscripten_glMultiTexCoord3f, "_emscripten_glMultiTexCoord3fv": _emscripten_glMultiTexCoord3fv, "_emscripten_glMultiTexCoord3i": _emscripten_glMultiTexCoord3i, "_emscripten_glMultiTexCoord3iv": _emscripten_glMultiTexCoord3iv, "_emscripten_glMultiTexCoord3s": _emscripten_glMultiTexCoord3s, "_emscripten_glMultiTexCoord3sv": _emscripten_glMultiTexCoord3sv, "_emscripten_glMultiTexCoord4d": _emscripten_glMultiTexCoord4d, "_emscripten_glMultiTexCoord4dv": _emscripten_glMultiTexCoord4dv, "_emscripten_glMultiTexCoord4f": _emscripten_glMultiTexCoord4f, "_emscripten_glMultiTexCoord4fv": _emscripten_glMultiTexCoord4fv, "_emscripten_glMultiTexCoord4i": _emscripten_glMultiTexCoord4i, "_emscripten_glMultiTexCoord4iv": _emscripten_glMultiTexCoord4iv, "_emscripten_glMultiTexCoord4s": _emscripten_glMultiTexCoord4s, "_emscripten_glMultiTexCoord4sv": _emscripten_glMultiTexCoord4sv, "_emscripten_glNewList": _emscripten_glNewList, "_emscripten_glNormal3b": _emscripten_glNormal3b, "_emscripten_glNormal3bv": _emscripten_glNormal3bv, "_emscripten_glNormal3d": _emscripten_glNormal3d, "_emscripten_glNormal3dv": _emscripten_glNormal3dv, "_emscripten_glNormal3f": _emscripten_glNormal3f, "_emscripten_glNormal3fv": _emscripten_glNormal3fv, "_emscripten_glNormal3i": _emscripten_glNormal3i, "_emscripten_glNormal3iv": _emscripten_glNormal3iv, "_emscripten_glNormal3s": _emscripten_glNormal3s, "_emscripten_glNormal3sv": _emscripten_glNormal3sv, "_emscripten_glNormalPointer": _emscripten_glNormalPointer, "_emscripten_glOrtho": _emscripten_glOrtho, "_emscripten_glPassThrough": _emscripten_glPassThrough, "_emscripten_glPixelMapfv": _emscripten_glPixelMapfv, "_emscripten_glPixelMapuiv": _emscripten_glPixelMapuiv, "_emscripten_glPixelMapusv": _emscripten_glPixelMapusv, "_emscripten_glPixelStoref": _emscripten_glPixelStoref, "_emscripten_glPixelStorei": _emscripten_glPixelStorei, "_emscripten_glPixelTransferf": _emscripten_glPixelTransferf, "_emscripten_glPixelTransferi": _emscripten_glPixelTransferi, "_emscripten_glPixelZoom": _emscripten_glPixelZoom, "_emscripten_glPointParameterf": _emscripten_glPointParameterf, "_emscripten_glPointParameterfv": _emscripten_glPointParameterfv, "_emscripten_glPointParameteri": _emscripten_glPointParameteri, "_emscripten_glPointParameteriv": _emscripten_glPointParameteriv, "_emscripten_glPointSize": _emscripten_glPointSize, "_emscripten_glPolygonMode": _emscripten_glPolygonMode, "_emscripten_glPolygonOffset": _emscripten_glPolygonOffset, "_emscripten_glPolygonStipple": _emscripten_glPolygonStipple, "_emscripten_glPopAttrib": _emscripten_glPopAttrib, "_emscripten_glPopClientAttrib": _emscripten_glPopClientAttrib, "_emscripten_glPopMatrix": _emscripten_glPopMatrix, "_emscripten_glPopName": _emscripten_glPopName, "_emscripten_glPrimitiveRestartIndex": _emscripten_glPrimitiveRestartIndex, "_emscripten_glPrioritizeTextures": _emscripten_glPrioritizeTextures, "_emscripten_glProgramEnvParameter4dARB": _emscripten_glProgramEnvParameter4dARB, "_emscripten_glProgramEnvParameter4dvARB": _emscripten_glProgramEnvParameter4dvARB, "_emscripten_glProgramEnvParameter4fARB": _emscripten_glProgramEnvParameter4fARB, "_emscripten_glProgramEnvParameter4fvARB": _emscripten_glProgramEnvParameter4fvARB, "_emscripten_glProgramLocalParameter4dARB": _emscripten_glProgramLocalParameter4dARB, "_emscripten_glProgramLocalParameter4dvARB": _emscripten_glProgramLocalParameter4dvARB, "_emscripten_glProgramLocalParameter4fARB": _emscripten_glProgramLocalParameter4fARB, "_emscripten_glProgramLocalParameter4fvARB": _emscripten_glProgramLocalParameter4fvARB, "_emscripten_glProgramStringARB": _emscripten_glProgramStringARB, "_emscripten_glPushAttrib": _emscripten_glPushAttrib, "_emscripten_glPushClientAttrib": _emscripten_glPushClientAttrib, "_emscripten_glPushMatrix": _emscripten_glPushMatrix, "_emscripten_glPushName": _emscripten_glPushName, "_emscripten_glRasterPos2d": _emscripten_glRasterPos2d, "_emscripten_glRasterPos2dv": _emscripten_glRasterPos2dv, "_emscripten_glRasterPos2f": _emscripten_glRasterPos2f, "_emscripten_glRasterPos2fv": _emscripten_glRasterPos2fv, "_emscripten_glRasterPos2i": _emscripten_glRasterPos2i, "_emscripten_glRasterPos2iv": _emscripten_glRasterPos2iv, "_emscripten_glRasterPos2s": _emscripten_glRasterPos2s, "_emscripten_glRasterPos2sv": _emscripten_glRasterPos2sv, "_emscripten_glRasterPos3d": _emscripten_glRasterPos3d, "_emscripten_glRasterPos3dv": _emscripten_glRasterPos3dv, "_emscripten_glRasterPos3f": _emscripten_glRasterPos3f, "_emscripten_glRasterPos3fv": _emscripten_glRasterPos3fv, "_emscripten_glRasterPos3i": _emscripten_glRasterPos3i, "_emscripten_glRasterPos3iv": _emscripten_glRasterPos3iv, "_emscripten_glRasterPos3s": _emscripten_glRasterPos3s, "_emscripten_glRasterPos3sv": _emscripten_glRasterPos3sv, "_emscripten_glRasterPos4d": _emscripten_glRasterPos4d, "_emscripten_glRasterPos4dv": _emscripten_glRasterPos4dv, "_emscripten_glRasterPos4f": _emscripten_glRasterPos4f, "_emscripten_glRasterPos4fv": _emscripten_glRasterPos4fv, "_emscripten_glRasterPos4i": _emscripten_glRasterPos4i, "_emscripten_glRasterPos4iv": _emscripten_glRasterPos4iv, "_emscripten_glRasterPos4s": _emscripten_glRasterPos4s, "_emscripten_glRasterPos4sv": _emscripten_glRasterPos4sv, "_emscripten_glReadBuffer": _emscripten_glReadBuffer, "_emscripten_glReadPixels": _emscripten_glReadPixels, "_emscripten_glRectd": _emscripten_glRectd, "_emscripten_glRectdv": _emscripten_glRectdv, "_emscripten_glRectf": _emscripten_glRectf, "_emscripten_glRectfv": _emscripten_glRectfv, "_emscripten_glRecti": _emscripten_glRecti, "_emscripten_glRectiv": _emscripten_glRectiv, "_emscripten_glRects": _emscripten_glRects, "_emscripten_glRectsv": _emscripten_glRectsv, "_emscripten_glReleaseShaderCompiler": _emscripten_glReleaseShaderCompiler, "_emscripten_glRenderMode": _emscripten_glRenderMode, "_emscripten_glRenderbufferStorage": _emscripten_glRenderbufferStorage, "_emscripten_glRenderbufferStorageMultisample": _emscripten_glRenderbufferStorageMultisample, "_emscripten_glResetHistogram": _emscripten_glResetHistogram, "_emscripten_glResetMinmax": _emscripten_glResetMinmax, "_emscripten_glRotated": _emscripten_glRotated, "_emscripten_glRotatef": _emscripten_glRotatef, "_emscripten_glSampleCoverage": _emscripten_glSampleCoverage, "_emscripten_glScaled": _emscripten_glScaled, "_emscripten_glScalef": _emscripten_glScalef, "_emscripten_glScissor": _emscripten_glScissor, "_emscripten_glSecondaryColor3b": _emscripten_glSecondaryColor3b, "_emscripten_glSecondaryColor3bv": _emscripten_glSecondaryColor3bv, "_emscripten_glSecondaryColor3d": _emscripten_glSecondaryColor3d, "_emscripten_glSecondaryColor3dv": _emscripten_glSecondaryColor3dv, "_emscripten_glSecondaryColor3f": _emscripten_glSecondaryColor3f, "_emscripten_glSecondaryColor3fv": _emscripten_glSecondaryColor3fv, "_emscripten_glSecondaryColor3i": _emscripten_glSecondaryColor3i, "_emscripten_glSecondaryColor3iv": _emscripten_glSecondaryColor3iv, "_emscripten_glSecondaryColor3s": _emscripten_glSecondaryColor3s, "_emscripten_glSecondaryColor3sv": _emscripten_glSecondaryColor3sv, "_emscripten_glSecondaryColor3ub": _emscripten_glSecondaryColor3ub, "_emscripten_glSecondaryColor3ubv": _emscripten_glSecondaryColor3ubv, "_emscripten_glSecondaryColor3ui": _emscripten_glSecondaryColor3ui, "_emscripten_glSecondaryColor3uiv": _emscripten_glSecondaryColor3uiv, "_emscripten_glSecondaryColor3us": _emscripten_glSecondaryColor3us, "_emscripten_glSecondaryColor3usv": _emscripten_glSecondaryColor3usv, "_emscripten_glSecondaryColorPointer": _emscripten_glSecondaryColorPointer, "_emscripten_glSelectBuffer": _emscripten_glSelectBuffer, "_emscripten_glSeparableFilter2D": _emscripten_glSeparableFilter2D, "_emscripten_glShadeModel": _emscripten_glShadeModel, "_emscripten_glShaderBinary": _emscripten_glShaderBinary, "_emscripten_glShaderSource": _emscripten_glShaderSource, "_emscripten_glStencilFunc": _emscripten_glStencilFunc, "_emscripten_glStencilFuncSeparate": _emscripten_glStencilFuncSeparate, "_emscripten_glStencilMask": _emscripten_glStencilMask, "_emscripten_glStencilMaskSeparate": _emscripten_glStencilMaskSeparate, "_emscripten_glStencilOp": _emscripten_glStencilOp, "_emscripten_glStencilOpSeparate": _emscripten_glStencilOpSeparate, "_emscripten_glTexBuffer": _emscripten_glTexBuffer, "_emscripten_glTexCoord1d": _emscripten_glTexCoord1d, "_emscripten_glTexCoord1dv": _emscripten_glTexCoord1dv, "_emscripten_glTexCoord1f": _emscripten_glTexCoord1f, "_emscripten_glTexCoord1fv": _emscripten_glTexCoord1fv, "_emscripten_glTexCoord1i": _emscripten_glTexCoord1i, "_emscripten_glTexCoord1iv": _emscripten_glTexCoord1iv, "_emscripten_glTexCoord1s": _emscripten_glTexCoord1s, "_emscripten_glTexCoord1sv": _emscripten_glTexCoord1sv, "_emscripten_glTexCoord2d": _emscripten_glTexCoord2d, "_emscripten_glTexCoord2dv": _emscripten_glTexCoord2dv, "_emscripten_glTexCoord2f": _emscripten_glTexCoord2f, "_emscripten_glTexCoord2fv": _emscripten_glTexCoord2fv, "_emscripten_glTexCoord2i": _emscripten_glTexCoord2i, "_emscripten_glTexCoord2iv": _emscripten_glTexCoord2iv, "_emscripten_glTexCoord2s": _emscripten_glTexCoord2s, "_emscripten_glTexCoord2sv": _emscripten_glTexCoord2sv, "_emscripten_glTexCoord3d": _emscripten_glTexCoord3d, "_emscripten_glTexCoord3dv": _emscripten_glTexCoord3dv, "_emscripten_glTexCoord3f": _emscripten_glTexCoord3f, "_emscripten_glTexCoord3fv": _emscripten_glTexCoord3fv, "_emscripten_glTexCoord3i": _emscripten_glTexCoord3i, "_emscripten_glTexCoord3iv": _emscripten_glTexCoord3iv, "_emscripten_glTexCoord3s": _emscripten_glTexCoord3s, "_emscripten_glTexCoord3sv": _emscripten_glTexCoord3sv, "_emscripten_glTexCoord4d": _emscripten_glTexCoord4d, "_emscripten_glTexCoord4dv": _emscripten_glTexCoord4dv, "_emscripten_glTexCoord4f": _emscripten_glTexCoord4f, "_emscripten_glTexCoord4fv": _emscripten_glTexCoord4fv, "_emscripten_glTexCoord4i": _emscripten_glTexCoord4i, "_emscripten_glTexCoord4iv": _emscripten_glTexCoord4iv, "_emscripten_glTexCoord4s": _emscripten_glTexCoord4s, "_emscripten_glTexCoord4sv": _emscripten_glTexCoord4sv, "_emscripten_glTexCoordPointer": _emscripten_glTexCoordPointer, "_emscripten_glTexEnvf": _emscripten_glTexEnvf, "_emscripten_glTexEnvfv": _emscripten_glTexEnvfv, "_emscripten_glTexEnvi": _emscripten_glTexEnvi, "_emscripten_glTexEnviv": _emscripten_glTexEnviv, "_emscripten_glTexGend": _emscripten_glTexGend, "_emscripten_glTexGendv": _emscripten_glTexGendv, "_emscripten_glTexGenf": _emscripten_glTexGenf, "_emscripten_glTexGenfv": _emscripten_glTexGenfv, "_emscripten_glTexGeni": _emscripten_glTexGeni, "_emscripten_glTexGeniv": _emscripten_glTexGeniv, "_emscripten_glTexImage1D": _emscripten_glTexImage1D, "_emscripten_glTexImage2D": _emscripten_glTexImage2D, "_emscripten_glTexImage3D": _emscripten_glTexImage3D, "_emscripten_glTexParameterIiv": _emscripten_glTexParameterIiv, "_emscripten_glTexParameterIuiv": _emscripten_glTexParameterIuiv, "_emscripten_glTexParameterf": _emscripten_glTexParameterf, "_emscripten_glTexParameterfv": _emscripten_glTexParameterfv, "_emscripten_glTexParameteri": _emscripten_glTexParameteri, "_emscripten_glTexParameteriv": _emscripten_glTexParameteriv, "_emscripten_glTexStorage2D": _emscripten_glTexStorage2D, "_emscripten_glTexStorage3D": _emscripten_glTexStorage3D, "_emscripten_glTexSubImage1D": _emscripten_glTexSubImage1D, "_emscripten_glTexSubImage2D": _emscripten_glTexSubImage2D, "_emscripten_glTexSubImage3D": _emscripten_glTexSubImage3D, "_emscripten_glTransformFeedbackVaryings": _emscripten_glTransformFeedbackVaryings, "_emscripten_glTranslated": _emscripten_glTranslated, "_emscripten_glTranslatef": _emscripten_glTranslatef, "_emscripten_glUniform1f": _emscripten_glUniform1f, "_emscripten_glUniform1fv": _emscripten_glUniform1fv, "_emscripten_glUniform1i": _emscripten_glUniform1i, "_emscripten_glUniform1iv": _emscripten_glUniform1iv, "_emscripten_glUniform1ui": _emscripten_glUniform1ui, "_emscripten_glUniform1uiv": _emscripten_glUniform1uiv, "_emscripten_glUniform2f": _emscripten_glUniform2f, "_emscripten_glUniform2fv": _emscripten_glUniform2fv, "_emscripten_glUniform2i": _emscripten_glUniform2i, "_emscripten_glUniform2iv": _emscripten_glUniform2iv, "_emscripten_glUniform2ui": _emscripten_glUniform2ui, "_emscripten_glUniform2uiv": _emscripten_glUniform2uiv, "_emscripten_glUniform3f": _emscripten_glUniform3f, "_emscripten_glUniform3fv": _emscripten_glUniform3fv, "_emscripten_glUniform3i": _emscripten_glUniform3i, "_emscripten_glUniform3iv": _emscripten_glUniform3iv, "_emscripten_glUniform3ui": _emscripten_glUniform3ui, "_emscripten_glUniform3uiv": _emscripten_glUniform3uiv, "_emscripten_glUniform4f": _emscripten_glUniform4f, "_emscripten_glUniform4fv": _emscripten_glUniform4fv, "_emscripten_glUniform4i": _emscripten_glUniform4i, "_emscripten_glUniform4iv": _emscripten_glUniform4iv, "_emscripten_glUniform4ui": _emscripten_glUniform4ui, "_emscripten_glUniform4uiv": _emscripten_glUniform4uiv, "_emscripten_glUniformBlockBinding": _emscripten_glUniformBlockBinding, "_emscripten_glUniformMatrix2fv": _emscripten_glUniformMatrix2fv, "_emscripten_glUniformMatrix2x3fv": _emscripten_glUniformMatrix2x3fv, "_emscripten_glUniformMatrix2x4fv": _emscripten_glUniformMatrix2x4fv, "_emscripten_glUniformMatrix3fv": _emscripten_glUniformMatrix3fv, "_emscripten_glUniformMatrix3x2fv": _emscripten_glUniformMatrix3x2fv, "_emscripten_glUniformMatrix3x4fv": _emscripten_glUniformMatrix3x4fv, "_emscripten_glUniformMatrix4fv": _emscripten_glUniformMatrix4fv, "_emscripten_glUniformMatrix4x2fv": _emscripten_glUniformMatrix4x2fv, "_emscripten_glUniformMatrix4x3fv": _emscripten_glUniformMatrix4x3fv, "_emscripten_glUnmapBuffer": _emscripten_glUnmapBuffer, "_emscripten_glUseProgram": _emscripten_glUseProgram, "_emscripten_glUseProgramObjectARB": _emscripten_glUseProgramObjectARB, "_emscripten_glValidateProgram": _emscripten_glValidateProgram, "_emscripten_glVertex2d": _emscripten_glVertex2d, "_emscripten_glVertex2dv": _emscripten_glVertex2dv, "_emscripten_glVertex2f": _emscripten_glVertex2f, "_emscripten_glVertex2fv": _emscripten_glVertex2fv, "_emscripten_glVertex2i": _emscripten_glVertex2i, "_emscripten_glVertex2iv": _emscripten_glVertex2iv, "_emscripten_glVertex2s": _emscripten_glVertex2s, "_emscripten_glVertex2sv": _emscripten_glVertex2sv, "_emscripten_glVertex3d": _emscripten_glVertex3d, "_emscripten_glVertex3dv": _emscripten_glVertex3dv, "_emscripten_glVertex3f": _emscripten_glVertex3f, "_emscripten_glVertex3fv": _emscripten_glVertex3fv, "_emscripten_glVertex3i": _emscripten_glVertex3i, "_emscripten_glVertex3iv": _emscripten_glVertex3iv, "_emscripten_glVertex3s": _emscripten_glVertex3s, "_emscripten_glVertex3sv": _emscripten_glVertex3sv, "_emscripten_glVertex4d": _emscripten_glVertex4d, "_emscripten_glVertex4dv": _emscripten_glVertex4dv, "_emscripten_glVertex4f": _emscripten_glVertex4f, "_emscripten_glVertex4fv": _emscripten_glVertex4fv, "_emscripten_glVertex4i": _emscripten_glVertex4i, "_emscripten_glVertex4iv": _emscripten_glVertex4iv, "_emscripten_glVertex4s": _emscripten_glVertex4s, "_emscripten_glVertex4sv": _emscripten_glVertex4sv, "_emscripten_glVertexAttrib1d": _emscripten_glVertexAttrib1d, "_emscripten_glVertexAttrib1dv": _emscripten_glVertexAttrib1dv, "_emscripten_glVertexAttrib1f": _emscripten_glVertexAttrib1f, "_emscripten_glVertexAttrib1fv": _emscripten_glVertexAttrib1fv, "_emscripten_glVertexAttrib1s": _emscripten_glVertexAttrib1s, "_emscripten_glVertexAttrib1sv": _emscripten_glVertexAttrib1sv, "_emscripten_glVertexAttrib2d": _emscripten_glVertexAttrib2d, "_emscripten_glVertexAttrib2dv": _emscripten_glVertexAttrib2dv, "_emscripten_glVertexAttrib2f": _emscripten_glVertexAttrib2f, "_emscripten_glVertexAttrib2fv": _emscripten_glVertexAttrib2fv, "_emscripten_glVertexAttrib2s": _emscripten_glVertexAttrib2s, "_emscripten_glVertexAttrib2sv": _emscripten_glVertexAttrib2sv, "_emscripten_glVertexAttrib3d": _emscripten_glVertexAttrib3d, "_emscripten_glVertexAttrib3dv": _emscripten_glVertexAttrib3dv, "_emscripten_glVertexAttrib3f": _emscripten_glVertexAttrib3f, "_emscripten_glVertexAttrib3fv": _emscripten_glVertexAttrib3fv, "_emscripten_glVertexAttrib3s": _emscripten_glVertexAttrib3s, "_emscripten_glVertexAttrib3sv": _emscripten_glVertexAttrib3sv, "_emscripten_glVertexAttrib4Nbv": _emscripten_glVertexAttrib4Nbv, "_emscripten_glVertexAttrib4Niv": _emscripten_glVertexAttrib4Niv, "_emscripten_glVertexAttrib4Nsv": _emscripten_glVertexAttrib4Nsv, "_emscripten_glVertexAttrib4Nub": _emscripten_glVertexAttrib4Nub, "_emscripten_glVertexAttrib4Nubv": _emscripten_glVertexAttrib4Nubv, "_emscripten_glVertexAttrib4Nuiv": _emscripten_glVertexAttrib4Nuiv, "_emscripten_glVertexAttrib4Nusv": _emscripten_glVertexAttrib4Nusv, "_emscripten_glVertexAttrib4bv": _emscripten_glVertexAttrib4bv, "_emscripten_glVertexAttrib4d": _emscripten_glVertexAttrib4d, "_emscripten_glVertexAttrib4dv": _emscripten_glVertexAttrib4dv, "_emscripten_glVertexAttrib4f": _emscripten_glVertexAttrib4f, "_emscripten_glVertexAttrib4fv": _emscripten_glVertexAttrib4fv, "_emscripten_glVertexAttrib4iv": _emscripten_glVertexAttrib4iv, "_emscripten_glVertexAttrib4s": _emscripten_glVertexAttrib4s, "_emscripten_glVertexAttrib4sv": _emscripten_glVertexAttrib4sv, "_emscripten_glVertexAttrib4ubv": _emscripten_glVertexAttrib4ubv, "_emscripten_glVertexAttrib4uiv": _emscripten_glVertexAttrib4uiv, "_emscripten_glVertexAttrib4usv": _emscripten_glVertexAttrib4usv, "_emscripten_glVertexAttribDivisor": _emscripten_glVertexAttribDivisor, "_emscripten_glVertexAttribI1i": _emscripten_glVertexAttribI1i, "_emscripten_glVertexAttribI1iv": _emscripten_glVertexAttribI1iv, "_emscripten_glVertexAttribI1ui": _emscripten_glVertexAttribI1ui, "_emscripten_glVertexAttribI1uiv": _emscripten_glVertexAttribI1uiv, "_emscripten_glVertexAttribI2i": _emscripten_glVertexAttribI2i, "_emscripten_glVertexAttribI2iv": _emscripten_glVertexAttribI2iv, "_emscripten_glVertexAttribI2ui": _emscripten_glVertexAttribI2ui, "_emscripten_glVertexAttribI2uiv": _emscripten_glVertexAttribI2uiv, "_emscripten_glVertexAttribI3i": _emscripten_glVertexAttribI3i, "_emscripten_glVertexAttribI3iv": _emscripten_glVertexAttribI3iv, "_emscripten_glVertexAttribI3ui": _emscripten_glVertexAttribI3ui, "_emscripten_glVertexAttribI3uiv": _emscripten_glVertexAttribI3uiv, "_emscripten_glVertexAttribI4bv": _emscripten_glVertexAttribI4bv, "_emscripten_glVertexAttribI4i": _emscripten_glVertexAttribI4i, "_emscripten_glVertexAttribI4iv": _emscripten_glVertexAttribI4iv, "_emscripten_glVertexAttribI4sv": _emscripten_glVertexAttribI4sv, "_emscripten_glVertexAttribI4ubv": _emscripten_glVertexAttribI4ubv, "_emscripten_glVertexAttribI4ui": _emscripten_glVertexAttribI4ui, "_emscripten_glVertexAttribI4uiv": _emscripten_glVertexAttribI4uiv, "_emscripten_glVertexAttribI4usv": _emscripten_glVertexAttribI4usv, "_emscripten_glVertexAttribIPointer": _emscripten_glVertexAttribIPointer, "_emscripten_glVertexAttribPointer": _emscripten_glVertexAttribPointer, "_emscripten_glVertexPointer": _emscripten_glVertexPointer, "_emscripten_glViewport": _emscripten_glViewport, "_emscripten_glWindowPos2d": _emscripten_glWindowPos2d, "_emscripten_glWindowPos2dv": _emscripten_glWindowPos2dv, "_emscripten_glWindowPos2f": _emscripten_glWindowPos2f, "_emscripten_glWindowPos2fv": _emscripten_glWindowPos2fv, "_emscripten_glWindowPos2i": _emscripten_glWindowPos2i, "_emscripten_glWindowPos2iv": _emscripten_glWindowPos2iv, "_emscripten_glWindowPos2s": _emscripten_glWindowPos2s, "_emscripten_glWindowPos2sv": _emscripten_glWindowPos2sv, "_emscripten_glWindowPos3d": _emscripten_glWindowPos3d, "_emscripten_glWindowPos3dv": _emscripten_glWindowPos3dv, "_emscripten_glWindowPos3f": _emscripten_glWindowPos3f, "_emscripten_glWindowPos3fv": _emscripten_glWindowPos3fv, "_emscripten_glWindowPos3i": _emscripten_glWindowPos3i, "_emscripten_glWindowPos3iv": _emscripten_glWindowPos3iv, "_emscripten_glWindowPos3s": _emscripten_glWindowPos3s, "_emscripten_glWindowPos3sv": _emscripten_glWindowPos3sv, "_emscripten_memcpy_big": _emscripten_memcpy_big, "_emscripten_request_fullscreen_strategy": _emscripten_request_fullscreen_strategy, "_emscripten_request_pointerlock": _emscripten_request_pointerlock, "_emscripten_set_blur_callback_on_thread": _emscripten_set_blur_callback_on_thread, "_emscripten_set_canvas_element_size": _emscripten_set_canvas_element_size, "_emscripten_set_canvas_size": _emscripten_set_canvas_size, "_emscripten_set_click_callback_on_thread": _emscripten_set_click_callback_on_thread, "_emscripten_set_element_css_size": _emscripten_set_element_css_size, "_emscripten_set_focus_callback_on_thread": _emscripten_set_focus_callback_on_thread, "_emscripten_set_fullscreenchange_callback_on_thread": _emscripten_set_fullscreenchange_callback_on_thread, "_emscripten_set_gamepadconnected_callback_on_thread": _emscripten_set_gamepadconnected_callback_on_thread, "_emscripten_set_gamepaddisconnected_callback_on_thread": _emscripten_set_gamepaddisconnected_callback_on_thread, "_emscripten_set_keydown_callback_on_thread": _emscripten_set_keydown_callback_on_thread, "_emscripten_set_keypress_callback_on_thread": _emscripten_set_keypress_callback_on_thread, "_emscripten_set_keyup_callback_on_thread": _emscripten_set_keyup_callback_on_thread, "_emscripten_set_main_loop": _emscripten_set_main_loop, "_emscripten_set_main_loop_timing": _emscripten_set_main_loop_timing, "_emscripten_set_mousedown_callback_on_thread": _emscripten_set_mousedown_callback_on_thread, "_emscripten_set_mouseenter_callback_on_thread": _emscripten_set_mouseenter_callback_on_thread, "_emscripten_set_mouseleave_callback_on_thread": _emscripten_set_mouseleave_callback_on_thread, "_emscripten_set_mousemove_callback_on_thread": _emscripten_set_mousemove_callback_on_thread, "_emscripten_set_mouseup_callback_on_thread": _emscripten_set_mouseup_callback_on_thread, "_emscripten_set_pointerlockchange_callback_on_thread": _emscripten_set_pointerlockchange_callback_on_thread, "_emscripten_set_resize_callback_on_thread": _emscripten_set_resize_callback_on_thread, "_emscripten_set_touchcancel_callback_on_thread": _emscripten_set_touchcancel_callback_on_thread, "_emscripten_set_touchend_callback_on_thread": _emscripten_set_touchend_callback_on_thread, "_emscripten_set_touchmove_callback_on_thread": _emscripten_set_touchmove_callback_on_thread, "_emscripten_set_touchstart_callback_on_thread": _emscripten_set_touchstart_callback_on_thread, "_emscripten_set_visibilitychange_callback_on_thread": _emscripten_set_visibilitychange_callback_on_thread, "_emscripten_set_wheel_callback_on_thread": _emscripten_set_wheel_callback_on_thread, "_exit": _exit, "_getenv": _getenv, "_gettimeofday": _gettimeofday, "_glActiveTexture": _glActiveTexture, "_glAttachShader": _glAttachShader, "_glBindAttribLocation": _glBindAttribLocation, "_glBindBuffer": _glBindBuffer, "_glBindTexture": _glBindTexture, "_glBlendFunc": _glBlendFunc, "_glBufferData": _glBufferData, "_glBufferSubData": _glBufferSubData, "_glClear": _glClear, "_glClearColor": _glClearColor, "_glClearDepthf": _glClearDepthf, "_glCompileShader": _glCompileShader, "_glCompressedTexImage2D": _glCompressedTexImage2D, "_glCreateProgram": _glCreateProgram, "_glCreateShader": _glCreateShader, "_glCullFace": _glCullFace, "_glDeleteBuffers": _glDeleteBuffers, "_glDeleteProgram": _glDeleteProgram, "_glDeleteShader": _glDeleteShader, "_glDeleteTextures": _glDeleteTextures, "_glDepthFunc": _glDepthFunc, "_glDetachShader": _glDetachShader, "_glDisable": _glDisable, "_glDisableVertexAttribArray": _glDisableVertexAttribArray, "_glDrawArrays": _glDrawArrays, "_glDrawElements": _glDrawElements, "_glEnable": _glEnable, "_glEnableVertexAttribArray": _glEnableVertexAttribArray, "_glFrontFace": _glFrontFace, "_glGenBuffers": _glGenBuffers, "_glGenTextures": _glGenTextures, "_glGetAttribLocation": _glGetAttribLocation, "_glGetFloatv": _glGetFloatv, "_glGetProgramInfoLog": _glGetProgramInfoLog, "_glGetProgramiv": _glGetProgramiv, "_glGetShaderInfoLog": _glGetShaderInfoLog, "_glGetShaderiv": _glGetShaderiv, "_glGetString": _glGetString, "_glGetUniformLocation": _glGetUniformLocation, "_glLinkProgram": _glLinkProgram, "_glPixelStorei": _glPixelStorei, "_glShaderSource": _glShaderSource, "_glTexImage2D": _glTexImage2D, "_glTexParameterf": _glTexParameterf, "_glTexParameteri": _glTexParameteri, "_glUniform1i": _glUniform1i, "_glUniform4f": _glUniform4f, "_glUniformMatrix4fv": _glUniformMatrix4fv, "_glUseProgram": _glUseProgram, "_glVertexAttribPointer": _glVertexAttribPointer, "_glViewport": _glViewport, "_glfwCreateWindow": _glfwCreateWindow, "_glfwDefaultWindowHints": _glfwDefaultWindowHints, "_glfwDestroyWindow": _glfwDestroyWindow, "_glfwGetCursorPos": _glfwGetCursorPos, "_glfwGetKey": _glfwGetKey, "_glfwGetPrimaryMonitor": _glfwGetPrimaryMonitor, "_glfwGetTime": _glfwGetTime, "_glfwGetVideoModes": _glfwGetVideoModes, "_glfwInit": _glfwInit, "_glfwMakeContextCurrent": _glfwMakeContextCurrent, "_glfwSetCharCallback": _glfwSetCharCallback, "_glfwSetCursorEnterCallback": _glfwSetCursorEnterCallback, "_glfwSetCursorPosCallback": _glfwSetCursorPosCallback, "_glfwSetDropCallback": _glfwSetDropCallback, "_glfwSetErrorCallback": _glfwSetErrorCallback, "_glfwSetKeyCallback": _glfwSetKeyCallback, "_glfwSetMouseButtonCallback": _glfwSetMouseButtonCallback, "_glfwSetScrollCallback": _glfwSetScrollCallback, "_glfwSetWindowIconifyCallback": _glfwSetWindowIconifyCallback, "_glfwSetWindowShouldClose": _glfwSetWindowShouldClose, "_glfwSetWindowSizeCallback": _glfwSetWindowSizeCallback, "_glfwSwapBuffers": _glfwSwapBuffers, "_glfwSwapInterval": _glfwSwapInterval, "_glfwTerminate": _glfwTerminate, "_glfwWindowHint": _glfwWindowHint, "_glutCreateWindow": _glutCreateWindow, "_glutDestroyWindow": _glutDestroyWindow, "_glutInitDisplayMode": _glutInitDisplayMode, "_llvm_exp2_f32": _llvm_exp2_f32, "_llvm_stackrestore": _llvm_stackrestore, "_llvm_stacksave": _llvm_stacksave, "_nanosleep": _nanosleep, "_pthread_attr_destroy": _pthread_attr_destroy, "_pthread_attr_init": _pthread_attr_init, "_pthread_cond_destroy": _pthread_cond_destroy, "_pthread_cond_init": _pthread_cond_init, "_pthread_cond_signal": _pthread_cond_signal, "_pthread_cond_wait": _pthread_cond_wait, "_pthread_create": _pthread_create, "_pthread_join": _pthread_join, "_pthread_mutex_destroy": _pthread_mutex_destroy, "_pthread_mutex_init": _pthread_mutex_init, "_sigaction": _sigaction, "_signal": _signal, "_time": _time, "_usleep": _usleep, "emscriptenWebGLComputeImageSize": emscriptenWebGLComputeImageSize, "emscriptenWebGLGet": emscriptenWebGLGet, "emscriptenWebGLGetTexPixelData": emscriptenWebGLGetTexPixelData, "emscriptenWebGLGetUniform": emscriptenWebGLGetUniform, "emscriptenWebGLGetVertexAttrib": emscriptenWebGLGetVertexAttrib, "DYNAMICTOP_PTR": DYNAMICTOP_PTR, "tempDoublePtr": tempDoublePtr, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX };
// EMSCRIPTEN_START_ASM
var asm =Module["asm"]// EMSCRIPTEN_END_ASM
(Module.asmGlobalArg, Module.asmLibraryArg, buffer);
Module["asm"] = asm;
+var ___emscripten_environ_constructor = Module["___emscripten_environ_constructor"] = function() { return Module["asm"]["___emscripten_environ_constructor"].apply(null, arguments) };
var ___errno_location = Module["___errno_location"] = function() { return Module["asm"]["___errno_location"].apply(null, arguments) };
+var __get_environ = Module["__get_environ"] = function() { return Module["asm"]["__get_environ"].apply(null, arguments) };
var _emscripten_GetProcAddress = Module["_emscripten_GetProcAddress"] = function() { return Module["asm"]["_emscripten_GetProcAddress"].apply(null, arguments) };
var _emscripten_replace_memory = Module["_emscripten_replace_memory"] = function() { return Module["asm"]["_emscripten_replace_memory"].apply(null, arguments) };
var _free = Module["_free"] = function() { return Module["asm"]["_free"].apply(null, arguments) };
+var _llvm_bswap_i16 = Module["_llvm_bswap_i16"] = function() { return Module["asm"]["_llvm_bswap_i16"].apply(null, arguments) };
var _llvm_bswap_i32 = Module["_llvm_bswap_i32"] = function() { return Module["asm"]["_llvm_bswap_i32"].apply(null, arguments) };
var _llvm_round_f32 = Module["_llvm_round_f32"] = function() { return Module["asm"]["_llvm_round_f32"].apply(null, arguments) };
var _main = Module["_main"] = function() { return Module["asm"]["_main"].apply(null, arguments) };
@@ -13635,9 +13538,7 @@ var _pthread_mutex_unlock = Module["_pthread_mutex_unlock"] = function() { retu
var _sbrk = Module["_sbrk"] = function() { return Module["asm"]["_sbrk"].apply(null, arguments) };
var _strstr = Module["_strstr"] = function() { return Module["asm"]["_strstr"].apply(null, arguments) };
var establishStackSpace = Module["establishStackSpace"] = function() { return Module["asm"]["establishStackSpace"].apply(null, arguments) };
-var getTempRet0 = Module["getTempRet0"] = function() { return Module["asm"]["getTempRet0"].apply(null, arguments) };
var runPostSets = Module["runPostSets"] = function() { return Module["asm"]["runPostSets"].apply(null, arguments) };
-var setTempRet0 = Module["setTempRet0"] = function() { return Module["asm"]["setTempRet0"].apply(null, arguments) };
var setThrew = Module["setThrew"] = function() { return Module["asm"]["setThrew"].apply(null, arguments) };
var stackAlloc = Module["stackAlloc"] = function() { return Module["asm"]["stackAlloc"].apply(null, arguments) };
var stackRestore = Module["stackRestore"] = function() { return Module["asm"]["stackRestore"].apply(null, arguments) };
@@ -13649,7 +13550,13 @@ var dynCall_ii = Module["dynCall_ii"] = function() { return Module["asm"]["dynC
var dynCall_iii = Module["dynCall_iii"] = function() { return Module["asm"]["dynCall_iii"].apply(null, arguments) };
var dynCall_iiii = Module["dynCall_iiii"] = function() { return Module["asm"]["dynCall_iiii"].apply(null, arguments) };
var dynCall_iiiii = Module["dynCall_iiiii"] = function() { return Module["asm"]["dynCall_iiiii"].apply(null, arguments) };
+var dynCall_iiiiidii = Module["dynCall_iiiiidii"] = function() { return Module["asm"]["dynCall_iiiiidii"].apply(null, arguments) };
var dynCall_iiiiii = Module["dynCall_iiiiii"] = function() { return Module["asm"]["dynCall_iiiiii"].apply(null, arguments) };
+var dynCall_iiiiiiii = Module["dynCall_iiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiii"].apply(null, arguments) };
+var dynCall_iiiiiiiii = Module["dynCall_iiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiii"].apply(null, arguments) };
+var dynCall_iiiiiiiiii = Module["dynCall_iiiiiiiiii"] = function() { return Module["asm"]["dynCall_iiiiiiiiii"].apply(null, arguments) };
+var dynCall_ji = Module["dynCall_ji"] = function() { return Module["asm"]["dynCall_ji"].apply(null, arguments) };
+var dynCall_jiji = Module["dynCall_jiji"] = function() { return Module["asm"]["dynCall_jiji"].apply(null, arguments) };
var dynCall_jijii = Module["dynCall_jijii"] = function() { return Module["asm"]["dynCall_jijii"].apply(null, arguments) };
var dynCall_v = Module["dynCall_v"] = function() { return Module["asm"]["dynCall_v"].apply(null, arguments) };
var dynCall_vd = Module["dynCall_vd"] = function() { return Module["asm"]["dynCall_vd"].apply(null, arguments) };
@@ -13710,7 +13617,7 @@ Module['asm'] = asm;
Module["getMemory"] = getMemory;
-
+Module["Pointer_stringify"] = Pointer_stringify;
diff --git a/games/money.wasm b/games/money.wasm
index 55edf3d..1b208c2 100644
--- a/games/money.wasm
+++ b/games/money.wasm
Binary files differ