TextClass.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. using System;
  2. using System.Threading.Tasks;
  3. using System.Windows.Forms;
  4. using SlimDX;
  5. using SlimDX.D3DCompiler;
  6. using SlimDX.Direct3D11;
  7. using SlimDX.DXGI;
  8. using SlimDX.Windows;
  9. using Device = SlimDX.Direct3D11.Device;
  10. using Resource = SlimDX.Direct3D11.Resource;
  11. using Buffer = SlimDX.Direct3D11.Buffer;
  12. namespace EQ2ModelViewer
  13. {
  14. public class TextClass
  15. {
  16. public struct VertexType
  17. {
  18. public Vector3 position;
  19. public Vector2 texture;
  20. };
  21. private struct SentenceType
  22. {
  23. public Buffer vertexBuffer;
  24. public Buffer indexBuffer;
  25. public int vertexCount;
  26. public int indexCount;
  27. public int maxLength;
  28. public float red;
  29. public float green;
  30. public float blue;
  31. };
  32. private FontClass m_Font;
  33. private FontShaderClass m_FontShader;
  34. private int m_ScreenWidth;
  35. private int m_ScreenHeight;
  36. private Matrix m_BaseViewMatrix;
  37. private SentenceType m_Sentence1;
  38. private SentenceType m_Sentence2;
  39. private SentenceType m_Sentence3;
  40. private SentenceType m_Sentence4;
  41. private SentenceType m_Sentence5;
  42. private SentenceType m_Sentence6;
  43. private SentenceType m_Sentence7;
  44. private SentenceType m_Sentence8;
  45. private SentenceType m_Sentence9;
  46. private SentenceType m_Sentence10;
  47. private SentenceType m_Sentence11;
  48. public bool Initialize(Device device, DeviceContext context, int screenWidth, int screenHeight, Matrix baseViewMatrix)
  49. {
  50. m_ScreenWidth = screenWidth;
  51. m_ScreenHeight = screenHeight;
  52. m_BaseViewMatrix = baseViewMatrix;
  53. m_Font = new FontClass();
  54. if (!m_Font.Initialize(device, "fontdata.txt", "font.dds"))
  55. return false;
  56. m_FontShader = new FontShaderClass();
  57. if (!m_FontShader.Initialize(device))
  58. return false;
  59. InitializeSentence(ref m_Sentence1, 16, device);
  60. UpdateSentence(ref m_Sentence1, "Hello", 100, 100, 1.0f, 1.0f, 1.0f, context);
  61. InitializeSentence(ref m_Sentence2, 32, device);
  62. UpdateSentence(ref m_Sentence2, "Goodbye", 100, 200, 1.0f, 1.0f, 0.0f, context);
  63. InitializeSentence(ref m_Sentence3, 32, device);
  64. UpdateSentence(ref m_Sentence3, "", 0, 0, 1.0f, 1.0f, 0.0f, context);
  65. InitializeSentence(ref m_Sentence4, 32, device);
  66. UpdateSentence(ref m_Sentence4, "", 0, 0, 1.0f, 1.0f, 0.0f, context);
  67. InitializeSentence(ref m_Sentence5, 32, device);
  68. UpdateSentence(ref m_Sentence5, "", 0, 0, 1.0f, 1.0f, 0.0f, context);
  69. InitializeSentence(ref m_Sentence6, 32, device);
  70. UpdateSentence(ref m_Sentence6, "", 0, 0, 1.0f, 1.0f, 0.0f, context);
  71. InitializeSentence(ref m_Sentence7, 32, device);
  72. UpdateSentence(ref m_Sentence7, "", 0, 0, 1.0f, 1.0f, 0.0f, context);
  73. InitializeSentence(ref m_Sentence8, 32, device);
  74. UpdateSentence(ref m_Sentence8, "", 0, 0, 1.0f, 1.0f, 0.0f, context);
  75. InitializeSentence(ref m_Sentence9, 32, device);
  76. UpdateSentence(ref m_Sentence9, "", 0, 0, 1.0f, 1.0f, 0.0f, context);
  77. InitializeSentence(ref m_Sentence10, 32, device);
  78. UpdateSentence(ref m_Sentence10, "", 0, 0, 1.0f, 1.0f, 0.0f, context);
  79. InitializeSentence(ref m_Sentence11, 32, device);
  80. UpdateSentence(ref m_Sentence11, "", 0, 0, 1.0f, 1.0f, 0.0f, context);
  81. return true;
  82. }
  83. public void ShutDown()
  84. {
  85. ReleaseSentence(ref m_Sentence1);
  86. ReleaseSentence(ref m_Sentence2);
  87. ReleaseSentence(ref m_Sentence3);
  88. ReleaseSentence(ref m_Sentence4);
  89. ReleaseSentence(ref m_Sentence5);
  90. ReleaseSentence(ref m_Sentence6);
  91. ReleaseSentence(ref m_Sentence7);
  92. ReleaseSentence(ref m_Sentence8);
  93. ReleaseSentence(ref m_Sentence9);
  94. ReleaseSentence(ref m_Sentence10);
  95. ReleaseSentence(ref m_Sentence11);
  96. if (m_FontShader != null)
  97. {
  98. m_FontShader.ShutDown();
  99. m_FontShader = null;
  100. }
  101. if (m_Font != null)
  102. {
  103. m_Font.ShutDown();
  104. m_Font = null;
  105. }
  106. }
  107. public bool Render(DeviceContext context, Matrix world, Matrix ortho)
  108. {
  109. RenderSentence(context, m_Sentence1, world, ortho);
  110. RenderSentence(context, m_Sentence2, world, ortho);
  111. RenderSentence(context, m_Sentence3, world, ortho);
  112. RenderSentence(context, m_Sentence4, world, ortho);
  113. RenderSentence(context, m_Sentence5, world, ortho);
  114. RenderSentence(context, m_Sentence6, world, ortho);
  115. RenderSentence(context, m_Sentence7, world, ortho);
  116. RenderSentence(context, m_Sentence8, world, ortho);
  117. RenderSentence(context, m_Sentence9, world, ortho);
  118. RenderSentence(context, m_Sentence10, world, ortho);
  119. RenderSentence(context, m_Sentence11, world, ortho);
  120. return true;
  121. }
  122. private bool InitializeSentence(ref SentenceType sentence, int maxLength, Device device)
  123. {
  124. BufferDescription vertexBufferDesc;
  125. BufferDescription indexBufferDesc;
  126. DataStream vertexData;
  127. DataStream indexData;
  128. sentence = new SentenceType();
  129. sentence.maxLength = maxLength;
  130. sentence.vertexCount = 6 * maxLength;
  131. sentence.indexCount = sentence.vertexCount;
  132. vertexData = new DataStream(sentence.vertexCount * System.Runtime.InteropServices.Marshal.SizeOf(typeof(VertexType)), true, true);
  133. indexData = new DataStream(sentence.indexCount * sizeof(uint), true, true);
  134. for (uint i = 0; i < sentence.indexCount; i++)
  135. indexData.Write(i);
  136. indexData.Position = 0;
  137. vertexBufferDesc = new BufferDescription(System.Runtime.InteropServices.Marshal.SizeOf(typeof(VertexType)) * sentence.vertexCount, ResourceUsage.Dynamic, BindFlags.VertexBuffer, CpuAccessFlags.Write, ResourceOptionFlags.None, 0);
  138. sentence.vertexBuffer = new Buffer(device, vertexData, vertexBufferDesc);
  139. indexBufferDesc = new BufferDescription(System.Runtime.InteropServices.Marshal.SizeOf(typeof(UInt32)) * sentence.indexCount, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
  140. sentence.indexBuffer = new Buffer(device, indexData, indexBufferDesc);
  141. return true;
  142. }
  143. private bool UpdateSentence(ref SentenceType sentence, string text, int positionX, int positionY, float red, float green, float blue, DeviceContext context)
  144. {
  145. int numLetters;
  146. VertexType[] vertices;
  147. float drawX;
  148. float drawY;
  149. sentence.red = red;
  150. sentence.green = green;
  151. sentence.blue = blue;
  152. numLetters = text.Length;
  153. if (numLetters > sentence.maxLength)
  154. return false;
  155. vertices = new VertexType[sentence.vertexCount];
  156. drawX = (float)((m_ScreenWidth / 2 * -1) + positionX);
  157. drawY = (float)((m_ScreenHeight / 2) - positionY);
  158. m_Font.BuildVertexArray(text, drawX, drawY, ref vertices);
  159. var mappedResource = context.MapSubresource(sentence.vertexBuffer, MapMode.WriteDiscard, SlimDX.Direct3D11.MapFlags.None);
  160. VertexType[] data = vertices;
  161. mappedResource.Data.WriteRange<VertexType>(data);
  162. context.UnmapSubresource(sentence.vertexBuffer, 0);
  163. return true;
  164. }
  165. private void ReleaseSentence(ref SentenceType sentence)
  166. {
  167. if (sentence.vertexBuffer != null)
  168. sentence.vertexBuffer.Dispose();
  169. if (sentence.indexBuffer != null)
  170. sentence.indexBuffer.Dispose();
  171. }
  172. private bool RenderSentence(DeviceContext context, SentenceType sentence, Matrix world, Matrix ortho)
  173. {
  174. int stride = System.Runtime.InteropServices.Marshal.SizeOf(typeof(VertexType));
  175. context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(sentence.vertexBuffer, stride, 0));
  176. context.InputAssembler.SetIndexBuffer(sentence.indexBuffer, Format.R32_UInt, 0);
  177. context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
  178. Vector4 pixelColor = new Vector4(sentence.red, sentence.green, sentence.blue, 1.0f);
  179. if (!m_FontShader.Render(context, sentence.indexCount, world, m_BaseViewMatrix, ortho, m_Font.GetTexture(), pixelColor))
  180. return false;
  181. return true;
  182. }
  183. public bool SetFPS(int fps, DeviceContext context)
  184. {
  185. float red;
  186. float green;
  187. float blue;
  188. if (fps > 9999)
  189. fps = 9999;
  190. if (fps >= 60)
  191. {
  192. red = 0.0f;
  193. green = 1.0f;
  194. blue = 0.0f;
  195. }
  196. else if (fps > 30)
  197. {
  198. red = 1.0f;
  199. green = 1.0f;
  200. blue = 0.0f;
  201. }
  202. else
  203. {
  204. red = 1.0f;
  205. green = 0.0f;
  206. blue = 0.0f;
  207. }
  208. if (!UpdateSentence(ref m_Sentence1, "FPS: " + fps.ToString(), 20, 20, red, green, blue, context))
  209. return false;
  210. return true;
  211. }
  212. public bool SetPosition(Vector3 position, DeviceContext context)
  213. {
  214. if (!UpdateSentence(ref m_Sentence10, "Loc: " + position.ToString(), 20, 40, 0.0f, 1.0f, 0.0f, context))
  215. return false;
  216. return true;
  217. }
  218. public bool SetSelectedModel(Model model, DeviceContext context) {
  219. bool ret;
  220. if (model != null) {
  221. ret = UpdateSentence(ref m_Sentence2, "Selected Model Info:", 20, 60, 1.0f, 0.0f, 0.0f, context)
  222. && UpdateSentence(ref m_Sentence3, "Widget ID: " + model.WidgetID.ToString(), 20, 80, 1.0f, 0.0f, 0.0f, context)
  223. && UpdateSentence(ref m_Sentence4, "X: " + model.Position.X.ToString(), 20, 100, 1.0f, 0.0f, 0.0f, context)
  224. && UpdateSentence(ref m_Sentence5, "Y: " + model.Position.Y.ToString(), 20, 120, 1.0f, 0.0f, 0.0f, context)
  225. && UpdateSentence(ref m_Sentence6, "Z: " + model.Position.Z.ToString(), 20, 140, 1.0f, 0.0f, 0.0f, context)
  226. && UpdateSentence(ref m_Sentence7, "Yaw: " + model.Rotation.X.ToString(), 20, 160, 1.0f, 0.0f, 0.0f, context)
  227. && UpdateSentence(ref m_Sentence8, "Pitch: " + model.Rotation.Y.ToString(), 20, 180, 1.0f, 0.0f, 0.0f, context)
  228. && UpdateSentence(ref m_Sentence9, "Roll: " + model.Rotation.Z.ToString(), 20, 200, 1.0f, 0.0f, 0.0f, context)
  229. && UpdateSentence(ref m_Sentence11, "Grid: " + model.GridID.ToString(), 20, 220, 1.0f, 0.0f, 0.0f, context);
  230. }
  231. else {
  232. ret = UpdateSentence(ref m_Sentence2, "", 20, 60, 1.0f, 0.0f, 0.0f, context)
  233. && UpdateSentence(ref m_Sentence3, "", 20, 80, 1.0f, 0.0f, 0.0f, context)
  234. && UpdateSentence(ref m_Sentence4, "", 20, 100, 1.0f, 0.0f, 0.0f, context)
  235. && UpdateSentence(ref m_Sentence5, "", 20, 120, 1.0f, 0.0f, 0.0f, context)
  236. && UpdateSentence(ref m_Sentence6, "", 20, 140, 1.0f, 0.0f, 0.0f, context)
  237. && UpdateSentence(ref m_Sentence7, "", 20, 160, 1.0f, 0.0f, 0.0f, context)
  238. && UpdateSentence(ref m_Sentence8, "", 20, 180, 1.0f, 0.0f, 0.0f, context)
  239. && UpdateSentence(ref m_Sentence9, "", 20, 200, 1.0f, 0.0f, 0.0f, context)
  240. && UpdateSentence(ref m_Sentence11, "", 20, 220, 1.0f, 0.0f, 0.0f, context);
  241. }
  242. return ret;
  243. }
  244. }
  245. }