Skip to content

Commit bdf9cec

Browse files
committed
Support element / index buffers in VAOs
1 parent 236fdb0 commit bdf9cec

File tree

2 files changed

+121
-30
lines changed

2 files changed

+121
-30
lines changed

demosys/opengl/geometry/plane.py

Lines changed: 104 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,111 @@ def plane_xz(size=(10, 10), resolution=(10, 10)):
1616
dx, dz = sx / rx, sz / rz # step
1717
ox, oz = -sx / 2, -sz / 2 # start offset
1818

19-
def vertex(x, z):
20-
yield ox + x * dx
21-
yield 0
22-
yield oz + z * dz
23-
24-
def gen():
25-
up = True
26-
for x in range(rx):
27-
if up:
28-
# Generate strip upwards
29-
for z in reversed(range(rz)):
30-
yield from vertex(x, z)
31-
yield from vertex(x + 1, z)
32-
else:
33-
# Generate strip downwards
34-
for z in range(rz - 1):
35-
yield from vertex(x + 1, z)
36-
yield from vertex(x, z + 1)
37-
38-
up = not up # toggle strip direction
39-
40-
# FIXME: Calculate the actual size (count=rx * rz * 3 * 2)
41-
data = numpy.fromiter(gen(), dtype=numpy.float32)
42-
position_vbo = VBO(data)
43-
44-
vao = VAO("plane_xz", mode=GL.GL_TRIANGLE_STRIP)
19+
def gen_pos():
20+
for z in range(rz):
21+
for x in range(rx):
22+
yield ox + x * dx
23+
yield 0
24+
yield oz + z * dz
25+
26+
def gen_uv():
27+
for z in range(rz):
28+
for x in range(rx):
29+
yield x / (rx - 1)
30+
yield 1 - z / (rz - 1)
31+
32+
def gen_index():
33+
for z in range(rz - 1):
34+
for x in range(rx - 1):
35+
# quad poly left
36+
yield z * rz + x
37+
yield z * rz + x + 1
38+
yield z * rz + x + rx
39+
# quad poly right
40+
yield z * rz + x + rx
41+
yield z * rz + x + 1
42+
yield z * rz + x + rx + 1
43+
44+
pos_data = numpy.fromiter(gen_pos(), dtype=numpy.float32)
45+
position_vbo = VBO(pos_data)
46+
47+
uv_data = numpy.fromiter(gen_uv(), dtype=numpy.float32)
48+
uv_vbo = VBO(uv_data)
49+
50+
index_data = numpy.fromiter(gen_index(), dtype=numpy.int32)
51+
index_vbo = VBO(index_data, target=GL.GL_ELEMENT_ARRAY_BUFFER)
52+
53+
vao = VAO("plane_xz", mode=GL.GL_TRIANGLES)
4554
vao.add_array_buffer(GL.GL_FLOAT, position_vbo)
55+
vao.add_array_buffer(GL.GL_FLOAT, uv_vbo)
4656
vao.map_buffer(position_vbo, "in_position", 3)
57+
vao.map_buffer(uv_vbo, "in_uv", 2)
58+
vao.set_element_buffer(GL.GL_UNSIGNED_INT, index_vbo)
4759
vao.build()
4860
return vao
61+
62+
63+
# def plane_xz(size=(10, 10), resolution=(10, 10)):
64+
# """
65+
# Generates a plane on the xz axis of a specific size and resolution
66+
# :param size: (x, y) tuple
67+
# :param resolution: (x, y) tuple
68+
# :return: VAO
69+
# """
70+
# sx, sz = size
71+
# rx, rz = resolution
72+
# dx, dz = sx / rx, sz / rz # step
73+
# ox, oz = -sx / 2, -sz / 2 # start offset
74+
#
75+
# def vertex(x, z):
76+
# yield ox + x * dx
77+
# yield 0
78+
# yield oz + z * dz
79+
#
80+
# def uv(x, z):
81+
# yield x * 1 / rx
82+
# yield z * 1 / rz
83+
#
84+
# def gen_pos():
85+
# up = True
86+
# for x in range(rx):
87+
# if up:
88+
# # Generate strip upwards
89+
# for z in reversed(range(rz)):
90+
# yield from vertex(x, z)
91+
# yield from vertex(x + 1, z)
92+
# else:
93+
# # Generate strip downwards
94+
# for z in range(rz - 1):
95+
# yield from vertex(x + 1, z)
96+
# yield from vertex(x, z + 1)
97+
#
98+
# up = not up # toggle strip direction
99+
#
100+
# def gen_uv():
101+
# up = True
102+
# for x in range(rx):
103+
# if up:
104+
# # Generate strip upwards
105+
# for z in range(rz):
106+
# yield from uv(x, z)
107+
# yield from uv(x + 1, z)
108+
# else:
109+
# # Generate strip downwards
110+
# for z in range(rz - 1):
111+
# yield from uv(x + 1, z)
112+
# yield from uv(x, z + 1)
113+
#
114+
# pos_data = numpy.fromiter(gen_pos(), dtype=numpy.float32)
115+
# position_vbo = VBO(pos_data)
116+
#
117+
# uv_data = numpy.fromiter(gen_uv(), dtype=numpy.float32)
118+
# uv_vbo = VBO(uv_data)
119+
#
120+
# vao = VAO("plane_xz", mode=GL.GL_TRIANGLE_STRIP)
121+
# vao.add_array_buffer(GL.GL_FLOAT, position_vbo)
122+
# vao.add_array_buffer(GL.GL_FLOAT, uv_vbo)
123+
# vao.map_buffer(position_vbo, "in_position", 3)
124+
# vao.map_buffer(uv_vbo, "in_uv", 2)
125+
# vao.build()
126+
# return vao

demosys/opengl/vao.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,21 @@ def draw(self, mode=None):
9191
:param mode: Override the default GL_TRIANGLES
9292
"""
9393
if self.element_buffer:
94-
raise NotImplemented
95-
if mode is not None:
96-
GL.glDrawArrays(mode, 0, self.vertex_count)
94+
if mode is not None:
95+
GL.glDrawElements(mode,
96+
self.element_buffer.size,
97+
self.element_buffer.format,
98+
self.element_buffer.vbo)
99+
else:
100+
GL.glDrawElements(self.mode,
101+
self.element_buffer.size,
102+
self.element_buffer.format,
103+
self.element_buffer.vbo)
97104
else:
98-
GL.glDrawArrays(self.mode, 0, self.vertex_count)
105+
if mode is not None:
106+
GL.glDrawArrays(mode, 0, self.vertex_count)
107+
else:
108+
GL.glDrawArrays(self.mode, 0, self.vertex_count)
99109

100110
def add_array_buffer(self, format, vbo):
101111
self.array_buffer_map[id(vbo)] = ArrayBuffer(format, vbo)
@@ -186,6 +196,9 @@ def generate_vao_combo(self, shader):
186196
raise VAOError("VAO class have not implemented array binding for {}".format(
187197
mapping.array_buffer.format))
188198

199+
if self.element_buffer:
200+
self.element_buffer.vbo.bind()
201+
189202
self.combos[shader.attribute_key] = combo
190203
GL.glBindVertexArray(0)
191204
return combo

0 commit comments

Comments
 (0)