about summary refs log tree commit diff
path: root/src/engine/client/ec_inp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/client/ec_inp.c')
-rw-r--r--src/engine/client/ec_inp.c210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/engine/client/ec_inp.c b/src/engine/client/ec_inp.c
new file mode 100644
index 00000000..0366cff5
--- /dev/null
+++ b/src/engine/client/ec_inp.c
@@ -0,0 +1,210 @@
+/* copyright (c) 2007 magnus auvinen, see licence.txt for more info */
+#include <string.h>
+#include <engine/external/glfw/include/GL/glfw.h>
+
+#include <engine/e_system.h>
+#include <engine/e_interface.h>
+#include <engine/e_config.h>
+
+static int keyboard_state[2][1024]; /* TODO: fix this!! */
+static int keyboard_current = 0;
+static int keyboard_first = 1;
+
+
+static struct
+{
+	unsigned char presses;
+	unsigned char releases;
+} input_count[2][1024] = {{{0}}, {{0}}};
+
+static unsigned char input_state[2][1024] = {{0}, {0}};
+
+static int input_current = 0;
+static unsigned int last_release = 0;
+static unsigned int release_delta = -1;
+
+void inp_mouse_relative(int *x, int *y)
+{
+	static int last_x = 0, last_y = 0;
+	static int last_sens = 100.0f;
+	int nx, ny;
+	float sens = config.inp_mousesens/100.0f;
+	
+	if(last_sens != config.inp_mousesens)
+	{
+		last_x = (last_x/(float)last_sens)*(float)config.inp_mousesens;
+		last_y = (last_y/(float)last_sens)*(float)config.inp_mousesens;
+		last_sens = config.inp_mousesens;
+	}
+	
+	
+	glfwGetMousePos(&nx, &ny);
+	nx *= sens;
+	ny *= sens;
+	
+	*x = nx-last_x;
+	*y = ny-last_y;
+	last_x = nx;
+	last_y = ny;
+}
+
+static char last_c = 0;
+static int last_k = 0;
+
+static void char_callback(int character, int action)
+{
+	if(action == GLFW_PRESS && character < 256)
+		last_c = (char)character;
+}
+
+static void key_callback(int key, int action)
+{
+	if(action == GLFW_PRESS)
+		last_k = key;
+	
+	if(action == GLFW_PRESS)
+		input_count[input_current^1][key].presses++;
+	if(action == GLFW_RELEASE)
+		input_count[input_current^1][key].releases++;
+	input_state[input_current^1][key] = action;
+}
+
+static void mousebutton_callback(int button, int action)
+{
+	if(action == GLFW_PRESS)
+		last_k = KEY_MOUSE_FIRST+button;
+		
+	if(action == GLFW_PRESS)
+		input_count[input_current^1][KEY_MOUSE_FIRST+button].presses++;
+	if(action == GLFW_RELEASE)
+	{
+		if(button == 0)
+		{
+			release_delta = time_get() - last_release;
+			last_release = time_get();
+		}
+		input_count[input_current^1][KEY_MOUSE_FIRST+button].releases++;
+	}
+	input_state[input_current^1][KEY_MOUSE_FIRST+button] = action;
+}
+
+
+static void mousewheel_callback(int pos)
+{
+	if(pos > 0)
+	{
+		while(pos-- != 0)
+		{
+			input_count[input_current^1][KEY_MOUSE_WHEEL_UP].presses++;
+			input_count[input_current^1][KEY_MOUSE_WHEEL_UP].releases++;
+		}
+	}
+	else if(pos < 0)
+	{
+		while(pos++ != 0)
+		{
+			input_count[input_current^1][KEY_MOUSE_WHEEL_DOWN].presses++;
+			input_count[input_current^1][KEY_MOUSE_WHEEL_DOWN].releases++;
+		}	
+	}
+	glfwSetMouseWheel(0);
+}
+
+
+void inp_init()
+{
+	glfwEnable(GLFW_KEY_REPEAT);
+	glfwSetCharCallback(char_callback);
+	glfwSetKeyCallback(key_callback);
+	glfwSetMouseButtonCallback(mousebutton_callback);
+	glfwSetMouseWheelCallback(mousewheel_callback);
+}
+
+char inp_last_char()
+{
+	return last_c;
+}
+
+int inp_last_key()
+{
+	return last_k;
+}
+
+void inp_clear()
+{
+	last_k = 0;
+	last_c = 0;
+}
+
+void inp_mouse_mode_absolute()
+{
+	glfwEnable(GLFW_MOUSE_CURSOR);
+}
+
+void inp_mouse_mode_relative()
+{
+	glfwDisable(GLFW_MOUSE_CURSOR);
+}
+
+int inp_mouse_doubleclick()
+{
+	return release_delta < (time_freq() >> 2);
+}
+
+int inp_key_presses(int key)
+{
+	return input_count[input_current][key].presses;
+}
+
+int inp_key_releases(int key)
+{
+	return input_count[input_current][key].releases;
+}
+
+int inp_key_state(int key)
+{
+	return input_state[input_current][key];
+}
+
+int inp_key_pressed(int key) { return keyboard_state[keyboard_current][key]; }
+int inp_key_was_pressed(int key) { return keyboard_state[keyboard_current^1][key]; }
+int inp_key_down(int key) { return inp_key_pressed(key)&&!inp_key_was_pressed(key); }
+int inp_button_pressed(int button) { return keyboard_state[keyboard_current][button]; }
+
+void inp_update()
+{
+    int i, v;
+    
+	/* clear and begin count on the other one */
+	mem_zero(&input_count[input_current], sizeof(input_count[input_current]));
+	memcpy(input_state[input_current], input_state[input_current^1], sizeof(input_state[input_current]));
+	input_current^=1;
+
+    if(keyboard_first)
+    {
+        /* make sure to reset */
+        keyboard_first = 0;
+        inp_update();
+    }
+    
+    keyboard_current = keyboard_current^1;
+    for(i = 0; i < KEY_LAST; i++)
+    {
+	    if (i >= KEY_MOUSE_FIRST)
+			v = glfwGetMouseButton(i-KEY_MOUSE_FIRST) == GLFW_PRESS ? 1 : 0;
+		else
+			v = glfwGetKey(i) == GLFW_PRESS ? 1 : 0;
+        keyboard_state[keyboard_current][i] = v;
+    }
+
+	/* handle mouse wheel */
+	/*
+	i = glfwGetMouseWheel();
+    keyboard_state[keyboard_current][KEY_MOUSE_WHEEL_UP] = 0;
+    keyboard_state[keyboard_current][KEY_MOUSE_WHEEL_DOWN] = 0;
+    if(w > 0)
+    	keyboard_state[keyboard_current][KEY_MOUSE_WHEEL_UP] = 1;
+    if(w < 0)
+    	keyboard_state[keyboard_current][KEY_MOUSE_WHEEL_DOWN] = 1;
+    glfwSetMouseWheel(0);*/
+}