|
|
@@ -1,669 +0,0 @@ |
|
|
|
let __extends = (this && this.__extends) || (function () { |
|
|
|
let extendStatics = Object.setPrototypeOf || |
|
|
|
({ __proto__: [] } instanceof Array && function (d, b) { |
|
|
|
d.__proto__ = b; |
|
|
|
}) || |
|
|
|
function (d, b) { |
|
|
|
for (let p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; |
|
|
|
}; |
|
|
|
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) { |
|
|
|
function filterManagerMixin (fm) { |
|
|
|
if (fm.prepareBackdrop) |
|
|
|
return; |
|
|
|
fm.pushFilter = pushFilter; |
|
|
|
fm.popFilter = popFilter; |
|
|
|
fm.syncUniforms = syncUniforms; |
|
|
|
fm.prepareBackdrop = prepareBackdrop; |
|
|
|
} |
|
|
|
pixi_picture.filterManagerMixin = filterManagerMixin; |
|
|
|
function pushFilter (target, filters) { |
|
|
|
let renderer = this.renderer; |
|
|
|
let filterData = this.filterData; |
|
|
|
if (!filterData) { |
|
|
|
filterData = this.renderer._activeRenderTarget.filterStack; |
|
|
|
let filterState = new FilterState(); |
|
|
|
filterState.sourceFrame = filterState.destinationFrame = this.renderer._activeRenderTarget.size; |
|
|
|
filterState.renderTarget = renderer._activeRenderTarget; |
|
|
|
this.renderer._activeRenderTarget.filterData = filterData = { |
|
|
|
index: 0, |
|
|
|
stack: [filterState] |
|
|
|
}; |
|
|
|
this.filterData = filterData; |
|
|
|
} |
|
|
|
let currentState = filterData.stack[++filterData.index]; |
|
|
|
let renderTargetFrame = filterData.stack[0].destinationFrame; |
|
|
|
if (!currentState) |
|
|
|
currentState = filterData.stack[filterData.index] = new FilterState(); |
|
|
|
|
|
|
|
let fullScreen = target.filterArea |
|
|
|
&& target.filterArea.x === 0 |
|
|
|
&& target.filterArea.y === 0 |
|
|
|
&& target.filterArea.width === renderer.screen.width |
|
|
|
&& target.filterArea.height === renderer.screen.height; |
|
|
|
let resolution = filters[0].resolution; |
|
|
|
let padding = filters[0].padding | 0; |
|
|
|
let targetBounds = fullScreen ? renderer.screen : (target.filterArea || target.getBounds(true)); |
|
|
|
let sourceFrame = currentState.sourceFrame; |
|
|
|
let destinationFrame = currentState.destinationFrame; |
|
|
|
sourceFrame.x = ((targetBounds.x * resolution) | 0) / resolution; |
|
|
|
sourceFrame.y = ((targetBounds.y * resolution) | 0) / resolution; |
|
|
|
sourceFrame.width = ((targetBounds.width * resolution) | 0) / resolution; |
|
|
|
sourceFrame.height = ((targetBounds.height * resolution) | 0) / resolution; |
|
|
|
if (!fullScreen) { |
|
|
|
if (filterData.stack[0].renderTarget.transform) { |
|
|
|
} else if (filters[0].autoFit) |
|
|
|
sourceFrame.fit(renderTargetFrame); |
|
|
|
|
|
|
|
sourceFrame.pad(padding); |
|
|
|
} |
|
|
|
for (let i = 0; i < filters.length; i++) { |
|
|
|
let backdrop = null; |
|
|
|
if (filters[i].backdropUniformName) { |
|
|
|
if (backdrop === null) |
|
|
|
backdrop = this.prepareBackdrop(sourceFrame); |
|
|
|
|
|
|
|
filters[i]._backdropRenderTarget = backdrop; |
|
|
|
} |
|
|
|
} |
|
|
|
destinationFrame.width = sourceFrame.width; |
|
|
|
destinationFrame.height = sourceFrame.height; |
|
|
|
let renderTarget = this.getPotRenderTarget(renderer.gl, sourceFrame.width, sourceFrame.height, resolution); |
|
|
|
currentState.target = target; |
|
|
|
currentState.filters = filters; |
|
|
|
currentState.resolution = resolution; |
|
|
|
currentState.renderTarget = renderTarget; |
|
|
|
renderTarget.setFrame(destinationFrame, sourceFrame); |
|
|
|
renderer.bindRenderTarget(renderTarget); |
|
|
|
renderTarget.clear(filters[filters.length - 1].clearColor); |
|
|
|
} |
|
|
|
function popFilter () { |
|
|
|
let filterData = this.filterData; |
|
|
|
let lastState = filterData.stack[filterData.index - 1]; |
|
|
|
let currentState = filterData.stack[filterData.index]; |
|
|
|
this.quad.map(currentState.renderTarget.size, currentState.sourceFrame).upload(); |
|
|
|
let filters = currentState.filters; |
|
|
|
if (filters.length === 1) { |
|
|
|
filters[0].apply(this, currentState.renderTarget, lastState.renderTarget, false, currentState); |
|
|
|
this.freePotRenderTarget(currentState.renderTarget); |
|
|
|
} else { |
|
|
|
let flip = currentState.renderTarget; |
|
|
|
let flop = this.getPotRenderTarget(this.renderer.gl, currentState.sourceFrame.width, currentState.sourceFrame.height, currentState.resolution); |
|
|
|
flop.setFrame(currentState.destinationFrame, currentState.sourceFrame); |
|
|
|
flop.clear(); |
|
|
|
var i = 0; |
|
|
|
for (i = 0; i < filters.length - 1; ++i) { |
|
|
|
filters[i].apply(this, flip, flop, true, currentState); |
|
|
|
let t = flip; |
|
|
|
flip = flop; |
|
|
|
flop = t; |
|
|
|
} |
|
|
|
filters[i].apply(this, flip, lastState.renderTarget, false, currentState); |
|
|
|
this.freePotRenderTarget(flip); |
|
|
|
this.freePotRenderTarget(flop); |
|
|
|
} |
|
|
|
currentState.clear(); |
|
|
|
let backdropFree = false; |
|
|
|
for (var i = 0; i < filters.length; i++) { |
|
|
|
if (filters[i]._backdropRenderTarget) { |
|
|
|
if (!backdropFree) { |
|
|
|
this.freePotRenderTarget(filters[i]._backdropRenderTarget); |
|
|
|
backdropFree = true; |
|
|
|
} |
|
|
|
filters[i]._backdropRenderTarget = null; |
|
|
|
} |
|
|
|
} |
|
|
|
filterData.index--; |
|
|
|
if (filterData.index === 0) |
|
|
|
this.filterData = null; |
|
|
|
} |
|
|
|
function syncUniforms (shader, filter) { |
|
|
|
let renderer = this.renderer; |
|
|
|
let gl = renderer.gl; |
|
|
|
let uniformData = filter.uniformData; |
|
|
|
let uniforms = filter.uniforms; |
|
|
|
let textureCount = 1; |
|
|
|
let currentState; |
|
|
|
if (shader.uniforms.filterArea) { |
|
|
|
currentState = this.filterData.stack[this.filterData.index]; |
|
|
|
let filterArea = shader.uniforms.filterArea; |
|
|
|
filterArea[0] = currentState.renderTarget.size.width; |
|
|
|
filterArea[1] = currentState.renderTarget.size.height; |
|
|
|
filterArea[2] = currentState.sourceFrame.x; |
|
|
|
filterArea[3] = currentState.sourceFrame.y; |
|
|
|
shader.uniforms.filterArea = filterArea; |
|
|
|
} |
|
|
|
if (shader.uniforms.filterClamp) { |
|
|
|
currentState = currentState || this.filterData.stack[this.filterData.index]; |
|
|
|
let filterClamp = shader.uniforms.filterClamp; |
|
|
|
filterClamp[0] = 0; |
|
|
|
filterClamp[1] = 0; |
|
|
|
filterClamp[2] = (currentState.sourceFrame.width - 1) / currentState.renderTarget.size.width; |
|
|
|
filterClamp[3] = (currentState.sourceFrame.height - 1) / currentState.renderTarget.size.height; |
|
|
|
shader.uniforms.filterClamp = filterClamp; |
|
|
|
} |
|
|
|
for (let i in uniformData) { |
|
|
|
if (!shader.uniforms.data[i]) |
|
|
|
continue; |
|
|
|
|
|
|
|
if (i === filter.backdropUniformName) { |
|
|
|
let rt = filter._backdropRenderTarget; |
|
|
|
shader.uniforms[i] = textureCount; |
|
|
|
renderer.boundTextures[textureCount] = renderer.emptyTextures[textureCount]; |
|
|
|
gl.activeTexture(gl.TEXTURE0 + textureCount); |
|
|
|
gl.bindTexture(gl.TEXTURE_2D, rt.texture.texture); |
|
|
|
textureCount++; |
|
|
|
continue; |
|
|
|
} |
|
|
|
let type = uniformData[i].type; |
|
|
|
if (type === 'sampler2d' && uniforms[i] !== 0) { |
|
|
|
if (uniforms[i].baseTexture) |
|
|
|
shader.uniforms[i] = this.renderer.bindTexture(uniforms[i].baseTexture, textureCount); |
|
|
|
|
|
|
|
else { |
|
|
|
shader.uniforms[i] = textureCount; |
|
|
|
let gl_1 = this.renderer.gl; |
|
|
|
renderer.boundTextures[textureCount] = renderer.emptyTextures[textureCount]; |
|
|
|
gl_1.activeTexture(gl_1.TEXTURE0 + textureCount); |
|
|
|
uniforms[i].texture.bind(); |
|
|
|
} |
|
|
|
textureCount++; |
|
|
|
} else if (type === 'mat3') { |
|
|
|
if (uniforms[i].a !== undefined) |
|
|
|
shader.uniforms[i] = uniforms[i].toArray(true); |
|
|
|
|
|
|
|
else |
|
|
|
shader.uniforms[i] = uniforms[i]; |
|
|
|
} else if (type === 'vec2') { |
|
|
|
if (uniforms[i].x !== undefined) { |
|
|
|
let val = shader.uniforms[i] || new Float32Array(2); |
|
|
|
val[0] = uniforms[i].x; |
|
|
|
val[1] = uniforms[i].y; |
|
|
|
shader.uniforms[i] = val; |
|
|
|
} else |
|
|
|
shader.uniforms[i] = uniforms[i]; |
|
|
|
} else if (type === 'float') { |
|
|
|
if (shader.uniforms.data[i].value !== uniformData[i]) |
|
|
|
shader.uniforms[i] = uniforms[i]; |
|
|
|
} else |
|
|
|
shader.uniforms[i] = uniforms[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
function prepareBackdrop (bounds) { |
|
|
|
let renderer = this.renderer; |
|
|
|
let renderTarget = renderer._activeRenderTarget; |
|
|
|
if (renderTarget.root) |
|
|
|
return null; |
|
|
|
|
|
|
|
let resolution = renderTarget.resolution; |
|
|
|
let fr = renderTarget.sourceFrame || renderTarget.destinationFrame; |
|
|
|
bounds.fit(fr); |
|
|
|
let x = (bounds.x - fr.x) * resolution; |
|
|
|
let y = (bounds.y - fr.y) * resolution; |
|
|
|
let w = (bounds.width) * resolution; |
|
|
|
let h = (bounds.height) * resolution; |
|
|
|
let gl = renderer.gl; |
|
|
|
let rt = this.getPotRenderTarget(gl, w, h, 1); |
|
|
|
renderer.boundTextures[1] = renderer.emptyTextures[1]; |
|
|
|
gl.activeTexture(gl.TEXTURE0 + 1); |
|
|
|
gl.bindTexture(gl.TEXTURE_2D, rt.texture.texture); |
|
|
|
if (!rt.rebound) { |
|
|
|
renderer._activeRenderTarget = null; |
|
|
|
renderer.bindRenderTarget(renderTarget); |
|
|
|
rt.rebound = true; |
|
|
|
} |
|
|
|
gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, x, y, w, h); |
|
|
|
return rt; |
|
|
|
} |
|
|
|
var FilterState = (function () { |
|
|
|
function FilterState () { |
|
|
|
this.renderTarget = null; |
|
|
|
this.target = null; |
|
|
|
this.resolution = 1; |
|
|
|
this.sourceFrame = new PIXI.Rectangle(); |
|
|
|
this.destinationFrame = new PIXI.Rectangle(); |
|
|
|
this.filters = []; |
|
|
|
} |
|
|
|
FilterState.prototype.clear = function () { |
|
|
|
this.filters = null; |
|
|
|
this.target = null; |
|
|
|
this.renderTarget = null; |
|
|
|
}; |
|
|
|
return FilterState; |
|
|
|
})(); |
|
|
|
let BackdropFilter = (function (_super) { |
|
|
|
__extends(BackdropFilter, _super); |
|
|
|
function BackdropFilter () { |
|
|
|
let _this = _super !== null && _super.apply(this, arguments) || this; |
|
|
|
_this.backdropUniformName = null; |
|
|
|
_this._backdropRenderTarget = null; |
|
|
|
_this.clearColor = null; |
|
|
|
return _this; |
|
|
|
} |
|
|
|
return BackdropFilter; |
|
|
|
})(PIXI.Filter); |
|
|
|
pixi_picture.BackdropFilter = BackdropFilter; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
let shaderLib = [ |
|
|
|
{ |
|
|
|
vertUniforms: '', |
|
|
|
vertCode: 'vTextureCoord = aTextureCoord;', |
|
|
|
fragUniforms: 'uniform vec4 uTextureClamp;', |
|
|
|
fragCode: 'vec2 textureCoord = clamp(vTextureCoord, uTextureClamp.xy, uTextureClamp.zw);' |
|
|
|
}, |
|
|
|
{ |
|
|
|
vertUniforms: 'uniform mat3 uTransform;', |
|
|
|
vertCode: 'vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;', |
|
|
|
fragUniforms: '', |
|
|
|
fragCode: 'vec2 textureCoord = vTextureCoord;' |
|
|
|
}, |
|
|
|
{ |
|
|
|
vertUniforms: 'uniform mat3 uTransform;', |
|
|
|
vertCode: 'vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;', |
|
|
|
fragUniforms: 'uniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;', |
|
|
|
fragCode: 'vec2 textureCoord = mod(vTextureCoord - uClampOffset, vec2(1.0, 1.0)) + uClampOffset;' + |
|
|
|
'\ntextureCoord = (uMapCoord * vec3(textureCoord, 1.0)).xy;' + |
|
|
|
'\ntextureCoord = clamp(textureCoord, uClampFrame.xy, uClampFrame.zw);' |
|
|
|
} |
|
|
|
]; |
|
|
|
let PictureShader = (function (_super) { |
|
|
|
__extends(PictureShader, _super); |
|
|
|
function PictureShader (gl, vert, frag, tilingMode) { |
|
|
|
let _this = this; |
|
|
|
let lib = shaderLib[tilingMode]; |
|
|
|
_this = _super.call(this, gl, vert.replace(/%SPRITE_UNIFORMS%/gi, lib.vertUniforms) |
|
|
|
.replace(/%SPRITE_CODE%/gi, lib.vertCode), frag.replace(/%SPRITE_UNIFORMS%/gi, lib.fragUniforms) |
|
|
|
.replace(/%SPRITE_CODE%/gi, lib.fragCode)) || this; |
|
|
|
_this.bind(); |
|
|
|
_this.tilingMode = tilingMode; |
|
|
|
_this.tempQuad = new PIXI.Quad(gl); |
|
|
|
_this.tempQuad.initVao(_this); |
|
|
|
_this.uniforms.uColor = new Float32Array([1, 1, 1, 1]); |
|
|
|
_this.uniforms.uSampler = [0, 1]; |
|
|
|
return _this; |
|
|
|
} |
|
|
|
PictureShader.blendVert = '\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\n\nuniform mat3 projectionMatrix;\nuniform mat3 mapMatrix;\n\nvarying vec2 vTextureCoord;\nvarying vec2 vMapCoord;\n%SPRITE_UNIFORMS%\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n %SPRITE_CODE%\n vMapCoord = (mapMatrix * vec3(aVertexPosition, 1.0)).xy;\n}\n'; |
|
|
|
return PictureShader; |
|
|
|
})(PIXI.Shader); |
|
|
|
pixi_picture.PictureShader = PictureShader; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
let overlayFrag = '\nvarying vec2 vTextureCoord;\nvarying vec2 vMapCoord;\nvarying vec4 vColor;\n\nuniform sampler2D uSampler[2];\nuniform vec4 uColor;\n%SPRITE_UNIFORMS%\n\nvoid main(void)\n{\n %SPRITE_CODE%\n vec4 source = texture2D(uSampler[0], textureCoord) * uColor;\n vec4 target = texture2D(uSampler[1], vMapCoord);\n\n //reverse hardlight\n if (source.a == 0.0) {\n gl_FragColor = vec4(0, 0, 0, 0);\n return;\n }\n //yeah, premultiplied\n vec3 Cb = source.rgb/source.a, Cs;\n if (target.a > 0.0) {\n Cs = target.rgb / target.a;\n }\n vec3 multiply = Cb * Cs * 2.0;\n vec3 Cs2 = Cs * 2.0 - 1.0;\n vec3 screen = Cb + Cs2 - Cb * Cs2;\n vec3 B;\n if (Cb.r <= 0.5) {\n B.r = multiply.r;\n } else {\n B.r = screen.r;\n }\n if (Cb.g <= 0.5) {\n B.g = multiply.g;\n } else {\n B.g = screen.g;\n }\n if (Cb.b <= 0.5) {\n B.b = multiply.b;\n } else {\n B.b = screen.b;\n }\n vec4 res;\n res.xyz = (1.0 - source.a) * Cs + source.a * B;\n res.a = source.a + target.a * (1.0-source.a);\n gl_FragColor = vec4(res.xyz * res.a, res.a);\n}\n'; |
|
|
|
let HardLightShader = (function (_super) { |
|
|
|
__extends(HardLightShader, _super); |
|
|
|
function HardLightShader (gl, tilingMode) { |
|
|
|
return _super.call(this, gl, pixi_picture.PictureShader.blendVert, overlayFrag, tilingMode) || this; |
|
|
|
} |
|
|
|
return HardLightShader; |
|
|
|
})(pixi_picture.PictureShader); |
|
|
|
pixi_picture.HardLightShader = HardLightShader; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
function mapFilterBlendModesToPixi (gl, array) { |
|
|
|
if (array === void 0) array = []; |
|
|
|
array[PIXI.BLEND_MODES.OVERLAY] = [new pixi_picture.OverlayShader(gl, 0), new pixi_picture.OverlayShader(gl, 1), new pixi_picture.OverlayShader(gl, 2)]; |
|
|
|
array[PIXI.BLEND_MODES.HARD_LIGHT] = [new pixi_picture.HardLightShader(gl, 0), new pixi_picture.HardLightShader(gl, 1), new pixi_picture.HardLightShader(gl, 2)]; |
|
|
|
array[PIXI.BLEND_MODES.SOFT_LIGHT] = [new pixi_picture.SoftLightShader(gl, 0), new pixi_picture.SoftLightShader(gl, 1), new pixi_picture.SoftLightShader(gl, 2)]; |
|
|
|
return array; |
|
|
|
} |
|
|
|
pixi_picture.mapFilterBlendModesToPixi = mapFilterBlendModesToPixi; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
let normalFrag = '\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform sampler2D uSampler[2];\nuniform vec4 uColor;\n%SPRITE_UNIFORMS%\n\nvoid main(void)\n{\n %SPRITE_CODE%\n\n vec4 sample = texture2D(uSampler[0], textureCoord);\n gl_FragColor = sample * uColor;\n}\n'; |
|
|
|
let normalVert = '\nattribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\nattribute vec4 aColor;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n%SPRITE_UNIFORMS%\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n %SPRITE_CODE%\n}\n'; |
|
|
|
let NormalShader = (function (_super) { |
|
|
|
__extends(NormalShader, _super); |
|
|
|
function NormalShader (gl, tilingMode) { |
|
|
|
return _super.call(this, gl, normalVert, normalFrag, tilingMode) || this; |
|
|
|
} |
|
|
|
return NormalShader; |
|
|
|
})(pixi_picture.PictureShader); |
|
|
|
pixi_picture.NormalShader = NormalShader; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
let overlayFrag = '\nvarying vec2 vTextureCoord;\nvarying vec2 vMapCoord;\nvarying vec4 vColor;\n\nuniform sampler2D uSampler[2];\nuniform vec4 uColor;\n%SPRITE_UNIFORMS%\n\nvoid main(void)\n{\n %SPRITE_CODE%\n vec4 source = texture2D(uSampler[0], textureCoord) * uColor;\n vec4 target = texture2D(uSampler[1], vMapCoord);\n\n //reverse hardlight\n if (source.a == 0.0) {\n gl_FragColor = vec4(0, 0, 0, 0);\n return;\n }\n //yeah, premultiplied\n vec3 Cb = source.rgb/source.a, Cs;\n if (target.a > 0.0) {\n Cs = target.rgb / target.a;\n }\n vec3 multiply = Cb * Cs * 2.0;\n vec3 Cb2 = Cb * 2.0 - 1.0;\n vec3 screen = Cb2 + Cs - Cb2 * Cs;\n vec3 B;\n if (Cs.r <= 0.5) {\n B.r = multiply.r;\n } else {\n B.r = screen.r;\n }\n if (Cs.g <= 0.5) {\n B.g = multiply.g;\n } else {\n B.g = screen.g;\n }\n if (Cs.b <= 0.5) {\n B.b = multiply.b;\n } else {\n B.b = screen.b;\n }\n vec4 res;\n res.xyz = (1.0 - source.a) * Cs + source.a * B;\n res.a = source.a + target.a * (1.0-source.a);\n gl_FragColor = vec4(res.xyz * res.a, res.a);\n}\n'; |
|
|
|
let OverlayShader = (function (_super) { |
|
|
|
__extends(OverlayShader, _super); |
|
|
|
function OverlayShader (gl, tilingMode) { |
|
|
|
return _super.call(this, gl, pixi_picture.PictureShader.blendVert, overlayFrag, tilingMode) || this; |
|
|
|
} |
|
|
|
return OverlayShader; |
|
|
|
})(pixi_picture.PictureShader); |
|
|
|
pixi_picture.OverlayShader = OverlayShader; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
let WRAP_MODES = PIXI.WRAP_MODES; |
|
|
|
function nextPow2 (v) { |
|
|
|
v += (v === 0) ? 1 : 0; |
|
|
|
--v; |
|
|
|
v |= v >>> 1; |
|
|
|
v |= v >>> 2; |
|
|
|
v |= v >>> 4; |
|
|
|
v |= v >>> 8; |
|
|
|
v |= v >>> 16; |
|
|
|
return v + 1; |
|
|
|
} |
|
|
|
let PictureRenderer = (function (_super) { |
|
|
|
__extends(PictureRenderer, _super); |
|
|
|
function PictureRenderer (renderer) { |
|
|
|
return _super.call(this, renderer) || this; |
|
|
|
} |
|
|
|
PictureRenderer.prototype.onContextChange = function () { |
|
|
|
pixi_picture.filterManagerMixin(this.renderer.filterManager); |
|
|
|
let gl = this.renderer.gl; |
|
|
|
this.drawModes = pixi_picture.mapFilterBlendModesToPixi(gl); |
|
|
|
this.normalShader = [new pixi_picture.NormalShader(gl, 0), new pixi_picture.NormalShader(gl, 1), new pixi_picture.NormalShader(gl, 2)]; |
|
|
|
this._tempClamp = new Float32Array(4); |
|
|
|
this._tempColor = new Float32Array(4); |
|
|
|
this._tempRect = new PIXI.Rectangle(); |
|
|
|
this._tempRect2 = new PIXI.Rectangle(); |
|
|
|
this._tempRect3 = new PIXI.Rectangle(); |
|
|
|
this._tempMatrix = new PIXI.Matrix(); |
|
|
|
this._tempMatrix2 = new PIXI.Matrix(); |
|
|
|
this._bigBuf = new Uint8Array(1 << 20); |
|
|
|
this._renderTexture = new PIXI.BaseRenderTexture(1024, 1024); |
|
|
|
}; |
|
|
|
PictureRenderer.prototype.start = function () { |
|
|
|
}; |
|
|
|
PictureRenderer.prototype.flush = function () { |
|
|
|
}; |
|
|
|
PictureRenderer.prototype._getRenderTexture = function (minWidth, minHeight) { |
|
|
|
if (this._renderTexture.width < minWidth || |
|
|
|
this._renderTexture.height < minHeight) { |
|
|
|
minWidth = nextPow2(minWidth); |
|
|
|
minHeight = nextPow2(minHeight); |
|
|
|
this._renderTexture.resize(minWidth, minHeight); |
|
|
|
} |
|
|
|
return this._renderTexture; |
|
|
|
}; |
|
|
|
PictureRenderer.prototype._getBuf = function (size) { |
|
|
|
let buf = this._bigBuf; |
|
|
|
if (buf.length < size) { |
|
|
|
size = nextPow2(size); |
|
|
|
buf = new Uint8Array(size); |
|
|
|
this._bigBuf = buf; |
|
|
|
} |
|
|
|
return buf; |
|
|
|
}; |
|
|
|
PictureRenderer.prototype.render = function (sprite) { |
|
|
|
if (!sprite.texture.valid) |
|
|
|
return; |
|
|
|
|
|
|
|
let tilingMode = 0; |
|
|
|
if (sprite.tileTransform) |
|
|
|
tilingMode = this._isSimpleSprite(sprite) ? 1 : 2; |
|
|
|
|
|
|
|
if (!this.drawModes) |
|
|
|
pixi_picture.mapFilterBlendModesToPixi(this.renderer.gl); |
|
|
|
let blendShader = this.drawModes[sprite.blendMode]; |
|
|
|
if (blendShader) |
|
|
|
this._renderBlend(sprite, blendShader[tilingMode]); |
|
|
|
|
|
|
|
else |
|
|
|
this._renderNormal(sprite, this.normalShader[tilingMode]); |
|
|
|
}; |
|
|
|
PictureRenderer.prototype._renderNormal = function (sprite, shader) { |
|
|
|
let renderer = this.renderer; |
|
|
|
renderer.bindShader(shader); |
|
|
|
renderer.state.setBlendMode(sprite.blendMode); |
|
|
|
this._renderInner(sprite, shader); |
|
|
|
}; |
|
|
|
PictureRenderer.prototype._renderBlend = function (sprite, shader) { |
|
|
|
let renderer = this.renderer; |
|
|
|
let spriteBounds = sprite.getBounds(); |
|
|
|
let renderTarget = renderer._activeRenderTarget; |
|
|
|
let matrix = renderTarget.projectionMatrix; |
|
|
|
let flipX = matrix.a < 0; |
|
|
|
let flipY = matrix.d < 0; |
|
|
|
let resolution = renderTarget.resolution; |
|
|
|
let screen = this._tempRect; |
|
|
|
let fr = renderTarget.sourceFrame || renderTarget.destinationFrame; |
|
|
|
screen.x = 0; |
|
|
|
screen.y = 0; |
|
|
|
screen.width = fr.width; |
|
|
|
screen.height = fr.height; |
|
|
|
let bounds = this._tempRect2; |
|
|
|
let fbw = fr.width * resolution, fbh = fr.height * resolution; |
|
|
|
bounds.x = (spriteBounds.x + matrix.tx / matrix.a) * resolution + fbw / 2; |
|
|
|
bounds.y = (spriteBounds.y + matrix.ty / matrix.d) * resolution + fbh / 2; |
|
|
|
bounds.width = spriteBounds.width * resolution; |
|
|
|
bounds.height = spriteBounds.height * resolution; |
|
|
|
if (flipX) |
|
|
|
bounds.y = fbw - bounds.width - bounds.x; |
|
|
|
|
|
|
|
if (flipY) |
|
|
|
bounds.y = fbh - bounds.height - bounds.y; |
|
|
|
|
|
|
|
let screenBounds = this._tempRect3; |
|
|
|
let x_1 = Math.floor(Math.max(screen.x, bounds.x)); |
|
|
|
let x_2 = Math.ceil(Math.min(screen.x + screen.width, bounds.x + bounds.width)); |
|
|
|
let y_1 = Math.floor(Math.max(screen.y, bounds.y)); |
|
|
|
let y_2 = Math.ceil(Math.min(screen.y + screen.height, bounds.y + bounds.height)); |
|
|
|
let pixelsWidth = x_2 - x_1; |
|
|
|
let pixelsHeight = y_2 - y_1; |
|
|
|
if (pixelsWidth <= 0 || pixelsHeight <= 0) |
|
|
|
return; |
|
|
|
|
|
|
|
let rt = this._getRenderTexture(pixelsWidth, pixelsHeight); |
|
|
|
renderer.bindTexture(rt, 1, true); |
|
|
|
let gl = renderer.gl; |
|
|
|
if (renderer.renderingToScreen && renderTarget.root) { |
|
|
|
let buf = this._getBuf(pixelsWidth * pixelsHeight * 4); |
|
|
|
gl.readPixels(x_1, y_1, pixelsWidth, pixelsHeight, gl.RGBA, gl.UNSIGNED_BYTE, this._bigBuf); |
|
|
|
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, pixelsWidth, pixelsHeight, gl.RGBA, gl.UNSIGNED_BYTE, this._bigBuf); |
|
|
|
} else |
|
|
|
gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, x_1, y_1, pixelsWidth, pixelsHeight); |
|
|
|
|
|
|
|
renderer.bindShader(shader); |
|
|
|
renderer.state.setBlendMode(PIXI.BLEND_MODES.NORMAL); |
|
|
|
if (shader.uniforms.mapMatrix) { |
|
|
|
let mapMatrix = this._tempMatrix; |
|
|
|
mapMatrix.a = bounds.width / rt.width / spriteBounds.width; |
|
|
|
if (flipX) { |
|
|
|
mapMatrix.a = -mapMatrix.a; |
|
|
|
mapMatrix.tx = (bounds.x - x_1) / rt.width - (spriteBounds.x + spriteBounds.width) * mapMatrix.a; |
|
|
|
} else |
|
|
|
mapMatrix.tx = (bounds.x - x_1) / rt.width - spriteBounds.x * mapMatrix.a; |
|
|
|
|
|
|
|
mapMatrix.d = bounds.height / rt.height / spriteBounds.height; |
|
|
|
if (flipY) { |
|
|
|
mapMatrix.d = -mapMatrix.d; |
|
|
|
mapMatrix.ty = (bounds.y - y_1) / rt.height - (spriteBounds.y + spriteBounds.height) * mapMatrix.d; |
|
|
|
} else |
|
|
|
mapMatrix.ty = (bounds.y - y_1) / rt.height - spriteBounds.y * mapMatrix.d; |
|
|
|
|
|
|
|
shader.uniforms.mapMatrix = mapMatrix.toArray(true); |
|
|
|
} |
|
|
|
this._renderInner(sprite, shader); |
|
|
|
}; |
|
|
|
PictureRenderer.prototype._renderInner = function (sprite, shader) { |
|
|
|
let renderer = this.renderer; |
|
|
|
if (shader.tilingMode > 0) |
|
|
|
this._renderWithShader(sprite, shader.tilingMode === 1, shader); |
|
|
|
|
|
|
|
else |
|
|
|
this._renderSprite(sprite, shader); |
|
|
|
}; |
|
|
|
PictureRenderer.prototype._renderWithShader = function (ts, isSimple, shader) { |
|
|
|
let quad = shader.tempQuad; |
|
|
|
let renderer = this.renderer; |
|
|
|
renderer.bindVao(quad.vao); |
|
|
|
let vertices = quad.vertices; |
|
|
|
let _width = ts._width; |
|
|
|
let _height = ts._height; |
|
|
|
let _anchorX = ts._anchor._x; |
|
|
|
let _anchorY = ts._anchor._y; |
|
|
|
let w0 = _width * (1 - _anchorX); |
|
|
|
let w1 = _width * -_anchorX; |
|
|
|
let h0 = _height * (1 - _anchorY); |
|
|
|
let h1 = _height * -_anchorY; |
|
|
|
let wt = ts.transform.worldTransform; |
|
|
|
let a = wt.a; |
|
|
|
let b = wt.b; |
|
|
|
let c = wt.c; |
|
|
|
let d = wt.d; |
|
|
|
let tx = wt.tx; |
|
|
|
let ty = wt.ty; |
|
|
|
vertices[0] = (a * w1) + (c * h1) + tx; |
|
|
|
vertices[1] = (d * h1) + (b * w1) + ty; |
|
|
|
vertices[2] = (a * w0) + (c * h1) + tx; |
|
|
|
vertices[3] = (d * h1) + (b * w0) + ty; |
|
|
|
vertices[4] = (a * w0) + (c * h0) + tx; |
|
|
|
vertices[5] = (d * h0) + (b * w0) + ty; |
|
|
|
vertices[6] = (a * w1) + (c * h0) + tx; |
|
|
|
vertices[7] = (d * h0) + (b * w1) + ty; |
|
|
|
vertices = quad.uvs; |
|
|
|
vertices[0] = vertices[6] = -ts.anchor.x; |
|
|
|
vertices[1] = vertices[3] = -ts.anchor.y; |
|
|
|
vertices[2] = vertices[4] = 1.0 - ts.anchor.x; |
|
|
|
vertices[5] = vertices[7] = 1.0 - ts.anchor.y; |
|
|
|
quad.upload(); |
|
|
|
let tex = ts._texture; |
|
|
|
let lt = ts.tileTransform.localTransform; |
|
|
|
let uv = ts.uvTransform; |
|
|
|
let mapCoord = uv.mapCoord; |
|
|
|
let uClampFrame = uv.uClampFrame; |
|
|
|
let uClampOffset = uv.uClampOffset; |
|
|
|
let w = tex.width; |
|
|
|
let h = tex.height; |
|
|
|
let W = _width; |
|
|
|
let H = _height; |
|
|
|
let tempMat = this._tempMatrix2; |
|
|
|
tempMat.set(lt.a * w / W, lt.b * w / H, lt.c * h / W, lt.d * h / H, lt.tx / W, lt.ty / H); |
|
|
|
tempMat.invert(); |
|
|
|
if (isSimple) |
|
|
|
tempMat.append(mapCoord); |
|
|
|
|
|
|
|
else { |
|
|
|
shader.uniforms.uMapCoord = mapCoord.toArray(true); |
|
|
|
shader.uniforms.uClampFrame = uClampFrame; |
|
|
|
shader.uniforms.uClampOffset = uClampOffset; |
|
|
|
} |
|
|
|
shader.uniforms.uTransform = tempMat.toArray(true); |
|
|
|
let color = this._tempColor; |
|
|
|
let alpha = ts.worldAlpha; |
|
|
|
PIXI.utils.hex2rgb(ts.tint, color); |
|
|
|
color[0] *= alpha; |
|
|
|
color[1] *= alpha; |
|
|
|
color[2] *= alpha; |
|
|
|
color[3] = alpha; |
|
|
|
shader.uniforms.uColor = color; |
|
|
|
renderer.bindTexture(tex, 0, true); |
|
|
|
quad.vao.draw(this.renderer.gl.TRIANGLES, 6, 0); |
|
|
|
}; |
|
|
|
PictureRenderer.prototype._renderSprite = function (sprite, shader) { |
|
|
|
let renderer = this.renderer; |
|
|
|
let quad = shader.tempQuad; |
|
|
|
renderer.bindVao(quad.vao); |
|
|
|
let uvs = sprite.texture._uvs; |
|
|
|
let vertices = quad.vertices; |
|
|
|
let vd = sprite.vertexData; |
|
|
|
for (let i = 0; i < 8; i++) |
|
|
|
quad.vertices[i] = vd[i]; |
|
|
|
|
|
|
|
quad.uvs[0] = uvs.x0; |
|
|
|
quad.uvs[1] = uvs.y0; |
|
|
|
quad.uvs[2] = uvs.x1; |
|
|
|
quad.uvs[3] = uvs.y1; |
|
|
|
quad.uvs[4] = uvs.x2; |
|
|
|
quad.uvs[5] = uvs.y2; |
|
|
|
quad.uvs[6] = uvs.x3; |
|
|
|
quad.uvs[7] = uvs.y3; |
|
|
|
quad.upload(); |
|
|
|
let frame = sprite.texture.frame; |
|
|
|
let base = sprite.texture.baseTexture; |
|
|
|
let clamp = this._tempClamp; |
|
|
|
let eps = 0.5 / base.resolution; |
|
|
|
clamp[0] = (frame.x + eps) / base.width; |
|
|
|
clamp[1] = (frame.y + eps) / base.height; |
|
|
|
clamp[2] = (frame.x + frame.width - eps) / base.width; |
|
|
|
clamp[3] = (frame.y + frame.height - eps) / base.height; |
|
|
|
shader.uniforms.uTextureClamp = clamp; |
|
|
|
let color = this._tempColor; |
|
|
|
PIXI.utils.hex2rgb(sprite.tint, color); |
|
|
|
let alpha = sprite.worldAlpha; |
|
|
|
color[0] *= alpha; |
|
|
|
color[1] *= alpha; |
|
|
|
color[2] *= alpha; |
|
|
|
color[3] = alpha; |
|
|
|
shader.uniforms.uColor = color; |
|
|
|
renderer.bindTexture(base, 0, true); |
|
|
|
quad.vao.draw(this.renderer.gl.TRIANGLES, 6, 0); |
|
|
|
}; |
|
|
|
PictureRenderer.prototype._isSimpleSprite = function (ts) { |
|
|
|
let renderer = this.renderer; |
|
|
|
let tex = ts._texture; |
|
|
|
let baseTex = tex.baseTexture; |
|
|
|
let isSimple = baseTex.isPowerOfTwo && tex.frame.width === baseTex.width && tex.frame.height === baseTex.height; |
|
|
|
if (isSimple) { |
|
|
|
if (!baseTex._glTextures[renderer.CONTEXT_UID]) { |
|
|
|
if (baseTex.wrapMode === WRAP_MODES.CLAMP) |
|
|
|
baseTex.wrapMode = WRAP_MODES.REPEAT; |
|
|
|
} else |
|
|
|
isSimple = baseTex.wrapMode !== WRAP_MODES.CLAMP; |
|
|
|
} |
|
|
|
return isSimple; |
|
|
|
}; |
|
|
|
return PictureRenderer; |
|
|
|
})(PIXI.ObjectRenderer); |
|
|
|
pixi_picture.PictureRenderer = PictureRenderer; |
|
|
|
PIXI.WebGLRenderer.registerPlugin('picture', PictureRenderer); |
|
|
|
//PIXI.CanvasRenderer.registerPlugin('picture', PIXI.CanvasSpriteRenderer); |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
let softLightFrag = '\nvarying vec2 vTextureCoord;\nvarying vec2 vMapCoord;\nvarying vec4 vColor;\n \nuniform sampler2D uSampler[2];\nuniform vec4 uColor;\n%SPRITE_UNIFORMS%\n\nvoid main(void)\n{\n %SPRITE_CODE%\n vec4 source = texture2D(uSampler[0], textureCoord) * uColor;\n vec4 target = texture2D(uSampler[1], vMapCoord);\n\n if (source.a == 0.0) {\n gl_FragColor = vec4(0, 0, 0, 0);\n return;\n }\n vec3 Cb = source.rgb/source.a, Cs;\n if (target.a > 0.0) {\n Cs = target.rgb / target.a;\n }\n \n vec3 first = Cb - (1.0 - 2.0 * Cs) * Cb * (1.0 - Cb);\n\n vec3 B;\n vec3 D;\n if (Cs.r <= 0.5)\n {\n B.r = first.r;\n }\n else\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 }\n if (Cs.g <= 0.5)\n {\n B.g = first.g;\n }\n else\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 }\n if (Cs.b <= 0.5)\n {\n B.b = first.b;\n }\n else\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\n vec4 res;\n\n res.xyz = (1.0 - source.a) * Cs + source.a * B;\n res.a = source.a + target.a * (1.0-source.a);\n gl_FragColor = vec4(res.xyz * res.a, res.a);\n}\n'; |
|
|
|
let SoftLightShader = (function (_super) { |
|
|
|
__extends(SoftLightShader, _super); |
|
|
|
function SoftLightShader (gl, tilingMode) { |
|
|
|
return _super.call(this, gl, pixi_picture.PictureShader.blendVert, softLightFrag, tilingMode) || this; |
|
|
|
} |
|
|
|
return SoftLightShader; |
|
|
|
})(pixi_picture.PictureShader); |
|
|
|
pixi_picture.SoftLightShader = SoftLightShader; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
let Sprite = (function (_super) { |
|
|
|
__extends(Sprite, _super); |
|
|
|
function Sprite (texture) { |
|
|
|
let _this = _super.call(this, texture) || this; |
|
|
|
_this.pluginName = 'picture'; |
|
|
|
return _this; |
|
|
|
} |
|
|
|
return Sprite; |
|
|
|
})(PIXI.Sprite); |
|
|
|
pixi_picture.Sprite = Sprite; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
let TilingSprite = (function (_super) { |
|
|
|
__extends(TilingSprite, _super); |
|
|
|
function TilingSprite (texture) { |
|
|
|
let _this = _super.call(this, texture) || this; |
|
|
|
_this.pluginName = 'picture'; |
|
|
|
return _this; |
|
|
|
} |
|
|
|
return TilingSprite; |
|
|
|
})(PIXI.extras.TilingSprite); |
|
|
|
pixi_picture.TilingSprite = TilingSprite; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |
|
|
|
var pixi_picture; |
|
|
|
(function (pixi_picture) { |
|
|
|
PIXI.picture = pixi_picture; |
|
|
|
})(pixi_picture || (pixi_picture = {})); |