1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-21 03:02:54 +08:00

Separate the two nested classes

This commit is contained in:
Henry Lin 2022-03-14 20:18:30 +08:00
parent 5e36383258
commit 6657d93b29

View File

@ -60,12 +60,12 @@ namespace osu.Game.Rulesets.Osu.Utils
/// <returns>The repositioned hit objects.</returns> /// <returns>The repositioned hit objects.</returns>
public static List<OsuHitObject> RepositionHitObjects(IEnumerable<ObjectPositionInfo> objectPositionInfos) public static List<OsuHitObject> RepositionHitObjects(IEnumerable<ObjectPositionInfo> objectPositionInfos)
{ {
List<ObjectPositionInfoInternal> positionInfos = objectPositionInfos.Select(o => new ObjectPositionInfoInternal(o)).ToList(); List<WorkingObject> workingObjects = objectPositionInfos.Select(o => new WorkingObject(o)).ToList();
ObjectPositionInfoInternal? previous = null; WorkingObject? previous = null;
for (int i = 0; i < positionInfos.Count; i++) for (int i = 0; i < workingObjects.Count; i++)
{ {
var current = positionInfos[i]; var current = workingObjects[i];
var hitObject = current.HitObject; var hitObject = current.HitObject;
if (hitObject is Spinner) if (hitObject is Spinner)
@ -74,7 +74,7 @@ namespace osu.Game.Rulesets.Osu.Utils
continue; continue;
} }
computeModifiedPosition(current, previous, i > 1 ? positionInfos[i - 2] : null); computeModifiedPosition(current, previous, i > 1 ? workingObjects[i - 2] : null);
// Move hit objects back into the playfield if they are outside of it // Move hit objects back into the playfield if they are outside of it
Vector2 shift = Vector2.Zero; Vector2 shift = Vector2.Zero;
@ -97,9 +97,9 @@ namespace osu.Game.Rulesets.Osu.Utils
for (int j = i - 1; j >= i - preceding_hitobjects_to_shift && j >= 0; j--) for (int j = i - 1; j >= i - preceding_hitobjects_to_shift && j >= 0; j--)
{ {
// only shift hit circles // only shift hit circles
if (!(positionInfos[j].HitObject is HitCircle)) break; if (!(workingObjects[j].HitObject is HitCircle)) break;
toBeShifted.Add(positionInfos[j].HitObject); toBeShifted.Add(workingObjects[j].HitObject);
} }
if (toBeShifted.Count > 0) if (toBeShifted.Count > 0)
@ -109,16 +109,16 @@ namespace osu.Game.Rulesets.Osu.Utils
previous = current; previous = current;
} }
return positionInfos.Select(p => p.HitObject).ToList(); return workingObjects.Select(p => p.HitObject).ToList();
} }
/// <summary> /// <summary>
/// Compute the modified position of a hit object while attempting to keep it inside the playfield. /// Compute the modified position of a hit object while attempting to keep it inside the playfield.
/// </summary> /// </summary>
/// <param name="current">The <see cref="ObjectPositionInfoInternal"/> representing the hit object to have the modified position computed for.</param> /// <param name="current">The <see cref="WorkingObject"/> representing the hit object to have the modified position computed for.</param>
/// <param name="previous">The <see cref="ObjectPositionInfoInternal"/> representing the hit object immediately preceding the current one.</param> /// <param name="previous">The <see cref="WorkingObject"/> representing the hit object immediately preceding the current one.</param>
/// <param name="beforePrevious">The <see cref="ObjectPositionInfoInternal"/> representing the hit object immediately preceding the <paramref name="previous"/> one.</param> /// <param name="beforePrevious">The <see cref="WorkingObject"/> representing the hit object immediately preceding the <paramref name="previous"/> one.</param>
private static void computeModifiedPosition(ObjectPositionInfoInternal current, ObjectPositionInfoInternal? previous, ObjectPositionInfoInternal? beforePrevious) private static void computeModifiedPosition(WorkingObject current, WorkingObject? previous, WorkingObject? beforePrevious)
{ {
float previousAbsoluteAngle = 0f; float previousAbsoluteAngle = 0f;
@ -129,11 +129,11 @@ namespace osu.Game.Rulesets.Osu.Utils
previousAbsoluteAngle = (float)Math.Atan2(relativePosition.Y, relativePosition.X); previousAbsoluteAngle = (float)Math.Atan2(relativePosition.Y, relativePosition.X);
} }
float absoluteAngle = previousAbsoluteAngle + current.RelativeAngle; float absoluteAngle = previousAbsoluteAngle + current.PositionInfo.RelativeAngle;
var posRelativeToPrev = new Vector2( var posRelativeToPrev = new Vector2(
current.DistanceFromPrevious * (float)Math.Cos(absoluteAngle), current.PositionInfo.DistanceFromPrevious * (float)Math.Cos(absoluteAngle),
current.DistanceFromPrevious * (float)Math.Sin(absoluteAngle) current.PositionInfo.DistanceFromPrevious * (float)Math.Sin(absoluteAngle)
); );
Vector2 lastEndPosition = previous?.EndPositionModified ?? playfield_centre; Vector2 lastEndPosition = previous?.EndPositionModified ?? playfield_centre;
@ -147,7 +147,7 @@ namespace osu.Game.Rulesets.Osu.Utils
/// Move the modified position of a hit circle so that it fits inside the playfield. /// Move the modified position of a hit circle so that it fits inside the playfield.
/// </summary> /// </summary>
/// <returns>The deviation from the original modified position in order to fit within the playfield.</returns> /// <returns>The deviation from the original modified position in order to fit within the playfield.</returns>
private static Vector2 clampHitCircleToPlayfield(HitCircle circle, ObjectPositionInfoInternal objectPositionInfo) private static Vector2 clampHitCircleToPlayfield(HitCircle circle, WorkingObject objectPositionInfo)
{ {
var previousPosition = objectPositionInfo.PositionModified; var previousPosition = objectPositionInfo.PositionModified;
objectPositionInfo.EndPositionModified = objectPositionInfo.PositionModified = clampToPlayfieldWithPadding( objectPositionInfo.EndPositionModified = objectPositionInfo.PositionModified = clampToPlayfieldWithPadding(
@ -164,7 +164,7 @@ namespace osu.Game.Rulesets.Osu.Utils
/// Moves the <see cref="Slider"/> and all necessary nested <see cref="OsuHitObject"/>s into the <see cref="OsuPlayfield"/> if they aren't already. /// Moves the <see cref="Slider"/> and all necessary nested <see cref="OsuHitObject"/>s into the <see cref="OsuPlayfield"/> if they aren't already.
/// </summary> /// </summary>
/// <returns>The deviation from the original modified position in order to fit within the playfield.</returns> /// <returns>The deviation from the original modified position in order to fit within the playfield.</returns>
private static Vector2 clampSliderToPlayfield(Slider slider, ObjectPositionInfoInternal objectPositionInfo) private static Vector2 clampSliderToPlayfield(Slider slider, WorkingObject objectPositionInfo)
{ {
var possibleMovementBounds = calculatePossibleMovementBounds(slider); var possibleMovementBounds = calculatePossibleMovementBounds(slider);
@ -319,17 +319,18 @@ namespace osu.Game.Rulesets.Osu.Utils
} }
} }
private class ObjectPositionInfoInternal : ObjectPositionInfo private class WorkingObject
{ {
public Vector2 PositionOriginal { get; } public Vector2 PositionOriginal { get; }
public Vector2 PositionModified { get; set; } public Vector2 PositionModified { get; set; }
public Vector2 EndPositionModified { get; set; } public Vector2 EndPositionModified { get; set; }
public ObjectPositionInfoInternal(ObjectPositionInfo original) public ObjectPositionInfo PositionInfo { get; }
: base(original.HitObject) public OsuHitObject HitObject => PositionInfo.HitObject;
public WorkingObject(ObjectPositionInfo positionInfo)
{ {
RelativeAngle = original.RelativeAngle; PositionInfo = positionInfo;
DistanceFromPrevious = original.DistanceFromPrevious;
PositionModified = PositionOriginal = HitObject.Position; PositionModified = PositionOriginal = HitObject.Position;
EndPositionModified = HitObject.EndPosition; EndPositionModified = HitObject.EndPosition;
} }