Skip to content

Update checks of *Source and *Element to be typeof checks in effect components#18405

Merged
RaananW merged 2 commits intoBabylonJS:masterfrom
kv-bh:fix-effect-source-issue
May 4, 2026
Merged

Update checks of *Source and *Element to be typeof checks in effect components#18405
RaananW merged 2 commits intoBabylonJS:masterfrom
kv-bh:fix-effect-source-issue

Conversation

@kv-bh
Copy link
Copy Markdown
Contributor

@kv-bh kv-bh commented Apr 30, 2026

Some of the checks in _ProcessShaderCode seem to be incorrect, as it can cause an error when effects are created by ShadowDepthWrapper._makeEffect.

The issue comes from computeSource being able to be empty string '' which evaluates to false in these conditions, which then results in e.g. vertexSource being assigned to the value of baseName. This baseName is then passed into LoadShader where it is treated as a string, followed by substring being invoked and an error being raised.

I noticed this issue in BabylonJS version 7.54.3, which is pretty old, but looking at the existing codebase, the same conditions for this error seem to exist. Here is a stack trace (somewhat mangled due to build system):

effect.functions.ts:228 Uncaught (in promise) TypeError: shader578.substring is not a function
    at _loadShader (effect.functions.ts:228:16)
    at _processShaderCode (effect.functions.ts:177:5)
    at _Effect._processShaderCodeAsync (effect.ts:441:9)
    at new _Effect (effect.ts:391:18)
    at _Engine.createEffect (thinEngine.ts:2008:24)
    at ShadowDepthWrapper._makeEffect (shadowDepthWrapper.ts:302:48)
    at ShadowDepthWrapper.isReadyForSubMesh (shadowDepthWrapper.ts:183:21)
    at _ShadowGenerator.isReady (shadowGenerator.ts:1583:37)
    at _ShadowGenerator._renderSubMeshForShadowMap (shadowGenerator.ts:1308:18)
    at _ShadowGenerator._renderForShadowMap (shadowGenerator.ts:1241:18)

Here is a simple reproduction: https://playground.babylonjs.com/#28WKKT

engine.createEffect(
  {
    vertexSource: '',
    fragmentSource: '',
  },
  {
    attributes: [],
    uniformsNames: [],
    samplers: [],
    defines: '',
    fallbacks: null,
    onCompiled: null,
    onError: null,
  },
  engine,
);

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented Apr 30, 2026

Please make sure to label your PR with "bug", "new feature" or "breaking change" label(s).
To prevent this PR from going to the changelog marked it with the "skip changelog" label.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented Apr 30, 2026

Snapshot stored with reference name:
refs/pull/18405/merge

Test environment:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/refs/pull/18405/merge/index.html

To test a playground add it to the URL, for example:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/refs/pull/18405/merge/index.html#WGZLGJ#4600

Links to test your changes to core in the published versions of the Babylon tools (does not contain changes you made to the tools themselves):

https://playground.babylonjs.com/?snapshot=refs/pull/18405/merge
https://sandbox.babylonjs.com/?snapshot=refs/pull/18405/merge
https://gui.babylonjs.com/?snapshot=refs/pull/18405/merge
https://nme.babylonjs.com/?snapshot=refs/pull/18405/merge

To test the snapshot in the playground with a playground ID add it after the snapshot query string:

https://playground.babylonjs.com/?snapshot=refs/pull/18405/merge#BCU1XR#0

If you made changes to the sandbox or playground in this PR, additional comments will be generated soon containing links to the dev versions of those tools.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented Apr 30, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented Apr 30, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented Apr 30, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented Apr 30, 2026

⚡ Performance Test Results

🟢 All performance tests passed — no regressions detected.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented Apr 30, 2026

🟢 Memory Leak Test Results

13 passed, 0 leaked out of 13 scenarios

🟢 All memory leak tests passed — no leaks detected.

Passed Scenarios (13)
Scenario Package
Core Feature Stack @babylonjs/core
Core Rendering Materials Shadows Stack @babylonjs/core
Core Textures Render Targets PostProcess Stack @babylonjs/core
GUI Fullscreen UI Controls @babylonjs/gui
GUI Mesh ADT Controls @babylonjs/gui
Loaders Boombox Import @babylonjs/loaders
Loaders OBJ Direct Load @babylonjs/loaders
Loaders STL Direct Load @babylonjs/loaders
Materials Library Stack @babylonjs/materials
Serializers glTF Export @babylonjs/serializers
Serializers GLB Export @babylonjs/serializers
PostProcesses Digital Rain Stack @babylonjs/post-processes
Procedural Textures Stack @babylonjs/procedural-textures

@deltakosh deltakosh enabled auto-merge (squash) April 30, 2026 16:31
auto-merge was automatically disabled May 1, 2026 19:39

Head branch was pushed to by a user without write access

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 1, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 1, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 1, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 1, 2026

⚡ Performance Test Results

🟢 All performance tests passed — no regressions detected.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 1, 2026

🟢 Memory Leak Test Results

13 passed, 0 leaked out of 13 scenarios

🟢 All memory leak tests passed — no leaks detected.

Passed Scenarios (13)
Scenario Package
Core Feature Stack @babylonjs/core
Core Rendering Materials Shadows Stack @babylonjs/core
Core Textures Render Targets PostProcess Stack @babylonjs/core
GUI Fullscreen UI Controls @babylonjs/gui
GUI Mesh ADT Controls @babylonjs/gui
Loaders Boombox Import @babylonjs/loaders
Loaders OBJ Direct Load @babylonjs/loaders
Loaders STL Direct Load @babylonjs/loaders
Materials Library Stack @babylonjs/materials
Serializers glTF Export @babylonjs/serializers
Serializers GLB Export @babylonjs/serializers
PostProcesses Digital Rain Stack @babylonjs/post-processes
Procedural Textures Stack @babylonjs/procedural-textures

@RaananW
Copy link
Copy Markdown
Member

RaananW commented May 4, 2026

/azp run

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 4, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 4, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 4, 2026

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 4, 2026

⚡ Performance Test Results

🟢 All performance tests passed — no regressions detected.

@bjsplat
Copy link
Copy Markdown
Collaborator

bjsplat commented May 4, 2026

🟢 Memory Leak Test Results

13 passed, 0 leaked out of 13 scenarios

🟢 All memory leak tests passed — no leaks detected.

Passed Scenarios (13)
Scenario Package
Core Feature Stack @babylonjs/core
Core Rendering Materials Shadows Stack @babylonjs/core
Core Textures Render Targets PostProcess Stack @babylonjs/core
GUI Fullscreen UI Controls @babylonjs/gui
GUI Mesh ADT Controls @babylonjs/gui
Loaders Boombox Import @babylonjs/loaders
Loaders OBJ Direct Load @babylonjs/loaders
Loaders STL Direct Load @babylonjs/loaders
Materials Library Stack @babylonjs/materials
Serializers glTF Export @babylonjs/serializers
Serializers GLB Export @babylonjs/serializers
PostProcesses Digital Rain Stack @babylonjs/post-processes
Procedural Textures Stack @babylonjs/procedural-textures

@RaananW RaananW merged commit 98f887e into BabylonJS:master May 4, 2026
21 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants