Skip to content

Commit

Permalink
Fix juice stream placement blueprint being initially visually offset
Browse files Browse the repository at this point in the history
- Closes #31423.
- Regressed in #30411.

Admittedly, I don't completely understand all of the pieces here,
because code quality of this placement blueprint code is ALL-CAPS
ATROCIOUS, but I believe the failure mode to be something along the
lines of:

- User activates juice stream tool, blueprint gets created in initial
  state. It reads in a mouse position far outside of the playfield, and
  sets internal positioning appropriately.
- When the user moves the mouse into the bounds of the playfield, some
  positions update (the ones inside `UpdateTimeAndPosition()`, but the
  fruit markers are for *nested* objects, and
  `updateHitObjectFromPath()` is responsible for updating those...
  however, it only fires if the `editablePath.PathId` changes, which it
  won't here, because there is only one path vertex until the user
  commits the starting point of the juice stream and it's always at
  (0,0).
- Therefore the position of the starting fruit marker remains bogus
  until left click, at which point the path changes and everything
  returns to *relative* sanity.

The solution essentially relies on inlining the broken method and only
guarding the relevant part of processing behind the path version check
(which is actually updating the path). Everything else that can touch
positions of nesteds (like default application, and the drawable piece
updates) is allowed to happen unconditionally.
  • Loading branch information
bdach committed Jan 9, 2025
1 parent e7070bd commit 18f1d62
Showing 1 changed file with 5 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,9 @@ public override void UpdateTimeAndPosition(SnapResult result)
switch (PlacementActive)
{
case PlacementState.Waiting:
if (!(result.Time is double snappedTime)) return;

HitObject.OriginalX = ToLocalSpace(result.ScreenSpacePosition).X;
HitObject.StartTime = snappedTime;
if (result.Time is double snappedTime)
HitObject.StartTime = snappedTime;
break;

case PlacementState.Active:
Expand All @@ -107,21 +106,13 @@ public override void UpdateTimeAndPosition(SnapResult result)
Vector2 startPosition = CatchHitObjectUtils.GetStartPosition(HitObjectContainer, HitObject);
editablePath.Position = nestedOutlineContainer.Position = scrollingPath.Position = startPosition;

updateHitObjectFromPath();
}

private void updateHitObjectFromPath()
{
if (lastEditablePathId == editablePath.PathId)
return;
if (lastEditablePathId != editablePath.PathId)
editablePath.UpdateHitObjectFromPath(HitObject);
lastEditablePathId = editablePath.PathId;

editablePath.UpdateHitObjectFromPath(HitObject);
ApplyDefaultsToHitObject();

scrollingPath.UpdatePathFrom(HitObjectContainer, HitObject);
nestedOutlineContainer.UpdateNestedObjectsFrom(HitObjectContainer, HitObject);

lastEditablePathId = editablePath.PathId;
}

private double positionToTime(float relativeYPosition)
Expand Down

0 comments on commit 18f1d62

Please sign in to comment.