UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

123 lines (120 loc) 4.38 kB
import { BitPacking } from '../../core/math/bit-packing.js'; import { BLENDEQUATION_ADD, BLENDMODE_ONE, BLENDMODE_ZERO, BLENDMODE_SRC_ALPHA, BLENDMODE_ONE_MINUS_SRC_ALPHA } from './constants.js'; const opMask = 0b111; const factorMask = 0b1111; const colorOpShift = 0; const colorSrcFactorShift = 3; const colorDstFactorShift = 7; const alphaOpShift = 11; const alphaSrcFactorShift = 14; const alphaDstFactorShift = 18; const redWriteShift = 22; const greenWriteShift = 23; const blueWriteShift = 24; const alphaWriteShift = 25; const blendShift = 26; const allWriteMasks = 0b1111; const allWriteShift = redWriteShift; class BlendState { constructor(blend = false, colorOp = BLENDEQUATION_ADD, colorSrcFactor = BLENDMODE_ONE, colorDstFactor = BLENDMODE_ZERO, alphaOp, alphaSrcFactor, alphaDstFactor, redWrite = true, greenWrite = true, blueWrite = true, alphaWrite = true){ this.target0 = 0; this.setColorBlend(colorOp, colorSrcFactor, colorDstFactor); this.setAlphaBlend(alphaOp ?? colorOp, alphaSrcFactor ?? colorSrcFactor, alphaDstFactor ?? colorDstFactor); this.setColorWrite(redWrite, greenWrite, blueWrite, alphaWrite); this.blend = blend; } set blend(value) { this.target0 = BitPacking.set(this.target0, value ? 1 : 0, blendShift); } get blend() { return BitPacking.all(this.target0, blendShift); } setColorBlend(op, srcFactor, dstFactor) { this.target0 = BitPacking.set(this.target0, op, colorOpShift, opMask); this.target0 = BitPacking.set(this.target0, srcFactor, colorSrcFactorShift, factorMask); this.target0 = BitPacking.set(this.target0, dstFactor, colorDstFactorShift, factorMask); } setAlphaBlend(op, srcFactor, dstFactor) { this.target0 = BitPacking.set(this.target0, op, alphaOpShift, opMask); this.target0 = BitPacking.set(this.target0, srcFactor, alphaSrcFactorShift, factorMask); this.target0 = BitPacking.set(this.target0, dstFactor, alphaDstFactorShift, factorMask); } setColorWrite(redWrite, greenWrite, blueWrite, alphaWrite) { this.redWrite = redWrite; this.greenWrite = greenWrite; this.blueWrite = blueWrite; this.alphaWrite = alphaWrite; } get colorOp() { return BitPacking.get(this.target0, colorOpShift, opMask); } get colorSrcFactor() { return BitPacking.get(this.target0, colorSrcFactorShift, factorMask); } get colorDstFactor() { return BitPacking.get(this.target0, colorDstFactorShift, factorMask); } get alphaOp() { return BitPacking.get(this.target0, alphaOpShift, opMask); } get alphaSrcFactor() { return BitPacking.get(this.target0, alphaSrcFactorShift, factorMask); } get alphaDstFactor() { return BitPacking.get(this.target0, alphaDstFactorShift, factorMask); } set redWrite(value) { this.target0 = BitPacking.set(this.target0, value ? 1 : 0, redWriteShift); } get redWrite() { return BitPacking.all(this.target0, redWriteShift); } set greenWrite(value) { this.target0 = BitPacking.set(this.target0, value ? 1 : 0, greenWriteShift); } get greenWrite() { return BitPacking.all(this.target0, greenWriteShift); } set blueWrite(value) { this.target0 = BitPacking.set(this.target0, value ? 1 : 0, blueWriteShift); } get blueWrite() { return BitPacking.all(this.target0, blueWriteShift); } set alphaWrite(value) { this.target0 = BitPacking.set(this.target0, value ? 1 : 0, alphaWriteShift); } get alphaWrite() { return BitPacking.all(this.target0, alphaWriteShift); } get allWrite() { return BitPacking.get(this.target0, allWriteShift, allWriteMasks); } copy(rhs) { this.target0 = rhs.target0; return this; } clone() { const clone = new this.constructor(); return clone.copy(this); } get key() { return this.target0; } equals(rhs) { return this.target0 === rhs.target0; } static{ this.NOBLEND = Object.freeze(new BlendState()); } static{ this.NOWRITE = Object.freeze(new BlendState(undefined, undefined, undefined, undefined, undefined, undefined, undefined, false, false, false, false)); } static{ this.ALPHABLEND = Object.freeze(new BlendState(true, BLENDEQUATION_ADD, BLENDMODE_SRC_ALPHA, BLENDMODE_ONE_MINUS_SRC_ALPHA)); } static{ this.ADDBLEND = Object.freeze(new BlendState(true, BLENDEQUATION_ADD, BLENDMODE_ONE, BLENDMODE_ONE)); } } export { BlendState };