You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

669 regels
29 KiB

  1. let __extends = (this && this.__extends) || (function () {
  2. let extendStatics = Object.setPrototypeOf ||
  3. ({ __proto__: [] } instanceof Array && function (d, b) {
  4. d.__proto__ = b;
  5. }) ||
  6. function (d, b) {
  7. for (let p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  8. };
  9. return function (d, b) {
  10. extendStatics(d, b);
  11. function __ () {
  12. this.constructor = d;
  13. }
  14. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  15. };
  16. })();
  17. var pixi_picture;
  18. (function (pixi_picture) {
  19. function filterManagerMixin (fm) {
  20. if (fm.prepareBackdrop)
  21. return;
  22. fm.pushFilter = pushFilter;
  23. fm.popFilter = popFilter;
  24. fm.syncUniforms = syncUniforms;
  25. fm.prepareBackdrop = prepareBackdrop;
  26. }
  27. pixi_picture.filterManagerMixin = filterManagerMixin;
  28. function pushFilter (target, filters) {
  29. let renderer = this.renderer;
  30. let filterData = this.filterData;
  31. if (!filterData) {
  32. filterData = this.renderer._activeRenderTarget.filterStack;
  33. let filterState = new FilterState();
  34. filterState.sourceFrame = filterState.destinationFrame = this.renderer._activeRenderTarget.size;
  35. filterState.renderTarget = renderer._activeRenderTarget;
  36. this.renderer._activeRenderTarget.filterData = filterData = {
  37. index: 0,
  38. stack: [filterState]
  39. };
  40. this.filterData = filterData;
  41. }
  42. let currentState = filterData.stack[++filterData.index];
  43. let renderTargetFrame = filterData.stack[0].destinationFrame;
  44. if (!currentState)
  45. currentState = filterData.stack[filterData.index] = new FilterState();
  46. let fullScreen = target.filterArea
  47. && target.filterArea.x === 0
  48. && target.filterArea.y === 0
  49. && target.filterArea.width === renderer.screen.width
  50. && target.filterArea.height === renderer.screen.height;
  51. let resolution = filters[0].resolution;
  52. let padding = filters[0].padding | 0;
  53. let targetBounds = fullScreen ? renderer.screen : (target.filterArea || target.getBounds(true));
  54. let sourceFrame = currentState.sourceFrame;
  55. let destinationFrame = currentState.destinationFrame;
  56. sourceFrame.x = ((targetBounds.x * resolution) | 0) / resolution;
  57. sourceFrame.y = ((targetBounds.y * resolution) | 0) / resolution;
  58. sourceFrame.width = ((targetBounds.width * resolution) | 0) / resolution;
  59. sourceFrame.height = ((targetBounds.height * resolution) | 0) / resolution;
  60. if (!fullScreen) {
  61. if (filterData.stack[0].renderTarget.transform) {
  62. } else if (filters[0].autoFit)
  63. sourceFrame.fit(renderTargetFrame);
  64. sourceFrame.pad(padding);
  65. }
  66. for (let i = 0; i < filters.length; i++) {
  67. let backdrop = null;
  68. if (filters[i].backdropUniformName) {
  69. if (backdrop === null)
  70. backdrop = this.prepareBackdrop(sourceFrame);
  71. filters[i]._backdropRenderTarget = backdrop;
  72. }
  73. }
  74. destinationFrame.width = sourceFrame.width;
  75. destinationFrame.height = sourceFrame.height;
  76. let renderTarget = this.getPotRenderTarget(renderer.gl, sourceFrame.width, sourceFrame.height, resolution);
  77. currentState.target = target;
  78. currentState.filters = filters;
  79. currentState.resolution = resolution;
  80. currentState.renderTarget = renderTarget;
  81. renderTarget.setFrame(destinationFrame, sourceFrame);
  82. renderer.bindRenderTarget(renderTarget);
  83. renderTarget.clear(filters[filters.length - 1].clearColor);
  84. }
  85. function popFilter () {
  86. let filterData = this.filterData;
  87. let lastState = filterData.stack[filterData.index - 1];
  88. let currentState = filterData.stack[filterData.index];
  89. this.quad.map(currentState.renderTarget.size, currentState.sourceFrame).upload();
  90. let filters = currentState.filters;
  91. if (filters.length === 1) {
  92. filters[0].apply(this, currentState.renderTarget, lastState.renderTarget, false, currentState);
  93. this.freePotRenderTarget(currentState.renderTarget);
  94. } else {
  95. let flip = currentState.renderTarget;
  96. let flop = this.getPotRenderTarget(this.renderer.gl, currentState.sourceFrame.width, currentState.sourceFrame.height, currentState.resolution);
  97. flop.setFrame(currentState.destinationFrame, currentState.sourceFrame);
  98. flop.clear();
  99. var i = 0;
  100. for (i = 0; i < filters.length - 1; ++i) {
  101. filters[i].apply(this, flip, flop, true, currentState);
  102. let t = flip;
  103. flip = flop;
  104. flop = t;
  105. }
  106. filters[i].apply(this, flip, lastState.renderTarget, false, currentState);
  107. this.freePotRenderTarget(flip);
  108. this.freePotRenderTarget(flop);
  109. }
  110. currentState.clear();
  111. let backdropFree = false;
  112. for (var i = 0; i < filters.length; i++) {
  113. if (filters[i]._backdropRenderTarget) {
  114. if (!backdropFree) {
  115. this.freePotRenderTarget(filters[i]._backdropRenderTarget);
  116. backdropFree = true;
  117. }
  118. filters[i]._backdropRenderTarget = null;
  119. }
  120. }
  121. filterData.index--;
  122. if (filterData.index === 0)
  123. this.filterData = null;
  124. }
  125. function syncUniforms (shader, filter) {
  126. let renderer = this.renderer;
  127. let gl = renderer.gl;
  128. let uniformData = filter.uniformData;
  129. let uniforms = filter.uniforms;
  130. let textureCount = 1;
  131. let currentState;
  132. if (shader.uniforms.filterArea) {
  133. currentState = this.filterData.stack[this.filterData.index];
  134. let filterArea = shader.uniforms.filterArea;
  135. filterArea[0] = currentState.renderTarget.size.width;
  136. filterArea[1] = currentState.renderTarget.size.height;
  137. filterArea[2] = currentState.sourceFrame.x;
  138. filterArea[3] = currentState.sourceFrame.y;
  139. shader.uniforms.filterArea = filterArea;
  140. }
  141. if (shader.uniforms.filterClamp) {
  142. currentState = currentState || this.filterData.stack[this.filterData.index];
  143. let filterClamp = shader.uniforms.filterClamp;
  144. filterClamp[0] = 0;
  145. filterClamp[1] = 0;
  146. filterClamp[2] = (currentState.sourceFrame.width - 1) / currentState.renderTarget.size.width;
  147. filterClamp[3] = (currentState.sourceFrame.height - 1) / currentState.renderTarget.size.height;
  148. shader.uniforms.filterClamp = filterClamp;
  149. }
  150. for (let i in uniformData) {
  151. if (!shader.uniforms.data[i])
  152. continue;
  153. if (i === filter.backdropUniformName) {
  154. let rt = filter._backdropRenderTarget;
  155. shader.uniforms[i] = textureCount;
  156. renderer.boundTextures[textureCount] = renderer.emptyTextures[textureCount];
  157. gl.activeTexture(gl.TEXTURE0 + textureCount);
  158. gl.bindTexture(gl.TEXTURE_2D, rt.texture.texture);
  159. textureCount++;
  160. continue;
  161. }
  162. let type = uniformData[i].type;
  163. if (type === 'sampler2d' && uniforms[i] !== 0) {
  164. if (uniforms[i].baseTexture)
  165. shader.uniforms[i] = this.renderer.bindTexture(uniforms[i].baseTexture, textureCount);
  166. else {
  167. shader.uniforms[i] = textureCount;
  168. let gl_1 = this.renderer.gl;
  169. renderer.boundTextures[textureCount] = renderer.emptyTextures[textureCount];
  170. gl_1.activeTexture(gl_1.TEXTURE0 + textureCount);
  171. uniforms[i].texture.bind();
  172. }
  173. textureCount++;
  174. } else if (type === 'mat3') {
  175. if (uniforms[i].a !== undefined)
  176. shader.uniforms[i] = uniforms[i].toArray(true);
  177. else
  178. shader.uniforms[i] = uniforms[i];
  179. } else if (type === 'vec2') {
  180. if (uniforms[i].x !== undefined) {
  181. let val = shader.uniforms[i] || new Float32Array(2);
  182. val[0] = uniforms[i].x;
  183. val[1] = uniforms[i].y;
  184. shader.uniforms[i] = val;
  185. } else
  186. shader.uniforms[i] = uniforms[i];
  187. } else if (type === 'float') {
  188. if (shader.uniforms.data[i].value !== uniformData[i])
  189. shader.uniforms[i] = uniforms[i];
  190. } else
  191. shader.uniforms[i] = uniforms[i];
  192. }
  193. }
  194. function prepareBackdrop (bounds) {
  195. let renderer = this.renderer;
  196. let renderTarget = renderer._activeRenderTarget;
  197. if (renderTarget.root)
  198. return null;
  199. let resolution = renderTarget.resolution;
  200. let fr = renderTarget.sourceFrame || renderTarget.destinationFrame;
  201. bounds.fit(fr);
  202. let x = (bounds.x - fr.x) * resolution;
  203. let y = (bounds.y - fr.y) * resolution;
  204. let w = (bounds.width) * resolution;
  205. let h = (bounds.height) * resolution;
  206. let gl = renderer.gl;
  207. let rt = this.getPotRenderTarget(gl, w, h, 1);
  208. renderer.boundTextures[1] = renderer.emptyTextures[1];
  209. gl.activeTexture(gl.TEXTURE0 + 1);
  210. gl.bindTexture(gl.TEXTURE_2D, rt.texture.texture);
  211. if (!rt.rebound) {
  212. renderer._activeRenderTarget = null;
  213. renderer.bindRenderTarget(renderTarget);
  214. rt.rebound = true;
  215. }
  216. gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, x, y, w, h);
  217. return rt;
  218. }
  219. var FilterState = (function () {
  220. function FilterState () {
  221. this.renderTarget = null;
  222. this.target = null;
  223. this.resolution = 1;
  224. this.sourceFrame = new PIXI.Rectangle();
  225. this.destinationFrame = new PIXI.Rectangle();
  226. this.filters = [];
  227. }
  228. FilterState.prototype.clear = function () {
  229. this.filters = null;
  230. this.target = null;
  231. this.renderTarget = null;
  232. };
  233. return FilterState;
  234. })();
  235. let BackdropFilter = (function (_super) {
  236. __extends(BackdropFilter, _super);
  237. function BackdropFilter () {
  238. let _this = _super !== null && _super.apply(this, arguments) || this;
  239. _this.backdropUniformName = null;
  240. _this._backdropRenderTarget = null;
  241. _this.clearColor = null;
  242. return _this;
  243. }
  244. return BackdropFilter;
  245. })(PIXI.Filter);
  246. pixi_picture.BackdropFilter = BackdropFilter;
  247. })(pixi_picture || (pixi_picture = {}));
  248. var pixi_picture;
  249. (function (pixi_picture) {
  250. let shaderLib = [
  251. {
  252. vertUniforms: '',
  253. vertCode: 'vTextureCoord = aTextureCoord;',
  254. fragUniforms: 'uniform vec4 uTextureClamp;',
  255. fragCode: 'vec2 textureCoord = clamp(vTextureCoord, uTextureClamp.xy, uTextureClamp.zw);'
  256. },
  257. {
  258. vertUniforms: 'uniform mat3 uTransform;',
  259. vertCode: 'vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;',
  260. fragUniforms: '',
  261. fragCode: 'vec2 textureCoord = vTextureCoord;'
  262. },
  263. {
  264. vertUniforms: 'uniform mat3 uTransform;',
  265. vertCode: 'vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;',
  266. fragUniforms: 'uniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;',
  267. fragCode: 'vec2 textureCoord = mod(vTextureCoord - uClampOffset, vec2(1.0, 1.0)) + uClampOffset;' +
  268. '\ntextureCoord = (uMapCoord * vec3(textureCoord, 1.0)).xy;' +
  269. '\ntextureCoord = clamp(textureCoord, uClampFrame.xy, uClampFrame.zw);'
  270. }
  271. ];
  272. let PictureShader = (function (_super) {
  273. __extends(PictureShader, _super);
  274. function PictureShader (gl, vert, frag, tilingMode) {
  275. let _this = this;
  276. let lib = shaderLib[tilingMode];
  277. _this = _super.call(this, gl, vert.replace(/%SPRITE_UNIFORMS%/gi, lib.vertUniforms)
  278. .replace(/%SPRITE_CODE%/gi, lib.vertCode), frag.replace(/%SPRITE_UNIFORMS%/gi, lib.fragUniforms)
  279. .replace(/%SPRITE_CODE%/gi, lib.fragCode)) || this;
  280. _this.bind();
  281. _this.tilingMode = tilingMode;
  282. _this.tempQuad = new PIXI.Quad(gl);
  283. _this.tempQuad.initVao(_this);
  284. _this.uniforms.uColor = new Float32Array([1, 1, 1, 1]);
  285. _this.uniforms.uSampler = [0, 1];
  286. return _this;
  287. }
  288. 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';
  289. return PictureShader;
  290. })(PIXI.Shader);
  291. pixi_picture.PictureShader = PictureShader;
  292. })(pixi_picture || (pixi_picture = {}));
  293. var pixi_picture;
  294. (function (pixi_picture) {
  295. 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';
  296. let HardLightShader = (function (_super) {
  297. __extends(HardLightShader, _super);
  298. function HardLightShader (gl, tilingMode) {
  299. return _super.call(this, gl, pixi_picture.PictureShader.blendVert, overlayFrag, tilingMode) || this;
  300. }
  301. return HardLightShader;
  302. })(pixi_picture.PictureShader);
  303. pixi_picture.HardLightShader = HardLightShader;
  304. })(pixi_picture || (pixi_picture = {}));
  305. var pixi_picture;
  306. (function (pixi_picture) {
  307. function mapFilterBlendModesToPixi (gl, array) {
  308. if (array === void 0) array = [];
  309. array[PIXI.BLEND_MODES.OVERLAY] = [new pixi_picture.OverlayShader(gl, 0), new pixi_picture.OverlayShader(gl, 1), new pixi_picture.OverlayShader(gl, 2)];
  310. array[PIXI.BLEND_MODES.HARD_LIGHT] = [new pixi_picture.HardLightShader(gl, 0), new pixi_picture.HardLightShader(gl, 1), new pixi_picture.HardLightShader(gl, 2)];
  311. array[PIXI.BLEND_MODES.SOFT_LIGHT] = [new pixi_picture.SoftLightShader(gl, 0), new pixi_picture.SoftLightShader(gl, 1), new pixi_picture.SoftLightShader(gl, 2)];
  312. return array;
  313. }
  314. pixi_picture.mapFilterBlendModesToPixi = mapFilterBlendModesToPixi;
  315. })(pixi_picture || (pixi_picture = {}));
  316. var pixi_picture;
  317. (function (pixi_picture) {
  318. 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';
  319. 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';
  320. let NormalShader = (function (_super) {
  321. __extends(NormalShader, _super);
  322. function NormalShader (gl, tilingMode) {
  323. return _super.call(this, gl, normalVert, normalFrag, tilingMode) || this;
  324. }
  325. return NormalShader;
  326. })(pixi_picture.PictureShader);
  327. pixi_picture.NormalShader = NormalShader;
  328. })(pixi_picture || (pixi_picture = {}));
  329. var pixi_picture;
  330. (function (pixi_picture) {
  331. 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';
  332. let OverlayShader = (function (_super) {
  333. __extends(OverlayShader, _super);
  334. function OverlayShader (gl, tilingMode) {
  335. return _super.call(this, gl, pixi_picture.PictureShader.blendVert, overlayFrag, tilingMode) || this;
  336. }
  337. return OverlayShader;
  338. })(pixi_picture.PictureShader);
  339. pixi_picture.OverlayShader = OverlayShader;
  340. })(pixi_picture || (pixi_picture = {}));
  341. var pixi_picture;
  342. (function (pixi_picture) {
  343. let WRAP_MODES = PIXI.WRAP_MODES;
  344. function nextPow2 (v) {
  345. v += (v === 0) ? 1 : 0;
  346. --v;
  347. v |= v >>> 1;
  348. v |= v >>> 2;
  349. v |= v >>> 4;
  350. v |= v >>> 8;
  351. v |= v >>> 16;
  352. return v + 1;
  353. }
  354. let PictureRenderer = (function (_super) {
  355. __extends(PictureRenderer, _super);
  356. function PictureRenderer (renderer) {
  357. return _super.call(this, renderer) || this;
  358. }
  359. PictureRenderer.prototype.onContextChange = function () {
  360. pixi_picture.filterManagerMixin(this.renderer.filterManager);
  361. let gl = this.renderer.gl;
  362. this.drawModes = pixi_picture.mapFilterBlendModesToPixi(gl);
  363. this.normalShader = [new pixi_picture.NormalShader(gl, 0), new pixi_picture.NormalShader(gl, 1), new pixi_picture.NormalShader(gl, 2)];
  364. this._tempClamp = new Float32Array(4);
  365. this._tempColor = new Float32Array(4);
  366. this._tempRect = new PIXI.Rectangle();
  367. this._tempRect2 = new PIXI.Rectangle();
  368. this._tempRect3 = new PIXI.Rectangle();
  369. this._tempMatrix = new PIXI.Matrix();
  370. this._tempMatrix2 = new PIXI.Matrix();
  371. this._bigBuf = new Uint8Array(1 << 20);
  372. this._renderTexture = new PIXI.BaseRenderTexture(1024, 1024);
  373. };
  374. PictureRenderer.prototype.start = function () {
  375. };
  376. PictureRenderer.prototype.flush = function () {
  377. };
  378. PictureRenderer.prototype._getRenderTexture = function (minWidth, minHeight) {
  379. if (this._renderTexture.width < minWidth ||
  380. this._renderTexture.height < minHeight) {
  381. minWidth = nextPow2(minWidth);
  382. minHeight = nextPow2(minHeight);
  383. this._renderTexture.resize(minWidth, minHeight);
  384. }
  385. return this._renderTexture;
  386. };
  387. PictureRenderer.prototype._getBuf = function (size) {
  388. let buf = this._bigBuf;
  389. if (buf.length < size) {
  390. size = nextPow2(size);
  391. buf = new Uint8Array(size);
  392. this._bigBuf = buf;
  393. }
  394. return buf;
  395. };
  396. PictureRenderer.prototype.render = function (sprite) {
  397. if (!sprite.texture.valid)
  398. return;
  399. let tilingMode = 0;
  400. if (sprite.tileTransform)
  401. tilingMode = this._isSimpleSprite(sprite) ? 1 : 2;
  402. let blendShader = this.drawModes[sprite.blendMode];
  403. if (blendShader)
  404. this._renderBlend(sprite, blendShader[tilingMode]);
  405. else
  406. this._renderNormal(sprite, this.normalShader[tilingMode]);
  407. };
  408. PictureRenderer.prototype._renderNormal = function (sprite, shader) {
  409. let renderer = this.renderer;
  410. renderer.bindShader(shader);
  411. renderer.state.setBlendMode(sprite.blendMode);
  412. this._renderInner(sprite, shader);
  413. };
  414. PictureRenderer.prototype._renderBlend = function (sprite, shader) {
  415. let renderer = this.renderer;
  416. let spriteBounds = sprite.getBounds();
  417. let renderTarget = renderer._activeRenderTarget;
  418. let matrix = renderTarget.projectionMatrix;
  419. let flipX = matrix.a < 0;
  420. let flipY = matrix.d < 0;
  421. let resolution = renderTarget.resolution;
  422. let screen = this._tempRect;
  423. let fr = renderTarget.sourceFrame || renderTarget.destinationFrame;
  424. screen.x = 0;
  425. screen.y = 0;
  426. screen.width = fr.width;
  427. screen.height = fr.height;
  428. let bounds = this._tempRect2;
  429. let fbw = fr.width * resolution, fbh = fr.height * resolution;
  430. bounds.x = (spriteBounds.x + matrix.tx / matrix.a) * resolution + fbw / 2;
  431. bounds.y = (spriteBounds.y + matrix.ty / matrix.d) * resolution + fbh / 2;
  432. bounds.width = spriteBounds.width * resolution;
  433. bounds.height = spriteBounds.height * resolution;
  434. if (flipX)
  435. bounds.y = fbw - bounds.width - bounds.x;
  436. if (flipY)
  437. bounds.y = fbh - bounds.height - bounds.y;
  438. let screenBounds = this._tempRect3;
  439. let x_1 = Math.floor(Math.max(screen.x, bounds.x));
  440. let x_2 = Math.ceil(Math.min(screen.x + screen.width, bounds.x + bounds.width));
  441. let y_1 = Math.floor(Math.max(screen.y, bounds.y));
  442. let y_2 = Math.ceil(Math.min(screen.y + screen.height, bounds.y + bounds.height));
  443. let pixelsWidth = x_2 - x_1;
  444. let pixelsHeight = y_2 - y_1;
  445. if (pixelsWidth <= 0 || pixelsHeight <= 0)
  446. return;
  447. let rt = this._getRenderTexture(pixelsWidth, pixelsHeight);
  448. renderer.bindTexture(rt, 1, true);
  449. let gl = renderer.gl;
  450. if (renderer.renderingToScreen && renderTarget.root) {
  451. let buf = this._getBuf(pixelsWidth * pixelsHeight * 4);
  452. gl.readPixels(x_1, y_1, pixelsWidth, pixelsHeight, gl.RGBA, gl.UNSIGNED_BYTE, this._bigBuf);
  453. gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, pixelsWidth, pixelsHeight, gl.RGBA, gl.UNSIGNED_BYTE, this._bigBuf);
  454. } else
  455. gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, x_1, y_1, pixelsWidth, pixelsHeight);
  456. renderer.bindShader(shader);
  457. renderer.state.setBlendMode(PIXI.BLEND_MODES.NORMAL);
  458. if (shader.uniforms.mapMatrix) {
  459. let mapMatrix = this._tempMatrix;
  460. mapMatrix.a = bounds.width / rt.width / spriteBounds.width;
  461. if (flipX) {
  462. mapMatrix.a = -mapMatrix.a;
  463. mapMatrix.tx = (bounds.x - x_1) / rt.width - (spriteBounds.x + spriteBounds.width) * mapMatrix.a;
  464. } else
  465. mapMatrix.tx = (bounds.x - x_1) / rt.width - spriteBounds.x * mapMatrix.a;
  466. mapMatrix.d = bounds.height / rt.height / spriteBounds.height;
  467. if (flipY) {
  468. mapMatrix.d = -mapMatrix.d;
  469. mapMatrix.ty = (bounds.y - y_1) / rt.height - (spriteBounds.y + spriteBounds.height) * mapMatrix.d;
  470. } else
  471. mapMatrix.ty = (bounds.y - y_1) / rt.height - spriteBounds.y * mapMatrix.d;
  472. shader.uniforms.mapMatrix = mapMatrix.toArray(true);
  473. }
  474. this._renderInner(sprite, shader);
  475. };
  476. PictureRenderer.prototype._renderInner = function (sprite, shader) {
  477. let renderer = this.renderer;
  478. if (shader.tilingMode > 0)
  479. this._renderWithShader(sprite, shader.tilingMode === 1, shader);
  480. else
  481. this._renderSprite(sprite, shader);
  482. };
  483. PictureRenderer.prototype._renderWithShader = function (ts, isSimple, shader) {
  484. let quad = shader.tempQuad;
  485. let renderer = this.renderer;
  486. renderer.bindVao(quad.vao);
  487. let vertices = quad.vertices;
  488. let _width = ts._width;
  489. let _height = ts._height;
  490. let _anchorX = ts._anchor._x;
  491. let _anchorY = ts._anchor._y;
  492. let w0 = _width * (1 - _anchorX);
  493. let w1 = _width * -_anchorX;
  494. let h0 = _height * (1 - _anchorY);
  495. let h1 = _height * -_anchorY;
  496. let wt = ts.transform.worldTransform;
  497. let a = wt.a;
  498. let b = wt.b;
  499. let c = wt.c;
  500. let d = wt.d;
  501. let tx = wt.tx;
  502. let ty = wt.ty;
  503. vertices[0] = (a * w1) + (c * h1) + tx;
  504. vertices[1] = (d * h1) + (b * w1) + ty;
  505. vertices[2] = (a * w0) + (c * h1) + tx;
  506. vertices[3] = (d * h1) + (b * w0) + ty;
  507. vertices[4] = (a * w0) + (c * h0) + tx;
  508. vertices[5] = (d * h0) + (b * w0) + ty;
  509. vertices[6] = (a * w1) + (c * h0) + tx;
  510. vertices[7] = (d * h0) + (b * w1) + ty;
  511. vertices = quad.uvs;
  512. vertices[0] = vertices[6] = -ts.anchor.x;
  513. vertices[1] = vertices[3] = -ts.anchor.y;
  514. vertices[2] = vertices[4] = 1.0 - ts.anchor.x;
  515. vertices[5] = vertices[7] = 1.0 - ts.anchor.y;
  516. quad.upload();
  517. let tex = ts._texture;
  518. let lt = ts.tileTransform.localTransform;
  519. let uv = ts.uvTransform;
  520. let mapCoord = uv.mapCoord;
  521. let uClampFrame = uv.uClampFrame;
  522. let uClampOffset = uv.uClampOffset;
  523. let w = tex.width;
  524. let h = tex.height;
  525. let W = _width;
  526. let H = _height;
  527. let tempMat = this._tempMatrix2;
  528. tempMat.set(lt.a * w / W, lt.b * w / H, lt.c * h / W, lt.d * h / H, lt.tx / W, lt.ty / H);
  529. tempMat.invert();
  530. if (isSimple)
  531. tempMat.append(mapCoord);
  532. else {
  533. shader.uniforms.uMapCoord = mapCoord.toArray(true);
  534. shader.uniforms.uClampFrame = uClampFrame;
  535. shader.uniforms.uClampOffset = uClampOffset;
  536. }
  537. shader.uniforms.uTransform = tempMat.toArray(true);
  538. let color = this._tempColor;
  539. let alpha = ts.worldAlpha;
  540. PIXI.utils.hex2rgb(ts.tint, color);
  541. color[0] *= alpha;
  542. color[1] *= alpha;
  543. color[2] *= alpha;
  544. color[3] = alpha;
  545. shader.uniforms.uColor = color;
  546. renderer.bindTexture(tex, 0, true);
  547. quad.vao.draw(this.renderer.gl.TRIANGLES, 6, 0);
  548. };
  549. PictureRenderer.prototype._renderSprite = function (sprite, shader) {
  550. let renderer = this.renderer;
  551. let quad = shader.tempQuad;
  552. renderer.bindVao(quad.vao);
  553. let uvs = sprite.texture._uvs;
  554. let vertices = quad.vertices;
  555. let vd = sprite.vertexData;
  556. for (let i = 0; i < 8; i++)
  557. quad.vertices[i] = vd[i];
  558. quad.uvs[0] = uvs.x0;
  559. quad.uvs[1] = uvs.y0;
  560. quad.uvs[2] = uvs.x1;
  561. quad.uvs[3] = uvs.y1;
  562. quad.uvs[4] = uvs.x2;
  563. quad.uvs[5] = uvs.y2;
  564. quad.uvs[6] = uvs.x3;
  565. quad.uvs[7] = uvs.y3;
  566. quad.upload();
  567. let frame = sprite.texture.frame;
  568. let base = sprite.texture.baseTexture;
  569. let clamp = this._tempClamp;
  570. let eps = 0.5 / base.resolution;
  571. clamp[0] = (frame.x + eps) / base.width;
  572. clamp[1] = (frame.y + eps) / base.height;
  573. clamp[2] = (frame.x + frame.width - eps) / base.width;
  574. clamp[3] = (frame.y + frame.height - eps) / base.height;
  575. shader.uniforms.uTextureClamp = clamp;
  576. let color = this._tempColor;
  577. PIXI.utils.hex2rgb(sprite.tint, color);
  578. let alpha = sprite.worldAlpha;
  579. color[0] *= alpha;
  580. color[1] *= alpha;
  581. color[2] *= alpha;
  582. color[3] = alpha;
  583. shader.uniforms.uColor = color;
  584. renderer.bindTexture(base, 0, true);
  585. quad.vao.draw(this.renderer.gl.TRIANGLES, 6, 0);
  586. };
  587. PictureRenderer.prototype._isSimpleSprite = function (ts) {
  588. let renderer = this.renderer;
  589. let tex = ts._texture;
  590. let baseTex = tex.baseTexture;
  591. let isSimple = baseTex.isPowerOfTwo && tex.frame.width === baseTex.width && tex.frame.height === baseTex.height;
  592. if (isSimple) {
  593. if (!baseTex._glTextures[renderer.CONTEXT_UID]) {
  594. if (baseTex.wrapMode === WRAP_MODES.CLAMP)
  595. baseTex.wrapMode = WRAP_MODES.REPEAT;
  596. } else
  597. isSimple = baseTex.wrapMode !== WRAP_MODES.CLAMP;
  598. }
  599. return isSimple;
  600. };
  601. return PictureRenderer;
  602. })(PIXI.ObjectRenderer);
  603. pixi_picture.PictureRenderer = PictureRenderer;
  604. PIXI.WebGLRenderer.registerPlugin('picture', PictureRenderer);
  605. //PIXI.CanvasRenderer.registerPlugin('picture', PIXI.CanvasSpriteRenderer);
  606. })(pixi_picture || (pixi_picture = {}));
  607. var pixi_picture;
  608. (function (pixi_picture) {
  609. 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';
  610. let SoftLightShader = (function (_super) {
  611. __extends(SoftLightShader, _super);
  612. function SoftLightShader (gl, tilingMode) {
  613. return _super.call(this, gl, pixi_picture.PictureShader.blendVert, softLightFrag, tilingMode) || this;
  614. }
  615. return SoftLightShader;
  616. })(pixi_picture.PictureShader);
  617. pixi_picture.SoftLightShader = SoftLightShader;
  618. })(pixi_picture || (pixi_picture = {}));
  619. var pixi_picture;
  620. (function (pixi_picture) {
  621. let Sprite = (function (_super) {
  622. __extends(Sprite, _super);
  623. function Sprite (texture) {
  624. let _this = _super.call(this, texture) || this;
  625. _this.pluginName = 'picture';
  626. return _this;
  627. }
  628. return Sprite;
  629. })(PIXI.Sprite);
  630. pixi_picture.Sprite = Sprite;
  631. })(pixi_picture || (pixi_picture = {}));
  632. var pixi_picture;
  633. (function (pixi_picture) {
  634. let TilingSprite = (function (_super) {
  635. __extends(TilingSprite, _super);
  636. function TilingSprite (texture) {
  637. let _this = _super.call(this, texture) || this;
  638. _this.pluginName = 'picture';
  639. return _this;
  640. }
  641. return TilingSprite;
  642. })(PIXI.extras.TilingSprite);
  643. pixi_picture.TilingSprite = TilingSprite;
  644. })(pixi_picture || (pixi_picture = {}));
  645. var pixi_picture;
  646. (function (pixi_picture) {
  647. PIXI.picture = pixi_picture;
  648. })(pixi_picture || (pixi_picture = {}));
  649. //# sourceMappingURL=pixi-picture.js.map