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)
{