trying to sort out input madness.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4570 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
d4e312b398
commit
2a030268c5
2 changed files with 633 additions and 625 deletions
|
@ -1,411 +1,410 @@
|
||||||
|
|
||||||
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]);
|
if (Runtime.dynCall('iiiii', FTEC.evcb.key, [0, event.type=='keydown', event.keyCode, 0]))
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
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', 'keypress', '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;
|
},
|
||||||
},
|
|
||||||
|
emscriptenfte_abortmainloop : function(msg)
|
||||||
emscriptenfte_abortmainloop : function(msg)
|
{
|
||||||
{
|
msg = Pointer_stringify(msg);
|
||||||
msg = Pointer_stringify(msg);
|
throw 'oh noes! something bad happened in ' + msg + '!';
|
||||||
throw 'oh noes! something bad happened in ' + msg + '!';
|
},
|
||||||
},
|
emscriptenfte_alert : function(msg)
|
||||||
emscriptenfte_alert : function(msg)
|
{
|
||||||
{
|
msg = Pointer_stringify(msg);
|
||||||
msg = Pointer_stringify(msg);
|
console.log(msg);
|
||||||
console.log(msg);
|
alert(msg);
|
||||||
alert(msg);
|
},
|
||||||
},
|
|
||||||
|
//FIXME: split+merge by \n
|
||||||
//FIXME: split+merge by \n
|
emscriptenfte_print : function(msg)
|
||||||
emscriptenfte_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.s.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);
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
|
|
|
@ -1,214 +1,223 @@
|
||||||
#include "quakedef.h"
|
#include "quakedef.h"
|
||||||
#include "glquake.h"
|
#include "glquake.h"
|
||||||
#include "web/ftejslib.h"
|
#include "web/ftejslib.h"
|
||||||
|
|
||||||
extern cvar_t vid_hardwaregamma;
|
extern cvar_t vid_hardwaregamma;
|
||||||
extern cvar_t gl_lateswap;
|
extern cvar_t gl_lateswap;
|
||||||
extern int gammaworks;
|
extern int gammaworks;
|
||||||
|
|
||||||
extern qboolean vid_isfullscreen;
|
extern qboolean vid_isfullscreen;
|
||||||
|
|
||||||
qboolean ActiveApp;
|
qboolean ActiveApp;
|
||||||
qboolean mouseactive;
|
qboolean mouseactive;
|
||||||
extern qboolean mouseusedforgui;
|
extern qboolean mouseusedforgui;
|
||||||
|
|
||||||
|
|
||||||
static void *GLVID_getsdlglfunction(char *functionname)
|
static void *GLVID_getsdlglfunction(char *functionname)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VID_Resized(int width, int height)
|
static void VID_Resized(int width, int height)
|
||||||
{
|
{
|
||||||
extern cvar_t vid_conautoscale, vid_conwidth;
|
extern cvar_t vid_conautoscale, vid_conwidth;
|
||||||
vid.pixelwidth = width;
|
vid.pixelwidth = width;
|
||||||
vid.pixelheight = height;
|
vid.pixelheight = height;
|
||||||
//Con_Printf("Resized: %i %i\n", vid.pixelwidth, vid.pixelheight);
|
//Con_Printf("Resized: %i %i\n", vid.pixelwidth, vid.pixelheight);
|
||||||
|
|
||||||
Cvar_ForceCallback(&vid_conautoscale);
|
Cvar_ForceCallback(&vid_conautoscale);
|
||||||
Cvar_ForceCallback(&vid_conwidth);
|
Cvar_ForceCallback(&vid_conwidth);
|
||||||
}
|
}
|
||||||
static unsigned int domkeytoquake(unsigned int code)
|
static unsigned int domkeytoquake(unsigned int code)
|
||||||
{
|
{
|
||||||
unsigned int tab[256] =
|
unsigned int tab[256] =
|
||||||
{
|
{
|
||||||
/* 0*/ 0,0,0,0,0,0,0,0, K_BACKSPACE,K_TAB,0,0,0,K_ENTER,0,0,
|
/* 0*/ 0,0,0,0,0,0,0,0, K_BACKSPACE,K_TAB,0,0,0,K_ENTER,0,0,
|
||||||
/* 16*/ K_SHIFT,K_CTRL,K_ALT,K_PAUSE,K_CAPSLOCK,0,0,0,0,0,0,K_ESCAPE,0,0,0,0,
|
/* 16*/ K_SHIFT,K_CTRL,K_ALT,K_PAUSE,K_CAPSLOCK,0,0,0,0,0,0,K_ESCAPE,0,0,0,0,
|
||||||
/* 32*/ ' ',K_PGUP,K_PGDN,K_END,K_HOME,K_LEFTARROW,K_UPARROW,K_RIGHTARROW, K_DOWNARROW,0,0,0,K_PRINTSCREEN,K_INS,K_DEL,0,
|
/* 32*/ ' ',K_PGUP,K_PGDN,K_END,K_HOME,K_LEFTARROW,K_UPARROW,K_RIGHTARROW, K_DOWNARROW,0,0,0,K_PRINTSCREEN,K_INS,K_DEL,0,
|
||||||
/* 48*/ '0','1','2','3','4','5','6','7', '8','9',0,0,0,0,0,0,
|
/* 48*/ '0','1','2','3','4','5','6','7', '8','9',0,0,0,0,0,0,
|
||||||
|
|
||||||
/* 64*/ 0,'a','b','c','d','e','f','g', 'h','i','j','k','l','m','n','o',
|
/* 64*/ 0,'a','b','c','d','e','f','g', 'h','i','j','k','l','m','n','o',
|
||||||
/* 80*/ 'p','q','r','s','t','u','v','w', 'x','y','z',K_LWIN,K_RWIN,K_APP,0,0,
|
/* 80*/ 'p','q','r','s','t','u','v','w', 'x','y','z',K_LWIN,K_RWIN,K_APP,0,0,
|
||||||
/* 96*/ K_KP_INS,K_KP_END,K_KP_DOWNARROW,K_KP_PGDN,K_KP_LEFTARROW,K_KP_5,K_KP_RIGHTARROW,K_KP_HOME, K_KP_UPARROW,K_KP_PGDN,K_KP_STAR,K_KP_PLUS,0,K_KP_MINUS,K_KP_DEL,K_KP_SLASH,
|
/* 96*/ K_KP_INS,K_KP_END,K_KP_DOWNARROW,K_KP_PGDN,K_KP_LEFTARROW,K_KP_5,K_KP_RIGHTARROW,K_KP_HOME, K_KP_UPARROW,K_KP_PGDN,K_KP_STAR,K_KP_PLUS,0,K_KP_MINUS,K_KP_DEL,K_KP_SLASH,
|
||||||
/*112*/ K_F1,K_F2,K_F3,K_F4,K_F5,K_F6,K_F7,K_F8,K_F9,K_F10,K_F11,K_F12,0,0,0,0,
|
/*112*/ K_F1,K_F2,K_F3,K_F4,K_F5,K_F6,K_F7,K_F8,K_F9,K_F10,K_F11,K_F12,0,0,0,0,
|
||||||
/*128*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
/*128*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
||||||
/*144*/ K_KP_NUMLOCK,K_SCRLCK,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
/*144*/ K_KP_NUMLOCK,K_SCRLCK,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
||||||
/*160*/ 0,0,0,'#',0,0,0,0, 0,0,0,0,0,0,0,0,
|
/*160*/ 0,0,0,'#',0,0,0,0, 0,0,0,0,0,0,0,0,
|
||||||
/*176*/ 0,0,0,0,0,0,0,0, 0,0,';','=',',','-','.','/',
|
/*176*/ 0,0,0,0,0,0,0,0, 0,0,';','=',',','-','.','/',
|
||||||
/*192*/ '`',0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
/*192*/ '`',0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
||||||
/*208*/ 0,0,0,0,0,0,0,0, 0,0,0,'[','\\',']','\'','`',
|
/*208*/ 0,0,0,0,0,0,0,0, 0,0,0,'[','\\',']','\'','`',
|
||||||
/*224*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
/*224*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
||||||
/*240*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
/*240*/ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
|
||||||
};
|
};
|
||||||
if (!code)
|
if (!code)
|
||||||
return 0;
|
return 0;
|
||||||
if (code >= sizeof(tab)/sizeof(tab[0]))
|
if (code >= sizeof(tab)/sizeof(tab[0]))
|
||||||
{
|
{
|
||||||
Con_DPrintf("You just pressed key %u, but I don't know what its meant to be\n", code);
|
Con_DPrintf("You just pressed key %u, but I don't know what its meant to be\n", code);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!tab[code])
|
if (!tab[code])
|
||||||
Con_DPrintf("You just pressed key %u, but I don't know what its meant to be\n", code);
|
Con_DPrintf("You just pressed key %u, but I don't know what its meant to be\n", code);
|
||||||
|
|
||||||
Con_DPrintf("You just pressed dom key %u, which is quake key %u\n", code, tab[code]);
|
Con_DPrintf("You just pressed dom key %u, which is quake key %u\n", code, tab[code]);
|
||||||
return tab[code];
|
return tab[code];
|
||||||
}
|
}
|
||||||
static void DOM_KeyEvent(int devid, int down, int scan, int uni)
|
static int DOM_KeyEvent(int devid, int down, int scan, int uni)
|
||||||
{
|
{
|
||||||
IN_KeyEvent(0, down, domkeytoquake(scan), uni);
|
IN_KeyEvent(0, down, domkeytoquake(scan), uni);
|
||||||
}
|
//Chars which don't map to some printable ascii value get preventDefaulted.
|
||||||
static void DOM_ButtonEvent(int devid, int down, int button)
|
//This is to stop fucking annoying fucking things like backspace randomly destroying the page and thus game.
|
||||||
{
|
//And it has to be conditional, or we don't get any unicode chars at all.
|
||||||
if (down == 2)
|
//The behaviour browsers seem to give is retardedly unhelpful, and just results in hacks to detect keys that appear to map to ascii...
|
||||||
{
|
//Preventing the browser from leaving the page etc should NOT mean I can no longer get ascii/unicode values, only that the browser stops trying to do something random due to the event.
|
||||||
//fixme: the event is a float. we ignore that.
|
//If you are the person that decreed that this is the holy way, then please castrate yourself now.
|
||||||
while(button < 0)
|
if (scan < ' ' || scan >= 127)
|
||||||
{
|
return TRUE;
|
||||||
IN_KeyEvent(0, true, K_MWHEELUP, 0);
|
return FALSE;
|
||||||
button += 1;
|
}
|
||||||
}
|
static void DOM_ButtonEvent(int devid, int down, int button)
|
||||||
while(button > 0)
|
{
|
||||||
{
|
if (down == 2)
|
||||||
IN_KeyEvent(0, true, K_MWHEELDOWN, 0);
|
{
|
||||||
button -= 1;
|
//fixme: the event is a float. we ignore that.
|
||||||
}
|
while(button < 0)
|
||||||
}
|
{
|
||||||
else
|
IN_KeyEvent(0, true, K_MWHEELUP, 0);
|
||||||
{
|
button += 1;
|
||||||
//swap buttons 2 and 3, so rmb is still +forward by default and not +mlook.
|
}
|
||||||
if (button == 2)
|
while(button > 0)
|
||||||
button = 1;
|
{
|
||||||
else if (button == 1)
|
IN_KeyEvent(0, true, K_MWHEELDOWN, 0);
|
||||||
button = 2;
|
button -= 1;
|
||||||
|
}
|
||||||
IN_KeyEvent(0, down, K_MOUSE1+button, 0);
|
}
|
||||||
}
|
else
|
||||||
}
|
{
|
||||||
|
//swap buttons 2 and 3, so rmb is still +forward by default and not +mlook.
|
||||||
qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
if (button == 2)
|
||||||
{
|
button = 1;
|
||||||
int flags;
|
else if (button == 1)
|
||||||
|
button = 2;
|
||||||
vid_isfullscreen = true;
|
|
||||||
|
IN_KeyEvent(0, down, K_MOUSE1+button, 0);
|
||||||
if (!emscriptenfte_setupcanvas(
|
}
|
||||||
info->width,
|
}
|
||||||
info->height,
|
|
||||||
VID_Resized,
|
qboolean GLVID_Init (rendererstate_t *info, unsigned char *palette)
|
||||||
IN_MouseMove,
|
{
|
||||||
DOM_ButtonEvent,
|
int flags;
|
||||||
DOM_KeyEvent
|
|
||||||
))
|
vid_isfullscreen = true;
|
||||||
{
|
|
||||||
Con_Printf("Couldn't set up canvas\n");
|
if (!emscriptenfte_setupcanvas(
|
||||||
return false;
|
info->width,
|
||||||
}
|
info->height,
|
||||||
|
VID_Resized,
|
||||||
ActiveApp = true;
|
IN_MouseMove,
|
||||||
|
DOM_ButtonEvent,
|
||||||
GL_Init(GLVID_getsdlglfunction);
|
DOM_KeyEvent
|
||||||
|
))
|
||||||
qglViewport (0, 0, vid.pixelwidth, vid.pixelheight);
|
{
|
||||||
|
Con_Printf("Couldn't set up canvas\n");
|
||||||
mouseactive = false;
|
return false;
|
||||||
|
}
|
||||||
return true;
|
|
||||||
}
|
ActiveApp = true;
|
||||||
|
|
||||||
void GLVID_DeInit (void)
|
GL_Init(GLVID_getsdlglfunction);
|
||||||
{
|
|
||||||
ActiveApp = false;
|
qglViewport (0, 0, vid.pixelwidth, vid.pixelheight);
|
||||||
|
|
||||||
emscriptenfte_setupcanvas(-1, -1, NULL, NULL, NULL, NULL);
|
mouseactive = false;
|
||||||
}
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
void GL_BeginRendering (void)
|
|
||||||
{
|
void GLVID_DeInit (void)
|
||||||
}
|
{
|
||||||
|
ActiveApp = false;
|
||||||
qboolean screenflush;
|
|
||||||
void GL_DoSwap (void)
|
emscriptenfte_setupcanvas(-1, -1, NULL, NULL, NULL, NULL);
|
||||||
{
|
}
|
||||||
if (!screenflush)
|
|
||||||
return;
|
|
||||||
screenflush = 0;
|
void GL_BeginRendering (void)
|
||||||
|
{
|
||||||
//webgl doesn't support swapbuffers.
|
}
|
||||||
//you can't use it for loading screens.
|
|
||||||
//such things must result in waiting until the following frame.
|
qboolean screenflush;
|
||||||
//although there IS a swapped-buffers event, which we should probably use in preference to requestanimationframe or whatever the call is.
|
void GL_DoSwap (void)
|
||||||
|
{
|
||||||
/*
|
if (!screenflush)
|
||||||
if (!vid_isfullscreen)
|
return;
|
||||||
{
|
screenflush = 0;
|
||||||
if (!_windowed_mouse.value)
|
|
||||||
{
|
//webgl doesn't support swapbuffers.
|
||||||
if (mouseactive)
|
//you can't use it for loading screens.
|
||||||
{
|
//such things must result in waiting until the following frame.
|
||||||
IN_DeactivateMouse ();
|
//although there IS a swapped-buffers event, which we should probably use in preference to requestanimationframe or whatever the call is.
|
||||||
}
|
|
||||||
}
|
/*
|
||||||
else
|
if (!vid_isfullscreen)
|
||||||
{
|
{
|
||||||
if ((key_dest == key_game||mouseusedforgui) && ActiveApp)
|
if (!_windowed_mouse.value)
|
||||||
IN_ActivateMouse ();
|
{
|
||||||
else if (!(key_dest == key_game || mouseusedforgui) || !ActiveApp)
|
if (mouseactive)
|
||||||
IN_DeactivateMouse ();
|
{
|
||||||
}
|
IN_DeactivateMouse ();
|
||||||
}
|
}
|
||||||
*/
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
void GL_EndRendering (void)
|
if ((key_dest == key_game||mouseusedforgui) && ActiveApp)
|
||||||
{
|
IN_ActivateMouse ();
|
||||||
screenflush = true;
|
else if (!(key_dest == key_game || mouseusedforgui) || !ActiveApp)
|
||||||
if (!gl_lateswap.value)
|
IN_DeactivateMouse ();
|
||||||
GL_DoSwap();
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
qboolean GLVID_ApplyGammaRamps (unsigned short *ramps)
|
}
|
||||||
{
|
|
||||||
gammaworks = false;
|
void GL_EndRendering (void)
|
||||||
return gammaworks;
|
{
|
||||||
}
|
screenflush = true;
|
||||||
|
if (!gl_lateswap.value)
|
||||||
void GLVID_SetCaption(char *text)
|
GL_DoSwap();
|
||||||
{
|
}
|
||||||
// SDL_WM_SetCaption( text, NULL );
|
|
||||||
}
|
qboolean GLVID_ApplyGammaRamps (unsigned short *ramps)
|
||||||
|
{
|
||||||
void Sys_SendKeyEvents(void)
|
gammaworks = false;
|
||||||
{
|
return gammaworks;
|
||||||
/*callbacks happen outside our code, we don't need to poll for events*/
|
}
|
||||||
}
|
|
||||||
/*various stuff for joysticks, which we don't support in this port*/
|
void GLVID_SetCaption(char *text)
|
||||||
void INS_Shutdown (void)
|
{
|
||||||
{
|
// SDL_WM_SetCaption( text, NULL );
|
||||||
}
|
}
|
||||||
void INS_ReInit (void)
|
|
||||||
{
|
void Sys_SendKeyEvents(void)
|
||||||
}
|
{
|
||||||
void INS_Move(float *movements, int pnum)
|
/*callbacks happen outside our code, we don't need to poll for events*/
|
||||||
{
|
}
|
||||||
}
|
/*various stuff for joysticks, which we don't support in this port*/
|
||||||
void INS_Init (void)
|
void INS_Shutdown (void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
void INS_Accumulate(void)
|
void INS_ReInit (void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
void INS_Commands (void)
|
void INS_Move(float *movements, int pnum)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
void INS_Init (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void INS_Accumulate(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void INS_Commands (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue