forked from fte/fteqw
1
0
Fork 0

tiny bugfix.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4459 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2013-08-15 00:59:13 +00:00
parent e67a7b2d7d
commit 7793b0a73a
1 changed files with 399 additions and 399 deletions

View File

@ -1,399 +1,399 @@
mergeInto(LibraryManager.library, mergeInto(LibraryManager.library,
{ {
//generic handles array //generic handles array
//yeah, I hope you don't use-after-free. hopefully that sort of thing will be detected on systems with easier non-mangled debuggers. //yeah, I hope you don't use-after-free. hopefully that sort of thing will be detected on systems with easier non-mangled debuggers.
$FTEH__deps: [], $FTEH__deps: [],
$FTEH: { $FTEH: {
h: [], h: [],
f: {} f: {}
}, },
$FTEC: $FTEC:
{ {
w: -1, w: -1,
h: -1, h: -1,
donecb:0, donecb:0,
evcb: { evcb: {
resize:0, resize:0,
mouse:0, mouse:0,
key:0, key:0,
}, },
handleevent : function(event) handleevent : function(event)
{ {
switch(event.type) switch(event.type)
{ {
case 'resize': case 'resize':
if (FTEC.evcb.resize != 0) if (FTEC.evcb.resize != 0)
Runtime.dynCall('vii', FTEC.evcb.resize, [Module['canvas'].width, Module['canvas'].height]); Runtime.dynCall('vii', FTEC.evcb.resize, [Module['canvas'].width, Module['canvas'].height]);
break; break;
case 'mousemove': case 'mousemove':
if (FTEC.evcb.mouse != 0) if (FTEC.evcb.mouse != 0)
{ {
if (Browser.pointerLock) if (Browser.pointerLock)
{ {
if (typeof event.movementX === 'undefined') if (typeof event.movementX === 'undefined')
{ {
event.movementX = event.mozMovementX; event.movementX = event.mozMovementX;
event.movementY = event.mozMovementY; event.movementY = event.mozMovementY;
} }
if (typeof event.movementX === 'undefined') if (typeof event.movementX === 'undefined')
{ {
event.movementX = event.webkitMovementX; event.movementX = event.webkitMovementX;
event.movementY = event.webkitMovementY; event.movementY = event.webkitMovementY;
} }
Runtime.dynCall('viiffff', FTEC.evcb.mouse, [0, false, event.movementX, event.movementY, 0, 0]); Runtime.dynCall('viiffff', FTEC.evcb.mouse, [0, false, event.movementX, event.movementY, 0, 0]);
} }
else else
Runtime.dynCall('viiffff', FTEC.evcb.mouse, [0, true, event.pageX, event.pageY, 0, 0]); Runtime.dynCall('viiffff', FTEC.evcb.mouse, [0, true, event.pageX, event.pageY, 0, 0]);
} }
break; break;
case 'mousedown': case 'mousedown':
case 'mouseup': case 'mouseup':
Browser.requestFullScreen(true, true); Browser.requestFullScreen(true, true);
Module['canvas'].requestPointerLock(); Module['canvas'].requestPointerLock();
if (FTEC.evcb.button != 0) if (FTEC.evcb.button != 0)
{ {
Runtime.dynCall('viii', FTEC.evcb.button, [0, event.type=='mousedown', event.button]); Runtime.dynCall('viii', FTEC.evcb.button, [0, event.type=='mousedown', event.button]);
event.preventDefault(); event.preventDefault();
} }
break; break;
case 'mousewheel': case 'mousewheel':
case 'wheel': case 'wheel':
if (FTEC.evcb.button != 0) if (FTEC.evcb.button != 0)
{ {
Runtime.dynCall('viii', FTEC.evcb.button, [0, 3, event.deltaY]); Runtime.dynCall('viii', FTEC.evcb.button, [0, 3, event.deltaY]);
event.preventDefault(); event.preventDefault();
} }
break; break;
case 'mouseout': case 'mouseout':
if (FTEC.evcb.button != 0) if (FTEC.evcb.button != 0)
{ {
for (var i = 0; i < 8; i++) for (var i = 0; i < 8; i++)
Runtime.dynCall('viii', FTEC.evcb.button, [0, false, i]); Runtime.dynCall('viii', FTEC.evcb.button, [0, false, i]);
} }
break; break;
case 'keypress': case 'keypress':
if (FTEC.evcb.key != 0) if (FTEC.evcb.key != 0)
{ {
Runtime.dynCall('viiii', FTEC.evcb.key, [0, 1, 0, event.charCode]); Runtime.dynCall('viiii', FTEC.evcb.key, [0, 1, 0, event.charCode]);
Runtime.dynCall('viiii', FTEC.evcb.key, [0, 0, 0, event.charCode]); Runtime.dynCall('viiii', FTEC.evcb.key, [0, 0, 0, event.charCode]);
event.preventDefault(); event.preventDefault();
} }
break; break;
case 'keydown': case 'keydown':
case 'keyup': case 'keyup':
//122 is 'toggle fullscreen'. //122 is 'toggle fullscreen'.
//we don't steal that because its impossible to leave it again once used. //we don't steal that because its impossible to leave it again once used.
if (FTEC.evcb.key != 0 && event.keyCode != 122) if (FTEC.evcb.key != 0 && event.keyCode != 122)
{ {
Runtime.dynCall('viiii', FTEC.evcb.key, [0, event.type=='keydown', event.keyCode, 0]); Runtime.dynCall('viiii', FTEC.evcb.key, [0, event.type=='keydown', event.keyCode, 0]);
event.preventDefault(); event.preventDefault();
} }
break; break;
case 'keydown': case 'keydown':
default: default:
console.log(event); console.log(event);
} }
} }
}, },
emscriptenfte_setupcanvas__deps: ['$FTEC', '$Browser'], emscriptenfte_setupcanvas__deps: ['$FTEC', '$Browser'],
emscriptenfte_setupcanvas : function(nw,nh,evresz,evm,evb,evk) emscriptenfte_setupcanvas : function(nw,nh,evresz,evm,evb,evk)
{ {
FTEC.evcb.resize = evresz; FTEC.evcb.resize = evresz;
FTEC.evcb.mouse = evm; FTEC.evcb.mouse = evm;
FTEC.evcb.button = evb; FTEC.evcb.button = evb;
FTEC.evcb.key = evk; FTEC.evcb.key = evk;
if (!FTEC.donecb) if (!FTEC.donecb)
{ {
FTEC.donecb = 1; FTEC.donecb = 1;
['mousedown', 'mouseup', 'mousemove', 'wheel', 'mousewheel', 'mouseout', 'keydown', 'keyup'].forEach(function(event) ['mousedown', 'mouseup', 'mousemove', 'wheel', 'mousewheel', 'mouseout', 'keydown', 'keyup'].forEach(function(event)
{ {
Module['canvas'].addEventListener(event, FTEC.handleevent, true); Module['canvas'].addEventListener(event, FTEC.handleevent, true);
}); });
['keydown', 'keyup', 'keypress'].forEach(function(event) ['keydown', 'keyup', 'keypress'].forEach(function(event)
{ {
document.addEventListener(event, FTEC.handleevent, true); document.addEventListener(event, FTEC.handleevent, true);
}); });
Browser.resizeListeners.push(function(w, h) { Browser.resizeListeners.push(function(w, h) {
FTEC.handleevent({ FTEC.handleevent({
type: 'resize', type: 'resize',
}); });
}); });
} }
var ctx = Browser.createContext(Module['canvas'], true, true); var ctx = Browser.createContext(Module['canvas'], true, true);
if (!ctx) if (!ctx)
return 0; return 0;
Browser.setCanvasSize(nw, nh, false); Browser.setCanvasSize(nw, nh, false);
window.onresize = function() window.onresize = function()
{ {
//emscripten's browser library will revert sizes wrongly or something when we're fullscreen, so make sure that doesn't happen. //emscripten's browser library will revert sizes wrongly or something when we're fullscreen, so make sure that doesn't happen.
if (Browser.isFullScreen) if (Browser.isFullScreen)
{ {
Browser.windowedWidth = window.innerWidth; Browser.windowedWidth = window.innerWidth;
Browser.windowedHeight = window.innerHeight; Browser.windowedHeight = window.innerHeight;
} }
else else
Browser.setCanvasSize(window.innerWidth, window.innerHeight, false); Browser.setCanvasSize(window.innerWidth, window.innerHeight, false);
}; };
window.onresize(); window.onresize();
return 1; return 1;
}, },
Sys_Print : function(msg) Sys_Print : function(msg)
{ {
console.log(Pointer_stringify(msg)); console.log(Pointer_stringify(msg));
}, },
emscriptenfte_ticks_ms : function() emscriptenfte_ticks_ms : function()
{ {
return Date.now(); return Date.now();
}, },
emscriptenfte_handle_alloc__deps : ['$FTEH'], emscriptenfte_handle_alloc__deps : ['$FTEH'],
emscriptenfte_handle_alloc : function(h) emscriptenfte_handle_alloc : function(h)
{ {
for (var i = 0; FTEH.h.length; i+=1) for (var i = 0; FTEH.h.length; i+=1)
{ {
if (FTEH.h[i] == null) if (FTEH.h[i] == null)
{ {
FTEH.h[i] = h; FTEH.h[i] = h;
return i; return i;
} }
} }
i = FTEH.h.length; i = FTEH.h.length;
FTEH.h[i] = h; FTEH.h[i] = h;
return i; return i;
}, },
//temp files //temp files
emscriptenfte_buf_create__deps : ['emscriptenfte_handle_alloc'], emscriptenfte_buf_create__deps : ['emscriptenfte_handle_alloc'],
emscriptenfte_buf_create : function() emscriptenfte_buf_create : function()
{ {
var b = {h:-1, r:1, l:0,m:4096,d:new Uint8Array(4096), n:null}; var b = {h:-1, r:1, l:0,m:4096,d:new Uint8Array(4096), n:null};
b.h = _emscriptenfte_handle_alloc(b); b.h = _emscriptenfte_handle_alloc(b);
return b.h; return b.h;
}, },
//temp files //temp files
emscriptenfte_buf_open__deps : ['emscriptenfte_buf_create'], emscriptenfte_buf_open__deps : ['emscriptenfte_buf_create'],
emscriptenfte_buf_open : function(name, createifneeded) emscriptenfte_buf_open : function(name, createifneeded)
{ {
name = Pointer_stringify(name); name = Pointer_stringify(name);
var f = FTEH.f[name]; var f = FTEH.f[name];
var r = -1; var r = -1;
if (f == null) if (f == null)
{ {
if (createifneeded) if (createifneeded)
r = _emscriptenfte_buf_create(); r = _emscriptenfte_buf_create();
if (r != -1) if (r != -1)
{ {
f = FTEH.h[r]; f = FTEH.h[r];
f.r+=1; f.r+=1;
f.n = name; f.n = name;
FTEH.f[name] = f; FTEH.f[name] = f;
if (FTEH.f[name] != f || f.n != name) if (FTEH.f[name] != f || f.n != name)
console.log('error creating file '+name); console.log('error creating file '+name);
} }
} }
else else
{ {
f.r+=1; f.r+=1;
r = f.h; r = f.h;
} }
return r; return r;
}, },
emscriptenfte_buf_rename : function(oldname, newname) emscriptenfte_buf_rename : function(oldname, newname)
{ {
oldname = Pointer_stringify(oldname); oldname = Pointer_stringify(oldname);
newname = Pointer_stringify(newname); newname = Pointer_stringify(newname);
var f = FTEH.f[oldname]; var f = FTEH.f[oldname];
if (f == null) if (f == null)
return 0; return 0;
if (FTEH.f[newname] != null) if (FTEH.f[newname] != null)
return 0; return 0;
FTEH.f[newname] = f; FTEH.f[newname] = f;
delete FTEH.f[oldname]; delete FTEH.f[oldname];
f.n = newname; f.n = newname;
return 1; return 1;
}, },
emscriptenfte_buf_delete : function(name) emscriptenfte_buf_delete : function(name)
{ {
name = Pointer_stringify(name); name = Pointer_stringify(name);
var f = FTEH.f[name]; var f = FTEH.f[name];
if (f) if (f)
{ {
delete FTEH.f[name]; delete FTEH.f[name];
f.n = null; f.n = null;
emscriptenfte_buf_release(f.h); emscriptenfte_buf_release(f.h);
console.log('deleted '+name); console.log('deleted '+name);
return 1; return 1;
} }
return 0; return 0;
}, },
emscriptenfte_buf_release : function(handle) emscriptenfte_buf_release : function(handle)
{ {
var b = FTEH.h[handle]; var b = FTEH.h[handle];
if (b == null) if (b == null)
{ {
Module.printError('emscriptenfte_buf_release with invalid handle'); Module.printError('emscriptenfte_buf_release with invalid handle');
return; return;
} }
b.r -= 1; b.r -= 1;
if (b.r == 0) if (b.r == 0)
{ {
if (b.n != null) if (b.n != null)
delete FTEH.f[b.n]; delete FTEH.f[b.n];
delete FTEH.h[handle]; delete FTEH.h[handle];
b.d = null; b.d = null;
} }
}, },
emscriptenfte_buf_getsize : function(handle) emscriptenfte_buf_getsize : function(handle)
{ {
var b = FTEH.h[handle]; var b = FTEH.h[handle];
return b.l; return b.l;
}, },
emscriptenfte_buf_read : function(handle, offset, data, len) emscriptenfte_buf_read : function(handle, offset, data, len)
{ {
var b = FTEH.h[handle]; var b = FTEH.h[handle];
if (offset+len > b.l) //clamp the read if (offset+len > b.l) //clamp the read
len = b.l - offset; len = b.l - offset;
if (len < 0) if (len < 0)
{ {
len = 0; len = 0;
if (offset+len >= b.l) if (offset+len >= b.l)
return -1; return -1;
} }
HEAPU8.set(b.d.subarray(offset, offset+len), data); HEAPU8.set(b.d.subarray(offset, offset+len), data);
return len; return len;
}, },
emscriptenfte_buf_write : function(handle, offset, data, len) emscriptenfte_buf_write : function(handle, offset, data, len)
{ {
var b = FTEH.h[handle]; var b = FTEH.h[handle];
if (offset+len > b.m) if (offset+len > b.m)
{ //extend it if needed. { //extend it if needed.
b.m = offset + len + 4095; b.m = offset + len + 4095;
b.m = b.m & ~4095; b.m = b.m & ~4095;
var nd = new Uint8Array(b.m); var nd = new Uint8Array(b.m);
nd.set(b.d, 0); nd.set(b.d, 0);
b.d = nd; b.d = nd;
} }
if (len < 0) if (len < 0)
len = 0; len = 0;
console.log('deleted '+name); console.log('deleted '+name);
b.d.set(HEAPU8.subarray(data, data+len), offset); b.d.set(HEAPU8.subarray(data, data+len), offset);
if (offset + len > b.l) if (offset + len > b.l)
b.l = offset + len; b.l = offset + len;
return len; return len;
}, },
emscriptenfte_ws_connect__deps: ['emscriptenfte_handle_alloc'], emscriptenfte_ws_connect__deps: ['emscriptenfte_handle_alloc'],
emscriptenfte_ws_connect : function(url) emscriptenfte_ws_connect : function(url)
{ {
var _url = Pointer_stringify(url); var _url = Pointer_stringify(url);
var s = {ws:null, inq:[], err:0}; var s = {ws:null, inq:[], err:0};
s.ws = new WebSocket(_url, 'binary'); s.ws = new WebSocket(_url, 'binary');
if (!s.ws) if (!s.ws)
return -1; return -1;
s.ws.onerror = function(event) {s.err = 1;}; s.ws.onerror = function(event) {s.err = 1;};
s.ws.onclose = function(event) {s.err = 1;}; s.ws.onclose = function(event) {s.err = 1;};
// s.ws.onopen = function(event) {}; // s.ws.onopen = function(event) {};
s.ws.onmessage = function(event) s.ws.onmessage = function(event)
{ {
assert(typeof event.data !== 'string' && event.data.byteLength); assert(typeof event.data !== 'string' && event.data.byteLength);
s.inq.push(new Uint8Array(event.data)); s.inq.push(new Uint8Array(event.data));
}; };
return _emscriptenfte_handle_alloc(s); return _emscriptenfte_handle_alloc(s);
}, },
emscriptenfte_ws_close : function(sockid) emscriptenfte_ws_close : function(sockid)
{ {
var s = FTEH.h[sockid]; var s = FTEH.h[sockid];
if (!s) if (!s)
return -1; return -1;
s.ws.close(); s.ws.close();
s.ws = null; //make sure to avoid circular references s.ws = null; //make sure to avoid circular references
delete FTEH.h[sockid]; //socked is no longer accessible. delete FTEH.h[sockid]; //socked is no longer accessible.
return 0; return 0;
}, },
//separate call allows for more sane flood control when fragmentation is involved. //separate call allows for more sane flood control when fragmentation is involved.
emscriptenfte_ws_cansend : function(sockid, extra, maxpending) emscriptenfte_ws_cansend : function(sockid, extra, maxpending)
{ {
var s = FTEH.h[sockid]; var s = FTEH.h[sockid];
if (!s) if (!s)
return 1; //go on punk, make my day. return 1; //go on punk, make my day.
return ((s.ws.bufferedAmount+extra) < maxpending); return ((s.ws.bufferedAmount+extra) < maxpending);
}, },
emscriptenfte_ws_send : function(sockid, data, len) emscriptenfte_ws_send : function(sockid, data, len)
{ {
var s = FTEH.h[sockid]; var s = FTEH.h[sockid];
if (!s) if (!s)
return -1; return -1;
s.s.send(HEAPU8.subarray(data, data+len).buffer); s.ws.send(HEAPU8.subarray(data, data+len).buffer);
return len; return len;
}, },
emscriptenfte_ws_recv : function(sockid, data, len) emscriptenfte_ws_recv : function(sockid, data, len)
{ {
var s = FTEH.h[sockid]; var s = FTEH.h[sockid];
if (!s) if (!s)
return -1; return -1;
var inp = s.inq.shift(); var inp = s.inq.shift();
if (inp) if (inp)
{ {
if (inp.length > len) if (inp.length > len)
inp.length = len; inp.length = len;
HEAPU8.set(inp, data); HEAPU8.set(inp, data);
return inp.length; return inp.length;
} }
if (s.err) if (s.err)
return 0; return 0;
return -1; return -1;
}, },
emscriptenfte_async_wget_data2 : function(url, ctx, onload, onerror, onprogress) emscriptenfte_async_wget_data2 : function(url, ctx, onload, onerror, onprogress)
{ {
var _url = Pointer_stringify(url); var _url = Pointer_stringify(url);
console.log("Attempting download of " + _url); console.log("Attempting download of " + _url);
var http = new XMLHttpRequest(); var http = new XMLHttpRequest();
http.open('GET', _url, true); http.open('GET', _url, true);
http.responseType = 'arraybuffer'; http.responseType = 'arraybuffer';
http.onload = function(e) http.onload = function(e)
{ {
console.log("onload: " + _url + " status " + http.status); console.log("onload: " + _url + " status " + http.status);
if (http.status == 200) if (http.status == 200)
{ {
var bar = new Uint8Array(http.response); var bar = new Uint8Array(http.response);
var buf = _malloc(bar.length); var buf = _malloc(bar.length);
HEAPU8.set(bar, buf); HEAPU8.set(bar, buf);
if (onload) if (onload)
Runtime.dynCall('viii', onload, [ctx, buf, bar.length]); Runtime.dynCall('viii', onload, [ctx, buf, bar.length]);
} }
else else
{ {
if (onerror) if (onerror)
Runtime.dynCall('vii', onerror, [ctx, http.status]); Runtime.dynCall('vii', onerror, [ctx, http.status]);
} }
}; };
http.onerror = function(e) http.onerror = function(e)
{ {
console.log("onerror: " + _url + " status " + http.status); console.log("onerror: " + _url + " status " + http.status);
if (onerror) if (onerror)
Runtime.dynCall('vii', onerror, [ctx, http.status]); Runtime.dynCall('vii', onerror, [ctx, http.status]);
}; };
http.onprogress = function(e) http.onprogress = function(e)
{ {
if (onprogress) if (onprogress)
Runtime.dynCall('viii', onprogress, [ctx, e.loaded, e.total]); Runtime.dynCall('viii', onprogress, [ctx, e.loaded, e.total]);
}; };
http.send(null); http.send(null);
} }
}); });