Mercurial > projects > mde
diff mde/input/eventstream.d @ 0:d547009c104c
Repository creation.
committer: Diggory Hardy <diggory.hardy@gmail.com>
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Sat, 27 Oct 2007 18:05:39 +0100 |
parents | |
children | 78eb491bd642 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mde/input/eventstream.d Sat Oct 27 18:05:39 2007 +0100 @@ -0,0 +1,93 @@ +/** This module contains functions called on an event, which may modify the event (adjuster + * functions), and finally output to one (or more) of the state tables (the event stream). + * + * Adjuster and other event functions should have a format to fit the ES_X_Func types, for X is B + * (button event), A (axis event) or M (mouse relative motion event or joystick ball event). + * Adjusters should call (an) output function(s) of any type with their output(s). + * + * To control which adjusters get called and pass parameters, a stack is used. + */ +module mde.input.eventstream; +import mde.input.core; +/+ +/// Module constructor fills es_*_fcts tables and rehashes them. +static this () { + es_b_fcts[ES_B_OUT] = &es_b_out; + + // Call rehash following initialisation: + es_b_fcts.rehash; + es_a_fcts.rehash; + es_m_fcts.rehash; +} + +/// These aliases are for pointers to the event functions. +alias void function (bool, out_stack) ES_B_Func; +alias void function (short, out_stack) ES_A_Func; /// ditto +alias void function (short, short, out_stack) ES_M_Func; /// ditto + +/// These are the tables for looking up which event function to call. +static ES_B_Func[uint] es_b_fcts; +static ES_A_Func[uint] es_a_fcts; /// ditto +static ES_M_Func[uint] es_m_fcts; /// ditto + +/// These are the codes allowing the config to specify event functions: +enum : uint { + ES_B_OUT = 0x0000_0100u, + ES_A_OUT = 0x0000_0200u, + ES_M_OUT = 0x0000_0300u, +} + +/// Functions to pass an event to the appropriate event function +void bEventOut (bool b, out_stack s) +{ + ES_B_Func* func = (s.pop in es_b_fcts); + if (func != null) (*func)(b,s); + else throw new InputException ("Input: Invalid configuration: bad event function code"); +} +void aEventOut (short x, out_stack s) /// ditto +{ + ES_A_Func* func = (s.pop in es_a_fcts); + if (func != null) (*func)(x,s); + else throw new InputException ("Input: Invalid configuration: bad event function code"); +} +void mEventOut (short x, short y, out_stack s) /// ditto +{ + ES_M_Func* func = (s.pop in es_m_fcts); + if (func != null) (*func)(x,y,s); + else throw new InputException ("Input: Invalid configuration: bad event function code"); +} + +/// Simple output function +void es_b_out (bool b, out_stack s) { + b_tbl[cast(index_t) s.pop] = b; +} +/// Adjuster to check modifier keys +void es_b_modifier (bool b, out_stack s); + +/** Simple output function + +Adds 1-2 items on the stack. +*/ +void es_a_out (short x, out_stack s) { + real y = x; + uint conf = s.pop; + enum : uint { + HALF_RANGE = 0x8000_0000u, + SENSITIVITY = 0x0080_0000u, + } + // Convert ranges into standard intervals (with or without reverse values) + if (conf & HALF_RANGE) y = (y + 32767.0) * 1.5259254737998596e-05; // range 0.0 - 1.0 + else y *= 3.0518509475997192e-05; // range -1.0 - 1.0 + real a; + if (conf & SENSITIVITY) a = s.pop; + /+ When a global sensitivity is available (possibly only use if it's enabled)... + else a = axis.sensitivity; + y = sign(y) * pow(abs(y), a); // sensitivity adjustment by a +/ + axis_tbl[cast(index_t) s.pop] = y; +} + +/// Simple output function +void es_m_out (short x, short y, out_stack s) { + axis_rel_tbl[cast(index_t) s.pop] = RelPair(x,y); +} ++/ \ No newline at end of file