📄 d3dfont.cs
字号:
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 );
}
catch
{
}
finally
{
// 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();
}
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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -