mirror of
https://github.com/Ellpeck/MLEM.git
synced 2024-11-22 20:58:34 +01:00
added CustomDrawGroup which allows for components to have their own draw call
This commit is contained in:
parent
4a7fcd7570
commit
20d7b95891
2 changed files with 39 additions and 2 deletions
32
MLEM.Ui/Elements/CustomDrawGroup.cs
Normal file
32
MLEM.Ui/Elements/CustomDrawGroup.cs
Normal file
|
@ -0,0 +1,32 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace MLEM.Ui.Elements {
|
||||
public class CustomDrawGroup : Group {
|
||||
|
||||
public Matrix Transform;
|
||||
public BeginDelegate BeginImpl;
|
||||
|
||||
public CustomDrawGroup(Anchor anchor, Vector2 size, Matrix? transform = null, BeginDelegate beginImpl = null, bool setHeightBasedOnChildren = true) :
|
||||
base(anchor, size, setHeightBasedOnChildren) {
|
||||
this.Transform = transform ?? Matrix.Identity;
|
||||
this.BeginImpl = beginImpl ?? ((time, batch, alpha, blendState, samplerState, matrix) => batch.Begin(SpriteSortMode.Deferred, blendState, samplerState, null, null, null, matrix));
|
||||
}
|
||||
|
||||
public delegate void BeginDelegate(GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, Matrix matrix);
|
||||
|
||||
public override void Draw(GameTime time, SpriteBatch batch, float alpha) {
|
||||
// this is left empty because child components are drawn in DrawEarly
|
||||
}
|
||||
|
||||
public override void DrawEarly(GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, Matrix matrix) {
|
||||
var mat = matrix * this.Transform;
|
||||
this.BeginImpl(time, batch, alpha, blendState, samplerState, mat);
|
||||
// draw child components in custom begin call
|
||||
base.Draw(time, batch, alpha);
|
||||
batch.End();
|
||||
base.DrawEarly(time, batch, alpha, blendState, samplerState, mat);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -110,13 +110,18 @@ namespace MLEM.Ui.Elements {
|
|||
batch.GraphicsDevice.Clear(Color.Transparent);
|
||||
// offset children by the render target's location
|
||||
var area = this.GetRenderTargetArea();
|
||||
batch.Begin(SpriteSortMode.Deferred, blendState, samplerState, null, null, null, Matrix.CreateTranslation(-area.X, -area.Y, 0));
|
||||
var trans = Matrix.CreateTranslation(-area.X, -area.Y, 0);
|
||||
// do the usual draw, but within the render target
|
||||
batch.Begin(SpriteSortMode.Deferred, blendState, samplerState, null, null, null, trans);
|
||||
base.Draw(time, batch, alpha);
|
||||
batch.End();
|
||||
// also draw any children early within the render target with the translation applied
|
||||
base.DrawEarly(time, batch, alpha, blendState, samplerState, matrix * trans);
|
||||
batch.GraphicsDevice.SetRenderTarget(null);
|
||||
}
|
||||
} else {
|
||||
base.DrawEarly(time, batch, alpha, blendState, samplerState, matrix);
|
||||
}
|
||||
}
|
||||
|
||||
public override Element GetElementUnderPos(Point position) {
|
||||
// if overflow is handled, don't propagate mouse checks to hidden children
|
||||
|
|
Loading…
Reference in a new issue