1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-11-22 20:58:34 +01:00

made custom draw group only end and begin when it needs to

This commit is contained in:
Ellpeck 2020-03-02 10:31:03 +01:00
parent c92e4e0fd1
commit 612df004e6

View file

@ -1,3 +1,4 @@
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
@ -6,27 +7,40 @@ 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) {
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();
var trans = this.Transform ?? this.TransformGetter(this, time, matrix);
var mat = matrix * trans;
this.BeginImpl(this, time, batch, alpha, blendState, samplerState, mat);
}
// draw child components in custom begin call
base.Draw(time, batch, alpha, blendState, samplerState, mat);
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);