diff --git a/engine/main.cpp b/engine/main.cpp index b3fd90c..e4992a3 100644 --- a/engine/main.cpp +++ b/engine/main.cpp @@ -321,6 +321,9 @@ int main() LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { + static bool leftDown = false; + static DWORD lastTime; + static POINT lastPoint; switch (msg) { case WM_CREATE: @@ -367,18 +370,60 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) break; case WM_MOUSEMOVE: //TODO: find a way to check if event is mouse/stylus. For now use Mouse for all - App::I.mouse_move((float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), WacomTablet::I.get_pressure(), kEventSource::Mouse); + if (leftDown) + { + POINT pt = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; + // See discussion for why this code is wrong + ClientToScreen(hWnd, &pt); + MOUSEMOVEPOINT mmpt = { pt.x & 0x0000FFFF, pt.y & 0x0000FFFF, GetMessageTime() }; + MOUSEMOVEPOINT rgmmpt[64]; + int cmmpt = GetMouseMovePointsEx(sizeof(mmpt), &mmpt, + rgmmpt, 64, GMMP_USE_DISPLAY_POINTS); + + POINT ptLastScreen = lastPoint; + ClientToScreen(hWnd, &ptLastScreen); + int i; + for (i = 0; i < cmmpt; i++) + { + if (rgmmpt[i].x > 32767) rgmmpt[i].x -= 65536; + if (rgmmpt[i].y > 32767) rgmmpt[i].y -= 65536; + + if (rgmmpt[i].time < lastTime) break; + if (rgmmpt[i].time == lastTime && + rgmmpt[i].x == ptLastScreen.x && + rgmmpt[i].y == ptLastScreen.y) break; + } + while (--i >= 0) + { + POINT ptClient = { rgmmpt[i].x, rgmmpt[i].y }; + ScreenToClient(hWnd, &ptClient); + if (ptClient.x != lastPoint.x || ptClient.y != lastPoint.y) + { + lastPoint = ptClient; + App::I.mouse_move((float)ptClient.x, (float)ptClient.y, WacomTablet::I.get_pressure(), kEventSource::Mouse); + } + } + lastTime = GetMessageTime(); + } + else + { + App::I.mouse_move((float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), WacomTablet::I.get_pressure(), kEventSource::Mouse); + } break; case WM_LBUTTONDOWN: //TODO: find a way to check if event is mouse/stylus. For now use Mouse for all - App::I.mouse_down(0, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), WacomTablet::I.get_pressure(), kEventSource::Mouse); + leftDown = true; SetCapture(hWnd); + lastTime = GetMessageTime(); + lastPoint = { GET_X_LPARAM(lp), GET_Y_LPARAM(lp) }; + App::I.mouse_down(0, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), WacomTablet::I.get_pressure(), kEventSource::Mouse); break; case WM_LBUTTONUP: WacomTablet::I.reset_pressure(); //TODO: find a way to check if event is mouse/stylus. For now use Mouse for all App::I.mouse_up(0, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), kEventSource::Mouse); ReleaseCapture(); + leftDown = false; break; case WM_RBUTTONDOWN: App::I.mouse_down(1, (float)GET_X_LPARAM(lp), (float)GET_Y_LPARAM(lp), 1.f, kEventSource::Mouse);