Skip to content

Commit 5fb19b8

Browse files
author
Babylon.js Platform
committed
Version update 9.10.1
1 parent 198ba9a commit 5fb19b8

50 files changed

Lines changed: 358 additions & 210 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.build/changelog.json

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"fromTag": "9.9.2",
2+
"fromTag": "9.10.0",
33
"changelog": {
44
"9.10.0": [
55
{
@@ -22,6 +22,118 @@
2222
]
2323
}
2424
],
25+
"9.10.1": [
26+
{
27+
"pr": "18519",
28+
"title": "Updating worker name for webpack",
29+
"description": "The rename of the worker in PR #18446 means that default webpack/rspack do not find the worker anymore and they do not emit the right chunks. This reverts that change but still keeps the fixes for vite.",
30+
"author": {
31+
"name": "VicenteCartas",
32+
"url": "https://github.com/VicenteCartas"
33+
},
34+
"files": [
35+
"packages/dev/lottiePlayer/src/player.ts"
36+
],
37+
"tags": [
38+
"bug"
39+
]
40+
},
41+
{
42+
"pr": "18516",
43+
"title": "Make smartAssetManager tree-shakeable",
44+
"description": "> 🤖 *This PR was created by the create-pr skill.*\r\n\r\nRenames `smartAssetManager.ts` → `smartAssetManager.pure.ts` and eliminates all module-level side effects so the module is structurally side-effect-free and can be safely re-exported from `SmartAssets/pure.ts`.\r\n\r\n### Changes\r\n- Switch `Texture` / `CubeTexture` / `HDRCubeTexture` value imports to their `.pure` counterparts so the pure barrel's transitive closure stays pure.\r\n- Replace `Symbol.for(\"babylonjs:smartAssetManager\")` with a plain namespaced string. Same cross-bundle identity as `Symbol.for`, but zero runtime allocation. (Plain `Symbol()` would have been worse — it allocates AND each bundle would get its own key, causing dual-bundle scenes to silently get two managers.)\r\n- Lazy-init the module-level `WeakMap` and `Observable` behind accessor functions (`GetInternalsMap` / `GetOnCreatedObservable`) so nothing allocates on import.\r\n- Fold the `TextureExtensions` `Set` into the existing public `GetSmartAssetTextureExtensions()` accessor, also lazy-initialised.\r\n\r\n### Why this matters\r\nBefore: importing anything from `core/SmartAssets/pure` transitively dragged in `Texture` / `CubeTexture` / `HDRCubeTexture` side-effect modules and executed a `Symbol.for` + two constructors on import, defeating the purpose of the pure barrel.\r\n\r\nAfter: the module has zero top-level execution and only pure imports. Bundlers can drop it entirely when unused.\r\n\r\nThe `.pure.ts` rename also makes ESLint enforce purity going forward via `babylonjs/require-pure-annotation` and `babylonjs/no-side-effect-imports-in-pure`, so future edits can't accidentally regress.\r\n\r\n### Validation\r\n- `npx eslint packages/dev/core/src/SmartAssets/` → clean\r\n- `npx vitest run packages/dev/core/test/unit/SmartAssets/` → 34/34 pass\r\n- `npx prettier --check` → clean\r\n",
45+
"author": {
46+
"name": "georginahalpern",
47+
"url": "https://github.com/georginahalpern"
48+
},
49+
"files": [
50+
"packages/dev/core/src/SmartAssets/index.ts",
51+
"packages/dev/core/src/SmartAssets/pure.ts",
52+
"packages/dev/core/src/SmartAssets/smartAssetManager.pure.ts",
53+
"packages/dev/core/test/unit/SmartAssets/smartAssetManager.test.ts",
54+
"packages/dev/inspector-v2/src/projects/overrideManager.ts",
55+
"packages/dev/inspector-v2/src/projects/projectFile.ts",
56+
"packages/dev/inspector-v2/src/services/overrideCaptureService.tsx",
57+
"packages/dev/inspector-v2/src/services/panes/babylonProjectAuthoringService.tsx",
58+
"packages/dev/inspector-v2/src/services/smartAssetHandler.tsx",
59+
"packages/dev/inspector-v2/src/services/smartAssetPromptService.tsx",
60+
"packages/dev/inspector-v2/test/app/index.tsx",
61+
"packages/dev/inspector-v2/test/unit/overrideManager.test.ts",
62+
"packages/dev/inspector-v2/test/unit/projectFile.test.ts"
63+
],
64+
"tags": [
65+
"enhancement"
66+
]
67+
},
68+
{
69+
"pr": "18463",
70+
"title": "Add DOM-free font offset fallback",
71+
"description": "## What\n- Falls back from DOM layout font metrics to canvas text metrics when DOM layout is unavailable or returns zero-sized bounds.\n- Uses a CSS pixel-size estimate as the final fallback.\n- Adds focused unit coverage for the zero-layout path.\n\n## Why\nNative runtimes need GUI resize-to-fit code to work without carrying validation-only font metric shims.\n\n## Validation\n- `npx vitest run --project=unit packages/dev/core/test/unit/Engines/engine.common.test.ts`",
72+
"author": {
73+
"name": "matthargett",
74+
"url": "https://github.com/matthargett"
75+
},
76+
"files": [
77+
"packages/dev/core/src/Engines/engine.common.ts",
78+
"packages/dev/core/test/unit/Engines/engine.common.test.ts"
79+
],
80+
"tags": []
81+
},
82+
{
83+
"pr": "18509",
84+
"title": "feat(GridMaterial): Multi-scale LOD, horizon fade, depth compositing, and above/below color",
85+
"description": "This PR extends `GridMaterial` with a suite of opt-in features that make it viable as a production-quality reference grid for 3D viewers and large-scale scenes, all fully backward compatible with zero changes to existing behavior.\r\n\r\nThese changes unlock a high-quality, Blender-style infinite ground grid directly inside the existing `GridMaterial` API — no new class, no breaking changes. Applications like Gaussian splat viewers, 3D asset inspectors, and geospatial tools can now drop in a reference grid that looks right from any angle, at any scale, composited correctly against transparent geometry.\r\n\r\n### New features\r\n\r\n**Multi-scale logarithmic LOD** (`useMultiScale`, `minGridSpacing`, `gridOctaves`)\r\nRenders up to 8 octaves of grid lines simultaneously, each a power-of-10 scale apart. As the camera zooms or orbits, fine lines gracefully fade while coarser lines emerge — giving users an always-legible sense of scale across any distance, from millimeters to kilometers.\r\n\r\n**Horizon fade** (`useHorizonFade`)\r\nGrid lines fade at grazing angles, eliminating the visual noise of near-horizontal grid geometry. Pairs naturally with multi-scale for a clean, polished ground plane in any viewport.\r\n\r\n**Above/below camera line color** (`belowLineColor`)\r\nWhen the camera dips below a grid surface (e.g. a ground plane viewed from underneath), lines switch to a separate color. Removes disorientation in scenes where the camera can pass through the grid.\r\n\r\n**Lines-only transparent mode with depth compositing** (`linesOnly`)\r\nNon-grid pixels are discarded, making the grid float transparently over any scene. Automatically enables a depth pre-pass so grid lines correctly occlude translucent objects like Gaussian splats: no z-fighting, no ghosting through the grid.\r\n\r\n**Grid thickness modifier** (`gridThicknessModifier`)\r\nSimple multiplier on line width for stylistic control without touching grid ratio or spacing.\r\n\r\n**World-origin crosshair** (`useOriginMarker`)\r\nAn ultra-fine crosshair anchored to the world origin, visible at any camera distance — useful for georeferenced scenes and CAD-style viewers.\r\n\r\n### Bug fix: `opacity` no longer silently discards fill pixels\r\n\r\nPreviously, the internal `TRANSPARENT` shader define was automatically activated whenever `opacity < 1.0`. This caused per-pixel alpha to be driven by grid strength rather than the opacity value — meaning `opacity = 0.5` would quietly discard all solid fill between lines instead of producing a semi-transparent grid.\r\n\r\nThe fix decouples the two behaviors: `opacity` now uniformly scales the whole mesh alpha (fill and lines together), while the new explicit `linesOnly` flag is the opt-in for discarding non-grid pixels.\r\n\r\n### Visualization tests\r\n\r\n1. Added the missing test for existing grid material\r\n2. Added a test for multi-scale grid material, with a semi-transparent sphere that is partly below ground, and an opaque cube that is partly below the ground.\r\n\r\n### Example effect (together with a ground mesh with IBL shadows)\r\n<img width=\"1728\" height=\"997\" alt=\"grid\" src=\"https://github.com/user-attachments/assets/702acc9c-34be-4d0a-a5e7-63de16f0f2cc\" />\r\n",
86+
"author": {
87+
"name": "raymondyfei",
88+
"url": "https://github.com/raymondyfei"
89+
},
90+
"files": [
91+
"packages/dev/materials/src/grid/grid.fragment.fx",
92+
"packages/dev/materials/src/grid/grid.vertex.fx",
93+
"packages/dev/materials/src/grid/gridMaterial.ts",
94+
"packages/dev/materials/src/grid/wgsl/grid.fragment.fx",
95+
"packages/dev/materials/src/grid/wgsl/grid.vertex.fx",
96+
"packages/tools/tests/test/visualization/ReferenceImages/grid-material.png",
97+
"packages/tools/tests/test/visualization/ReferenceImages/multi-scale-grid-material.png",
98+
"packages/tools/tests/test/visualization/config.json"
99+
],
100+
"tags": [
101+
"enhancement",
102+
"materials"
103+
]
104+
},
105+
{
106+
"pr": "18514",
107+
"title": "Fix: DSM detects modern Xbox controllers on Linux as Generic",
108+
"description": "Forum thread: https://forum.babylonjs.com/t/xbox-gamepad-not-working-with-the-device-source-manager-on-linux/63536\r\n\r\n### Root cause\r\n\r\n`WebDeviceInputSystem._getGamepadDeviceType` only matched the substrings `\"Xbox One\"`, `\"Xbox 360\"`, or `\"xinput\"`. On Linux (xpadneo) Chromium reports newer Xbox controllers with id strings like `\"Xbox Wireless Controller (STANDARD GAMEPAD Vendor: 045e Product: 0b13)\"` and `\"Microsoft Controller (... Vendor: 045e Product: 02ea)\"`, none of which contain those substrings. The result: every Xbox Series / Xbox One / Xbox Elite controller falls through to `DeviceType.Generic` on Linux.\r\n\r\nThe legacy `GamepadManager._addNewGamepad` already handles this by additionally matching the Microsoft USB vendor id `\"045e\"` (excluding the Surface Dock Extender). DSM was simply missing the same check.\r\n\r\n### Fix\r\n\r\nAdd the `\"045e\"` (Microsoft vendor) check to DSM's Xbox detection, mirroring the long-standing logic in `GamepadManager`. Strict superset of previous detection — no existing path regresses.\r\n\r\n### Verification\r\n\r\nReporter ran a diagnostic playground and provided real `gamepad.id` strings from six Xbox-family controllers on Arch Linux + Chromium:\r\n\r\n| Controller | id substring | Caught by `\"045e\"` check? |\r\n|---|---|---|\r\n| Xbox Series Wireless | `Xbox Wireless Controller … Vendor: 045e Product: 0b13` | ✅ |\r\n| Xbox One Wired | `Microsoft Controller … Vendor: 045e Product: 02ea` | ✅ |\r\n| Xbox Elite V2 Wired | `Microsoft Controller … Vendor: 045e Product: 0b00` | ✅ |\r\n| Xbox Elite V2 Wireless | `Xbox Elite Wireless Controller … Vendor: 045e Product: 028e` | ✅ |\r\n| 8BitDo SN30pro | `Microsoft X-Box 360 pad … Vendor: 045e Product: 028e` | ✅ |\r\n| Steam Controller 2 | `Microsoft X-Box 360 pad 1 … Vendor: 28de Product: 11ff` | ❌ (Valve vendor — out of scope) |\r\n\r\n### Test coverage\r\n\r\nNo existing unit tests cover `_getGamepadDeviceType` (private, string-based). Verified by inspection of the matched id strings against the new predicate.\r\n",
109+
"author": {
110+
"name": "AmoebaChant",
111+
"url": "https://github.com/AmoebaChant"
112+
},
113+
"files": [
114+
"packages/dev/core/src/DeviceInput/webDeviceInputSystem.ts"
115+
],
116+
"tags": []
117+
},
118+
{
119+
"pr": "18515",
120+
"title": "feat(Gsplat): Add auto-tracking to GaussianSplattingDebugger for compound mesh mutations",
121+
"description": "Previously, if the downstream applications attached a `GaussianSplattingDebugger` to a compound mesh and then added or removed a part at runtime, the debug plugin's per-part override arrays would silently go out of sync with the mesh's actual part layout. Callers had to manually update `plugin.partCount` and re-index any per-part options they had set, which is error-prone and inconvenient.\r\n\r\nIn this PR, we make the debugger self-maintaining. A user can now call `removePart` on a compound mesh with per-part debug overrides enabled, and those overrides automatically remain aligned with the surviving parts. No manual bookkeeping required.\r\n\r\n- **`GaussianSplattingMeshBase`** now gains two observables: `onPartCountChangedObservable` (fires after parts are added or the mesh is rebuilt) and `onPartRemovedObservable` (fires before removal, carrying the original part index).\r\n- **`GaussianSplattingDebugger`** subscribes to both when a mesh is registered. On part removal, it calls `shiftPartOptions` to slide the per-part arrays into alignment; on count change it updates `partCount` on the plugin. Observers are cleaned up symmetrically in `removeMesh` and `dispose`.",
122+
"author": {
123+
"name": "raymondyfei",
124+
"url": "https://github.com/raymondyfei"
125+
},
126+
"files": [
127+
"packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.ts",
128+
"packages/dev/core/src/Meshes/GaussianSplatting/gaussianSplattingDebugger.pure.ts",
129+
"packages/dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.ts",
130+
"packages/dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.ts",
131+
"packages/tools/tests/test/visualization/ReferenceImages/gsplat-debug-part-auto-tracking-test.png",
132+
"packages/tools/tests/test/visualization/config.json"
133+
],
134+
"tags": []
135+
}
136+
],
25137
"9.9.2": [
26138
{
27139
"pr": "18505",

.build/release-notes.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
11

22
### Core
33

4-
- PBR: Fix refraction intensity applied to irradiance - [_Bug Fix_] by [Popov72](https://github.com/Popov72) ([#18513](https://github.com/BabylonJS/Babylon.js/pull/18513))
4+
- Make smartAssetManager tree-shakeable - by [georginahalpern](https://github.com/georginahalpern) ([#18516](https://github.com/BabylonJS/Babylon.js/pull/18516))
5+
- Add DOM-free font offset fallback - by [matthargett](https://github.com/matthargett) ([#18463](https://github.com/BabylonJS/Babylon.js/pull/18463))
6+
- Fix: DSM detects modern Xbox controllers on Linux as Generic - by [AmoebaChant](https://github.com/AmoebaChant) ([#18514](https://github.com/BabylonJS/Babylon.js/pull/18514))
7+
- feat(Gsplat): Add auto-tracking to GaussianSplattingDebugger for compound mesh mutations - by [raymondyfei](https://github.com/raymondyfei) ([#18515](https://github.com/BabylonJS/Babylon.js/pull/18515))
8+
9+
### Inspector
10+
11+
- Make smartAssetManager tree-shakeable - by [georginahalpern](https://github.com/georginahalpern) ([#18516](https://github.com/BabylonJS/Babylon.js/pull/18516))
12+
13+
### Lottie Player
14+
15+
- Updating worker name for webpack - [_Bug Fix_] by [VicenteCartas](https://github.com/VicenteCartas) ([#18519](https://github.com/BabylonJS/Babylon.js/pull/18519))
16+
17+
### Materials
18+
19+
- feat(GridMaterial): Multi-scale LOD, horizon fade, depth compositing, and above/below color - by [raymondyfei](https://github.com/raymondyfei) ([#18509](https://github.com/BabylonJS/Babylon.js/pull/18509))

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
# Changelog
22

3+
## 9.10.1
4+
5+
### Core
6+
7+
- Make smartAssetManager tree-shakeable - by [georginahalpern](https://github.com/georginahalpern) ([#18516](https://github.com/BabylonJS/Babylon.js/pull/18516))
8+
- Add DOM-free font offset fallback - by [matthargett](https://github.com/matthargett) ([#18463](https://github.com/BabylonJS/Babylon.js/pull/18463))
9+
- Fix: DSM detects modern Xbox controllers on Linux as Generic - by [AmoebaChant](https://github.com/AmoebaChant) ([#18514](https://github.com/BabylonJS/Babylon.js/pull/18514))
10+
- feat(Gsplat): Add auto-tracking to GaussianSplattingDebugger for compound mesh mutations - by [raymondyfei](https://github.com/raymondyfei) ([#18515](https://github.com/BabylonJS/Babylon.js/pull/18515))
11+
12+
### Inspector
13+
14+
- Make smartAssetManager tree-shakeable - by [georginahalpern](https://github.com/georginahalpern) ([#18516](https://github.com/BabylonJS/Babylon.js/pull/18516))
15+
16+
### Lottie Player
17+
18+
- Updating worker name for webpack - [_Bug Fix_] by [VicenteCartas](https://github.com/VicenteCartas) ([#18519](https://github.com/BabylonJS/Babylon.js/pull/18519))
19+
20+
### Materials
21+
22+
- feat(GridMaterial): Multi-scale LOD, horizon fade, depth compositing, and above/below color - by [raymondyfei](https://github.com/raymondyfei) ([#18509](https://github.com/BabylonJS/Babylon.js/pull/18509))
23+
324
## 9.10.0
425

526
### Core

0 commit comments

Comments
 (0)