Skip to content

Commit

Permalink
Merge pull request #29204 from smoogipoo/cursortrail-cross-thread-fix
Browse files Browse the repository at this point in the history
Submit vertices in local space to avoid cross-thread access
  • Loading branch information
peppy committed Jul 30, 2024
2 parents 71acb7e + ff7815c commit 8daeb8e
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions osu.Game.Rulesets.Osu/UI/Cursor/CursorTrail.cs
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,6 @@ private class TrailDrawNode : DrawNode
private float fadeExponent;

private readonly TrailPart[] parts = new TrailPart[max_sprites];
private Vector2 size;
private Vector2 originPosition;

private IVertexBatch<TexturedTrailVertex> vertexBatch;
Expand All @@ -236,7 +235,6 @@ public override void ApplyState()

shader = Source.shader;
texture = Source.texture;
size = Source.partSize;
time = Source.time;
fadeExponent = Source.FadeExponent;

Expand Down Expand Up @@ -277,6 +275,8 @@ protected override void Draw(IRenderer renderer)

RectangleF textureRect = texture.GetTextureRect();

renderer.PushLocalMatrix(DrawInfo.Matrix);

foreach (var part in parts)
{
if (part.InvalidationID == -1)
Expand All @@ -285,11 +285,9 @@ protected override void Draw(IRenderer renderer)
if (time - part.Time >= 1)
continue;

Vector2 screenSpacePos = Source.ToScreenSpace(part.Position);

vertexBatch.Add(new TexturedTrailVertex
{
Position = new Vector2(screenSpacePos.X - size.X * originPosition.X, screenSpacePos.Y + size.Y * (1 - originPosition.Y)),
Position = new Vector2(part.Position.X - texture.DisplayWidth * originPosition.X, part.Position.Y + texture.DisplayHeight * (1 - originPosition.Y)),
TexturePosition = textureRect.BottomLeft,
TextureRect = new Vector4(0, 0, 1, 1),
Colour = DrawColourInfo.Colour.BottomLeft.Linear,
Expand All @@ -298,7 +296,7 @@ protected override void Draw(IRenderer renderer)

vertexBatch.Add(new TexturedTrailVertex
{
Position = new Vector2(screenSpacePos.X + size.X * (1 - originPosition.X), screenSpacePos.Y + size.Y * (1 - originPosition.Y)),
Position = new Vector2(part.Position.X + texture.DisplayWidth * (1 - originPosition.X), part.Position.Y + texture.DisplayHeight * (1 - originPosition.Y)),
TexturePosition = textureRect.BottomRight,
TextureRect = new Vector4(0, 0, 1, 1),
Colour = DrawColourInfo.Colour.BottomRight.Linear,
Expand All @@ -307,7 +305,7 @@ protected override void Draw(IRenderer renderer)

vertexBatch.Add(new TexturedTrailVertex
{
Position = new Vector2(screenSpacePos.X + size.X * (1 - originPosition.X), screenSpacePos.Y - size.Y * originPosition.Y),
Position = new Vector2(part.Position.X + texture.DisplayWidth * (1 - originPosition.X), part.Position.Y - texture.DisplayHeight * originPosition.Y),
TexturePosition = textureRect.TopRight,
TextureRect = new Vector4(0, 0, 1, 1),
Colour = DrawColourInfo.Colour.TopRight.Linear,
Expand All @@ -316,14 +314,16 @@ protected override void Draw(IRenderer renderer)

vertexBatch.Add(new TexturedTrailVertex
{
Position = new Vector2(screenSpacePos.X - size.X * originPosition.X, screenSpacePos.Y - size.Y * originPosition.Y),
Position = new Vector2(part.Position.X - texture.DisplayWidth * originPosition.X, part.Position.Y - texture.DisplayHeight * originPosition.Y),
TexturePosition = textureRect.TopLeft,
TextureRect = new Vector4(0, 0, 1, 1),
Colour = DrawColourInfo.Colour.TopLeft.Linear,
Time = part.Time
});
}

renderer.PopLocalMatrix();

vertexBatch.Draw();
shader.Unbind();
}
Expand Down

0 comments on commit 8daeb8e

Please sign in to comment.