Skip to content

Commit 6528f74

Browse files
authored
Merge pull request #1339 from melonjs/fix/blend-mode-pma
Fix setBlendMode ignoring premultipliedAlpha flag
2 parents 3a0c8b8 + 11fe842 commit 6528f74

File tree

5 files changed

+22
-2
lines changed

5 files changed

+22
-2
lines changed

packages/melonjs/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## [18.3.0] (melonJS 2)
44

5+
### Fixed
6+
- WebGLRenderer: `setBlendMode()` now tracks the `premultipliedAlpha` flag — previously only the mode name was checked, causing incorrect GL blend function when mixing PMA and non-PMA textures with the same blend mode
7+
58
### Chore
69
- Minimum Node.js version is now 24.0.0 (Node 18/20 EOL, Node 22 in maintenance)
710
- CI: upgrade to Node.js 24 and pnpm/action-setup v5

packages/melonjs/src/video/webgl/webgl_renderer.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,11 +750,15 @@ export default class WebGLRenderer extends Renderer {
750750
* @returns {string} the blend mode actually applied (may differ if the requested mode is unsupported)
751751
*/
752752
setBlendMode(mode = "normal", premultipliedAlpha = true) {
753-
if (this.currentBlendMode !== mode) {
753+
if (
754+
this.currentBlendMode !== mode ||
755+
this.currentPremultipliedAlpha !== premultipliedAlpha
756+
) {
754757
const gl = this.gl;
755758
this.flush();
756759
gl.enable(gl.BLEND);
757760
this.currentBlendMode = mode;
761+
this.currentPremultipliedAlpha = premultipliedAlpha;
758762

759763
// source factor depends on whether textures use premultiplied alpha
760764
const srcAlpha = premultipliedAlpha ? gl.ONE : gl.SRC_ALPHA;

packages/spine-plugin/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 2.0.2
4+
5+
### Fixed
6+
- Auto-detect `premultipliedAlpha` from atlas pages and set it on the SkeletonRenderer, fixing incorrect blending for PMA textures (e.g. Cloud Pot)
7+
38
## 2.0.1
49

510
### Changed

packages/spine-plugin/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@melonjs/spine-plugin",
3-
"version": "2.0.1",
3+
"version": "2.0.2",
44
"description": "melonJS Spine plugin",
55
"homepage": "https://www.npmjs.com/package/@melonjs/spine-plugin",
66
"type": "module",

packages/spine-plugin/src/Spine.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,14 @@ export default class Spine extends Renderable {
193193
this.plugin.assetManager.require(jsonFile),
194194
);
195195

196+
// detect premultiplied alpha from atlas pages
197+
this.premultipliedAlpha = atlas.pages.some((page) => {
198+
return page.pma;
199+
});
200+
if (this.renderer.WebGLVersion >= 1) {
201+
this.skeletonRenderer.premultipliedAlpha = this.premultipliedAlpha;
202+
}
203+
196204
// Instantiate a new skeleton based on the atlas and skeleton data.
197205
this.skeleton = new this.runtime.Skeleton(skeletonData);
198206

0 commit comments

Comments
 (0)