Output.cs 6.7 KB

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