404 lines
No EOL
20 KiB
JavaScript
404 lines
No EOL
20 KiB
JavaScript
var __extends = (this && this.__extends) || (function () {
|
|
var extendStatics = function (d, b) {
|
|
extendStatics = Object.setPrototypeOf ||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
return extendStatics(d, b);
|
|
};
|
|
return function (d, b) {
|
|
extendStatics(d, b);
|
|
function __() { this.constructor = d; }
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
};
|
|
})();
|
|
var pixi_picture;
|
|
(function (pixi_picture) {
|
|
var BackdropFilter = (function (_super) {
|
|
__extends(BackdropFilter, _super);
|
|
function BackdropFilter() {
|
|
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
_this.backdropUniformName = null;
|
|
_this._backdropActive = false;
|
|
_this.clearColor = null;
|
|
return _this;
|
|
}
|
|
return BackdropFilter;
|
|
}(PIXI.Filter));
|
|
pixi_picture.BackdropFilter = BackdropFilter;
|
|
var filterFrag = "\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform sampler2D uBackdrop;\n\n%UNIFORM_CODE%\n\nvoid main(void)\n{\n vec4 b_src = texture2D(uSampler, vTextureCoord);\n vec4 b_dest = texture2D(uBackdrop, vTextureCoord);\n vec4 b_res = b_dest;\n \n %BLEND_CODE%\n\n gl_FragColor = b_res;\n}";
|
|
var BlendFilter = (function (_super) {
|
|
__extends(BlendFilter, _super);
|
|
function BlendFilter(shaderParts) {
|
|
var _this = this;
|
|
var fragCode = filterFrag;
|
|
fragCode = fragCode.replace('%UNIFORM_CODE%', shaderParts.uniformCode || "");
|
|
fragCode = fragCode.replace('%BLEND_CODE%', shaderParts.blendCode || "");
|
|
_this = _super.call(this, undefined, fragCode, shaderParts.uniforms) || this;
|
|
_this.backdropUniformName = 'uBackdrop';
|
|
return _this;
|
|
}
|
|
return BlendFilter;
|
|
}(BackdropFilter));
|
|
pixi_picture.BlendFilter = BlendFilter;
|
|
})(pixi_picture || (pixi_picture = {}));
|
|
var pixi_picture;
|
|
(function (pixi_picture) {
|
|
function containsRect(rectOut, rectIn) {
|
|
var r1 = rectIn.x + rectIn.width;
|
|
var b1 = rectIn.y + rectIn.height;
|
|
var r2 = rectOut.x + rectOut.width;
|
|
var b2 = rectOut.y + rectOut.height;
|
|
return (rectIn.x >= rectOut.x) &&
|
|
(rectIn.x <= r2) &&
|
|
(rectIn.y >= rectOut.y) &&
|
|
(rectIn.y <= b2) &&
|
|
(r1 >= rectOut.x) &&
|
|
(r1 <= r2) &&
|
|
(b1 >= rectOut.y) &&
|
|
(b1 <= b2);
|
|
}
|
|
PIXI.systems.TextureSystem.prototype.bindForceLocation = function (texture, location) {
|
|
if (location === void 0) { location = 0; }
|
|
var gl = this.gl;
|
|
if (this.currentLocation !== location) {
|
|
this.currentLocation = location;
|
|
gl.activeTexture(gl.TEXTURE0 + location);
|
|
}
|
|
this.bind(texture, location);
|
|
};
|
|
function pushWithCheck(target, filters, checkEmptyBounds) {
|
|
if (checkEmptyBounds === void 0) { checkEmptyBounds = true; }
|
|
var renderer = this.renderer;
|
|
var filterStack = this.defaultFilterStack;
|
|
var state = this.statePool.pop() || new PIXI.FilterState();
|
|
var resolution = filters[0].resolution;
|
|
var padding = filters[0].padding;
|
|
var autoFit = filters[0].autoFit;
|
|
var legacy = filters[0].legacy;
|
|
for (var i = 1; i < filters.length; i++) {
|
|
var filter = filters[i];
|
|
resolution = Math.min(resolution, filter.resolution);
|
|
padding = this.useMaxPadding
|
|
? Math.max(padding, filter.padding)
|
|
: padding + filter.padding;
|
|
autoFit = autoFit || filter.autoFit;
|
|
legacy = legacy || filter.legacy;
|
|
}
|
|
if (filterStack.length === 1) {
|
|
this.defaultFilterStack[0].renderTexture = renderer.renderTexture.current;
|
|
}
|
|
filterStack.push(state);
|
|
state.resolution = resolution;
|
|
state.legacy = legacy;
|
|
state.target = target;
|
|
state.sourceFrame.copyFrom(target.filterArea || target.getBounds(true));
|
|
var canUseBackdrop = true;
|
|
state.sourceFrame.pad(padding);
|
|
if (autoFit) {
|
|
state.sourceFrame.fit(this.renderer.renderTexture.sourceFrame);
|
|
}
|
|
else {
|
|
canUseBackdrop = containsRect(this.renderer.renderTexture.sourceFrame, state.sourceFrame);
|
|
}
|
|
if (checkEmptyBounds && state.sourceFrame.width <= 1 && state.sourceFrame.height <= 1) {
|
|
filterStack.pop();
|
|
state.clear();
|
|
this.statePool.push(state);
|
|
return false;
|
|
}
|
|
state.sourceFrame.ceil(resolution);
|
|
if (canUseBackdrop) {
|
|
var backdrop = null;
|
|
for (var i = 0; i < filters.length; i++) {
|
|
var bName = filters[i].backdropUniformName;
|
|
if (bName) {
|
|
if (backdrop === null) {
|
|
backdrop = this.prepareBackdrop(state.sourceFrame);
|
|
}
|
|
filters[i].uniforms[bName] = backdrop;
|
|
if (backdrop) {
|
|
filters[i]._backdropActive = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
state.renderTexture = this.getOptimalFilterTexture(state.sourceFrame.width, state.sourceFrame.height, resolution);
|
|
state.filters = filters;
|
|
state.destinationFrame.width = state.renderTexture.width;
|
|
state.destinationFrame.height = state.renderTexture.height;
|
|
var destinationFrame = this.tempRect;
|
|
destinationFrame.width = state.sourceFrame.width;
|
|
destinationFrame.height = state.sourceFrame.height;
|
|
state.renderTexture.filterFrame = state.sourceFrame;
|
|
renderer.renderTexture.bind(state.renderTexture, state.sourceFrame, destinationFrame);
|
|
renderer.renderTexture.clear(filters[filters.length - 1].clearColor);
|
|
return true;
|
|
}
|
|
function push(target, filters) {
|
|
return this.pushWithCheck(target, filters, false);
|
|
}
|
|
function pop() {
|
|
var filterStack = this.defaultFilterStack;
|
|
var state = filterStack.pop();
|
|
var filters = state.filters;
|
|
this.activeState = state;
|
|
var globalUniforms = this.globalUniforms.uniforms;
|
|
globalUniforms.outputFrame = state.sourceFrame;
|
|
globalUniforms.resolution = state.resolution;
|
|
var inputSize = globalUniforms.inputSize;
|
|
var inputPixel = globalUniforms.inputPixel;
|
|
var inputClamp = globalUniforms.inputClamp;
|
|
inputSize[0] = state.destinationFrame.width;
|
|
inputSize[1] = state.destinationFrame.height;
|
|
inputSize[2] = 1.0 / inputSize[0];
|
|
inputSize[3] = 1.0 / inputSize[1];
|
|
inputPixel[0] = inputSize[0] * state.resolution;
|
|
inputPixel[1] = inputSize[1] * state.resolution;
|
|
inputPixel[2] = 1.0 / inputPixel[0];
|
|
inputPixel[3] = 1.0 / inputPixel[1];
|
|
inputClamp[0] = 0.5 * inputPixel[2];
|
|
inputClamp[1] = 0.5 * inputPixel[3];
|
|
inputClamp[2] = (state.sourceFrame.width * inputSize[2]) - (0.5 * inputPixel[2]);
|
|
inputClamp[3] = (state.sourceFrame.height * inputSize[3]) - (0.5 * inputPixel[3]);
|
|
if (state.legacy) {
|
|
var filterArea = globalUniforms.filterArea;
|
|
filterArea[0] = state.destinationFrame.width;
|
|
filterArea[1] = state.destinationFrame.height;
|
|
filterArea[2] = state.sourceFrame.x;
|
|
filterArea[3] = state.sourceFrame.y;
|
|
globalUniforms.filterClamp = globalUniforms.inputClamp;
|
|
}
|
|
this.globalUniforms.update();
|
|
var lastState = filterStack[filterStack.length - 1];
|
|
if (state.renderTexture.framebuffer.multisample > 1) {
|
|
this.renderer.framebuffer.blit();
|
|
}
|
|
if (filters.length === 1) {
|
|
filters[0].apply(this, state.renderTexture, lastState.renderTexture, PIXI.CLEAR_MODES.BLEND, state);
|
|
this.returnFilterTexture(state.renderTexture);
|
|
}
|
|
else {
|
|
var flip = state.renderTexture;
|
|
var flop = this.getOptimalFilterTexture(flip.width, flip.height, state.resolution);
|
|
flop.filterFrame = flip.filterFrame;
|
|
var i = 0;
|
|
for (i = 0; i < filters.length - 1; ++i) {
|
|
filters[i].apply(this, flip, flop, PIXI.CLEAR_MODES.CLEAR, state);
|
|
var t = flip;
|
|
flip = flop;
|
|
flop = t;
|
|
}
|
|
filters[i].apply(this, flip, lastState.renderTexture, PIXI.CLEAR_MODES.BLEND, state);
|
|
this.returnFilterTexture(flip);
|
|
this.returnFilterTexture(flop);
|
|
}
|
|
var backdropFree = false;
|
|
for (var i = 0; i < filters.length; i++) {
|
|
if (filters[i]._backdropActive) {
|
|
var bName = filters[i].backdropUniformName;
|
|
if (!backdropFree) {
|
|
this.returnFilterTexture(filters[i].uniforms[bName]);
|
|
backdropFree = true;
|
|
}
|
|
filters[i].uniforms[bName] = null;
|
|
filters[i]._backdropActive = false;
|
|
}
|
|
}
|
|
state.clear();
|
|
this.statePool.push(state);
|
|
}
|
|
var hadBackbufferError = false;
|
|
function prepareBackdrop(bounds) {
|
|
var renderer = this.renderer;
|
|
var renderTarget = renderer.renderTexture.current;
|
|
var fr = this.renderer.renderTexture.sourceFrame;
|
|
if (!renderTarget) {
|
|
if (!hadBackbufferError) {
|
|
hadBackbufferError = true;
|
|
console.warn('pixi-picture: you are trying to use Blend Filter on main framebuffer! That wont work.');
|
|
}
|
|
return null;
|
|
}
|
|
var resolution = renderTarget.baseTexture.resolution;
|
|
var x = (bounds.x - fr.x) * resolution;
|
|
var y = (bounds.y - fr.y) * resolution;
|
|
var w = (bounds.width) * resolution;
|
|
var h = (bounds.height) * resolution;
|
|
var gl = renderer.gl;
|
|
var rt = this.getOptimalFilterTexture(w, h, 1);
|
|
rt.filterFrame = fr;
|
|
renderer.texture.bindForceLocation(rt.baseTexture, 0);
|
|
gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, x, y, w, h);
|
|
return rt;
|
|
}
|
|
PIXI.systems.FilterSystem.prototype.push = push;
|
|
PIXI.systems.FilterSystem.prototype.pushWithCheck = pushWithCheck;
|
|
PIXI.systems.FilterSystem.prototype.pop = pop;
|
|
PIXI.systems.FilterSystem.prototype.prepareBackdrop = prepareBackdrop;
|
|
})(pixi_picture || (pixi_picture = {}));
|
|
var pixi_picture;
|
|
(function (pixi_picture) {
|
|
var MASK_CHANNEL;
|
|
(function (MASK_CHANNEL) {
|
|
MASK_CHANNEL[MASK_CHANNEL["RED"] = 0] = "RED";
|
|
MASK_CHANNEL[MASK_CHANNEL["GREEN"] = 1] = "GREEN";
|
|
MASK_CHANNEL[MASK_CHANNEL["BLUE"] = 2] = "BLUE";
|
|
MASK_CHANNEL[MASK_CHANNEL["ALPHA"] = 3] = "ALPHA";
|
|
})(MASK_CHANNEL = pixi_picture.MASK_CHANNEL || (pixi_picture.MASK_CHANNEL = {}));
|
|
var MaskConfig = (function () {
|
|
function MaskConfig(maskBefore, channel) {
|
|
if (maskBefore === void 0) { maskBefore = false; }
|
|
if (channel === void 0) { channel = MASK_CHANNEL.ALPHA; }
|
|
this.maskBefore = maskBefore;
|
|
this.uniformCode = 'uniform vec4 uChannel;';
|
|
this.uniforms = {
|
|
uChannel: new Float32Array([0, 0, 0, 0]),
|
|
};
|
|
this.blendCode = "b_res = dot(b_src, uChannel) * b_dest;";
|
|
this.uniforms.uChannel[channel] = 1.0;
|
|
}
|
|
return MaskConfig;
|
|
}());
|
|
pixi_picture.MaskConfig = MaskConfig;
|
|
var MaskFilter = (function (_super) {
|
|
__extends(MaskFilter, _super);
|
|
function MaskFilter(baseFilter, config) {
|
|
if (config === void 0) { config = new MaskConfig(); }
|
|
var _this = _super.call(this, config) || this;
|
|
_this.baseFilter = baseFilter;
|
|
_this.config = config;
|
|
_this.padding = baseFilter.padding;
|
|
return _this;
|
|
}
|
|
MaskFilter.prototype.apply = function (filterManager, input, output, clearMode) {
|
|
var target = filterManager.getFilterTexture(input);
|
|
if (this.config.maskBefore) {
|
|
var blendMode = this.state.blendMode;
|
|
this.state.blendMode = PIXI.BLEND_MODES.NONE;
|
|
filterManager.applyFilter(this, input, target, PIXI.CLEAR_MODES.YES);
|
|
this.baseFilter.blendMode = blendMode;
|
|
this.baseFilter.apply(filterManager, target, output, clearMode);
|
|
this.state.blendMode = blendMode;
|
|
}
|
|
else {
|
|
var uBackdrop = this.uniforms.uBackdrop;
|
|
this.baseFilter.apply(filterManager, uBackdrop, target, PIXI.CLEAR_MODES.YES);
|
|
this.uniforms.uBackdrop = target;
|
|
filterManager.applyFilter(this, input, output, clearMode);
|
|
this.uniforms.uBackdrop = uBackdrop;
|
|
}
|
|
filterManager.returnFilterTexture(target);
|
|
};
|
|
return MaskFilter;
|
|
}(pixi_picture.BlendFilter));
|
|
pixi_picture.MaskFilter = MaskFilter;
|
|
})(pixi_picture || (pixi_picture = {}));
|
|
var pixi_picture;
|
|
(function (pixi_picture) {
|
|
var blends;
|
|
(function (blends) {
|
|
blends.NPM_BLEND = "if (b_src.a == 0.0) {\n gl_FragColor = vec4(0, 0, 0, 0);\n return;\n}\nvec3 Cb = b_src.rgb / b_src.a, Cs;\nif (b_dest.a > 0.0) {\n Cs = b_dest.rgb / b_dest.a;\n}\n%NPM_BLEND%\nb_res.a = b_src.a + b_dest.a * (1.0-b_src.a);\nb_res.rgb = (1.0 - b_src.a) * Cs + b_src.a * B;\nb_res.rgb *= b_res.a;\n";
|
|
blends.OVERLAY_PART = "vec3 multiply = Cb * Cs * 2.0;\nvec3 Cb2 = Cb * 2.0 - 1.0;\nvec3 screen = Cb2 + Cs - Cb2 * Cs;\nvec3 B;\nif (Cs.r <= 0.5) {\n B.r = multiply.r;\n} else {\n B.r = screen.r;\n}\nif (Cs.g <= 0.5) {\n B.g = multiply.g;\n} else {\n B.g = screen.g;\n}\nif (Cs.b <= 0.5) {\n B.b = multiply.b;\n} else {\n B.b = screen.b;\n}\n";
|
|
blends.HARDLIGHT_PART = "vec3 multiply = Cb * Cs * 2.0;\nvec3 Cs2 = Cs * 2.0 - 1.0;\nvec3 screen = Cb + Cs2 - Cb * Cs2;\nvec3 B;\nif (Cb.r <= 0.5) {\n B.r = multiply.r;\n} else {\n B.r = screen.r;\n}\nif (Cb.g <= 0.5) {\n B.g = multiply.g;\n} else {\n B.g = screen.g;\n}\nif (Cb.b <= 0.5) {\n B.b = multiply.b;\n} else {\n B.b = screen.b;\n}\n";
|
|
blends.SOFTLIGHT_PART = "vec3 first = Cb - (1.0 - 2.0 * Cs) * Cb * (1.0 - Cb);\nvec3 B;\nvec3 D;\nif (Cs.r <= 0.5)\n{\n B.r = first.r;\n}\nelse\n{\n if (Cb.r <= 0.25)\n {\n D.r = ((16.0 * Cb.r - 12.0) * Cb.r + 4.0) * Cb.r; \n }\n else\n {\n D.r = sqrt(Cb.r);\n }\n B.r = Cb.r + (2.0 * Cs.r - 1.0) * (D.r - Cb.r);\n}\nif (Cs.g <= 0.5)\n{\n B.g = first.g;\n}\nelse\n{\n if (Cb.g <= 0.25)\n {\n D.g = ((16.0 * Cb.g - 12.0) * Cb.g + 4.0) * Cb.g; \n }\n else\n {\n D.g = sqrt(Cb.g);\n }\n B.g = Cb.g + (2.0 * Cs.g - 1.0) * (D.g - Cb.g);\n}\nif (Cs.b <= 0.5)\n{\n B.b = first.b;\n}\nelse\n{\n if (Cb.b <= 0.25)\n {\n D.b = ((16.0 * Cb.b - 12.0) * Cb.b + 4.0) * Cb.b; \n }\n else\n {\n D.b = sqrt(Cb.b);\n }\n B.b = Cb.b + (2.0 * Cs.b - 1.0) * (D.b - Cb.b);\n}\n";
|
|
blends.MULTIPLY_FULL = "if (b_dest.a > 0.0) {\n vec4 mult;\nmult.a = min(b_src.a + b_dest.a - b_src.a * b_dest.a, 1.0);\n mult.rgb = (b_dest.rgb / b_dest.a) * ((1.0 - b_src.a) + b_src.rgb);\n b_res.rgb = (b_dest.rgb / b_dest.a) * ((1.0 - b_src.a) + b_src.rgb);\n b_res.a = min(b_src.a + b_dest.a - b_src.a * b_dest.a, 1.0);\n b_res.rgb *= mult.a;\n}\n";
|
|
blends.OVERLAY_FULL = blends.NPM_BLEND.replace("%NPM_BLEND%", blends.OVERLAY_PART);
|
|
blends.HARDLIGHT_FULL = blends.NPM_BLEND.replace("%NPM_BLEND%", blends.HARDLIGHT_PART);
|
|
blends.SOFTLIGHT_FULL = blends.NPM_BLEND.replace("%NPM_BLEND%", blends.SOFTLIGHT_PART);
|
|
blends.blendFullArray = [];
|
|
blends.blendFullArray[PIXI.BLEND_MODES.MULTIPLY] = blends.MULTIPLY_FULL;
|
|
blends.blendFullArray[PIXI.BLEND_MODES.OVERLAY] = blends.OVERLAY_FULL;
|
|
blends.blendFullArray[PIXI.BLEND_MODES.HARD_LIGHT] = blends.HARDLIGHT_FULL;
|
|
blends.blendFullArray[PIXI.BLEND_MODES.SOFT_LIGHT] = blends.SOFTLIGHT_FULL;
|
|
})(blends = pixi_picture.blends || (pixi_picture.blends = {}));
|
|
var filterCache = [];
|
|
var filterCacheArray = [];
|
|
function getBlendFilter(blendMode) {
|
|
if (!blends.blendFullArray[blendMode]) {
|
|
return null;
|
|
}
|
|
if (!filterCache[blendMode]) {
|
|
filterCache[blendMode] = new pixi_picture.BlendFilter({ blendCode: blends.blendFullArray[blendMode] });
|
|
}
|
|
return filterCache[blendMode];
|
|
}
|
|
pixi_picture.getBlendFilter = getBlendFilter;
|
|
function getBlendFilterArray(blendMode) {
|
|
if (!blends.blendFullArray[blendMode]) {
|
|
return null;
|
|
}
|
|
if (!filterCacheArray[blendMode]) {
|
|
filterCacheArray[blendMode] = [this.getBlendFilter(blendMode)];
|
|
}
|
|
return filterCacheArray[blendMode];
|
|
}
|
|
pixi_picture.getBlendFilterArray = getBlendFilterArray;
|
|
})(pixi_picture || (pixi_picture = {}));
|
|
var pixi_picture;
|
|
(function (pixi_picture) {
|
|
var Sprite = (function (_super) {
|
|
__extends(Sprite, _super);
|
|
function Sprite() {
|
|
return _super !== null && _super.apply(this, arguments) || this;
|
|
}
|
|
Sprite.prototype._render = function (renderer) {
|
|
var texture = this._texture;
|
|
if (!texture || !texture.valid) {
|
|
return;
|
|
}
|
|
var blendFilterArray = pixi_picture.getBlendFilterArray(this.blendMode);
|
|
if (blendFilterArray) {
|
|
renderer.batch.flush();
|
|
if (!renderer.filter.pushWithCheck(this, blendFilterArray)) {
|
|
return;
|
|
}
|
|
}
|
|
this.calculateVertices();
|
|
renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]);
|
|
renderer.plugins[this.pluginName].render(this);
|
|
if (blendFilterArray) {
|
|
renderer.batch.flush();
|
|
renderer.filter.pop();
|
|
}
|
|
};
|
|
return Sprite;
|
|
}(PIXI.Sprite));
|
|
pixi_picture.Sprite = Sprite;
|
|
})(pixi_picture || (pixi_picture = {}));
|
|
var pixi_picture;
|
|
(function (pixi_picture) {
|
|
var TilingSprite = (function (_super) {
|
|
__extends(TilingSprite, _super);
|
|
function TilingSprite() {
|
|
return _super !== null && _super.apply(this, arguments) || this;
|
|
}
|
|
TilingSprite.prototype._render = function (renderer) {
|
|
var texture = this._texture;
|
|
if (!texture || !texture.valid) {
|
|
return;
|
|
}
|
|
var blendFilterArray = pixi_picture.getBlendFilterArray(this.blendMode);
|
|
if (blendFilterArray) {
|
|
renderer.batch.flush();
|
|
if (!renderer.filter.pushWithCheck(this, blendFilterArray)) {
|
|
return;
|
|
}
|
|
}
|
|
this.tileTransform.updateLocalTransform();
|
|
this.uvMatrix.update();
|
|
renderer.batch.setObjectRenderer(renderer.plugins[this.pluginName]);
|
|
renderer.plugins[this.pluginName].render(this);
|
|
if (blendFilterArray) {
|
|
renderer.batch.flush();
|
|
renderer.filter.pop();
|
|
}
|
|
};
|
|
return TilingSprite;
|
|
}(PIXI.TilingSprite));
|
|
pixi_picture.TilingSprite = TilingSprite;
|
|
})(pixi_picture || (pixi_picture = {}));
|
|
var pixi_picture;
|
|
(function (pixi_picture) {
|
|
PIXI.picture = pixi_picture;
|
|
})(pixi_picture || (pixi_picture = {}));
|
|
//# sourceMappingURL=pixi-picture.js.map
|