aboutsummaryrefslogtreecommitdiff
path: root/archive/hge/input.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archive/hge/input.cpp')
-rw-r--r--archive/hge/input.cpp363
1 files changed, 363 insertions, 0 deletions
diff --git a/archive/hge/input.cpp b/archive/hge/input.cpp
new file mode 100644
index 0000000..2710c7f
--- /dev/null
+++ b/archive/hge/input.cpp
@@ -0,0 +1,363 @@
+/*
+** Haaf's Game Engine 1.8
+** Copyright (C) 2003-2007, Relish Games
+** hge.relishgames.com
+**
+** Core functions implementation: input
+*/
+
+
+#include "hge_impl.h"
+
+const char *KeyNames[] =
+{
+ "?",
+ "Left Mouse Button", "Right Mouse Button", "?", "Middle Mouse Button",
+ "?", "?", "?", "Backspace", "Tab", "?", "?", "?", "Enter", "?", "?",
+ "Shift", "Ctrl", "Alt", "Pause", "Caps Lock", "?", "?", "?", "?", "?", "?",
+ "Escape", "?", "?", "?", "?",
+ "Space", "Page Up", "Page Down", "End", "Home",
+ "Left Arrow", "Up Arrow", "Right Arrow", "Down Arrow",
+ "?", "?", "?", "?", "Insert", "Delete", "?",
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
+ "?", "?", "?", "?", "?", "?", "?",
+ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
+ "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
+ "Left Win", "Right Win", "Application", "?", "?",
+ "NumPad 0", "NumPad 1", "NumPad 2", "NumPad 3", "NumPad 4",
+ "NumPad 5", "NumPad 6", "NumPad 7", "NumPad 8", "NumPad 9",
+ "Multiply", "Add", "?", "Subtract", "Decimal", "Divide",
+ "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "Num Lock", "Scroll Lock",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "Semicolon", "Equals", "Comma", "Minus", "Period", "Slash", "Grave",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "?", "?", "?", "?", "?", "?",
+ "Left bracket", "Backslash", "Right bracket", "Apostrophe",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
+ "?", "?", "?"
+};
+
+
+static int SDLKeyToHGEKey(const int sdlkey)
+{
+ switch (sdlkey)
+ {
+ case SDLK_ESCAPE: return HGEK_ESCAPE;
+ case SDLK_BACKSPACE: return HGEK_BACKSPACE;
+ case SDLK_TAB: return HGEK_TAB;
+ case SDLK_RETURN: return HGEK_ENTER;
+ case SDLK_SPACE: return HGEK_SPACE;
+ case SDLK_LSHIFT: return HGEK_SHIFT;
+ case SDLK_RSHIFT: return HGEK_SHIFT;
+ case SDLK_LCTRL: return HGEK_CTRL;
+ case SDLK_RCTRL: return HGEK_CTRL;
+ case SDLK_LALT: return HGEK_ALT;
+ case SDLK_RALT: return HGEK_ALT;
+ case SDLK_LMETA: return HGEK_LWIN;
+ case SDLK_RMETA: return HGEK_RWIN;
+ //case SDLK_APPS: return HGEK_APPS;
+ case SDLK_PAUSE: return HGEK_PAUSE;
+ case SDLK_CAPSLOCK: return HGEK_CAPSLOCK;
+ case SDLK_NUMLOCK: return HGEK_NUMLOCK;
+ case SDLK_SCROLLOCK: return HGEK_SCROLLLOCK;
+ case SDLK_PAGEUP: return HGEK_PGUP;
+ case SDLK_PAGEDOWN: return HGEK_PGDN;
+ case SDLK_HOME: return HGEK_HOME;
+ case SDLK_END: return HGEK_END;
+ case SDLK_INSERT: return HGEK_INSERT;
+ case SDLK_DELETE: return HGEK_DELETE;
+ case SDLK_LEFT: return HGEK_LEFT;
+ case SDLK_UP: return HGEK_UP;
+ case SDLK_RIGHT: return HGEK_RIGHT;
+ case SDLK_DOWN: return HGEK_DOWN;
+ case SDLK_0: return HGEK_0;
+ case SDLK_1: return HGEK_1;
+ case SDLK_2: return HGEK_2;
+ case SDLK_3: return HGEK_3;
+ case SDLK_4: return HGEK_4;
+ case SDLK_5: return HGEK_5;
+ case SDLK_6: return HGEK_6;
+ case SDLK_7: return HGEK_7;
+ case SDLK_8: return HGEK_8;
+ case SDLK_9: return HGEK_9;
+ case SDLK_a: return HGEK_A;
+ case SDLK_b: return HGEK_B;
+ case SDLK_c: return HGEK_C;
+ case SDLK_d: return HGEK_D;
+ case SDLK_e: return HGEK_E;
+ case SDLK_f: return HGEK_F;
+ case SDLK_g: return HGEK_G;
+ case SDLK_h: return HGEK_H;
+ case SDLK_i: return HGEK_I;
+ case SDLK_j: return HGEK_J;
+ case SDLK_k: return HGEK_K;
+ case SDLK_l: return HGEK_L;
+ case SDLK_m: return HGEK_M;
+ case SDLK_n: return HGEK_N;
+ case SDLK_o: return HGEK_O;
+ case SDLK_p: return HGEK_P;
+ case SDLK_q: return HGEK_Q;
+ case SDLK_r: return HGEK_R;
+ case SDLK_s: return HGEK_S;
+ case SDLK_t: return HGEK_T;
+ case SDLK_u: return HGEK_U;
+ case SDLK_v: return HGEK_V;
+ case SDLK_w: return HGEK_W;
+ case SDLK_x: return HGEK_X;
+ case SDLK_y: return HGEK_Y;
+ case SDLK_z: return HGEK_Z;
+ //case SDLK_GRAVE: return HGEK_GRAVE;
+ case SDLK_MINUS: return HGEK_MINUS;
+ case SDLK_EQUALS: return HGEK_EQUALS;
+ case SDLK_BACKSLASH: return HGEK_BACKSLASH;
+ case SDLK_LEFTBRACKET: return HGEK_LBRACKET;
+ case SDLK_RIGHTBRACKET: return HGEK_RBRACKET;
+ case SDLK_SEMICOLON: return HGEK_SEMICOLON;
+ case SDLK_QUOTE: return HGEK_APOSTROPHE;
+ case SDLK_COMMA: return HGEK_COMMA;
+ case SDLK_PERIOD: return HGEK_PERIOD;
+ case SDLK_SLASH: return HGEK_SLASH;
+ case SDLK_KP0: return HGEK_NUMPAD0;
+ case SDLK_KP1: return HGEK_NUMPAD1;
+ case SDLK_KP2: return HGEK_NUMPAD2;
+ case SDLK_KP3: return HGEK_NUMPAD3;
+ case SDLK_KP4: return HGEK_NUMPAD4;
+ case SDLK_KP5: return HGEK_NUMPAD5;
+ case SDLK_KP6: return HGEK_NUMPAD6;
+ case SDLK_KP7: return HGEK_NUMPAD7;
+ case SDLK_KP8: return HGEK_NUMPAD8;
+ case SDLK_KP9: return HGEK_NUMPAD9;
+ case SDLK_KP_MULTIPLY: return HGEK_MULTIPLY;
+ case SDLK_KP_DIVIDE: return HGEK_DIVIDE;
+ case SDLK_KP_PLUS: return HGEK_ADD;
+ case SDLK_KP_MINUS: return HGEK_SUBTRACT;
+ case SDLK_KP_PERIOD: return HGEK_DECIMAL;
+ case SDLK_F1: return HGEK_F1;
+ case SDLK_F2: return HGEK_F2;
+ case SDLK_F3: return HGEK_F3;
+ case SDLK_F4: return HGEK_F4;
+ case SDLK_F5: return HGEK_F5;
+ case SDLK_F6: return HGEK_F6;
+ case SDLK_F7: return HGEK_F7;
+ case SDLK_F8: return HGEK_F8;
+ case SDLK_F9: return HGEK_F9;
+ case SDLK_F10: return HGEK_F10;
+ case SDLK_F11: return HGEK_F11;
+ case SDLK_F12: return HGEK_F12;
+ default: return -1;
+ }
+
+ return -1;
+}
+
+
+bool CALL HGE_Impl::Input_GetEvent(hgeInputEvent *event)
+{
+ CInputEventList *eptr;
+
+ if(queue)
+ {
+ eptr=queue;
+ memcpy(event, &eptr->event, sizeof(hgeInputEvent));
+ queue=eptr->next;
+ delete eptr;
+ return true;
+ }
+
+ return false;
+}
+
+void CALL HGE_Impl::Input_GetMousePos(float *x, float *y)
+{
+ *x=Xpos; *y=Ypos;
+}
+
+
+void CALL HGE_Impl::Input_SetMousePos(float x, float y)
+{
+ SDL_WarpMouse(x, y);
+}
+
+int CALL HGE_Impl::Input_GetMouseWheel()
+{
+ return Zpos;
+}
+
+bool CALL HGE_Impl::Input_IsMouseOver()
+{
+ return bMouseOver;
+}
+
+bool CALL HGE_Impl::Input_GetKeyState(int key)
+{
+ return (keyz[key] & 4) != 0;
+}
+
+int CALL HGE_Impl::Input_GetKeyStateEx(int key)//New function
+{
+ if (!Input_GetKeyState(key)&&keylast[key])return HGEKST_RELEASE;
+ if (!Input_GetKeyState(key))return HGEKST_NONE;
+ if (Input_GetKeyState(key)&&!keylast[key])return HGEKST_HIT;
+ return HGEKST_KEEP;
+}
+
+bool CALL HGE_Impl::Input_KeyDown(int key)
+{
+ return (keyz[key] & 1) != 0;
+}
+
+bool CALL HGE_Impl::Input_KeyUp(int key)
+{
+ return (keyz[key] & 2) != 0;
+}
+
+const char* CALL HGE_Impl::Input_GetKeyName(int key)
+{
+ return KeyNames[key];
+}
+
+int CALL HGE_Impl::Input_GetKey()
+{
+ return VKey;
+}
+
+int CALL HGE_Impl::Input_GetChar()
+{
+ return Char;
+}
+
+
+//////// Implementation ////////
+
+
+void HGE_Impl::_InputInit()
+{
+ Xpos = 0; // eh.
+ Ypos = 0;
+ memset(&keyz, 0, sizeof(keyz));
+}
+
+void HGE_Impl::_UpdateMouse()
+{
+ // no-op.
+}
+
+
+void HGE_Impl::_BuildEvent(int type, int key, int scan, int flags, int x, int y)
+{
+ CInputEventList *last, *eptr=new CInputEventList;
+
+ eptr->event.type=type;
+ eptr->event.chr=0;
+ int ptx=x;
+ int pty=y;
+
+ if(type==INPUT_KEYDOWN)
+ {
+ key = SDLKeyToHGEKey(key);
+ if ( (key < 0) || (key > (int)(sizeof (keyz) / sizeof (keyz[0]))) ) return;
+ keyz[key] |= 4;
+ if((flags & HGEINP_REPEAT) == 0) keyz[key] |= 1;
+ eptr->event.chr = (char) ((key >= 32) && (key <= 127)) ? key : 0; // these map to ASCII in sdl.
+ }
+ if(type==INPUT_KEYUP)
+ {
+ key = SDLKeyToHGEKey(key);
+ if ( (key < 0) || (key > (int)(sizeof (keyz) / sizeof (keyz[0]))) ) return;
+ keyz[key] &= ~4;
+ keyz[key] |= 2;
+ eptr->event.chr = (char) ((key >= 32) && (key <= 127)) ? key : 0; // these map to ASCII in sdl.
+ }
+ if(type==INPUT_MOUSEWHEEL)
+ {
+ eptr->event.key=0; eptr->event.wheel=key;
+ }
+ else { eptr->event.key=key; eptr->event.wheel=0; }
+
+ if(type==INPUT_MBUTTONDOWN)
+ {
+ keyz[key] |= 1;
+ keyz[key] |= 4;
+ //SetCapture(hwnd);
+ bCaptured=true;
+ }
+ if(type==INPUT_MBUTTONUP)
+ {
+ keyz[key] |= 2;
+ keyz[key] &= ~4;
+ //ReleaseCapture();
+ //Input_SetMousePos(Xpos, Ypos);
+ ptx=(int)Xpos; pty=(int)Ypos;
+ bCaptured=false;
+ }
+
+ if(keymods & KMOD_SHIFT) flags|=HGEINP_SHIFT;
+ if(keymods & KMOD_CTRL) flags|=HGEINP_CTRL;
+ if(keymods & KMOD_ALT) flags|=HGEINP_ALT;
+ if(keymods & KMOD_CAPS) flags|=HGEINP_CAPSLOCK;
+ if(keymods & KMOD_MODE) flags|=HGEINP_SCROLLLOCK;
+ if(keymods & KMOD_NUM) flags|=HGEINP_NUMLOCK;
+ eptr->event.flags=flags;
+
+ if(ptx==-1) { eptr->event.x=Xpos;eptr->event.y=Ypos; }
+ else
+ {
+ if(ptx<0) ptx=0;
+ if(pty<0) pty=0;
+ if(ptx>=nScreenWidth) ptx=nScreenWidth-1;
+ if(pty>=nScreenHeight) pty=nScreenHeight-1;
+
+ eptr->event.x=(float)ptx;
+ eptr->event.y=(float)pty;
+ }
+
+ eptr->next=0;
+
+ if(!queue) queue=eptr;
+ else
+ {
+ last=queue;
+ while(last->next) last=last->next;
+ last->next=eptr;
+ }
+
+ if(eptr->event.type==INPUT_KEYDOWN || eptr->event.type==INPUT_MBUTTONDOWN)
+ {
+ VKey=eptr->event.key;Char=eptr->event.chr;
+ }
+ else if(eptr->event.type==INPUT_MOUSEMOVE)
+ {
+ Xpos=eptr->event.x;Ypos=eptr->event.y;
+ }
+ else if(eptr->event.type==INPUT_MOUSEWHEEL)
+ {
+ Zpos+=eptr->event.wheel;
+ }
+}
+
+void HGE_Impl::_ClearQueue()
+{
+ CInputEventList *nexteptr, *eptr=queue;
+
+ //memset(&keyz, 0, sizeof(keyz));
+ for (int i = 0; i < (int)(sizeof (keyz) / sizeof (keyz[0])); i++)
+ keyz[i] &= ~3; // only reset some of the bits.
+
+ while(eptr)
+ {
+ nexteptr=eptr->next;
+ delete eptr;
+ eptr=nexteptr;
+ }
+
+ queue=0; VKey=0; Char=0; Zpos=0;
+}