Features:
- feat(core): Add Document#disposeExtension #1740
- feat(core): Add strict and non-strict I/O modes for missing resources #1696 by @Makio64
- feat(extensions): Add KHR_node_visibility #1747
- feat(functions): Add 'chromaSubsampling' option to textureCompress #1713
- feat(cli): Add --mipmaps flag to etc1s and uastc commands, and
toktx()#1777 by [@FrostKiwi] - feat(cli): Add --sparse flag in optimize command #1735
Other:
- fix(docs): Improve documentation of mesh primitive modes #1718
- fix(cli): Fix docs on draco --encode-speed and --decode-speed flags #1744
- fix(extensions): Fix error on input with KHR_texture_basisu and no textures #1770 by @chrisdaid
- refactor(types): Update
ArrayBuffertypes to support TypeScript 5.9 #1702 by @jamesbvaughan - chore(repo,cli): Remove extraneous dependencies #1767 #1766 #1765 #1764 #1762 #1763
- chore(core): Update to property-graph v4 #1754
- chore(cli,extensions,functions): Update to 'meshoptimizer' v1.0.1 #1778
Special thanks to Brandon Jones for contributing the unwrap() transform, and for developing watlas, a WebAssembly port of xatlas.
Features:
- functions,cli: Adds
unwrap()andunwrapPrimitives()to generate texture coordinates #1660, #1661, #1662, #1663, #1666
Other:
- fix(cli): Warn when calling 'optimize' with Draco enabled and welding disabled #1698
- fix(functions): Remove side effects from simplify() and weld() #1685
- fix(functions): Deprecate 'keepIndices' option in prune() #1691
- fix(view): Fix light targets in instanced lights #1491, #1699
- fix(view): Fix emissive intensity on MeshStandardMaterial #1690
Features:
- functions: Adds
uninstance()andcreateInstanceNodes()#1525 - cli: Add
ktxdecompresscommand for decoding KTX2 textures #1622
Performance:
- core: Update to property-graph v3 #1543
- Removes
.dispatch,.addEventListener, and other event-related behaviors fromGraphEdgeclass
- Removes
Other:
- fix(core): Handle duplicate URIs on read/write #1522
- fix(functions,cli): Locale-based numeric formatting #1512
- fix(extensions): Fix error decoding sparse accessors in draco-compressed meshes #1623
- chore(repo): Replace ESLint and Prettier with Biome #1624
Breaking changes:
- core: Renames
NodeIO#setAllowHttptosetAllowNetwork#1392 - core: Removes
Document#mergeandDocument#clonemethods #1375- Use
mergeDocumentsandcloneDocumentfrom/functionspackage
- Use
- core: Renames
boundstogetBoundsand moves from /core to /functions #1340 - core: Renames
Node#getParenttoNode#getParentNodeandNode#listNodeScenes#1211 - core: Renames
MathUtils#denormalizetodecodeNormalizedInt, andMathUtils#normalizetoencodeNormalizedInt#1211 - core,extensions: Removes hexadecimal getters/setters #1211
- Use
ColorUtilsinstead
- Use
- extensions: Upgrade to
property-graphv2 #1141- Affects implementations of custom extensions. See changes to official extensions in #1141
- functions: Removes 'overwrite' and 'skipIndices' options from
transformMesh()andtransformPrimitive()functions #1397 - functions: Removes lossy
weld()options #1357 - functions: Merges
textureResizeintotextureCompressfunction #1211 - cli: Update to Sharp v0.33 #1402
- cli: Upgrade to KTX-Software v4.3 #1277, #1369, #1376, #1378
- cli: Renames
--allow-httpto--allow-net#1392 - cli: Change default compression of
optimizecommand to Meshopt #1377 - core,cli: Requires Node.js >=18; other runtimes (Web and Deno) unaffected
Features:
- extensions: Adds
KHR_materials_diffuse_transmission#1159 - extensions: Adds
KHR_materials_dispersion#1262 - functions: Adds
mergeDocuments(target, source)#1375 - functions: Adds
cloneDocument(source)#1375 - functions: Adds
copyToDocument(target, source, sourceProperties)#1375 - functions: Adds
moveToDocument(target, source, sourceProperties)#1375 - functions: Adds
compactPrimitive()to remove unused vertices #1397 - functions: Adds
convertPrimitiveToLinesandconvertPrimitiveToTriangles, support conversions of various primitive topologies to triangle lists and line lists #1316 - functions: Adds more aggressive
prune()defaults #1199, #1270 - cli: Expose
--simplify-ratioand--simplify-lock-borderoptions onoptimizecommand #1354 by @jo-chemla - cli: Expose prune-related options on
optimizecommand #1298 by @subho57 - cli: MikkTSpace tangent calculation handles unwelding and welding automatically #1241
- functions: Add vertex count helpers,
getSceneVertexCount,getNodeVertexCount,getMeshVertexCount,getPrimitiveVertexCount#1320, #1327, #1393 - functions: Add
keepExtrasoption toprune()#1302 by @Archimagus - functions: Add support for point cloud simplification, via meshoptimizer v0.20 #1291
- functions: Add power-of-two options to
textureCompress#1221
Performance:
- functions: Improves
weld()performance #1237, #1238, #1344, #1351 - functions: Improves
join()andjoinPrimitives()performance #1242, #1397 - functions: Improves
transformMesh()transformPrimitive()performance #1397 - functions: Improves
quantize()performance #1395 - functions: Improves
partition()performance #1373 - functions: Improves
reorder()performance #1358 - core: NodeIO now writes files to disk in batches #1383
- functions: Improves
simplify()performance on indexed primitives #1381
Other:
- chore(repo): Update to Yarn v4 #1401
- chore(repo): Adds CI for local builds on windows #959
- chore(repo): Add benchmarks
- chore(repo): Packages are now published as unminified code #1212
- docs(core): Fix errors in Accessor documentation #1235 by @harrycollin
- docs(extensions): Add more illustrations for extensions
- docs(repo): Show 'experimental' tags in API documentation
c3a693 - fix(core): Clamp when encoding normalized ints #1286
- fix(extensions): Bug fixes for Draco compression #1388, #1385
- fix(extensions): Group Meshopt-compressed accessors by parent #1384
- fix(extensions): Improve order-independence in extension implementations #1257
- fix(functions): Various fixes for pruning and welding #1284
- fix(functions): Fixes for instancing bugs #1269
- fix(functions): Fixes for simplification bugs #1268
- fix(cli): Reformat 'validate' output as valid CSV #1252
v3.9 (Milestone)
Features:
- Update
prune()to remove redundant mesh indices #1164 - Update meshoptimizer to v0.20
v3.8 (Milestone)
Features:
- Add quantization options in
meshopt()function #1144 - Improve encoding of morh normals with quantization and meshopt encoding #1151
v3.7 (Milestone)
Features:
Other:
- Fix encoding of special characters in filenames when writing to disk #1118
- Fixed regression in quality of Draco compression #1077
- Updated
sharpCLI dependency to address high-priority WebP vulnerability in libwebp- See CVE-2023-4863 and CVE-2023-41064
v3.6 (Milestone)
Features:
- Add limited
textureCompress()support in web browsers (PNG, JPEG, WebP) #1075 - Bug fixes and quality improvements in
optimize(),dedup(),instance(),flatten()andjoin()operations #1073 textureCompress()PNG compression is now lossless by default #1068join()now supports quantized meshes #1067simplify()now cleans up degenerate mesh primitives #1066- Moved CLI to a fork of Caporal.js #1065
v3.5 (Milestone)
Features:
- Improvements to
weld()#1029 by @rotu - Add
--patternflag inetc1sanduastcCLI commands #1037 - Add
toleranceNormaloption inweld()#1046- Default vertex normal tolerance has been reduced (#1035), reducing loss of quality in some cases. Where more aggressive welding is required (such as simplification and LODs), users should specify
toleranceNormal=0.5to restore the previous default.
- Default vertex normal tolerance has been reduced (#1035), reducing loss of quality in some cases. Where more aggressive welding is required (such as simplification and LODs), users should specify
v3.4 (Milestone)
Special thanks to Muse for supporting development of the palette() feature.
Features:
v3.3 (Milestone)
Special thanks to @kzhsw for help with performance improvements in v3.3.
Features:
- Add
listTextureInfoByMaterial()function #947 - Add
getTextureColorSpacefunction #944 - Sync with
KHR_materials_anisotropyrelease candidate #946 - Improve performance of
dedup#945 - Improve performance of
resample, port to WASM #934
Internal:
v3.2 (Milestone)
Features:
v3.1 (Milestone)
Features:
- Add
--join <bool>and--flatten <bool>flags to `optimize' CLI command #838 by @xlsfs - Add
KHR_materials_anisotropyextension #748 - Allow root Nodes to be shared by multiple Scenes #833
- Deprecate
Node#getParent(), preferNode#getParentNode() - Deprecate
getNodeScene(), preferlistNodeScenes()
- Deprecate
v3.0 (Milestone)
Features:
- Add
optimizemulti-command to CLI, "optimize all the things" #819 - Replace Squoosh with Sharp, new
textureCompress()API #752 - Add
flatten()function, reduce scene graph nesting #790 - Add
join()andjoinPrimitives()functions, reduce draw calls #707, #658 - Add support for sparse accessors #793
- Add
--formatoption to CLIvalidatecommand #778 - NodeIO creates missing directories when writing .gltf resources #779
- Add
clearNodeParent(),clearNodeTransform(),getNodeScene()#784 - (EXPERIMENTAL) Add
--configflag to CLI, support userland extensions and commands #791
Breaking changes:
- Rename extension classes, include vendor prefixes #776
- Rename
bounds()→getBounds()#774 - Rename MathUtils
normalize()/denormalize()→encodeNormalizedInt()/decodeNormalizedInt()#777 - Rename ImageUtils
getMemSize()→getVRAMByteLength()#812 - Replace Squoosh with Sharp, new
textureCompress()API #752 - Update signatures of
listTextureChannels,listTextureInfo,listTextureSlots, andgetTextureChannelMaskto not requiredocumentparameter #787 - Store array literals (color, vector, ...) as copies #796
Internal:
v2.5 (Milestone)
Features:
- Add
weldPrimitive(document, prim, options)function #767 by @marwie - Support resampling quaternion keyframe tracks in
resample()#760 - Remove unused vertex attributes in
prune()#759 - Display KTX2 compression type in
inspect()report #757 - Add morph target support in
transformMesh(),transformPrimitive()#756 - Improve detection of duplicate meshes in
dedup()#663 by @robertlong
v2.4 — (Milestone)
Features:
- Add
sortPrimitiveWeights(prim, limit)function #670 - Add
listTextureInfo(texture)function #692 - Add
transformMesh(mesh, matrix)andtransformPrimitive(prim, matrix)functions #657 - Rewrite
weld()function, improving weld results #661 - Handle conflicting URLs during merge #677
- Add documentation for writing custom extensions #678
v2.3 (Milestone)
Features:
- Add
simplify()function. #655 - Add
ILoggerinterface for user-specified logging. #653 - Add support for
.extrason TextureInfo. #646 - Show normalized attributes in
inspect()output. #638
v2.2 (Milestone)
Features:
Changedpackage.json#moduleentrypoint extension to.mjs#619- Add 'slots' option to
textureResize()function. #622 by @snagy
v2.1 (Milestone)
Features:
- Vastly improved KTX compression speed. #389 by @mikejurka, @spatialsys
- Add
KHR_materials_iridescenceextension. #518 - Add WebP, OxiPNG, and MozJPEG image optimization with
@squoosh/lib. #506 - Add
draco(),meshopt(),unlit(), andktxfix()functions to@gltf-transform/functions(moved from CLI). #544 - Add
listTextureSlots(),listTextureChannels(),getTextureChannelMask(). #506
v2.0 (Milestone)
Features:
- Improved and simplified extension API. #437
- Add
a.equals(b)method for all property types. #437 - Add
KHR_xmp_json_ldextension. #468 - Add
NodeIO.setAllowHTTP(<boolean>). #466 - Non-blocking NodeIO read/write. #441
- Add
DenoIO(experimental). #380 - Add
normals()function. #497
Breaking changes:
- API for custom extensions updated. #437
- I/O, Texture and other classes use Uint8Array for binary data, not ArrayBuffer. #447
- I/O read/write methods are now asynchronous. #441
- Removed support for Node.js ≤ 12.x
v1.2 (Milestone)
Features:
- Add
dequantize()function. #431 - Add
KHR_materials_emissive_strengthextension. #422 - Add
ImageUtils.getMimeType(buffer). #432
v1.1 (Milestone)
Features:
- Extensions registered with I/O are written if used; unregistered extensions are skipped. #421
- Stages in
document.transform()can detect other stages and optimize accordingly. #417 - Added
material.equals(otherMaterial)method. #405 by @MrMagicPenguin - Added support for materials in
dedup()function. #407 by @MrMagicPenguin
v1.0 (Milestone)
Stable release.
v0.12 (Milestone)
Features:
- Add compression/decompression support for
EXT_meshopt_compression. #314 #323 - Add
reorder()function. #321 - Faster, smaller CLI installation. #281
- Improved
textureResize()API. #282 - Add
node.setMatrix(...). #270 - Parse in-memory Data URIs with
readJSON. #266 - Support
.extrason Root object #339
Breaking changes:
- Remove ao() function and dependencies. #281
v0.11 (Milestone)
Features:
- Add
textureResize()function. #267 - Add
quantizationVolume: 'scene' | 'mesh'option toquantize()and Draco compression. Fixes #257. #272 - Support GLB files without binary data (e.g. just a node graph). #245
- Improve type-checking throughout the library, with TypeScript's strict checks.
- Add API documentation for
@gltf-transform/extensionsand@gltf-transform/functions, with Typedoc v0.20.
Breaking changes:
- Rename
@gltf-transform/libto@gltf-transform/functions. #249 - Move
ao()from@gltf-transform/functionsto the CLI, cutting size and dependencies of the functions package. - I/O
writeJSONoptionisGLB: truechanged toformat: Format.GLB.
v0.10 (Milestone)
Features:
Breaking changes:
- Material extensions now track RGBA channel usage of each texture, allowing improvements in KTX 2.0 support. #221
v0.9 (Milestone)
Features:
- Add 'instance' transform. #169
- Add 'prune' transform. #162
- Add 'resample' transform. #158
- Add 'tangents' transform. #175
- Add 'quantize' transform. #59
- Add
KHR_materials_volumeextension. #161 - Add
EXT_mesh_gpu_instancingextension. #115 - Add
--format={pretty,csv,md}output options for CLIinspectcommand. - Add
--vertex-layout={interleaved,separate}options for CLI output.
Breaking changes:
- Stricter type checking.
- Enum values moved from
GLTF.*to static properties of the relevant class. Primitive enum values are now allowed. - Enable esModuleInterop in TS config.
- 'dedup' transform takes a
propertyTypes: string[]array, rather than boolean flags for each property type. - 'draco' CLI command options renamed (hyphenated) for consistency.
v0.8 (Milestone)
Features:
- Add 'weld' and 'unweld' transforms.
- Add encoding/compression support for
KHR_draco_mesh_compression. - Add KTX and WebP support in utils and 'inspect' function.
- Add
KHR_materials_variantsextension.
Breaking changes:
- Stricter type checking.
- External type definitions are now installed as dependencies.
v0.7 (Milestone)
Features:
- Add 'center' and 'sequence' transforms.
- Add 'bounds' helper.
- Enhance 'partition' transform to support animations.
- Add
KHR_draco_mesh_compressionextension (decode only). - Add
KHR_texture_transformextension. - Add
EXT_texture_webpextension. - Add
KHR_materials_sheenextension.
Breaking changes:
- Merged TextureSampler properties into TextureInfo.
- TextureInfo now extends from ExtensibleProperty.
- Simplified I/O API. Renamed:
- NativeDocument -> JSONDocument
- unpackGLB -> readBinary
- packGLB -> writeBinary
- createDocument -> readJSON
- createNativeDocument -> writeJSON
- unpackGLBToNativeDocument -> binaryToJSON
v0.6 (Milestone)
Features:
- Add world transform API (getWorldTranslation/getWorldRotation/getWorldScale/getWorldMatrix) and getMatrix to Node.
- Add ColorUtils and helper methods to work with colors in hexadecimal and sRGB.
- Add traverse method to Node.
- Simplified Extension API.
- Add Extras API.
CLI:
- Accept textures in
mergecommand.
Breaking changes:
- getExtension/setExtension syntax changed to accept extension names, not constructors. See ExtensibleProperty.
- Scene addNode/removeNode/listNodes are now addChild/removeChild/listChildren, for consistency with Node API.