{"pyodide":{"version":"314.0.7","url":"https://cdn.jsdelivr.net/pyodide/v314.0.7/full/","index":"pyodide-314.0.7-86e5e834d636/","packages":["cffi","numpy","markupsafe","sniffio"],"stdlib":{"url":"python_stdlib.b9aadb8f9a01.zip","size":4479550},"not_on_import":["pillow_heif","xxhash","scipy","charset_normalizer","networkx","lxml","shapely","brotli","zstandard","click","pygments","rich","attr"],"files":{"cffi":["cffi-2.0.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl","pycparser-3.0-py3-none-any.whl"],"httpx":["httpx-0.28.1-py3-none-any.whl"],"imageio":["imageio-2.37.3-py3-none-any.whl","numpy-2.4.6-cp314-cp314-pyemscripten_2026_0_wasm32.whl","pillow-12.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl"],"markupsafe":["markupsafe-3.0.3-cp314-cp314-pyemscripten_2026_0_wasm32.whl"],"numpy":["numpy-2.4.6-cp314-cp314-pyemscripten_2026_0_wasm32.whl"],"packaging":["packaging-26.1-py3-none-any.whl"],"pillow":["pillow-12.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl"],"requests":["requests-2.33.1-py3-none-any.whl","charset_normalizer-3.4.7-py3-none-any.whl","idna-3.11-py3-none-any.whl","urllib3-2.6.3-py3-none-any.whl","certifi-2026.4.22-py3-none-any.whl"],"scikit-image":["scikit_image-0.26.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl","packaging-26.1-py3-none-any.whl","numpy-2.4.6-cp314-cp314-pyemscripten_2026_0_wasm32.whl","scipy-1.18.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl","networkx-3.6.1-py3-none-any.whl","pillow-12.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl","imageio-2.37.3-py3-none-any.whl","pywavelets-1.9.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl","lazy_loader-0.5-py3-none-any.whl","decorator-5.2.1-py3-none-any.whl","setuptools-82.0.1-py3-none-any.whl","matplotlib-3.10.8-cp314-cp314-pyemscripten_2026_0_wasm32.whl","pyparsing-3.3.2-py3-none-any.whl","contourpy-1.3.3-cp314-cp314-pyemscripten_2026_0_wasm32.whl","cycler-0.12.1-py3-none-any.whl","fonttools-4.62.1-py3-none-any.whl","kiwisolver-1.5.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl","python_dateutil-2.9.0.post0-py2.py3-none-any.whl","pytz-2026.1.post1-py2.py3-none-any.whl","six-1.17.0-py2.py3-none-any.whl"],"scikit-learn":["scikit_learn-1.8.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl","scipy-1.18.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl","joblib-1.5.3-py3-none-any.whl","threadpoolctl-3.6.0-py3-none-any.whl","numpy-2.4.6-cp314-cp314-pyemscripten_2026_0_wasm32.whl"],"sniffio":["sniffio-1.3.1-py3-none-any.whl"],"tqdm":["tqdm-4.67.3-py3-none-any.whl"],"typing-extensions":["typing_extensions-4.15.0-py3-none-any.whl"]}},"base":{"url":"base.35612fab94ff.zip","size":5026379},"extras":{"imgui_bundle":{"wheels":[{"url":"wheels/imgui_bundle-1.92.900-cp314-cp314-pyemscripten_2026_0_wasm32.whl","size":5082883}],"packages":["numpy"]},"trimesh":{"wheels":[{"url":"wheels/trimesh-5.1.1-py3-none-any.whl","size":750449}],"packages":["numpy","pillow"]},"gltflib":{"wheels":[{"url":"wheels/gltflib-1.0.13-py3-none-any.whl","size":61728},{"url":"wheels/dataclasses_json-0.6.7-py3-none-any.whl","size":28686},{"url":"wheels/marshmallow-3.26.2-py3-none-any.whl","size":50964},{"url":"wheels/typing_inspect-0.9.0-py3-none-any.whl","size":8827},{"url":"wheels/mypy_extensions-1.1.0-py3-none-any.whl","size":4963}],"packages":["packaging","typing-extensions"]},"observ":{"wheels":[{"url":"wheels/observ-1.0.1-py3-none-any.whl","size":26761}],"packages":[]},"av":{"wheels":[{"url":"wheels/av-19.0.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl","size":3055814}],"packages":[]}},"data":{"data/ClearCoatCarPaint_Normal.png":{"url":"data/data-ClearCoatCarPaint_Normal.png.32a65a7c4426.zip","size":46478},"data/ClearcoatWicker.glb":{"url":"data/data-ClearcoatWicker.glb.e69fde586678.zip","size":1429998},"data/DamagedHelmet":{"url":"data/data-DamagedHelmet.cd192598ccc0.zip","size":3491097},"data/Michelle.glb":{"url":"data/data-Michelle.glb.332287bec8c3.zip","size":3277020},"data/Soldier.glb":{"url":"data/data-Soldier.glb.2e3e818c08fa.zip","size":2160598},"data/coastlines.npz":{"url":"data/data-coastlines.npz.f7d7b4c97a51.zip","size":37461},"data/cubemap.jpg":{"url":"data/data-cubemap.jpg.6a7f40f5aa08.zip","size":45399},"data/facecap.glb":{"url":"data/data-facecap.glb.014cf4d69a80.zip","size":1486634},"data/just_a_girl":{"url":"data/data-just_a_girl.cf9eb7a7671c.zip","size":5061765},"data/lightmap":{"url":"data/data-lightmap.649a676ec253.zip","size":59348},"data/phoenix_bird.glb":{"url":"data/data-phoenix_bird.glb.20e0bc82e813.zip","size":1630504},"data/planets":{"url":"data/data-planets.0cf2cb4b295e.zip","size":3359889},"data/retinal.obj":{"url":"data/data-retinal.obj.c00018cfb91c.zip","size":72430},"data/teapot.stl":{"url":"data/data-teapot.stl.c9bc0d0f5d24.zip","size":7593},"glTF-Sample-Assets/Models/Sponza/glTF":{"url":"data/glTF-Sample-Assets-Models-Sponza-glTF.3fd71e60d178.zip","size":48168421},"screenshots":{"url":"data/screenshots.25b67c885034.zip","size":4416282}},"imageio":{"astronaut.png":{"url":"imageio/astronaut.88431cd9653c.png","size":791555},"bricks.jpg":{"url":"imageio/bricks.19c81d9f1ba1.jpg","size":108257},"camera.png":{"url":"imageio/camera.b0793d2adda0.png","size":139512},"checkerboard.png":{"url":"imageio/checkerboard.9f8805c877fd.png","size":443},"chelsea.png":{"url":"imageio/chelsea.97403c9c171d.png","size":221294},"clock.png":{"url":"imageio/clock.8ecd1d5175f5.png","size":46909},"cockatoo.mp4":{"url":"imageio/cockatoo.5fde35f5a288.mp4","size":728751},"cockatoo_yuv420.mp4":{"url":"imageio/cockatoo_yuv420.6a801786c6b4.mp4","size":1739190},"coffee.png":{"url":"imageio/coffee.51564e1c293b.png","size":451102},"horse.png":{"url":"imageio/horse.b87363816c79.png","size":14540},"hubble_deep_field.png":{"url":"imageio/hubble_deep_field.c24d5b6472e3.png","size":1668706},"immunohistochemistry.png":{"url":"imageio/immunohistochemistry.bfed70cce05c.png","size":470201},"meadow_cube.jpg":{"url":"imageio/meadow_cube.09a2f1cd1702.jpg","size":2446539},"moon.png":{"url":"imageio/moon.3c8a6933cc27.png","size":45494},"page.png":{"url":"imageio/page.c34da8b8f9cd.png","size":44122},"stent.npz":{"url":"imageio/stent.60a83d2296b5.npz","size":824612},"text.png":{"url":"imageio/text.cde0b41c1b91.png","size":46478},"wikkie.png":{"url":"imageio/wikkie.a98f15ac2b23.png","size":472047},"wood.jpg":{"url":"imageio/wood.bd1b9c003085.jpg","size":98922}},"versions":{"wgpudawn":"0.0.2.post7+g3ec9687","wgpudawn_commit":"3ec9687f248f9e3ada97653105fec0cfa467f1c8","pygfx":"0.17.0","pygfx_commit":"4ae9dec92a9e9233ec2f495cb96fdc9974455c58","pygfx_repository":"https://github.com/hmaarrfk/pygfx","pygfx_upstream":"https://github.com/pygfx/pygfx","dawn":"v20261009.190412","wgpu_py":"0.32.0"},"categories":[{"id":"introductory","title":"Introductory"},{"id":"feature_demo","title":"Feature demos"},{"id":"validation","title":"Validation"},{"id":"other","title":"Other"}],"examples":[{"id":"introductory/clipping_planes","category":"introductory","name":"clipping_planes","title":"Clipping Planes","size":[800,400],"fixed_size":true,"description":"Example demonstrating clipping planes on a mesh.","lines":68,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"introductory/cube","category":"introductory","name":"cube","title":"Hello World","size":[640,480],"fixed_size":false,"description":"In this example shows how to do the rendering world's hello world: Show a 3D Cube on screen.","lines":34,"isolate":false,"docs":"animate 4s 25fps","needs_data":false,"imageio":[],"animated":true,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"introductory/hello_text","category":"introductory","name":"hello_text","title":"Hello text","size":[640,480],"fixed_size":false,"description":"Example showing text in world and screen space. Also notice how the text is shown on top of the plane (due to its depth offset).","lines":81,"isolate":false,"docs":"animate 4s","needs_data":false,"imageio":[],"animated":true,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"introductory/hello_triangle","category":"introductory","name":"hello_triangle","title":"Render a Triangle","size":[640,480],"fixed_size":false,"description":"Replicating the WGPU triangle example, but with about 10x less code.","lines":32,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"introductory/light_basic","category":"introductory","name":"light_basic","title":"Lights","size":[640,480],"fixed_size":false,"description":"Simple light example. This example shows a cube with MeshPhongMaterial illuminated by a point light and a directional light.","lines":66,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"introductory/object_bounding_box","category":"introductory","name":"object_bounding_box","title":"Boundary Boxes","size":[640,480],"fixed_size":false,"description":"Demonstrates visualizing object bounding boxes","lines":62,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":[],"animated":false,"packages":["numpy","pillow"],"extras":["trimesh"],"pypi":["trimesh==5.1.1"],"data":["data/teapot.stl"],"imports_examples":[],"skip":"","note":""},{"id":"introductory/offscreen","category":"introductory","name":"offscreen","title":"Offscreen Rendering","size":[640,480],"fixed_size":true,"description":"Example demonstrating off-screen rendering.","lines":65,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"introductory/orbit_camera","category":"introductory","name":"orbit_camera","title":"Orbit Camera","size":[640,480],"fixed_size":false,"description":"Example showing orbit camera controller.","lines":74,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["chelsea.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"introductory/points_basic","category":"introductory","name":"points_basic","title":"Rendering Points","size":[640,480],"fixed_size":false,"description":"Render Points","lines":39,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"introductory/show_util","category":"introductory","name":"show_util","title":"Use gfx.show","size":[640,480],"fixed_size":false,"description":"Demonstrates show utility","lines":21,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/animation_mixer","category":"feature_demo","name":"animation_mixer","title":"Animation Mixer","size":[1280,720],"fixed_size":true,"description":"This example demonstrates how to use the AnimationMixer to blend between different animations.","lines":345,"isolate":false,"docs":"animate 4s","needs_data":true,"imageio":[],"animated":true,"packages":["imageio","numpy","packaging","typing-extensions"],"extras":["gltflib","imgui_bundle"],"pypi":["gltflib==1.0.13","imgui-bundle==1.92.900"],"data":["data/Soldier.glb"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/anisotropy_barn_lamp","category":"feature_demo","name":"anisotropy_barn_lamp","title":"Anisotropy Barn Lamp","size":[1280,720],"fixed_size":true,"description":"This example demonstrates the anisotropy effect in a glTF model. The visually distinct feature is the elongated appearance of the specular reflection.","lines":67,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["httpx","imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/aomap","category":"feature_demo","name":"aomap","title":"Ambient occlusion","size":[1200,400],"fixed_size":true,"description":"This example demonstrates the ambient occlusion map effects for MeshBasicMaterial, MeshPhongMaterial, and MeshStandardMaterial.","lines":105,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":[],"animated":false,"packages":["imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":["data/lightmap"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/audio_visualizer","category":"feature_demo","name":"audio_visualizer","title":"Audio Visualizer","size":[1280,720],"fixed_size":true,"description":"This example demonstrates how to create an audio visualizer.","lines":768,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":["requests","tqdm"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"Plays audio through PortAudio, which needs an audio device of the operating system. Reads audio with libsndfile, which has no build for Pyodide.","note":""},{"id":"feature_demo/blending_ordered2","category":"feature_demo","name":"blending_ordered2","title":"Blending ordered2","size":[640,480],"fixed_size":false,"description":"The 'ordered2' was a previously supported blend mode (when blending as defined on the renderer). This example mimics it's behaviour.","lines":99,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/blending_weighted_plus","category":"feature_demo","name":"blending_weighted_plus","title":"Blending weighted_plus","size":[640,480],"fixed_size":false,"description":"The 'weighted_plus' was a previously supported blend mode (when blending as defined on the renderer). This example mimics it's behaviour.","lines":123,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/bloom","category":"feature_demo","name":"bloom","title":"Physical Based Bloom Effect Demo","size":[1280,720],"fixed_size":true,"description":"This example demonstrates the Physical Based Bloom effect pass, which creates natural-looking bloom without thresholding, suitable for HDR rendering pipelines.","lines":166,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":["numpy"],"extras":["imgui_bundle"],"pypi":["imgui-bundle==1.92.900"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/bloom2","category":"feature_demo","name":"bloom2","title":"Bloom Effect Demo","size":[1280,720],"fixed_size":true,"description":"This example shows a bloom rendering effect.","lines":161,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio","numpy","packaging","typing-extensions"],"extras":["gltflib","imgui_bundle"],"pypi":["gltflib==1.0.13","imgui-bundle==1.92.900"],"data":["data/phoenix_bird.glb"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/clearcoat","category":"feature_demo","name":"clearcoat","title":"Clearcoat effect","size":[800,450],"fixed_size":true,"description":"This example demonstrates the clearcoat effect.","lines":135,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio","numpy"],"extras":["imgui_bundle"],"pypi":["imgui-bundle==1.92.900"],"data":["data/ClearCoatCarPaint_Normal.png"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/clearcoat2","category":"feature_demo","name":"clearcoat2","title":"Clearcoat effect","size":[640,480],"fixed_size":true,"description":"This example demonstrates the clearcoat effect.","lines":92,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":["data/ClearcoatWicker.glb"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/colormap_channels","category":"feature_demo","name":"colormap_channels","title":"Colormap Channels","size":[640,480],"fixed_size":false,"description":"Example demonstrating colormaps in 4 modes: grayscale, gray+alpha, RGB, RGBA.","lines":67,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/colormap_image","category":"feature_demo","name":"colormap_image","title":"Colormap Image","size":[900,400],"fixed_size":true,"description":"Example demonstrating different colormap dimensions on an image.","lines":98,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png","stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/colormap_mesh","category":"feature_demo","name":"colormap_mesh","title":"Colormap Mesh","size":[900,400],"fixed_size":true,"description":"Example demonstrating different colormap dimensions on a mesh, and per-vertex colors as a bonus.","lines":144,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["chelsea.png","stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/compute_cloth","category":"feature_demo","name":"compute_cloth","title":"Cloth Simulation with Compute Shaders","size":[1280,720],"fixed_size":true,"description":"This example demonstrates how to implement a Verlet integration cloth physics simulation using compute shaders, including a spring system, gravity, wind forces, and sphere collisions.","lines":711,"isolate":false,"docs":"animate 4s","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":true,"packages":["imageio","numpy"],"extras":["imgui_bundle"],"pypi":["imgui-bundle==1.92.900"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/custom_object1","category":"feature_demo","name":"custom_object1","title":"Minimal Custom Object","size":[640,480],"fixed_size":false,"description":"Example that implements a minimal custom object and renders it.","lines":108,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/custom_object2","category":"feature_demo","name":"custom_object2","title":"Simple Custom Object","size":[640,480],"fixed_size":false,"description":"Example that implements a simple custom object and renders it.","lines":140,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/custom_object3","category":"feature_demo","name":"custom_object3","title":"Custom Object","size":[20,3],"fixed_size":true,"description":"Example that implements a custom object and renders it.","lines":161,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/cylinder","category":"feature_demo","name":"cylinder","title":"Types of Cylinders","size":[640,480],"fixed_size":false,"description":"Example showing different types of geometric cylinders.","lines":85,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/dynamic_env_map","category":"feature_demo","name":"dynamic_env_map","title":"Dynamic Environment Map","size":[640,480],"fixed_size":false,"description":"This example shows three objects.","lines":115,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/earth","category":"feature_demo","name":"earth","title":"Earth","size":[640,480],"fixed_size":true,"description":"This example demonstrates the effect of rendering a globe using MeshPhongMaterial.","lines":125,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":[],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":["data/planets"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/env_maps","category":"feature_demo","name":"env_maps","title":"Environment Map Effects","size":[640,480],"fixed_size":false,"description":"This example demonstrates the environment mapping effects of the \"CUBE-REFLECTION\" and \"CUBE-REFRACTION\" mapping modes in \"MeshBasicMaterial\", \"MeshPhongMaterial\", and \"MeshStandardMaterial\" for a given object.","lines":105,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio","numpy","pillow"],"extras":["trimesh"],"pypi":["trimesh==5.1.1"],"data":["data/teapot.stl"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/flat_shaded_torus","category":"feature_demo","name":"flat_shaded_torus","title":"Flat Shading","size":[640,480],"fixed_size":false,"description":"Example showing a Torus knot, using flat shading.","lines":43,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/fly_controller","category":"feature_demo","name":"fly_controller","title":"Fly controller","size":[640,480],"fixed_size":false,"description":"Fly through a cloud of cololoured points. This example demonstrates the fly controller, as well as the GaussianBlob point material, with size_space set to 'world'.","lines":64,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/geometry_cubes","category":"feature_demo","name":"geometry_cubes","title":"Geometry Cubes","size":[640,480],"fixed_size":false,"description":"Example showing multiple rotating cubes. This also tests the depth buffer.","lines":39,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["chelsea.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/geometry_image","category":"feature_demo","name":"geometry_image","title":"Geometry Image","size":[640,480],"fixed_size":false,"description":"Show an image.","lines":36,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/geometry_klein_bottle","category":"feature_demo","name":"geometry_klein_bottle","title":"Klein Bottle Geometry","size":[640,480],"fixed_size":false,"description":"Example showing a Klein Bottle. Surface normals are shown on both sides of the mesh, in different colors. It can be seen how the object turns itself \"inside out\".","lines":49,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/geometry_mobius","category":"feature_demo","name":"geometry_mobius","title":"M\u00f6bius strip Geometry","size":[640,480],"fixed_size":false,"description":"Example showing two M\u00f6bius strips. The one at the bottom actually has its ends attached, making it a \"non-orientable\" manifold. It is rendered with flat shading to avoid artifacts due to the normals flipping where the ends meet.","lines":36,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/geometry_plane","category":"feature_demo","name":"geometry_plane","title":"Geometry Plane","size":[640,480],"fixed_size":false,"description":"Use a plane geometry to show a texture, which is continuously updated to show video.","lines":52,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["cockatoo.mp4"],"animated":false,"packages":["imageio"],"extras":["av"],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/geometry_polyhedron","category":"feature_demo","name":"geometry_polyhedron","title":"Rotating Polyhedra","size":[640,480],"fixed_size":false,"description":"Example showing multiple rotating polyhedrons.","lines":40,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/geometry_polyhedron_subdivisions","category":"feature_demo","name":"geometry_polyhedron_subdivisions","title":"Subdivision","size":[640,480],"fixed_size":false,"description":"Example showing subdivided polyhedrons.","lines":28,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/geometry_torus_knot","category":"feature_demo","name":"geometry_torus_knot","title":"Torus knot","size":[640,480],"fixed_size":false,"description":"Example showing a Torus knot, with a texture and lighting.","lines":40,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["bricks.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/gltf_animations","category":"feature_demo","name":"gltf_animations","title":"Animations with glTF","size":[800,600],"fixed_size":true,"description":"This example demonstrates how to load a glTF model with animations and play them.","lines":183,"isolate":false,"docs":"animate 4s","needs_data":true,"imageio":[],"animated":true,"packages":["httpx","imageio","numpy","packaging","typing-extensions"],"extras":["gltflib","imgui_bundle"],"pypi":["gltflib==1.0.13","imgui-bundle==1.92.900"],"data":["data/Soldier.glb"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/gltf_unlit","category":"feature_demo","name":"gltf_unlit","title":"glTF Unlit Material Example","size":[1280,720],"fixed_size":true,"description":"This example demonstrates unlit materials in glTF models.","lines":145,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio","numpy","packaging","typing-extensions"],"extras":["gltflib","imgui_bundle"],"pypi":["gltflib==1.0.13","imgui-bundle==1.92.900"],"data":["data/just_a_girl"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/gltf_viewer","category":"feature_demo","name":"gltf_viewer","title":"Remote glTF Viewer","size":[1280,720],"fixed_size":true,"description":"This example demonstrates loading glTF models from remote URLs (KhronosGroup glTF-Sample-Assets).","lines":270,"isolate":false,"docs":"code","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["httpx","imageio","numpy","packaging","typing-extensions"],"extras":["gltflib","imgui_bundle"],"pypi":["gltflib==1.0.13","imgui-bundle==1.92.900"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/helpers_gizmo","category":"feature_demo","name":"helpers_gizmo","title":"Gizmo to transform world objects","size":[640,480],"fixed_size":false,"description":"Example to demonstrate the Gizmo that can be used to transform world objects. Click the center sphere to toggle between object-space, world-space, and screen-space.","lines":51,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/helpers_stats","category":"feature_demo","name":"helpers_stats","title":"Stats helper (Manual)","size":[640,480],"fixed_size":false,"description":"Demonstrates how to display performance statistics such as FPS and draw time on screen, by manually integrating it into the render loop.","lines":57,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/image_click_events","category":"feature_demo","name":"image_click_events","title":"Image Click Events","size":[640,480],"fixed_size":false,"description":"Show an image and print the x, y image data coordinates for click events.","lines":90,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/image_overlay","category":"feature_demo","name":"image_overlay","title":"Image with another image overlaid","size":[640,480],"fixed_size":false,"description":"Show an image with another image overlaid with alpha blending.","lines":67,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["coffee.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/image_plus_points","category":"feature_demo","name":"image_plus_points","title":"Image with Points Overlaid","size":[640,480],"fixed_size":false,"description":"Show an image with points overlaid.","lines":59,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/image_scaling","category":"feature_demo","name":"image_scaling","title":"Displaying an image in a scene","size":[640,480],"fixed_size":false,"description":"Displaying an image can be done in two different ways based the details of the information you are trying to communicate. We consider a color image with shape (height, width, 3). In PyGFX, this is descried as a texture.","lines":86,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/image_stitching","category":"feature_demo","name":"image_stitching","title":"Image stitching","size":[640,480],"fixed_size":false,"description":"Show stitching of images using weighted alpha mode. The alpha value of the images are used as weights.","lines":79,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["bricks.jpg","wood.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/instancing_mesh","category":"feature_demo","name":"instancing_mesh","title":"Instancing","size":[640,480],"fixed_size":false,"description":"Example rendering the same mesh object multiple times, using instancing.","lines":57,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["bricks.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/iridescence","category":"feature_demo","name":"iridescence","title":"Iridescence Abalone","size":[1280,720],"fixed_size":true,"description":"This example demonstrates iridescence on the abalone shell.","lines":61,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["httpx","imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/iridescence2","category":"feature_demo","name":"iridescence2","title":"Iridescence","size":[640,480],"fixed_size":true,"description":"This example demonstrates iridescence on a set of spheres.","lines":106,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/labelled_image_grid","category":"feature_demo","name":"labelled_image_grid","title":"Labelled Image Grid","size":[640,480],"fixed_size":false,"description":"This example demonstrates how to create a grid of images with labels that change color when hovered over.","lines":116,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png","bricks.jpg","immunohistochemistry.png","wikkie.png","wood.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/light_directional_shadow","category":"feature_demo","name":"light_directional_shadow","title":"Directional Shadow 1","size":[640,480],"fixed_size":false,"description":"This example demonstrates directional light shadows and their helper. The cubes within the view frustum of the shadow camera have complete shadows, the cubes at the edge of the view frustum of the camera have partial shadows, while the cubes outside the view frustum of the camera will not cast shadows.","lines":73,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/light_shadow","category":"feature_demo","name":"light_shadow","title":"Directional Shadow 2","size":[640,480],"fixed_size":false,"description":"This example demonstrates the effects of directional light shadows (from DirectionalLight) and omnidirectional shadows (from PointLight).","lines":114,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/light_spotlight_shadows","category":"feature_demo","name":"light_spotlight_shadows","title":"Spotlight Shadow","size":[640,480],"fixed_size":false,"description":"Spotlights and shadows example","lines":169,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/light_spotlights","category":"feature_demo","name":"light_spotlights","title":"Spotlights","size":[640,480],"fixed_size":false,"description":"Spotlights example.","lines":156,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/lightmap","category":"feature_demo","name":"lightmap","title":"Lightmap","size":[1200,400],"fixed_size":true,"description":"This example demonstrates the lightmap effects for MeshBasicMaterial, MeshPhongMaterial, and MeshStandardMaterial.","lines":96,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":[],"animated":false,"packages":["imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":["data/lightmap"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/line_basic","category":"feature_demo","name":"line_basic","title":"Line Drawing","size":[1000,800],"fixed_size":true,"description":"Drawing a line with a shape that makes it interesting for demonstrating/testing various aspects of line rendering. Use the middle-mouse button to set the position of the last point. Use '1' and '2' to toggle between normal and dashed mode.","lines":119,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/line_performance","category":"feature_demo","name":"line_performance","title":"Line Drawing Performance","size":[640,480],"fixed_size":false,"description":"Display a line depicting a noisy signal consisting of a lot of points.","lines":38,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/line_plot","category":"feature_demo","name":"line_plot","title":"Line plot","size":[640,480],"fixed_size":false,"description":"Show a line plot, with axii and a grid.","lines":104,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/line_segments","category":"feature_demo","name":"line_segments","title":"Line Segments","size":[640,480],"fixed_size":false,"description":"Display line segments. Can be useful e.g. for visializing vector fields.","lines":43,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/line_thick","category":"feature_demo","name":"line_thick","title":"Thick Lines","size":[640,480],"fixed_size":false,"description":"Display very thick lines to show how lines stay pretty on large scales.","lines":47,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/look_at","category":"feature_demo","name":"look_at","title":"Look At","size":[640,480],"fixed_size":false,"description":"This example shows how the look_at function can be used.","lines":73,"isolate":false,"docs":"animate 3s","needs_data":false,"imageio":[],"animated":true,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/look_at_instanced","category":"feature_demo","name":"look_at_instanced","title":"Look At (Instanced Mesh)","size":[640,480],"fixed_size":false,"description":"This example shows how the look_at function can be used with instanced mesh.","lines":84,"isolate":false,"docs":"animate 3s","needs_data":false,"imageio":[],"animated":true,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/manual_matrix_update","category":"feature_demo","name":"manual_matrix_update","title":"Transform Control without Matrix Updating","size":[640,480],"fixed_size":false,"description":"Example showing transform control flow without matrix auto updating.","lines":44,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["chelsea.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/map_click_events_to_world","category":"feature_demo","name":"map_click_events_to_world","title":"Map Screen to World","size":[640,480],"fixed_size":false,"description":"This shows how to map from the screen to the world by adding scatter points at click event locations","lines":128,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/measure_distances_2d","category":"feature_demo","name":"measure_distances_2d","title":"Measure distances in 2D","size":[640,480],"fixed_size":false,"description":"Example to do measurements in a 2D image. Use LMB and RMB to place the end-points.","lines":57,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/measure_distances_3d","category":"feature_demo","name":"measure_distances_3d","title":"Measure distances in 3D","size":[640,480],"fixed_size":false,"description":"Example to do measurements in a 3D scene. Click on the surface of the two objects to see the distance betweeen these points.","lines":76,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["bricks.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/mesh_depth_material","category":"feature_demo","name":"mesh_depth_material","title":"Depth Material","size":[640,480],"fixed_size":true,"description":"A custom material for drawing geometry by depth","lines":120,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/mesh_dynamic","category":"feature_demo","name":"mesh_dynamic","title":"Mesh dynamic","size":[640,480],"fixed_size":false,"description":"Example showing a Torus knot, dynamically changing what faces are shown.","lines":44,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["bricks.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/mesh_slice","category":"feature_demo","name":"mesh_slice","title":"Mesh Slice Material","size":[640,480],"fixed_size":false,"description":"Example showing off the mesh slice material.","lines":66,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/mesh_toon","category":"feature_demo","name":"mesh_toon","title":"Toon Rendering 1","size":[640,480],"fixed_size":false,"description":"This example demonstrates the affect of the `MeshToonMaterial`","lines":54,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/mesh_toon2","category":"feature_demo","name":"mesh_toon2","title":"Toon Rendering 2","size":[640,480],"fixed_size":true,"description":"This example shows the toon rendering affect of materials with different colors and gradient maps.","lines":126,"isolate":false,"docs":"animate 4s","needs_data":false,"imageio":[],"animated":true,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/morph_facecap","category":"feature_demo","name":"morph_facecap","title":"Facecap animation with morph targets","size":[1280,720],"fixed_size":true,"description":"This example demonstrates how to animate a model with morph targets.","lines":120,"isolate":false,"docs":"animate 4s","needs_data":true,"imageio":[],"animated":true,"packages":["httpx","imageio","numpy","packaging","typing-extensions"],"extras":["gltflib","imgui_bundle"],"pypi":["gltflib==1.0.13","imgui-bundle==1.92.900"],"data":["data/facecap.glb"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/morph_targets","category":"feature_demo","name":"morph_targets","title":"Morph Targets","size":[640,480],"fixed_size":true,"description":"This example demonstrates how to use morph targets to animate a mesh.","lines":94,"isolate":false,"docs":"animate 4s","needs_data":false,"imageio":[],"animated":true,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/multi_select","category":"feature_demo","name":"multi_select","title":"Multi-Object Selection","size":[640,480],"fixed_size":false,"description":"Example demonstrating multi object selection using mouse events.","lines":145,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/multi_slice1","category":"feature_demo","name":"multi_slice1","title":"Volume and Mesh Slicing 1","size":[640,480],"fixed_size":false,"description":"Slice a volume and a mesh through the three primary planes (XY, XZ, YZ). This example uses a mesh object with custom texture coordinates. This is a generic approach. See multi_slice2.py for a simpler way.","lines":86,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/multi_slice2","category":"feature_demo","name":"multi_slice2","title":"Mesh and Volume Slicing 2","size":[640,480],"fixed_size":false,"description":"Slice a volume and a mesh through the three primary planes (XY, XZ, YZ). This example uses Volume object with a VolumeSliceMaterial, which produces an implicit geometry defined by the volume data. See multi_slice1.py for a more generic approach.","lines":81,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["stent.npz"],"animated":false,"packages":["imageio","scikit-image"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/multiple_fonts","category":"feature_demo","name":"multiple_fonts","title":"Multiple Fonts","size":[800,600],"fixed_size":true,"description":"Example demonstrating the capabilities of text to be rendered in multiple different fonts.","lines":62,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/paint_to_texture","category":"feature_demo","name":"paint_to_texture","title":"Paint to a texture","size":[640,480],"fixed_size":false,"description":"This example shows an application that allows the user to paint an image onto a texture.","lines":66,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/paint_to_texture_directly","category":"feature_demo","name":"paint_to_texture_directly","title":"Paint to a texture directly","size":[640,480],"fixed_size":false,"description":"This example shows an application that allows the user to paint an image onto a texture.","lines":72,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/panzoom_camera","category":"feature_demo","name":"panzoom_camera","title":"Panzoom Camera","size":[640,480],"fixed_size":false,"description":"Example showing orbit camera controller.","lines":76,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/pbr","category":"feature_demo","name":"pbr","title":"PBR Rendering 1","size":[640,480],"fixed_size":true,"description":"This example shows a complete PBR rendering effect. The cubemap of skybox is also the environment cubemap of the helmet.","lines":84,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":["data/DamagedHelmet"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/pbr2","category":"feature_demo","name":"pbr2","title":"PBR Rendering 2","size":[640,480],"fixed_size":true,"description":"This example shows the lighting rendering affect of materials with different metalness and roughness. Every second sphere has an IBL environment map on it.","lines":117,"isolate":false,"docs":"animate 4s","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":true,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/pbr_instanced","category":"feature_demo","name":"pbr_instanced","title":"PBR Instanced Rendering","size":[640,480],"fixed_size":true,"description":"This example shows how to use PBR rendering with instanced meshes.","lines":100,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":["data/DamagedHelmet"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/physical_color","category":"feature_demo","name":"physical_color","title":"Physical Color","size":[640,480],"fixed_size":false,"description":"Pygfx by default assumes that all colors are in the sRGB colorspace. This example shows how you can also provide colors in physical colorspace (a.k.a. linear-srgb). This example shows 3 images: * A normal image in sRGB. * An image in physical colorspace, shows up too dark. * An image in physical colorspace, rendered correctly.","lines":69,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/picking_color","category":"feature_demo","name":"picking_color","title":"Color Picking","size":[640,480],"fixed_size":false,"description":"Example showing picking the color from the scene. Depending on the object being clicked, more detailed picking info is available.","lines":59,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/picking_mesh","category":"feature_demo","name":"picking_mesh","title":"Mesh Picking","size":[640,480],"fixed_size":false,"description":"Example showing picking a mesh. Showing two meshes that can be clicked on. Upon clicking, the vertex closest to the pick location is moved.","lines":86,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/picking_points","category":"feature_demo","name":"picking_points","title":"Point Picking","size":[640,480],"fixed_size":false,"description":"Example showing picking points. When clicking on a point, it's location is changed. With a small change, a line is shown instead.","lines":45,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/point_marker_multi_color","category":"feature_demo","name":"point_marker_multi_color","title":"Point Markers with Multiple Colors","size":[640,480],"fixed_size":false,"description":"We demonstrate how one can use custom signed distance functions (SDFs) to create point markers with multiple colors. In this example we recreate an approximation of the Pygfx logo using two SDFs, one for the outer yellow triangle, and other for the inner blue highlight. Combining multiple colors in a single point marker is achieved by adding two separate markers to the scene, one for each color.","lines":207,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/point_sprites","category":"feature_demo","name":"point_sprites","title":"Simulating grass with point sprites","size":[2000,3],"fixed_size":true,"description":"This example simulates a grassy plane, using a technique that early 3D games used a lot. We create an image with green stripes. Than place a couple thousand of these in a plane, using a Points object.","lines":44,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/posteffect1","category":"feature_demo","name":"posteffect1","title":"Post processing effects 1","size":[640,480],"fixed_size":false,"description":"Example post-processing effects, showing builtin effects.","lines":46,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["bricks.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/posteffect2","category":"feature_demo","name":"posteffect2","title":"Post processing effects 2","size":[640,480],"fixed_size":false,"description":"Example post-processing effects, showing a custom effect.","lines":77,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/posteffect_normals","category":"feature_demo","name":"posteffect_normals","title":"Screen space normal reconstruction","size":[800,600],"fixed_size":true,"description":"This example demonstrates how to accurately reconstruct surface normals using the depth buffer.","lines":77,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/quad_mesh","category":"feature_demo","name":"quad_mesh","title":"Mesh with quads","size":[640,480],"fixed_size":false,"description":"This example demonstrates the use of meshes with quad faces. Quad faces are used when geometry.indices array is Nx4 instead of Nx3.","lines":127,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/scene_camlink1","category":"feature_demo","name":"scene_camlink1","title":"Camera linking 1","size":[800,800],"fixed_size":true,"description":"Example demonstating the partial linking of two cameras. When panning/zooming in one view, the other view reponds for the x-dimention, but not for the y dimension.","lines":99,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/scene_camlink2","category":"feature_demo","name":"scene_camlink2","title":"Camera linking 2","size":[900,600],"fixed_size":true,"description":"Example demonstating the partial linking of two cameras in 3D. The left and right view use an orbit- and fly-controller, respectively. Yet, manipulating one also updates the othe camera.","lines":83,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/scene_in_a_scene","category":"feature_demo","name":"scene_in_a_scene","title":"Nested Scenes","size":[640,480],"fixed_size":false,"description":"Example of a scene rendered to a texture, which is shown in another scene.","lines":79,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["bricks.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/scene_overlay","category":"feature_demo","name":"scene_overlay","title":"Scene Overlay","size":[500,300],"fixed_size":true,"description":"Example showing a 3D scene, with an object overload via ``Material.depth_test``, and a 2D scene overlay over it all using an overlay render pass.","lines":82,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/scene_subplots1","category":"feature_demo","name":"scene_subplots1","title":"Subplots 1","size":[500,300],"fixed_size":true,"description":"Example showing how to render to a subregion of a canvas.","lines":72,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/scene_subplots2","category":"feature_demo","name":"scene_subplots2","title":"Subplots 2","size":[640,480],"fixed_size":false,"description":"Like scene_side_by_side, but now with a more plot-like idea, and mouse interaction.","lines":95,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/scene_subplots_video","category":"feature_demo","name":"scene_subplots_video","title":"Subplots Video","size":[640,480],"fixed_size":false,"description":"An example combining `synced_video.py` with subplots. Double click to re-center the images.","lines":109,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/sheen_chair","category":"feature_demo","name":"sheen_chair","title":"Sheen Chair","size":[1280,720],"fixed_size":true,"description":"This example demonstrates the sheen effect in a glTF model.","lines":66,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["httpx","imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/sheen_glam_velvet_sofa","category":"feature_demo","name":"sheen_glam_velvet_sofa","title":"Glam Velvet Sofa","size":[1280,720],"fixed_size":true,"description":"This example demonstrates the sheen effect in a glTF model.","lines":66,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["httpx","imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/show_image","category":"feature_demo","name":"show_image","title":"Show Image","size":[640,480],"fixed_size":false,"description":"Use camera.show_object to ensure the Image is in view.","lines":41,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/show_scene","category":"feature_demo","name":"show_scene","title":"Use gfx.show to show a Scene","size":[640,480],"fixed_size":false,"description":"Demonstrates show utility for a scene","lines":29,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["chelsea.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/show_stl","category":"feature_demo","name":"show_stl","title":"Show STL File via gfx.show","size":[640,480],"fixed_size":false,"description":"Demonstrates show utility with an STL file","lines":41,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":[],"animated":false,"packages":["numpy","pillow"],"extras":["trimesh"],"pypi":["trimesh==5.1.1"],"data":["data/teapot.stl"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/skinned_mesh","category":"feature_demo","name":"skinned_mesh","title":"Skinned Mesh","size":[640,480],"fixed_size":true,"description":"This example shows the rendering of a skinned mesh with a skeleton and bones.","lines":123,"isolate":false,"docs":"animate 4s","needs_data":false,"imageio":[],"animated":true,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/skinning_animation","category":"feature_demo","name":"skinning_animation","title":"Skinning Animation","size":[640,480],"fixed_size":true,"description":"This example demonstrates how to animate a skinned mesh using a glTF animation clip.","lines":145,"isolate":false,"docs":"animate 4s","needs_data":true,"imageio":[],"animated":true,"packages":["imageio","numpy","packaging","typing-extensions"],"extras":["gltflib","imgui_bundle"],"pypi":["gltflib==1.0.13","imgui-bundle==1.92.900"],"data":["data/Michelle.glb"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/skinning_bind_detached","category":"feature_demo","name":"skinning_bind_detached","title":"Detached Bind Mode","size":[640,480],"fixed_size":true,"description":"This example demonstrates how to sharing a skeleton across multiple skinned meshes with detached bind mode.","lines":112,"isolate":false,"docs":"animate 4s","needs_data":true,"imageio":[],"animated":true,"packages":["imageio","packaging","typing-extensions"],"extras":["gltflib"],"pypi":["gltflib==1.0.13"],"data":["data/Michelle.glb"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/skybox","category":"feature_demo","name":"skybox","title":"Use a Skybox","size":[640,480],"fixed_size":false,"description":"Example with a skybox background.","lines":70,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/skybox_rotate","category":"feature_demo","name":"skybox_rotate","title":"Use a Skybox","size":[640,480],"fixed_size":false,"description":"Example with a skybox background in a rotating scene.","lines":58,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["meadow_cube.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/spheres","category":"feature_demo","name":"spheres","title":"Sphere Geometry","size":[640,480],"fixed_size":false,"description":"Example showing different types of geometric cylinders.","lines":72,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/synced_video","category":"feature_demo","name":"synced_video","title":"Synced Video Rendering","size":[640,480],"fixed_size":false,"description":"Example demonstrating synced video rendering","lines":61,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/text_align","category":"feature_demo","name":"text_align","title":"Text align","size":[800,600],"fixed_size":true,"description":"Example demonstrating the capabilities of text to be aligned and justified according to the user's decision.","lines":212,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/text_big","category":"feature_demo","name":"text_big","title":"Big static text","size":[800,600],"fixed_size":true,"description":"Render 10 paragraphs of Lorem ipsum.","lines":69,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/text_contrast","category":"feature_demo","name":"text_contrast","title":"Text contrast","size":[640,480],"fixed_size":false,"description":"Example demonstrating text on dark and light background.","lines":73,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/text_multiple_grid","category":"feature_demo","name":"text_multiple_grid","title":"Text multiple grid","size":[800,600],"fixed_size":true,"description":"This example demonstrate how to use MultiText to show a grid of text blocks.","lines":69,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/text_multiple_labels","category":"feature_demo","name":"text_multiple_labels","title":"Text multiple labels","size":[800,600],"fixed_size":true,"description":"This example demonstrate how to use text labels, where text blocks are positioned in world-space, but displayed in screen-space.","lines":74,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/text_snake","category":"feature_demo","name":"text_snake","title":"Text snake","size":[640,480],"fixed_size":false,"description":"Example showing a text with picking and custom layout.","lines":79,"isolate":false,"docs":"animate 3s","needs_data":false,"imageio":[],"animated":true,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/text_waterfall","category":"feature_demo","name":"text_waterfall","title":"Text waterfall","size":[800,400],"fixed_size":true,"description":"An example showing a waterfall of text. On the left it shows the contents of the glyph atlas. One goal of this example is to strain the text rendering to its limits.","lines":107,"isolate":false,"docs":"animate 5s","needs_data":false,"imageio":[],"animated":true,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/transparency1","category":"feature_demo","name":"transparency1","title":"Transparency 1","size":[640,480],"fixed_size":false,"description":"Example showing transparency using three overlapping planes. The normal blending can produce correct results by sorting the objects in z.","lines":102,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/transparency2","category":"feature_demo","name":"transparency2","title":"Transparency 2","size":[640,480],"fixed_size":false,"description":"Example showing transparency using three orthogonal planes. This is a bit of an adversarial case because the planes are in the same position, plus they intersect, so sorting has no effect. In cases like this, the dither blending is king.","lines":100,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/video_yuv","category":"feature_demo","name":"video_yuv","title":"Video YUV","size":[640,480],"fixed_size":false,"description":"This example demonstrates how to show video data in a very efficient way, eliminating as much data-copies and color conversion operations as we can.","lines":368,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["cockatoo.mp4","cockatoo_yuv420.mp4"],"animated":false,"packages":["imageio"],"extras":["av"],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/volume_iso_render","category":"feature_demo","name":"volume_iso_render","title":"Isosurface Volume Rendering","size":[640,480],"fixed_size":false,"description":"Render a 3D volume with isosurface rendering..","lines":45,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/volume_minip_render","category":"feature_demo","name":"volume_minip_render","title":"Minip Volume Rendering","size":[640,480],"fixed_size":false,"description":"Render a 3D volume with minimum intensity projection rendering.","lines":42,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/volume_render1","category":"feature_demo","name":"volume_render1","title":"Volume Rendering 1","size":[640,480],"fixed_size":false,"description":"Render a volume. Shift-click to draw white blobs inside the volume.","lines":63,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/volume_render2","category":"feature_demo","name":"volume_render2","title":"Volume Rendering 2","size":[640,480],"fixed_size":false,"description":"Render three volumes using different world transforms.","lines":56,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/volume_slice1","category":"feature_demo","name":"volume_slice1","title":"Volume Slice 1","size":[640,480],"fixed_size":false,"description":"Render slices through a volume, by uploading to a 2D texture. Simple and ... slow.","lines":50,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/volume_slice2","category":"feature_demo","name":"volume_slice2","title":"Volume Slice 2","size":[640,480],"fixed_size":false,"description":"Render slices through a volume, by creating a 3D texture, and sampling onto a plane geometry. Simple, fast and subpixel!","lines":52,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/volume_slice3","category":"feature_demo","name":"volume_slice3","title":"Volume Slice 3","size":[640,480],"fixed_size":false,"description":"Render slices through a volume, by creating a 3D texture, and viewing it with a VolumeSliceMaterial. Easy because we can just define the view plane.","lines":59,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/wireframe1","category":"feature_demo","name":"wireframe1","title":"Wireframe 1","size":[640,480],"fixed_size":false,"description":"Example showing a Torus knot, with a wireframe overlay.","lines":54,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/wireframe2","category":"feature_demo","name":"wireframe2","title":"Wireframe 2","size":[640,480],"fixed_size":false,"description":"Example showing a Torus knot, as a wireframe. We create two wireframes, one for the front, bright blue and lit, and one for the back, unlit and gray.","lines":54,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/wireframe_material","category":"feature_demo","name":"wireframe_material","title":"Wireframe Material","size":[640,480],"fixed_size":true,"description":"Example showing a custom wireframe material, together with the builtin option to render a wireframe. Notice that in the former the wires are not of equal thickness.","lines":178,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/wobbly_mesh","category":"feature_demo","name":"wobbly_mesh","title":"Wobbly Mesh","size":[640,480],"fixed_size":false,"description":"Example showing a Torus knot, with a wobble effect by making use of a nonlinear transform that applies an time-dependent offset to the vertex positions. The Mesh is subclassed in order to add the uniform values used by the wobble effect.","lines":76,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["bricks.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/world_bounding_box","category":"feature_demo","name":"world_bounding_box","title":"Bounding Box Coordinates","size":[640,480],"fixed_size":false,"description":"Render two volumes using different world transforms. Prints the world bounding box of the scene which used to trigger an Exception.","lines":50,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["stent.npz"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/world_map_projection","category":"feature_demo","name":"world_map_projection","title":"World map projection","size":[640,480],"fixed_size":false,"description":"Example showing a world map using a common map projection.","lines":137,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":["data/coastlines.npz"],"imports_examples":[],"skip":"","note":""},{"id":"feature_demo/world_map_projections","category":"feature_demo","name":"world_map_projections","title":"World map projections","size":[640,480],"fixed_size":false,"description":"Example showing a world map with different projections.","lines":331,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":["data/coastlines.npz"],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_alpha","category":"validation","name":"validate_alpha","title":"Reference Color","size":[640,480],"fixed_size":false,"description":"This example draws squares of reference colors. These can be compared to similar output from e.g. Matplotlib.","lines":59,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_blend_additive","category":"validation","name":"validate_blend_additive","title":"Additive Blending","size":[640,480],"fixed_size":false,"description":"This example draws overlapping circles of reference colors with additive blending.","lines":50,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_blend_bg","category":"validation","name":"validate_blend_bg","title":"Validate transparency with and without bg","size":[600,600],"fixed_size":true,"description":"Shows a semi-transparent square. On the left it uses a background, on the right it does not.","lines":50,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_blend_dither","category":"validation","name":"validate_blend_dither","title":"Validate dither","size":[600,600],"fixed_size":true,"description":"This example draws a series of semitransparent planes using dither mode.","lines":63,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_blend_weighted","category":"validation","name":"validate_blend_weighted","title":"Validate weighted","size":[600,600],"fixed_size":true,"description":"This example draws a series of semitransparent planes using weighted mode.","lines":63,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_box","category":"validation","name":"validate_box","title":"Box Geometry","size":[640,480],"fixed_size":false,"description":"Example showing the box geometry.","lines":37,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_color","category":"validation","name":"validate_color","title":"Reference Color","size":[640,480],"fixed_size":false,"description":"This example draws squares of reference colors. These can be compared to similar output from e.g. Matplotlib.","lines":56,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_culling","category":"validation","name":"validate_culling","title":"Culling","size":[1500,600],"fixed_size":true,"description":"Example test to validate winding and culling.","lines":115,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_depth_clipping","category":"validation","name":"validate_depth_clipping","title":"Depth Clipping","size":[640,480],"fixed_size":false,"description":"Example (and test) for camera depth clipping planes. This draws four rectangles near the near and far clipping planes.","lines":68,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_depth_overlay1","category":"validation","name":"validate_depth_overlay1","title":"Depth Overlay 1","size":[500,300],"fixed_size":true,"description":"Example (and test) for behavior of the depth buffer w.r.t. overlays, implemented by multiple render calls. The overlay should always be on top.","lines":76,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_depth_overlay2","category":"validation","name":"validate_depth_overlay2","title":"Depth Overlay 2","size":[500,300],"fixed_size":true,"description":"Example (and test) for behavior of the depth buffer w.r.t. overlays, implemented using ``Material.depth_test``. The overlaid object should always be on top.","lines":58,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_grid1","category":"validation","name":"validate_grid1","title":"Validate the grid","size":[640,480],"fixed_size":false,"description":"Show a bunch of grids touching various grid-cases.","lines":130,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_helpers1","category":"validation","name":"validate_helpers1","title":"Axes Helper 1","size":[640,480],"fixed_size":false,"description":"Example showing the axes helper.","lines":32,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_helpers2","category":"validation","name":"validate_helpers2","title":"Axis Helper 2","size":[640,480],"fixed_size":false,"description":"Example showing the axes and grid helpers with a perspective camera.","lines":49,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_image","category":"validation","name":"validate_image","title":"Validate image","size":[640,480],"fixed_size":false,"description":"Show an image displayed the correct way.","lines":72,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_image_colormap","category":"validation","name":"validate_image_colormap","title":"Validate Colormap","size":[600,600],"fixed_size":true,"description":"Show an image with four different colormaps.","lines":102,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_image_on_mesh","category":"validation","name":"validate_image_on_mesh","title":"Image on Plane Geometry","size":[640,480],"fixed_size":false,"description":"Show an image using a plane geometry. For historic reasons, image data (usually) has the first rows representing the top of the image. But the plane gemeometry is such that it is reversed again.","lines":61,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_light_shadow","category":"validation","name":"validate_light_shadow","title":"Light and Shadow","size":[640,480],"fixed_size":false,"description":"This example combines MeshPhongMaterial and MeshStandardMaterial with PointLight, AmbientLight, SpotLight and DirectionalLight to check that all combinations are working properly.","lines":86,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_line_2d","category":"validation","name":"validate_line_2d","title":"Lines in 2D","size":[1000,1000],"fixed_size":true,"description":"* This shows a 2D line in 3 flavours. * It shows a gap due to nan values. * It has duplicate points to test correct handling for that. * It also puts a few points in quick succession to test that it staus a continuous line (with joins, no caps). * It includes a point that only has its z-value different, which should behave like a duplicate point.","lines":149,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_line_colormap","category":"validation","name":"validate_line_colormap","title":"Line colormapping","size":[1000,1000],"fixed_size":true,"description":"Nearly all objects in Pygfx can have a colormap. And the texcoords can also be scaled using ``material.maprange``. This is useful in scientific applications, where texcoords can e.g. mean temperature of force.","lines":92,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_line_dash","category":"validation","name":"validate_line_dash","title":"Dashing","size":[1000,1000],"fixed_size":true,"description":"* Demoing densely sampled lines with dashing. * Thicker lines show the same pattern (i.e. dash phase increases with thickness). * Dash offset is expressed in same space as the pattern.","lines":93,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_line_dash_loop","category":"validation","name":"validate_line_dash_loop","title":"Dashed line loops","size":[1000,800],"fixed_size":true,"description":"Dashing combined with material.loop.","lines":113,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_line_inf","category":"validation","name":"validate_line_inf","title":"Infinite line segments","size":[640,480],"fixed_size":false,"description":"Display infinite line segments.","lines":86,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_line_loop","category":"validation","name":"validate_line_loop","title":"Line loop","size":[1000,800],"fixed_size":true,"description":"Drawing multiple line loops using material.loop and separating line-pieces with nans.","lines":134,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_line_thickness","category":"validation","name":"validate_line_thickness","title":"Lines with different thicknesses","size":[800,600],"fixed_size":true,"description":"* The top line is drawn with the thin line material, a classic gl one-pixel line. * On the left are lines with increasing thickness, without aa, they don't get thinner than one physical pixel. * On the right are lines with increasing thickness, with aa, really thin lines diminish with alpha. * Note that due to the set pixel_ratio, a thickness of 2 is 1 physical pixel. * When dashes are present, they will eventually diminish as the line thickness reduces.","lines":62,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_line_thickness_space","category":"validation","name":"validate_line_thickness_space","title":"Lines drawn with different thickness_space","size":[1000,1000],"fixed_size":true,"description":"This example draws 3 rows of cubes, each with thickness 10, but each row in a different thickness_space (and color). The left column is positioned directly in the scene. The next two columns are smaller cubes, but placed in scaled containers.","lines":152,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_mesh_colormap","category":"validation","name":"validate_mesh_colormap","title":"Mesh Colormaps","size":[900,400],"fixed_size":true,"description":"Show meshes with 1D, 2D, and 3D colormaps, and per-vertex colors too.","lines":130,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_meshslice","category":"validation","name":"validate_meshslice","title":"Mesh slice","size":[640,480],"fixed_size":false,"description":"Example to validate the mesh slice rendering.","lines":154,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_ndc","category":"validation","name":"validate_ndc","title":"NDC Coordinates","size":[640,480],"fixed_size":false,"description":"Example (and test) for the NDC coordinates. Draws a square that falls partly out of visible range.","lines":97,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_normals_sides","category":"validation","name":"validate_normals_sides","title":"Normals on front and back","size":[640,480],"fixed_size":false,"description":"This example validates that normals are handled such that both the front and back faces are lit. Further it validates the appearance of the normal lines material.","lines":54,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_outpass","category":"validation","name":"validate_outpass","title":"Validate OutPass","size":[640,480],"fixed_size":false,"description":"Validate the different filters for the output pass, (i.e. flush).","lines":124,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_points_markers","category":"validation","name":"validate_points_markers","title":"Points with different markers","size":[1200,1200],"fixed_size":true,"description":"* All available marker shapes are shown. * Shows red, green and blue faces. Then a semi-transparent face, and finally a fully-transparent face.","lines":295,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_points_size","category":"validation","name":"validate_points_size","title":"Points with different sizes","size":[800,600],"fixed_size":true,"description":"* On the left are points with increasing size, without aa, they don't get smaller than one physical pixel. * On the right are poonts with increasing size, with aa, really small points diminish with alpha. * Note that due to the set pixel_ratio, a thickness of 2 is 1 physical pixel. * The bottom row demonstrates per-vertex sizing.","lines":52,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_points_size_space","category":"validation","name":"validate_points_size_space","title":"Points drawn with different size_space","size":[1000,1000],"fixed_size":true,"description":"This example draws 3 rows of cubes, each with size 10, but each row in a different size_space (and color). The left column is positioned directly in the scene. The next two columns are smaller cubes, but placed in scaled containers.","lines":149,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_ppaa","category":"validation","name":"validate_ppaa","title":"Validate ppaa","size":[640,480],"fixed_size":false,"description":"Validate the different ppaa methods.","lines":140,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_ruler","category":"validation","name":"validate_ruler","title":"Validate ruler","size":[640,480],"fixed_size":false,"description":"Showing off some ruler tricks.","lines":103,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_send_data","category":"validation","name":"validate_send_data","title":"Validate send_data","size":[640,480],"fixed_size":false,"description":"Show an image with points overlaid. Both the image and points are uploaded with send_data.","lines":82,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_skybox","category":"validation","name":"validate_skybox","title":"Validate Skybox","size":[640,640],"fixed_size":true,"description":"This validates that the skybox background is rendered correctly, as well as that the environment-map matches that background. Therefore it also covers the internal cube-camera-renderer.","lines":81,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":[],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":["data/cubemap.jpg"],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_srgb","category":"validation","name":"validate_srgb","title":"srgb texture colorspace","size":[600,600],"fixed_size":true,"description":"Show images with physical colorspace, and srgb colorspace via three methods.","lines":71,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_streamed_blending","category":"validation","name":"validate_streamed_blending","title":"Streamed image stitching","size":[640,480],"fixed_size":false,"description":"Show stitching of images using weighted blending. The alpha value of the images are used as weights.","lines":172,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["bricks.jpg","wood.jpg"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_text_align","category":"validation","name":"validate_text_align","title":"Text alignment","size":[800,600],"fixed_size":true,"description":"Example demonstrating the capabilities of text to be aligned and justified according to the user's decision.","lines":97,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_text_anchor","category":"validation","name":"validate_text_anchor","title":"Text anchor","size":[500,500],"fixed_size":true,"description":"This example shows texts with different anchors, so the text can be aligned in the scene.","lines":57,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_text_direction","category":"validation","name":"validate_text_direction","title":"Text direction","size":[800,600],"fixed_size":true,"description":"Pygfx text supports multiple text directions. Latin scripts (like English) are left-to-right. A right-to-left direction is used for e.g. Arabic, and top-to-bottom sometimes for Asian languages.","lines":98,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_text_md","category":"validation","name":"validate_text_md","title":"Text markdown formatting","size":[800,600],"fixed_size":true,"description":"Test markdown formatting features.","lines":65,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_text_outline","category":"validation","name":"validate_text_outline","title":"Text outline always behind text itself","size":[800,600],"fixed_size":true,"description":"Example demonstrating the capabilities of text outline to stay behind the text itself, even for very thick value of the outline thickness where the outline of one character may overlap with the neighboring one.","lines":45,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_text_size","category":"validation","name":"validate_text_size","title":"Text size","size":[640,480],"fixed_size":false,"description":"This example shows text with different sizes.","lines":116,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_tiny_image","category":"validation","name":"validate_tiny_image","title":"Tiny Image Validation","size":[640,480],"fixed_size":false,"description":"This example shows the ability to render different images of small sizes from 32x32 to 1x1 pixels in both RGB and grayscale formats.","lines":73,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_transform","category":"validation","name":"validate_transform","title":"Validate transforms","size":[640,480],"fixed_size":false,"description":"Apply a variety of transform combinations.","lines":62,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_view_offset","category":"validation","name":"validate_view_offset","title":"Validate view offset","size":[830,630],"fixed_size":true,"description":"This renders a sine wave on a gradient background. But the four quadrants are rendered separately using ``set_view_offset`` and put together using textured ``gfx.Mesh`` objects with a margin in between.","lines":114,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_volume","category":"validation","name":"validate_volume","title":"Volume and Volume Slice Rendering","size":[640,480],"fixed_size":false,"description":"Render a volume and volume slices. You should see:","lines":94,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_volume_ray_cam_sign","category":"validation","name":"validate_volume_ray_cam_sign","title":"Volume Axis-Aligned, Rotated Camera","size":[640,480],"fixed_size":false,"description":"Render a MIP volume with the camera oriented such that the view matrix has zeros on its diagonal. You should see:","lines":53,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"validation/validate_volume_slice","category":"validation","name":"validate_volume_slice","title":"Validate volume slice","size":[640,480],"fixed_size":false,"description":"Same as validate_image.py, but for volume slices.","lines":64,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"other/background_subtraction","category":"other","name":"background_subtraction","title":"A Method to Subtract Background from an Image","size":[640,480],"fixed_size":false,"description":"This example shows how to subtract a background from an image.","lines":159,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["hubble_deep_field.png"],"animated":false,"packages":["imageio","numpy"],"extras":["imgui_bundle"],"pypi":["imgui-bundle==1.92.900"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"other/collection_line","category":"other","name":"collection_line","title":"Performance of drawing many Lines","size":[640,480],"fixed_size":false,"description":"Display a lot of line objects. Because of the architecture of wgpu, this is still performant.","lines":66,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"other/compare_images","category":"other","name":"compare_images","title":"A Tool to Compare Two Images of Identical Shapes","size":[640,480],"fixed_size":false,"description":"While mostly an internal tool, it does show how one can combine multiple scenes, all sharing the same data to display it different ways.","lines":286,"isolate":false,"docs":"screenshot","needs_data":true,"imageio":[],"animated":false,"packages":["imageio","numpy"],"extras":["imgui_bundle"],"pypi":["imgui-bundle==1.92.900"],"data":["screenshots"],"imports_examples":[],"skip":"","note":""},{"id":"other/cube_qt","category":"other","name":"cube_qt","title":"Simple Cube with Qt","size":[640,480],"fixed_size":false,"description":"Example showing a single geometric cube.","lines":53,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"Opens a Qt window. Qt has no build for Pyodide, and a browser tab has no native windows.","note":""},{"id":"other/cube_wx","category":"other","name":"cube_wx","title":"Simple Cube with WX","size":[640,480],"fixed_size":false,"description":"Example showing a single geometric cube.","lines":50,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"Opens a wxPython window. wxPython has no build for Pyodide, and a browser tab has no native windows.","note":""},{"id":"other/edl_mesh","category":"other","name":"edl_mesh","title":"Stanford Bunny mesh with Eye-Dome Lighting (EDL)","size":[640,480],"fixed_size":false,"description":"This example loads the Stanford Bunny mesh via Open3D, converts it to pygfx, renders with a basic material, and applies EDL as a post-process.","lines":58,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"Needs open3d, a large C++ library that has no build for WebAssembly.","note":""},{"id":"other/edl_pointcloud","category":"other","name":"edl_pointcloud","title":"Point cloud with Eye-Dome Lighting (EDL)","size":[640,480],"fixed_size":false,"description":"This example renders the Stanford Bunny point cloud (via Open3D) and applies EDL as a post-process to enhance depth perception.","lines":79,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"Needs open3d, a large C++ library that has no build for WebAssembly.","note":""},{"id":"other/gpu_selection","category":"other","name":"gpu_selection","title":"GPU selection","size":[640,480],"fixed_size":false,"description":"Demonstrate how a specific GPU can be selected, or how a GPU can be selected using a power preference.","lines":49,"isolate":true,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"other/hirez_screenshot","category":"other","name":"hirez_screenshot","title":"High resolution screenshot","size":[640,480],"fixed_size":false,"description":"","lines":280,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"other/image_histogram","category":"other","name":"image_histogram","title":"Image Histogram Analysis","size":[800,600],"fixed_size":true,"description":"Compute the histogram of an image, on the GPU, using compute shaders.","lines":350,"isolate":false,"docs":"screenshot","needs_data":false,"imageio":["astronaut.png","camera.png","checkerboard.png","clock.png","coffee.png","horse.png","hubble_deep_field.png","immunohistochemistry.png","moon.png","page.png","text.png"],"animated":false,"packages":["imageio","numpy"],"extras":["imgui_bundle"],"pypi":["imgui-bundle==1.92.900"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"other/integration_pytorch","category":"other","name":"integration_pytorch","title":"Pytorch Integration","size":[640,480],"fixed_size":false,"description":"Pygfx Integration with PyTorch Lightning and PyTorch Geometric: A Practical Example.","lines":745,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":["numpy","pillow","scikit-learn"],"extras":["trimesh"],"pypi":["trimesh==5.1.1"],"data":[],"imports_examples":[],"skip":"Trains in one process and renders in a second one (torch.multiprocessing); a browser tab has no processes or threads for Python. It also needs libigl, which has no build for WebAssembly. PyTorch itself only exists for Pyodide as an unofficial, CPU-only build.","note":""},{"id":"other/integration_qt","category":"other","name":"integration_qt","title":"Integrate Pygfx in Qt","size":[640,480],"fixed_size":false,"description":"Note how we use ``QRenderWidget`` instead of ``RenderCanvas``. The former is inteded to be embedded in an application, the latter is meant as a toplevel window.","lines":67,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"Opens a Qt window. Qt has no build for Pyodide, and a browser tab has no native windows.","note":""},{"id":"other/light_view","category":"other","name":"light_view","title":"Light Effects","size":[640,480],"fixed_size":false,"description":"Lighting effect demonstration examples with adjustable parameters","lines":333,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"Opens a Qt window. Qt has no build for Pyodide, and a browser tab has no native windows.","note":""},{"id":"other/load_open3d_mesh","category":"other","name":"load_open3d_mesh","title":"Load Open3D Mesh","size":[640,480],"fixed_size":false,"description":"Demonstrates loading mesh models from open3d.","lines":82,"isolate":false,"docs":"code","needs_data":true,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":["data/DamagedHelmet"],"imports_examples":[],"skip":"Needs open3d, a large C++ library that has no build for WebAssembly.","note":""},{"id":"other/load_open3d_pointcloud","category":"other","name":"load_open3d_pointcloud","title":"Load Open3D Pointcloud","size":[640,480],"fixed_size":false,"description":"Demonstrates loading pointclouds from open3d.","lines":84,"isolate":false,"docs":"code","needs_data":true,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":["data/teapot.stl"],"imports_examples":[],"skip":"Needs open3d, a large C++ library that has no build for WebAssembly.","note":""},{"id":"other/object_bounding_box_open3d","category":"other","name":"object_bounding_box_open3d","title":"Boundary Boxes","size":[640,480],"fixed_size":false,"description":"Demonstrates visualizing object bounding boxes","lines":73,"isolate":false,"docs":"code","needs_data":true,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":["data/teapot.stl"],"imports_examples":[],"skip":"Needs open3d, a large C++ library that has no build for WebAssembly.","note":""},{"id":"other/reactive_rendering","category":"other","name":"reactive_rendering","title":"Reactive rendering loop","size":[640,480],"fixed_size":false,"description":"This example encapsulates all state that has a visual impact on the drawn frame, and only renders a new frame when there are changes in that state.","lines":154,"isolate":true,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":["observ"],"pypi":["observ==1.0.1"],"data":[],"imports_examples":[],"skip":"","note":""},{"id":"other/sam2_point_segmentation","category":"other","name":"sam2_point_segmentation","title":"Interactive Segmentation with SAM2","size":[640,480],"fixed_size":false,"description":"This script demonstrates a real-time interactive segmentation application using pygfx points as prompts to the SAM2 (Segment Anything Model 2) model. SAM2 relies on PyTorch for inference, and the GUI is built using Qt (PySide6).","lines":259,"isolate":false,"docs":"code","needs_data":true,"imageio":["astronaut.png"],"animated":false,"packages":["imageio"],"extras":[],"pypi":[],"data":["data/ClearCoatCarPaint_Normal.png","data/ClearcoatWicker.glb","data/DamagedHelmet","data/Michelle.glb","data/Soldier.glb","data/coastlines.npz","data/cubemap.jpg","data/facecap.glb","data/just_a_girl","data/lightmap","data/phoenix_bird.glb","data/planets","data/retinal.obj","data/teapot.stl"],"imports_examples":[],"skip":"A Qt application that runs the SAM 2 model in a background thread and downloads its PyTorch checkpoint at startup. Qt, threads and that download are not available in a browser tab.","note":""},{"id":"other/show_cpu_usage","category":"other","name":"show_cpu_usage","title":"Showing CPU usage in the title bar","size":[640,480],"fixed_size":false,"description":"Convenient for when investigating performance.","lines":46,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"Reads the CPU usage of the machine with psutil. A browser tab has no access to that.","note":""},{"id":"other/sponza_scene","category":"other","name":"sponza_scene","title":"Sponza Scene","size":[640,480],"fixed_size":true,"description":"This example shows how to load the Sponza scene. To run it, you have to have access to the sponza demo scene, which you can get using::","lines":95,"isolate":false,"docs":"code","needs_data":true,"imageio":[],"animated":false,"packages":["numpy","pillow"],"extras":["trimesh"],"pypi":["trimesh==5.1.1"],"data":["glTF-Sample-Assets/Models/Sponza/glTF"],"imports_examples":[],"skip":"","note":""},{"id":"other/two_canvases","category":"other","name":"two_canvases","title":"Two Canvases","size":[500,300],"fixed_size":true,"description":"Example demonstrating rendering the same scene into two different canvases.","lines":67,"isolate":false,"docs":"code","needs_data":false,"imageio":[],"animated":false,"packages":[],"extras":[],"pypi":[],"data":[],"imports_examples":[],"skip":"","note":""}]}