Releases: playcanvas/engine
Releases · playcanvas/engine
v2.20.0
Breaking changes
- [BREAKING] Move gsplat lodRangeMin/lodRangeMax to GSplatComponent by @mvaligursky in #8908
Changes
- Drop "unified" framing now that it's the default by @mvaligursky in #8805
- Support GSPLAT_AA in the hybrid gsplat renderer by @mvaligursky in #8807
- Support HTML-in-Canvas textures via copyElementImageToTexture (WebGPU) by @mvaligursky in #8810
- Replace opaque any/* types with real types in API reference by @willeastcott in #8811
- Elevate the Entity class reference to peak quality by @willeastcott in #8814
- Support transient (memoryless) attachments (WebGPU) by @mvaligursky in #8816
- [BREAKING] World-space PCSS penumbra, plus gsplat & cascade fixes by @mvaligursky in #8818
- Automatic bind-group reflection for compute shaders (WebGPU) by @mvaligursky in #8821
- Apply render-stage modify hooks in the hybrid gsplat renderer by @mvaligursky in #8822
- Move test fixture server off port 3000 and use relative asset URLs by @mvaligursky in #8823
- Add post-build tests for ESM/UMD bundles and API surface gate by @kpal81xd in #8845
- Comment the public API diff on PRs (informative) by @kpal81xd in #8848
- Add MeshInstance.shaderPassMask to control shader pass participation by @mvaligursky in #8852
- Add stereo XR support to hybrid GPU-sort gsplat renderer by @mvaligursky in #8861
- Reduce API report comment noise by @kpal81xd in #8863
- Warn and fail GLB loading when Draco decoder is unavailable by @mvaligursky in #8868
- Add foveated contribution culling to the GPU-sort gsplat renderer by @mvaligursky in #8869
- Align ButtonComponent with CameraComponent architecture by @willeastcott in #8870
- Align CollisionComponent with CameraComponent architecture by @willeastcott in #8871
- Add gsplatModifyPS hook for gsplat fragment color customization by @mvaligursky in #8872
- Align ParticleSystemComponent with CameraComponent architecture by @willeastcott in #8873
- Eliminate ComponentData classes and engine schema usage by @willeastcott in #8876
- Share camera property list between init and clone by @willeastcott in #8878
- Drive cloneComponent from shared _properties lists by @willeastcott in #8879
- Hoist property lists in model, sound and rigid-body components by @willeastcott in #8880
- Share animation property list between init and clone by @willeastcott in #8881
- Standardize beforeremove handler naming by @willeastcott in #8882
- Drop shape from shared collision properties, modernize initialize/clone by @willeastcott in #8883
- Remove dead falsy guards in collision shape implementations by @willeastcott in #8884
- Standardize component teardown method to onBeforeRemove by @willeastcott in #8885
- Deduplicate rigid body / trigger rebuild in collision by @willeastcott in #8886
- Add user varying streams to gsplat shader customization by @mvaligursky in #8887
- Correct JSDoc visibility tags on internal collision methods by @willeastcott in #8888
- Promote JointComponent to public API with typed joints by @willeastcott in #8891
- Split rigid-body data classes into separate modules by @willeastcott in #8897
- Cover reparenting an element after its screen is destroyed by @willeastcott in #8899
- Remove dead and broken GamePads previous getter by @willeastcott in #8900
- Source geometry from work buffer for SOG spherical harmonics updates by @mvaligursky in #8902
- Move XR per-view data from the XR manager to the Camera (RenderView) by @mvaligursky in #8907
- Apply gsplat scene settings in applySceneSettings by @mvaligursky in #8909
- Allow ArrayBuffer in StorageBuffer.write data type by @mvaligursky in #8911
- Update @webgpu/types to 0.1.70 and migrate deprecated type names by @mvaligursky in #8912
- Extract GSplatWorld from GSplatManager by @mvaligursky in #8916
- Document transient attachment validation invariants by @mvaligursky in #8918
- Decouple gsplat streaming from rendering for autoRender=false by @mvaligursky in #8919
- Remove unused JSDoc @import lines from sound and rigid-body components by @mmjinglin163 in #8920
- Remove the gsplat compute renderer by @mvaligursky in #8921
- Report minified bundle size changes on PRs by @mvaligursky in #8922
- Move GPU sort/cull pipeline into the hybrid gsplat renderer by @mvaligursky in #8924
- Use lossless RGBA32U fallback instead of pack8 for particles by @mvaligursky in #8926
- Drop redundant particle material reset on camera change by @mvaligursky in #8928
- Throttle concurrent asset requests by @mvaligursky in #8929
- Support dynamic cookie textures with clustered lighting by @mvaligursky in #8930
- Cast directional shadows from the hybrid gsplat renderer by @mvaligursky in #8933
- Apply vertex-modify to hybrid cast shadows by @mvaligursky in #8937
- Remove highQualitySH option, always use high-quality per-splat SH by @mvaligursky in #8938
- Scalable per-splat culling for hybrid gsplat shadows by @mvaligursky in #8939
- Remove compute-renderer leftovers by @mvaligursky in #8940
- Auto-select GPU sort on WebGPU and promote it to stable by @mvaligursky in #8941
- Procedural sky ESM script with day/night cycle and dynamic IBL by @mvaligursky in #8943
- Backend-aware WebXR support detection (isDeviceSupported) by @mvaligursky in #8948
- Remove fragile WebGL mipmap-based radix sort by @mvaligursky in #8949
- Support Draco mesh decoding in Node via worker_threads by @mvaligursky in #8951
- Make app.assets available immediately after AppBase construction by @mvaligursky in #8952
Fixes
- Sort worker ReferenceError after esbuild migration by @mvaligursky in #8808
- Null particle module-scope vars after construction to prevent memory leak by @Skullheadx in #8809
- Fix @param names/types that contradict the function signatures by @willeastcott in #8813
- Expose mesh-level shader defines to the fragment shader by @mvaligursky in #8817
- Update HTML-in-Canvas texture upload to new copyElementImageToTexture/texElementImage2D API by @mvaligursky in #8828
- Apply gsplat material changes made in frame:ready the same frame by @mvaligursky in #8830
- Fix ESM script registration by name and subclass name collision by @mvaligursky in #8831
- Ensure DoF effect is resolution independent (#8833) by @MAG-AdrianMeredith in #8834
- Use a Map for the script registry and guard reserved names in add() by @mvaligursky in #8835
- Preserve live bindings of mutable UMD exports (pc.app) by @mvaligursky in #8837
- Keep UMD exports overridable while preserving live bindings by @mvaligursky in #8839
- Tile gsplat interval-scatter dispatch over workgroup limit by @mvaligursky in #8841
- Register nameless scripts under their verbatim class name by @mvaligursky in #8844
- Remove inline {@link} from camera-frame LUT attribute description by @mvaligursky in #8849
- Fix XrNavigation NaN rig corruption on gamepads without thumbstick axes by @mvaligursky in #8850
- Select scene depth decode via CAPS_TEXTURE_FLOAT_RENDERABLE by @mvaligursky in #8856
- Temporarily disable WebGPU on Imagination PowerVR GPUs (Pixel 10) by @mvaligursky in #8875
- Fix XR over-culling: correct combined frustum and per-eye gsplat visibility by @mvaligursky in #8889
- Reset active WebGL texture unit on device init for reused contexts by @willeastcott in #8894
- Clear cached collisions when a collision component is removed by @willeastcott in #8898
- Report particles isPlaying() in sync with particle lifetime by @willeastcott in #8901
- Fix overestimated WebGPU GPU frame timing in profiler by @mvaligursky in #8903
- Rebuild bind group when its dynamic uniform buffer is re-allocated mid-frame by @mvaligursky in #8906
- Align WebGPU backbuffer format with WebXR projection-layer format by @mvaligursky in #8914
- Keep physics interpolation in sync on teleport for high refresh rates by @willeastcott in #8915
- Don't render previous locale's text with the new font (#3043) by @willeastcott in #8927
- Use mesh UVs when texturing mesh particles (#7858) by @mvaligursky in #8931
- Cull screen-space text by content bounds by @willeastcott in #8934
- Render MSDF text at the true glyph edge by @willeastcott in #8935
- Correct and clarify ElementComponent JSDoc and types by @willeastcott in #8936
- Don't apply hardware depth bias to PCSS shadows by @mvaligursky in #8942
- Upload CPU vertex buffer on rebuild/reset so paused emitters don't render garbage by @willeastcott in #8945
- Support non-interleaved meshes as particle meshes by @willeastcott in #8946
- Support cloning anim components with dynamically-added layers by @willeastcott in #8947
- Fix camera.screenToWorld returning NaN when called in initialize by @mvaligursky in #8950
Examples
- Share dialog with state-encoded URLs by @kpal81xd in #8796
- Author controls as JSX components by @kpal81xd in #8819
- Download example as a standalone Vite project by @kpal81xd in #8825
- Resolve code editor autocomplete, go-to-definition and peek by @kpal81xd in #8826
- Support category: and example: tags in sidebar filter by @kpal81xd in #8829
- Add a GSplat streaming test example, PREFERRED_DEVICE flag, and numSplats accessor by @mvaligursky in #8847
- Add Gaussian Splatting Depth of Field example by @mvaligursky in #8853
- Tune the Depth of Field example (splat budget + WebGPU) by @mvaligursky in #8854
- Add SpAItial AI attribution to the Depth of Field example by @mvaligursky in #8855
- Remove alphabetical import-order requirement from examples lint by @mvaligursky in #8862
- Improve vr-lod XR example and fix XR menu/navigation on hand-tracking devices by @mvaligursky in #8864
- Add Gaussian Splat downtown streaming example by @mvaligursky in #8866
- Serve gsplat example data over the CDN by @mvaligursky in #8867
- Add gsplat shader rings example using the gsplatModifyPS hook by @mvaligursky in #8877
- Add noise-based dissolve shader effect for gaussian splats by @mvaligursky in #8890
- Restore MiniStats panel after hot reload by @willeastcot...
v2.19.7
Fixes
- Temporarily disable WebGPU on Imagination PowerVR GPUs (Pixel 10) by @mvaligursky in #8875
- Remove inline {@link} from camera-frame LUT attribute description by @mvaligursky in #8849
- Fix XrNavigation NaN rig corruption on gamepads without thumbstick axes by @mvaligursky in #8850
- Select scene depth decode via CAPS_TEXTURE_FLOAT_RENDERABLE by @mvaligursky in #8856
- Ensure DOF effect is resolution independent by @MAG-AdrianMeredith in #8834
Contributors
@MAG-AdrianMeredith
@mvaligursky
Full Changelog: v2.19.6...v2.19.7
v2.19.6
Changes
- Add a GSplat streaming test example, PREFERRED_DEVICE flag, and numSplats accessor by @mvaligursky in #8847
Contributors
Full Changelog: v2.19.5...v2.19.6
v2.19.5
Fixes
- Tile gsplat interval-scatter dispatch over workgroup limit by @mvaligursky in #8841
- Register nameless scripts under their verbatim class name by @mvaligursky in #8844
Contributors
Full Changelog: v2.19.4...v2.19.5
v2.19.4
Fixes
- Keep UMD exports overridable while preserving live bindings by @mvaligursky in #8839
Contributors
Full Changelog: v2.19.3...v2.19.4
v2.19.3
Fixes
- Fix ESM script registration by name and subclass name collision by @mvaligursky in #8831
- Use a Map for the script registry and guard reserved names in add() by @mvaligursky in #8835
- Preserve live bindings of mutable UMD exports (pc.app) by @mvaligursky in #8837
Contributors
Full Changelog: v2.19.2...v2.19.3
v2.19.2
Fixes
- Support HTML-in-Canvas textures via copyElementImageToTexture (WebGPU) by @mvaligursky in #8810
- Replace opaque any/* types with real types in public API reference by @willeastcott in #8811
- Elevate the Entity class reference to peak quality by @willeastcott in #8814
- Null particle module-scope vars after construction to prevent memory leak by @Skullheadx in #8809
- Update HTML-in-Canvas texture upload to new API by @mvaligursky in #8828
- Fix @param names/types that contradict the function signatures by @willeastcott in #8813
- Apply gsplat material changes made in frame:ready the same frame by @mvaligursky in #8830
Examples
Contributors
New Contributors
- @Skullheadx made their first contribution in #8809
Full Changelog: v2.19.1...v2.19.2
v2.19.1
Fixes
- Sort worker ReferenceError after esbuild migration by @mvaligursky in #8808
- Support GSPLAT_AA in the hybrid renderer by @mvaligursky in #8807
- Drop "unified" framing now that it's the default by @mvaligursky in #8805
Contributors
Full Changelog: v2.19.0...v2.19.1
v2.19.0
Breaking changes
- [BREAKING] Remove HTMLAudioElement fallback from sound system by @willeastcott in #8636
- [BREAKING] Deprecate GSplatComponent#unified and default it to true by @mvaligursky in #8802
Changes
- JSDoc whitespace cleanup by @willeastcott in #8616
- Standardize JSDoc class overviews across components by @willeastcott in #8617
- Unlink SHADER_ constants in Material.update by @willeastcott in #8621
- Unlink renderPasses note in CameraComponent by @willeastcott in #8622
- GSplat local rasterize early-out via precomputed power cutoff by @mvaligursky in #8623
- Simplify self-referential JSDoc @link tags by @willeastcott in #8624
- Remove redundant JSDoc @type tags from inferable fields by @willeastcott in #8625
- Clean up 'Other' category on API reference index by @willeastcott in #8627
- Read SOG gsplat data directly from source textures by @mvaligursky in #8628
- Calculate camera aspect ratio in CameraComponent onEnable by @lucaheft in #8632
- Document both halves of accessor pairs in public API by @willeastcott in #8634
- Hoist constructor-assigned properties to class fields in src/core and src/platform/input by @willeastcott in #8635
- Make camera aspect ratio auto-refresh in Camera class by @mvaligursky in #8633
- Fold gsplat debug AABB flags into debug enum by @mvaligursky in #8637
- Drop vendor-prefixed Page Visibility API support by @willeastcott in #8638
- Include GPU vendor/architecture in WebGPU feature log by @mvaligursky in #8642
- Inline AppBase tick as a class-field arrow by @willeastcott in #8639
- Move per-frame stats collection from AppBase to ApplicationStats by @willeastcott in #8643
- Remove dead
this.controllerreferences from AppBase and hide Controller class by @willeastcott in #8644 - Expose device.minSubgroupSize and device.maxSubgroupSize on GraphicsDevice by @mvaligursky in #8645
- Add WebGPU compute radix sort (4-bit portable + OneSweep NVIDIA) by @mvaligursky in #8620
- Add WGSL linear_indexing and CAPS_STORAGE_TEXTURE_READ by @mvaligursky in #8648
- Radix sort facade, indirect mode, and WebGPU subgroup sizing by @mvaligursky in #8647
- Standardize Layer on class fields with grouped ordering by @willeastcott in #8649
- Defer WebGPU buffer destruction until submit by @slimbuck in #8652
- Use texImage2D for gsplat splat-order uploads by @slimbuck in #8656
- Hybrid raster renderer with compute projector by @mvaligursky in #8658
- Clarify spotlight cone angles are half-angles by @willeastcott in #8665
- Align LightComponent with CameraComponent architecture by @willeastcott in #8666
- Tighten LightComponent JSDoc by @willeastcott in #8667
- Migrate ComponentData classes to class fields by @willeastcott in #8668
- Remove redundant constructor assignments in ButtonComponent by @willeastcott in #8669
- Remove redundant get data() overrides by @willeastcott in #8670
- Migrate ZoneComponent and ScreenComponent to class fields by @willeastcott in #8671
- Migrate SpriteComponent state to class fields by @willeastcott in #8672
- Remove unused _batchGroup field from batched components by @willeastcott in #8673
- Clean up vestigial Model plumbing on SpriteComponent by @willeastcott in #8674
- Remove unused JSDoc @import lines by @willeastcott in #8677
- SpriteAnimationClip class fields, layer typings, and docs by @willeastcott in #8679
- SpriteAnimationClip name, fps, loop property JSDoc by @willeastcott in #8680
- Remove unused WebGPU compute perf benchmark by @mvaligursky in #8681
- Speed up GSplat octree evaluateNodeLods by @mvaligursky in #8683
- Fuse GSplat budget bucket indices into LOD evaluation by @mvaligursky in #8684
- Remove raster GPU sort path and sort-key compute by @mvaligursky in #8685
- Rename GSPLAT_RENDERER_RASTER_HYBRID to RASTER_GPU_SORT by @mvaligursky in #8686
- Respect gsplat alphaCull on CPU raster and compute paths by @mvaligursky in #8687
- Remove unused gsplat-material module by @mvaligursky in #8688
- Exclude StorageBuffer from device.buffers tracking by @slimbuck in #8690
- Add Scene#gsplatCentersEnabled opt-out for gsplat CPU centers by @mvaligursky in #8691
- Align ScrollbarComponent with CameraComponent architecture by @willeastcott in #8693
- Tighten ScrollbarComponent internals by @willeastcott in #8694
- Handle lostpointercapture as well by @slimbuck in #8696
- Expose parsed manifest on GSplatOctreeResource by @MattiasVik in #8699
- TRACEID_BUFFERS trace, example control, and storage buffer debug names by @mvaligursky in #8705
- Reduce radix sort GPU buffer footprint by @mvaligursky in #8706
- Add XrBridge for backend-specific WebXR presentation by @mvaligursky in #8712
- Route XR framebuffer through XrBridge; refresh VR LOD example by @mvaligursky in #8713
- WebGPU immersive XR presentation by @mvaligursky in #8717
- WebGPU XR device loss, devicelost events, and graphics binding typings by @mvaligursky in #8719
- WebGPU AR camera color and syncCameraColorTexture bridge by @mvaligursky in #8720
- Parallelize engine builds with turbo by @kpal81xd in #8716
- WebGPU XR depth bridge, examples, and XR camera sync fixes by @mvaligursky in #8721
- WebGPU multiview frame pass, XR bridge, and clustered lights by @mvaligursky in #8723
- WebGPU texture-array projection and vr-basic gallery refresh by @mvaligursky in #8724
- Migrate js builds to esbuild by @kpal81xd in #8722
- WebGPU fragment shader optimization by @cabanier in #8733
- Data-driven gating for WGSL built-in inputs by @mvaligursky in #8739
- Align WGSL and GLSL clustered-light chunks by @mvaligursky in #8740
- Support for exporting aoMaps and the second UV channels by @tanaydimri in #8728
- Omit default texCoord in glTF exporter texture info by @mvaligursky in #8741
- Enable asset load retries by default by @mvaligursky in #8744
- Tidy ResourceLoader.enableRetry defaults and input handling by @mvaligursky in #8745
- Dual Color LUT crossfade and lut-grading example by @mvaligursky in #8749
- Warn when WebGPU or WebXR is used in an insecure context by @mvaligursky in #8752
- Log uncaptured WebGPU errors by @mvaligursky in #8757
- Mark platform.visionos as @ignore in JSDoc by @mvaligursky in #8765
- XrMenu label items, ray picking, always-visible HUD mode by @mvaligursky in #8770
- Add smooth turn mode to XrNavigation by @mvaligursky in #8771
- Update examples URL in READMEs to playcanvas.com/examples by @willeastcott in #8772
- Reuse clear options object in Renderer.clear by @willeastcott in #8776
- Replace pow(x, 5.0) with multiplies in Schlick Fresnel by @willeastcott in #8774
- Avoid iterator allocations in Frustum.setFromMat4 by @willeastcott in #8775
- Avoid per-frame clearVariants in unified material sync by @mvaligursky in #8778
- Align ScrollViewComponent with CameraComponent architecture by @willeastcott in #8777
- Add alphaDither property for independent dither strength by @mvaligursky in #8782
- Expose WGSL unrestricted_pointer_parameters as a device cap by @mvaligursky in #8785
- Expose WGSL pointer_composite_access as a device cap by @mvaligursky in #8786
- Expose WGSL packed_4x8_integer_dot_product as a device cap by @mvaligursky in #8787
- Expose WGSL texture_and_sampler_let as a device cap by @mvaligursky in #8790
- Make getGuid() part of the public API by @mvaligursky in #8795
- OneSweep on NVIDIA, indirect bind fix, GSplat bit alignment by @mvaligursky in #8657
- Expose guid as a public getter by @mvaligursky in #8797
- WebGPU XR rendering on Apple Vision Pro by @mvaligursky in #8756
- Release ImageBitmap memory after streamed SOG texture upload by @mvaligursky in #8758
Fixes
- Fix incorrect JSDoc in public APIs by @willeastcott in #8612
- Fix more incorrect JSDoc in public APIs by @willeastcott in #8613
- Fix more incorrect JSDoc in public APIs by @willeastcott in #8614
- Fix more incorrect JSDoc in public APIs by @willeastcott in #8615
- Fix JSDoc link warnings for ShaderUtils and GSplatComponent by @willeastcott in #8618
- Fix url param JSDoc in ResourceHandler and ContainerHandler by @willeastcott in #8619
- Avoid camera_params redefinition in pickPS by @gameatp in #8640
- Avoid camera_params redefinition in pickPS (WGSL) by @mvaligursky in #8641
- Split batches by castShadow and shadowCascadeMask by @mvaligursky in #8650
- Fix Picker depth clear decoding by @slimbuck in #8651
- Defer GPU resource destruction for pending commands by @mvaligursky in #8655
- Fix executeCallback JSDoc type in gsplat-resolve-sh by @willeastcott in #8682
- Register StorageBuffer for WebGPU device lose/restore by @mvaligursky in #8692
- Texture#lock allocates when mip level slot is missing by @mvaligursky in #8695
- Default xrCompatible for WebGL and WebGPU paths by @mvaligursky in #8714
- TAA resolve premultiplied alpha for transparent clears by @mvaligursky in #8726
- visionOS MSAA resolve into XR framebuffer by @mvaligursky in #8730
- Avoid GLSL ES reserved word 'packed' in compact format shader by @mvaligursky in #8737
- Apply specular factor/color when map is present by @mvaligursky in #8742
- Include error message context in load failure logs by @mvaligursky in #8743
- Align projector projection with WebGPU shader uniforms by @mvaligursky in #8662
- Stereo XR viewport width for hybrid projector by @mvaligursky in #8664
- Fix renderSceneColorMap/renderSceneDepthMap toggling to false when already set by @MAG-AdrianMeredith in #8731
- Apply Color LUT in correct sRGB color space by @mvaligursky in #8747
- Resolve sog texture urls from document base by @kpal81xd in #8754
- Gate ImageBitmap release on opt-in flag, make it one-shot by @mvaligursky in #8760
- Fix WebGPU XR stereo viewport and harden vr-lod example by @mvaligursky in #8761
- Ensure opacity dither fully hides at alpha 0 and fully shows at alpha 1 by @lucaheft in #8767
- Make writeSortIndirectArgs WGSL helper portable for Firefox WebGPU by @mvaligursky in #8784
- Fire EVENT_PRECULL after f...
v2.18.1
Fixes
- Split batches by
castShadowandshadowCascadeMaskby @mvaligursky in #8650 - Use unsigned 32-bit depth bits when reconstructing pick depth from RGBA8 by @slimbuck in #8651
- Defer WebGPU buffer destruction until after pending command buffers are submitted by @slimbuck in #8652
Contributors
Full Changelog: v2.18.0...v2.18.1