Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
cb73e5d
Minor version trigger
Jun 11, 2026
fd6fd84
Version update 9.12.0
Jun 11, 2026
3eed5d7
Move scissor to core as an opt-in engine extension (#18547)
AmoebaChant Jun 11, 2026
5eab981
Add TypeScript FBX loader (#18483)
PatrickRyanMS Jun 11, 2026
386e2c7
ci: raise native visualization tests timeout to 35 minutes (#18574)
bkaradzic-microsoft Jun 12, 2026
4f5a669
Fix: strip type-only re-exports from generated namespace declarations…
ryantrem Jun 12, 2026
0a9e270
Port framerate-independent camera movement and configurable input to …
georginahalpern Jun 12, 2026
788eb47
Fix(GreasedLine): guard grl_offsets behind GREASED_LINE_USE_OFFSETS i…
bkaradzic-microsoft Jun 12, 2026
4757341
Fix USDZ export for cached unsupported texture formats (#18559)
alexchuber Jun 12, 2026
7399905
Visualization: in-memory round-trip for Serialize-without-materials t…
bkaradzic-microsoft Jun 13, 2026
e1847f7
fix(core): restore Buffers/buffer.align side effect for Native engine…
CedricGuillemet Jun 15, 2026
efdee76
GS Streaming (#18563)
CedricGuillemet Jun 15, 2026
bb4a95c
Coalesce shared delay-loaded geometry/mesh file requests (#18570)
georginahalpern Jun 15, 2026
d60a954
Fix FreeCamera/FlyCamera input regression: apply active input below t…
georginahalpern Jun 15, 2026
21e6dc9
Fix camera frozen in UMD build (inertia undefined): use local field i…
georginahalpern Jun 15, 2026
54e3b02
chore(deps-dev): bump esbuild from 0.25.12 to 0.28.1 (#18577)
dependabot[bot] Jun 15, 2026
bdb0ee2
Fix GeospatialCamera zoom-while-rotating and updateFlyToDestination (…
georginahalpern Jun 15, 2026
6351ecb
chore(deps-dev): bump vite from 6.4.2 to 6.4.3 (#18583)
ryantrem Jun 15, 2026
4ada000
Add NullEngine multiview render-state testability (#18576)
matthargett Jun 16, 2026
5f17b1e
Patch trigger
Jun 16, 2026
2c1a967
Version update 9.12.1
Jun 16, 2026
d7c7bea
GS streaming/lod part2 (#18585)
CedricGuillemet Jun 16, 2026
a736e85
[Native] Honor depthCullingState.depthTest on the native engine (#18558)
bkaradzic-microsoft Jun 16, 2026
77b1484
Add GPU picker depth point and normal support (#18572)
Celeste-twinkle Jun 17, 2026
9b38142
Auto-populate is2DArray/depth in wrapNativeTexture from native layer …
bghgary Jun 17, 2026
aa48d79
Rework SceneLoader and add unit tests (#18590)
ryantrem Jun 18, 2026
6fac3e7
Minor version trigger
Jun 18, 2026
4d4dad2
Version update 9.13.0
Jun 18, 2026
5adc34d
[Native] Add cube render target support to the native engine (#18561)
bkaradzic-microsoft Jun 18, 2026
20fec2c
GS streaming lod part3 (#18588)
CedricGuillemet Jun 18, 2026
0dbf2ff
Decouple camera inertia glide cutoff from camera.speed (#18589)
georginahalpern Jun 18, 2026
4cb75f0
Fix VideoTexture not updating under WebGPU FAST snapshot rendering
Popov72 Jun 18, 2026
0faaa6f
fix(SPLAT): Fix GSplat PLY misclassified as point cloud when both RGB…
raymondyfei Jun 19, 2026
36f9a58
fix(OBJ): Guard empty vertex buffers when normals/uvs/colors are abse…
raymondyfei Jun 19, 2026
9f2149b
Add canvasTabIndex engine option (#18598)
RaananW Jun 22, 2026
a91fd85
Playground: support importing external resources by absolute URL (#18…
RaananW Jun 22, 2026
aa91e3e
chore(deps): npm audit fix — 20260622 (#18600)
RaananW Jun 22, 2026
dd60d15
fix(AudioV2): apply play options when resuming a paused sound (#18601)
RaananW Jun 22, 2026
ee20407
fix(treeshaking): treat declare-module-only files as side-effect-free…
RaananW Jun 22, 2026
de9372e
fix overrides on morphs (#18595)
sebavan Jun 22, 2026
15e02da
Fix RectAreaLight serialization: position, photometric scale, and emi…
SergioRZMasson Jun 22, 2026
d9de89f
GS + bucket sort + RH (#18606)
CedricGuillemet Jun 22, 2026
562d145
[Native] Report engine.name "Native" and implement updateTextureData …
bkaradzic-microsoft Jun 22, 2026
0d3602c
Fix glTF morph target animation stutter from shader recompiles (#18596)
PatrickRyanMS Jun 22, 2026
7a65125
fix(playground): declare uuid as a direct dependency to fix broken bu…
RaananW Jun 23, 2026
752f004
IBL Shadows frame graph hardening (#18608)
MiiBond Jun 23, 2026
58d945d
Add FBX support to the Sandbox (#18607)
PatrickRyanMS Jun 23, 2026
608146f
build(treeshaking): make gui/loaders/serializers side-effect-free (.p…
RaananW Jun 24, 2026
8f728b2
Flow Graph Editor: playground snippet auto-load, no auto-run on load,…
RaananW Jun 24, 2026
74f71e1
Fix Gaussian Splatting GPU picking and IBL voxelization (#18612)
raymondyfei Jun 24, 2026
f12feed
fix(sandbox): import LoadingScreen side-effect in renderingZone (#18614)
RaananW Jun 24, 2026
1762b41
feat: HTML-in-Canvas (WICG) support — HtmlTexture, interaction manage…
RaananW Jun 24, 2026
943b1e3
Minor version trigger
Jun 25, 2026
bc9a904
Version update 9.14.0
Jun 25, 2026
b3d3d2e
fix: four pure-import / tree-shaking regressions (clearQuad 404, clus…
RaananW Jun 25, 2026
8f9ebfe
Geospatial camera: configurable double-tap fly-to, primary-pointer gu…
georginahalpern Jun 25, 2026
5b8694d
Remove side-effect import closure baseline mechanism (#18619)
RaananW Jun 25, 2026
fbe9148
ci(pr): accelerate Monorepo CI with caching and parallelism (#18613)
RaananW Jun 25, 2026
8b265b5
fix(core): register hard side-effect dependencies at construction tim…
RaananW Jun 25, 2026
c729b94
OpenPBR Fuzz Fixes (#18617)
MiiBond Jun 25, 2026
91d3a67
Fix unregistered image processing parser breaking material clone in t…
RaananW Jun 27, 2026
794bfb9
docs: add shareable Babylon.js tools design guidelines (#18621)
RaananW Jun 27, 2026
4a4481e
fix(core): register PostProcess side-effects for tree-shaken SSAO2 (#…
ryantrem Jun 27, 2026
e997d5b
Fix WGSL exact sRGB conversions failing on WebGPU (#18628)
RaananW Jun 29, 2026
82f6b03
Keep pure barrels side-effect-free in gui, loaders, and atmosphere ad…
RaananW Jun 29, 2026
7da7e3c
fix(sandbox): load glTF extensions, animation side-effects, and inspe…
RaananW Jun 29, 2026
5dfa17e
TC39 prep: Native ES5 downlevel pipeline for UMD scripts (#18630)
RaananW Jun 29, 2026
10e9c75
fix(core): restore CubeTexture static crash in EnvironmentHelper (pur…
RaananW Jun 29, 2026
c24ba56
fix(flowGraphEditor): detect referenced flow graph via runtime captur…
RaananW Jun 29, 2026
17ef26d
Improve `create-babylonjs` Scaffolding — .gitignore, Default Box, and…
luo2430 Jun 29, 2026
522a40e
Properly await async GUI playground setup in visual tests (#18506)
bghgary Jun 29, 2026
116b262
Normalize diagonal keyboard movement for Free, Fly, and ArcRotate cam…
georginahalpern Jun 30, 2026
001b774
chore: npm audit fix lockfile (#18642)
RaananW Jul 1, 2026
fb02d31
fix(flowGraphEditor): keep connections attached to nodes while draggi…
RaananW Jul 1, 2026
c9dccb2
TC39 prep: Symbol.metadata-based serialization decorator store (no be…
RaananW Jul 1, 2026
3fe7838
Minor version trigger
Jul 2, 2026
614ff66
Version update 9.15.0
Jul 2, 2026
ac8318c
[XR] WebGPU-XR Phase 0: decouple WebXR from WebGL with API-agnostic s…
RaananW Jul 2, 2026
270694e
Upgrade Vite to 8.1.3 (Rolldown) for faster tool builds (#18649)
RaananW Jul 2, 2026
8844c93
feat(XR): WebGPU-compatible XR session + XRGPUBinding plumbing (Phase…
RaananW Jul 3, 2026
fe3f821
Viewer: Treat OpenPBRMaterial as PBR for light setup (#18622)
MiiBond Jul 3, 2026
5c45e6c
Fix lighting volume WGSL depth texture binding
matthargett May 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
235 changes: 149 additions & 86 deletions .azure-pipelines/ci-monorepo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,14 @@ variables:
value: "chrome@143:OSX Sonoma"
- name: system.debug
value: false
# Stable, cacheable locations (see templates/cache-steps.yml). Kept outside
# the repo working dir so Cache@2 can restore/save them across runs & reruns.
- name: npm_config_cache
value: $(Pipeline.Workspace)/.npm
- name: NX_CACHE_DIRECTORY
value: $(Pipeline.Workspace)/.nxcache
- name: PLAYWRIGHT_BROWSERS_PATH
value: $(Pipeline.Workspace)/.playwright

pool:
vmImage: ubuntu-latest
Expand Down Expand Up @@ -170,6 +178,10 @@ jobs:

If that was unintentional please make sure to revert those changes or close this PR.

- template: templates/cache-steps.yml
parameters:
nx: true

- script: npm install
displayName: "npm install"
retryCountOnTaskFailure: 1
Expand Down Expand Up @@ -279,12 +291,15 @@ jobs:
https://sfe.babylonjs.com/?snapshot=$(BuildName)

# ============================================================================
# ES6
# Builds ES6 modules and generates file size reports
# ES6 (libs + visualization)
# Builds only the ES6 lib packages (core/gui/loaders/…) that the ES6
# visualization tests consume, then runs those tests. The editor/tool
# builds, tree-shaking check, and file-size report run in parallel in the
# sibling ES6Tools job, keeping them off the visualization critical path.
# No dependencies - runs immediately
# ============================================================================
- job: ES6
displayName: "ES6"
displayName: "ES6 (libs + visualization)"
steps:
- template: templates/checkout-with-tag-override.yml

Expand All @@ -295,33 +310,27 @@ jobs:
inputs:
version: "22.x"

- template: templates/cache-steps.yml
parameters:
nx: true

- script: npm install
displayName: "npm install"
env:
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: "true"
PUPPETEER_SKIP_DOWNLOAD: "true"

- task: Npm@1
displayName: "npm build es6"
inputs:
command: custom
customCommand: "run build:es6"

# Only the lib packages (core/gui/loaders/…) are needed for the
# visualization tests below. The editor/tool builds and the
# tree-shaking check run in parallel in the ES6Tools job.
- bash: |
npx nx run-many --target=prepublishOnly --all
displayName: "Make sure es6 packages are ready"
continueOnError: true
npm run build:assets:smart-filters && npm run build:es6:libs
displayName: "npm build es6 libs"

- template: templates/check-snapshot-exists.yml
parameters:
snapshotPath: "$(BuildName)/testResults/es6visplaywright"

- task: Npm@1
displayName: "Test ES6 packages"
inputs:
command: custom
customCommand: "run test:es6-packages -w @tools/tests"

- bash: .azure-pipelines/browserstack-wait.sh npx playwright test --config ./playwright.browserstack.config.ts
displayName: "ES6 visualization tests (BrowserStack)"
env:
Expand Down Expand Up @@ -360,6 +369,54 @@ jobs:
testResultsFormat: JUnit
testResultsFiles: "./junit.xml"

# ============================================================================
# ES6 TOOLS, TREE-SHAKING, AND FILE SIZES
# Runs the full ES6 build (editor/tool packages + check:treeshaking-all),
# validates publishability, and generates/uploads the file-size report.
# Split out of the ES6 job so this work runs in parallel with the ES6
# visualization tests instead of gating them. Blocking: tree-shaking and
# build failures fail the pipeline here just as they did in the ES6 job.
# No dependencies - runs immediately
# ============================================================================
- job: ES6Tools
displayName: "ES6 tools, tree-shaking, and file sizes"
steps:
- template: templates/checkout-with-tag-override.yml

- task: UseNode@1
displayName: "Use Node 22.x"
continueOnError: true
retryCountOnTaskFailure: 1
inputs:
version: "22.x"

- template: templates/cache-steps.yml
parameters:
nx: true

- script: npm install
displayName: "npm install"
env:
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: "true"
PUPPETEER_SKIP_DOWNLOAD: "true"

- task: Npm@1
displayName: "npm build es6"
inputs:
command: custom
customCommand: "run build:es6"

- bash: |
npx nx run-many --target=prepublishOnly --all
displayName: "Make sure es6 packages are ready"
continueOnError: true

- task: Npm@1
displayName: "Test ES6 packages"
inputs:
command: custom
customCommand: "run test:es6-packages -w @tools/tests"

- task: Npm@1
displayName: "npm build modules size"
inputs:
Expand Down Expand Up @@ -402,6 +459,8 @@ jobs:
inputs:
version: "22.x"

- template: templates/cache-steps.yml

- script: npm install
displayName: "npm install"
env:
Expand Down Expand Up @@ -439,6 +498,8 @@ jobs:
inputs:
version: "22.x"

- template: templates/cache-steps.yml

- script: npm install
displayName: "npm install"
retryCountOnTaskFailure: 1
Expand Down Expand Up @@ -466,12 +527,17 @@ jobs:

# ============================================================================
# UNIT TESTS
# Depends on: Build, FormatLint
# Depends on: FormatLint (fail-fast gate only).
# Intentionally does NOT depend on Build: the unit suite runs in-process
# (vitest) and needs no Build snapshot. The one CDN-dependent assertion
# (moduleFileSize.test.ts -> fileSizes.json) already self-skips when the
# file is absent, so dropping the Build dependency changes no test outcome
# while moving this job out of the post-Build "wave 2" (keeps peak agents
# per PR at <= 8).
# ============================================================================
- job: UnitTests
displayName: "Unit tests"
dependsOn:
- Build
- FormatLint
steps:
- template: templates/checkout-with-tag-override.yml
Expand All @@ -483,6 +549,8 @@ jobs:
inputs:
version: "22.x"

- template: templates/cache-steps.yml

- task: Npm@1
displayName: "npm install"
retryCountOnTaskFailure: 1
Expand Down Expand Up @@ -551,6 +619,10 @@ jobs:
parameters:
snapshotPath: "$(BuildName)/testResults/interactionplaywright"

- template: templates/cache-steps.yml
parameters:
playwright: true

- script: |
npm install
npx playwright install --with-deps
Expand Down Expand Up @@ -625,6 +697,8 @@ jobs:
parameters:
snapshotPath: "$(BuildName)/testResults/webgl2playwright"

- template: templates/cache-steps.yml

- script: |
npm install
displayName: "npm install"
Expand Down Expand Up @@ -708,6 +782,8 @@ jobs:
parameters:
snapshotPath: "$(BuildName)/testResults/webgpuplaywright"

- template: templates/cache-steps.yml

- script: |
npm install
displayName: "npm install"
Expand Down Expand Up @@ -777,7 +853,7 @@ jobs:
dependsOn:
- Build
- FormatLint
timeoutInMinutes: 15
timeoutInMinutes: 35
pool:
vmImage: windows-latest
steps:
Expand Down Expand Up @@ -827,13 +903,32 @@ jobs:
displayName: "Update scripts from snapshot"
retryCountOnTaskFailure: 5

- script: npm install
displayName: "npm install"
retryCountOnTaskFailure: 1
env:
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: "true"
PUPPETEER_SKIP_DOWNLOAD: "true"

# Babylon Native runs on Chakra, which consumes ES5-level script. The TC39 decorator
# migration forces the core UMD bundle to an ES2015 target (the `accessor` keyword requires
# it), so it must be downleveled to ES5 for BOTH the unit tests and the playground before
# either is executed.
- script: |
npm run downlevel:native-scripts -- ..\BabylonNativeNightlyUnitTests\RelWithDebInfo\Assets\babylon.max.js
displayName: "Downlevel core script for Native (unit tests)"

- script: |
cd
cd ..\BabylonNativeNightlyUnitTests\RelWithDebInfo
UnitTests.exe
displayName: "Run unit tests"
retryCountOnTaskFailure: 3

- script: |
npm run downlevel:native-scripts -- ..\BabylonNativeNightlyPlayground\RelWithDebInfo\Scripts\babylon.max.js
displayName: "Downlevel core script for Native (visualization)"

- script: |
cd
cd ..\BabylonNativeNightlyPlayground\RelWithDebInfo
Expand Down Expand Up @@ -890,6 +985,8 @@ jobs:
inputs:
version: "22.x"

- template: templates/cache-steps.yml

- script: npm install
displayName: "npm install"
retryCountOnTaskFailure: 1
Expand Down Expand Up @@ -951,71 +1048,32 @@ jobs:
# ============================================================================
# MEMORY LEAK TESTS
# Depends on: Build, FormatLint
# Runs memlab (Puppeteer/Chromium) on the CI agent — heap snapshots require
# local Chrome DevTools Protocol access, so BrowserStack is not viable here.
# Non-blocking: failures do not fail the overall pipeline.
# Split into two parallel jobs (ci + packages suites) — see
# templates/memory-leak-job.yml. Each runs memlab locally (BrowserStack is
# not viable for heap snapshots) and is non-blocking. Running them in
# parallel instead of sequentially shortens the post-Build critical-path
# tail. UnitTests was moved out of "wave 2", so adding one job here keeps
# the peak parallel jobs per PR at <= 8.
# ============================================================================
- job: MemoryLeakTests
displayName: "Memory leak tests"
dependsOn:
- Build
- FormatLint
continueOnError: true
timeoutInMinutes: 45
steps:
- checkout: self
clean: true
fetchTags: false

- task: UseNode@1
displayName: "Use Node 22.x"
continueOnError: true
retryCountOnTaskFailure: 1
inputs:
version: "22.x"

- script: npm install
displayName: "npm install"
retryCountOnTaskFailure: 1

- script: npm run test:memory-leaks -- --no-fail-fast
displayName: "Run memory leak tests (ci suite)"
continueOnError: true
env:
CDN_BASE_URL: "$(SNAPSHOT_CDN_URL)/$(BuildName)"
MEMLEAK_COMMENT_FILE: "$(Build.ArtifactStagingDirectory)/memleak-comment.md"

- script: npm run test:memory-leaks:packages -- --no-fail-fast
displayName: "Run memory leak tests (packages suite)"
continueOnError: true
env:
CDN_BASE_URL: "$(SNAPSHOT_CDN_URL)/$(BuildName)"
MEMLEAK_COMMENT_FILE: "$(Build.ArtifactStagingDirectory)/memleak-comment.md"

- bash: |
if [ -f "$(Build.ArtifactStagingDirectory)/memleak-comment.md" ]; then
COMMENT=$(cat "$(Build.ArtifactStagingDirectory)/memleak-comment.md")
COMMENT="${COMMENT//'%'/'%25'}"
COMMENT="${COMMENT//$'\n'/'%0A'}"
COMMENT="${COMMENT//$'\r'/'%0D'}"
echo "##vso[task.setvariable variable=MEMLEAK_COMMENT]$COMMENT"
echo "##vso[task.setvariable variable=HAS_MEMLEAK_COMMENT]true"
else
echo "No memory leak comment file found"
echo "##vso[task.setvariable variable=HAS_MEMLEAK_COMMENT]false"
fi
displayName: "Read memory leak comment"
condition: succeededOrFailed()

- task: GitHubComment@0
displayName: "Post memory leak results"
condition: and(succeededOrFailed(), eq(variables['HAS_MEMLEAK_COMMENT'], 'true'))
continueOnError: true
inputs:
gitHubConnection: "$(GITHUB_SERVICE_CONNECTION)"
repositoryName: "$(Build.Repository.Name)"
comment: |
$(MEMLEAK_COMMENT)
- template: templates/memory-leak-job.yml
parameters:
jobName: MemoryLeakTestsCI
displayName: "Memory leak tests (ci suite)"
npmScript: "test:memory-leaks"
suiteLabel: "ci suite"
# First-class PR-facing suite: always posts a single results comment.
alwaysComment: true

- template: templates/memory-leak-job.yml
parameters:
jobName: MemoryLeakTestsPackages
displayName: "Memory leak tests (packages suite)"
npmScript: "test:memory-leaks:packages"
suiteLabel: "packages suite"
# Secondary suite: stays silent only on a clean pass, and still
# comments on any leak or runner error, so the common (clean) case
# keeps the PR to a single memory-leak comment without hiding failures.
alwaysComment: false

# ============================================================================
# VIEWER TESTS
Expand All @@ -1033,6 +1091,10 @@ jobs:
inputs:
version: "22.x"

- template: templates/cache-steps.yml
parameters:
playwright: true

- task: Npm@1
displayName: "npm install"
retryCountOnTaskFailure: 1
Expand Down Expand Up @@ -1060,7 +1122,7 @@ jobs:

# ============================================================================
# DEPLOY
# Depends on: Build, UnitTests, VisualizationWebGL2, ES6,
# Depends on: Build, UnitTests, VisualizationWebGL2, ES6, ES6Tools,
# VisualizationWebGPU, InteractionTests
# Only runs on master/preview branch for Manual/ResourceTrigger/Schedule/
# BuildCompletion builds
Expand All @@ -1072,6 +1134,7 @@ jobs:
- UnitTests
- VisualizationWebGL2
- ES6
- ES6Tools
- VisualizationWebGPU
- InteractionTests
condition: >-
Expand Down
Loading