def __init__(self): display = pyglet.canvas.get_display() config = display.get_default_screen().get_best_config(Config()) config.major_version = 3 config.minor_version = 3 context = config.create_context(None) Window.__init__(self, 800, 600, visible=False, resizable=True, caption='Tinyblend example', context=context) self.vao = (GLuint * 1)() glGenVertexArrays(1, self.vao) glBindVertexArray(self.vao[0]) # Load shaders shader = shaders.from_files_names('shaders/main.glsl.vert', 'shaders/main.glsl.frag') shader.owned = False shader.use() shader.enable_all_attributes() self.shader = shader # Uniforms matrices setup self.rotation = [-90, 0, 0] self.position = [0, 0, -4.5] shaders.transpose_matrices(False) self.upload_uniforms() # Scene creation self.setup_scene() # Show the window self.set_visible()
def __init__(self, *args, **kwargs): super(ShaderWindow, self).__init__(*args, **kwargs) print("hwnd", self._hwnd) vert = './shader/vert.glsl' frag = './glslsandbox_converted/source/47478.glsl' self.shader_program = pyshaders.from_files_names(vert, frag) self.shader_program.use() tris = (-1, -1, -1, 1, 2, -1, 1, 1, -1, 1, 1, -1) self.polys = pyglet.graphics.vertex_list(6, ('v2f', tris)) self.update_mouse_pos = False self.timescale = 1 self.update_rate = 120 self.backbuffer = None self.texture = pyglet.image.Texture.create(self.width, self.height, gl.GL_RGBA) gl.glEnable(gl.GL_DEPTH_TEST) gl.glEnable(gl.GL_BLEND) pyglet.clock.schedule_interval(self._update_shader_time, 1 / self.update_rate)
p = win32gui.FindWindowEx(tophandle, 0, "SHELLDLL_DefView", None) if p != 0: workerw = win32gui.FindWindowEx(0, tophandle, "WorkerW", None) pyglet_hwnd = window._hwnd pyglet_hdc = win32gui.GetWindowDC(pyglet_hwnd) # win32gui.SetParent(pyglet_hwnd, workerw) return True win32gui.EnumWindows(_enum_windows, 0) # sets window behind icons # Shader creation vert = './shader/vert.glsl' #frag = './glslsandbox_converted/source/46931.glsl' frag = './shader/frag/light-sabre.glsl' shader = pyshaders.from_files_names(vert, frag) shader.use() framerate = 30 timescale = 1.0 def _update_shader_time(dt): if 'time' in shader.uniforms: shader.uniforms.time += dt * timescale pyglet.clock.schedule_interval(_update_shader_time, 1 / framerate) vert_count = 70000 vert_mode = GL_TRIANGLES
def __init__(self, logger, parent_viewport): super().__init__( logger, parent_viewport, shader=from_files_names('shaders/shader.vert', 'shaders/onboarding_page/map_switcher_onboarding_page.frag') )
def test_double_uniforms(self): load_extension('double_uniforms') shader = from_files_names(vert_path('shader1'), frag_path('ext_shader_double')) self.assertEqual(18, len(shader.uniforms)) self.assertEqual(18, shader.uniforms_count) uniforms_names = ['model', 'view', 'test_double', 'test_dvec2', 'test_dvec4', 'test_dvec3', 'test_double_3', 'test_dvec2_2', 'test_dmat3', 'test_dmat2', 'test_dmat4', 'test_dmat2_3', 'test_dmat2_4', 'test_dmat3_2', 'test_dmat3_4', 'test_dmat4_2', 'test_dmat4_3', 'test_dmat2_2'] for name, info in shader.uniforms: self.assertIn(name, uniforms_names) uniforms_names.remove(name) shader.use() uni = shader.uniforms uni.test_double = 6.0 self.assertEqual(6.0, uni.test_double) uni.test_dvec2 = (3.0, 4720.0) self.assertEqual((3.0, 4720.0), uni.test_dvec2 ) uni.test_dvec3 = (7000.0, 8000.0, 80000.0) self.assertEqual((7000.0, 8000.0, 80000.0), uni.test_dvec3 ) uni.test_dvec4 = (1.0, 2.0, 3.0, 30000.0) self.assertEqual((1.0, 2.0, 3.0, 30000.0), uni.test_dvec4) uni.test_double_3 = (1.0, 3782463.0, 3.0) self.assertEqual((1.0, 3782463.0, 3.0), uni.test_double_3) uni.test_dvec2_2 = ((99.0, 88.0), (9345.0, 9456.0)) self.assertEqual(((99.0, 88.0), (9345.0, 9456.0)), uni.test_dvec2_2) uni.test_dmat2 = ((1.0, 2.0), (3.0, 4.0)) self.assertEqual(((1.0, 2.0), (3.0, 4.0)), uni.test_dmat2) uni.test_dmat3 = ((1.0, 2.0, 9.0), (3.0, 4.0, 10.0), (22.0, 33.0, 44.0)) self.assertEqual(((1.0, 2.0, 9.0), (3.0, 4.0, 10.0), (22.0, 33.0, 44.0)), uni.test_dmat3) uni.test_dmat4 = ((1.0, 2.0, 19.0, 80.0), (3.0, 4.0, 11.0, 41.0), (16.0, 3.0, 11.0, 89.0), (83.0, 233.0, 213.0, 982.0)) self.assertEqual(((1.0, 2.0, 19.0, 80.0), (3.0, 4.0, 11.0, 41.0), (16.0, 3.0, 11.0, 89.0), (83.0, 233.0, 213.0, 982.0)), uni.test_dmat4) uni.test_dmat2_3 = ((8.0, 77.0, 45.0), (9.0, 244.0, 24.0)) self.assertEqual(((8.0, 77.0, 45.0), (9.0, 244.0, 24.0)), uni.test_dmat2_3) uni.test_dmat2_4 = ((8.0, 77.0, 45.0, 82.0), (9.0, 244.0, 24.0, 374.0)) self.assertEqual(((8.0, 77.0, 45.0, 82.0), (9.0, 244.0, 24.0, 374.0)), uni.test_dmat2_4) uni.test_dmat3_2 = ((8.0, 77.0), (45.0, 82.0), (9.0, 244.0)) self.assertEqual(((8.0, 77.0), (45.0, 82.0), (9.0, 244.0)), uni.test_dmat3_2) uni.test_dmat3_4 = ((8.0, 77.0, 45.0, 82.0), (9.0, 244.0, 24.0, 374.0), (98.0, 2448.0, 248.0, 3748.0),) self.assertEqual(((8.0, 77.0, 45.0, 82.0), (9.0, 244.0, 24.0, 374.0), (98.0, 2448.0, 248.0, 3748.0),), uni.test_dmat3_4) uni.test_dmat4_2 = ((8.0, 77.0), (45.0, 82.0), (9.0, 244.0), (91.0, 1244.0)) self.assertEqual(((8.0, 77.0), (45.0, 82.0), (9.0, 244.0), (91.0, 1244.0)), uni.test_dmat4_2) uni.test_dmat4_3 = ((8.0, 77.0, 45.0), (9.0, 244.0, 24.0), (98.0, 2448.0, 248.0), (99.0, 34.0, 1.0)) self.assertEqual(((8.0, 77.0, 45.0), (9.0, 244.0, 24.0), (98.0, 2448.0, 248.0), (99.0, 34.0, 1.0)), uni.test_dmat4_3) uni.test_dmat2_2 = (((1.0, 2.0), (3.0, 4.0)), ((10.0, 20.0), (30.0, 40.0))) self.assertEqual((((1.0, 2.0), (3.0, 4.0)), ((10.0, 20.0), (30.0, 40.0))), uni.test_dmat2_2)
def test_from_file_names(self): verts = vert_path('shader2') frags = ( frag_path('shader2'), frag_path('frag_lib') ) shader = from_files_names(verts, frags) self.assertTrue(shader.valid(), 'generated shader is not valid')
def test_get_set_uniforms_single(self): " Test get set uniforms as single value " round_tuple = lambda x: tuple([round(y, 2) for y in x]) shader = from_files_names(vert_path('shader1'), frag_path('shader1')) uni = shader.uniforms shader.use() # Shader must be in use uni.test_float = 10.53 self.assertEqual(10.53, round(uni.test_float, 2)) uni.test_vec2 = (5.4, 2.55) self.assertEqual((5.4, 2.55), round_tuple(uni.test_vec2) ) uni.test_vec3 = (23.2, 64.33, 2.34) self.assertEqual((23.2, 64.33, 2.34), round_tuple(uni.test_vec3) ) uni.test_vec4 = (11.1, 623.32, 67.75, 23.63) self.assertEqual((11.1, 623.32, 67.75, 23.63), round_tuple(uni.test_vec4) ) uni.test_int = 8 self.assertEqual(8, uni.test_int) uni.test_ivec2 = (844, 453) self.assertEqual((844, 453), uni.test_ivec2) uni.test_ivec3 = (843, 92, 1374) self.assertEqual((843, 92, 1374), uni.test_ivec3) uni.test_ivec4 = (735, 8372, 93, 652) self.assertEqual((735, 8372, 93, 652), uni.test_ivec4) uni.test_mat2 = ((5.0, 8.0), (2.0, 4.0)) self.assertEqual(((5.0, 8.0), (2.0, 4.0)), uni.test_mat2) uni.test_mat3 = ((5.0, 8.0, 7.0), (2.0, 4.0, 21.0), (2.0, 10.0, 34.0)) self.assertEqual(((5.0, 8.0, 7.0), (2.0, 4.0, 21.0), (2.0, 10.0, 34.0)), uni.test_mat3) uni.test_mat3 = ((5.0, 8.0, 7.0), (2.0, 4.0, 21.0), (2.0, 10.0, 34.0)) self.assertEqual(((5.0, 8.0, 7.0), (2.0, 4.0, 21.0), (2.0, 10.0, 34.0)), uni.test_mat3) uni.test_mat4 = ((5.0, 8.0, 7.0, 9.0), (2.0, 4.0, 21.0, 32.0), (2.0, 10.0, 34.0, 91.0), (1.0, 4.0, 8.0, 19.0)) self.assertEqual(((5.0, 8.0, 7.0, 9.0), (2.0, 4.0, 21.0, 32.0), (2.0, 10.0, 34.0, 91.0), (1.0, 4.0, 8.0, 19.0)), uni.test_mat4) uni.test_mat2x3 = ((8.0, 9.0, 10.0), (20.0, 11.0, 2.0)) self.assertEqual(((8.0, 9.0, 10.0), (20.0, 11.0, 2.0)), uni.test_mat2x3) uni.test_mat2x4 = ((8.0, 9.0, 10.0, 3.0), (20.0, 11.0, 2.0, 13.0)) self.assertEqual(((8.0, 9.0, 10.0, 3.0), (20.0, 11.0, 2.0, 13.0)), uni.test_mat2x4) uni.test_mat3x2 = ((8.0, 9.0), (20.0, 11.0), (17.0, 16.0)) self.assertEqual(((8.0, 9.0), (20.0, 11.0), (17.0, 16.0)), uni.test_mat3x2) uni.test_mat3x4 = ((8.0, 9.0, 10.0, 3.0), (20.0, 11.0, 2.0, 13.0), (14.0, 15.0, 16.0, 83.0)) self.assertEqual(((8.0, 9.0, 10.0, 3.0), (20.0, 11.0, 2.0, 13.0), (14.0, 15.0, 16.0, 83.0)), uni.test_mat3x4) uni.test_mat4x2 = ((10.0, 11.0), (12.0, 13.0), ( 1.0, 2.0), (14.0, 15.0)) self.assertEqual(((10.0, 11.0), (12.0, 13.0), ( 1.0, 2.0), (14.0, 15.0)), uni.test_mat4x2) uni.test_mat4x3 = ((1.0, 2.0, 3.0), ( 4.0, 5.0, 6.0), (7.0, 8.0, 9.0), (10.0, 11.0, 12.0)) self.assertEqual(((1.0, 2.0, 3.0), ( 4.0, 5.0, 6.0), (7.0, 8.0, 9.0), (10.0, 11.0, 12.0)), uni.test_mat4x3)
def test_get_set_uniforms_single(self): " Test get set uniforms as single value " round_tuple = lambda x: tuple([round(y, 2) for y in x]) shader = from_files_names(vert_path('shader1'), frag_path('shader1')) uni = shader.uniforms shader.use() # Shader must be in use uni.test_float = 10.53 self.assertEqual(10.53, round(uni.test_float, 2)) uni.test_vec2 = (5.4, 2.55) self.assertEqual((5.4, 2.55), round_tuple(uni.test_vec2)) uni.test_vec3 = (23.2, 64.33, 2.34) self.assertEqual((23.2, 64.33, 2.34), round_tuple(uni.test_vec3)) uni.test_vec4 = (11.1, 623.32, 67.75, 23.63) self.assertEqual((11.1, 623.32, 67.75, 23.63), round_tuple(uni.test_vec4)) uni.test_int = 8 self.assertEqual(8, uni.test_int) uni.test_ivec2 = (844, 453) self.assertEqual((844, 453), uni.test_ivec2) uni.test_ivec3 = (843, 92, 1374) self.assertEqual((843, 92, 1374), uni.test_ivec3) uni.test_ivec4 = (735, 8372, 93, 652) self.assertEqual((735, 8372, 93, 652), uni.test_ivec4) uni.test_mat2 = ((5.0, 8.0), (2.0, 4.0)) self.assertEqual(((5.0, 8.0), (2.0, 4.0)), uni.test_mat2) uni.test_mat3 = ((5.0, 8.0, 7.0), (2.0, 4.0, 21.0), (2.0, 10.0, 34.0)) self.assertEqual( ((5.0, 8.0, 7.0), (2.0, 4.0, 21.0), (2.0, 10.0, 34.0)), uni.test_mat3) uni.test_mat3 = ((5.0, 8.0, 7.0), (2.0, 4.0, 21.0), (2.0, 10.0, 34.0)) self.assertEqual( ((5.0, 8.0, 7.0), (2.0, 4.0, 21.0), (2.0, 10.0, 34.0)), uni.test_mat3) uni.test_mat4 = ((5.0, 8.0, 7.0, 9.0), (2.0, 4.0, 21.0, 32.0), (2.0, 10.0, 34.0, 91.0), (1.0, 4.0, 8.0, 19.0)) self.assertEqual(((5.0, 8.0, 7.0, 9.0), (2.0, 4.0, 21.0, 32.0), (2.0, 10.0, 34.0, 91.0), (1.0, 4.0, 8.0, 19.0)), uni.test_mat4) uni.test_mat2x3 = ((8.0, 9.0, 10.0), (20.0, 11.0, 2.0)) self.assertEqual(((8.0, 9.0, 10.0), (20.0, 11.0, 2.0)), uni.test_mat2x3) uni.test_mat2x4 = ((8.0, 9.0, 10.0, 3.0), (20.0, 11.0, 2.0, 13.0)) self.assertEqual(((8.0, 9.0, 10.0, 3.0), (20.0, 11.0, 2.0, 13.0)), uni.test_mat2x4) uni.test_mat3x2 = ((8.0, 9.0), (20.0, 11.0), (17.0, 16.0)) self.assertEqual(((8.0, 9.0), (20.0, 11.0), (17.0, 16.0)), uni.test_mat3x2) uni.test_mat3x4 = ((8.0, 9.0, 10.0, 3.0), (20.0, 11.0, 2.0, 13.0), (14.0, 15.0, 16.0, 83.0)) self.assertEqual(((8.0, 9.0, 10.0, 3.0), (20.0, 11.0, 2.0, 13.0), (14.0, 15.0, 16.0, 83.0)), uni.test_mat3x4) uni.test_mat4x2 = ((10.0, 11.0), (12.0, 13.0), (1.0, 2.0), (14.0, 15.0)) self.assertEqual( ((10.0, 11.0), (12.0, 13.0), (1.0, 2.0), (14.0, 15.0)), uni.test_mat4x2) uni.test_mat4x3 = ((1.0, 2.0, 3.0), (4.0, 5.0, 6.0), (7.0, 8.0, 9.0), (10.0, 11.0, 12.0)) self.assertEqual(((1.0, 2.0, 3.0), (4.0, 5.0, 6.0), (7.0, 8.0, 9.0), (10.0, 11.0, 12.0)), uni.test_mat4x3) tex_16x16 = pyglet.image.load(tex_path("texture_16x16")).get_texture() tex_31x16 = pyglet.image.load( tex_path("texture_31x16")).get_texture(rectangle=True) # uni.test_tex = tex_16x16 self.assertEqual(0, uni.test_tex) uni.test_tex_rect = tex_31x16 self.assertEqual(1, uni.test_tex_rect) # uni.test_tex = tex_16x16 # check for texture units bindings preserving self.assertEqual(0, uni.test_tex) uni.test_tex_rect = tex_31x16 self.assertEqual(1, uni.test_tex_rect) # uni.test_tex = 2 self.assertEqual(2, uni.test_tex) uni.test_tex_rect = 3 self.assertEqual(3, uni.test_tex_rect)
def __init__(self, aspect: float): self.array = buffer_array = gl.GLuint(0) self.vertices = vertex_buffer = gl.GLuint(0) self.offsets = offset_buffer = gl.GLuint(0) self.indices = index_buffer = gl.GLuint(0) self.edge_chunks = 3 self.instances = 0 self.stored_chunks: list[int] = [] gl.glGenVertexArrays(1, byref(buffer_array)) gl.glGenBuffers(1, byref(vertex_buffer)) gl.glGenBuffers(1, byref(offset_buffer)) gl.glGenBuffers(1, byref(index_buffer)) self.shader = from_files_names( "res/Shaders/chunk.vert", "res/Shaders/chunk.frag" ) self.shader.use() width = aspect if aspect >= 1.0 else 1.0 height = 1.0 / aspect if aspect < 1.0 else 1.0 self.shader.uniforms["projection"].set(( (1.0 / width, 0.0, 0.0, 0.0), (0.0, 1.0 / height, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0), (0.0, 0.0, 0.0, 1.0) )) cell_size = 1.0 / Chunk.edge_cells # The math gets weird converting between quad and edge space. num_quads_x = num_quads_y = Chunk.edge_cells num_vertices_x = num_quads_x + 1 num_vertices_y = num_quads_y + 1 def construct_vertex_buffer(): # Crazy thought, instead of creating quads here, we can render points # and use a geometry shader to create the quads. # Saves (width + height) * 2 * sizeof(float) bytes on vertices and completely # elminiates indices. # Create vertex buffer. x_slice = y_slice = cell_size chunk_vertices = (gl.GLfloat * (num_vertices_x * num_vertices_y * 2))() for row in range(num_vertices_y): for col in range(num_vertices_x): index = (row * num_vertices_x + col) * 2 # Convert to array space. chunk_vertices[index:index + 2] = ( # Define the chunk by its center. x_slice * float(col) - 0.5, y_slice * float(row) - 0.5 ) gl.glBufferData( gl.GL_ARRAY_BUFFER, sizeof(chunk_vertices), chunk_vertices, gl.GL_STATIC_DRAW ) gl.glEnableVertexAttribArray(0) gl.glVertexAttribPointer(0, 2, gl.GL_FLOAT, False, 2 * sizeof(gl.GLfloat), 0) def construct_offset_buffer(): gl.glBufferData(gl.GL_ARRAY_BUFFER, 9 * 2 * sizeof(gl.GLfloat), None, gl.GL_DYNAMIC_DRAW) gl.glEnableVertexAttribArray(1) gl.glVertexAttribPointer(1, 2, gl.GL_FLOAT, False, 2 * sizeof(gl.GLfloat), 0) gl.glVertexAttribDivisor(1, 1) def construct_index_buffer(): chunk_indices = (gl.GLuint * (num_quads_x * num_quads_y * 6))() for row in range(num_quads_y): for col in range(num_quads_x): current_quad = row * num_quads_x + col # Calculate the current block in the chunk. left_corner = current_quad + row # Add one extra column each time we need to go up a row. index = current_quad * 6 # Convert to array space. chunk_indices[index:index + 6] = ( # Quad lower right triangle. left_corner, left_corner + 1, left_corner + num_vertices_x + 1, # Quad upper right triangle. left_corner + num_vertices_x + 1, left_corner + num_vertices_x, left_corner ) gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, sizeof(chunk_indices), chunk_indices, gl.GL_STATIC_DRAW) gl.glBindVertexArray(buffer_array) gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vertex_buffer) construct_vertex_buffer() gl.glBindBuffer(gl.GL_ARRAY_BUFFER, offset_buffer) construct_offset_buffer() gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, index_buffer) construct_index_buffer() gl.glBindVertexArray(0) gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0) gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, 0)
def on_draw(self): self.clear() self.shape_1.render() # self.shape_2.render() # def on_resize(self, width, height): # pyglet.gl.glViewport(0, 0, width, height) def on_key_press(self, symbol, modifiers): if symbol in colour_map.keys(): shader.uniforms.colour = colour_map[symbol] pyglet.gl.glClearColor(0, 0, 0, 0) w = 512 h = w window = MyWindow(visible=True, width=w, height=h, resizable=True) shader = pyshaders.from_files_names("example.vert", "example.frag") shader.use() shader.uniforms.offset_x = 0.1 shader.uniforms.colour = 1 colour_map = {getattr(key, f"_{i}"): (i + 1) / 10 for i in range(10)} if __name__ == '__main__': pyglet.app.run()