Skip to content

Commit

Permalink
Fix border resistance not coherent on modes
Browse files Browse the repository at this point in the history
  • Loading branch information
mgth committed May 8, 2024
1 parent 935f136 commit dabf8c3
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 28 deletions.
2 changes: 1 addition & 1 deletion HLab.Avalonia
5 changes: 2 additions & 3 deletions LittleBigMouse.Core/LittleBigMouse.Zones/Zone.cs
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,7 @@ List<ZoneLink> 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))
{
Expand All @@ -149,7 +148,7 @@ List<ZoneLink> ComputeLinks(

links.Add(new()
{
BorderResistance = (int)borderResistance,
BorderResistance = borderResistance,
Distance = min,
From = from,
To = to,
Expand Down
2 changes: 1 addition & 1 deletion LittleBigMouse.Core/LittleBigMouse.Zones/ZoneLink.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
43 changes: 39 additions & 4 deletions LittleBigMouse.Hook/Engine/MouseEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,12 @@ void MouseEngine::OnMouseMoveCross(MouseEventArg& e)
}
#endif

if(_currentResistanceLink)
{
LOG_TRACE("< nullptr >");
_currentResistanceLink = nullptr;
}

_oldPoint = e.Point;
e.Handled = false;
return;
Expand Down Expand Up @@ -274,6 +280,7 @@ void MouseEngine::OnMouseMoveCross(MouseEventArg& e)
return;
}
}

LOG_TRACE(" - " << pInMmOld << pInMm << " - ");
NoZoneMatches(e);
}
Expand Down Expand Up @@ -306,6 +313,34 @@ bool MouseEngine::TryPassBorder(const ZoneLink* zoneLink, const double distance)
return false;
}

/// <summary>
/// Deal with border resistance
/// (Original idea by Kevin Mills https://github.com/mgfarmer/LittleBigMouse)
/// </summary>
/// <param name="zoneLink"></param>
/// <param name="distance"></param>
/// <returns></returns>
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;
}

/// <summary>
/// Process mouse move using strait algorithm (pre-calculated border links)
/// </summary>
Expand All @@ -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()) };
}
Expand All @@ -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()) };
}
Expand All @@ -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() };
}
Expand All @@ -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 };
}
Expand Down
2 changes: 2 additions & 0 deletions LittleBigMouse.Hook/Engine/MouseEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<long>& pOut, const Zone* zoneOut);
Expand All @@ -52,6 +53,7 @@ class MouseEngine

const ZoneLink* _currentResistanceLink = nullptr;
double _borderResistance = 0;
long _borderResistancePixel = 0;

public:
SIGNAL<void(std::string&)> OnMessage;
Expand Down
17 changes: 4 additions & 13 deletions LittleBigMouse.Hook/Engine/ZoneLink.cpp
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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),
Expand All @@ -63,6 +51,9 @@ ZoneLink::ZoneLink(
TargetFromPixel(targetFromPixel), TargetToPixel(targetToPixel),
BorderResistance(borderResistance)
{
if (BorderResistance <= 0) BorderResistance = 0;
else BorderResistancePixel = static_cast<long>((borderResistance / (To - From)) * (SourceToPixel - SourceFromPixel));

Target = nullptr;
Next = nullptr;
}
8 changes: 3 additions & 5 deletions LittleBigMouse.Hook/Engine/ZoneLink.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,16 @@ class ZoneLink
long TargetFromPixel;
long TargetToPixel;

long BorderResistance;
long ResistanceTravel;

bool TryPassThrough(long distance);
double BorderResistance;
long BorderResistancePixel;

//long SourceLengthPixel;
//long TargetLengthPixel;
[[nodiscard]] Zone* At(const double pos) const;
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;}
};

2 changes: 1 addition & 1 deletion LittleBigMouse.Hook/Engine/ZonesLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit dabf8c3

Please sign in to comment.