diff --git a/osu.Game/Graphics/Backgrounds/Triangles.cs b/osu.Game/Graphics/Backgrounds/Triangles.cs
index 9a19819af8..7a2345a80c 100644
--- a/osu.Game/Graphics/Backgrounds/Triangles.cs
+++ b/osu.Game/Graphics/Backgrounds/Triangles.cs
@@ -23,6 +23,13 @@ namespace osu.Game.Graphics.Backgrounds
public class Triangles : Drawable
{
private const float triangle_size = 100;
+ private const float base_velocity = 50;
+
+ ///
+ /// How many screen-space pixels are smoothed over.
+ /// Same behavior as Sprite's EdgeSmoothness.
+ ///
+ private const float edge_smoothness = 1;
public override bool HandleInput => false;
@@ -103,31 +110,34 @@ namespace osu.Game.Graphics.Backgrounds
Invalidate(Invalidation.DrawNode, shallPropagate: false);
+ if (CreateNewTriangles)
+ addTriangles(false);
+
+ float adjustedAlpha = HideAlphaDiscrepancies ?
+ // Cubically scale alpha to make it drop off more sharply.
+ (float)Math.Pow(DrawInfo.Colour.AverageColour.Linear.A, 3) :
+ 1;
+
+ float elapsedSeconds = (float)Time.Elapsed / 1000;
+ // Since position is relative, the velocity needs to scale inversely with DrawHeight.
+ // Since we will later multiply by the scale of individual triangles we normalize by
+ // dividing by triangleScale.
+ float movedDistance = -elapsedSeconds * Velocity * base_velocity / (DrawHeight * triangleScale);
+
for (int i = 0; i < parts.Count; i++)
{
TriangleParticle newParticle = parts[i];
- float adjustedAlpha = HideAlphaDiscrepancies ?
- // Cubically scale alpha to make it drop off more sharply.
- (float)Math.Pow(DrawInfo.Colour.AverageColour.Linear.A, 3) :
- 1;
-
-
- newParticle.Position += new Vector2(0, -(parts[i].Scale * (50 / DrawHeight)) / triangleScale * Velocity) * ((float)Time.Elapsed / 950);
+ // Scale moved distance by the size of the triangle. Smaller triangles should move more slowly.
+ newParticle.Position.Y += parts[i].Scale * movedDistance;
newParticle.Colour.A = adjustedAlpha;
parts[i] = newParticle;
- if (!CreateNewTriangles)
- continue;
-
float bottomPos = parts[i].Position.Y + triangle_size * parts[i].Scale * 0.866f / DrawHeight;
-
if (bottomPos < 0)
parts.RemoveAt(i);
}
-
- addTriangles(false);
}
private void addTriangles(bool randomY)
@@ -211,20 +221,28 @@ namespace osu.Game.Graphics.Backgrounds
Shader.Bind();
Texture.TextureGL.Bind();
+ Vector2 localInflationAmount = edge_smoothness * DrawInfo.MatrixInverse.ExtractScale().Xy;
+
foreach (TriangleParticle particle in Parts)
{
- var offset = new Vector2(particle.Scale * 0.5f, particle.Scale * 0.866f);
+ var offset = triangle_size * new Vector2(particle.Scale * 0.5f, particle.Scale * 0.866f);
+ var size = new Vector2(2 * offset.X, offset.Y);
var triangle = new Triangle(
particle.Position * Size * DrawInfo.Matrix,
- (particle.Position * Size + offset * triangle_size) * DrawInfo.Matrix,
- (particle.Position * Size + new Vector2(-offset.X, offset.Y) * triangle_size) * DrawInfo.Matrix
+ (particle.Position * Size + offset) * DrawInfo.Matrix,
+ (particle.Position * Size + new Vector2(-offset.X, offset.Y)) * DrawInfo.Matrix
);
ColourInfo colourInfo = DrawInfo.Colour;
colourInfo.ApplyChild(particle.Colour);
- Texture.DrawTriangle(triangle, colourInfo, null, Shared.VertexBatch.Add);
+ Texture.DrawTriangle(
+ triangle,
+ colourInfo,
+ null,
+ Shared.VertexBatch.Add,
+ Vector2.Divide(localInflationAmount, size));
}
Shader.Unbind();
diff --git a/osu.Game/Overlays/Chat/ChatTabControl.cs b/osu.Game/Overlays/Chat/ChatTabControl.cs
index 57447f1913..a281cff7db 100644
--- a/osu.Game/Overlays/Chat/ChatTabControl.cs
+++ b/osu.Game/Overlays/Chat/ChatTabControl.cs
@@ -14,6 +14,7 @@ using osu.Game.Graphics.UserInterface;
using osu.Game.Online.Chat;
using OpenTK;
using OpenTK.Graphics;
+using osu.Framework.Configuration;
namespace osu.Game.Overlays.Chat
{
@@ -23,6 +24,8 @@ namespace osu.Game.Overlays.Chat
private const float shear_width = 10;
+ public readonly Bindable ChannelSelectorActive = new Bindable();
+
public ChatTabControl()
{
TabContainer.Margin = new MarginPadding { Left = 50 };
@@ -37,6 +40,8 @@ namespace osu.Game.Overlays.Chat
TextSize = 20,
Padding = new MarginPadding(10),
});
+
+ AddTabItem(new ChannelTabItem.ChannelSelectorTabItem(new Channel { Name = "+" }, ChannelSelectorActive));
}
private class ChannelTabItem : TabItem
@@ -49,6 +54,7 @@ namespace osu.Game.Overlays.Chat
private readonly SpriteText textBold;
private readonly Box box;
private readonly Box highlightBox;
+ private readonly TextAwesome icon;
public override bool Active
{
@@ -114,6 +120,11 @@ namespace osu.Game.Overlays.Chat
backgroundHover = colours.Gray7;
highlightBox.Colour = colours.Yellow;
+ }
+
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
updateState();
}
@@ -159,7 +170,7 @@ namespace osu.Game.Overlays.Chat
RelativeSizeAxes = Axes.Both,
Children = new Drawable[]
{
- new TextAwesome
+ icon = new TextAwesome
{
Icon = FontAwesome.fa_hashtag,
Anchor = Anchor.CentreLeft,
@@ -191,6 +202,40 @@ namespace osu.Game.Overlays.Chat
}
};
}
+
+ public class ChannelSelectorTabItem : ChannelTabItem
+ {
+ public override bool Active
+ {
+ get { return base.Active; }
+ set
+ {
+ activeBindable.Value = value;
+ base.Active = value;
+ }
+ }
+
+ private readonly Bindable activeBindable;
+
+ public ChannelSelectorTabItem(Channel value, Bindable active) : base(value)
+ {
+ activeBindable = active;
+ Depth = float.MaxValue;
+ Width = 45;
+
+ icon.Alpha = 0;
+
+ text.TextSize = 45;
+ textBold.TextSize = 45;
+ }
+
+ [BackgroundDependencyLoader]
+ private new void load(OsuColour colour)
+ {
+ backgroundInactive = colour.Gray2;
+ backgroundActive = colour.Gray3;
+ }
+ }
}
}
}
diff --git a/osu.Game/Overlays/ChatOverlay.cs b/osu.Game/Overlays/ChatOverlay.cs
index 304350b57f..831cccf2d8 100644
--- a/osu.Game/Overlays/ChatOverlay.cs
+++ b/osu.Game/Overlays/ChatOverlay.cs
@@ -301,6 +301,8 @@ namespace osu.Game.Overlays
{
if (currentChannel == value) return;
+ if (channelTabs.ChannelSelectorActive) return;
+
if (currentChannel != null)
currentChannelContainer.Clear(false);