diff --git a/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx b/packages/examples/src/examples/compressedTextures/ExampleCompressedTextures.tsx index ef81332b8..e98febc6d 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.pos.set(x, y); + font.setText(text); + 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..e24ac8e60 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: `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 +- 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") || 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, }); });