|
5 | 5 | * @license {@link https://opensource.org/licenses/MIT|MIT License} |
6 | 6 | */ |
7 | 7 |
|
| 8 | +var ArrayRemove = require('../../utils/array/Remove'); |
8 | 9 | var BaseCamera = require('../../cameras/2d/BaseCamera'); |
9 | 10 | var CameraEvents = require('../../cameras/2d/events'); |
10 | 11 | var Class = require('../../utils/Class'); |
11 | 12 | var CONST = require('../../const'); |
12 | 13 | var GameEvents = require('../../core/events'); |
13 | 14 | var IsSizePowerOfTwo = require('../../math/pow2/IsSizePowerOfTwo'); |
14 | 15 | var NOOP = require('../../utils/NOOP'); |
15 | | -var PIPELINE_CONST = require('./pipelines/const'); |
16 | 16 | var PipelineManager = require('./PipelineManager'); |
17 | 17 | var ScaleEvents = require('../../scale/events'); |
18 | 18 | var TextureEvents = require('../../textures/events'); |
19 | | -var TransformMatrix = require('../../gameobjects/components/TransformMatrix'); |
20 | 19 | var Utils = require('./Utils'); |
21 | 20 | var WebGLSnapshot = require('../snapshot/WebGLSnapshot'); |
22 | 21 |
|
@@ -1508,19 +1507,53 @@ var WebGLRenderer = new Class({ |
1508 | 1507 | }, |
1509 | 1508 |
|
1510 | 1509 | /** |
1511 | | - * Binds a framebuffer. If there was another framebuffer already bound it will force a pipeline flush. |
| 1510 | + * Pushes a new framebuffer onto the FBO stack and makes it the currently bound framebuffer. |
| 1511 | + * |
| 1512 | + * If there was another framebuffer already bound it will force a pipeline flush. |
| 1513 | + * |
| 1514 | + * Call `popFramebuffer` to remove it again. |
| 1515 | + * |
| 1516 | + * @method Phaser.Renderer.WebGL.WebGLRenderer#pushFramebuffer |
| 1517 | + * @since 3.50.0 |
| 1518 | + * |
| 1519 | + * @param {WebGLFramebuffer} framebuffer - The framebuffer that needs to be bound. |
| 1520 | + * @param {boolean} [updateScissor=false] - Set the gl scissor to match the frame buffer size? Or, if `null` given, pop the scissor from the stack. |
| 1521 | + * @param {boolean} [resetTextures=true] - Should the WebGL Textures be reset after the new framebuffer is bound? |
| 1522 | + * |
| 1523 | + * @return {this} This WebGLRenderer instance. |
| 1524 | + */ |
| 1525 | + pushFramebuffer: function (framebuffer, updateScissor, resetTextures) |
| 1526 | + { |
| 1527 | + if (framebuffer === this.currentFramebuffer) |
| 1528 | + { |
| 1529 | + return this; |
| 1530 | + } |
| 1531 | + |
| 1532 | + this.fboStack.push(framebuffer); |
| 1533 | + |
| 1534 | + return this.setFramebuffer(framebuffer, updateScissor, resetTextures); |
| 1535 | + }, |
| 1536 | + |
| 1537 | + /** |
| 1538 | + * Sets the given framebuffer as the active and currently bound framebuffer. |
| 1539 | + * |
| 1540 | + * If there was another framebuffer already bound it will force a pipeline flush. |
| 1541 | + * |
| 1542 | + * Typically, you should call `pushFramebuffer` instead of this method. |
1512 | 1543 | * |
1513 | 1544 | * @method Phaser.Renderer.WebGL.WebGLRenderer#setFramebuffer |
1514 | 1545 | * @since 3.0.0 |
1515 | 1546 | * |
1516 | 1547 | * @param {WebGLFramebuffer} framebuffer - The framebuffer that needs to be bound. |
1517 | 1548 | * @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. |
| 1549 | + * @param {boolean} [resetTextures=true] - Should the WebGL Textures be reset after the new framebuffer is bound? |
1518 | 1550 | * |
1519 | 1551 | * @return {this} This WebGLRenderer instance. |
1520 | 1552 | */ |
1521 | | - setFramebuffer: function (framebuffer, updateScissor) |
| 1553 | + setFramebuffer: function (framebuffer, updateScissor, resetTextures) |
1522 | 1554 | { |
1523 | 1555 | if (updateScissor === undefined) { updateScissor = false; } |
| 1556 | + if (resetTextures === undefined) { resetTextures = true; } |
1524 | 1557 |
|
1525 | 1558 | if (framebuffer === this.currentFramebuffer) |
1526 | 1559 | { |
@@ -1564,9 +1597,38 @@ var WebGLRenderer = new Class({ |
1564 | 1597 |
|
1565 | 1598 | this.currentFramebuffer = framebuffer; |
1566 | 1599 |
|
| 1600 | + if (resetTextures) |
| 1601 | + { |
| 1602 | + this.resetTextures(); |
| 1603 | + } |
| 1604 | + |
1567 | 1605 | return this; |
1568 | 1606 | }, |
1569 | 1607 |
|
| 1608 | + /** |
| 1609 | + * Pops the previous framebuffer from the fbo stack and sets it. |
| 1610 | + * |
| 1611 | + * @method Phaser.Renderer.WebGL.WebGLRenderer#popFramebuffer |
| 1612 | + * @since 3.50.0 |
| 1613 | + */ |
| 1614 | + popFramebuffer: function () |
| 1615 | + { |
| 1616 | + var fboStack = this.fboStack; |
| 1617 | + |
| 1618 | + // Remove the current fbo |
| 1619 | + fboStack.pop(); |
| 1620 | + |
| 1621 | + // Reset the previous framebuffer |
| 1622 | + var framebuffer = fboStack[fboStack.length - 1]; |
| 1623 | + |
| 1624 | + if (!framebuffer) |
| 1625 | + { |
| 1626 | + framebuffer = null; |
| 1627 | + } |
| 1628 | + |
| 1629 | + this.setFramebuffer(framebuffer); |
| 1630 | + }, |
| 1631 | + |
1570 | 1632 | /** |
1571 | 1633 | * Binds a shader program. |
1572 | 1634 | * |
@@ -1995,6 +2057,13 @@ var WebGLRenderer = new Class({ |
1995 | 2057 | if (framebuffer) |
1996 | 2058 | { |
1997 | 2059 | this.gl.deleteFramebuffer(framebuffer); |
| 2060 | + |
| 2061 | + ArrayRemove(this.fboStack, framebuffer); |
| 2062 | + |
| 2063 | + if (this.currentFramebuffer === framebuffer) |
| 2064 | + { |
| 2065 | + this.currentFramebuffer = null; |
| 2066 | + } |
1998 | 2067 | } |
1999 | 2068 |
|
2000 | 2069 | return this; |
@@ -2847,6 +2916,7 @@ var WebGLRenderer = new Class({ |
2847 | 2916 | this.pipelines.destroy(); |
2848 | 2917 | this.defaultCamera.destroy(); |
2849 | 2918 |
|
| 2919 | + this.fboStack = []; |
2850 | 2920 | this.maskStack = []; |
2851 | 2921 | this.extensions = {}; |
2852 | 2922 | this.textureIndexes = []; |
|
0 commit comments