[ts][phaser] Automatically set UNPACK_PREMULTIPLY_ALPHA_WEBGL to false when spine texture is created, then restore it.

This commit is contained in:
Davide Tantillo 2024-11-05 15:30:38 +01:00
parent b03c682443
commit a5a71b9aab

View File

@ -206,10 +206,12 @@ export class SpinePlugin extends Phaser.Plugins.ScenePlugin {
atlas = new TextureAtlas(atlasFile.data); atlas = new TextureAtlas(atlasFile.data);
if (this.isWebGL) { if (this.isWebGL) {
let gl = this.gl!; let gl = this.gl!;
if (GLTexture.DISABLE_UNPACK_PREMULTIPLIED_ALPHA_WEBGL) gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false); const phaserUnpackPmaValue = gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL);
if (phaserUnpackPmaValue) gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
for (let atlasPage of atlas.pages) { for (let atlasPage of atlas.pages) {
atlasPage.setTexture(new GLTexture(gl, this.game.textures.get(atlasKey + "!" + atlasPage.name).getSourceImage() as HTMLImageElement | ImageBitmap, false)); atlasPage.setTexture(new GLTexture(gl, this.game.textures.get(atlasKey + "!" + atlasPage.name).getSourceImage() as HTMLImageElement | ImageBitmap, false));
} }
if (phaserUnpackPmaValue) gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
} else { } else {
for (let atlasPage of atlas.pages) { for (let atlasPage of atlas.pages) {
atlasPage.setTexture(new CanvasTexture(this.game.textures.get(atlasKey + "!" + atlasPage.name).getSourceImage() as HTMLImageElement | ImageBitmap)); atlasPage.setTexture(new CanvasTexture(this.game.textures.get(atlasKey + "!" + atlasPage.name).getSourceImage() as HTMLImageElement | ImageBitmap));
@ -313,12 +315,12 @@ interface SpineAtlasFileConfig {
} }
class SpineAtlasFile extends Phaser.Loader.MultiFile { class SpineAtlasFile extends Phaser.Loader.MultiFile {
constructor (loader: Phaser.Loader.LoaderPlugin, key: string | SpineAtlasFileConfig, url?: string, public premultipliedAlpha: boolean = true, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject) { constructor (loader: Phaser.Loader.LoaderPlugin, key: string | SpineAtlasFileConfig, url?: string, public premultipliedAlpha?: boolean, xhrSettings?: Phaser.Types.Loader.XHRSettingsObject) {
if (typeof key !== "string") { if (typeof key !== "string") {
const config = key; const config = key;
key = config.key; key = config.key;
url = config.url; url = config.url;
premultipliedAlpha = config.premultipliedAlpha ?? true; premultipliedAlpha = config.premultipliedAlpha;
xhrSettings = config.xhrSettings; xhrSettings = config.xhrSettings;
} }
@ -372,9 +374,10 @@ class SpineAtlasFile extends Phaser.Loader.MultiFile {
textureManager.addImage(file.key, file.data); textureManager.addImage(file.key, file.data);
} }
} else { } else {
this.premultipliedAlpha = this.premultipliedAlpha ?? (file.data.indexOf("pma: true") >= 0 || file.data.indexOf("pma:true") >= 0);
file.data = { file.data = {
data: file.data, data: file.data,
premultipliedAlpha: this.premultipliedAlpha || file.data.indexOf("pma: true") >= 0 || file.data.indexOf("pma:true") >= 0 premultipliedAlpha: this.premultipliedAlpha,
}; };
file.addToCache(); file.addToCache();
} }