From 2e8a8f8081e7258e5553832751bd4dfea811e363 Mon Sep 17 00:00:00 2001 From: Ben Richards Date: Fri, 9 Feb 2024 15:51:53 +1300 Subject: [PATCH] Add default normal map texture __NORMAL. Remove `LightPipeline.defaultNormalMap`, as this universal texture is now available to use. --- changelog/3.80/WebGLContextRestore.md | 15 +++++++++ src/renderer/webgl/WebGLRenderer.js | 13 ++++++++ src/renderer/webgl/pipelines/LightPipeline.js | 33 +++++-------------- src/textures/TextureManager.js | 8 +++-- 4 files changed, 43 insertions(+), 26 deletions(-) diff --git a/changelog/3.80/WebGLContextRestore.md b/changelog/3.80/WebGLContextRestore.md index b5244e2e2..5b62519c8 100644 --- a/changelog/3.80/WebGLContextRestore.md +++ b/changelog/3.80/WebGLContextRestore.md @@ -133,6 +133,7 @@ Several changes were made to the rendering system to support these improvements. - Added property `glFramebufferWrappers` of type `WebGLFramebufferWrapper[]` - Added property `glAttribLocationWrappers` of type `WebGLAttribLocationWrapper[]` - Added property `glUniformLocationWrappers` of type `WebGLUniformLocationWrapper[]` + - Added property `normalTexture` of type `WebGLTextureWrapper` - `currentFramebuffer` property type changed from `WebGLFramebuffer` to `WebGLFramebufferWrapper` - `fboStack` property type changed from `WebGLFramebuffer[]` to `WebGLFramebufferWrapper[]` - `currentProgram` property type changed from `WebGLProgram` to `WebGLProgramWrapper` @@ -197,6 +198,18 @@ Several changes were made to the rendering system to support these improvements. - `Phaser.Renderers.WebGL.WebGLShader` - `program` property type changed from `WebGLProgram` to `WebGLProgramWrapper` - Added method `syncUniforms` for use during context recovery +- `Phaser.Renderers.WebGL.Pipelines.LightPipeline` + - Removed property `defaultNormalMap`. There is now a default normal map at `WebGLRenderer.normalTexture`, or the texture key `'__NORMAL'`. + - `currentNormalMap` property type changed from `WebGLTexture` to `WebGLTextureWrapper` + - `#setTexture2D` method: + - `texture` parameter type changed from `WebGLTexture` to `WebGLTextureWrapper` + - `#isNewNormalMap` method: + - `texture` parameter type changed from `WebGLTexture` to `WebGLTextureWrapper` + - `normalMap` parameter type changed from `WebGLTexture` to `WebGLTextureWrapper` + - `#getNormalMap` method: + - Return type changed from `WebGLTexture` to `WebGLTextureWrapper` + - `#batchTexture` method: + - `texture` parameter type changed from `WebGLTexture` to `WebGLTextureWrapper` - `Phaser.Renderers.WebGL.Pipelines.MultiPipeline` - `#batchTexture` method: - `texture` parameter type changed from `WebGLTexture` to `WebGLTextureWrapper` @@ -222,10 +235,12 @@ Several changes were made to the rendering system to support these improvements. - Constructor - `source` parameter type options added `WebGLTextureWrapper` - `Phaser.Textures.TextureManager` + - A texture with the key `'__NORMAL'` is created on boot if the WebGL renderer is being used. This is a 1x1 texture of colour #7f7fff, or a flat normal map. - `#addGLTexture` method: - `glTexture` parameter type changed from `WebGLTexture` to `WebGLTextureWrapper` - `width` parameter removed - `height` parameter removed + - `#getTextureKeys` now excludes `'__NORMAL'` as well as `'__DEFAULT'`, `'__MISSING'`, and `'__WHITE'`. - Added method `addUint8Array` for creating textures from raw colour data - `Phaser.Textures.TextureSource` - `glTexture` property type changed from `WebGLTexture` to `WebGLTextureWrapper` diff --git a/src/renderer/webgl/WebGLRenderer.js b/src/renderer/webgl/WebGLRenderer.js index c0bbc1219..32a76f800 100644 --- a/src/renderer/webgl/WebGLRenderer.js +++ b/src/renderer/webgl/WebGLRenderer.js @@ -471,6 +471,18 @@ var WebGLRenderer = new Class({ */ this.blankTexture = null; + /** + * A blank 1x1 #7f7fff texture, a flat normal map, + * as used by the Graphics system where needed. + * This is set in the `boot` method. + * + * @name Phaser.Renderer.WebGL.WebGLRenderer#normalTexture + * @type {Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper} + * @readonly + * @since 3.80.0 + */ + this.normalTexture = null; + /** * A pure white 4x4 texture, as used by the Graphics system where needed. * This is set in the `boot` method. @@ -979,6 +991,7 @@ var WebGLRenderer = new Class({ // Set-up default textures, fbo and scissor this.blankTexture = game.textures.getFrame('__DEFAULT').glTexture; + this.normalTexture = game.textures.getFrame('__NORMAL').glTexture; this.whiteTexture = game.textures.getFrame('__WHITE').glTexture; var gl = this.gl; diff --git a/src/renderer/webgl/pipelines/LightPipeline.js b/src/renderer/webgl/pipelines/LightPipeline.js index 0596abc20..b46fd3a87 100644 --- a/src/renderer/webgl/pipelines/LightPipeline.js +++ b/src/renderer/webgl/pipelines/LightPipeline.js @@ -10,7 +10,6 @@ var GetFastValue = require('../../../utils/object/GetFastValue'); var LightShaderSourceFS = require('../shaders/Light-frag.js'); var MultiPipeline = require('./MultiPipeline'); var TransformMatrix = require('../../../gameobjects/components/TransformMatrix'); -var UUID = require('../../../utils/string/UUID.js'); var Vec2 = require('../../../math/Vector2'); var WebGLPipeline = require('../WebGLPipeline'); @@ -86,21 +85,11 @@ var LightPipeline = new Class({ 0, 0, 1 ]); - /** - * Stores a default normal map, which is an object with a `glTexture` property that - * maps to a 1x1 texture of the color #7f7fff created in the `boot` method. - * - * @name Phaser.Renderer.WebGL.Pipelines.LightPipeline#defaultNormalMap - * @type {object} - * @since 3.50.0 - */ - this.defaultNormalMap; - /** * The currently bound normal map texture at texture unit one, if any. * * @name Phaser.Renderer.WebGL.Pipelines.LightPipeline#currentNormalMap; - * @type {?WebGLTexture} + * @type {?Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper} * @since 3.60.0 */ this.currentNormalMap; @@ -158,10 +147,6 @@ var LightPipeline = new Class({ boot: function () { WebGLPipeline.prototype.boot.call(this); - - var tempTexture = this.renderer.game.textures.addUint8Array(UUID(), new Uint8Array([ 127, 127, 255, 255 ]), 1, 1); - - this.defaultNormalMap = { glTexture: tempTexture }; }, /** @@ -272,7 +257,7 @@ var LightPipeline = new Class({ * @ignore * @since 3.50.0 * - * @param {WebGLTexture} [texture] - WebGLTexture that will be assigned to the current batch. If not given uses blankTexture. + * @param {Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper} [texture] - Texture that will be assigned to the current batch. If not given uses blankTexture. * @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object being rendered or added to the batch. */ setTexture2D: function (texture, gameObject) @@ -363,8 +348,8 @@ var LightPipeline = new Class({ * @method Phaser.Renderer.WebGL.WebGLRenderer#isNewNormalMap * @since 3.50.0 * - * @param {WebGLTexture} texture - The WebGL diffuse texture. - * @param {WebGLTexture} normalMap - The WebGL normal map texture. + * @param {Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper} texture - The diffuse texture. + * @param {Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper} normalMap - The normal map texture. * * @return {boolean} Returns `false` if this combination is already set, or `true` if it's a new combination. */ @@ -374,7 +359,7 @@ var LightPipeline = new Class({ }, /** - * Returns the normal map WebGLTexture from the given Game Object. + * Returns the normal map WebGLTextureWrapper from the given Game Object. * If the Game Object doesn't have one, it returns the default normal map from this pipeline instead. * * @method Phaser.Renderer.WebGL.Pipelines.LightPipeline#getNormalMap @@ -382,7 +367,7 @@ var LightPipeline = new Class({ * * @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object to get the normal map from. * - * @return {WebGLTexture} The normal map texture. + * @return {Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper} The normal map texture. */ getNormalMap: function (gameObject) { @@ -390,7 +375,7 @@ var LightPipeline = new Class({ if (!gameObject) { - normalMap = this.defaultNormalMap; + return this.renderer.normalMap; } else if (gameObject.displayTexture) { @@ -414,7 +399,7 @@ var LightPipeline = new Class({ if (!normalMap) { - normalMap = this.defaultNormalMap; + return this.renderer.normalMap; } return normalMap.glTexture; @@ -445,7 +430,7 @@ var LightPipeline = new Class({ * @since 3.50.0 * * @param {Phaser.GameObjects.GameObject} gameObject - Source GameObject. - * @param {WebGLTexture} texture - Raw WebGLTexture associated with the quad. + * @param {Phaser.Renderer.WebGL.Wrappers.WebGLTextureWrapper} texture - Texture associated with the quad. * @param {number} textureWidth - Real texture width. * @param {number} textureHeight - Real texture height. * @param {number} srcX - X coordinate of the quad. diff --git a/src/textures/TextureManager.js b/src/textures/TextureManager.js index 28a9292c4..8cc59ab55 100644 --- a/src/textures/TextureManager.js +++ b/src/textures/TextureManager.js @@ -187,6 +187,10 @@ var TextureManager = new Class({ this.addBase64('__DEFAULT', config.defaultImage); this.addBase64('__MISSING', config.missingImage); this.addBase64('__WHITE', config.whiteImage); + if (this.game.renderer.gl) + { + this.addUint8Array('__NORMAL', new Uint8Array([ 127, 127, 255, 255 ]), 1, 1); + } this.game.events.once(GameEvents.DESTROY, this.destroy, this); @@ -1351,7 +1355,7 @@ var TextureManager = new Class({ /** * Returns an array with all of the keys of all Textures in this Texture Manager. - * The output array will exclude the `__DEFAULT`, `__MISSING`, and `__WHITE` keys. + * The output array will exclude the `__DEFAULT`, `__MISSING`, `__WHITE`, and `__NORMAL` keys. * * @method Phaser.Textures.TextureManager#getTextureKeys * @since 3.0.0 @@ -1364,7 +1368,7 @@ var TextureManager = new Class({ for (var key in this.list) { - if (key !== '__DEFAULT' && key !== '__MISSING' && key !== '__WHITE') + if (key !== '__DEFAULT' && key !== '__MISSING' && key !== '__WHITE' && key !== '__NORMAL') { output.push(key); }