Perhaps the way I am structuring my program just doesn’t make sense , but I would like to use a custom group class to easily plot multiple shapes. I create three shapes with the CustomGroup Class and plot them using the same shader program but with different translations.
I expect to see 3 shapes, however only the first shape is being rendered. How can I restructure my code so all shapes are rendered?
The output of the code below is the following:
import pyglet
from pyglet.graphics.shader import Shader, ShaderProgram
from pyglet.gl import GL_TRIANGLES, GL_DEPTH_TEST, glEnable
from pyglet.math import Mat4, Vec3
window = pyglet.window.Window(width=1280, height=720, caption="Hello Pyglet", resizable=True)
glEnable(GL_DEPTH_TEST)
vertex_source = """
#version 330
in vec2 vertices;
in vec4 colors;
uniform mat4 vp;
uniform mat4 model;
out vec4 newColor;
void main() {
gl_Position = vp * model * vec4(vertices, 0.0, 1.0);
newColor = colors;
}
"""
fragment_source = """
#version 330
in vec4 newColor;
out vec4 fragColor;
void main() {
fragColor = newColor;
}
"""
vert_shader = Shader(vertex_source, "vertex")
frag_shader = Shader(fragment_source, "fragment")
program = ShaderProgram(vert_shader, frag_shader)
view_mat = Mat4.from_translation(Vec3(x=0, y=0, z=-1))
proj_mat = Mat4.orthogonal_projection(left=0, right=1280, bottom=0, top=720, z_near=0.1, z_far=100)
vp = proj_mat @ view_mat
program['vp'] = vp
class CustomGroup(pyglet.graphics.Group):
def __init__(self, shaderprogram, translate_mat):
super().__init__()
self.program = shaderprogram
self.translate_mat = translate_mat
self.program.use()
def set_state(self):
self.program['model'] = self.translate_mat
self.program.use()
batch = pyglet.graphics.Batch()
vertices = [x * 100 for x in (-0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5)]
colors = (255,0,0,255,0,255,0,255,0,0,255,255,255,255,255,255) # RGBA for each vertex
translate_mat_1 = Mat4.from_translation(Vec3(x=100, y=360, z=0))
translate_mat_2 = Mat4.from_translation(Vec3(x=440, y=360, z=0))
translate_mat_3 = Mat4.from_translation(Vec3(x=840, y=360, z=0))
custom_group_1 = CustomGroup(program, translate_mat_1)
custom_group_2 = CustomGroup(program, translate_mat_2)
custom_group_3 = CustomGroup(program, translate_mat_3)
for group in [custom_group_1,custom_group_2,custom_group_3]:
program.vertex_list_indexed(4, GL_TRIANGLES,
batch=batch,
indices=(0,1,2,2,3,0),
group=group,
vertices=('f', vertices),
colors=('Bn', colors))
@window.event
def on_draw():
window.clear()
batch.draw()
pyglet.app.run()