From 4e2ae72126c304ccbaa69d9ef170370be53889c2 Mon Sep 17 00:00:00 2001 From: smoogipooo Date: Wed, 12 Apr 2017 12:03:51 +0900 Subject: [PATCH] Implement proper masking support for taiko hit objects. --- osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs | 36 ++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs b/osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs index db3a1bc84e..5e5344eb6f 100644 --- a/osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs +++ b/osu.Game.Modes.Taiko/UI/TaikoPlayfield.cs @@ -17,6 +17,7 @@ using osu.Framework.Graphics.Primitives; using System.Linq; using osu.Game.Modes.Taiko.Objects.Drawables; using System; +using osu.Framework.Graphics.OpenGL; namespace osu.Game.Modes.Taiko.UI { @@ -111,9 +112,11 @@ namespace osu.Game.Modes.Taiko.UI Anchor = Anchor.CentreLeft, Origin = Anchor.Centre, }, - hitObjectContainer = new Container + hitObjectContainer = new ExternalMaskingRectangleContainer { RelativeSizeAxes = Axes.Both, + Masking = true, + MaskingReference = () => this }, judgementContainer = new Container { @@ -269,5 +272,36 @@ namespace osu.Game.Modes.Taiko.UI } } } + + private class ExternalMaskingRectangleContainer : Container + { + public Func MaskingReference; + + protected override void ApplyDrawNode(DrawNode node) + { + base.ApplyDrawNode(node); + + Drawable maskingReference = MaskingReference?.Invoke(); + + if (MaskingReference == null) + return; + + var cn = node as ContainerDrawNode; + + cn.MaskingInfo = !Masking + ? (MaskingInfo?)null + : new MaskingInfo + { + ScreenSpaceAABB = maskingReference.ScreenSpaceDrawQuad.AABB, + MaskingRect = maskingReference.DrawRectangle, + ToMaskingSpace = cn.MaskingInfo.Value.ToMaskingSpace, + CornerRadius = cn.MaskingInfo.Value.CornerRadius, + BorderThickness = cn.MaskingInfo.Value.BorderThickness, + BorderColour = cn.MaskingInfo.Value.BorderColour, + BlendRange = cn.MaskingInfo.Value.BlendRange, + AlphaExponent = cn.MaskingInfo.Value.AlphaExponent + }; + } + } } } \ No newline at end of file