phaser icon indicating copy to clipboard operation
phaser copied to clipboard

Canvas Mode: RenderTexture "fill" method does not set "globalCompositeOperation"

Open mateuszkmiecik opened this issue 3 years ago • 0 comments

Version

  • Phaser Version: 3.55, 3.60.0-beta
  • Operating system: Windows, macOS
  • Browser: Chrome, Firefox
  • Phaser Rendering Mode: CANVAS

Description

Using fill method in RenderTexture does not set CanvasRenderingContext2D.globalCompositeOperation, resulting in reusing value set by last drawn gameObject.

rt.fill(0x0000ff);
rt.erase(...);
rt.draw(...);
console.log(rt.context.globalCompositeOperation); // "source-over"
rt.fill(0x0000ff);

acts as expected, resulting in filling RenderTexture with color. image

Reversing order of draw end erase methods, causes fill to remove pixels from whole RenderTexture.

rt.fill(0x0000ff);
rt.draw(...);
rt.erase(...);
console.log(rt.context.globalCompositeOperation); // "destination-out"
rt.fill(0x0000ff);

image

Example Test Code

https://codepen.io/mkchomik/pen/QWQaxbz

Additional Information

Digging in the codebase, I found that value of globalCompositeOperation is set in SetTransform function: https://github.com/photonstorm/phaser/blob/master/src/renderer/canvas/utils/SetTransform.js#L47

I was thinking if doing ctx.save() right before setting blendMode and globalAlpha would help, however I am not sure if it doesn't break other parts of code.

mateuszkmiecik avatar May 27 '22 13:05 mateuszkmiecik