mirror of
https://github.com/Ellpeck/MLEM.git
synced 2024-11-22 12:58:33 +01:00
render panel's render target in the Draw method
This commit is contained in:
parent
6a3c797eba
commit
94dec34470
4 changed files with 25 additions and 22 deletions
|
@ -73,7 +73,8 @@ Fixes
|
||||||
|
|
||||||
Removals
|
Removals
|
||||||
- Marked StyleProp equality members as obsolete
|
- Marked StyleProp equality members as obsolete
|
||||||
- Marked BeginDelegate and BeginImpl as obsolete
|
- Marked Element.BeginDelegate and Element.BeginImpl as obsolete
|
||||||
|
- Marked Element.DrawEarly and UiSystem.DrawEarly as obsolete
|
||||||
|
|
||||||
### MLEM.Extended
|
### MLEM.Extended
|
||||||
Improvements
|
Improvements
|
||||||
|
|
|
@ -185,7 +185,7 @@ namespace MLEM.Ui.Elements {
|
||||||
/// Note that, when this is non-null, a new <see cref="SpriteBatch.Begin"/> call is used for this element.
|
/// Note that, when this is non-null, a new <see cref="SpriteBatch.Begin"/> call is used for this element.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
#pragma warning disable CS0618
|
#pragma warning disable CS0618
|
||||||
[Obsolete("BeginImpl is deprecated. You can create a custom element class and override DrawEarly or Draw instead.")]
|
[Obsolete("BeginImpl is deprecated. You can create a custom element class and override Draw instead.")]
|
||||||
public BeginDelegate BeginImpl;
|
public BeginDelegate BeginImpl;
|
||||||
#pragma warning restore CS0618
|
#pragma warning restore CS0618
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -990,6 +990,7 @@ namespace MLEM.Ui.Elements {
|
||||||
/// <param name="effect">The effect that is used for drawing</param>
|
/// <param name="effect">The effect that is used for drawing</param>
|
||||||
/// <param name="depthStencilState">The depth stencil state that is used for drawing</param>
|
/// <param name="depthStencilState">The depth stencil state that is used for drawing</param>
|
||||||
/// <param name="matrix">The transformation matrix that is used for drawing</param>
|
/// <param name="matrix">The transformation matrix that is used for drawing</param>
|
||||||
|
[Obsolete("DrawEarly is deprecated. For custom implementations, see Panel.Draw for how to replace this method.")]
|
||||||
public virtual void DrawEarly(GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, DepthStencilState depthStencilState, Effect effect, Matrix matrix) {
|
public virtual void DrawEarly(GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, DepthStencilState depthStencilState, Effect effect, Matrix matrix) {
|
||||||
foreach (var child in this.GetRelevantChildren()) {
|
foreach (var child in this.GetRelevantChildren()) {
|
||||||
if (!child.IsHidden)
|
if (!child.IsHidden)
|
||||||
|
@ -1168,7 +1169,7 @@ namespace MLEM.Ui.Elements {
|
||||||
/// <param name="effect">The effect used for drawing</param>
|
/// <param name="effect">The effect used for drawing</param>
|
||||||
/// <param name="depthStencilState">The depth stencil state used for drawing</param>
|
/// <param name="depthStencilState">The depth stencil state used for drawing</param>
|
||||||
/// <param name="matrix">The transform matrix used for drawing</param>
|
/// <param name="matrix">The transform matrix used for drawing</param>
|
||||||
[Obsolete("BeginDelegate is deprecated. You can create a custom element class and override DrawEarly or Draw instead.")]
|
[Obsolete("BeginDelegate is deprecated. You can create a custom element class and override Draw instead.")]
|
||||||
public delegate void BeginDelegate(Element element, GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, DepthStencilState depthStencilState, Effect effect, Matrix matrix);
|
public delegate void BeginDelegate(Element element, GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, DepthStencilState depthStencilState, Effect effect, Matrix matrix);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ namespace MLEM.Ui.Elements {
|
||||||
/// A panel element to be used inside of a <see cref="UiSystem"/>.
|
/// A panel element to be used inside of a <see cref="UiSystem"/>.
|
||||||
/// The panel is a complex element that displays a box as a background to all of its child elements.
|
/// The panel is a complex element that displays a box as a background to all of its child elements.
|
||||||
/// Additionally, a panel can be set to <see cref="scrollOverflow"/> on construction, which causes all elements that don't fit into the panel to be hidden until scrolled to using a <see cref="ScrollBar"/>.
|
/// Additionally, a panel can be set to <see cref="scrollOverflow"/> on construction, which causes all elements that don't fit into the panel to be hidden until scrolled to using a <see cref="ScrollBar"/>.
|
||||||
/// As this behavior is accomplished using a <see cref="RenderTarget2D"/>, scrolling panels need to have their <see cref="DrawEarly"/> methods called using <see cref="UiSystem.DrawEarly"/>.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class Panel : Element {
|
public class Panel : Element {
|
||||||
|
|
||||||
|
@ -169,22 +168,13 @@ namespace MLEM.Ui.Elements {
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void Draw(GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, DepthStencilState depthStencilState, Effect effect, Matrix matrix) {
|
public override void Draw(GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, DepthStencilState depthStencilState, Effect effect, Matrix matrix) {
|
||||||
if (this.Texture.HasValue())
|
// draw children onto the render target if we have one
|
||||||
batch.Draw(this.Texture, this.DisplayArea, this.DrawColor.OrDefault(Color.White) * alpha, this.Scale);
|
|
||||||
// if we handle overflow, draw using the render target in DrawUnbound
|
|
||||||
if (!this.scrollOverflow || this.renderTarget == null) {
|
|
||||||
base.Draw(time, batch, alpha, blendState, samplerState, depthStencilState, effect, matrix);
|
|
||||||
} else {
|
|
||||||
// draw the actual render target (don't apply the alpha here because it's already drawn onto with alpha)
|
|
||||||
batch.Draw(this.renderTarget, this.GetRenderTargetArea(), Color.White);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override void DrawEarly(GameTime time, SpriteBatch batch, float alpha, BlendState blendState, SamplerState samplerState, DepthStencilState depthStencilState, Effect effect, Matrix matrix) {
|
|
||||||
this.UpdateAreaIfDirty();
|
|
||||||
if (this.scrollOverflow && this.renderTarget != null) {
|
if (this.scrollOverflow && this.renderTarget != null) {
|
||||||
// draw children onto the render target
|
this.UpdateAreaIfDirty();
|
||||||
|
batch.End();
|
||||||
|
// force render target usage to preserve so that previous content isn't cleared
|
||||||
|
var lastUsage = batch.GraphicsDevice.PresentationParameters.RenderTargetUsage;
|
||||||
|
batch.GraphicsDevice.PresentationParameters.RenderTargetUsage = RenderTargetUsage.PreserveContents;
|
||||||
using (batch.GraphicsDevice.WithRenderTarget(this.renderTarget)) {
|
using (batch.GraphicsDevice.WithRenderTarget(this.renderTarget)) {
|
||||||
batch.GraphicsDevice.Clear(Color.Transparent);
|
batch.GraphicsDevice.Clear(Color.Transparent);
|
||||||
// offset children by the render target's location
|
// offset children by the render target's location
|
||||||
|
@ -195,8 +185,19 @@ namespace MLEM.Ui.Elements {
|
||||||
base.Draw(time, batch, alpha, blendState, samplerState, depthStencilState, effect, trans);
|
base.Draw(time, batch, alpha, blendState, samplerState, depthStencilState, effect, trans);
|
||||||
batch.End();
|
batch.End();
|
||||||
}
|
}
|
||||||
|
batch.GraphicsDevice.PresentationParameters.RenderTargetUsage = lastUsage;
|
||||||
|
batch.Begin(SpriteSortMode.Deferred, blendState, samplerState, depthStencilState, null, effect, matrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.Texture.HasValue())
|
||||||
|
batch.Draw(this.Texture, this.DisplayArea, this.DrawColor.OrDefault(Color.White) * alpha, this.Scale);
|
||||||
|
// if we handle overflow, draw using the render target in DrawUnbound
|
||||||
|
if (!this.scrollOverflow || this.renderTarget == null) {
|
||||||
|
base.Draw(time, batch, alpha, blendState, samplerState, depthStencilState, effect, matrix);
|
||||||
|
} else {
|
||||||
|
// draw the actual render target (don't apply the alpha here because it's already drawn onto with alpha)
|
||||||
|
batch.Draw(this.renderTarget, this.GetRenderTargetArea(), Color.White);
|
||||||
}
|
}
|
||||||
base.DrawEarly(time, batch, alpha, blendState, samplerState, depthStencilState, effect, matrix);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|
|
@ -105,7 +105,7 @@ namespace MLEM.Ui {
|
||||||
public UiControls Controls;
|
public UiControls Controls;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The update and rendering statistics to be used for runtime debugging and profiling.
|
/// The update and rendering statistics to be used for runtime debugging and profiling.
|
||||||
/// The metrics are reset accordingly every frame: <see cref="UiMetrics.ResetUpdates"/> is called at the start of <see cref="Update"/>, and <see cref="UiMetrics.ResetDraws"/> is called at the start of <see cref="DrawEarly"/>, or at the start of <see cref="Draw"/> if <see cref="DrawEarly"/> was not called.
|
/// The metrics are reset accordingly every frame: <see cref="UiMetrics.ResetUpdates"/> is called at the start of <see cref="Update"/>, and <see cref="UiMetrics.ResetDraws"/> is called at the start of <see cref="Draw"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public UiMetrics Metrics;
|
public UiMetrics Metrics;
|
||||||
|
|
||||||
|
@ -268,6 +268,7 @@ namespace MLEM.Ui {
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="time">The game's time</param>
|
/// <param name="time">The game's time</param>
|
||||||
/// <param name="batch">The sprite batch to use for drawing</param>
|
/// <param name="batch">The sprite batch to use for drawing</param>
|
||||||
|
[Obsolete("DrawEarly is deprecated. Calling it is not required anymore, and there is no replacement.")]
|
||||||
public void DrawEarly(GameTime time, SpriteBatch batch) {
|
public void DrawEarly(GameTime time, SpriteBatch batch) {
|
||||||
this.Metrics.ResetDraws();
|
this.Metrics.ResetDraws();
|
||||||
this.stopwatch.Restart();
|
this.stopwatch.Restart();
|
||||||
|
@ -284,7 +285,6 @@ namespace MLEM.Ui {
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Draws any <see cref="Element"/>s onto the screen.
|
/// Draws any <see cref="Element"/>s onto the screen.
|
||||||
/// Note that, when using <see cref="Panel"/>s with a scroll bar, <see cref="DrawEarly"/> needs to be called as well.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="time">The game's time</param>
|
/// <param name="time">The game's time</param>
|
||||||
/// <param name="batch">The sprite batch to use for drawing</param>
|
/// <param name="batch">The sprite batch to use for drawing</param>
|
||||||
|
|
Loading…
Reference in a new issue