?? d3dfont.cs
字號(hào):
/// <summary>
/// Draw some text on the screen
/// </summary>
public void DrawText(float xpos, float ypos, Color color, string text, RenderFlags flags)
{
if (text == null)
return;
// Setup renderstate
savedStateBlock.Capture();
drawTextStateBlock.Apply();
device.SetTexture(0, fontTexture);
device.VertexFormat = CustomVertex.TransformedColoredTextured.Format;
device.PixelShader = null;
device.SetStreamSource(0, vertexBuffer, 0);
// Set filter states
if ((flags & RenderFlags.Filtered) != 0)
{
samplerState0.MinFilter = TextureFilter.Linear;
samplerState0.MagFilter = TextureFilter.Linear;
}
// Adjust for character spacing
xpos -= spacingPerChar;
float fStartX = xpos;
// Fill vertex buffer
int iv = 0;
int dwNumTriangles = 0;
foreach (char c in text)
{
if (c == '\n')
{
xpos = fStartX;
ypos += (textureCoords[0,3]-textureCoords[0,1])*textureHeight;
}
if ((c-32) < 0 || (c-32) >= 128-32)
continue;
float tx1 = textureCoords[c-32,0];
float ty1 = textureCoords[c-32,1];
float tx2 = textureCoords[c-32,2];
float ty2 = textureCoords[c-32,3];
float w = (tx2-tx1) * textureWidth / textureScale;
float h = (ty2-ty1) * textureHeight / textureScale;
int intColor = color.ToArgb();
if (c != ' ')
{
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+h-0.5f,0.9f,1.0f), intColor, tx1, ty2);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+0-0.5f,0.9f,1.0f), intColor, tx1, ty1);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+h-0.5f,0.9f,1.0f), intColor, tx2, ty2);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+0-0.5f,0.9f,1.0f), intColor, tx2, ty1);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+h-0.5f,0.9f,1.0f), intColor, tx2, ty2);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+0-0.5f,0.9f,1.0f), intColor, tx1, ty1);
dwNumTriangles += 2;
if (dwNumTriangles*3 > (MaxNumfontVertices-6))
{
// Set the data for the vertexbuffer
vertexBuffer.SetData(fontVertices, 0, LockFlags.Discard);
device.DrawPrimitives(PrimitiveType.TriangleList, 0, dwNumTriangles);
dwNumTriangles = 0;
iv = 0;
}
}
xpos += w - (2 * spacingPerChar);
}
// Set the data for the vertex buffer
vertexBuffer.SetData(fontVertices, 0, LockFlags.Discard);
if (dwNumTriangles > 0)
device.DrawPrimitives(PrimitiveType.TriangleList, 0, dwNumTriangles);
// Restore the modified renderstates
savedStateBlock.Apply();
}
/// <summary>
/// Draws scaled 2D text. Note that x and y are in viewport coordinates
/// (ranging from -1 to +1). fXScale and fYScale are the size fraction
/// relative to the entire viewport. For example, a fXScale of 0.25 is
/// 1/8th of the screen width. This allows you to output text at a fixed
/// fraction of the viewport, even if the screen or window size changes.
/// </summary>
public void DrawTextScaled(float x, float y, float z,
float fXScale, float fYScale,
System.Drawing.Color color,
string text, RenderFlags flags)
{
if (device == null)
throw new System.ArgumentNullException();
// Set up renderstate
savedStateBlock.Capture();
drawTextStateBlock.Apply();
device.VertexFormat = CustomVertex.TransformedColoredTextured.Format;
device.PixelShader = null;
device.SetStreamSource(0, vertexBuffer, 0);
// Set filter states
if ((flags & RenderFlags.Filtered) != 0)
{
samplerState0.MinFilter = TextureFilter.Linear;
samplerState0.MagFilter = TextureFilter.Linear;
}
Viewport vp = device.Viewport;
float xpos = (x+1.0f)*vp.Width/2;
float ypos = (y+1.0f)*vp.Height/2;
float sz = z;
float rhw = 1.0f;
float fLineHeight = (textureCoords[0,3] - textureCoords[0,1]) * textureHeight;
// Adjust for character spacing
xpos -= spacingPerChar * (fXScale*vp.Height)/fLineHeight;
float fStartX = xpos;
// Fill vertex buffer
int numTriangles = 0;
int realColor = color.ToArgb();
int iv = 0;
foreach (char c in text)
{
if (c == '\n')
{
xpos = fStartX;
ypos += fYScale*vp.Height;
}
if ((c-32) < 0 || (c-32) >= 128-32)
continue;
float tx1 = textureCoords[c-32,0];
float ty1 = textureCoords[c-32,1];
float tx2 = textureCoords[c-32,2];
float ty2 = textureCoords[c-32,3];
float w = (tx2-tx1)*textureWidth;
float h = (ty2-ty1)*textureHeight;
w *= (fXScale*vp.Height)/fLineHeight;
h *= (fYScale*vp.Height)/fLineHeight;
if (c != ' ')
{
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+h-0.5f,sz,rhw), realColor, tx1, ty2);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+0-0.5f,sz,rhw), realColor, tx1, ty1);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+h-0.5f,sz,rhw), realColor, tx2, ty2);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+0-0.5f,sz,rhw), realColor, tx2, ty1);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+w-0.5f,ypos+h-0.5f,sz,rhw), realColor, tx2, ty2);
fontVertices[iv++] = new CustomVertex.TransformedColoredTextured(new Vector4(xpos+0-0.5f,ypos+0-0.5f,sz,rhw), realColor, tx1, ty1);
numTriangles += 2;
if (numTriangles*3 > (MaxNumfontVertices-6))
{
// Unlock, render, and relock the vertex buffer
vertexBuffer.SetData(fontVertices, 0, LockFlags.Discard);
device.DrawPrimitives(PrimitiveType.TriangleList , 0, numTriangles);
numTriangles = 0;
iv = 0;
}
}
xpos += w - (2 * spacingPerChar) * (fXScale*vp.Height)/fLineHeight;
}
// Unlock and render the vertex buffer
vertexBuffer.SetData(fontVertices, 0, LockFlags.Discard);
if (numTriangles > 0)
device.DrawPrimitives(PrimitiveType.TriangleList , 0, numTriangles);
// Restore the modified renderstates
savedStateBlock.Apply();
}
/// <summary>
/// Draws scaled 2D text. Note that x and y are in viewport coordinates
/// (ranging from -1 to +1). fXScale and fYScale are the size fraction
/// relative to the entire viewport. For example, a fXScale of 0.25 is
/// 1/8th of the screen width. This allows you to output text at a fixed
/// fraction of the viewport, even if the screen or window size changes.
/// </summary>
public void DrawTextScaled(float x, float y, float z,
float fXScale, float fYScale,
System.Drawing.Color color,
string text)
{
this.DrawTextScaled(x,y,z,fXScale, fYScale, color, text, 0);
}
/// <summary>
/// Renders 3D text
/// </summary>
public void Render3DText(string text, RenderFlags flags)
{
if (device == null)
throw new System.ArgumentNullException();
// Set up renderstate
savedStateBlock.Capture();
drawTextStateBlock.Apply();
device.VertexFormat = CustomVertex.PositionNormalTextured.Format;
device.PixelShader = null;
device.SetStreamSource(0, vertexBuffer, 0, VertexInformation.GetFormatSize(CustomVertex.PositionNormalTextured.Format));
// Set filter states
if ((flags & RenderFlags.Filtered) != 0)
{
samplerState0.MinFilter = TextureFilter.Linear;
samplerState0.MagFilter = TextureFilter.Linear;
}
// Position for each text element
float x = 0.0f;
float y = 0.0f;
// Center the text block at the origin
if ((flags & RenderFlags.Centered) != 0)
{
System.Drawing.SizeF sz = GetTextExtent(text);
x = -(((float)sz.Width)/10.0f)/2.0f;
y = -(((float)sz.Height)/10.0f)/2.0f;
}
// Turn off culling for two-sided text
if ((flags & RenderFlags.TwoSided) != 0)
renderState.CullMode = Cull.None;
// Adjust for character spacing
x -= spacingPerChar / 10.0f;
float fStartX = x;
// Fill vertex buffer
GraphicsStream strm = vertexBuffer.Lock(0, 0, LockFlags.Discard);
int numTriangles = 0;
foreach (char c in text)
{
if (c == '\n')
{
x = fStartX;
y -= (textureCoords[0,3]-textureCoords[0,1])*textureHeight/10.0f;
}
if ((c-32) < 0 || (c-32) >= 128-32)
continue;
float tx1 = textureCoords[c-32,0];
float ty1 = textureCoords[c-32,1];
float tx2 = textureCoords[c-32,2];
float ty2 = textureCoords[c-32,3];
float w = (tx2-tx1) * textureWidth / (10.0f * textureScale);
float h = (ty2-ty1) * textureHeight / (10.0f * textureScale);
if (c != ' ')
{
strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+0,y+0,0), new Vector3(0,0,-1), tx1, ty2));
strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+0,y+h,0), new Vector3(0,0,-1), tx1, ty1));
strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+w,y+0,0), new Vector3(0,0,-1), tx2, ty2));
strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+w,y+h,0), new Vector3(0,0,-1), tx2, ty1));
strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+w,y+0,0), new Vector3(0,0,-1), tx2, ty2));
strm.Write(new CustomVertex.PositionNormalTextured(new Vector3(x+0,y+h,0), new Vector3(0,0,-1), tx1, ty1));
numTriangles += 2;
if (numTriangles*3 > (MaxNumfontVertices-6))
{
// Unlock, render, and relock the vertex buffer
vertexBuffer.Unlock();
device.DrawPrimitives(PrimitiveType.TriangleList , 0, numTriangles);
strm = vertexBuffer.Lock(0, 0, LockFlags.Discard);
numTriangles = 0;
}
}
x += w - (2 * spacingPerChar) / 10.0f;
}
// Unlock and render the vertex buffer
vertexBuffer.Unlock();
if (numTriangles > 0)
device.DrawPrimitives(PrimitiveType.TriangleList , 0, numTriangles);
// Restore the modified renderstates
savedStateBlock.Apply();
}
/// <summary>
/// Get the dimensions of a text string
/// </summary>
private System.Drawing.SizeF GetTextExtent(string text)
{
if (null == text || text == string.Empty)
throw new System.ArgumentNullException();
float fRowWidth = 0.0f;
float fRowHeight = (textureCoords[0,3]-textureCoords[0,1])*textureHeight;
float fWidth = 0.0f;
float fHeight = fRowHeight;
foreach (char c in text)
{
if (c == '\n')
{
fRowWidth = 0.0f;
fHeight += fRowHeight;
}
if ((c-32) < 0 || (c-32) >= 128-32)
continue;
float tx1 = textureCoords[c-32,0];
float tx2 = textureCoords[c-32,2];
fRowWidth += (tx2-tx1)*textureWidth - 2*spacingPerChar;
if (fRowWidth > fWidth)
fWidth = fRowWidth;
}
return new System.Drawing.SizeF(fWidth, fHeight);
}
/// <summary>
/// Cleanup any resources being used
/// </summary>
public void Dispose(object sender, EventArgs e)
{
if (systemFont != null)
systemFont.Dispose();
systemFont = null;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -