diff --git a/SMCode/SM.Base/Drawing/Text/CharParameter.cs b/SMCode/SM.Base/Drawing/Text/CharParameter.cs index 1b9fc87..aec2380 100644 --- a/SMCode/SM.Base/Drawing/Text/CharParameter.cs +++ b/SMCode/SM.Base/Drawing/Text/CharParameter.cs @@ -1,6 +1,7 @@ #region usings using System; +using OpenTK; #endregion @@ -13,23 +14,18 @@ namespace SM.Base.Drawing.Text public struct CharParameter { /// - /// The position on the X-axis. + /// The advance on the X-axis. /// - public int X; + public int Advance; + + public float BearingX; /// /// The width of the character. /// public float Width; - /// - /// The normalized position inside the texture. - /// - public float NormalizedX; - /// - /// The normalized width inside the texture. - /// - public float NormalizedWidth; + public Matrix3 TextureMatrix; } } \ No newline at end of file diff --git a/SMCode/SM.Base/Drawing/Text/Font.cs b/SMCode/SM.Base/Drawing/Text/Font.cs index 023726f..d96a61e 100644 --- a/SMCode/SM.Base/Drawing/Text/Font.cs +++ b/SMCode/SM.Base/Drawing/Text/Font.cs @@ -1,138 +1,92 @@ -#region usings - +using System; +using System.Collections; using System.Collections.Generic; +using System.Diagnostics; using System.Drawing; -using System.Drawing.Text; -using OpenTK.Graphics.OpenGL4; +using System.Drawing.Drawing2D; +using System.Windows.Forms; +using OpenTK; +using SharpFont; using SM.Base.Textures; -#endregion - namespace SM.Base.Drawing.Text { - /// - /// Represents a font. - /// public class Font : Texture { - /// - /// The char set for the font. - /// Default: - /// - public ICollection CharSet = FontCharStorage.SimpleUTF8; + private static Library _lib; - /// - /// The font family, that is used to find the right font. - /// - public FontFamily FontFamily; + private Face _fontFace; - /// - /// The font size. - /// Default: 12 - /// - public float FontSize = 12; + public float SpaceWidth { get; private set; } = 0; - public float SpaceWidth { get; private set; } + public ICollection CharSet { get; set; } = FontCharStorage.SimpleUTF8; - /// - /// The font style. - /// Default: - /// - public FontStyle FontStyle = FontStyle.Regular; + public float FontSize { get; set; } = 12; - /// - /// This contains all information for the different font character. - /// public Dictionary Positions = new Dictionary(); - /// - /// Generates a font from a font family from the specified path. - /// - /// The specified path + public Font(string path) { - var pfc = new PrivateFontCollection(); - pfc.AddFontFile(path); - FontFamily = pfc.Families[0]; + _lib ??= new Library(); + + _fontFace = new Face(_lib, path); } - /// - /// Generates a font from a specified font family. - /// - /// Font-Family - public Font(FontFamily font) - { - FontFamily = font; - } - - /// - public override TextureWrapMode WrapMode { get; set; } = TextureWrapMode.ClampToEdge; - - /// - /// Regenerates the texture. - /// public void RegenerateTexture() { - Width = 0; - Height = 0; + Width = Height = 0; Positions = new Dictionary(); + _fontFace.SetCharSize(0, FontSize, 0, 96); - var map = new Bitmap(1000, 20); - var charParams = new Dictionary(); - using (var f = new System.Drawing.Font(FontFamily, FontSize, FontStyle)) + var pos = new Dictionary(); + foreach (char c in CharSet) { - using (var g = Graphics.FromImage(map)) + _fontFace.LoadChar(c, LoadFlags.Render, LoadTarget.Normal); + + pos.Add(c, new []{(float)_fontFace.Glyph.Bitmap.Width, Width}); + Width += (int)_fontFace.Glyph.Advance.X + 5; + Height = Math.Max(_fontFace.Glyph.Bitmap.Rows, Height); + } + + _fontFace.LoadChar('_', LoadFlags.Render, LoadTarget.Normal); + SpaceWidth = _fontFace.Glyph.Advance.X.ToSingle(); + + float bBoxHeight = (Math.Abs(_fontFace.BBox.Bottom) + _fontFace.BBox.Top); + float bBoxTopScale = _fontFace.BBox.Top / bBoxHeight; + float baseline = Height * bBoxTopScale; + + Map = new Bitmap(Width, Height); + using (Graphics g = Graphics.FromImage(Map)) + { + g.Clear(Color.Transparent); + + + foreach (var keyvalue in pos) { - g.Clear(Color.Transparent); + _fontFace.LoadChar(keyvalue.Key, LoadFlags.Render, LoadTarget.Normal); - foreach (var c in CharSet) + int y = ((int)baseline - (int)_fontFace.Glyph.Metrics.HorizontalBearingY); + + g.DrawImageUnscaled(_fontFace.Glyph.Bitmap.ToGdipBitmap(Color.White), (int)keyvalue.Value[1], y); + + Positions.Add(keyvalue.Key, new CharParameter() { - var s = c.ToString(); - var size = g.MeasureString(s, f, 0, StringFormat.GenericTypographic); - try - { - charParams.Add(c, new[] {size.Width, Width}); - } - catch - { - // ignored - } + Advance = (int)_fontFace.Glyph.LinearHorizontalAdvance, + BearingX = _fontFace.Glyph.BitmapLeft, - if (Height < size.Height) Height = (int) size.Height; - Width += (int) size.Width; - } + Width = keyvalue.Value[0], - SpaceWidth = g.MeasureString("_", f, 0, StringFormat.GenericTypographic).Width; - } - - map = new Bitmap(Width, Height); - using (var g = Graphics.FromImage(map)) - { - foreach (var keyValuePair in charParams) - { - var normalizedX = (keyValuePair.Value[1]) / Width; - var normalizedWidth = keyValuePair.Value[0] / Width; - - CharParameter parameter; - Positions.Add(keyValuePair.Key, parameter = new CharParameter - { - NormalizedWidth = normalizedWidth, - NormalizedX = normalizedX, - Width = keyValuePair.Value[0], - X = (int) keyValuePair.Value[1] - }); - - g.DrawString(keyValuePair.Key.ToString(), f, Brushes.White, parameter.X, 0, StringFormat.GenericTypographic); - } + TextureMatrix = TextureTransformation.CalculateMatrix(new Vector2(keyvalue.Value[1] / Width, 0), + new Vector2(keyvalue.Value[0] / Width, 1), 0), + }); } } - Map = map; - Recompile(); + Console.WriteLine(); } - /// public override void Compile() { RegenerateTexture(); diff --git a/SMCode/SM.Base/Drawing/Text/TextDrawingBasis.cs b/SMCode/SM.Base/Drawing/Text/TextDrawingBasis.cs index 23fdc16..ee25586 100644 --- a/SMCode/SM.Base/Drawing/Text/TextDrawingBasis.cs +++ b/SMCode/SM.Base/Drawing/Text/TextDrawingBasis.cs @@ -40,7 +40,7 @@ namespace SM.Base.Drawing.Text /// The spacing between numbers. /// Default: 1 /// - public float Spacing = 1; + public float Spacing = 1f; /// /// The font. @@ -112,6 +112,7 @@ namespace SM.Base.Drawing.Text var _last = new CharParameter(); for (var i = 0; i < _text.Length; i++) { + if (_text[i] == ' ') { x += Font.SpaceWidth * Spacing; @@ -136,16 +137,21 @@ namespace SM.Base.Drawing.Text throw new Exception("Font doesn't contain '" + _text[i] + "'"); } + + if (i == 0) + { + x += parameter.Width / 2; + } + var matrix = Matrix4.CreateScale(parameter.Width, Font.Height, 1) * Matrix4.CreateTranslation(x, -y, 0); _instances[i] = new Instance { ModelMatrix = matrix, - TextureMatrix = TextureTransformation.CalculateMatrix(new Vector2(parameter.NormalizedX, 0), - new Vector2(parameter.NormalizedWidth, 1), 0) + TextureMatrix = parameter.TextureMatrix }; - x += parameter.Width * Spacing; + x += Math.Max(parameter.Advance, 6); _last = parameter; } diff --git a/SMCode/SM.Base/Legacy/Font.cs b/SMCode/SM.Base/Legacy/Font.cs new file mode 100644 index 0000000..1cebcb6 --- /dev/null +++ b/SMCode/SM.Base/Legacy/Font.cs @@ -0,0 +1,144 @@ +#region usings + +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Text; +using OpenTK.Graphics.OpenGL4; +using SM.Base.Textures; + +#endregion + +namespace SM.Base.Drawing.Text +{ + /// + /// Represents a font. + /// + public class Font : Texture + { + /// + /// The char set for the font. + /// Default: + /// + public ICollection CharSet = FontCharStorage.SimpleUTF8; + + /// + /// The font family, that is used to find the right font. + /// + public FontFamily FontFamily; + + /// + /// The font size. + /// Default: 12 + /// + public float FontSize = 12; + + public float SpaceWidth { get; private set; } + + public float Spacing = 1; + + /// + /// The font style. + /// Default: + /// + public FontStyle FontStyle = FontStyle.Regular; + + /// + /// This contains all information for the different font character. + /// + public Dictionary Positions = new Dictionary(); + + /// + /// Generates a font from a font family from the specified path. + /// + /// The specified path + public Font(string path) + { + var pfc = new PrivateFontCollection(); + pfc.AddFontFile(path); + FontFamily = pfc.Families[0]; + } + + /// + /// Generates a font from a specified font family. + /// + /// Font-Family + public Font(FontFamily font) + { + FontFamily = font; + } + + /// + public override TextureWrapMode WrapMode { get; set; } = TextureWrapMode.ClampToEdge; + + /// + /// Regenerates the texture. + /// + public void RegenerateTexture() + { + Width = 0; + Height = 0; + Positions = new Dictionary(); + + + var map = new Bitmap(1000, 20); + var charParams = new Dictionary(); + using (var f = new System.Drawing.Font(FontFamily, FontSize, FontStyle)) + { + using (var g = Graphics.FromImage(map)) + { + g.Clear(Color.Transparent); + + foreach (var c in CharSet) + { + var s = c.ToString(); + var size = g.MeasureString(s, f, 0, StringFormat.GenericTypographic); + try + { + charParams.Add(c, new[] {size.Width, Width}); + } + catch + { + // ignored + } + + if (Height < size.Height) Height = (int) size.Height; + Width += (int) size.Width + 1; + } + + SpaceWidth = g.MeasureString("_", f, 0, StringFormat.GenericTypographic).Width; + } + + map = new Bitmap(Width, Height); + using (var g = Graphics.FromImage(map)) + { + foreach (var keyValuePair in charParams) + { + var normalizedX = (keyValuePair.Value[1]+ 0.00001f) / Width; + var normalizedWidth = keyValuePair.Value[0] / Width; + + CharParameter parameter; + Positions.Add(keyValuePair.Key, parameter = new CharParameter + { + NormalizedWidth = normalizedWidth, + NormalizedX = normalizedX, + Width = keyValuePair.Value[0], + X = (int) keyValuePair.Value[1] + }); + + g.DrawString(keyValuePair.Key.ToString(), f, Brushes.White, parameter.X, 0, StringFormat.GenericTypographic); + } + } + } + + Map = map; + Recompile(); + } + + /// + public override void Compile() + { + RegenerateTexture(); + base.Compile(); + } + } +} \ No newline at end of file diff --git a/SMCode/SM.Base/PostEffects/BloomEffect.cs b/SMCode/SM.Base/PostEffects/BloomEffect.cs index 095fdb7..9b3d279 100644 --- a/SMCode/SM.Base/PostEffects/BloomEffect.cs +++ b/SMCode/SM.Base/PostEffects/BloomEffect.cs @@ -167,7 +167,7 @@ namespace SM.Base.PostEffects int iter = Iterations * 2; for (int i = 0; i < iter; i++) { - (hoz ? _bloomBuffer1 : _bloomBuffer2).Activate(); + (hoz ? _bloomBuffer1 : _bloomBuffer2).Activate(false); _shader.Draw(collection => { diff --git a/SMCode/SM.Base/SM.Base.csproj b/SMCode/SM.Base/SM.Base.csproj index df0a4fa..e658130 100644 --- a/SMCode/SM.Base/SM.Base.csproj +++ b/SMCode/SM.Base/SM.Base.csproj @@ -1,5 +1,7 @@  + + Debug @@ -12,6 +14,8 @@ v4.5.2 512 true + + true @@ -38,6 +42,9 @@ ..\..\packages\OpenTK.3.3.1\lib\net20\OpenTK.dll + + ..\..\..\IAmTwo - Kopie\packages\SharpFont.4.0.1\lib\net45\SharpFont.dll + @@ -57,6 +64,7 @@ + @@ -91,7 +99,6 @@ - @@ -145,4 +152,11 @@ + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file diff --git a/SMCode/SM.Base/packages.config b/SMCode/SM.Base/packages.config index 82cdaeb..e8dfb8b 100644 --- a/SMCode/SM.Base/packages.config +++ b/SMCode/SM.Base/packages.config @@ -1,4 +1,6 @@  + + \ No newline at end of file diff --git a/SMCode/SM.OGL/Framebuffer/Framebuffer.cs b/SMCode/SM.OGL/Framebuffer/Framebuffer.cs index 32cd1b0..628e807 100644 --- a/SMCode/SM.OGL/Framebuffer/Framebuffer.cs +++ b/SMCode/SM.OGL/Framebuffer/Framebuffer.cs @@ -26,12 +26,13 @@ namespace SM.OGL.Framebuffer /// /// Represents the screen buffer. /// - public static readonly Framebuffer Screen = new() + public static readonly Framebuffer Screen = new Framebuffer() { _id = 0, CanCompile = false, _window = ScreenWindow, _windowScale = 1, + DefaultApplyViewport = false }; private IFramebufferWindow _window; @@ -45,6 +46,8 @@ namespace SM.OGL.Framebuffer /// public Vector2 Size { get; private set; } + public bool DefaultApplyViewport { get; set; } = true; + /// /// Contains all color attachments. /// @@ -168,27 +171,27 @@ namespace SM.OGL.Framebuffer /// /// Activates the framebuffer without clearing the buffer. /// - public void Activate() + public void Activate(bool? applyViewport = null) { - Activate(FramebufferTarget.Framebuffer, ClearBufferMask.None); + Activate(FramebufferTarget.Framebuffer, ClearBufferMask.None, applyViewport); } /// /// Activates the framebuffer for the specific target framebuffer and without clearing. /// /// - public void Activate(FramebufferTarget target) + public void Activate(FramebufferTarget target, bool? applyViewport = null) { - Activate(target, ClearBufferMask.None); + Activate(target, ClearBufferMask.None, applyViewport); } /// /// Activates the framebuffer while clearing the specified buffer. /// /// - public void Activate(ClearBufferMask clearMask) + public void Activate(ClearBufferMask clearMask, bool? applyViewport = null) { - Activate(FramebufferTarget.Framebuffer, clearMask); + Activate(FramebufferTarget.Framebuffer, clearMask, applyViewport); } /// @@ -196,9 +199,10 @@ namespace SM.OGL.Framebuffer /// /// /// - public void Activate(FramebufferTarget target, ClearBufferMask clear) + public void Activate(FramebufferTarget target, ClearBufferMask clear, bool? applyViewport = null) { GL.BindFramebuffer(target, this); + if (applyViewport.GetValueOrDefault(DefaultApplyViewport)) GL.Viewport(0, 0, (int)Size.X, (int)Size.Y); GL.Clear(clear); } @@ -209,10 +213,11 @@ namespace SM.OGL.Framebuffer /// public static Framebuffer GetCurrentlyActive(FramebufferTarget target = FramebufferTarget.Framebuffer) { - Framebuffer buffer = new() + Framebuffer buffer = new Framebuffer() { CanCompile = false, - ReportAsNotCompiled = true + ReportAsNotCompiled = true, + DefaultApplyViewport = false }; switch (target) {