Files
nothoughts/node_modules/pixi.js/lib/rendering/renderers/gl/GlStencilSystem.js
2025-08-04 18:57:35 +02:00

93 lines
3.0 KiB
JavaScript

'use strict';
var Extensions = require('../../../extensions/Extensions.js');
var GpuStencilModesToPixi = require('../gpu/state/GpuStencilModesToPixi.js');
var _const = require('../shared/state/const.js');
"use strict";
class GlStencilSystem {
constructor(renderer) {
this._stencilCache = {
enabled: false,
stencilReference: 0,
stencilMode: _const.STENCIL_MODES.NONE
};
this._renderTargetStencilState = /* @__PURE__ */ Object.create(null);
renderer.renderTarget.onRenderTargetChange.add(this);
}
contextChange(gl) {
this._gl = gl;
this._comparisonFuncMapping = {
always: gl.ALWAYS,
never: gl.NEVER,
equal: gl.EQUAL,
"not-equal": gl.NOTEQUAL,
less: gl.LESS,
"less-equal": gl.LEQUAL,
greater: gl.GREATER,
"greater-equal": gl.GEQUAL
};
this._stencilOpsMapping = {
keep: gl.KEEP,
zero: gl.ZERO,
replace: gl.REPLACE,
invert: gl.INVERT,
"increment-clamp": gl.INCR,
"decrement-clamp": gl.DECR,
"increment-wrap": gl.INCR_WRAP,
"decrement-wrap": gl.DECR_WRAP
};
this._stencilCache.enabled = false;
this._stencilCache.stencilMode = _const.STENCIL_MODES.NONE;
this._stencilCache.stencilReference = 0;
}
onRenderTargetChange(renderTarget) {
if (this._activeRenderTarget === renderTarget)
return;
this._activeRenderTarget = renderTarget;
let stencilState = this._renderTargetStencilState[renderTarget.uid];
if (!stencilState) {
stencilState = this._renderTargetStencilState[renderTarget.uid] = {
stencilMode: _const.STENCIL_MODES.DISABLED,
stencilReference: 0
};
}
this.setStencilMode(stencilState.stencilMode, stencilState.stencilReference);
}
setStencilMode(stencilMode, stencilReference) {
const stencilState = this._renderTargetStencilState[this._activeRenderTarget.uid];
const gl = this._gl;
const mode = GpuStencilModesToPixi.GpuStencilModesToPixi[stencilMode];
const _stencilCache = this._stencilCache;
stencilState.stencilMode = stencilMode;
stencilState.stencilReference = stencilReference;
if (stencilMode === _const.STENCIL_MODES.DISABLED) {
if (this._stencilCache.enabled) {
this._stencilCache.enabled = false;
gl.disable(gl.STENCIL_TEST);
}
return;
}
if (!this._stencilCache.enabled) {
this._stencilCache.enabled = true;
gl.enable(gl.STENCIL_TEST);
}
if (stencilMode !== _stencilCache.stencilMode || _stencilCache.stencilReference !== stencilReference) {
_stencilCache.stencilMode = stencilMode;
_stencilCache.stencilReference = stencilReference;
gl.stencilFunc(this._comparisonFuncMapping[mode.stencilBack.compare], stencilReference, 255);
gl.stencilOp(gl.KEEP, gl.KEEP, this._stencilOpsMapping[mode.stencilBack.passOp]);
}
}
}
/** @ignore */
GlStencilSystem.extension = {
type: [
Extensions.ExtensionType.WebGLSystem
],
name: "stencil"
};
exports.GlStencilSystem = GlStencilSystem;
//# sourceMappingURL=GlStencilSystem.js.map