Closes https://github.com/ppy/osu/issues/32289.
There are two possible choices here: either pulling the lower bound of
the clamp down to `HitObject.Path.CalculatedDistance`, or pulling the
higher bound up to `minDistance`, if it happens to be larger than the
path's calculated distance.
Both options are a bit weird; pulling down can result in unsnapped
sliders when attempting to drag a slider's end when on a lower beat
divisor than was used to place the slider, and pulling up can result in
weird sliders wherein they get extended beyond their path's definition
with a weird linear section at the end without an anchor that is tangent
to the slider shape's end. I decided the first one was less weird, but
I'm open to discuss further.
Mainly an issue with "limit distance snap to current time". Reported in
https://discord.com/channels/90072389919997952/1259818301517725707/1369037235797753999.
This slightly changes behaviour of distance snap when the mouse is near
the edges of the screen (will turn off snap rather than clamp to edge as
previously), but I think that's probably fine.
See previous commit for partial rationale.
There's an argument to be made about the `NaN`-spreading semantics being
desirable because at least something will loudly fail in that case, but
I'm not so sure about that these days. It feels like either way if
`NaN`s are produced, then things are outside of any control, and chances
are the game can probably continue without crashing. And, this move
reduces our dependence on osuTK, which has already been living on
borrowed time for years now and is only awaiting someone brave to go
excise it.
Requested too many times to count.
I'm not sure what to do about the code quality of this. It's a bit weird
that there's no way to check the current composition tool from a higher
level.
Also it was discussed IRL that there should be some kind of hinting that
existing notes will be deleted when they are hovered, but I'm not sure
how well this will work in normal mapping flows, since it will display
even in cases that users aren't intending to delete an object. Still
willing to explore this direction though (it's just non-trivial to
implement so I haven't yet).
Closes https://github.com/ppy/osu/issues/31915.
Reproduction of aforementioned issue requires 1280x720 resolution, which
should also be a good way to confirm that this does anything.
To me this is also equal-parts-bugfix, equal-parts-code-quality PR,
because tell me: what on earth was this code ever doing at
`ComposeBlueprintContainer` level? Nudging by one playfield-space-unit
doesn't even *make sense* in something like taiko or mania.