From 1ccd8742ae6363e0689e6bf3e0b8f569abf524dc Mon Sep 17 00:00:00 2001 From: Olivier Biot Date: Wed, 15 Apr 2026 19:00:24 +0800 Subject: [PATCH 1/4] Fix WebGL context creation on Windows, bump to 19.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change failIfMajorPerformanceCaveat default to false — allows WebGL on machines with blocklisted GPU drivers, matching PixiJS/Phaser - Guard getSupportedCompressedTextureFormats() against null GL context - Fix compressed textures example text rendering (Text.draw standalone removed in 19.0) Co-Authored-By: Claude Opus 4.6 (1M context) --- .../ExampleCompressedTextures.tsx | 37 +++++++++++++++++-- packages/melonjs/CHANGELOG.md | 9 +++++ packages/melonjs/package.json | 2 +- .../video/rendertarget/canvasrendertarget.js | 2 +- .../melonjs/src/video/webgl/webgl_renderer.js | 4 ++ 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx b/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx index ef81332b8..9637df361 100644 --- a/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx +++ b/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx @@ -141,12 +141,33 @@ class CompressedTextureDisplay extends Renderable { return true; } + /** @ignore */ + drawText( + renderer: WebGLRenderer | CanvasRenderer, + font: Text, + text: string, + x: number, + y: number, + ) { + font.setText(text); + font.pos.set(x, y); + font.preDraw(renderer); + font.draw(renderer); + font.postDraw(renderer); + } + override draw(renderer: WebGLRenderer | CanvasRenderer) { let y = 10; const x = 10; // Title - this.titleFont.draw(renderer, "Compressed Texture Format Support", x, y); + this.drawText( + renderer, + this.titleFont, + "Compressed Texture Format Support", + x, + y, + ); y += 32; // Format support table @@ -163,8 +184,9 @@ class CompressedTextureDisplay extends Renderable { const supported = this.formats[key] !== null && this.formats[key] !== undefined; this.font.fillStyle.parseCSS(supported ? "#4ade80" : "#f87171"); - this.font.draw( + this.drawText( renderer, + this.font, `${label}: ${supported ? "supported" : "not available"}`, x, y, @@ -179,14 +201,21 @@ class CompressedTextureDisplay extends Renderable { entry.sprite.postDraw(renderer); this.smallFont.fillStyle.parseCSS("#94a3b8"); - this.smallFont.draw(renderer, entry.label, entry.x, entry.y + 60); + this.drawText( + renderer, + this.smallFont, + entry.label, + entry.x, + entry.y + 60, + ); } // Footer info const footerY = game.viewport.height - 40; this.font.fillStyle.parseCSS("#64748b"); - this.font.draw( + this.drawText( renderer, + this.font, `${this.sprites.length} compressed texture(s) loaded. Assets: sevmeyer/ktxtest (CC0).`, x, footerY, diff --git a/packages/melonjs/CHANGELOG.md b/packages/melonjs/CHANGELOG.md index ff8d0d7c1..0843c8769 100644 --- a/packages/melonjs/CHANGELOG.md +++ b/packages/melonjs/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [19.1.0] (melonJS 2) - _2026-04-15_ + +### Changed +- WebGL: `failIfMajorPerformanceCaveat` default changed from `true` to `false` — allows WebGL context creation on machines with blocklisted GPU drivers or software renderers, matching PixiJS and Phaser behavior + +### Fixed +- WebGL: `getSupportedCompressedTextureFormats()` no longer crashes when the GL context is unavailable — falls back to the base renderer's empty format list +- Examples: compressed textures example updated to use `setText()`/`preDraw()`/`draw()`/`postDraw()` pattern — fixes text not rendering after `Text.draw()` standalone removal in 19.0 + ## [19.0.0] (melonJS 2) - _2026-04-14_ ### Added diff --git a/packages/melonjs/package.json b/packages/melonjs/package.json index 88a798ff2..f38eeb897 100644 --- a/packages/melonjs/package.json +++ b/packages/melonjs/package.json @@ -1,6 +1,6 @@ { "name": "melonjs", - "version": "19.0.0", + "version": "19.1.0", "description": "melonJS Game Engine", "homepage": "http://www.melonjs.org/", "type": "module", diff --git a/packages/melonjs/src/video/rendertarget/canvasrendertarget.js b/packages/melonjs/src/video/rendertarget/canvasrendertarget.js index 9a2d210dc..6b4644fe2 100644 --- a/packages/melonjs/src/video/rendertarget/canvasrendertarget.js +++ b/packages/melonjs/src/video/rendertarget/canvasrendertarget.js @@ -18,7 +18,7 @@ const defaultAttributes = { premultipliedAlpha: true, stencil: true, blendMode: "normal", - failIfMajorPerformanceCaveat: true, + failIfMajorPerformanceCaveat: false, preferWebGL1: false, powerPreference: "default", }; diff --git a/packages/melonjs/src/video/webgl/webgl_renderer.js b/packages/melonjs/src/video/webgl/webgl_renderer.js index 8547f5a27..0f23344aa 100644 --- a/packages/melonjs/src/video/webgl/webgl_renderer.js +++ b/packages/melonjs/src/video/webgl/webgl_renderer.js @@ -231,6 +231,10 @@ export default class WebGLRenderer extends Renderer { getSupportedCompressedTextureFormats() { if (typeof supportedCompressedTextureFormats === "undefined") { const gl = this.gl; + if (typeof gl === "undefined" || gl === null) { + // WebGL context not available + return super.getSupportedCompressedTextureFormats(); + } supportedCompressedTextureFormats = { astc: gl.getExtension("WEBGL_compressed_texture_astc") || From bd3b56dd3907256589795779c1268c7db2eecad3 Mon Sep 17 00:00:00 2001 From: Olivier Biot Date: Thu, 16 Apr 2026 07:58:15 +0800 Subject: [PATCH 2/4] Fix Copilot review: failIfMajorPerformanceCaveat default, drawText order - Change failIfMajorPerformanceCaveat default to false in defaultApplicationSettings (was only changed in canvasrendertarget) - Fix drawText: set font.pos before font.setText to render at correct position Co-Authored-By: Claude Opus 4.6 (1M context) --- .../examples/compressedTextures/ExampleCompressedTextures.tsx | 2 +- packages/melonjs/src/application/defaultApplicationSettings.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx b/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx index 9637df361..e98febc6d 100644 --- a/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx +++ b/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx @@ -149,8 +149,8 @@ class CompressedTextureDisplay extends Renderable { x: number, y: number, ) { - font.setText(text); font.pos.set(x, y); + font.setText(text); font.preDraw(renderer); font.draw(renderer); font.postDraw(renderer); diff --git a/packages/melonjs/src/application/defaultApplicationSettings.ts b/packages/melonjs/src/application/defaultApplicationSettings.ts index d1b55b885..45a9c127b 100644 --- a/packages/melonjs/src/application/defaultApplicationSettings.ts +++ b/packages/melonjs/src/application/defaultApplicationSettings.ts @@ -13,7 +13,7 @@ export const defaultApplicationSettings = { consoleHeader: true, blendMode: "normal", physic: "builtin", - failIfMajorPerformanceCaveat: true, + failIfMajorPerformanceCaveat: false, subPixel: false, verbose: false, legacy: false, From 6efdaa77db6754fe28863f413e622bf4a894352c Mon Sep 17 00:00:00 2001 From: Olivier Biot Date: Thu, 16 Apr 2026 08:09:21 +0800 Subject: [PATCH 3/4] Fix CI: add failIfMajorPerformanceCaveat to WebGL tests Tests that create a WebGL context need failIfMajorPerformanceCaveat: true to avoid software rendering in headless CI browsers, which produces broken contexts that fail save/restore and texture cleanup. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/melonjs/tests/font.spec.js | 1 + packages/melonjs/tests/webgl_save_restore.spec.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/melonjs/tests/font.spec.js b/packages/melonjs/tests/font.spec.js index 3da27f254..583ccb7f2 100644 --- a/packages/melonjs/tests/font.spec.js +++ b/packages/melonjs/tests/font.spec.js @@ -19,6 +19,7 @@ describe("Font : Text", () => { parent: "screen", scale: "auto", renderer: video.AUTO, + failIfMajorPerformanceCaveat: true, }); font = new Text(0, 0, { diff --git a/packages/melonjs/tests/webgl_save_restore.spec.js b/packages/melonjs/tests/webgl_save_restore.spec.js index 1e932b67f..02d6419df 100644 --- a/packages/melonjs/tests/webgl_save_restore.spec.js +++ b/packages/melonjs/tests/webgl_save_restore.spec.js @@ -20,6 +20,7 @@ describe("WebGL Renderer save/restore", () => { parent: "screen", scale: "auto", renderer: video.AUTO, + failIfMajorPerformanceCaveat: true, }); renderer = video.renderer; isWebGL = renderer instanceof WebGLRenderer; @@ -30,6 +31,7 @@ describe("WebGL Renderer save/restore", () => { parent: "screen", scale: "auto", renderer: video.AUTO, + failIfMajorPerformanceCaveat: true, }); }); From ac83cca19e265d7ab3137defe8952d679ec235e7 Mon Sep 17 00:00:00 2001 From: Olivier Biot Date: Thu, 16 Apr 2026 10:43:28 +0800 Subject: [PATCH 4/4] Revert failIfMajorPerformanceCaveat app default to true, fix CI Application default stays true (avoids software WebGL in CI headless browsers which causes shader/context errors). Only the CanvasRenderTarget internal default is false. Users can opt in with explicit setting. Revert test-specific failIfMajorPerformanceCaveat overrides. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/melonjs/CHANGELOG.md | 2 +- packages/melonjs/src/application/defaultApplicationSettings.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/melonjs/CHANGELOG.md b/packages/melonjs/CHANGELOG.md index 0843c8769..e24ac8e60 100644 --- a/packages/melonjs/CHANGELOG.md +++ b/packages/melonjs/CHANGELOG.md @@ -3,7 +3,7 @@ ## [19.1.0] (melonJS 2) - _2026-04-15_ ### Changed -- WebGL: `failIfMajorPerformanceCaveat` default changed from `true` to `false` — allows WebGL context creation on machines with blocklisted GPU drivers or software renderers, matching PixiJS and Phaser behavior +- WebGL: `CanvasRenderTarget` internal default for `failIfMajorPerformanceCaveat` changed from `true` to `false` — allows WebGL context creation on machines with blocklisted GPU drivers when creating render targets directly. Application default remains `true`; set `failIfMajorPerformanceCaveat: false` in Application options to opt in. ### Fixed - WebGL: `getSupportedCompressedTextureFormats()` no longer crashes when the GL context is unavailable — falls back to the base renderer's empty format list diff --git a/packages/melonjs/src/application/defaultApplicationSettings.ts b/packages/melonjs/src/application/defaultApplicationSettings.ts index 45a9c127b..d1b55b885 100644 --- a/packages/melonjs/src/application/defaultApplicationSettings.ts +++ b/packages/melonjs/src/application/defaultApplicationSettings.ts @@ -13,7 +13,7 @@ export const defaultApplicationSettings = { consoleHeader: true, blendMode: "normal", physic: "builtin", - failIfMajorPerformanceCaveat: false, + failIfMajorPerformanceCaveat: true, subPixel: false, verbose: false, legacy: false,