/// <summary> /// Only renders a <see cref="LayeredSurface"/>. /// </summary> /// <param name="surface">The <see cref="LayeredSurface"/> to render.</param> /// <param name="renderingMatrix">Rendering matrix used with the sprite batch.</param> public override void Render(ISurface surface, bool force = false) { if (surface.IsDirty) { var layers = ((LayeredSurface)surface).GetLayers(); Global.GraphicsDevice.SetRenderTarget(surface.LastRenderResult); Global.GraphicsDevice.Clear(Color.Transparent); Global.SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.DepthRead, RasterizerState.CullNone); BeforeRenderCallback?.Invoke(Global.SpriteBatch); if (surface.Tint.A != 255) { Cell cell; if (surface.DefaultBackground.A != 0) { Global.SpriteBatch.Draw(surface.Font.FontImage, surface.AbsoluteArea, surface.Font.GlyphRects[surface.Font.SolidGlyphIndex], surface.DefaultBackground, 0f, Vector2.Zero, SpriteEffects.None, 0.2f); } for (int l = 0; l < layers.Length; l++) { if (layers[l].IsVisible) { for (int i = 0; i < layers[l].RenderCells.Length; i++) { cell = layers[l].RenderCells[i]; if (cell.IsVisible) { Global.SpriteBatch.Draw(surface.Font.FontImage, surface.RenderRects[i], surface.Font.GlyphRects[surface.Font.SolidGlyphIndex], cell.Background, 0f, Vector2.Zero, SpriteEffects.None, 0.3f); Global.SpriteBatch.Draw(surface.Font.FontImage, surface.RenderRects[i], surface.Font.GlyphRects[cell.Glyph], cell.Foreground, 0f, Vector2.Zero, cell.Mirror, 0.4f); } } } } } BeforeRenderTintCallback?.Invoke(Global.SpriteBatch); if (surface.Tint.A != 0) { Global.SpriteBatch.Draw(surface.Font.FontImage, surface.AbsoluteArea, surface.Font.GlyphRects[surface.Font.SolidGlyphIndex], surface.Tint, 0f, Vector2.Zero, SpriteEffects.None, 0.5f); } AfterRenderCallback?.Invoke(Global.SpriteBatch); Global.SpriteBatch.End(); surface.IsDirty = false; } }
/// <summary> /// Only renders a <see cref="LayeredTextSurface"/>. /// </summary> /// <param name="surface">The <see cref="LayeredTextSurface"/> to render.</param> /// <param name="renderingMatrix">Rendering matrix used with the sprite batch.</param> public override void Render(ITextSurfaceRendered surface, Matrix renderingMatrix) { var layers = ((LayeredTextSurface)surface).GetLayers(); Batch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.DepthRead, RasterizerState.CullNone, null, renderingMatrix); BeforeRenderCallback?.Invoke(Batch); if (surface.Tint.A != 255) { Cell cell; if (surface.DefaultBackground.A != 0) { Batch.Draw(surface.Font.FontImage, surface.AbsoluteArea, surface.Font.GlyphIndexRects[surface.Font.SolidGlyphIndex], surface.DefaultBackground, 0f, Vector2.Zero, SpriteEffects.None, 0.2f); } for (int l = 0; l < layers.Length; l++) { if (layers[l].IsVisible) { for (int i = 0; i < layers[l].RenderCells.Length; i++) { cell = layers[l].RenderCells[i]; if (cell.IsVisible) { if (cell.ActualBackground != Color.Transparent && cell.ActualBackground != surface.DefaultBackground) { Batch.Draw(surface.Font.FontImage, surface.RenderRects[i], surface.Font.GlyphIndexRects[surface.Font.SolidGlyphIndex], cell.ActualBackground, 0f, Vector2.Zero, SpriteEffects.None, 0.3f); } if (cell.ActualForeground != Color.Transparent) { Batch.Draw(surface.Font.FontImage, surface.RenderRects[i], surface.Font.GlyphIndexRects[cell.ActualGlyphIndex], cell.ActualForeground, 0f, Vector2.Zero, cell.ActualSpriteEffect, 0.4f); } } } } } } if (surface.Tint.A != 0) { Batch.Draw(surface.Font.FontImage, surface.AbsoluteArea, surface.Font.GlyphIndexRects[surface.Font.SolidGlyphIndex], surface.Tint, 0f, Vector2.Zero, SpriteEffects.None, 0.5f); } AfterRenderCallback?.Invoke(Batch); Batch.End(); }
/// <summary> /// Renders a surface to the screen. /// </summary> /// <param name="surface">The surface to render.</param> /// <param name="renderingMatrix">Display matrix for the rendered console.</param> public virtual void Render(ITextSurfaceRendered surface, Matrix renderingMatrix) { if (RenderTarget != null) { Batch.Reset(RenderTarget, renderingMatrix); } else { Batch.Reset(surface.Backbuffer, renderingMatrix); } BeforeRenderCallback?.Invoke(Batch); if (surface.Tint.A != 255) { Cell cell; if (surface.DefaultBackground.A != 0) { Batch.DrawQuad(surface.AbsoluteArea, surface.Font.SolidGlyphRectangle, surface.DefaultBackground, surface.Font.Image); } for (int i = 0; i < surface.RenderCells.Length; i++) { cell = surface.RenderCells[i]; if (cell.IsVisible) { Batch.DrawCell(cell, surface.RenderRects[i], surface.Font.SolidGlyphRectangle, surface.DefaultBackground, surface.Font); } } } AfterRenderCallback?.Invoke(Batch); if (surface.Tint.A != 0) { Batch.DrawQuad(surface.AbsoluteArea, surface.Font.SolidGlyphRectangle, surface.Tint, surface.Font.Image); } if (CallBatchEnd) { Batch.End(); } }
public void End() { AfterRenderCallback?.Invoke(Batch); Batch.End(); }
/// <summary> /// Renders a surface to the screen. /// </summary> /// <param name="surface">The surface to render.</param> /// <param name="renderingMatrix">Display matrix for the rendered console.</param> public virtual void Render(ITextSurfaceRendered surface, Matrix renderingMatrix) { Batch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.DepthRead, RasterizerState.CullNone, null, renderingMatrix); BeforeRenderCallback?.Invoke(Batch); if (surface.Tint.A != 255) { Cell cell; if (surface.DefaultBackground.A != 0) { Batch.Draw(surface.Font.FontImage, surface.AbsoluteArea, surface.Font.GlyphIndexRects[surface.Font.SolidGlyphIndex], surface.DefaultBackground, 0f, PrimitiveStatic.Vector2Zero, SpriteEffects.None, 0.2f); } for (int i = 0; i < surface.RenderCells.Length; i++) { cell = surface.RenderCells[i]; if (cell.IsVisible) { if (cell.ActualBackground != Color.Transparent && cell.ActualBackground != surface.DefaultBackground) { Batch.Draw(surface.Font.FontImage, surface.RenderRects[i], surface.Font.GlyphIndexRects[surface.Font.SolidGlyphIndex], cell.ActualBackground, 0f, Vector2.Zero, SpriteEffects.None, 0.3f); } if (cell.ActualForeground != Color.Transparent) { Batch.Draw(surface.Font.FontImage, surface.RenderRects[i], surface.Font.GlyphIndexRects[cell.ActualGlyphIndex], cell.ActualForeground, 0f, Vector2.Zero, cell.ActualSpriteEffect, 0.4f); } } } #region Control Render int cellCount; Rectangle rect; Point point; Controls.ControlBase control; // For each control for (int i = 0; i < Controls.Count; i++) { if (Controls[i].IsVisible) { control = Controls[i]; cellCount = control.TextSurface.Cells.Length; var font = control.AlternateFont == null ? surface.Font : control.AlternateFont; // Draw background of each cell for the control for (int cellIndex = 0; cellIndex < cellCount; cellIndex++) { cell = control[cellIndex]; if (cell.IsVisible) { point = Consoles.TextSurface.GetPointFromIndex(cellIndex, control.TextSurface.Width); point = new Point(point.X + control.Position.X, point.Y + control.Position.Y); if (surface.RenderArea.Contains(point.X, point.Y)) { point = new Point(point.X - surface.RenderArea.Left, point.Y - surface.RenderArea.Top); rect = surface.RenderRects[Consoles.TextSurface.GetIndexFromPoint(point, surface.Width)]; if (cell.ActualBackground != Color.Transparent) { Batch.Draw(font.FontImage, rect, font.GlyphIndexRects[font.SolidGlyphIndex], cell.ActualBackground, 0f, Vector2.Zero, SpriteEffects.None, 0.23f); } if (cell.ActualForeground != Color.Transparent) { Batch.Draw(font.FontImage, rect, font.GlyphIndexRects[cell.ActualGlyphIndex], cell.ActualForeground, 0f, Vector2.Zero, cell.ActualSpriteEffect, 0.26f); } } } } } } #endregion if (surface.Tint.A != 0) { Batch.Draw(surface.Font.FontImage, surface.AbsoluteArea, surface.Font.GlyphIndexRects[surface.Font.SolidGlyphIndex], surface.Tint, 0f, Vector2.Zero, SpriteEffects.None, 0.5f); } } else { Batch.Draw(surface.Font.FontImage, surface.AbsoluteArea, surface.Font.GlyphIndexRects[surface.Font.SolidGlyphIndex], surface.Tint, 0f, Vector2.Zero, SpriteEffects.None, 0.5f); } AfterRenderCallback?.Invoke(Batch); if (CallBatchEnd) { Batch.End(); } }