Code:
device.VertexShader = null;
device.PixelShader = null;
device.SetRenderState(RenderState.AlphaBlendEnable, true);
device.SetRenderState(RenderState.BlendOperation, BlendOperation.Add);
device.SetRenderState(RenderState.DestinationBlend, Blend.InverseSourceAlpha);
device.SetRenderState(RenderState.SourceBlend, Blend.SourceAlpha);
device.SetRenderState(RenderState.Lighting, 0);
device.SetTexture(0, null);
device.SetRenderState(RenderState.CullMode, Cull.None);
using (Surface renderTargetTemp = device.GetRenderTarget(0))
{
int width, height;
width = renderTargetTemp.Description.Width;
height = renderTargetTemp.Description.Height;
if (_renderTarget == null)
{
using (SwapChain sc = device.GetSwapChain(0))
{
_renderTarget = Surface.CreateOffscreenPlain(device, width, height, sc.PresentParameters.BackBufferFormat, Pool.SystemMemory);
}
}
using (Surface resolvedSurface = Surface.CreateRenderTarget(device, width, height, renderTargetTemp.Description.Format, MultisampleType.None, 0, false))
{
device.StretchRectangle(renderTargetTemp, resolvedSurface, TextureFilter.None);
device.GetRenderTargetData(resolvedSurface, _renderTarget);
}
}
// draw letterbox
if (_lineVectors == null)
{
_lineVectors = new SlimDX.Vector2[] {
new SlimDX.Vector2(0, 0),
new SlimDX.Vector2(_renderTarget.Description.Width - 1, _renderTarget.Description.Height - 1),
new SlimDX.Vector2(0, _renderTarget.Description.Height - 1),
new SlimDX.Vector2(_renderTarget.Description.Width - 1, 0),
new SlimDX.Vector2(0, 0),
new SlimDX.Vector2(0, _renderTarget.Description.Height - 1),
new SlimDX.Vector2(_renderTarget.Description.Width - 1, _renderTarget.Description.Height - 1),
new SlimDX.Vector2(_renderTarget.Description.Width - 1, 0),
};
}
// draw lines
if (_lineVectors != null)
{
using (SlimDX.Direct3D9.Line line = new SlimDX.Direct3D9.Line(device))
{
line.Antialias = false;
line.Width = 1.0f;
line.Begin();
line.Draw(_lineVectors, new SlimDX.Color4(1.0f, 0.5f, 0.5f, 1.0f));
line.End();
}
}
// random lines in random colors
lineData = new LineVertex[100];
Random rnd = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < lineData.Length; i++)
{
lineData[i] = new LineVertex();
float x = (float)rnd.Next(0, _renderTarget.Description.Width);
float y = (float)rnd.Next(0, _renderTarget.Description.Height);
float z = 1.0f;
lineData[i].Position = new Vector4(x, y, z, 0f);
lineData[i].Color = Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255)).ToArgb();
}
device.VertexFormat = LineVertex.Format;
device.DrawUserPrimitives<LineVertex>(PrimitiveType.LineList, 0, lineData.Length / 2, lineData);
// draw frame rate
using (SlimDX.Direct3D9.Font font = new SlimDX.Direct3D9.Font(device, new System.Drawing.Font ("Arial", 20.0f, FontStyle.Bold)))
{
if (_lastFrame != null)
{
if (lastDispSec != _lastFrame.Value.Second)
{
lastDispSec = _lastFrame.Value.Second;
fps = (1000.0 / (DateTime.Now - _lastFrame.Value).TotalMilliseconds);
Interface.DebugMessage(this.ProcessId, "Game running at: " + (fps++) + " fps.");
}
font.DrawString(null, String.Format("{0:N1} fps", fps), 100, 200, System.Drawing.Color.Aqua);
}
_lastFrame = DateTime.Now;
}
Code above draws (as seen on screenshots) a latterbox of size of the current wow window, lines with random start/end points and colors as well as current frame rate. Hook is done using EasyHook, rendering using SlimDX.