The WebGLRenderer method canvasToTexture has a new optional argument noRepeat which will stop it from using gl.REPEAT entirely. This is now used by the Text object to avoid it potentially switching between a REPEAT and CLAMP texture, causing texture black-outs

This commit is contained in:
Richard Davey 2018-10-12 15:08:53 +01:00
parent 4beffe842a
commit 9dc53d1e5a
4 changed files with 38 additions and 16 deletions

View file

@ -15,7 +15,8 @@
* `TileSprite.setFrame` has had both the `updateSize` and `updateOrigin` arguments removed as they didn't do anything for TileSprites and were misleading. * `TileSprite.setFrame` has had both the `updateSize` and `updateOrigin` arguments removed as they didn't do anything for TileSprites and were misleading.
* `CameraManager.remove` has a new argument `runDestroy` which, if set, will automatically call `Camera.destroy` on the Cameras removed from the Camera Manager. You should nearly always allow this to happen (thanks jamespierce) * `CameraManager.remove` has a new argument `runDestroy` which, if set, will automatically call `Camera.destroy` on the Cameras removed from the Camera Manager. You should nearly always allow this to happen (thanks jamespierce)
* Device.OS has been restructured to allow fake UAs from Chrome dev tools to register iOS devices. * Device.OS has been restructured to allow fake UAs from Chrome dev tools to register iOS devices.
* Texture batching during the batch flush has been implemented in the TextureTintPipeline which resolves the issues of very low frame rates, especially on iOS devices, when using non-batched textures such as those used by Text or TileSprites. Fix #4110 #4086 (thanks @ivan @sachinhosmani @maximtsai @alexeymolchan) * Texture batching during the batch flush has been implemented in the TextureTintPipeline which resolves the issues of very low frame rates, especially on iOS devices, when using non-batched textures such as those used by Text or TileSprites. Fix #4110 #4086 (thanks @ivanpopelyshev @sachinhosmani @maximtsai @alexeymolchan)
* The WebGLRenderer method `canvasToTexture` has a new optional argument `noRepeat` which will stop it from using `gl.REPEAT` entirely. This is now used by the Text object to avoid it potentially switching between a REPEAT and CLAMP texture, causing texture black-outs (thanks @ivanpopelyshev)
### Bug Fixes ### Bug Fixes
@ -23,7 +24,6 @@
* If you set `pixelArt` to true in your game config (or `antialias` to false) then TileSprites will now respect this when using the Canvas Renderer and disable smoothing on the internal fill canvas. * If you set `pixelArt` to true in your game config (or `antialias` to false) then TileSprites will now respect this when using the Canvas Renderer and disable smoothing on the internal fill canvas.
* TileSprites that were set to be interactive before they had rendered once wouldn't receive a valid input hit area, causing input to fail. They now define their size immediately, allowing them to be made interactive without having rendered. Fix #4085 (thanks @DotTheGreat) * TileSprites that were set to be interactive before they had rendered once wouldn't receive a valid input hit area, causing input to fail. They now define their size immediately, allowing them to be made interactive without having rendered. Fix #4085 (thanks @DotTheGreat)
* The Particle Emitter Manager has been given a NOOP method called `setBlendMode` to stop warnings from being thrown if you added an emitter to a Container in the Canvas renderer. Fix #4083 (thanks @maximtsai) * The Particle Emitter Manager has been given a NOOP method called `setBlendMode` to stop warnings from being thrown if you added an emitter to a Container in the Canvas renderer. Fix #4083 (thanks @maximtsai)
*
### Examples and TypeScript ### Examples and TypeScript

View file

@ -253,6 +253,14 @@ var Text = new Class({
// Set the resolution // Set the resolution
this.frame.source.resolution = this.style.resolution; this.frame.source.resolution = this.style.resolution;
if (this.renderer && this.renderer.gl)
{
// Clear the default 1x1 glTexture, as we override it later
this.renderer.deleteTexture(this.frame.source.glTexture);
this.frame.source.glTexture = null;
}
this.initRTL(); this.initRTL();
if (style && style.padding) if (style && style.padding)
@ -1168,7 +1176,7 @@ var Text = new Class({
if (this.renderer.gl) if (this.renderer.gl)
{ {
this.frame.source.glTexture = this.renderer.canvasToTexture(canvas, this.frame.source.glTexture); this.frame.source.glTexture = this.renderer.canvasToTexture(canvas, this.frame.source.glTexture, true);
this.frame.glTexture = this.frame.source.glTexture; this.frame.glTexture = this.frame.source.glTexture;
} }

View file

@ -1824,28 +1824,40 @@ var WebGLRenderer = new Class({
* *
* @param {HTMLCanvasElement} srcCanvas - The Canvas element that will be used to populate the texture. * @param {HTMLCanvasElement} srcCanvas - The Canvas element that will be used to populate the texture.
* @param {WebGLTexture} [dstTexture] - Is this going to replace an existing texture? If so, pass it here. * @param {WebGLTexture} [dstTexture] - Is this going to replace an existing texture? If so, pass it here.
* @param {boolean} [noRepeat=false] - Should this canvas never be allowed to set REPEAT? (such as for Text objects)
* *
* @return {WebGLTexture} The newly created WebGL Texture. * @return {WebGLTexture} The newly created WebGL Texture.
*/ */
canvasToTexture: function (srcCanvas, dstTexture) canvasToTexture: function (srcCanvas, dstTexture, noRepeat)
{ {
if (noRepeat === undefined) { noRepeat = false; }
var gl = this.gl; var gl = this.gl;
var wrapping = gl.CLAMP_TO_EDGE; if (!dstTexture)
if (IsSizePowerOfTwo(srcCanvas.width, srcCanvas.height))
{ {
wrapping = gl.REPEAT; var wrapping = gl.CLAMP_TO_EDGE;
if (!noRepeat && IsSizePowerOfTwo(srcCanvas.width, srcCanvas.height))
{
wrapping = gl.REPEAT;
}
dstTexture = this.createTexture2D(0, gl.NEAREST, gl.NEAREST, wrapping, wrapping, gl.RGBA, srcCanvas, srcCanvas.width, srcCanvas.height, true);
}
else
{
this.setTexture2D(dstTexture, 0);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, srcCanvas);
dstTexture.width = srcCanvas.width;
dstTexture.height = srcCanvas.height;
this.setTexture2D(null, 0);
} }
var newTexture = this.createTexture2D(0, gl.NEAREST, gl.NEAREST, wrapping, wrapping, gl.RGBA, srcCanvas, srcCanvas.width, srcCanvas.height, true); return dstTexture;
if (newTexture && dstTexture)
{
this.deleteTexture(dstTexture);
}
return newTexture;
}, },
/** /**

View file

@ -238,6 +238,7 @@ var TextureSource = new Class({
// Update all the Frames using this TextureSource // Update all the Frames using this TextureSource
/*
var index = this.texture.getTextureSourceIndex(this); var index = this.texture.getTextureSourceIndex(this);
var frames = this.texture.getFramesFromTextureSource(index, true); var frames = this.texture.getFramesFromTextureSource(index, true);
@ -246,6 +247,7 @@ var TextureSource = new Class({
{ {
frames[i].glTexture = this.glTexture; frames[i].glTexture = this.glTexture;
} }
*/
} }
}, },