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