1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
using System;
using System.Collections.Generic;
using System.IO;
using OpenTK;
using OpenTK.Graphics.OpenGL4;
using Unicity.Renderer.Shapes;
namespace Unicity.Renderer
{
public class GraphicsRenderer : IDisposable
{
RenderWindow window = null;
// Tests
List<float> triangleVerts = new List<float>();
int triangleCount = -1;
int triangleVBO = -1;
int triangleVAO = -1;
Shader shader = null;
bool disposed = false;
public GraphicsRenderer(RenderWindow window)
{
this.window = window;
window.Render += Window_Render;
string vertexCode = File.ReadAllText("shaders/test.vert");
string fragmentCode = File.ReadAllText("shaders/test.frag");
shader = new Shader(vertexCode, fragmentCode);
shader.Use();
shader.SetUniform("inColor", new Vector4(1.0f, 1.0f, 1.0f, 1.0f));
GL.ClearColor(0.5f, 0.5f, 0.5f, 1.0f);
SetRenderData(new Shape[0]);
}
public void SetRenderData(Shape[] shapes)
{
triangleVerts = new List<float>();
triangleCount = 0;
for (int i = 0; i < shapes.Length; i++)
{
if (typeof(Triangle) == shapes[i].GetType())
{
foreach (float val in ((Triangle)shapes[i]).Vertices)
{
triangleVerts.Add(val);
}
triangleCount++;
}
}
if (triangleVAO != -1)
{
GL.DeleteVertexArray(triangleVAO);
}
if (triangleVBO != -1)
{
GL.DeleteBuffer(triangleVBO);
}
triangleVAO = GL.GenVertexArray();
triangleVBO = GL.GenBuffer();
GL.BindVertexArray(triangleVAO);
GL.BindBuffer(BufferTarget.ArrayBuffer, triangleVBO);
GL.BufferData(BufferTarget.ArrayBuffer, triangleVerts.Count * sizeof(float), triangleVerts.ToArray(), BufferUsageHint.DynamicDraw);
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);
GL.EnableVertexAttribArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
}
private void Window_Render(object sender, System.EventArgs e)
{
window.MakeCurrent();
shader.Use();
GL.BindVertexArray(triangleVAO);
GL.DrawArrays(PrimitiveType.Triangles, 0, triangleCount * 3);
GL.BindVertexArray(0);
}
protected virtual void Dispose(bool disposing)
{
if (disposed)
{
return;
}
if (disposing)
{
// Dispose of managed resources
}
// Dispose of unmanaged resources
GL.DeleteVertexArray(triangleVAO);
GL.DeleteBuffer(triangleVBO);
disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
|