Output.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using OpenTK;
  8. using OpenTK.Graphics.OpenGL;
  9. using MathNet.Numerics.LinearAlgebra.Single;
  10. using bbiwarg.DataSource;
  11. namespace bbiwarg.Graphics
  12. {
  13. class Output : GameWindow
  14. {
  15. private IVideoDataSource source;
  16. private Point[,] depthPixels = new Point[320,240];
  17. private bool initialized = false;
  18. private ImageData currentImage;
  19. private List<IGraphicElement> graphicElements = new List<IGraphicElement>();
  20. private int VBOid = new int();
  21. private int IBOid = new int();
  22. private float[] vertices = new float[0];
  23. private uint[] triangles = new uint[0];
  24. public Output(IVideoDataSource source)
  25. {
  26. this.source = source;
  27. }
  28. protected override void OnLoad(EventArgs e)
  29. {
  30. base.OnLoad(e);
  31. Title = "OutputTest";
  32. GL.ClearColor(Color.Black);
  33. }
  34. protected override void OnRenderFrame(FrameEventArgs e)
  35. {
  36. base.OnRenderFrame(e);
  37. GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
  38. Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, -Vector3.UnitZ, Vector3.UnitY);
  39. GL.MatrixMode(MatrixMode.Modelview);
  40. GL.LoadMatrix(ref modelview);
  41. source.updateFrame();
  42. currentImage = source.getImageData();
  43. if (!initialized) {
  44. initializeDepthPixels();
  45. initBuffers();
  46. initialized = true;
  47. }
  48. updateDepthPixels();
  49. updateBuffer();
  50. drawBuffer();
  51. SwapBuffers();
  52. source.releaseFrame();
  53. }
  54. protected override void OnResize(EventArgs e)
  55. {
  56. base.OnResize(e);
  57. GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);
  58. Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, Width / (float)Height, 1.0f, 3000.0f);
  59. GL.MatrixMode(MatrixMode.Projection);
  60. GL.LoadMatrix(ref projection);
  61. }
  62. private void initializeDepthPixels()
  63. {
  64. int width = currentImage.getWidth();
  65. int height = currentImage.getHeight();
  66. for (int x = 0; x < width; x++)
  67. {
  68. for (int y = 0; y < height; y++)
  69. {
  70. Vertex vertex = new Vertex(x, y, 0.0f);
  71. Color color = Color.White;
  72. float size = 0.5f;
  73. Point pixel = new Point(vertex, color, size);
  74. depthPixels[x, y] = pixel;
  75. graphicElements.Add(pixel);
  76. }
  77. }
  78. }
  79. private void updateDepthPixels()
  80. {
  81. for (int x = 0; x < currentImage.getWidth(); x++)
  82. {
  83. for (int y = 0; y < currentImage.getHeight(); y++)
  84. {
  85. Point depthPixel = depthPixels[x, y];
  86. depthPixel.position.z = currentImage.getDepth(x, y);
  87. depthPixel.color = currentImage.getColor(x, y);
  88. }
  89. }
  90. }
  91. private void initBuffers()
  92. {
  93. GL.EnableClientState(ArrayCap.VertexArray);
  94. GL.GenBuffers(1, out VBOid);
  95. GL.GenBuffers(1, out IBOid);
  96. GL.BindBuffer(BufferTarget.ArrayBuffer, VBOid);
  97. GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * sizeof(float)), vertices, BufferUsageHint.StreamDraw);
  98. GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
  99. GL.BindBuffer(BufferTarget.ElementArrayBuffer, IBOid);
  100. GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(triangles.Length * sizeof(int)), triangles, BufferUsageHint.StaticDraw);
  101. GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
  102. }
  103. public void updateBuffer()
  104. {
  105. List<float> verticesData = new List<float>();
  106. List<uint> triangleData = new List<uint>();
  107. foreach (IGraphicElement graphicElement in graphicElements)
  108. {
  109. List<Vector> elementVertices = graphicElement.getVertices(currentImage.getWidth(), currentImage.getHeight());
  110. uint[] elementTriangles = graphicElement.getTriangleIndices();
  111. Color elementColor = graphicElement.getColor();
  112. uint c = (uint)verticesData.Count / 6;
  113. foreach (Vector elementVertex in elementVertices)
  114. {
  115. verticesData.AddRange(convertColor(elementColor));
  116. verticesData.AddRange(elementVertex);
  117. }
  118. for (int i = 0; i < elementTriangles.Length; i++)
  119. {
  120. triangleData.Add(elementTriangles[i] + c);
  121. }
  122. }
  123. vertices = verticesData.ToArray();
  124. triangles = triangleData.ToArray();
  125. GL.BindBuffer(BufferTarget.ArrayBuffer, VBOid);
  126. GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * sizeof(float)), vertices, BufferUsageHint.StreamDraw);
  127. GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
  128. GL.BindBuffer(BufferTarget.ElementArrayBuffer, IBOid);
  129. GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(triangles.Length * sizeof(int)), triangles, BufferUsageHint.StaticDraw);
  130. GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
  131. }
  132. private void drawBuffer()
  133. {
  134. GL.BindBuffer(BufferTarget.ArrayBuffer, VBOid);
  135. GL.BindBuffer(BufferTarget.ElementArrayBuffer, IBOid);
  136. GL.InterleavedArrays(InterleavedArrayFormat.C3fV3f, 0, IntPtr.Zero);
  137. GL.DrawElements(BeginMode.Triangles, triangles.Length, DrawElementsType.UnsignedInt, 0);
  138. GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
  139. GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
  140. }
  141. private List<float> convertColor(Color color)
  142. {
  143. List<float> result = new List<float>();
  144. result.Add(color.R / 255f);
  145. result.Add(color.G / 255f);
  146. result.Add(color.B / 255f);
  147. return result;
  148. }
  149. }
  150. }