mirror of
https://github.com/photonstorm/phaser
synced 2024-12-05 02:50:55 +00:00
Added fboStack, pushFramebuffer, popFramebuffer and resetTextures parameter
This commit is contained in:
parent
416ae58da3
commit
02bde43772
1 changed files with 74 additions and 4 deletions
|
@ -5,6 +5,7 @@
|
||||||
* @license {@link https://opensource.org/licenses/MIT|MIT License}
|
* @license {@link https://opensource.org/licenses/MIT|MIT License}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
var ArrayRemove = require('../../utils/array/Remove');
|
||||||
var BaseCamera = require('../../cameras/2d/BaseCamera');
|
var BaseCamera = require('../../cameras/2d/BaseCamera');
|
||||||
var CameraEvents = require('../../cameras/2d/events');
|
var CameraEvents = require('../../cameras/2d/events');
|
||||||
var Class = require('../../utils/Class');
|
var Class = require('../../utils/Class');
|
||||||
|
@ -12,11 +13,9 @@ var CONST = require('../../const');
|
||||||
var GameEvents = require('../../core/events');
|
var GameEvents = require('../../core/events');
|
||||||
var IsSizePowerOfTwo = require('../../math/pow2/IsSizePowerOfTwo');
|
var IsSizePowerOfTwo = require('../../math/pow2/IsSizePowerOfTwo');
|
||||||
var NOOP = require('../../utils/NOOP');
|
var NOOP = require('../../utils/NOOP');
|
||||||
var PIPELINE_CONST = require('./pipelines/const');
|
|
||||||
var PipelineManager = require('./PipelineManager');
|
var PipelineManager = require('./PipelineManager');
|
||||||
var ScaleEvents = require('../../scale/events');
|
var ScaleEvents = require('../../scale/events');
|
||||||
var TextureEvents = require('../../textures/events');
|
var TextureEvents = require('../../textures/events');
|
||||||
var TransformMatrix = require('../../gameobjects/components/TransformMatrix');
|
|
||||||
var Utils = require('./Utils');
|
var Utils = require('./Utils');
|
||||||
var WebGLSnapshot = require('../snapshot/WebGLSnapshot');
|
var WebGLSnapshot = require('../snapshot/WebGLSnapshot');
|
||||||
|
|
||||||
|
@ -1508,19 +1507,53 @@ var WebGLRenderer = new Class({
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds a framebuffer. If there was another framebuffer already bound it will force a pipeline flush.
|
* Pushes a new framebuffer onto the FBO stack and makes it the currently bound framebuffer.
|
||||||
|
*
|
||||||
|
* If there was another framebuffer already bound it will force a pipeline flush.
|
||||||
|
*
|
||||||
|
* Call `popFramebuffer` to remove it again.
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLRenderer#pushFramebuffer
|
||||||
|
* @since 3.50.0
|
||||||
|
*
|
||||||
|
* @param {WebGLFramebuffer} framebuffer - The framebuffer that needs to be bound.
|
||||||
|
* @param {boolean} [updateScissor=false] - Set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack.
|
||||||
|
* @param {boolean} [resetTextures=true] - Should the WebGL Textures be reset after the new framebuffer is bound?
|
||||||
|
*
|
||||||
|
* @return {this} This WebGLRenderer instance.
|
||||||
|
*/
|
||||||
|
pushFramebuffer: function (framebuffer, updateScissor, resetTextures)
|
||||||
|
{
|
||||||
|
if (framebuffer === this.currentFramebuffer)
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.fboStack.push(framebuffer);
|
||||||
|
|
||||||
|
return this.setFramebuffer(framebuffer, updateScissor, resetTextures);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the given framebuffer as the active and currently bound framebuffer.
|
||||||
|
*
|
||||||
|
* If there was another framebuffer already bound it will force a pipeline flush.
|
||||||
|
*
|
||||||
|
* Typically, you should call `pushFramebuffer` instead of this method.
|
||||||
*
|
*
|
||||||
* @method Phaser.Renderer.WebGL.WebGLRenderer#setFramebuffer
|
* @method Phaser.Renderer.WebGL.WebGLRenderer#setFramebuffer
|
||||||
* @since 3.0.0
|
* @since 3.0.0
|
||||||
*
|
*
|
||||||
* @param {WebGLFramebuffer} framebuffer - The framebuffer that needs to be bound.
|
* @param {WebGLFramebuffer} framebuffer - The framebuffer that needs to be bound.
|
||||||
* @param {boolean} [updateScissor=false] - If a framebuffer is given, set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack.
|
* @param {boolean} [updateScissor=false] - If a framebuffer is given, set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack.
|
||||||
|
* @param {boolean} [resetTextures=true] - Should the WebGL Textures be reset after the new framebuffer is bound?
|
||||||
*
|
*
|
||||||
* @return {this} This WebGLRenderer instance.
|
* @return {this} This WebGLRenderer instance.
|
||||||
*/
|
*/
|
||||||
setFramebuffer: function (framebuffer, updateScissor)
|
setFramebuffer: function (framebuffer, updateScissor, resetTextures)
|
||||||
{
|
{
|
||||||
if (updateScissor === undefined) { updateScissor = false; }
|
if (updateScissor === undefined) { updateScissor = false; }
|
||||||
|
if (resetTextures === undefined) { resetTextures = true; }
|
||||||
|
|
||||||
if (framebuffer === this.currentFramebuffer)
|
if (framebuffer === this.currentFramebuffer)
|
||||||
{
|
{
|
||||||
|
@ -1564,9 +1597,38 @@ var WebGLRenderer = new Class({
|
||||||
|
|
||||||
this.currentFramebuffer = framebuffer;
|
this.currentFramebuffer = framebuffer;
|
||||||
|
|
||||||
|
if (resetTextures)
|
||||||
|
{
|
||||||
|
this.resetTextures();
|
||||||
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pops the previous framebuffer from the fbo stack and sets it.
|
||||||
|
*
|
||||||
|
* @method Phaser.Renderer.WebGL.WebGLRenderer#popFramebuffer
|
||||||
|
* @since 3.50.0
|
||||||
|
*/
|
||||||
|
popFramebuffer: function ()
|
||||||
|
{
|
||||||
|
var fboStack = this.fboStack;
|
||||||
|
|
||||||
|
// Remove the current fbo
|
||||||
|
fboStack.pop();
|
||||||
|
|
||||||
|
// Reset the previous framebuffer
|
||||||
|
var framebuffer = fboStack[fboStack.length - 1];
|
||||||
|
|
||||||
|
if (!framebuffer)
|
||||||
|
{
|
||||||
|
framebuffer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setFramebuffer(framebuffer);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Binds a shader program.
|
* Binds a shader program.
|
||||||
*
|
*
|
||||||
|
@ -1995,6 +2057,13 @@ var WebGLRenderer = new Class({
|
||||||
if (framebuffer)
|
if (framebuffer)
|
||||||
{
|
{
|
||||||
this.gl.deleteFramebuffer(framebuffer);
|
this.gl.deleteFramebuffer(framebuffer);
|
||||||
|
|
||||||
|
ArrayRemove(this.fboStack, framebuffer);
|
||||||
|
|
||||||
|
if (this.currentFramebuffer === framebuffer)
|
||||||
|
{
|
||||||
|
this.currentFramebuffer = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
|
@ -2847,6 +2916,7 @@ var WebGLRenderer = new Class({
|
||||||
this.pipelines.destroy();
|
this.pipelines.destroy();
|
||||||
this.defaultCamera.destroy();
|
this.defaultCamera.destroy();
|
||||||
|
|
||||||
|
this.fboStack = [];
|
||||||
this.maskStack = [];
|
this.maskStack = [];
|
||||||
this.extensions = {};
|
this.extensions = {};
|
||||||
this.textureIndexes = [];
|
this.textureIndexes = [];
|
||||||
|
|
Loading…
Reference in a new issue