A game framework written with osu! in mind.
fork

Configure Feed

Select the types of activity you want to include in your feed.

Normalize negative masking rectangle

So the shader code doesn't have to handle negative rectangle case.

ekrctb 45d33827 f5639b9e

+7 -8
+2 -5
osu.Framework/Graphics/Containers/CompositeDrawable_DrawNode.cs
··· 90 90 : new MaskingInfo 91 91 { 92 92 ScreenSpaceAABB = Source.ScreenSpaceDrawQuad.AABB, 93 - MaskingRect = Source.DrawRectangle, 93 + MaskingRect = Source.DrawRectangle.Normalize(), 94 94 ConservativeScreenSpaceQuad = Quad.FromRectangle(shrunkDrawRectangle) * DrawInfo.Matrix, 95 95 ToMaskingSpace = DrawInfo.MatrixInverse, 96 96 CornerRadius = Source.effectiveCornerRadius, ··· 118 118 if (maskingInfo == null || edgeEffect.Type == EdgeEffectType.None || edgeEffect.Radius <= 0.0f || edgeEffect.Colour.Linear.A <= 0) 119 119 return; 120 120 121 - var maskingRect = maskingInfo.Value.MaskingRect; 122 - RectangleF effectRect = maskingRect 123 - .Inflate(edgeEffect.Radius * new Vector2(maskingRect.Width >= 0 ? 1 : -1, maskingRect.Height >= 0 ? 1 : -1)) 124 - .Offset(edgeEffect.Offset); 121 + RectangleF effectRect = maskingInfo.Value.MaskingRect.Inflate(edgeEffect.Radius).Offset(edgeEffect.Offset); 125 122 126 123 screenSpaceMaskingQuad ??= Quad.FromRectangle(effectRect) * DrawInfo.Matrix; 127 124
+5 -3
osu.Framework/Resources/Shaders/sh_Masking.h
··· 23 23 highp vec2 maskingPosition = v_MaskingPosition + offset; 24 24 25 25 // Compute offset distance from masking rect in masking space. 26 - highp vec2 topLeftOffset = min(g_MaskingRect.xy, g_MaskingRect.zw) - maskingPosition; 27 - highp vec2 bottomRightOffset = maskingPosition - max(g_MaskingRect.xy, g_MaskingRect.zw); 26 + highp vec2 topLeftOffset = g_MaskingRect.xy - maskingPosition; 27 + highp vec2 bottomRightOffset = maskingPosition - g_MaskingRect.zw; 28 28 29 - highp vec2 distanceFromShrunkRect = max(bottomRightOffset, topLeftOffset) + vec2(radius); 29 + highp vec2 distanceFromShrunkRect = max( 30 + bottomRightOffset + vec2(radius), 31 + topLeftOffset + vec2(radius)); 30 32 31 33 highp float maxDist = max(distanceFromShrunkRect.x, distanceFromShrunkRect.y); 32 34