|
1 | 1 | { |
2 | | - "fromTag": "9.9.2", |
| 2 | + "fromTag": "9.10.0", |
3 | 3 | "changelog": { |
4 | 4 | "9.10.0": [ |
5 | 5 | { |
|
22 | 22 | ] |
23 | 23 | } |
24 | 24 | ], |
| 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 | + ], |
25 | 137 | "9.9.2": [ |
26 | 138 | { |
27 | 139 | "pr": "18505", |
|
0 commit comments