moved text rendering into renderer dll.
This commit is contained in:
@@ -25,7 +25,7 @@ namespace OpenRa.FileFormats.Graphics
|
|||||||
IVertexBuffer<Vertex> CreateVertexBuffer( int length );
|
IVertexBuffer<Vertex> CreateVertexBuffer( int length );
|
||||||
IIndexBuffer CreateIndexBuffer( int length );
|
IIndexBuffer CreateIndexBuffer( int length );
|
||||||
ITexture CreateTexture( Bitmap bitmap );
|
ITexture CreateTexture( Bitmap bitmap );
|
||||||
|
IFont CreateFont( string filename );
|
||||||
IShader CreateShader( Stream stream );
|
IShader CreateShader( Stream stream );
|
||||||
|
|
||||||
Size WindowSize { get; }
|
Size WindowSize { get; }
|
||||||
@@ -67,6 +67,13 @@ namespace OpenRa.FileFormats.Graphics
|
|||||||
void SetData( Bitmap bitmap );
|
void SetData( Bitmap bitmap );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IFont
|
||||||
|
{
|
||||||
|
void DrawText( string text, int2 pos, Color c );
|
||||||
|
|
||||||
|
int2 Measure( string text );
|
||||||
|
}
|
||||||
|
|
||||||
public enum PrimitiveType
|
public enum PrimitiveType
|
||||||
{
|
{
|
||||||
PointList,
|
PointList,
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ using OpenRa.FileFormats.Graphics;
|
|||||||
using OpenRa.Support;
|
using OpenRa.Support;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using ISE;
|
using ISE;
|
||||||
using Tao.OpenGl;
|
|
||||||
|
|
||||||
namespace OpenRa.Graphics
|
namespace OpenRa.Graphics
|
||||||
{
|
{
|
||||||
@@ -45,8 +44,7 @@ namespace OpenRa.Graphics
|
|||||||
|
|
||||||
public ITexture PaletteTexture;
|
public ITexture PaletteTexture;
|
||||||
|
|
||||||
readonly FTFontGL regularFont, boldFont;
|
readonly IFont regularFont, boldFont;
|
||||||
const int RenderedFontSize = 48;
|
|
||||||
|
|
||||||
public Size Resolution { get { return device.WindowSize; } }
|
public Size Resolution { get { return device.WindowSize; } }
|
||||||
|
|
||||||
@@ -59,21 +57,8 @@ namespace OpenRa.Graphics
|
|||||||
RgbaSpriteShader = device.CreateShader(FileSystem.Open("shaders/chrome-rgba.fx"));
|
RgbaSpriteShader = device.CreateShader(FileSystem.Open("shaders/chrome-rgba.fx"));
|
||||||
WorldSpriteShader = device.CreateShader(FileSystem.Open("shaders/chrome-shp.fx"));
|
WorldSpriteShader = device.CreateShader(FileSystem.Open("shaders/chrome-shp.fx"));
|
||||||
|
|
||||||
int Errors;
|
regularFont = device.CreateFont( "FreeSans.ttf" );
|
||||||
regularFont = new FTFontGL("FreeSans.ttf", out Errors);
|
boldFont = device.CreateFont( "FreeSansBold.ttf" );
|
||||||
|
|
||||||
if (Errors > 0)
|
|
||||||
throw new InvalidOperationException("Error(s) loading font");
|
|
||||||
|
|
||||||
regularFont.ftRenderToTexture(RenderedFontSize, 192);
|
|
||||||
regularFont.FT_ALIGN = FTFontAlign.FT_ALIGN_LEFT;
|
|
||||||
|
|
||||||
boldFont = new FTFontGL("FreeSansBold.ttf", out Errors);
|
|
||||||
if (Errors > 0)
|
|
||||||
throw new InvalidOperationException("Error(s) loading font");
|
|
||||||
|
|
||||||
boldFont.ftRenderToTexture(RenderedFontSize, 192);
|
|
||||||
boldFont.FT_ALIGN = FTFontAlign.FT_ALIGN_LEFT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IGraphicsDevice CreateDevice( Assembly rendererDll, int width, int height, bool windowed, bool vsync )
|
IGraphicsDevice CreateDevice( Assembly rendererDll, int width, int height, bool windowed, bool vsync )
|
||||||
@@ -144,61 +129,25 @@ namespace OpenRa.Graphics
|
|||||||
PerfHistory.Increment("batches", 1);
|
PerfHistory.Increment("batches", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CheckError()
|
public void DrawText( string text, int2 pos, Color c )
|
||||||
{
|
|
||||||
var e = Gl.glGetError();
|
|
||||||
if (e != Gl.GL_NO_ERROR)
|
|
||||||
throw new InvalidOperationException("GL Error: " + Gl.glGetString(e));
|
|
||||||
}
|
|
||||||
|
|
||||||
const float emHeight = 14f; /* px */
|
|
||||||
|
|
||||||
void DrawTextInner(FTFontGL f, string text, int2 pos, Color c)
|
|
||||||
{
|
{
|
||||||
using (new PerfSample("text"))
|
using (new PerfSample("text"))
|
||||||
|
regularFont.DrawText( text, pos, c );
|
||||||
|
}
|
||||||
|
public void DrawText2( string text, int2 pos, Color c )
|
||||||
{
|
{
|
||||||
pos.Y += (int)(emHeight);
|
using (new PerfSample("text"))
|
||||||
|
boldFont.DrawText( text, pos, c );
|
||||||
Gl.glMatrixMode(Gl.GL_MODELVIEW);
|
|
||||||
Gl.glPushMatrix();
|
|
||||||
Gl.glLoadIdentity();
|
|
||||||
|
|
||||||
Gl.glMatrixMode(Gl.GL_PROJECTION);
|
|
||||||
Gl.glPushMatrix();
|
|
||||||
Gl.glLoadIdentity();
|
|
||||||
|
|
||||||
Gl.glOrtho(0, Resolution.Width, 0, Resolution.Height, 0, 1);
|
|
||||||
|
|
||||||
Gl.glMatrixMode(Gl.GL_MODELVIEW);
|
|
||||||
Gl.glTranslatef(pos.X, Resolution.Height - pos.Y, 0);
|
|
||||||
Gl.glScalef(emHeight / RenderedFontSize, emHeight / RenderedFontSize, 1);
|
|
||||||
|
|
||||||
f.ftBeginFont(false);
|
|
||||||
Gl.glColor4f(c.R / 255f, c.G / 255f, c.B / 255f, c.A / 255f);
|
|
||||||
f.ftWrite(text);
|
|
||||||
f.ftEndFont();
|
|
||||||
|
|
||||||
Gl.glMatrixMode(Gl.GL_PROJECTION);
|
|
||||||
Gl.glPopMatrix();
|
|
||||||
|
|
||||||
Gl.glMatrixMode(Gl.GL_MODELVIEW);
|
|
||||||
Gl.glPopMatrix();
|
|
||||||
|
|
||||||
CheckError();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawText(string text, int2 pos, Color c) { DrawTextInner(regularFont, text, pos, c); }
|
|
||||||
public void DrawText2(string text, int2 pos, Color c) { DrawTextInner(boldFont, text, pos, c); }
|
|
||||||
|
|
||||||
public int2 MeasureText(string text)
|
public int2 MeasureText(string text)
|
||||||
{
|
{
|
||||||
return new int2((int)(regularFont.ftExtent(ref text) / 3), (int)emHeight);
|
return regularFont.Measure( text );
|
||||||
}
|
}
|
||||||
|
|
||||||
public int2 MeasureText2(string text)
|
public int2 MeasureText2(string text)
|
||||||
{
|
{
|
||||||
return new int2((int)(boldFont.ftExtent(ref text) / 3), (int)emHeight);
|
return boldFont.Measure( text );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
@@ -66,10 +66,6 @@
|
|||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
<Reference Include="Tao.OpenAl, Version=1.1.0.1, Culture=neutral, PublicKeyToken=a7579dda88828311, processorArchitecture=MSIL" />
|
<Reference Include="Tao.OpenAl, Version=1.1.0.1, Culture=neutral, PublicKeyToken=a7579dda88828311, processorArchitecture=MSIL" />
|
||||||
<Reference Include="Tao.OpenGl, Version=2.1.0.12, Culture=neutral, PublicKeyToken=1ca010269a4501ef">
|
|
||||||
<SpecificVersion>False</SpecificVersion>
|
|
||||||
<HintPath>..\thirdparty\Tao\Tao.OpenGl.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="ISE.FreeType, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1b34ab585684d5ea">
|
<Reference Include="ISE.FreeType, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1b34ab585684d5ea">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\thirdparty\ISE.FreeType.dll</HintPath>
|
<HintPath>..\thirdparty\ISE.FreeType.dll</HintPath>
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ using Tao.Cg;
|
|||||||
using Tao.OpenGl;
|
using Tao.OpenGl;
|
||||||
using OpenRa.FileFormats.Graphics;
|
using OpenRa.FileFormats.Graphics;
|
||||||
using Tao.Sdl;
|
using Tao.Sdl;
|
||||||
|
using ISE;
|
||||||
|
|
||||||
[assembly: Renderer( typeof( OpenRa.GlRenderer.GraphicsDevice ))]
|
[assembly: Renderer( typeof( OpenRa.GlRenderer.GraphicsDevice ))]
|
||||||
|
|
||||||
@@ -231,6 +232,11 @@ namespace OpenRa.GlRenderer
|
|||||||
return new Shader( this, stream );
|
return new Shader( this, stream );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IFont CreateFont( string filename )
|
||||||
|
{
|
||||||
|
return new Font( this, filename );
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -414,4 +420,63 @@ namespace OpenRa.GlRenderer
|
|||||||
bitmap.UnlockBits(bits);
|
bitmap.UnlockBits(bits);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Font : IFont
|
||||||
|
{
|
||||||
|
const int RenderedFontSize = 48;
|
||||||
|
const float emHeight = 14f; /* px */
|
||||||
|
|
||||||
|
GraphicsDevice dev;
|
||||||
|
FTFontGL font;
|
||||||
|
|
||||||
|
public Font( GraphicsDevice dev, string filename )
|
||||||
|
{
|
||||||
|
this.dev = dev;
|
||||||
|
int Errors;
|
||||||
|
font = new FTFontGL(filename, out Errors);
|
||||||
|
|
||||||
|
if (Errors > 0)
|
||||||
|
throw new InvalidOperationException("Error(s) loading font");
|
||||||
|
|
||||||
|
font.ftRenderToTexture(RenderedFontSize, 192);
|
||||||
|
font.FT_ALIGN = FTFontAlign.FT_ALIGN_LEFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawText( string text, int2 pos, Color c )
|
||||||
|
{
|
||||||
|
pos.Y += (int)(emHeight);
|
||||||
|
|
||||||
|
Gl.glMatrixMode(Gl.GL_MODELVIEW);
|
||||||
|
Gl.glPushMatrix();
|
||||||
|
Gl.glLoadIdentity();
|
||||||
|
|
||||||
|
Gl.glMatrixMode(Gl.GL_PROJECTION);
|
||||||
|
Gl.glPushMatrix();
|
||||||
|
Gl.glLoadIdentity();
|
||||||
|
|
||||||
|
Gl.glOrtho(0, dev.WindowSize.Width, 0, dev.WindowSize.Height, 0, 1);
|
||||||
|
|
||||||
|
Gl.glMatrixMode(Gl.GL_MODELVIEW);
|
||||||
|
Gl.glTranslatef(pos.X, dev.WindowSize.Height - pos.Y, 0);
|
||||||
|
Gl.glScalef(emHeight / RenderedFontSize, emHeight / RenderedFontSize, 1);
|
||||||
|
|
||||||
|
font.ftBeginFont(false);
|
||||||
|
Gl.glColor4f(c.R / 255f, c.G / 255f, c.B / 255f, c.A / 255f);
|
||||||
|
font.ftWrite(text);
|
||||||
|
font.ftEndFont();
|
||||||
|
|
||||||
|
Gl.glMatrixMode(Gl.GL_PROJECTION);
|
||||||
|
Gl.glPopMatrix();
|
||||||
|
|
||||||
|
Gl.glMatrixMode(Gl.GL_MODELVIEW);
|
||||||
|
Gl.glPopMatrix();
|
||||||
|
|
||||||
|
GraphicsDevice.CheckGlError();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int2 Measure( string text )
|
||||||
|
{
|
||||||
|
return new int2((int)(font.ftExtent(ref text) / 3), (int)emHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,10 @@
|
|||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="ISE.FreeType, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1b34ab585684d5ea, processorArchitecture=x86">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\thirdparty\ISE.FreeType.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core">
|
<Reference Include="System.Core">
|
||||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||||
|
|||||||
Reference in New Issue
Block a user