Created
June 23, 2026 13:34
-
-
Save donmccurdy/947d6a9ea40d49ae34c498fd33a15072 to your computer and use it in GitHub Desktop.
Generate KHR_mesh_primitive_restart samples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import { Document, NodeIO, type vec3 } from '@gltf-transform/core'; | |
| import { KHRMaterialsUnlit, KHRMeshPrimitiveRestart } from '@gltf-transform/extensions'; | |
| import { join } from '@gltf-transform/functions'; | |
| // NOTE: Package '@gltf-transform/test-utils' is a private package within the glTF Transform | |
| // GitHub repo, not published to npm. This script must either be run within the repo's workspace, | |
| // or linked (npm link, yarn link, etc.) to the package locally. | |
| import { | |
| createLineLoopPrim, | |
| createLineStripPrim, | |
| createTriangleStripPrim, | |
| createTriangleFanPrim, | |
| } from '@gltf-transform/test-utils'; | |
| const io = new NodeIO().registerExtensions([KHRMaterialsUnlit, KHRMeshPrimitiveRestart]); | |
| const OUTPUT_DIR = './primitive-restart-samples'; | |
| type PrimFactory = { | |
| name: string; | |
| translate: (i: number) => vec3; | |
| scale: (i: number) => vec3; | |
| fn: typeof createLineStripPrim; | |
| }; | |
| const PRIM_FACTORIES: PrimFactory[] = [ | |
| { | |
| name: 'line-strip', | |
| translate: (i: number) => [(i % 3) - 1, Math.floor(i / 3) - 1, 0], | |
| scale: (_: number) => [0.333, 0.333, 0.333], | |
| fn: createLineStripPrim, | |
| }, | |
| { | |
| name: 'line-loop', | |
| translate: (i: number) => [(i % 3) - 1, Math.floor(i / 3) - 1, 0], | |
| scale: (_: number) => [0.333, 0.333, 0.333], | |
| fn: createLineLoopPrim, | |
| }, | |
| { | |
| name: 'triangle-strip', | |
| translate: (i: number) => [i - 4, 0, 0], | |
| scale: (_: number) => [0.333, 0.333, 0.333], | |
| fn: createTriangleStripPrim, | |
| }, | |
| { | |
| name: 'triangle-fan', | |
| translate: (i: number) => [(i % 3) - 1, Math.floor(i / 3) - 1, 0], | |
| scale: (_: number) => [0.333, 0.333, 0.333], | |
| fn: createTriangleFanPrim, | |
| }, | |
| ]; | |
| for (const factory of PRIM_FACTORIES) { | |
| const document = new Document(); | |
| const mesh = document.createMesh(); | |
| const node = document.createNode().setMesh(mesh); | |
| const scene = document.createScene().addChild(node); | |
| document.getRoot().setDefaultScene(scene); | |
| const unlitExtension = document.createExtension(KHRMaterialsUnlit); | |
| const unlit = unlitExtension.createUnlit(); | |
| const material = document.createMaterial().setExtension('KHR_materials_unlit', unlit); | |
| for (let i = 0; i < 9; i++) { | |
| const prim = factory.fn(document, 8, factory.translate(i), factory.scale(i)); | |
| prim.setMaterial(material); | |
| mesh.addPrimitive(prim); | |
| } | |
| await document.transform(join()); | |
| await io.write(`${OUTPUT_DIR}/primitive-restart-${factory.name}.glb`, document); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment