Ver Fonte

Added mouse lock.

bkaradzic há 13 anos atrás
pai
commit
f513da8b67

+ 1 - 0
examples/common/entry.h

@@ -159,6 +159,7 @@ namespace entry
 
 	void setWindowSize(uint32_t _width, uint32_t _height);
 	void toggleWindowFrame();
+	void setMouseLock(bool _lock);
 
 } // namespace entry
 

+ 4 - 0
examples/common/entry_emscripten.cpp

@@ -32,6 +32,10 @@ namespace entry
 	{
 	}
 
+	void setMouseLock(bool _lock)
+	{
+	}
+
 } // namespace entry
 
 extern int _main_(int _argc, char** _argv);

+ 4 - 0
examples/common/entry_linux.cpp

@@ -302,6 +302,10 @@ namespace entry
 	{
 	}
 
+	void setMouseLock(bool _lock)
+	{
+	}
+
 } // namespace entry
 
 int main(int _argc, char** _argv)

+ 4 - 0
examples/common/entry_nacl.cpp

@@ -44,6 +44,10 @@ namespace entry
 	{
 	}
 
+	void setMouseLock(bool _lock)
+	{
+	}
+
 } // namespace entry
 
 extern int _main_(int _argc, char** _argv);

+ 4 - 0
examples/common/entry_osx.mm

@@ -236,6 +236,10 @@ namespace entry
 	{
 	}
 
+	void setMouseLock(bool _lock)
+	{
+	}
+
 } // namespace entry
 
 int main(int _argc, char** _argv)

+ 58 - 0
examples/common/entry_windows.cpp

@@ -20,6 +20,7 @@
 
 #define WM_USER_SET_WINDOW_SIZE     (WM_USER+0)
 #define WM_USER_TOGGLE_WINDOW_FRAME (WM_USER+1)
+#define WM_USER_MOUSE_LOCK          (WM_USER+2)
 
 extern int _main_(int _argc, char** _argv);
 
@@ -267,6 +268,10 @@ namespace entry
 					}
 					break;
 
+				case WM_USER_MOUSE_LOCK:
+					setMouseLock(!!_lparam);
+					break;
+
 				case WM_DESTROY:
 					break;
 
@@ -348,6 +353,21 @@ namespace entry
 					{
 						int32_t mx = GET_X_LPARAM(_lparam);
 						int32_t my = GET_Y_LPARAM(_lparam);
+
+						if (m_mouseLock)
+						{
+							mx -= m_mx;
+							my -= m_my;
+
+							if (0 == mx
+							&&  0 == my)
+							{
+								break;
+							}
+
+							setMousePos(m_mx, m_my);
+						}
+
 						m_eventQueue.postMouseEvent(mx, my);
 					}
 					break;
@@ -505,6 +525,34 @@ namespace entry
 			m_frame = _windowFrame;
 		}
 
+		void setMousePos(int32_t _mx, int32_t _my)
+		{
+			POINT pt = { _mx, _my };
+			ClientToScreen(m_hwnd, &pt);
+			SetCursorPos(pt.x, pt.y);
+		}
+
+		void setMouseLock(bool _lock)
+		{
+			if (_lock != m_mouseLock)
+			{
+				if (_lock)
+				{
+					m_mx = m_width/2;
+					m_my = m_height/2;
+					ShowCursor(false);
+					setMousePos(m_mx, m_my);
+				}
+				else
+				{
+					setMousePos(m_mx, m_my);
+					ShowCursor(true);
+				}
+
+				m_mouseLock = _lock;
+			}
+		}
+
 		static LRESULT CALLBACK wndProc(HWND _hwnd, UINT _id, WPARAM _wparam, LPARAM _lparam);
 
 		EventQueue m_eventQueue;
@@ -517,7 +565,12 @@ namespace entry
 		uint32_t m_oldWidth;
 		uint32_t m_oldHeight;
 		float m_aspectRatio;
+
+		int32_t m_mx;
+		int32_t m_my;
+
 		bool m_frame;
+		bool m_mouseLock;
 		bool m_init;
 		bool m_exit;
 
@@ -550,6 +603,11 @@ namespace entry
 		PostMessage(s_ctx.m_hwnd, WM_USER_TOGGLE_WINDOW_FRAME, 0, 0);
 	}
 
+	void setMouseLock(bool _lock)
+	{
+		PostMessage(s_ctx.m_hwnd, WM_USER_MOUSE_LOCK, 0, _lock);
+	}
+
 	int32_t MainThreadEntry::threadFunc(void* _userData)
 	{
 		MainThreadEntry* self = (MainThreadEntry*)_userData;