Skip to content

Instantly share code, notes, and snippets.

@donmccurdy
Created June 23, 2026 13:34
Show Gist options
  • Select an option

  • Save donmccurdy/947d6a9ea40d49ae34c498fd33a15072 to your computer and use it in GitHub Desktop.

Select an option

Save donmccurdy/947d6a9ea40d49ae34c498fd33a15072 to your computer and use it in GitHub Desktop.
Generate KHR_mesh_primitive_restart samples
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