fix: properly calculate shaking with rotate

This commit is contained in:
Virt 2024-06-27 20:24:37 +02:00
commit 359a66967c
3 changed files with 13 additions and 13 deletions

View file

@ -3,9 +3,9 @@ This plugin makes your cursor more realistic by simulating how it would behave i
Why did I implement this again? Why did I implement this again?
Inspired by KDE, it also supports shake to find, to enlarge the cursor when it is shaken so it is easier to find it. Inspired by KDE, it also supports shake to find, to enlarge the cursor when it is shaken so it is easier to find it. It can be enabled separately or together with one simulation mode.
### behaviour modes ### simulation modes
The plugin supports two different modes, `rotate` and `tilt`. They both are customizable and have a different base behaviour. The plugin supports two different modes, `rotate` and `tilt`. They both are customizable and have a different base behaviour.
#### `rotate` #### `rotate`
@ -14,12 +14,12 @@ In this mode, the cursor is simulated as a stick which is dragged across the scr
https://github.com/VirtCode/hypr-dynamic-cursor/assets/41426325/ccd6d742-8e2b-4073-a35e-318c7e19705c https://github.com/VirtCode/hypr-dynamic-cursor/assets/41426325/ccd6d742-8e2b-4073-a35e-318c7e19705c
#### `tilt` #### `tilt`
In this mode, the cursor is tilted based on the X direction and speed it is moving at. It was intended to simulate how an object would be affected by air drag, but implemented is only a rough approximation. This mode can also be customized extensively with different activation functions, and is enabled by default. In this mode, the cursor is tilted based on the `x` direction and speed it is moving at. It was intended to simulate how an object would be affected by air drag, but implemented is only a rough approximation. This mode can also be customized extensively with different activation functions, and is enabled by default.
https://github.com/VirtCode/hypr-dynamic-cursors/assets/41426325/ae25415c-e77f-4c85-864c-2eedbfe432e3 https://github.com/VirtCode/hypr-dynamic-cursors/assets/41426325/ae25415c-e77f-4c85-864c-2eedbfe432e3
### shake to find ### shake to find
The plugin supports shake to find, akin to how KDE Plasma, MacOS, etc. do it. It is enabled by default. The plugin supports shake to find, akin to how KDE Plasma, MacOS, etc. do it. It can also be extensively configured and is enabled by default. If you only want shake to find, and no weird cursor behaviour, you can disable the above modes with the mode `none`.
https://github.com/VirtCode/hypr-dynamic-cursors/assets/41426325/9ff64a9b-64e5-4595-b721-dcb4d62bee18 https://github.com/VirtCode/hypr-dynamic-cursors/assets/41426325/9ff64a9b-64e5-4595-b721-dcb4d62bee18

View file

@ -223,7 +223,7 @@ void CDynamicCursors::onCursorMoved(CPointerManager* pointers) {
} }
static auto const* PMODE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_MODE)->getDataStaticPtr(); static auto const* PMODE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_MODE)->getDataStaticPtr();
if (!strcmp(*PMODE, "rotate")) calculate(); if (!strcmp(*PMODE, "rotate")) calculate(false);
} }
/* /*
@ -233,17 +233,19 @@ void CDynamicCursors::onTick(CPointerManager* pointers) {
static auto const* PMODE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_MODE)->getDataStaticPtr(); static auto const* PMODE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_MODE)->getDataStaticPtr();
static auto* const* PSHAKE = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_SHAKE)->getDataStaticPtr(); static auto* const* PSHAKE = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_SHAKE)->getDataStaticPtr();
if (!strcmp(*PMODE, "tilt") || **PSHAKE) calculate(); if (!strcmp(*PMODE, "tilt") || **PSHAKE) calculate(true);
} }
void CDynamicCursors::calculate() { void CDynamicCursors::calculate(bool tick) {
static auto const* PMODE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_MODE)->getDataStaticPtr(); static auto const* PMODE = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_MODE)->getDataStaticPtr();
static auto* const* PTHRESHOLD = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_THRESHOLD)->getDataStaticPtr(); static auto* const* PTHRESHOLD = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_THRESHOLD)->getDataStaticPtr();
static auto* const* PSHAKE = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_SHAKE)->getDataStaticPtr(); static auto* const* PSHAKE = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_SHAKE)->getDataStaticPtr();
static auto* const* PSHAKE_EFFECTS = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_SHAKE_EFFECTS)->getDataStaticPtr(); static auto* const* PSHAKE_EFFECTS = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_SHAKE_EFFECTS)->getDataStaticPtr();
double zoom = 1; // only calculate zoom on tick
if (**PSHAKE) // yes, a refactor of this whole file would be a godsent
double zoom = tick ? 1 : this->zoom;
if (**PSHAKE && tick)
zoom = calculateShake(); zoom = calculateShake();
double angle = 0; double angle = 0;
@ -272,7 +274,7 @@ void CDynamicCursors::calculate() {
} }
} }
// we only consider the angle changed if it is larger than 1 degree // we only consider the angle changed if it is larger than the threshold
if (abs(this->angle - angle) > ((PI / 180) * **PTHRESHOLD) || abs(this->zoom - zoom) > 0.1 || (zoom == 1 && this->zoom != 1)) { if (abs(this->angle - angle) > ((PI / 180) * **PTHRESHOLD) || abs(this->zoom - zoom) > 0.1 || (zoom == 1 && this->zoom != 1)) {
this->angle = angle; this->angle = angle;
this->zoom = zoom; this->zoom = zoom;
@ -373,8 +375,6 @@ double CDynamicCursors::calculateShake() {
// discard when the diagonal is small, so we don't have issues with inaccuracies // discard when the diagonal is small, so we don't have issues with inaccuracies
if (diagonal < 100) return 1.0; if (diagonal < 100) return 1.0;
std::cout << trail << " " << diagonal << " " << (trail / diagonal) << "\n";
return std::max(1.0, ((trail / diagonal) - **PTHRESHOLD) * **PFACTOR); return std::max(1.0, ((trail / diagonal) - **PTHRESHOLD) * **PFACTOR);
} }

View file

@ -31,7 +31,7 @@ class CDynamicCursors {
bool software = false; bool software = false;
// calculates the current angle of the cursor, and changes the cursor shape // calculates the current angle of the cursor, and changes the cursor shape
void calculate(); void calculate(bool tick);
// calculate the angle of the cursor if stick // calculate the angle of the cursor if stick
double calculateStick(); double calculateStick();