def __init__(self): super().__init__(None) self.resize(640, 480) # Creat button and hook it up self._button = QtWidgets.QPushButton("Add a line", self) self._button.clicked.connect(self._on_button_click) # Create canvas, renderer and a scene object self._canvas = WgpuCanvas(parent=self) self._renderer = gfx.WgpuRenderer(self._canvas) self._scene = gfx.Scene() self._camera = gfx.OrthographicCamera(110, 110) # Hook up the animate callback self._canvas.request_draw(self.animate) layout = QtWidgets.QHBoxLayout() self.setLayout(layout) layout.addWidget(self._button) layout.addWidget(self._canvas)
binding = Binding("u_stdinfo", "buffer/uniform", render_info.stdinfo_uniform) shader.define_binding(0, 0, binding) return [ { "render_shader": shader, "primitive_topology": "triangle-strip", "indices": range(4), "bindings0": { 0: binding }, }, ] # %% Setup scene canvas = WgpuCanvas() renderer = gfx.WgpuRenderer(canvas) scene = gfx.Scene() t1 = Square(None, SquareMaterial()) scene.add(t1) camera = gfx.NDCCamera() # This example does not even use the camera if __name__ == "__main__": print(__doc__) canvas.request_draw(lambda: renderer.render(scene, camera)) run()
""" Display a lot of line objects. Because of the architecture of wgpu, this is still performant. """ import time # noqa import numpy as np from wgpu.gui.auto import WgpuCanvas, run import pygfx as gfx canvas = WgpuCanvas(max_fps=999) renderer = gfx.WgpuRenderer(canvas, show_fps=True) scene = gfx.Scene() # Define number of vertices cols = 20 rows = 50 nvertices = 30000 use_thin_lines = True print(nvertices * rows * cols, "vertices in total") x = np.linspace(0.05, 0.95, nvertices, dtype=np.float32) for row in range(rows): for col in range(cols): y = np.sin(x * 25) * 0.45 + np.random.normal(0, 0.02, len(x)).astype(np.float32) positions = np.column_stack([x, y, np.zeros_like(x)])