Advertisement
Guest User

SpriteTextRenderer SlimDX text with triangle

a guest
Oct 2nd, 2014
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.12 KB | None | 0 0
  1. using System;
  2. using System.Windows.Forms;
  3. using SlimDX;
  4. using SlimDX.D3DCompiler;
  5. using SlimDX.Direct3D11;
  6. using SlimDX.DirectWrite;
  7. using SlimDX.DXGI;
  8. using SlimDX.Windows;
  9. using Buffer = SlimDX.Direct3D11.Buffer;
  10. using Device = SlimDX.Direct3D11.Device;
  11. using Factory = SlimDX.DXGI.Factory;
  12. using Resource = SlimDX.Direct3D11.Resource;
  13.  
  14. namespace DEngine.UI.Test
  15. {
  16.     public class SimpleTriangle
  17.     {
  18.         public SimpleTriangle()
  19.         {
  20.         }
  21.  
  22.         public void RunToEnd()
  23.         {
  24.             Device device;
  25.             SwapChain swapChain;
  26.             ShaderSignature inputSignature;
  27.             VertexShader vertexShader;
  28.             PixelShader pixelShader;
  29.  
  30.             var form = new RenderForm("Tutorial 3: Simple Triangle");
  31.             var description = new SwapChainDescription()
  32.             {
  33.                 BufferCount = 2,
  34.                 Usage = Usage.RenderTargetOutput,
  35.                 OutputHandle = form.Handle,
  36.                 IsWindowed = true,
  37.                 ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), Format.R8G8B8A8_UNorm),
  38.                 SampleDescription = new SampleDescription(1, 0),
  39.                 Flags = SwapChainFlags.AllowModeSwitch,
  40.                 SwapEffect = SwapEffect.Discard
  41.             };
  42.  
  43.             Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, description, out device, out swapChain);
  44.  
  45.             // create a view of our render target, which is the backbuffer of the swap chain we just created
  46.             RenderTargetView renderTarget;
  47.             using (var resource = Resource.FromSwapChain<Texture2D>(swapChain, 0))
  48.                 renderTarget = new RenderTargetView(device, resource);
  49.  
  50.             // setting a viewport is required if you want to actually see anything
  51.             var context = device.ImmediateContext;
  52.             var viewport = new Viewport(0.0f, 0.0f, form.ClientSize.Width, form.ClientSize.Height);
  53.             context.OutputMerger.SetTargets(renderTarget);
  54.             context.Rasterizer.SetViewports(viewport);
  55.  
  56.             // load and compile the vertex shader
  57.             using (var bytecode = ShaderBytecode.CompileFromFile("SimpleTriangle.fx", "VShader", "vs_4_0", ShaderFlags.None, EffectFlags.None))
  58.             {
  59.                 inputSignature = ShaderSignature.GetInputSignature(bytecode);
  60.                 vertexShader = new VertexShader(device, bytecode);
  61.             }
  62.  
  63.             // load and compile the pixel shader
  64.             using (var bytecode = ShaderBytecode.CompileFromFile("SimpleTriangle.fx", "PShader", "ps_4_0", ShaderFlags.None, EffectFlags.None))
  65.                 pixelShader = new PixelShader(device, bytecode);
  66.  
  67.             // create test vertex data, making sure to rewind the stream afterward
  68.             var vertices = new DataStream(12 * 3, true, true);
  69.             vertices.Write(new Vector3(0.0f, 0.5f, 0.5f));
  70.             vertices.Write(new Vector3(0.5f, -0.5f, 0.5f));
  71.             vertices.Write(new Vector3(-0.5f, -0.5f, 0.5f));
  72.             vertices.Position = 0;
  73.  
  74.             // create the vertex layout and buffer
  75.             var elements = new[] { new InputElement("POSITION", 0, Format.R32G32B32_Float, 0) };
  76.             var layout = new InputLayout(device, inputSignature, elements);
  77.             var vertexBuffer = new Buffer(device, vertices, 12 * 3, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
  78.  
  79.             // configure the Input Assembler portion of the pipeline with the vertex data
  80.             context.InputAssembler.InputLayout = layout;
  81.             context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
  82.             context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, 12, 0));
  83.  
  84.             // set the shaders
  85.             context.VertexShader.Set(vertexShader);
  86.             context.PixelShader.Set(pixelShader);
  87.  
  88.             // prevent DXGI handling of alt+enter, which doesn't work properly with Winforms
  89.             using (var factory = swapChain.GetParent<Factory>())
  90.                 factory.SetWindowAssociation(form.Handle, WindowAssociationFlags.IgnoreAltEnter);
  91.  
  92.  
  93.             var sprite = new SpriteTextRenderer.SlimDX.SpriteRenderer(device);
  94.             var textBlock = new SpriteTextRenderer.SlimDX.TextBlockRenderer(sprite, "Arial", FontWeight.Bold, SlimDX.DirectWrite.FontStyle.Normal, FontStretch.Normal, 16);
  95.  
  96.  
  97.             // handle alt+enter ourselves
  98.             form.KeyDown += (o, e) =>
  99.             {
  100.                 if (e.Alt && e.KeyCode == Keys.Enter)
  101.                     swapChain.IsFullScreen = !swapChain.IsFullScreen;
  102.             };
  103.  
  104.             // handle form size changes
  105.             form.UserResized += (o, e) =>
  106.             {
  107.                 renderTarget.Dispose();
  108.  
  109.                 swapChain.ResizeBuffers(2, 0, 0, Format.R8G8B8A8_UNorm, SwapChainFlags.AllowModeSwitch);
  110.                 using (var resource = Resource.FromSwapChain<Texture2D>(swapChain, 0))
  111.                     renderTarget = new RenderTargetView(device, resource);
  112.  
  113.                 context.OutputMerger.SetTargets(renderTarget);
  114.             };
  115.  
  116.             MessagePump.Run(form, () =>
  117.             {
  118.                 // clear the render target to a soothing blue
  119.                 context.ClearRenderTargetView(renderTarget, new Color4(0.5f, 0.5f, 1.0f));
  120.  
  121.  
  122.                 textBlock.DrawString("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + Environment.NewLine + "abcdefghijklmnopqrstuvwxyz", Vector2.Zero, new Color4(1.0f, 1.0f, 0.0f));
  123.                 sprite.Flush();
  124.  
  125.                 // draw the triangle
  126.                 context.Draw(3, 0);
  127.                 swapChain.Present(0, PresentFlags.None);
  128.             });
  129.  
  130.             // clean up all resources
  131.             // anything we missed will show up in the debug output
  132.             vertices.Close();
  133.             vertexBuffer.Dispose();
  134.             layout.Dispose();
  135.             inputSignature.Dispose();
  136.             vertexShader.Dispose();
  137.             pixelShader.Dispose();
  138.             renderTarget.Dispose();
  139.             swapChain.Dispose();
  140.             device.Dispose();
  141.         }
  142.  
  143.     }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement