pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
131 lines (127 loc) • 4.72 kB
JavaScript
;
var Extensions = require('../../../extensions/Extensions.js');
var _const$1 = require('../../renderers/gl/const.js');
var _const = require('../../renderers/shared/state/const.js');
;
class StencilMaskPipe {
constructor(renderer) {
// used when building and also when executing..
this._maskStackHash = {};
this._maskHash = /* @__PURE__ */ new WeakMap();
this._renderer = renderer;
}
push(mask, _container, instructionSet) {
var _a;
const effect = mask;
const renderer = this._renderer;
renderer.renderPipes.batch.break(instructionSet);
renderer.renderPipes.blendMode.setBlendMode(effect.mask, "none", instructionSet);
instructionSet.add({
renderPipeId: "stencilMask",
action: "pushMaskBegin",
mask,
inverse: _container._maskOptions.inverse,
canBundle: false
});
const maskContainer = effect.mask;
maskContainer.includeInBuild = true;
if (!this._maskHash.has(effect)) {
this._maskHash.set(effect, {
instructionsStart: 0,
instructionsLength: 0
});
}
const maskData = this._maskHash.get(effect);
maskData.instructionsStart = instructionSet.instructionSize;
maskContainer.collectRenderables(
instructionSet,
renderer,
null
);
maskContainer.includeInBuild = false;
renderer.renderPipes.batch.break(instructionSet);
instructionSet.add({
renderPipeId: "stencilMask",
action: "pushMaskEnd",
mask,
inverse: _container._maskOptions.inverse,
canBundle: false
});
const instructionsLength = instructionSet.instructionSize - maskData.instructionsStart - 1;
maskData.instructionsLength = instructionsLength;
const renderTargetUid = renderer.renderTarget.renderTarget.uid;
(_a = this._maskStackHash)[renderTargetUid] ?? (_a[renderTargetUid] = 0);
}
pop(mask, _container, instructionSet) {
const effect = mask;
const renderer = this._renderer;
renderer.renderPipes.batch.break(instructionSet);
renderer.renderPipes.blendMode.setBlendMode(effect.mask, "none", instructionSet);
instructionSet.add({
renderPipeId: "stencilMask",
action: "popMaskBegin",
inverse: _container._maskOptions.inverse,
canBundle: false
});
const maskData = this._maskHash.get(mask);
for (let i = 0; i < maskData.instructionsLength; i++) {
instructionSet.instructions[instructionSet.instructionSize++] = instructionSet.instructions[maskData.instructionsStart++];
}
instructionSet.add({
renderPipeId: "stencilMask",
action: "popMaskEnd",
canBundle: false
});
}
execute(instruction) {
var _a;
const renderer = this._renderer;
const renderTargetUid = renderer.renderTarget.renderTarget.uid;
let maskStackIndex = (_a = this._maskStackHash)[renderTargetUid] ?? (_a[renderTargetUid] = 0);
if (instruction.action === "pushMaskBegin") {
renderer.renderTarget.ensureDepthStencil();
renderer.stencil.setStencilMode(_const.STENCIL_MODES.RENDERING_MASK_ADD, maskStackIndex);
maskStackIndex++;
renderer.colorMask.setMask(0);
} else if (instruction.action === "pushMaskEnd") {
if (instruction.inverse) {
renderer.stencil.setStencilMode(_const.STENCIL_MODES.INVERSE_MASK_ACTIVE, maskStackIndex);
} else {
renderer.stencil.setStencilMode(_const.STENCIL_MODES.MASK_ACTIVE, maskStackIndex);
}
renderer.colorMask.setMask(15);
} else if (instruction.action === "popMaskBegin") {
renderer.colorMask.setMask(0);
if (maskStackIndex !== 0) {
renderer.stencil.setStencilMode(_const.STENCIL_MODES.RENDERING_MASK_REMOVE, maskStackIndex);
} else {
renderer.renderTarget.clear(null, _const$1.CLEAR.STENCIL);
renderer.stencil.setStencilMode(_const.STENCIL_MODES.DISABLED, maskStackIndex);
}
maskStackIndex--;
} else if (instruction.action === "popMaskEnd") {
if (instruction.inverse) {
renderer.stencil.setStencilMode(_const.STENCIL_MODES.INVERSE_MASK_ACTIVE, maskStackIndex);
} else {
renderer.stencil.setStencilMode(_const.STENCIL_MODES.MASK_ACTIVE, maskStackIndex);
}
renderer.colorMask.setMask(15);
}
this._maskStackHash[renderTargetUid] = maskStackIndex;
}
destroy() {
this._renderer = null;
this._maskStackHash = null;
this._maskHash = null;
}
}
StencilMaskPipe.extension = {
type: [
Extensions.ExtensionType.WebGLPipes,
Extensions.ExtensionType.WebGPUPipes,
Extensions.ExtensionType.CanvasPipes
],
name: "stencilMask"
};
exports.StencilMaskPipe = StencilMaskPipe;
//# sourceMappingURL=StencilMaskPipe.js.map