TextClass.cs 13 KB

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