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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
use gl;
use gl::types::*;
use std::mem;
use std::ptr;
use super::enums::*;
#[derive(Clone, Copy)]
pub struct VAO(GLuint);
#[derive(Clone, Copy)]
pub struct VBO(GLuint);
pub fn gl_gen_vertex_arrays(count: GLsizei, arrays: *mut VAO) {
unsafe {
gl::GenVertexArrays(count, &mut (*arrays).0);
}
}
pub fn gl_gen_vertex_array() -> VAO {
let mut vao = VAO(0);
gl_gen_vertex_arrays(1, &mut vao);
vao
}
pub fn gl_gen_buffers(count: GLsizei, buffers: *mut VBO) {
unsafe {
gl::GenBuffers(count, &mut (*buffers).0);
}
}
pub fn gl_gen_buffer() -> VBO {
let mut vbo = VBO(0);
gl_gen_buffers(1, &mut vbo);
vbo
}
pub fn gl_bind_vertex_array(array: VAO) {
unsafe {
gl::BindVertexArray(array.0);
}
}
pub fn gl_bind_buffer(target: GLTarget, buffer: VBO) {
unsafe {
gl::BindBuffer(target as u32, buffer.0);
}
}
pub fn gl_enable_vertex_attrib_array(index: GLuint) {
unsafe {
gl::EnableVertexAttribArray(index);
}
}
pub fn gl_vertex_attrib_pointer(
index: GLuint,
size: GLint,
type_: GLType,
normalised: bool,
stride: GLsizei,
) {
unsafe {
gl::VertexAttribPointer(
index,
size,
type_ as GLenum,
normalised as GLboolean,
stride,
ptr::null(),
);
}
}
pub fn gl_buffer_data<T>(target: GLTarget, data: &[T], usage: GLUsage) {
unsafe {
gl::BufferData(
target as GLenum,
(data.len() * mem::size_of::<T>()) as GLsizeiptr,
mem::transmute(&data[0]),
usage as GLenum,
);
}
}
pub fn gl_delete_buffers(count: GLsizei, buffers: *mut VBO) {
unsafe {
gl::DeleteBuffers(count, &mut (*buffers).0);
}
}
pub fn gl_delete_vertex_arrays(count: GLsizei, arrays: *mut VAO) {
unsafe {
gl::DeleteVertexArrays(count, &mut (*arrays).0);
}
}