diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/StateSystem.js b/packages/core/src/renderers/systems/StateSystem.js index 54c158a..d7f4caf 100755 --- a/packages/core/src/renderers/systems/StateSystem.js +++ b/packages/core/src/renderers/systems/StateSystem.js @@ -11,8 +11,9 @@ /** * A WebGL state machines * - * @memberof PIXI * @class + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StateSystem extends WebGLSystem { diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/StateSystem.js b/packages/core/src/renderers/systems/StateSystem.js index 54c158a..d7f4caf 100755 --- a/packages/core/src/renderers/systems/StateSystem.js +++ b/packages/core/src/renderers/systems/StateSystem.js @@ -11,8 +11,9 @@ /** * A WebGL state machines * - * @memberof PIXI * @class + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StateSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/StencilSystem.js b/packages/core/src/renderers/systems/StencilSystem.js index 15e958a..5d538cb 100644 --- a/packages/core/src/renderers/systems/StencilSystem.js +++ b/packages/core/src/renderers/systems/StencilSystem.js @@ -2,8 +2,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StencilSystem extends WebGLSystem { diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/StateSystem.js b/packages/core/src/renderers/systems/StateSystem.js index 54c158a..d7f4caf 100755 --- a/packages/core/src/renderers/systems/StateSystem.js +++ b/packages/core/src/renderers/systems/StateSystem.js @@ -11,8 +11,9 @@ /** * A WebGL state machines * - * @memberof PIXI * @class + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StateSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/StencilSystem.js b/packages/core/src/renderers/systems/StencilSystem.js index 15e958a..5d538cb 100644 --- a/packages/core/src/renderers/systems/StencilSystem.js +++ b/packages/core/src/renderers/systems/StencilSystem.js @@ -2,8 +2,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StencilSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/WebGLSystem.js b/packages/core/src/renderers/systems/WebGLSystem.js index d6bb7e7..d3d5b31 100644 --- a/packages/core/src/renderers/systems/WebGLSystem.js +++ b/packages/core/src/renderers/systems/WebGLSystem.js @@ -1,6 +1,7 @@ /** * @class - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class WebGLSystem { diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/StateSystem.js b/packages/core/src/renderers/systems/StateSystem.js index 54c158a..d7f4caf 100755 --- a/packages/core/src/renderers/systems/StateSystem.js +++ b/packages/core/src/renderers/systems/StateSystem.js @@ -11,8 +11,9 @@ /** * A WebGL state machines * - * @memberof PIXI * @class + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StateSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/StencilSystem.js b/packages/core/src/renderers/systems/StencilSystem.js index 15e958a..5d538cb 100644 --- a/packages/core/src/renderers/systems/StencilSystem.js +++ b/packages/core/src/renderers/systems/StencilSystem.js @@ -2,8 +2,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StencilSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/WebGLSystem.js b/packages/core/src/renderers/systems/WebGLSystem.js index d6bb7e7..d3d5b31 100644 --- a/packages/core/src/renderers/systems/WebGLSystem.js +++ b/packages/core/src/renderers/systems/WebGLSystem.js @@ -1,6 +1,7 @@ /** * @class - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class WebGLSystem { diff --git a/packages/core/src/renderers/systems/filter/FilterSystem.js b/packages/core/src/renderers/systems/filter/FilterSystem.js index fdbe5ba..e615037 100644 --- a/packages/core/src/renderers/systems/filter/FilterSystem.js +++ b/packages/core/src/renderers/systems/filter/FilterSystem.js @@ -2,10 +2,12 @@ import RenderTexture from '../../../textures/RenderTexture'; import Quad from '../../utils/Quad'; +import QuadUv from '../../utils/QuadUv'; import { Rectangle } from '@pixi/math'; import * as filterTransforms from '../../filters/filterTransforms'; import bitTwiddle from 'bit-twiddle'; import UniformGroup from '../../../shader/UniformGroup'; +import { DRAW_MODES } from '../../../../../constants'; // /** @@ -24,14 +26,15 @@ this.destinationFrame = new Rectangle(); this.filters = []; this.target = null; + this.legacy = false; this.resolution = 1; } } /** * @class - * @memberof PIXI - * @extends PIXI.WebGLSystem + * @memberof PIXI.systems + * @extends PIXI.systems.WebGLSystem */ export default class FilterSystem extends WebGLSystem { @@ -60,6 +63,8 @@ */ this.quad = new Quad(); + this.quadUv = new QuadUv(); + /** * Temporary rect for maths * @type {PIXI.Rectangle} @@ -75,6 +80,10 @@ this.globalUniforms = new UniformGroup({ sourceFrame: this.tempRect, destinationFrame: this.tempRect, + + // legacy variables + filterArea: new Float32Array(4), + filterClamp: new Float32Array(4), }, true); } @@ -93,26 +102,31 @@ let resolution = filters[0].resolution; let padding = filters[0].padding; let autoFit = filters[0].autoFit; + let legacy = filters[0].legacy; for (let i = 1; i < filters.length; i++) { + const filter = filters[i]; + // lets use the lowest resolution.. - resolution = Math.min(resolution, filters[i].resolution); - // and the largest amout of padding! - padding = Math.max(padding, filters[i].padding); + resolution = Math.min(resolution, filter.resolution); + // and the largest amount of padding! + padding = Math.max(padding, filter.padding); // only auto fit if all filters are autofit - autoFit = autoFit || filters[i].autoFit; + autoFit = autoFit || filter.autoFit; + + legacy = legacy || filter.legacy; } filterStack.push(state); state.resolution = resolution; + state.legacy = legacy; + // round to whole number based on resolution // TODO move that to the shader too? - state.sourceFrame = target.filterArea ? this.transformFilterArea(this.tempRect, - target.filterArea, - target.transform) : target.getBounds(true); + state.sourceFrame = target.filterArea || target.getBounds(true); state.sourceFrame.pad(padding); @@ -153,6 +167,23 @@ globalUniforms.destinationFrame = state.destinationFrame; globalUniforms.resolution = state.resolution; + // only update the rect if its legacy.. + if (state.legacy) + { + const filterArea = globalUniforms.filterArea; + const filterClamp = globalUniforms.filterClamp; + + filterArea[0] = state.destinationFrame.width; + filterArea[1] = state.destinationFrame.height; + filterArea[2] = state.sourceFrame.x; + filterArea[3] = state.sourceFrame.y; + + filterClamp[0] = 0.5 / state.resolution / state.destinationFrame.width; + filterClamp[1] = 0.5 / state.resolution / state.destinationFrame.height; + filterClamp[2] = (state.sourceFrame.width - 0.5) / state.resolution / state.destinationFrame.width; + filterClamp[3] = (state.sourceFrame.height - 0.5) / state.resolution / state.destinationFrame.height; + } + this.globalUniforms.update(); const lastState = filterStack[filterStack.length - 1]; @@ -160,7 +191,6 @@ if (filters.length === 1) { filters[0].apply(this, state.renderTexture, lastState.renderTexture, false, state); - renderer.renderTexture.bind(null); this.returnFilterTexture(state.renderTexture); } @@ -227,8 +257,19 @@ renderer.state.setState(filter.state); renderer.shader.bind(filter); - renderer.geometry.bind(this.quad); - renderer.geometry.draw(5); + + if (filter.legacy) + { + this.quadUv.map(input._frame, input.filterFrame); + + renderer.geometry.bind(this.quadUv); + renderer.geometry.draw(DRAW_MODES.TRIANGLES); + } + else + { + renderer.geometry.bind(this.quad); + renderer.geometry.draw(DRAW_MODES.TRIANGLE_STRIP); + } } /** @@ -330,6 +371,12 @@ return renderTexture; } + /** + * Gets extra render texture to use inside current filter + * + * @param {number} resolution resolution of the renderTexture + * @returns {PIXI.RenderTexture} + */ getFilterTexture(resolution) { const rt = this.activeState.renderTexture; @@ -342,9 +389,9 @@ } /** - * Frees a render target back into the pool. + * Frees a render texture back into the pool. * - * @param {PIXI.RenderTarget} renderTarget - The renderTarget to free + * @param {PIXI.RenderTarget} renderTexture - The renderTarget to free */ returnFilterTexture(renderTexture) { @@ -381,64 +428,4 @@ this.texturePool = {}; } - - transformFilterArea(out, rectangle, transform) - { - const x0 = rectangle.x; - const y0 = rectangle.y; - - const x1 = rectangle.x + rectangle.width; - const y1 = rectangle.y + rectangle.height; - - const matrix = transform.worldTransform; - const a = matrix.a; - const b = matrix.b; - const c = matrix.c; - const d = matrix.d; - const tx = matrix.tx; - const ty = matrix.ty; - - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - - let x = (a * x0) + (c * y0) + tx; - let y = (b * x0) + (d * y0) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y0) + tx; - y = (b * x1) + (d * y0) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x0) + (c * y1) + tx; - y = (b * x0) + (d * y1) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y1) + tx; - y = (b * x1) + (d * y1) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - out.x = minX; - out.y = minY; - - out.width = maxX - minX; - out.height = maxY - minY; - - return out; - } } diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/StateSystem.js b/packages/core/src/renderers/systems/StateSystem.js index 54c158a..d7f4caf 100755 --- a/packages/core/src/renderers/systems/StateSystem.js +++ b/packages/core/src/renderers/systems/StateSystem.js @@ -11,8 +11,9 @@ /** * A WebGL state machines * - * @memberof PIXI * @class + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StateSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/StencilSystem.js b/packages/core/src/renderers/systems/StencilSystem.js index 15e958a..5d538cb 100644 --- a/packages/core/src/renderers/systems/StencilSystem.js +++ b/packages/core/src/renderers/systems/StencilSystem.js @@ -2,8 +2,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StencilSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/WebGLSystem.js b/packages/core/src/renderers/systems/WebGLSystem.js index d6bb7e7..d3d5b31 100644 --- a/packages/core/src/renderers/systems/WebGLSystem.js +++ b/packages/core/src/renderers/systems/WebGLSystem.js @@ -1,6 +1,7 @@ /** * @class - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class WebGLSystem { diff --git a/packages/core/src/renderers/systems/filter/FilterSystem.js b/packages/core/src/renderers/systems/filter/FilterSystem.js index fdbe5ba..e615037 100644 --- a/packages/core/src/renderers/systems/filter/FilterSystem.js +++ b/packages/core/src/renderers/systems/filter/FilterSystem.js @@ -2,10 +2,12 @@ import RenderTexture from '../../../textures/RenderTexture'; import Quad from '../../utils/Quad'; +import QuadUv from '../../utils/QuadUv'; import { Rectangle } from '@pixi/math'; import * as filterTransforms from '../../filters/filterTransforms'; import bitTwiddle from 'bit-twiddle'; import UniformGroup from '../../../shader/UniformGroup'; +import { DRAW_MODES } from '../../../../../constants'; // /** @@ -24,14 +26,15 @@ this.destinationFrame = new Rectangle(); this.filters = []; this.target = null; + this.legacy = false; this.resolution = 1; } } /** * @class - * @memberof PIXI - * @extends PIXI.WebGLSystem + * @memberof PIXI.systems + * @extends PIXI.systems.WebGLSystem */ export default class FilterSystem extends WebGLSystem { @@ -60,6 +63,8 @@ */ this.quad = new Quad(); + this.quadUv = new QuadUv(); + /** * Temporary rect for maths * @type {PIXI.Rectangle} @@ -75,6 +80,10 @@ this.globalUniforms = new UniformGroup({ sourceFrame: this.tempRect, destinationFrame: this.tempRect, + + // legacy variables + filterArea: new Float32Array(4), + filterClamp: new Float32Array(4), }, true); } @@ -93,26 +102,31 @@ let resolution = filters[0].resolution; let padding = filters[0].padding; let autoFit = filters[0].autoFit; + let legacy = filters[0].legacy; for (let i = 1; i < filters.length; i++) { + const filter = filters[i]; + // lets use the lowest resolution.. - resolution = Math.min(resolution, filters[i].resolution); - // and the largest amout of padding! - padding = Math.max(padding, filters[i].padding); + resolution = Math.min(resolution, filter.resolution); + // and the largest amount of padding! + padding = Math.max(padding, filter.padding); // only auto fit if all filters are autofit - autoFit = autoFit || filters[i].autoFit; + autoFit = autoFit || filter.autoFit; + + legacy = legacy || filter.legacy; } filterStack.push(state); state.resolution = resolution; + state.legacy = legacy; + // round to whole number based on resolution // TODO move that to the shader too? - state.sourceFrame = target.filterArea ? this.transformFilterArea(this.tempRect, - target.filterArea, - target.transform) : target.getBounds(true); + state.sourceFrame = target.filterArea || target.getBounds(true); state.sourceFrame.pad(padding); @@ -153,6 +167,23 @@ globalUniforms.destinationFrame = state.destinationFrame; globalUniforms.resolution = state.resolution; + // only update the rect if its legacy.. + if (state.legacy) + { + const filterArea = globalUniforms.filterArea; + const filterClamp = globalUniforms.filterClamp; + + filterArea[0] = state.destinationFrame.width; + filterArea[1] = state.destinationFrame.height; + filterArea[2] = state.sourceFrame.x; + filterArea[3] = state.sourceFrame.y; + + filterClamp[0] = 0.5 / state.resolution / state.destinationFrame.width; + filterClamp[1] = 0.5 / state.resolution / state.destinationFrame.height; + filterClamp[2] = (state.sourceFrame.width - 0.5) / state.resolution / state.destinationFrame.width; + filterClamp[3] = (state.sourceFrame.height - 0.5) / state.resolution / state.destinationFrame.height; + } + this.globalUniforms.update(); const lastState = filterStack[filterStack.length - 1]; @@ -160,7 +191,6 @@ if (filters.length === 1) { filters[0].apply(this, state.renderTexture, lastState.renderTexture, false, state); - renderer.renderTexture.bind(null); this.returnFilterTexture(state.renderTexture); } @@ -227,8 +257,19 @@ renderer.state.setState(filter.state); renderer.shader.bind(filter); - renderer.geometry.bind(this.quad); - renderer.geometry.draw(5); + + if (filter.legacy) + { + this.quadUv.map(input._frame, input.filterFrame); + + renderer.geometry.bind(this.quadUv); + renderer.geometry.draw(DRAW_MODES.TRIANGLES); + } + else + { + renderer.geometry.bind(this.quad); + renderer.geometry.draw(DRAW_MODES.TRIANGLE_STRIP); + } } /** @@ -330,6 +371,12 @@ return renderTexture; } + /** + * Gets extra render texture to use inside current filter + * + * @param {number} resolution resolution of the renderTexture + * @returns {PIXI.RenderTexture} + */ getFilterTexture(resolution) { const rt = this.activeState.renderTexture; @@ -342,9 +389,9 @@ } /** - * Frees a render target back into the pool. + * Frees a render texture back into the pool. * - * @param {PIXI.RenderTarget} renderTarget - The renderTarget to free + * @param {PIXI.RenderTarget} renderTexture - The renderTarget to free */ returnFilterTexture(renderTexture) { @@ -381,64 +428,4 @@ this.texturePool = {}; } - - transformFilterArea(out, rectangle, transform) - { - const x0 = rectangle.x; - const y0 = rectangle.y; - - const x1 = rectangle.x + rectangle.width; - const y1 = rectangle.y + rectangle.height; - - const matrix = transform.worldTransform; - const a = matrix.a; - const b = matrix.b; - const c = matrix.c; - const d = matrix.d; - const tx = matrix.tx; - const ty = matrix.ty; - - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - - let x = (a * x0) + (c * y0) + tx; - let y = (b * x0) + (d * y0) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y0) + tx; - y = (b * x1) + (d * y0) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x0) + (c * y1) + tx; - y = (b * x0) + (d * y1) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y1) + tx; - y = (b * x1) + (d * y1) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - out.x = minX; - out.y = minY; - - out.width = maxX - minX; - out.height = maxY - minY; - - return out; - } } diff --git a/packages/core/src/renderers/systems/index.js b/packages/core/src/renderers/systems/index.js new file mode 100644 index 0000000..c843f03 --- /dev/null +++ b/packages/core/src/renderers/systems/index.js @@ -0,0 +1,6 @@ +/** + * Systems are individual components to the Renderer pipeline. + * @namespace PIXI.systems + */ +export { default as WebGLSystem } from './WebGLSystem'; +export { default as FilterSystem } from './filter/FilterSystem'; diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/StateSystem.js b/packages/core/src/renderers/systems/StateSystem.js index 54c158a..d7f4caf 100755 --- a/packages/core/src/renderers/systems/StateSystem.js +++ b/packages/core/src/renderers/systems/StateSystem.js @@ -11,8 +11,9 @@ /** * A WebGL state machines * - * @memberof PIXI * @class + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StateSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/StencilSystem.js b/packages/core/src/renderers/systems/StencilSystem.js index 15e958a..5d538cb 100644 --- a/packages/core/src/renderers/systems/StencilSystem.js +++ b/packages/core/src/renderers/systems/StencilSystem.js @@ -2,8 +2,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StencilSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/WebGLSystem.js b/packages/core/src/renderers/systems/WebGLSystem.js index d6bb7e7..d3d5b31 100644 --- a/packages/core/src/renderers/systems/WebGLSystem.js +++ b/packages/core/src/renderers/systems/WebGLSystem.js @@ -1,6 +1,7 @@ /** * @class - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class WebGLSystem { diff --git a/packages/core/src/renderers/systems/filter/FilterSystem.js b/packages/core/src/renderers/systems/filter/FilterSystem.js index fdbe5ba..e615037 100644 --- a/packages/core/src/renderers/systems/filter/FilterSystem.js +++ b/packages/core/src/renderers/systems/filter/FilterSystem.js @@ -2,10 +2,12 @@ import RenderTexture from '../../../textures/RenderTexture'; import Quad from '../../utils/Quad'; +import QuadUv from '../../utils/QuadUv'; import { Rectangle } from '@pixi/math'; import * as filterTransforms from '../../filters/filterTransforms'; import bitTwiddle from 'bit-twiddle'; import UniformGroup from '../../../shader/UniformGroup'; +import { DRAW_MODES } from '../../../../../constants'; // /** @@ -24,14 +26,15 @@ this.destinationFrame = new Rectangle(); this.filters = []; this.target = null; + this.legacy = false; this.resolution = 1; } } /** * @class - * @memberof PIXI - * @extends PIXI.WebGLSystem + * @memberof PIXI.systems + * @extends PIXI.systems.WebGLSystem */ export default class FilterSystem extends WebGLSystem { @@ -60,6 +63,8 @@ */ this.quad = new Quad(); + this.quadUv = new QuadUv(); + /** * Temporary rect for maths * @type {PIXI.Rectangle} @@ -75,6 +80,10 @@ this.globalUniforms = new UniformGroup({ sourceFrame: this.tempRect, destinationFrame: this.tempRect, + + // legacy variables + filterArea: new Float32Array(4), + filterClamp: new Float32Array(4), }, true); } @@ -93,26 +102,31 @@ let resolution = filters[0].resolution; let padding = filters[0].padding; let autoFit = filters[0].autoFit; + let legacy = filters[0].legacy; for (let i = 1; i < filters.length; i++) { + const filter = filters[i]; + // lets use the lowest resolution.. - resolution = Math.min(resolution, filters[i].resolution); - // and the largest amout of padding! - padding = Math.max(padding, filters[i].padding); + resolution = Math.min(resolution, filter.resolution); + // and the largest amount of padding! + padding = Math.max(padding, filter.padding); // only auto fit if all filters are autofit - autoFit = autoFit || filters[i].autoFit; + autoFit = autoFit || filter.autoFit; + + legacy = legacy || filter.legacy; } filterStack.push(state); state.resolution = resolution; + state.legacy = legacy; + // round to whole number based on resolution // TODO move that to the shader too? - state.sourceFrame = target.filterArea ? this.transformFilterArea(this.tempRect, - target.filterArea, - target.transform) : target.getBounds(true); + state.sourceFrame = target.filterArea || target.getBounds(true); state.sourceFrame.pad(padding); @@ -153,6 +167,23 @@ globalUniforms.destinationFrame = state.destinationFrame; globalUniforms.resolution = state.resolution; + // only update the rect if its legacy.. + if (state.legacy) + { + const filterArea = globalUniforms.filterArea; + const filterClamp = globalUniforms.filterClamp; + + filterArea[0] = state.destinationFrame.width; + filterArea[1] = state.destinationFrame.height; + filterArea[2] = state.sourceFrame.x; + filterArea[3] = state.sourceFrame.y; + + filterClamp[0] = 0.5 / state.resolution / state.destinationFrame.width; + filterClamp[1] = 0.5 / state.resolution / state.destinationFrame.height; + filterClamp[2] = (state.sourceFrame.width - 0.5) / state.resolution / state.destinationFrame.width; + filterClamp[3] = (state.sourceFrame.height - 0.5) / state.resolution / state.destinationFrame.height; + } + this.globalUniforms.update(); const lastState = filterStack[filterStack.length - 1]; @@ -160,7 +191,6 @@ if (filters.length === 1) { filters[0].apply(this, state.renderTexture, lastState.renderTexture, false, state); - renderer.renderTexture.bind(null); this.returnFilterTexture(state.renderTexture); } @@ -227,8 +257,19 @@ renderer.state.setState(filter.state); renderer.shader.bind(filter); - renderer.geometry.bind(this.quad); - renderer.geometry.draw(5); + + if (filter.legacy) + { + this.quadUv.map(input._frame, input.filterFrame); + + renderer.geometry.bind(this.quadUv); + renderer.geometry.draw(DRAW_MODES.TRIANGLES); + } + else + { + renderer.geometry.bind(this.quad); + renderer.geometry.draw(DRAW_MODES.TRIANGLE_STRIP); + } } /** @@ -330,6 +371,12 @@ return renderTexture; } + /** + * Gets extra render texture to use inside current filter + * + * @param {number} resolution resolution of the renderTexture + * @returns {PIXI.RenderTexture} + */ getFilterTexture(resolution) { const rt = this.activeState.renderTexture; @@ -342,9 +389,9 @@ } /** - * Frees a render target back into the pool. + * Frees a render texture back into the pool. * - * @param {PIXI.RenderTarget} renderTarget - The renderTarget to free + * @param {PIXI.RenderTarget} renderTexture - The renderTarget to free */ returnFilterTexture(renderTexture) { @@ -381,64 +428,4 @@ this.texturePool = {}; } - - transformFilterArea(out, rectangle, transform) - { - const x0 = rectangle.x; - const y0 = rectangle.y; - - const x1 = rectangle.x + rectangle.width; - const y1 = rectangle.y + rectangle.height; - - const matrix = transform.worldTransform; - const a = matrix.a; - const b = matrix.b; - const c = matrix.c; - const d = matrix.d; - const tx = matrix.tx; - const ty = matrix.ty; - - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - - let x = (a * x0) + (c * y0) + tx; - let y = (b * x0) + (d * y0) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y0) + tx; - y = (b * x1) + (d * y0) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x0) + (c * y1) + tx; - y = (b * x0) + (d * y1) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y1) + tx; - y = (b * x1) + (d * y1) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - out.x = minX; - out.y = minY; - - out.width = maxX - minX; - out.height = maxY - minY; - - return out; - } } diff --git a/packages/core/src/renderers/systems/index.js b/packages/core/src/renderers/systems/index.js new file mode 100644 index 0000000..c843f03 --- /dev/null +++ b/packages/core/src/renderers/systems/index.js @@ -0,0 +1,6 @@ +/** + * Systems are individual components to the Renderer pipeline. + * @namespace PIXI.systems + */ +export { default as WebGLSystem } from './WebGLSystem'; +export { default as FilterSystem } from './filter/FilterSystem'; diff --git a/packages/core/src/renderers/utils/Quad.js b/packages/core/src/renderers/utils/Quad.js index 34f02b4..5c1517b 100644 --- a/packages/core/src/renderers/utils/Quad.js +++ b/packages/core/src/renderers/utils/Quad.js @@ -9,8 +9,7 @@ export default class Quad extends Geometry { /** - * @param {WebGLRenderingContext} gl - The gl context for this quad to use. - * @param {object} state - TODO: Description + * just a quad */ constructor() { diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/StateSystem.js b/packages/core/src/renderers/systems/StateSystem.js index 54c158a..d7f4caf 100755 --- a/packages/core/src/renderers/systems/StateSystem.js +++ b/packages/core/src/renderers/systems/StateSystem.js @@ -11,8 +11,9 @@ /** * A WebGL state machines * - * @memberof PIXI * @class + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StateSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/StencilSystem.js b/packages/core/src/renderers/systems/StencilSystem.js index 15e958a..5d538cb 100644 --- a/packages/core/src/renderers/systems/StencilSystem.js +++ b/packages/core/src/renderers/systems/StencilSystem.js @@ -2,8 +2,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StencilSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/WebGLSystem.js b/packages/core/src/renderers/systems/WebGLSystem.js index d6bb7e7..d3d5b31 100644 --- a/packages/core/src/renderers/systems/WebGLSystem.js +++ b/packages/core/src/renderers/systems/WebGLSystem.js @@ -1,6 +1,7 @@ /** * @class - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class WebGLSystem { diff --git a/packages/core/src/renderers/systems/filter/FilterSystem.js b/packages/core/src/renderers/systems/filter/FilterSystem.js index fdbe5ba..e615037 100644 --- a/packages/core/src/renderers/systems/filter/FilterSystem.js +++ b/packages/core/src/renderers/systems/filter/FilterSystem.js @@ -2,10 +2,12 @@ import RenderTexture from '../../../textures/RenderTexture'; import Quad from '../../utils/Quad'; +import QuadUv from '../../utils/QuadUv'; import { Rectangle } from '@pixi/math'; import * as filterTransforms from '../../filters/filterTransforms'; import bitTwiddle from 'bit-twiddle'; import UniformGroup from '../../../shader/UniformGroup'; +import { DRAW_MODES } from '../../../../../constants'; // /** @@ -24,14 +26,15 @@ this.destinationFrame = new Rectangle(); this.filters = []; this.target = null; + this.legacy = false; this.resolution = 1; } } /** * @class - * @memberof PIXI - * @extends PIXI.WebGLSystem + * @memberof PIXI.systems + * @extends PIXI.systems.WebGLSystem */ export default class FilterSystem extends WebGLSystem { @@ -60,6 +63,8 @@ */ this.quad = new Quad(); + this.quadUv = new QuadUv(); + /** * Temporary rect for maths * @type {PIXI.Rectangle} @@ -75,6 +80,10 @@ this.globalUniforms = new UniformGroup({ sourceFrame: this.tempRect, destinationFrame: this.tempRect, + + // legacy variables + filterArea: new Float32Array(4), + filterClamp: new Float32Array(4), }, true); } @@ -93,26 +102,31 @@ let resolution = filters[0].resolution; let padding = filters[0].padding; let autoFit = filters[0].autoFit; + let legacy = filters[0].legacy; for (let i = 1; i < filters.length; i++) { + const filter = filters[i]; + // lets use the lowest resolution.. - resolution = Math.min(resolution, filters[i].resolution); - // and the largest amout of padding! - padding = Math.max(padding, filters[i].padding); + resolution = Math.min(resolution, filter.resolution); + // and the largest amount of padding! + padding = Math.max(padding, filter.padding); // only auto fit if all filters are autofit - autoFit = autoFit || filters[i].autoFit; + autoFit = autoFit || filter.autoFit; + + legacy = legacy || filter.legacy; } filterStack.push(state); state.resolution = resolution; + state.legacy = legacy; + // round to whole number based on resolution // TODO move that to the shader too? - state.sourceFrame = target.filterArea ? this.transformFilterArea(this.tempRect, - target.filterArea, - target.transform) : target.getBounds(true); + state.sourceFrame = target.filterArea || target.getBounds(true); state.sourceFrame.pad(padding); @@ -153,6 +167,23 @@ globalUniforms.destinationFrame = state.destinationFrame; globalUniforms.resolution = state.resolution; + // only update the rect if its legacy.. + if (state.legacy) + { + const filterArea = globalUniforms.filterArea; + const filterClamp = globalUniforms.filterClamp; + + filterArea[0] = state.destinationFrame.width; + filterArea[1] = state.destinationFrame.height; + filterArea[2] = state.sourceFrame.x; + filterArea[3] = state.sourceFrame.y; + + filterClamp[0] = 0.5 / state.resolution / state.destinationFrame.width; + filterClamp[1] = 0.5 / state.resolution / state.destinationFrame.height; + filterClamp[2] = (state.sourceFrame.width - 0.5) / state.resolution / state.destinationFrame.width; + filterClamp[3] = (state.sourceFrame.height - 0.5) / state.resolution / state.destinationFrame.height; + } + this.globalUniforms.update(); const lastState = filterStack[filterStack.length - 1]; @@ -160,7 +191,6 @@ if (filters.length === 1) { filters[0].apply(this, state.renderTexture, lastState.renderTexture, false, state); - renderer.renderTexture.bind(null); this.returnFilterTexture(state.renderTexture); } @@ -227,8 +257,19 @@ renderer.state.setState(filter.state); renderer.shader.bind(filter); - renderer.geometry.bind(this.quad); - renderer.geometry.draw(5); + + if (filter.legacy) + { + this.quadUv.map(input._frame, input.filterFrame); + + renderer.geometry.bind(this.quadUv); + renderer.geometry.draw(DRAW_MODES.TRIANGLES); + } + else + { + renderer.geometry.bind(this.quad); + renderer.geometry.draw(DRAW_MODES.TRIANGLE_STRIP); + } } /** @@ -330,6 +371,12 @@ return renderTexture; } + /** + * Gets extra render texture to use inside current filter + * + * @param {number} resolution resolution of the renderTexture + * @returns {PIXI.RenderTexture} + */ getFilterTexture(resolution) { const rt = this.activeState.renderTexture; @@ -342,9 +389,9 @@ } /** - * Frees a render target back into the pool. + * Frees a render texture back into the pool. * - * @param {PIXI.RenderTarget} renderTarget - The renderTarget to free + * @param {PIXI.RenderTarget} renderTexture - The renderTarget to free */ returnFilterTexture(renderTexture) { @@ -381,64 +428,4 @@ this.texturePool = {}; } - - transformFilterArea(out, rectangle, transform) - { - const x0 = rectangle.x; - const y0 = rectangle.y; - - const x1 = rectangle.x + rectangle.width; - const y1 = rectangle.y + rectangle.height; - - const matrix = transform.worldTransform; - const a = matrix.a; - const b = matrix.b; - const c = matrix.c; - const d = matrix.d; - const tx = matrix.tx; - const ty = matrix.ty; - - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - - let x = (a * x0) + (c * y0) + tx; - let y = (b * x0) + (d * y0) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y0) + tx; - y = (b * x1) + (d * y0) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x0) + (c * y1) + tx; - y = (b * x0) + (d * y1) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y1) + tx; - y = (b * x1) + (d * y1) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - out.x = minX; - out.y = minY; - - out.width = maxX - minX; - out.height = maxY - minY; - - return out; - } } diff --git a/packages/core/src/renderers/systems/index.js b/packages/core/src/renderers/systems/index.js new file mode 100644 index 0000000..c843f03 --- /dev/null +++ b/packages/core/src/renderers/systems/index.js @@ -0,0 +1,6 @@ +/** + * Systems are individual components to the Renderer pipeline. + * @namespace PIXI.systems + */ +export { default as WebGLSystem } from './WebGLSystem'; +export { default as FilterSystem } from './filter/FilterSystem'; diff --git a/packages/core/src/renderers/utils/Quad.js b/packages/core/src/renderers/utils/Quad.js index 34f02b4..5c1517b 100644 --- a/packages/core/src/renderers/utils/Quad.js +++ b/packages/core/src/renderers/utils/Quad.js @@ -9,8 +9,7 @@ export default class Quad extends Geometry { /** - * @param {WebGLRenderingContext} gl - The gl context for this quad to use. - * @param {object} state - TODO: Description + * just a quad */ constructor() { diff --git a/packages/core/src/renderers/utils/QuadUv.js b/packages/core/src/renderers/utils/QuadUv.js new file mode 100644 index 0000000..97bda89 --- /dev/null +++ b/packages/core/src/renderers/utils/QuadUv.js @@ -0,0 +1,103 @@ +import Geometry from '../../geometry/Geometry'; +import Buffer from '../../geometry/Buffer'; + +/** + * Helper class to create a quad with uvs like in v4 + * + * @class + * @memberof PIXI + */ +export default class QuadUv extends Geometry +{ + constructor() + { + super(); + + /** + * An array of vertices + * + * @member {Float32Array} + */ + this.vertices = new Float32Array([ + -1, -1, + 1, -1, + 1, 1, + -1, 1, + ]); + + /** + * The Uvs of the quad + * + * @member {Float32Array} + */ + this.uvs = new Float32Array([ + 0, 0, + 1, 0, + 1, 1, + 0, 1, + ]); + + this.vertexBuffer = new Buffer(this.vertices); + this.uvBuffer = new Buffer(this.uvs); + + this.addAttribute('aVertexPosition', this.vertexBuffer) + .addAttribute('aTextureCoord', this.uvBuffer) + .addIndex([0, 1, 2, 0, 2, 3]); + } + + /** + * Maps two Rectangle to the quad. + * + * @param {PIXI.Rectangle} targetTextureFrame - the first rectangle + * @param {PIXI.Rectangle} destinationFrame - the second rectangle + * @return {PIXI.Quad} Returns itself. + */ + map(targetTextureFrame, destinationFrame) + { + let x = 0; // destinationFrame.x / targetTextureFrame.width; + let y = 0; // destinationFrame.y / targetTextureFrame.height; + + this.uvs[0] = x; + this.uvs[1] = y; + + this.uvs[2] = x + (destinationFrame.width / targetTextureFrame.width); + this.uvs[3] = y; + + this.uvs[4] = x + (destinationFrame.width / targetTextureFrame.width); + this.uvs[5] = y + (destinationFrame.height / targetTextureFrame.height); + + this.uvs[6] = x; + this.uvs[7] = y + (destinationFrame.height / targetTextureFrame.height); + + x = destinationFrame.x; + y = destinationFrame.y; + + this.vertices[0] = x; + this.vertices[1] = y; + + this.vertices[2] = x + destinationFrame.width; + this.vertices[3] = y; + + this.vertices[4] = x + destinationFrame.width; + this.vertices[5] = y + destinationFrame.height; + + this.vertices[6] = x; + this.vertices[7] = y + destinationFrame.height; + + this.invalidate(); + + return this; + } + + /** + * legacy upload method, just marks buffers dirty + * @returns {PIXI.QuadUv} Returns itself. + */ + invalidate() + { + this.vertexBuffer._updateID++; + this.uvBuffer._updateID++; + + return this; + } +} diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/StateSystem.js b/packages/core/src/renderers/systems/StateSystem.js index 54c158a..d7f4caf 100755 --- a/packages/core/src/renderers/systems/StateSystem.js +++ b/packages/core/src/renderers/systems/StateSystem.js @@ -11,8 +11,9 @@ /** * A WebGL state machines * - * @memberof PIXI * @class + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StateSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/StencilSystem.js b/packages/core/src/renderers/systems/StencilSystem.js index 15e958a..5d538cb 100644 --- a/packages/core/src/renderers/systems/StencilSystem.js +++ b/packages/core/src/renderers/systems/StencilSystem.js @@ -2,8 +2,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StencilSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/WebGLSystem.js b/packages/core/src/renderers/systems/WebGLSystem.js index d6bb7e7..d3d5b31 100644 --- a/packages/core/src/renderers/systems/WebGLSystem.js +++ b/packages/core/src/renderers/systems/WebGLSystem.js @@ -1,6 +1,7 @@ /** * @class - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class WebGLSystem { diff --git a/packages/core/src/renderers/systems/filter/FilterSystem.js b/packages/core/src/renderers/systems/filter/FilterSystem.js index fdbe5ba..e615037 100644 --- a/packages/core/src/renderers/systems/filter/FilterSystem.js +++ b/packages/core/src/renderers/systems/filter/FilterSystem.js @@ -2,10 +2,12 @@ import RenderTexture from '../../../textures/RenderTexture'; import Quad from '../../utils/Quad'; +import QuadUv from '../../utils/QuadUv'; import { Rectangle } from '@pixi/math'; import * as filterTransforms from '../../filters/filterTransforms'; import bitTwiddle from 'bit-twiddle'; import UniformGroup from '../../../shader/UniformGroup'; +import { DRAW_MODES } from '../../../../../constants'; // /** @@ -24,14 +26,15 @@ this.destinationFrame = new Rectangle(); this.filters = []; this.target = null; + this.legacy = false; this.resolution = 1; } } /** * @class - * @memberof PIXI - * @extends PIXI.WebGLSystem + * @memberof PIXI.systems + * @extends PIXI.systems.WebGLSystem */ export default class FilterSystem extends WebGLSystem { @@ -60,6 +63,8 @@ */ this.quad = new Quad(); + this.quadUv = new QuadUv(); + /** * Temporary rect for maths * @type {PIXI.Rectangle} @@ -75,6 +80,10 @@ this.globalUniforms = new UniformGroup({ sourceFrame: this.tempRect, destinationFrame: this.tempRect, + + // legacy variables + filterArea: new Float32Array(4), + filterClamp: new Float32Array(4), }, true); } @@ -93,26 +102,31 @@ let resolution = filters[0].resolution; let padding = filters[0].padding; let autoFit = filters[0].autoFit; + let legacy = filters[0].legacy; for (let i = 1; i < filters.length; i++) { + const filter = filters[i]; + // lets use the lowest resolution.. - resolution = Math.min(resolution, filters[i].resolution); - // and the largest amout of padding! - padding = Math.max(padding, filters[i].padding); + resolution = Math.min(resolution, filter.resolution); + // and the largest amount of padding! + padding = Math.max(padding, filter.padding); // only auto fit if all filters are autofit - autoFit = autoFit || filters[i].autoFit; + autoFit = autoFit || filter.autoFit; + + legacy = legacy || filter.legacy; } filterStack.push(state); state.resolution = resolution; + state.legacy = legacy; + // round to whole number based on resolution // TODO move that to the shader too? - state.sourceFrame = target.filterArea ? this.transformFilterArea(this.tempRect, - target.filterArea, - target.transform) : target.getBounds(true); + state.sourceFrame = target.filterArea || target.getBounds(true); state.sourceFrame.pad(padding); @@ -153,6 +167,23 @@ globalUniforms.destinationFrame = state.destinationFrame; globalUniforms.resolution = state.resolution; + // only update the rect if its legacy.. + if (state.legacy) + { + const filterArea = globalUniforms.filterArea; + const filterClamp = globalUniforms.filterClamp; + + filterArea[0] = state.destinationFrame.width; + filterArea[1] = state.destinationFrame.height; + filterArea[2] = state.sourceFrame.x; + filterArea[3] = state.sourceFrame.y; + + filterClamp[0] = 0.5 / state.resolution / state.destinationFrame.width; + filterClamp[1] = 0.5 / state.resolution / state.destinationFrame.height; + filterClamp[2] = (state.sourceFrame.width - 0.5) / state.resolution / state.destinationFrame.width; + filterClamp[3] = (state.sourceFrame.height - 0.5) / state.resolution / state.destinationFrame.height; + } + this.globalUniforms.update(); const lastState = filterStack[filterStack.length - 1]; @@ -160,7 +191,6 @@ if (filters.length === 1) { filters[0].apply(this, state.renderTexture, lastState.renderTexture, false, state); - renderer.renderTexture.bind(null); this.returnFilterTexture(state.renderTexture); } @@ -227,8 +257,19 @@ renderer.state.setState(filter.state); renderer.shader.bind(filter); - renderer.geometry.bind(this.quad); - renderer.geometry.draw(5); + + if (filter.legacy) + { + this.quadUv.map(input._frame, input.filterFrame); + + renderer.geometry.bind(this.quadUv); + renderer.geometry.draw(DRAW_MODES.TRIANGLES); + } + else + { + renderer.geometry.bind(this.quad); + renderer.geometry.draw(DRAW_MODES.TRIANGLE_STRIP); + } } /** @@ -330,6 +371,12 @@ return renderTexture; } + /** + * Gets extra render texture to use inside current filter + * + * @param {number} resolution resolution of the renderTexture + * @returns {PIXI.RenderTexture} + */ getFilterTexture(resolution) { const rt = this.activeState.renderTexture; @@ -342,9 +389,9 @@ } /** - * Frees a render target back into the pool. + * Frees a render texture back into the pool. * - * @param {PIXI.RenderTarget} renderTarget - The renderTarget to free + * @param {PIXI.RenderTarget} renderTexture - The renderTarget to free */ returnFilterTexture(renderTexture) { @@ -381,64 +428,4 @@ this.texturePool = {}; } - - transformFilterArea(out, rectangle, transform) - { - const x0 = rectangle.x; - const y0 = rectangle.y; - - const x1 = rectangle.x + rectangle.width; - const y1 = rectangle.y + rectangle.height; - - const matrix = transform.worldTransform; - const a = matrix.a; - const b = matrix.b; - const c = matrix.c; - const d = matrix.d; - const tx = matrix.tx; - const ty = matrix.ty; - - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - - let x = (a * x0) + (c * y0) + tx; - let y = (b * x0) + (d * y0) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y0) + tx; - y = (b * x1) + (d * y0) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x0) + (c * y1) + tx; - y = (b * x0) + (d * y1) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y1) + tx; - y = (b * x1) + (d * y1) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - out.x = minX; - out.y = minY; - - out.width = maxX - minX; - out.height = maxY - minY; - - return out; - } } diff --git a/packages/core/src/renderers/systems/index.js b/packages/core/src/renderers/systems/index.js new file mode 100644 index 0000000..c843f03 --- /dev/null +++ b/packages/core/src/renderers/systems/index.js @@ -0,0 +1,6 @@ +/** + * Systems are individual components to the Renderer pipeline. + * @namespace PIXI.systems + */ +export { default as WebGLSystem } from './WebGLSystem'; +export { default as FilterSystem } from './filter/FilterSystem'; diff --git a/packages/core/src/renderers/utils/Quad.js b/packages/core/src/renderers/utils/Quad.js index 34f02b4..5c1517b 100644 --- a/packages/core/src/renderers/utils/Quad.js +++ b/packages/core/src/renderers/utils/Quad.js @@ -9,8 +9,7 @@ export default class Quad extends Geometry { /** - * @param {WebGLRenderingContext} gl - The gl context for this quad to use. - * @param {object} state - TODO: Description + * just a quad */ constructor() { diff --git a/packages/core/src/renderers/utils/QuadUv.js b/packages/core/src/renderers/utils/QuadUv.js new file mode 100644 index 0000000..97bda89 --- /dev/null +++ b/packages/core/src/renderers/utils/QuadUv.js @@ -0,0 +1,103 @@ +import Geometry from '../../geometry/Geometry'; +import Buffer from '../../geometry/Buffer'; + +/** + * Helper class to create a quad with uvs like in v4 + * + * @class + * @memberof PIXI + */ +export default class QuadUv extends Geometry +{ + constructor() + { + super(); + + /** + * An array of vertices + * + * @member {Float32Array} + */ + this.vertices = new Float32Array([ + -1, -1, + 1, -1, + 1, 1, + -1, 1, + ]); + + /** + * The Uvs of the quad + * + * @member {Float32Array} + */ + this.uvs = new Float32Array([ + 0, 0, + 1, 0, + 1, 1, + 0, 1, + ]); + + this.vertexBuffer = new Buffer(this.vertices); + this.uvBuffer = new Buffer(this.uvs); + + this.addAttribute('aVertexPosition', this.vertexBuffer) + .addAttribute('aTextureCoord', this.uvBuffer) + .addIndex([0, 1, 2, 0, 2, 3]); + } + + /** + * Maps two Rectangle to the quad. + * + * @param {PIXI.Rectangle} targetTextureFrame - the first rectangle + * @param {PIXI.Rectangle} destinationFrame - the second rectangle + * @return {PIXI.Quad} Returns itself. + */ + map(targetTextureFrame, destinationFrame) + { + let x = 0; // destinationFrame.x / targetTextureFrame.width; + let y = 0; // destinationFrame.y / targetTextureFrame.height; + + this.uvs[0] = x; + this.uvs[1] = y; + + this.uvs[2] = x + (destinationFrame.width / targetTextureFrame.width); + this.uvs[3] = y; + + this.uvs[4] = x + (destinationFrame.width / targetTextureFrame.width); + this.uvs[5] = y + (destinationFrame.height / targetTextureFrame.height); + + this.uvs[6] = x; + this.uvs[7] = y + (destinationFrame.height / targetTextureFrame.height); + + x = destinationFrame.x; + y = destinationFrame.y; + + this.vertices[0] = x; + this.vertices[1] = y; + + this.vertices[2] = x + destinationFrame.width; + this.vertices[3] = y; + + this.vertices[4] = x + destinationFrame.width; + this.vertices[5] = y + destinationFrame.height; + + this.vertices[6] = x; + this.vertices[7] = y + destinationFrame.height; + + this.invalidate(); + + return this; + } + + /** + * legacy upload method, just marks buffers dirty + * @returns {PIXI.QuadUv} Returns itself. + */ + invalidate() + { + this.vertexBuffer._updateID++; + this.uvBuffer._updateID++; + + return this; + } +} diff --git a/packages/core/src/textures/RenderTexture.js b/packages/core/src/textures/RenderTexture.js index 99f6353..34f09b2 100644 --- a/packages/core/src/textures/RenderTexture.js +++ b/packages/core/src/textures/RenderTexture.js @@ -87,6 +87,13 @@ */ this.valid = true; + /** + * FilterSystem temporary storage + * @private + * @member {PIXI.Rectangle} + */ + this.filterFrame = null; + this._updateUvs(); } diff --git a/bundles/pixi.js/src/deprecated.js b/bundles/pixi.js/src/deprecated.js index 23443cf..4bf8beb 100644 --- a/bundles/pixi.js/src/deprecated.js +++ b/bundles/pixi.js/src/deprecated.js @@ -1,8 +1,17 @@ +// A map of warning messages alread fired +const warnings = {}; + // provide method to give a stack track for warnings // useful for tracking-down where deprecated methods/properties/classes // are being used within the code function warn(msg) { + // Ignore duplicat + if (warnings[msg]) + { + return; + } + /* eslint-disable no-console */ let stack = new Error().stack; @@ -34,6 +43,8 @@ } } /* eslint-enable no-console */ + + warnings[msg] = true; } export default function deprecated(PIXI) @@ -147,6 +158,20 @@ return PIXI.Loader.shared; }, }, + + /** + * @class PIXI.FilterManager + * @see PIXI.systems.FilterSystem + * @deprecated since 5.0.0 + */ + FilterManager: { + get() + { + warn('PIXI.FilterManager has moved to PIXI.systems.FilterSystem'); + + return PIXI.systems.FilterManager; + }, + }, }); /** @@ -705,4 +730,61 @@ return this.copyTo(p); }; + + Object.assign(PIXI.systems.FilterSystem.prototype, { + /** + * @method PIXI.FilterManager#getRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#getFilterTexture + */ + getRenderTarget(clear, resolution) + { + warn('FilterManager#getRenderTarget has been replaced with FilterSystem#getFilterTexture'); + + return this.getFilterTexture(resolution); + }, + + /** + * @method PIXI.FilterManager#returnRenderTarget + * @deprecated since 5.0.0 + * @see PIXI.systems.FilterSystem#returnFilterTexture + */ + returnRenderTarget(renderTexture) + { + warn('FilterManager#returnRenderTarget has been replaced with FilterSystem#returnFilterTexture'); + + this.returnFilterTexture(renderTexture); + }, + }); + + Object.defineProperties(PIXI.RenderTexture.prototype, { + /** + * @name PIXI.RenderTexture#sourceFrame + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + sourceFrame: { + get() + { + warn('PIXI.RenderTexture#sourceFrame has been removed'); + + return this.filterFrame; + }, + }, + /** + * @name PIXI.RenderTexture#size + * @type {PIXI.Rectangle} + * @deprecated since 5.0.0 + * @readonly + */ + size: { + get() + { + warn('PIXI.RenderTexture#size has been removed'); + + return this._frame; + }, + }, + }); } diff --git a/packages/core/src/geometry/Geometry.js b/packages/core/src/geometry/Geometry.js index 15a526f..0984c09 100644 --- a/packages/core/src/geometry/Geometry.js +++ b/packages/core/src/geometry/Geometry.js @@ -40,8 +40,8 @@ export default class Geometry { /** - * @param {array} buffers an array of buffers. optional. - * @param {object} attributes of the geometry, optional structure of the attributes layout + * @param {array} [buffers] an array of buffers. optional. + * @param {object} [attributes] of the geometry, optional structure of the attributes layout */ constructor(buffers, attributes) { diff --git a/packages/core/src/index.js b/packages/core/src/index.js index 8b8e67c..58c456a 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -1,5 +1,8 @@ import * as resources from './textures/resources'; +import * as systems from './renderers/systems'; + export { resources }; +export { systems }; export { default as Renderer } from './renderers/Renderer'; export { default as AbstractRenderer } from './renderers/AbstractRenderer'; @@ -11,10 +14,10 @@ export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; export { default as TextureUvs } from './textures/TextureUvs'; -export { default as WebGLSystem } from './renderers/systems/WebGLSystem'; export { default as State } from './renderers/State'; export { default as ObjectRenderer } from './renderers/utils/ObjectRenderer'; export { default as Quad } from './renderers/utils/Quad'; +export { default as QuadUv } from './renderers/utils/QuadUv'; export { default as checkMaxIfStatmentsInShader } from './renderers/utils/checkMaxIfStatmentsInShader'; export { default as Shader } from './shader/Shader'; export { default as Program } from './shader/Program'; diff --git a/packages/core/src/renderers/filters/Filter.js b/packages/core/src/renderers/filters/Filter.js index 2c07f71..2073b8d 100644 --- a/packages/core/src/renderers/filters/Filter.js +++ b/packages/core/src/renderers/filters/Filter.js @@ -58,8 +58,15 @@ this.autoFit = true; /** + * Legacy filters use position and uvs from attributes + * @member {boolean} + * @readonly + */ + this.legacy = !!this.program.attributeData.aTextureCoord; + + /** * the webGL state the filter requires to render - * @type {PIXI.State} + * @member {PIXI.State} */ this.state = new State(); } diff --git a/packages/core/src/renderers/systems/MaskSystem.js b/packages/core/src/renderers/systems/MaskSystem.js index 6901078..d9c4b1a 100644 --- a/packages/core/src/renderers/systems/MaskSystem.js +++ b/packages/core/src/renderers/systems/MaskSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class MaskSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/ProjectionSystem.js b/packages/core/src/renderers/systems/ProjectionSystem.js index c91de1d..ec5efdb 100644 --- a/packages/core/src/renderers/systems/ProjectionSystem.js +++ b/packages/core/src/renderers/systems/ProjectionSystem.js @@ -3,8 +3,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class ProjectionSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/RenderTextureSystem.js b/packages/core/src/renderers/systems/RenderTextureSystem.js index 61cfb28..a133ef1 100644 --- a/packages/core/src/renderers/systems/RenderTextureSystem.js +++ b/packages/core/src/renderers/systems/RenderTextureSystem.js @@ -5,8 +5,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class RenderTextureSystem extends WebGLSystem diff --git a/packages/core/src/renderers/systems/StateSystem.js b/packages/core/src/renderers/systems/StateSystem.js index 54c158a..d7f4caf 100755 --- a/packages/core/src/renderers/systems/StateSystem.js +++ b/packages/core/src/renderers/systems/StateSystem.js @@ -11,8 +11,9 @@ /** * A WebGL state machines * - * @memberof PIXI * @class + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StateSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/StencilSystem.js b/packages/core/src/renderers/systems/StencilSystem.js index 15e958a..5d538cb 100644 --- a/packages/core/src/renderers/systems/StencilSystem.js +++ b/packages/core/src/renderers/systems/StencilSystem.js @@ -2,8 +2,8 @@ /** * @class - * @extends PIXI.WebGLSystem - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class StencilSystem extends WebGLSystem { diff --git a/packages/core/src/renderers/systems/WebGLSystem.js b/packages/core/src/renderers/systems/WebGLSystem.js index d6bb7e7..d3d5b31 100644 --- a/packages/core/src/renderers/systems/WebGLSystem.js +++ b/packages/core/src/renderers/systems/WebGLSystem.js @@ -1,6 +1,7 @@ /** * @class - * @memberof PIXI + * @extends PIXI.systems.WebGLSystem + * @memberof PIXI.systems */ export default class WebGLSystem { diff --git a/packages/core/src/renderers/systems/filter/FilterSystem.js b/packages/core/src/renderers/systems/filter/FilterSystem.js index fdbe5ba..e615037 100644 --- a/packages/core/src/renderers/systems/filter/FilterSystem.js +++ b/packages/core/src/renderers/systems/filter/FilterSystem.js @@ -2,10 +2,12 @@ import RenderTexture from '../../../textures/RenderTexture'; import Quad from '../../utils/Quad'; +import QuadUv from '../../utils/QuadUv'; import { Rectangle } from '@pixi/math'; import * as filterTransforms from '../../filters/filterTransforms'; import bitTwiddle from 'bit-twiddle'; import UniformGroup from '../../../shader/UniformGroup'; +import { DRAW_MODES } from '../../../../../constants'; // /** @@ -24,14 +26,15 @@ this.destinationFrame = new Rectangle(); this.filters = []; this.target = null; + this.legacy = false; this.resolution = 1; } } /** * @class - * @memberof PIXI - * @extends PIXI.WebGLSystem + * @memberof PIXI.systems + * @extends PIXI.systems.WebGLSystem */ export default class FilterSystem extends WebGLSystem { @@ -60,6 +63,8 @@ */ this.quad = new Quad(); + this.quadUv = new QuadUv(); + /** * Temporary rect for maths * @type {PIXI.Rectangle} @@ -75,6 +80,10 @@ this.globalUniforms = new UniformGroup({ sourceFrame: this.tempRect, destinationFrame: this.tempRect, + + // legacy variables + filterArea: new Float32Array(4), + filterClamp: new Float32Array(4), }, true); } @@ -93,26 +102,31 @@ let resolution = filters[0].resolution; let padding = filters[0].padding; let autoFit = filters[0].autoFit; + let legacy = filters[0].legacy; for (let i = 1; i < filters.length; i++) { + const filter = filters[i]; + // lets use the lowest resolution.. - resolution = Math.min(resolution, filters[i].resolution); - // and the largest amout of padding! - padding = Math.max(padding, filters[i].padding); + resolution = Math.min(resolution, filter.resolution); + // and the largest amount of padding! + padding = Math.max(padding, filter.padding); // only auto fit if all filters are autofit - autoFit = autoFit || filters[i].autoFit; + autoFit = autoFit || filter.autoFit; + + legacy = legacy || filter.legacy; } filterStack.push(state); state.resolution = resolution; + state.legacy = legacy; + // round to whole number based on resolution // TODO move that to the shader too? - state.sourceFrame = target.filterArea ? this.transformFilterArea(this.tempRect, - target.filterArea, - target.transform) : target.getBounds(true); + state.sourceFrame = target.filterArea || target.getBounds(true); state.sourceFrame.pad(padding); @@ -153,6 +167,23 @@ globalUniforms.destinationFrame = state.destinationFrame; globalUniforms.resolution = state.resolution; + // only update the rect if its legacy.. + if (state.legacy) + { + const filterArea = globalUniforms.filterArea; + const filterClamp = globalUniforms.filterClamp; + + filterArea[0] = state.destinationFrame.width; + filterArea[1] = state.destinationFrame.height; + filterArea[2] = state.sourceFrame.x; + filterArea[3] = state.sourceFrame.y; + + filterClamp[0] = 0.5 / state.resolution / state.destinationFrame.width; + filterClamp[1] = 0.5 / state.resolution / state.destinationFrame.height; + filterClamp[2] = (state.sourceFrame.width - 0.5) / state.resolution / state.destinationFrame.width; + filterClamp[3] = (state.sourceFrame.height - 0.5) / state.resolution / state.destinationFrame.height; + } + this.globalUniforms.update(); const lastState = filterStack[filterStack.length - 1]; @@ -160,7 +191,6 @@ if (filters.length === 1) { filters[0].apply(this, state.renderTexture, lastState.renderTexture, false, state); - renderer.renderTexture.bind(null); this.returnFilterTexture(state.renderTexture); } @@ -227,8 +257,19 @@ renderer.state.setState(filter.state); renderer.shader.bind(filter); - renderer.geometry.bind(this.quad); - renderer.geometry.draw(5); + + if (filter.legacy) + { + this.quadUv.map(input._frame, input.filterFrame); + + renderer.geometry.bind(this.quadUv); + renderer.geometry.draw(DRAW_MODES.TRIANGLES); + } + else + { + renderer.geometry.bind(this.quad); + renderer.geometry.draw(DRAW_MODES.TRIANGLE_STRIP); + } } /** @@ -330,6 +371,12 @@ return renderTexture; } + /** + * Gets extra render texture to use inside current filter + * + * @param {number} resolution resolution of the renderTexture + * @returns {PIXI.RenderTexture} + */ getFilterTexture(resolution) { const rt = this.activeState.renderTexture; @@ -342,9 +389,9 @@ } /** - * Frees a render target back into the pool. + * Frees a render texture back into the pool. * - * @param {PIXI.RenderTarget} renderTarget - The renderTarget to free + * @param {PIXI.RenderTarget} renderTexture - The renderTarget to free */ returnFilterTexture(renderTexture) { @@ -381,64 +428,4 @@ this.texturePool = {}; } - - transformFilterArea(out, rectangle, transform) - { - const x0 = rectangle.x; - const y0 = rectangle.y; - - const x1 = rectangle.x + rectangle.width; - const y1 = rectangle.y + rectangle.height; - - const matrix = transform.worldTransform; - const a = matrix.a; - const b = matrix.b; - const c = matrix.c; - const d = matrix.d; - const tx = matrix.tx; - const ty = matrix.ty; - - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - - let x = (a * x0) + (c * y0) + tx; - let y = (b * x0) + (d * y0) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y0) + tx; - y = (b * x1) + (d * y0) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x0) + (c * y1) + tx; - y = (b * x0) + (d * y1) + ty; - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - x = (a * x1) + (c * y1) + tx; - y = (b * x1) + (d * y1) + ty; - - minX = x < minX ? x : minX; - minY = y < minY ? y : minY; - maxX = x > maxX ? x : maxX; - maxY = y > maxY ? y : maxY; - - out.x = minX; - out.y = minY; - - out.width = maxX - minX; - out.height = maxY - minY; - - return out; - } } diff --git a/packages/core/src/renderers/systems/index.js b/packages/core/src/renderers/systems/index.js new file mode 100644 index 0000000..c843f03 --- /dev/null +++ b/packages/core/src/renderers/systems/index.js @@ -0,0 +1,6 @@ +/** + * Systems are individual components to the Renderer pipeline. + * @namespace PIXI.systems + */ +export { default as WebGLSystem } from './WebGLSystem'; +export { default as FilterSystem } from './filter/FilterSystem'; diff --git a/packages/core/src/renderers/utils/Quad.js b/packages/core/src/renderers/utils/Quad.js index 34f02b4..5c1517b 100644 --- a/packages/core/src/renderers/utils/Quad.js +++ b/packages/core/src/renderers/utils/Quad.js @@ -9,8 +9,7 @@ export default class Quad extends Geometry { /** - * @param {WebGLRenderingContext} gl - The gl context for this quad to use. - * @param {object} state - TODO: Description + * just a quad */ constructor() { diff --git a/packages/core/src/renderers/utils/QuadUv.js b/packages/core/src/renderers/utils/QuadUv.js new file mode 100644 index 0000000..97bda89 --- /dev/null +++ b/packages/core/src/renderers/utils/QuadUv.js @@ -0,0 +1,103 @@ +import Geometry from '../../geometry/Geometry'; +import Buffer from '../../geometry/Buffer'; + +/** + * Helper class to create a quad with uvs like in v4 + * + * @class + * @memberof PIXI + */ +export default class QuadUv extends Geometry +{ + constructor() + { + super(); + + /** + * An array of vertices + * + * @member {Float32Array} + */ + this.vertices = new Float32Array([ + -1, -1, + 1, -1, + 1, 1, + -1, 1, + ]); + + /** + * The Uvs of the quad + * + * @member {Float32Array} + */ + this.uvs = new Float32Array([ + 0, 0, + 1, 0, + 1, 1, + 0, 1, + ]); + + this.vertexBuffer = new Buffer(this.vertices); + this.uvBuffer = new Buffer(this.uvs); + + this.addAttribute('aVertexPosition', this.vertexBuffer) + .addAttribute('aTextureCoord', this.uvBuffer) + .addIndex([0, 1, 2, 0, 2, 3]); + } + + /** + * Maps two Rectangle to the quad. + * + * @param {PIXI.Rectangle} targetTextureFrame - the first rectangle + * @param {PIXI.Rectangle} destinationFrame - the second rectangle + * @return {PIXI.Quad} Returns itself. + */ + map(targetTextureFrame, destinationFrame) + { + let x = 0; // destinationFrame.x / targetTextureFrame.width; + let y = 0; // destinationFrame.y / targetTextureFrame.height; + + this.uvs[0] = x; + this.uvs[1] = y; + + this.uvs[2] = x + (destinationFrame.width / targetTextureFrame.width); + this.uvs[3] = y; + + this.uvs[4] = x + (destinationFrame.width / targetTextureFrame.width); + this.uvs[5] = y + (destinationFrame.height / targetTextureFrame.height); + + this.uvs[6] = x; + this.uvs[7] = y + (destinationFrame.height / targetTextureFrame.height); + + x = destinationFrame.x; + y = destinationFrame.y; + + this.vertices[0] = x; + this.vertices[1] = y; + + this.vertices[2] = x + destinationFrame.width; + this.vertices[3] = y; + + this.vertices[4] = x + destinationFrame.width; + this.vertices[5] = y + destinationFrame.height; + + this.vertices[6] = x; + this.vertices[7] = y + destinationFrame.height; + + this.invalidate(); + + return this; + } + + /** + * legacy upload method, just marks buffers dirty + * @returns {PIXI.QuadUv} Returns itself. + */ + invalidate() + { + this.vertexBuffer._updateID++; + this.uvBuffer._updateID++; + + return this; + } +} diff --git a/packages/core/src/textures/RenderTexture.js b/packages/core/src/textures/RenderTexture.js index 99f6353..34f09b2 100644 --- a/packages/core/src/textures/RenderTexture.js +++ b/packages/core/src/textures/RenderTexture.js @@ -87,6 +87,13 @@ */ this.valid = true; + /** + * FilterSystem temporary storage + * @private + * @member {PIXI.Rectangle} + */ + this.filterFrame = null; + this._updateUvs(); } diff --git a/packages/sprite-tiling/src/TilingSpriteRenderer.js b/packages/sprite-tiling/src/TilingSpriteRenderer.js index 3ec4e89..8b79e13 100644 --- a/packages/sprite-tiling/src/TilingSpriteRenderer.js +++ b/packages/sprite-tiling/src/TilingSpriteRenderer.js @@ -1,4 +1,4 @@ -import { ObjectRenderer, Shader, Quad } from '@pixi/core'; +import { ObjectRenderer, Shader, QuadUv } from '@pixi/core'; import { WRAP_MODES } from '@pixi/constants'; import { Matrix } from '@pixi/math'; import { premultiplyTintToRgba, correctBlendMode } from '@pixi/utils'; @@ -33,7 +33,7 @@ this.simpleShader = Shader.from(vertex, fragmentSimple, uniforms); - this.quad = new Quad(); + this.quad = new QuadUv(); } /** @@ -64,6 +64,8 @@ vertices[5] = vertices[7] = 1.0 - ts.anchor.y; } + quad.invalidate(); + const tex = ts._texture; const baseTex = tex.baseTexture; const lt = ts.tileTransform.localTransform;