@@ -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
0 commit comments