diff --git a/MLEM.Ui/Elements/CustomDrawGroup.cs b/MLEM.Ui/Elements/CustomDrawGroup.cs index bb19d19..43651d5 100644 --- a/MLEM.Ui/Elements/CustomDrawGroup.cs +++ b/MLEM.Ui/Elements/CustomDrawGroup.cs @@ -1,3 +1,4 @@ +using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; @@ -6,26 +7,39 @@ namespace MLEM.Ui.Elements { public Matrix? Transform; public TransformCallback TransformGetter; - public BeginDelegate BeginImpl; + private BeginDelegate beginImpl; + private bool isDefaultBegin; + public BeginDelegate BeginImpl { + get => this.beginImpl; + set { + this.beginImpl = value ?? ((element, time, batch, alpha, blendState, samplerState, matrix) => batch.Begin(SpriteSortMode.Deferred, blendState, samplerState, null, null, null, matrix)); + this.isDefaultBegin = value == null; + } + } public CustomDrawGroup(Anchor anchor, Vector2 size, TransformCallback transformGetter = null, BeginDelegate beginImpl = null, bool setHeightBasedOnChildren = true) : base(anchor, size, setHeightBasedOnChildren) { this.TransformGetter = transformGetter ?? ((element, time, matrix) => Matrix.Identity); - this.BeginImpl = beginImpl ?? ((element, time, batch, alpha, blendState, samplerState, matrix) => batch.Begin(SpriteSortMode.Deferred, blendState, samplerState, null, null, null, matrix)); + this.BeginImpl = beginImpl; } public override void Draw(GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, Matrix matrix) { - // end the usual draw so that we can begin our own - batch.End(); - var trans = this.Transform ?? this.TransformGetter(this, time, matrix); - var mat = matrix * trans; - this.BeginImpl(this, time, batch, alpha, blendState, samplerState, mat); + var transform = this.Transform ?? this.TransformGetter(this, time, matrix); + var customDraw = !this.isDefaultBegin || transform != Matrix.Identity; + var mat = matrix * transform; + if (customDraw) { + // end the usual draw so that we can begin our own + batch.End(); + this.BeginImpl(this, time, batch, alpha, blendState, samplerState, mat); + } // draw child components in custom begin call base.Draw(time, batch, alpha, blendState, samplerState, mat); - // end our draw - batch.End(); - // begin the usual draw again for other elements - batch.Begin(SpriteSortMode.Deferred, blendState, samplerState, null, null, null, matrix); + if (customDraw) { + // end our draw + batch.End(); + // begin the usual draw again for other elements + batch.Begin(SpriteSortMode.Deferred, blendState, samplerState, null, null, null, matrix); + } } public delegate void BeginDelegate(CustomDrawGroup element, GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, Matrix matrix);