Panagiotis Christopoulos Charitos пре 13 година
родитељ
комит
a53a03361d
4 измењених фајлова са 98 додато и 104 уклоњено
  1. 2 0
      include/anki/input/Input.h
  2. 11 4
      include/anki/input/KeyCode.h
  3. 60 73
      src/input/InputX11.cpp
  4. 25 27
      testapp/Main.cpp

+ 2 - 0
include/anki/input/Input.h

@@ -53,6 +53,8 @@ private:
 	/// @}
 
 	Vec2 mousePosNdc; ///< The coords are in the NDC space
+
+	Array<U16, 256> nativeKeyToAnki;
 };
 
 typedef Singleton<Input> InputSingleton;

+ 11 - 4
include/anki/input/KeyCode.h

@@ -20,8 +20,8 @@ enum KeyCode
 	KC_DOLLAR = '$',
 	KC_AMPERSAND = '&',
 	KC_QUOTE = '\'',
-	KC_LEFTPAREN = '(',
-	KC_RIGHTPAREN = ')',
+	KC_LPAREN = '(',
+	KC_RPAREN = ')',
 	KC_ASTERISK = '*',
 	KC_PLUS = '+',
 	KC_COMMA = ',',
@@ -45,9 +45,9 @@ enum KeyCode
 	KC_GREATER = '>',
 	KC_QUESTION = '?',
 	KC_AT = '@',
-	KC_LEFTBRACKET = '[',
+	KC_LBRACKET = '[',
 	KC_BACKSLASH = '\\',
-	KC_RIGHTBRACKET = ']',
+	KC_RBRACKET = ']',
 	KC_CARET = '^',
 	KC_UNDERSCORE = '_',
 	KC_BACKQUOTE = '`',
@@ -77,7 +77,14 @@ enum KeyCode
 	KC_X = 'x',
 	KC_Y = 'y',
 	KC_Z = 'z',
+	KC_LSHIFT,
+	
 	KC_DELETE = '\177',
+	KC_INSERT,
+	KC_HOME,
+	KC_END,
+	KC_PAGEUP,
+	KC_PAGEDOWN,
 
 	KC_UP,
 	KC_DOWN,

+ 60 - 73
src/input/InputX11.cpp

@@ -7,6 +7,7 @@
 #else
 #	error "See file"
 #endif
+#include <X11/XKBlib.h>
 
 #define DEBUG_EVENTS 1
 
@@ -19,7 +20,7 @@ struct X11KeyCodeToAnki
 	KeyCode ak;
 };
 
-X11KeyCodeToAnki x2a[] = {
+static const X11KeyCodeToAnki x2a[] = {
 	{XK_Return, KC_RETURN},
 	{XK_Escape, KC_ESCAPE},
 	{XK_BackSpace, KC_BACKSPACE},
@@ -32,8 +33,8 @@ X11KeyCodeToAnki x2a[] = {
 	{XK_dollar, KC_DOLLAR},
 	{XK_ampersand, KC_AMPERSAND},
 	{XK_apostrophe, KC_QUOTE},
-	{XK_parenleft, KC_LEFTPAREN},
-	{XK_parenright, KC_RIGHTPAREN},
+	{XK_parenleft, KC_LPAREN},
+	{XK_parenright, KC_RPAREN},
 	{XK_asterisk, KC_ASTERISK},
 	{XK_plus, KC_PLUS},
 	{XK_comma, KC_COMMA},
@@ -57,9 +58,9 @@ X11KeyCodeToAnki x2a[] = {
 	{XK_greater, KC_GREATER},
 	{XK_question, KC_QUESTION},
 	{XK_at, KC_AT},
-	{XK_bracketleft, KC_LEFTBRACKET},
+	{XK_bracketleft, KC_LBRACKET},
 	{XK_backslash, KC_BACKSLASH},
-	{XK_bracketright, KC_RIGHTBRACKET},
+	{XK_bracketright, KC_RBRACKET},
 	/*{XK_caret, KC_CARET},*/
 	{XK_underscore, KC_UNDERSCORE},
 	{XK_grave, KC_BACKQUOTE},
@@ -97,6 +98,8 @@ X11KeyCodeToAnki x2a[] = {
 	{XK_Right, KC_RIGHT}
 };
 
+#define XKEYCODE2ANKI(k_) nativeKeyToAnki[k_ & 0xFF]
+
 //==============================================================================
 static Bool eventsPending(Display* display)
 {
@@ -126,9 +129,21 @@ void Input::init(NativeWindow* nativeWindow_)
 {
 	ANKI_ASSERT(nativeWindow == nullptr);
 	nativeWindow = nativeWindow_;
-	XSelectInput(nativeWindow->getNative().xDisplay, 
-		nativeWindow->getNative().xWindow, 
-		ExposureMask | ButtonPressMask | KeyPressMask);
+	
+	NativeWindowImpl& nwin = nativeWindow->getNative();
+
+	XSelectInput(nwin.xDisplay, nwin.xWindow, 
+		ExposureMask | ButtonPressMask | KeyPressMask | KeyReleaseMask);
+
+	memset(&nativeKeyToAnki[0], sizeof(nativeKeyToAnki), KC_UNKNOWN);
+	for(const X11KeyCodeToAnki& a : x2a)
+	{
+		// Convert X11 keycode to something else
+		U32 somethingElse = a.x & 0xFF;
+
+		nativeKeyToAnki[somethingElse] = a.ak;
+	}
+
 	reset();
 }
 
@@ -138,14 +153,14 @@ void Input::handleEvents()
 	ANKI_ASSERT(nativeWindow != nullptr);
 
 	// add the times a key is being pressed
-	for(U32& k : keys)
+	for(auto& k : keys)
 	{
 		if(k)
 		{
 			++k;
 		}
 	}
-	for(U32& k : mouseBtns)
+	for(auto& k : mouseBtns)
 	{
 		if(k)
 		{
@@ -155,86 +170,58 @@ void Input::handleEvents()
 
 	NativeWindowImpl& win = nativeWindow->getNative();
 	Display* disp = win.xDisplay;
+	//ANKI_LOGI("----------------------");
 	while(eventsPending(disp))
 	{
 		XEvent event;
+		::KeyCode keycode = 0;
+		KeySym keysym;
 		XNextEvent(disp, &event);
+skipXNextEvent:
 
 		switch(event.type)
 		{
 		case KeyPress:
-#if DEBUG_EVENTS
-			ANKI_LOGI("Key pressed " << rand());
-#endif
-			break;
-		default:
-#if DEBUG_EVENTS
-			ANKI_LOGW("Unknown X event");
-#endif
-			break;
-		}
-	}
-
-#if 0
-
-	SDL_Event event_;
-	while(SDL_PollEvent(&event_))
-	{
-		switch(event_.type)
-		{
-		case SDL_KEYDOWN:
-			keys[event_.key.keysym.scancode] = 1;
-			break;
-
-		case SDL_KEYUP:
-			keys[event_.key.keysym.scancode] = 0;
+			keysym = XLookupKeysym(&event.xkey, 0);
+			keycode = event.xkey.keycode;
+			ANKI_LOGI("Key pressed: 0x" << std::hex << (U32)keysym);
+			keys[XKEYCODE2ANKI(keysym)] = 1;
 			break;
-
-		case SDL_MOUSEBUTTONDOWN:
-			mouseBtns[event_.button.button] = 1;
-			break;
-
-		case SDL_MOUSEBUTTONUP:
-			mouseBtns[event_.button.button] = 0;
-			break;
-
-		case SDL_MOUSEMOTION:
-		{
-			Vec2 prevMousePosNdc(mousePosNdc);
-
-			mousePos.x() = event_.button.x;
-			mousePos.y() = event_.button.y;
-
-			mousePosNdc.x() = (2.0 * mousePos.x()) /
-				(F32)AppSingleton::get().getWindowWidth() - 1.0;
-			mousePosNdc.y() = 1.0 - (2.0 * mousePos.y()) /
-				(F32)AppSingleton::get().getWindowHeight();
-
-			if(warpMouseFlag)
+		case KeyRelease:
+			keycode = event.xkey.keycode;
+			keysym = XLookupKeysym(&event.xkey, 0);
+			if(eventsPending(disp))
 			{
-				// the SDL_WarpMouse pushes an event in the event queue.
-				// This check is so we wont process the event of the
-				// SDL_WarpMouse function
-				if(mousePosNdc == Vec2(0.0))
+				XEvent event1;
+				XNextEvent(disp, &event1);
+
+				if(event1.type == KeyPress && event1.xkey.keycode == keycode)
 				{
-					break;
+					// Repeat
+					//ANKI_LOGI("Key autorepeat: 0x" << std::hex << (U32)keysym);
+					//++keys[XKEYCODE2ANKI(keysym)];
+				}
+				else
+				{
+					ANKI_LOGI("Key released: 0x" << std::hex << (U32)keysym);
+					keys[XKEYCODE2ANKI(keysym)] = 0;
+					event = event1;
+					goto skipXNextEvent;
 				}
-
-				uint w = AppSingleton::get().getWindowWidth();
-				uint h = AppSingleton::get().getWindowHeight();
-				SDL_WarpMouse(w / 2, h / 2);
 			}
-
-			mouseVelocity = mousePosNdc - prevMousePosNdc;
+			else
+			{
+				ANKI_LOGI("Key released #2: 0x" << std::hex << (U32)keysym);
+				keys[XKEYCODE2ANKI(keysym)] = 0;
+			}
 			break;
-		}
-
-		case SDL_QUIT:
-			AppSingleton::get().quit(1);
+		default:
+#if DEBUG_EVENTS
+			ANKI_LOGW("Unknown X event");
+#endif
 			break;
 		}
 	}
-#endif
 }
 
 } // end namespace anki

+ 25 - 27
testapp/Main.cpp

@@ -184,64 +184,62 @@ void mainLoopExtra()
 	static Movable* mover = SceneSingleton::get().getActiveCamera().getMovable();
 	Input& in = InputSingleton::get();
 
-	mover->moveLocalZ(-0.02);
-
-	if(in.getKey(SDL_SCANCODE_1))
+	if(in.getKey(KC_1))
 	{
 		mover = &SceneSingleton::get().getActiveCamera();
 	}
-	if(in.getKey(SDL_SCANCODE_2))
+	if(in.getKey(KC_2))
 	{
 		mover = SceneSingleton::get().findSceneNode("horse")->getMovable();
 	}
-	if(in.getKey(SDL_SCANCODE_3))
+	if(in.getKey(KC_3))
 	{
 		mover = SceneSingleton::get().findSceneNode("spot0")->getMovable();
 	}
-	/*if(in.getKey(SDL_SCANCODE_4))
+	/*if(in.getKey(KC_4))
 	{
 		mover = SceneSingleton::get().findSceneNode("point0")->getMovable();
 	}
-	if(in.getKey(SDL_SCANCODE_5))
+	if(in.getKey(KC_5))
 	{
 		mover = SceneSingleton::get().findSceneNode("point1")->getMovable();
 	}*/
-	if(in.getKey(SDL_SCANCODE_6))
+	if(in.getKey(KC_6))
 	{
 		mover = SceneSingleton::get().findSceneNode("camera1")->getMovable();
 		mover->setLocalTransform(cam->getLocalTransform());
 	}
 
-	if(in.getKey(SDL_SCANCODE_L) == 1)
+	if(in.getKey(KC_L) == 1)
 	{
 		Light* l = SceneSingleton::get().findSceneNode("point1")->getLight();
 		static_cast<PointLight*>(l)->setRadius(10.0);
 	}
 
-	if(in.getKey(SDL_SCANCODE_P) == 1)
+	if(in.getKey(KC_P) == 1)
 	{
 		/*SceneSingleton::get().getActiveCamera().
 			getFrustumable()->getFrustum().setFar(250.0);*/
 	}
 
-	if(in.getKey(SDL_SCANCODE_UP)) mover->rotateLocalX(ang);
-	if(in.getKey(SDL_SCANCODE_DOWN)) mover->rotateLocalX(-ang);
-	if(in.getKey(SDL_SCANCODE_LEFT)) mover->rotateLocalY(ang);
-	if(in.getKey(SDL_SCANCODE_RIGHT)) mover->rotateLocalY(-ang);
-
-	if(in.getKey(SDL_SCANCODE_A)) mover->moveLocalX(-dist);
-	if(in.getKey(SDL_SCANCODE_D)) mover->moveLocalX(dist);
-	if(in.getKey(SDL_SCANCODE_LSHIFT)) mover->moveLocalY(dist);
-	if(in.getKey(SDL_SCANCODE_SPACE)) mover->moveLocalY(-dist);
-	if(in.getKey(SDL_SCANCODE_W)) mover->moveLocalZ(-dist);
-	if(in.getKey(SDL_SCANCODE_S)) mover->moveLocalZ(dist);
-	if(in.getKey(SDL_SCANCODE_Q)) mover->rotateLocalZ(ang);
-	if(in.getKey(SDL_SCANCODE_E)) mover->rotateLocalZ(-ang);
-	if(in.getKey(SDL_SCANCODE_PAGEUP))
+	if(in.getKey(KC_UP)) mover->rotateLocalX(ang);
+	if(in.getKey(KC_DOWN)) mover->rotateLocalX(-ang);
+	if(in.getKey(KC_LEFT)) mover->rotateLocalY(ang);
+	if(in.getKey(KC_RIGHT)) mover->rotateLocalY(-ang);
+
+	if(in.getKey(KC_A)) mover->moveLocalX(-dist);
+	if(in.getKey(KC_D)) mover->moveLocalX(dist);
+	if(in.getKey(KC_LSHIFT)) mover->moveLocalY(dist);
+	if(in.getKey(KC_SPACE)) mover->moveLocalY(-dist);
+	if(in.getKey(KC_W)) mover->moveLocalZ(-dist);
+	if(in.getKey(KC_S)) mover->moveLocalZ(dist);
+	if(in.getKey(KC_Q)) mover->rotateLocalZ(ang);
+	if(in.getKey(KC_E)) mover->rotateLocalZ(-ang);
+	if(in.getKey(KC_PAGEUP))
 	{
 		mover->scale(scale);
 	}
-	if(in.getKey(SDL_SCANCODE_PAGEDOWN))
+	if(in.getKey(KC_PAGEDOWN))
 	{
 		mover->scale(-scale);
 	}
@@ -274,7 +272,7 @@ void mainLoop()
 		EventManagerSingleton::get().updateAllEvents(prevUpdateTime, crntTime);
 		MainRendererSingleton::get().render(SceneSingleton::get());
 
-		if(InputSingleton::get().getKey(SDL_SCANCODE_ESCAPE))
+		if(InputSingleton::get().getKey(KC_ESCAPE))
 		{
 			break;
 		}
@@ -329,7 +327,7 @@ void initSubsystems(int argc, char* argv[])
 	// Main renderer
 	RendererInitializer initializer;
 	initializer.ms.ez.enabled = true;
-	initializer.dbg.enabled = true;
+	initializer.dbg.enabled = false;
 	initializer.is.sm.bilinearEnabled = true;
 	initializer.is.sm.enabled = true;
 	initializer.is.sm.pcfEnabled = true;