From dabf8c3a17b1184486d11179466b7647e0445f1e Mon Sep 17 00:00:00 2001 From: Mathieu GRENET Date: Wed, 8 May 2024 09:29:21 +0200 Subject: [PATCH] Fix border resistance not coherent on modes --- HLab.Avalonia | 2 +- .../LittleBigMouse.Zones/Zone.cs | 5 +-- .../LittleBigMouse.Zones/ZoneLink.cs | 2 +- LittleBigMouse.Hook/Engine/MouseEngine.cpp | 43 +++++++++++++++++-- LittleBigMouse.Hook/Engine/MouseEngine.h | 2 + LittleBigMouse.Hook/Engine/ZoneLink.cpp | 17 ++------ LittleBigMouse.Hook/Engine/ZoneLink.h | 8 ++-- LittleBigMouse.Hook/Engine/ZonesLayout.cpp | 2 +- 8 files changed, 53 insertions(+), 28 deletions(-) diff --git a/HLab.Avalonia b/HLab.Avalonia index aefde7b..0356d8e 160000 --- a/HLab.Avalonia +++ b/HLab.Avalonia @@ -1 +1 @@ -Subproject commit aefde7b5fc76da9931a741815bf980e2a11a3e75 +Subproject commit 0356d8e86d3e56d937cd03544189eb954f36daf5 diff --git a/LittleBigMouse.Core/LittleBigMouse.Zones/Zone.cs b/LittleBigMouse.Core/LittleBigMouse.Zones/Zone.cs index 2a14212..9885c05 100644 --- a/LittleBigMouse.Core/LittleBigMouse.Zones/Zone.cs +++ b/LittleBigMouse.Core/LittleBigMouse.Zones/Zone.cs @@ -135,8 +135,7 @@ List ComputeLinks( var targetFromPixel = target!=null?fromPixelsFunc(target):0; var targetToPixel = target!=null?toPixelsFunc(target):0; - // TODO : border resistance mm to pixel calculated from wrong orientation - var borderResistance = (int)((sourceToPixel - sourceFromPixel) * getBorderResistance(this) / (sourceTo - sourceFrom)); + var borderResistance = getBorderResistance(this); if (links.Count > 0 && ReferenceEquals(links.Last().Target, target)) { @@ -149,7 +148,7 @@ List ComputeLinks( links.Add(new() { - BorderResistance = (int)borderResistance, + BorderResistance = borderResistance, Distance = min, From = from, To = to, diff --git a/LittleBigMouse.Core/LittleBigMouse.Zones/ZoneLink.cs b/LittleBigMouse.Core/LittleBigMouse.Zones/ZoneLink.cs index 6112355..12cfa23 100644 --- a/LittleBigMouse.Core/LittleBigMouse.Zones/ZoneLink.cs +++ b/LittleBigMouse.Core/LittleBigMouse.Zones/ZoneLink.cs @@ -11,7 +11,7 @@ public class ZoneLink : IZonesSerializable public int SourceToPixel { get; set; } public int TargetFromPixel { get; set; } public int TargetToPixel { get; set; } - public int BorderResistance { get; set; } + public double BorderResistance { get; set; } [JsonIgnore] public Zone? Target { get; set; } public int TargetId => Target?.Id??-1; diff --git a/LittleBigMouse.Hook/Engine/MouseEngine.cpp b/LittleBigMouse.Hook/Engine/MouseEngine.cpp index 4a26188..12382d8 100644 --- a/LittleBigMouse.Hook/Engine/MouseEngine.cpp +++ b/LittleBigMouse.Hook/Engine/MouseEngine.cpp @@ -203,6 +203,12 @@ void MouseEngine::OnMouseMoveCross(MouseEventArg& e) } #endif + if(_currentResistanceLink) + { + LOG_TRACE("< nullptr >"); + _currentResistanceLink = nullptr; + } + _oldPoint = e.Point; e.Handled = false; return; @@ -274,6 +280,7 @@ void MouseEngine::OnMouseMoveCross(MouseEventArg& e) return; } } + LOG_TRACE(" - " << pInMmOld << pInMm << " - "); NoZoneMatches(e); } @@ -306,6 +313,34 @@ bool MouseEngine::TryPassBorder(const ZoneLink* zoneLink, const double distance) return false; } +/// +/// Deal with border resistance +/// (Original idea by Kevin Mills https://github.com/mgfarmer/LittleBigMouse) +/// +/// +/// +/// +bool MouseEngine::TryPassBorderPixel(const ZoneLink* zoneLink, const long distance) +{ + if((GetAsyncKeyState(VK_CONTROL) & 0x8000) == 0x8000) return true; + + if(zoneLink != _currentResistanceLink) + { + LOG_TRACE("< != >"); + + _currentResistanceLink = zoneLink; + _borderResistancePixel = zoneLink->BorderResistancePixel; + } + + LOG_TRACE("< -= >" << distance); + + _borderResistancePixel -= distance; + + if (_borderResistancePixel<=0) return true; + + return false; +} + /// /// Process mouse move using strait algorithm (pre-calculated border links) /// @@ -328,7 +363,7 @@ void MouseEngine::OnMouseMoveStraight(MouseEventArg& e) //DebugUnhook.fire(); zoneLinkOut = _oldZone->RightZones->AtPixel(pIn.Y()); - if (zoneLinkOut->Target && TryPassBorder(zoneLinkOut,dist)) + if (zoneLinkOut->Target && TryPassBorderPixel(zoneLinkOut,dist)) { pOut = { zoneLinkOut->Target->PixelsBounds().Left(),zoneLinkOut->ToTargetPixel(pIn.Y()) }; } @@ -342,7 +377,7 @@ void MouseEngine::OnMouseMoveStraight(MouseEventArg& e) else if ((dist = bounds.Left() - pIn.X()) >= 0) { zoneLinkOut = _oldZone->LeftZones->AtPixel(pIn.Y()); - if (zoneLinkOut->Target && TryPassBorder(zoneLinkOut,dist)) + if (zoneLinkOut->Target && TryPassBorderPixel(zoneLinkOut,dist)) { pOut = { zoneLinkOut->Target->PixelsBounds().Right() - 1,zoneLinkOut->ToTargetPixel(pIn.Y()) }; } @@ -356,7 +391,7 @@ void MouseEngine::OnMouseMoveStraight(MouseEventArg& e) else if ((dist = 1 + pIn.Y() - bounds.Bottom()) >= 0) { zoneLinkOut = _oldZone->BottomZones->AtPixel(pIn.X()); - if (zoneLinkOut->Target && TryPassBorder(zoneLinkOut,dist)) + if (zoneLinkOut->Target && TryPassBorderPixel(zoneLinkOut,dist)) { pOut = { zoneLinkOut->ToTargetPixel(pIn.X()), zoneLinkOut->Target->PixelsBounds().Top() }; } @@ -370,7 +405,7 @@ void MouseEngine::OnMouseMoveStraight(MouseEventArg& e) else if ((dist = _oldZone->PixelsBounds().Top() - pIn.Y()) >= 0) { zoneLinkOut = _oldZone->TopZones->AtPixel(pIn.X()); - if (zoneLinkOut->Target && TryPassBorder(zoneLinkOut,dist)) + if (zoneLinkOut->Target && TryPassBorderPixel(zoneLinkOut,dist)) { pOut = { zoneLinkOut->ToTargetPixel(pIn.X()),zoneLinkOut->Target->PixelsBounds().Bottom() - 1 }; } diff --git a/LittleBigMouse.Hook/Engine/MouseEngine.h b/LittleBigMouse.Hook/Engine/MouseEngine.h index cb364c7..1f899bc 100644 --- a/LittleBigMouse.Hook/Engine/MouseEngine.h +++ b/LittleBigMouse.Hook/Engine/MouseEngine.h @@ -37,6 +37,7 @@ class MouseEngine //Mouse movement taking care of direction, allows "corner crossing" void OnMouseMoveCross(MouseEventArg& e); bool TryPassBorder(const ZoneLink* zoneLink, const double distance); + bool TryPassBorderPixel(const ZoneLink* zoneLink, long distance); //Final move void Move(MouseEventArg& e, const geo::Point& pOut, const Zone* zoneOut); @@ -52,6 +53,7 @@ class MouseEngine const ZoneLink* _currentResistanceLink = nullptr; double _borderResistance = 0; + long _borderResistancePixel = 0; public: SIGNAL OnMessage; diff --git a/LittleBigMouse.Hook/Engine/ZoneLink.cpp b/LittleBigMouse.Hook/Engine/ZoneLink.cpp index 7a4ba1a..e358c45 100644 --- a/LittleBigMouse.Hook/Engine/ZoneLink.cpp +++ b/LittleBigMouse.Hook/Engine/ZoneLink.cpp @@ -1,17 +1,5 @@ #include "ZoneLink.h" -bool ZoneLink::TryPassThrough(const long distance) -{ - const auto d = ResistanceTravel - distance; - if(d <= 0) - { - ResistanceTravel = BorderResistance; - return true; - } - ResistanceTravel = d; - return false; -} - Zone* ZoneLink::At(const double pos) const { auto z = this; @@ -54,7 +42,7 @@ ZoneLink::ZoneLink( const long sourceToPixel, const long targetFromPixel, const long targetToPixel, - const long borderResistance, + const double borderResistance, const long targetId ) : TargetId(targetId), @@ -63,6 +51,9 @@ ZoneLink::ZoneLink( TargetFromPixel(targetFromPixel), TargetToPixel(targetToPixel), BorderResistance(borderResistance) { + if (BorderResistance <= 0) BorderResistance = 0; + else BorderResistancePixel = static_cast((borderResistance / (To - From)) * (SourceToPixel - SourceFromPixel)); + Target = nullptr; Next = nullptr; } diff --git a/LittleBigMouse.Hook/Engine/ZoneLink.h b/LittleBigMouse.Hook/Engine/ZoneLink.h index d2d7571..6bc1242 100644 --- a/LittleBigMouse.Hook/Engine/ZoneLink.h +++ b/LittleBigMouse.Hook/Engine/ZoneLink.h @@ -17,10 +17,8 @@ class ZoneLink long TargetFromPixel; long TargetToPixel; - long BorderResistance; - long ResistanceTravel; - - bool TryPassThrough(long distance); + double BorderResistance; + long BorderResistancePixel; //long SourceLengthPixel; //long TargetLengthPixel; @@ -28,7 +26,7 @@ class ZoneLink const ZoneLink* AtPhysical(double pos) const; [[nodiscard]] const ZoneLink* AtPixel(long pos) const; [[nodiscard]] long ToTargetPixel(long v) const; - ZoneLink(const double from, const double to, const long sourceFromPixel, const long sourceToPixel, const long targetFromPixel, const long targetToPixel, const long borderResistance, const long targetId = -1); + ZoneLink(const double from, const double to, const long sourceFromPixel, const long sourceToPixel, const long targetFromPixel, const long targetToPixel, const double borderResistance, const long targetId = -1); ~ZoneLink() {delete Next;} }; diff --git a/LittleBigMouse.Hook/Engine/ZonesLayout.cpp b/LittleBigMouse.Hook/Engine/ZonesLayout.cpp index 4c428fc..07bdcd6 100644 --- a/LittleBigMouse.Hook/Engine/ZonesLayout.cpp +++ b/LittleBigMouse.Hook/Engine/ZonesLayout.cpp @@ -128,7 +128,7 @@ ZoneLink* GetNewZoneLink(tinyxml2::XMLElement* element) const long targetFromPixel = XmlHelper::GetLong(zoneElement,"TargetFromPixel"); const long targetToPixel = XmlHelper::GetLong(zoneElement,"TargetToPixel"); const long targetId = XmlHelper::GetLong(zoneElement,"TargetId"); - const long borderResistance = XmlHelper::GetLong(zoneElement,"BorderResistance"); + const double borderResistance = XmlHelper::GetDouble(zoneElement,"BorderResistance"); *currentLink = new ZoneLink(from,to,sourceFromPixel,sourceToPixel,targetFromPixel,targetToPixel,borderResistance,targetId);