v2.14.0

playcanvas/enginev2.14.0Dec 4, 2025by mvaligursky

AI Summary

A feature-rich release introducing GSplat flipbook animations and Picker depth rendering, alongside a significant breaking change in glTF vertex color handling.

Key Highlights

  • BREAKING CHANGE: Vertex colors in glTF now use linear space
  • Added GSplat flipbook animation script and example
  • Picker class can optionally render depth for world space pick points
  • WebGPU support for instancing-custom example

Breaking Changes

  • Use linear space for vertex colors in gLTF (affects StandardMaterials only)

New Features

  • GSplat flipbook animation script
  • Picker class with depth rendering support
  • WebGPU support for instancing-custom example
  • GSplat frame:ready event with loadingCount parameter

Full Release Notes

## Breaking Changes
* [BREAKING] Use linear space for vertex colors in gLTF by @LeXXik in https://github.com/playcanvas/engine/pull/8122

    Note: Projects that use vertex colors—especially those imported from FBX—may see visual changes because vertex colors are now treated as linear by default (for glTF compatibility). If your assets use gamma-encoded vertex colors, set material.vertexColorGamma = true to restore the previous appearance. This affects StandardMaterials only, ShaderMaterials are not affected.

## Other changes
* Refactor gsplat shader chunks: move helpers and customize to common by @mvaligursky in https://github.com/playcanvas/engine/pull/8129
* Adds a soft limit on total splat count rendered for streaming lod by @mvaligursky in https://github.com/playcanvas/engine/pull/8217
* Picker class can (optional) render depth and provide world space pick points by @mvaligursky in https://github.com/playcanvas/engine/pull/8154
* GSplat streaming lod - used memory optimization by @mvaligursky in https://github.com/playcanvas/engine/pull/8171
* Add frame:ready event to GSplatComponentSystem for video capture workflows by @mvaligursky in https://github.com/playcanvas/engine/pull/8128
* Updated main jsdocs block for GSplatComponent by @mvaligursky in https://github.com/playcanvas/engine/pull/8130
* Optimize BoundingBox.containsPoint performance by @mvaligursky in https://github.com/playcanvas/engine/pull/8137
* AGENTS.md file automatically used by AI agents (such as Cursor) by @mvaligursky in https://github.com/playcanvas/engine/pull/8140
* Update all npm dependencies by @renovate[bot] in https://github.com/playcanvas/engine/pull/8143
* Migrate Renovate config by @renovate[bot] in https://github.com/playcanvas/engine/pull/8144
* Gizmo mouse button option by @kpal81xd in https://github.com/playcanvas/engine/pull/8153
* Update actions/checkout action to v6 by @renovate[bot] in https://github.com/playcanvas/engine/pull/8157
* Add GSplat to ComponentSystemRegistry by @mvaligursky in https://github.com/playcanvas/engine/pull/8174
* Add loadingCount parameter to GSplat frame:ready event by @mvaligursky in https://github.com/playcanvas/engine/pull/8178
* Add GSplat flipbook animation script + related functionality + example by @mvaligursky in https://github.com/playcanvas/engine/pull/8141
* Add WebGPU support to instancing-custom example - custom WGSL shader by @mvaligursky in https://github.com/playcanvas/engine/pull/8186
* [DOCS] clarify Asset.preload behaviour by @lucaheft in https://github.com/playcanvas/engine/pull/8189
* Update all npm dependencies by @renovate[bot] in https://github.com/playcanvas/engine/pull/8194
* Update sinon to latest by @willeastcott in https://github.com/playcanvas/engine/pull/8195
* Update @webgpu/types dependency to latest by @willeastcott in https://github.com/playcanvas/engine/pull/8196
* Regenerate package-lock.json by @willeastcott in https://github.com/playcanvas/engine/pull/8197
* Added tracing support to log all assets in the registry by @mvaligursky in https://github.com/playcanvas/engine/pull/8209
* Add WGSL shader support for annotation hotspots by @mvaligursky in https://github.com/playcanvas/engine/pull/8219
* Outline renderer WGSL chunk  by @mvaligursky in https://github.com/playcanvas/engine/pull/8225

## Fixes
* Fix incorrect time calculation in first two frames by @mvaligursky in https://github.com/playcanvas/engine/pull/8185
* [Fix] Fixed gsplat shader effect to handle limit to a camera by @mvaligursky in https://github.com/playcanvas/engine/pull/8117
* Workaround for packHalf2x16 precision issues on some Android devices by @mvaligursky in https://github.com/playcanvas/engine/pull/8121
* CameraControls enablePan fix by @kpal81xd in https://github.com/playcanvas/engine/pull/8126
* docs: fix typos in some files by @Edge-Seven in https://github.com/playcanvas/engine/pull/8131
* Fix unified gsplat double transformation bug by @mvaligursky in https://github.com/playcanvas/engine/pull/8135
* Fix GSplat LOD calculation to use nearest point on bounding box by @mvaligursky in https://github.com/playcanvas/engine/pull/8138
* Fix PBO texture uploads by ensuring correct texture binding state by @mvaligursky in https://github.com/playcanvas/engine/pull/8146
* Fix unified gsplat rendering when viewport is resized by @mvaligursky in https://github.com/playcanvas/engine/pull/8147
* Gizmo snap state fix by @kpal81xd in https://github.com/playcanvas/engine/pull/8151
* Camera controls fly shift fix by @kpal81xd in https://github.com/playcanvas/engine/pull/8152
* [Fix] UploadStream functionality handles lost context by @mvaligursky in https://github.com/playcanvas/engine/pull/8160
* [Fix] improve error messages for script attribute validation by @mvaligursky in https://github.com/playcanvas/engine/pull/8172
* [Fix] Correct transmission attenuation rendering by @mvaligursky in https://github.com/playcanvas/engine/pull/8173
* Fix Screen.priority signed integer overflow by @mvaligursky in https://github.com/playcanvas/engine/pull/8180
* Improvements and fixes to streaming lod gsplat being destroyed by @mvaligursky in https://github.com/playcanvas/engine/pull/8210
* Fix spherical harmonics not rendering with streaming SOGS by @mvaligursky in https://github.com/playcanvas/engine/pull/8215
* Fix null values in asset cache for ESM scripts causing error by @snave333 in https://github.com/playcanvas/engine/pull/8221

## Examples
* WebGPU Compute shader edge detect example by @mvaligursky in https://github.com/playcanvas/engine/pull/8192
* Add ESM script for annotations and an example by @willeastcott in https://github.com/playcanvas/engine/pull/8202
* Remove unnecessary GLSL transpiler config from examples by @mvaligursky in https://github.com/playcanvas/engine/pull/8175
* Use ministats to display number of splats in an streaming lod example by @mvaligursky in https://github.com/playcanvas/engine/pull/8182
* [FIX] Address race condition when loading example code by @willeastcott in https://github.com/playcanvas/engine/pull/8198
* Update examples NPM dependencies by @willeastcott in https://github.com/playcanvas/engine/pull/8199
* Update Examples Browser to React 19 by @willeastcott in https://github.com/playcanvas/engine/pull/8200
* Regenerate examples package-lock.json by @willeastcott in https://github.com/playcanvas/engine/pull/8201
* Removed unused react-es6 package from examples by @kpal81xd in https://github.com/playcanvas/engine/pull/8208
* Fix examples browser compatibility with React 19 and React Router v7 by @mvaligursky in https://github.com/playcanvas/engine/pull/8212
* Remove deprecated bloom script from animation examples by @mvaligursky in https://github.com/playcanvas/engine/pull/8213
* Remove old private LOD example now that we have public examples by @mvaligursky in https://github.com/playcanvas/engine/pull/8218
* fix: Fix broken BlendTrees example by @abstrakt8 in https://github.com/playcanvas/engine/pull/8216
* Updated Trees example to supply wgsl chunks by @mvaligursky in https://github.com/playcanvas/engine/pull/8223
* Shader Hatch example has WGSL shader to avoid transpilation from GLSL by @mvaligursky in https://github.com/playcanvas/engine/pull/8224
* WGSL shader variant for Integer Textures example by @mvaligursky in https://github.com/playcanvas/engine/pull/8226
* AreaPicker & internal shader properties test example fixes by @mvaligursky in https://github.com/playcanvas/engine/pull/8227

## New Contributors
* @Edge-Seven made their first contribution in https://github.com/playcanvas/engine/pull/8131
* @lucaheft made their first contribution in https://github.com/playcanvas/engine/pull/8189
* @snave333 made their first contribution in https://github.com/playcanvas/engine/pull/8221

**Full Changelog**: https://github.com/playcanvas/engine/compare/v2.13.6...v2.14.0