@blakron/core 0.4.3 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/blakron/display/DisplayObject.d.ts +1 -1
  2. package/dist/blakron/display/DisplayObject.d.ts.map +1 -1
  3. package/dist/blakron/display/DisplayObject.js +1 -1
  4. package/dist/blakron/display/DisplayObject.js.map +1 -1
  5. package/dist/blakron/player/CanvasRenderer.d.ts +49 -0
  6. package/dist/blakron/player/CanvasRenderer.d.ts.map +1 -0
  7. package/dist/blakron/player/CanvasRenderer.js +792 -0
  8. package/dist/blakron/player/CanvasRenderer.js.map +1 -0
  9. package/dist/blakron/player/DisplayList.d.ts +32 -0
  10. package/dist/blakron/player/DisplayList.d.ts.map +1 -0
  11. package/dist/blakron/player/DisplayList.js +78 -0
  12. package/dist/blakron/player/DisplayList.js.map +1 -0
  13. package/dist/blakron/player/InstructionSet.d.ts +49 -0
  14. package/dist/blakron/player/InstructionSet.d.ts.map +1 -0
  15. package/dist/blakron/player/InstructionSet.js +45 -0
  16. package/dist/blakron/player/InstructionSet.js.map +1 -0
  17. package/dist/blakron/player/Player.d.ts.map +1 -1
  18. package/dist/blakron/player/Player.js +2 -1
  19. package/dist/blakron/player/Player.js.map +1 -1
  20. package/dist/blakron/player/RenderBuffer.d.ts +35 -0
  21. package/dist/blakron/player/RenderBuffer.d.ts.map +1 -0
  22. package/dist/blakron/player/RenderBuffer.js +83 -0
  23. package/dist/blakron/player/RenderBuffer.js.map +1 -0
  24. package/dist/blakron/player/RenderPipe.d.ts +1 -1
  25. package/dist/blakron/player/RenderPipe.d.ts.map +1 -1
  26. package/dist/blakron/player/createPlayer.d.ts.map +1 -1
  27. package/dist/blakron/player/createPlayer.js +2 -1
  28. package/dist/blakron/player/createPlayer.js.map +1 -1
  29. package/dist/blakron/player/index.d.ts +4 -2
  30. package/dist/blakron/player/index.d.ts.map +1 -1
  31. package/dist/blakron/player/index.js +4 -2
  32. package/dist/blakron/player/index.js.map +1 -1
  33. package/dist/blakron/player/pipes/BitmapPipe.d.ts +35 -0
  34. package/dist/blakron/player/pipes/BitmapPipe.d.ts.map +1 -0
  35. package/dist/blakron/player/pipes/BitmapPipe.js +130 -0
  36. package/dist/blakron/player/pipes/BitmapPipe.js.map +1 -0
  37. package/dist/blakron/player/pipes/FilterPipe.d.ts +68 -0
  38. package/dist/blakron/player/pipes/FilterPipe.d.ts.map +1 -0
  39. package/dist/blakron/player/pipes/FilterPipe.js +169 -0
  40. package/dist/blakron/player/pipes/FilterPipe.js.map +1 -0
  41. package/dist/blakron/player/pipes/GraphicsPipe.d.ts +36 -0
  42. package/dist/blakron/player/pipes/GraphicsPipe.d.ts.map +1 -0
  43. package/dist/blakron/player/pipes/GraphicsPipe.js +126 -0
  44. package/dist/blakron/player/pipes/GraphicsPipe.js.map +1 -0
  45. package/dist/blakron/player/pipes/MaskPipe.d.ts +58 -0
  46. package/dist/blakron/player/pipes/MaskPipe.d.ts.map +1 -0
  47. package/dist/blakron/player/pipes/MaskPipe.js +190 -0
  48. package/dist/blakron/player/pipes/MaskPipe.js.map +1 -0
  49. package/dist/blakron/player/pipes/MeshPipe.d.ts +22 -0
  50. package/dist/blakron/player/pipes/MeshPipe.d.ts.map +1 -0
  51. package/dist/blakron/player/pipes/MeshPipe.js +50 -0
  52. package/dist/blakron/player/pipes/MeshPipe.js.map +1 -0
  53. package/dist/blakron/player/pipes/TextPipe.d.ts +52 -0
  54. package/dist/blakron/player/pipes/TextPipe.d.ts.map +1 -0
  55. package/dist/blakron/player/pipes/TextPipe.js +163 -0
  56. package/dist/blakron/player/pipes/TextPipe.js.map +1 -0
  57. package/dist/blakron/player/webgl/ShaderLib.d.ts +34 -0
  58. package/dist/blakron/player/webgl/ShaderLib.d.ts.map +1 -0
  59. package/dist/blakron/player/webgl/ShaderLib.js +268 -0
  60. package/dist/blakron/player/webgl/ShaderLib.js.map +1 -0
  61. package/dist/blakron/player/webgl/WebGLProgram.d.ts +2 -3
  62. package/dist/blakron/player/webgl/WebGLProgram.d.ts.map +1 -1
  63. package/dist/blakron/player/webgl/WebGLProgram.js.map +1 -1
  64. package/dist/blakron/player/webgl/WebGLRenderContext.d.ts +1 -9
  65. package/dist/blakron/player/webgl/WebGLRenderContext.d.ts.map +1 -1
  66. package/dist/blakron/player/webgl/WebGLRenderContext.js +14 -45
  67. package/dist/blakron/player/webgl/WebGLRenderContext.js.map +1 -1
  68. package/dist/blakron/player/webgl/WebGLRenderTarget.d.ts +1 -2
  69. package/dist/blakron/player/webgl/WebGLRenderTarget.d.ts.map +1 -1
  70. package/dist/blakron/player/webgl/WebGLRenderTarget.js.map +1 -1
  71. package/dist/blakron/player/webgl/WebGLRenderer.d.ts.map +1 -1
  72. package/dist/blakron/player/webgl/WebGLRenderer.js +8 -3
  73. package/dist/blakron/player/webgl/WebGLRenderer.js.map +1 -1
  74. package/dist/blakron/player/webgl/WebGLUtils.d.ts +3 -9
  75. package/dist/blakron/player/webgl/WebGLUtils.d.ts.map +1 -1
  76. package/dist/blakron/player/webgl/WebGLUtils.js +2 -2
  77. package/dist/blakron/player/webgl/WebGLUtils.js.map +1 -1
  78. package/dist/blakron/player/webgl/index.d.ts +1 -1
  79. package/dist/blakron/player/webgl/index.d.ts.map +1 -1
  80. package/dist/blakron/player/webgl/index.js +1 -1
  81. package/dist/blakron/player/webgl/index.js.map +1 -1
  82. package/package.json +52 -51
@@ -0,0 +1,130 @@
1
+ // ── Pipe ──────────────────────────────────────────────────────────────────────
2
+ /**
3
+ * Handles WebGL rendering of Bitmap display objects.
4
+ *
5
+ * addToInstructionSet — called once when the scene structure changes.
6
+ * updateRenderable — called every frame when only data changed.
7
+ * execute — issues the actual WebGL draw call.
8
+ */
9
+ export class BitmapPipe {
10
+ static PIPE_ID = 'bitmap';
11
+ // Pool of reusable instruction objects to avoid per-frame allocation.
12
+ static _pool = [];
13
+ static _alloc(bitmap, offsetX, offsetY) {
14
+ const inst = BitmapPipe._pool.pop() ?? {
15
+ renderPipeId: 'bitmap',
16
+ renderable: bitmap,
17
+ offsetX,
18
+ offsetY,
19
+ };
20
+ inst.renderable = bitmap;
21
+ inst.offsetX = offsetX;
22
+ inst.offsetY = offsetY;
23
+ return inst;
24
+ }
25
+ static release(inst) {
26
+ BitmapPipe._pool.push(inst);
27
+ }
28
+ // ── RenderPipe impl ───────────────────────────────────────────────────────
29
+ addToInstructionSet(bitmap, set) {
30
+ // offsetX/Y are patched at execute time from the buffer state;
31
+ // store 0 as placeholder — the renderer sets them before calling execute.
32
+ set.add(BitmapPipe._alloc(bitmap, 0, 0));
33
+ }
34
+ updateRenderable(_bitmap) {
35
+ // Bitmap data is read directly from the DisplayObject at execute time,
36
+ // so no pre-upload step is needed here.
37
+ }
38
+ destroyRenderable(_bitmap) {
39
+ // BitmapData GPU textures are managed by WebGLRenderContext.getWebGLTexture()
40
+ // and released when BitmapData itself is destroyed — nothing to do here.
41
+ }
42
+ // ── Execute ───────────────────────────────────────────────────────────────
43
+ /**
44
+ * Issue the draw call for a BitmapInstruction.
45
+ * Called by WebGLRenderer._executeInstructions().
46
+ */
47
+ execute(inst, buffer) {
48
+ const bitmap = inst.renderable;
49
+ const bd = bitmap.bitmapData;
50
+ if (!bd?.source)
51
+ return;
52
+ const destW = !isNaN(bitmap.width) ? bitmap.width : bitmap.textureWidth;
53
+ const destH = !isNaN(bitmap.height) ? bitmap.height : bitmap.textureHeight;
54
+ if (destW <= 0 || destH <= 0)
55
+ return;
56
+ buffer.offsetX = 0;
57
+ buffer.offsetY = 0;
58
+ const grid = bitmap.scale9Grid;
59
+ if (grid) {
60
+ this._drawScale9(bitmap, bd, grid, destW, destH, buffer);
61
+ }
62
+ else {
63
+ buffer.context.drawImage(bd, bitmap.bitmapX, bitmap.bitmapY, bitmap.bitmapWidth, bitmap.bitmapHeight, bitmap.bitmapOffsetX, bitmap.bitmapOffsetY, destW, destH, bitmap.sourceWidth, bitmap.sourceHeight, bitmap.texture?.rotated ?? false, bitmap.smoothing);
64
+ }
65
+ buffer.offsetX = 0;
66
+ buffer.offsetY = 0;
67
+ }
68
+ _drawScale9(bitmap, bd, grid, destW, destH, buffer) {
69
+ const bx = bitmap.bitmapX;
70
+ const by = bitmap.bitmapY;
71
+ const bw = bitmap.bitmapWidth;
72
+ const bh = bitmap.bitmapHeight;
73
+ const ox = bitmap.bitmapOffsetX;
74
+ const oy = bitmap.bitmapOffsetY;
75
+ const sw = bitmap.sourceWidth;
76
+ const sh = bitmap.sourceHeight;
77
+ const rotated = bitmap.texture?.rotated ?? false;
78
+ const smoothing = bitmap.smoothing;
79
+ const srcW0 = grid.x - ox;
80
+ const srcH0 = grid.y - oy;
81
+ const srcW1 = grid.width;
82
+ const srcH1 = grid.height;
83
+ const srcW2 = bw - srcW0 - srcW1;
84
+ const srcH2 = bh - srcH0 - srcH1;
85
+ const tgtW0 = srcW0;
86
+ const tgtH0 = srcH0;
87
+ const tgtW2 = srcW2;
88
+ const tgtH2 = srcH2;
89
+ if (tgtW0 + tgtW2 > destW || tgtH0 + tgtH2 > destH) {
90
+ buffer.context.drawImage(bd, bx, by, bw, bh, ox, oy, destW, destH, sw, sh, rotated, smoothing);
91
+ return;
92
+ }
93
+ const tgtW1 = destW - tgtW0 - tgtW2;
94
+ const tgtH1 = destH - tgtH0 - tgtH2;
95
+ const srcX0 = bx;
96
+ const srcX1 = srcX0 + srcW0;
97
+ const srcX2 = srcX1 + srcW1;
98
+ const srcY0 = by;
99
+ const srcY1 = srcY0 + srcH0;
100
+ const srcY2 = srcY1 + srcH1;
101
+ const tgtX0 = ox;
102
+ const tgtX1 = tgtX0 + tgtW0;
103
+ const tgtX2 = tgtX0 + destW - tgtW2;
104
+ const tgtY0 = oy;
105
+ const tgtY1 = tgtY0 + tgtH0;
106
+ const tgtY2 = tgtY0 + destH - tgtH2;
107
+ const ctx = buffer.context;
108
+ const draw = (sx, sy, sW, sH, dx, dy, dW, dH) => {
109
+ if (sW <= 0 || sH <= 0 || dW <= 0 || dH <= 0)
110
+ return;
111
+ ctx.drawImage(bd, sx, sy, sW, sH, dx, dy, dW, dH, sw, sh, rotated, smoothing);
112
+ };
113
+ if (srcH0 > 0) {
114
+ draw(srcX0, srcY0, srcW0, srcH0, tgtX0, tgtY0, tgtW0, tgtH0);
115
+ draw(srcX1, srcY0, srcW1, srcH0, tgtX1, tgtY0, tgtW1, tgtH0);
116
+ draw(srcX2, srcY0, srcW2, srcH0, tgtX2, tgtY0, tgtW2, tgtH0);
117
+ }
118
+ if (srcH1 > 0) {
119
+ draw(srcX0, srcY1, srcW0, srcH1, tgtX0, tgtY1, tgtW0, tgtH1);
120
+ draw(srcX1, srcY1, srcW1, srcH1, tgtX1, tgtY1, tgtW1, tgtH1);
121
+ draw(srcX2, srcY1, srcW2, srcH1, tgtX2, tgtY1, tgtW2, tgtH1);
122
+ }
123
+ if (srcH2 > 0) {
124
+ draw(srcX0, srcY2, srcW0, srcH2, tgtX0, tgtY2, tgtW0, tgtH2);
125
+ draw(srcX1, srcY2, srcW1, srcH2, tgtX1, tgtY2, tgtW1, tgtH2);
126
+ draw(srcX2, srcY2, srcW2, srcH2, tgtX2, tgtY2, tgtW2, tgtH2);
127
+ }
128
+ }
129
+ }
130
+ //# sourceMappingURL=BitmapPipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitmapPipe.js","sourceRoot":"","sources":["../../../../src/blakron/player/pipes/BitmapPipe.ts"],"names":[],"mappings":"AAgBA,iFAAiF;AAEjF;;;;;;GAMG;AACH,MAAM,OAAO,UAAU;IACf,MAAM,CAAU,OAAO,GAAG,QAAQ,CAAC;IAE1C,sEAAsE;IAC9D,MAAM,CAAU,KAAK,GAAwB,EAAE,CAAC;IAEhD,MAAM,CAAC,MAAM,CAAC,MAAc,EAAE,OAAe,EAAE,OAAe;QACrE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI;YACtC,YAAY,EAAE,QAAQ;YACtB,UAAU,EAAE,MAAM;YAClB,OAAO;YACP,OAAO;SACP,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,MAAM,CAAC,OAAO,CAAC,IAAuB;QAC5C,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,6EAA6E;IAEtE,mBAAmB,CAAC,MAAc,EAAE,GAAmB;QAC7D,+DAA+D;QAC/D,0EAA0E;QAC1E,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEM,gBAAgB,CAAC,OAAe;QACtC,uEAAuE;QACvE,wCAAwC;IACzC,CAAC;IAEM,iBAAiB,CAAC,OAAe;QACvC,8EAA8E;QAC9E,yEAAyE;IAC1E,CAAC;IAED,6EAA6E;IAE7E;;;OAGG;IACI,OAAO,CAAC,IAAuB,EAAE,MAAyB;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;QAC7B,IAAI,CAAC,EAAE,EAAE,MAAM;YAAE,OAAO;QAExB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACxE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3E,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO;QAErC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;QACnB,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;QAEnB,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;QAC/B,IAAI,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,OAAO,CAAC,SAAS,CACvB,EAAE,EACF,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,aAAa,EACpB,MAAM,CAAC,aAAa,EACpB,KAAK,EACL,KAAK,EACL,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK,EAChC,MAAM,CAAC,SAAS,CAChB,CAAC;QACH,CAAC;QAED,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;QACnB,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IACpB,CAAC;IAEO,WAAW,CAClB,MAAc,EACd,EAA4D,EAC5D,IAAiD,EACjD,KAAa,EACb,KAAa,EACb,MAAyB;QAEzB,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAEnC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC;QACjC,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC;QAEjC,MAAM,KAAK,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAC/F,OAAO;QACR,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAEpC,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAE5B,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAE5B,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAEpC,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;QAEpC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,MAAM,IAAI,GAAG,CACZ,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACT,EAAE;YACH,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;gBAAE,OAAO;YACrD,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/E,CAAC,CAAC;QAEF,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC"}
@@ -0,0 +1,68 @@
1
+ import type { DisplayObject } from '../../display/DisplayObject.js';
2
+ import type { Filter } from '../../filters/Filter.js';
3
+ import type { WebGLRenderBuffer } from '../webgl/WebGLRenderBuffer.js';
4
+ import type { Instruction } from '../InstructionSet.js';
5
+ import type { InstructionSet } from '../InstructionSet.js';
6
+ import type { RenderPipe } from '../RenderPipe.js';
7
+ /** Marks the start of a filtered subtree. */
8
+ export interface FilterPushInstruction extends Instruction {
9
+ readonly renderPipeId: 'filterPush';
10
+ renderable: DisplayObject;
11
+ filters: Filter[];
12
+ offsetX: number;
13
+ offsetY: number;
14
+ /**
15
+ * The blend mode that was active before this filter changed it.
16
+ * Set during executePush() so executePop() can restore it.
17
+ */
18
+ savedBlendMode: string;
19
+ }
20
+ /** Marks the end of a filtered subtree — composites the offscreen result. */
21
+ export interface FilterPopInstruction extends Instruction {
22
+ readonly renderPipeId: 'filterPop';
23
+ renderable: DisplayObject;
24
+ /** Back-reference to the matching push instruction. */
25
+ push: FilterPushInstruction;
26
+ }
27
+ /**
28
+ * Handles filter rendering for WebGL.
29
+ *
30
+ * The renderer calls pushFilter() before traversing the filtered subtree and
31
+ * popFilter() after. The pop instruction composites the offscreen buffer back
32
+ * onto the main buffer with the filter applied.
33
+ *
34
+ * This mirrors the old WebGLRenderer._drawWithFilter() logic but expressed as
35
+ * a pair of instructions so the traversal and execution phases are separated.
36
+ */
37
+ export declare class FilterPipe implements RenderPipe<DisplayObject> {
38
+ static readonly PUSH_ID = "filterPush";
39
+ static readonly POP_ID = "filterPop";
40
+ private static readonly _pushPool;
41
+ private static readonly _popPool;
42
+ addToInstructionSet(_renderable: DisplayObject, _set: InstructionSet): void;
43
+ updateRenderable(_renderable: DisplayObject): void;
44
+ static makePush(renderable: DisplayObject, filters: Filter[], offsetX: number, offsetY: number): FilterPushInstruction;
45
+ static makePop(renderable: DisplayObject, push: FilterPushInstruction): FilterPopInstruction;
46
+ static releasePush(inst: FilterPushInstruction): void;
47
+ static releasePop(inst: FilterPopInstruction): void;
48
+ /**
49
+ * Called by the renderer when it encounters a filterPush instruction.
50
+ *
51
+ * Two paths:
52
+ * - ColorMatrix inline: sets activeFilter on the main buffer, returns undefined.
53
+ * Subsequent leaf instructions draw directly to the main buffer with the
54
+ * filter applied per-draw-call.
55
+ * - All other filters: allocates an offscreen buffer and activates it via
56
+ * pushBuffer so that ALL subsequent draw calls (until filterPop) land in
57
+ * the offscreen buffer, not the main buffer.
58
+ *
59
+ * Returns the offscreen buffer (or undefined for inline path).
60
+ */
61
+ executePush(inst: FilterPushInstruction, buffer: WebGLRenderBuffer): WebGLRenderBuffer | undefined;
62
+ /**
63
+ * Called by the renderer when it encounters a filterPop instruction.
64
+ * Deactivates the offscreen buffer and composites it back onto the main buffer.
65
+ */
66
+ executePop(inst: FilterPopInstruction, buffer: WebGLRenderBuffer, offscreen: WebGLRenderBuffer | undefined): void;
67
+ }
68
+ //# sourceMappingURL=FilterPipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterPipe.d.ts","sourceRoot":"","sources":["../../../../src/blakron/player/pipes/FilterPipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD,6CAA6C;AAC7C,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACzD,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,6EAA6E;AAC7E,MAAM,WAAW,oBAAqB,SAAQ,WAAW;IACxD,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;IACnC,UAAU,EAAE,aAAa,CAAC;IAC1B,uDAAuD;IACvD,IAAI,EAAE,qBAAqB,CAAC;CAC5B;AAUD;;;;;;;;;GASG;AACH,qBAAa,UAAW,YAAW,UAAU,CAAC,aAAa,CAAC;IAE3D,gBAAuB,OAAO,gBAAgB;IAC9C,gBAAuB,MAAM,eAAe;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAChE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAIvD,mBAAmB,CAAC,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAK3E,gBAAgB,CAAC,WAAW,EAAE,aAAa,GAAG,IAAI;WAI3C,QAAQ,CACrB,UAAU,EAAE,aAAa,EACzB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACb,qBAAqB;WAaV,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,qBAAqB,GAAG,oBAAoB;WAUrF,WAAW,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;WAI9C,UAAU,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAM1D;;;;;;;;;;;;OAYG;IACI,WAAW,CAAC,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,SAAS;IAuDzG;;;OAGG;IACI,UAAU,CAChB,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,iBAAiB,GAAG,SAAS,GACtC,IAAI;CA6CP"}
@@ -0,0 +1,169 @@
1
+ import { ColorMatrixFilter } from '../../filters/ColorMatrixFilter.js';
2
+ import { WebGLRenderBuffer as WGLBuf } from '../webgl/WebGLRenderBuffer.js';
3
+ // ── Pipe ──────────────────────────────────────────────────────────────────────
4
+ const BLEND_MODES = {
5
+ 0: 'source-over',
6
+ 1: 'lighter',
7
+ 2: 'destination-out',
8
+ };
9
+ /**
10
+ * Handles filter rendering for WebGL.
11
+ *
12
+ * The renderer calls pushFilter() before traversing the filtered subtree and
13
+ * popFilter() after. The pop instruction composites the offscreen buffer back
14
+ * onto the main buffer with the filter applied.
15
+ *
16
+ * This mirrors the old WebGLRenderer._drawWithFilter() logic but expressed as
17
+ * a pair of instructions so the traversal and execution phases are separated.
18
+ */
19
+ export class FilterPipe {
20
+ // ── Static fields ─────────────────────────────────────────────────────────
21
+ static PUSH_ID = 'filterPush';
22
+ static POP_ID = 'filterPop';
23
+ static _pushPool = [];
24
+ static _popPool = [];
25
+ // ── RenderPipe impl ───────────────────────────────────────────────────────
26
+ addToInstructionSet(_renderable, _set) {
27
+ // FilterPipe instructions are added by the renderer's traversal logic,
28
+ // not by this method — see WebGLRenderer._buildInstructions().
29
+ }
30
+ updateRenderable(_renderable) { }
31
+ // ── Factory helpers used by the renderer ─────────────────────────────────
32
+ static makePush(renderable, filters, offsetX, offsetY) {
33
+ const inst = FilterPipe._pushPool.pop();
34
+ if (inst) {
35
+ inst.renderable = renderable;
36
+ inst.filters = filters;
37
+ inst.offsetX = offsetX;
38
+ inst.offsetY = offsetY;
39
+ inst.savedBlendMode = 'source-over';
40
+ return inst;
41
+ }
42
+ return { renderPipeId: 'filterPush', renderable, filters, offsetX, offsetY, savedBlendMode: 'source-over' };
43
+ }
44
+ static makePop(renderable, push) {
45
+ const inst = FilterPipe._popPool.pop();
46
+ if (inst) {
47
+ inst.renderable = renderable;
48
+ inst.push = push;
49
+ return inst;
50
+ }
51
+ return { renderPipeId: 'filterPop', renderable, push };
52
+ }
53
+ static releasePush(inst) {
54
+ FilterPipe._pushPool.push(inst);
55
+ }
56
+ static releasePop(inst) {
57
+ FilterPipe._popPool.push(inst);
58
+ }
59
+ // ── Execute ───────────────────────────────────────────────────────────────
60
+ /**
61
+ * Called by the renderer when it encounters a filterPush instruction.
62
+ *
63
+ * Two paths:
64
+ * - ColorMatrix inline: sets activeFilter on the main buffer, returns undefined.
65
+ * Subsequent leaf instructions draw directly to the main buffer with the
66
+ * filter applied per-draw-call.
67
+ * - All other filters: allocates an offscreen buffer and activates it via
68
+ * pushBuffer so that ALL subsequent draw calls (until filterPop) land in
69
+ * the offscreen buffer, not the main buffer.
70
+ *
71
+ * Returns the offscreen buffer (or undefined for inline path).
72
+ */
73
+ executePush(inst, buffer) {
74
+ const filters = inst.filters;
75
+ if (!filters.length)
76
+ return undefined;
77
+ const bounds = inst.renderable.getOriginalBounds();
78
+ if (bounds.width <= 0 || bounds.height <= 0)
79
+ return undefined;
80
+ // Inline ColorMatrix optimisation: no offscreen buffer needed.
81
+ // Flush any pending commands first, then re-activate the current buffer
82
+ // so the GL FBO + viewport/projection are in a known-good state before
83
+ // the leaf draw commands are queued. Without this, the colorTransform
84
+ // draw may execute against a stale FBO left by a previous filter pass.
85
+ if (!inst.renderable.internalMask && filters.length === 1 && filters[0] instanceof ColorMatrixFilter) {
86
+ const hasBlend = inst.renderable.internalBlendMode !== 0;
87
+ if (hasBlend) {
88
+ inst.savedBlendMode = buffer.context.currentBlendMode;
89
+ buffer.context.setGlobalCompositeOperation(BLEND_MODES[inst.renderable.internalBlendMode] ?? 'source-over');
90
+ }
91
+ // Flush pending batched commands so the GL state is clean, then
92
+ // re-push the current buffer to guarantee an ACT_BUFFER command
93
+ // precedes the upcoming leaf draw in the next flush.
94
+ buffer.context.flush();
95
+ buffer.context.pushBuffer(buffer);
96
+ buffer.context.activeFilter = filters[0];
97
+ return undefined; // signal: inline mode, no offscreen
98
+ }
99
+ // Offscreen path: redirect all subsequent draw calls into this buffer.
100
+ // Expand the buffer by the union of all filters' padding so blur/glow
101
+ // has room to bleed outside the content bounds.
102
+ let padL = 0, padR = 0, padT = 0, padB = 0;
103
+ for (const f of filters) {
104
+ const p = f.getPadding();
105
+ if (p.left > padL)
106
+ padL = p.left;
107
+ if (p.right > padR)
108
+ padR = p.right;
109
+ if (p.top > padT)
110
+ padT = p.top;
111
+ if (p.bottom > padB)
112
+ padB = p.bottom;
113
+ }
114
+ const offW = Math.ceil(bounds.width + padL + padR);
115
+ const offH = Math.ceil(bounds.height + padT + padB);
116
+ const offscreen = WGLBuf.create(buffer.context, offW, offH);
117
+ // Store padding offsets so the renderer can adjust the offscreen origin.
118
+ offscreen.filterPadX = padL;
119
+ offscreen.filterPadY = padT;
120
+ // pushBuffer activates the offscreen FBO so WebGL draws land there.
121
+ offscreen.context.pushBuffer(offscreen);
122
+ return offscreen;
123
+ }
124
+ /**
125
+ * Called by the renderer when it encounters a filterPop instruction.
126
+ * Deactivates the offscreen buffer and composites it back onto the main buffer.
127
+ */
128
+ executePop(inst, buffer, offscreen) {
129
+ const { renderable, push } = inst;
130
+ const filters = push.filters;
131
+ const hasBlend = renderable.internalBlendMode !== 0;
132
+ const blendOp = BLEND_MODES[renderable.internalBlendMode] ?? 'source-over';
133
+ // Inline ColorMatrix path — clear the filter flag and pop the buffer
134
+ // that was pushed in executePush to balance the stack.
135
+ if (!offscreen) {
136
+ buffer.context.flush();
137
+ buffer.context.popBuffer();
138
+ buffer.context.activeFilter = undefined;
139
+ if (hasBlend)
140
+ buffer.context.setGlobalCompositeOperation(push.savedBlendMode);
141
+ return;
142
+ }
143
+ // Deactivate the offscreen buffer, restoring the main buffer as active.
144
+ offscreen.context.popBuffer();
145
+ const bounds = renderable.getOriginalBounds();
146
+ const bx = bounds.x;
147
+ const by = bounds.y;
148
+ // Save the current blend mode before applying the filter's blend mode,
149
+ // so we can restore it after compositing.
150
+ const prevBlend = buffer.context.currentBlendMode;
151
+ if (hasBlend)
152
+ buffer.context.setGlobalCompositeOperation(blendOp);
153
+ // Position the offscreen result.
154
+ // The offscreen texture's top-left is (padL, padT) above/left of
155
+ // the content bounds origin, so we offset by (bx - padL, by - padT).
156
+ const padX = offscreen.filterPadX;
157
+ const padY = offscreen.filterPadY;
158
+ buffer.offsetX = bx - padX;
159
+ buffer.offsetY = by - padY;
160
+ buffer.saveTransform();
161
+ buffer.useOffset();
162
+ buffer.context.compositeFilterResult(filters, offscreen);
163
+ buffer.restoreTransform();
164
+ if (hasBlend)
165
+ buffer.context.setGlobalCompositeOperation(prevBlend);
166
+ WGLBuf.release(offscreen);
167
+ }
168
+ }
169
+ //# sourceMappingURL=FilterPipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterPipe.js","sourceRoot":"","sources":["../../../../src/blakron/player/pipes/FilterPipe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { Graphics } from '../../display/Graphics.js';
2
+ import type { DisplayObject } from '../../display/DisplayObject.js';
3
+ import type { WebGLRenderBuffer } from '../webgl/WebGLRenderBuffer.js';
4
+ import type { Instruction } from '../InstructionSet.js';
5
+ import type { InstructionSet } from '../InstructionSet.js';
6
+ import type { RenderPipe } from '../RenderPipe.js';
7
+ import type { CanvasRenderer } from '../CanvasRenderer.js';
8
+ export interface GraphicsInstruction extends Instruction {
9
+ readonly renderPipeId: 'graphics';
10
+ renderable: DisplayObject;
11
+ /** The Graphics object attached to the renderable. */
12
+ graphics: Graphics;
13
+ offsetX: number;
14
+ offsetY: number;
15
+ }
16
+ /**
17
+ * Handles WebGL rendering of Shape / Sprite graphics.
18
+ *
19
+ * Rasterizes the Graphics commands to an offscreen Canvas, uploads as a
20
+ * WebGL texture, and caches it. The cache is invalidated when
21
+ * `graphics.canvasCacheDirty` is true (set by Graphics.dirty()).
22
+ */
23
+ export declare class GraphicsPipe implements RenderPipe<DisplayObject> {
24
+ static readonly PIPE_ID = "graphics";
25
+ private static readonly _pool;
26
+ private readonly _canvasRenderer;
27
+ private readonly _cache;
28
+ constructor(canvasRenderer: CanvasRenderer);
29
+ private static _alloc;
30
+ static release(inst: GraphicsInstruction): void;
31
+ addToInstructionSet(renderable: DisplayObject, set: InstructionSet): void;
32
+ updateRenderable(_renderable: DisplayObject): void;
33
+ destroyRenderable(renderable: DisplayObject): void;
34
+ execute(inst: GraphicsInstruction, buffer: WebGLRenderBuffer): void;
35
+ }
36
+ //# sourceMappingURL=GraphicsPipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphicsPipe.d.ts","sourceRoot":"","sources":["../../../../src/blakron/player/pipes/GraphicsPipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAQ3D,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACvD,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,UAAU,EAAE,aAAa,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CAChB;AAgBD;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,UAAU,CAAC,aAAa,CAAC;IAE7D,gBAAuB,OAAO,cAAc;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAA6B;IAG1D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;gBAG9C,cAAc,EAAE,cAAc;IAIjD,OAAO,CAAC,MAAM,CAAC,MAAM;WAeP,OAAO,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAM/C,mBAAmB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI;IAQzE,gBAAgB,CAAC,WAAW,EAAE,aAAa,GAAG,IAAI;IAKlD,iBAAiB,CAAC,UAAU,EAAE,aAAa,GAAG,IAAI;IAOlD,OAAO,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI;CAiF1E"}
@@ -0,0 +1,126 @@
1
+ import { Rectangle } from '../../geom/Rectangle.js';
2
+ import { RenderBuffer } from '../RenderBuffer.js';
3
+ // Shared scratch rectangle — avoids per-execute allocation.
4
+ const _scratchBounds = new Rectangle();
5
+ // ── Pipe ──────────────────────────────────────────────────────────────────────
6
+ /**
7
+ * Handles WebGL rendering of Shape / Sprite graphics.
8
+ *
9
+ * Rasterizes the Graphics commands to an offscreen Canvas, uploads as a
10
+ * WebGL texture, and caches it. The cache is invalidated when
11
+ * `graphics.canvasCacheDirty` is true (set by Graphics.dirty()).
12
+ */
13
+ export class GraphicsPipe {
14
+ // ── Static fields ─────────────────────────────────────────────────────────
15
+ static PIPE_ID = 'graphics';
16
+ static _pool = [];
17
+ // ── Instance fields ───────────────────────────────────────────────────────
18
+ _canvasRenderer;
19
+ _cache = new WeakMap();
20
+ // ── Constructor ───────────────────────────────────────────────────────────
21
+ constructor(canvasRenderer) {
22
+ this._canvasRenderer = canvasRenderer;
23
+ }
24
+ static _alloc(renderable, graphics, ox, oy) {
25
+ const inst = GraphicsPipe._pool.pop() ?? {
26
+ renderPipeId: 'graphics',
27
+ renderable,
28
+ graphics,
29
+ offsetX: ox,
30
+ offsetY: oy,
31
+ };
32
+ inst.renderable = renderable;
33
+ inst.graphics = graphics;
34
+ inst.offsetX = ox;
35
+ inst.offsetY = oy;
36
+ return inst;
37
+ }
38
+ static release(inst) {
39
+ GraphicsPipe._pool.push(inst);
40
+ }
41
+ // ── RenderPipe impl ───────────────────────────────────────────────────────
42
+ addToInstructionSet(renderable, set) {
43
+ const graphics = renderable.graphics;
44
+ if (!graphics || graphics.commands.length === 0) {
45
+ return;
46
+ }
47
+ set.add(GraphicsPipe._alloc(renderable, graphics, 0, 0));
48
+ }
49
+ updateRenderable(_renderable) {
50
+ // Cache invalidation is driven by graphics.canvasCacheDirty,
51
+ // which is checked at execute time — nothing to pre-upload here.
52
+ }
53
+ destroyRenderable(renderable) {
54
+ const graphics = renderable.graphics;
55
+ if (graphics)
56
+ this._cache.delete(graphics);
57
+ }
58
+ // ── Execute ───────────────────────────────────────────────────────────────
59
+ execute(inst, buffer) {
60
+ const { graphics } = inst;
61
+ if (graphics.commands.length === 0) {
62
+ return;
63
+ }
64
+ const bounds = _scratchBounds;
65
+ bounds.setEmpty();
66
+ graphics.measureContentBounds(bounds);
67
+ const w = Math.ceil(bounds.width);
68
+ const h = Math.ceil(bounds.height);
69
+ if (w <= 0 || h <= 0) {
70
+ return;
71
+ }
72
+ const ox = inst.offsetX;
73
+ const oy = inst.offsetY;
74
+ buffer.offsetX = 0;
75
+ buffer.offsetY = 0;
76
+ // ── Cache lookup / rebuild ────────────────────────────────────────────
77
+ let cache = this._cache.get(graphics);
78
+ if (!cache) {
79
+ cache = {
80
+ renderBuffer: new RenderBuffer(w, h),
81
+ texture: undefined,
82
+ textureWidth: 0,
83
+ textureHeight: 0,
84
+ boundsX: bounds.x,
85
+ boundsY: bounds.y,
86
+ };
87
+ this._cache.set(graphics, cache);
88
+ }
89
+ const needsRebuild = graphics.canvasCacheDirty || cache.textureWidth !== w || cache.textureHeight !== h;
90
+ if (needsRebuild) {
91
+ if (cache.renderBuffer.width !== w || cache.renderBuffer.height !== h) {
92
+ cache.renderBuffer.resize(w, h);
93
+ }
94
+ cache.renderBuffer.clear();
95
+ // skipCache=true: we are the cache owner, bypass CanvasRenderer's own
96
+ // offscreen canvas layer to avoid a redundant intermediate rasterization.
97
+ this._canvasRenderer.renderGraphicsToContext(graphics, cache.renderBuffer.context, -bounds.x, -bounds.y, false, true);
98
+ const surface = cache.renderBuffer.surface;
99
+ if (!cache.texture) {
100
+ cache.texture = buffer.context.createTexture(surface);
101
+ }
102
+ else {
103
+ buffer.context.updateTexture(cache.texture, surface);
104
+ }
105
+ cache.textureWidth = w;
106
+ cache.textureHeight = h;
107
+ cache.boundsX = bounds.x;
108
+ cache.boundsY = bounds.y;
109
+ // Consume the dirty flag — Phase 1 set it, we've now rebuilt.
110
+ graphics.canvasCacheDirty = false;
111
+ }
112
+ if (!cache.texture) {
113
+ return;
114
+ }
115
+ // ── Draw cached texture ───────────────────────────────────────────────
116
+ // ox/oy are already baked into globalMatrix via _applyTransform.
117
+ // Only add bounds origin (content may start at non-zero local coords).
118
+ buffer.saveTransform();
119
+ if (cache.boundsX !== 0 || cache.boundsY !== 0) {
120
+ buffer.globalMatrix.append(1, 0, 0, 1, cache.boundsX, cache.boundsY);
121
+ }
122
+ buffer.context.drawTexture(cache.texture, 0, 0, w, h, 0, 0, w, h, w, h);
123
+ buffer.restoreTransform();
124
+ }
125
+ }
126
+ //# sourceMappingURL=GraphicsPipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphicsPipe.js","sourceRoot":"","sources":["../../../../src/blakron/player/pipes/GraphicsPipe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { DisplayObject } from '../../display/DisplayObject.js';
2
+ import type { WebGLRenderBuffer } from '../webgl/WebGLRenderBuffer.js';
3
+ import type { Instruction } from '../InstructionSet.js';
4
+ import type { InstructionSet } from '../InstructionSet.js';
5
+ import type { RenderPipe } from '../RenderPipe.js';
6
+ export interface MaskPushInstruction extends Instruction {
7
+ readonly renderPipeId: 'maskPush';
8
+ renderable: DisplayObject;
9
+ offsetX: number;
10
+ offsetY: number;
11
+ isScrollRect?: boolean;
12
+ }
13
+ export interface MaskPopInstruction extends Instruction {
14
+ readonly renderPipeId: 'maskPop';
15
+ renderable: DisplayObject;
16
+ push: MaskPushInstruction;
17
+ }
18
+ /**
19
+ * Handles mask / clip / scrollRect rendering for WebGL.
20
+ *
21
+ * Mirrors the old WebGLRenderer._drawWithClip() and _drawWithScrollRect()
22
+ * logic as a push/pop instruction pair.
23
+ */
24
+ export declare class MaskPipe implements RenderPipe<DisplayObject> {
25
+ static readonly PUSH_ID = "maskPush";
26
+ static readonly POP_ID = "maskPop";
27
+ private static readonly _pushPool;
28
+ private static readonly _popPool;
29
+ addToInstructionSet(_renderable: DisplayObject, _set: InstructionSet): void;
30
+ updateRenderable(_renderable: DisplayObject): void;
31
+ static makePush(renderable: DisplayObject, offsetX: number, offsetY: number): MaskPushInstruction;
32
+ static makePop(renderable: DisplayObject, push: MaskPushInstruction): MaskPopInstruction;
33
+ static releasePush(inst: MaskPushInstruction): void;
34
+ static releasePop(inst: MaskPopInstruction): void;
35
+ /**
36
+ * Handles scrollRect / maskRect via scissor or stencil.
37
+ * Returns true if a scissor was used (caller must call executePopScissor).
38
+ */
39
+ executeScrollRectPush(inst: MaskPushInstruction, buffer: WebGLRenderBuffer): boolean;
40
+ executeScrollRectPop(buffer: WebGLRenderBuffer, usedScissor: boolean): void;
41
+ /**
42
+ * Handles DisplayObject mask (stencil-based compositing).
43
+ *
44
+ * Allocates an offscreen buffer and activates it via pushBuffer so that
45
+ * all subsequent leaf instructions (the masked subtree) draw into it.
46
+ * The mask object itself is rendered separately in executeClipPop because
47
+ * it is not part of the main InstructionSet.
48
+ *
49
+ * Returns the offscreen buffer, or undefined if the object has zero bounds.
50
+ */
51
+ executeClipPush(inst: MaskPushInstruction, buffer: WebGLRenderBuffer, renderer: {
52
+ _drawDisplayObject(obj: DisplayObject, buf: WebGLRenderBuffer, ox: number, oy: number): number;
53
+ }): WebGLRenderBuffer | undefined;
54
+ executeClipPop(inst: MaskPopInstruction, buffer: WebGLRenderBuffer, displayBuffer: WebGLRenderBuffer | undefined, renderer: {
55
+ _drawDisplayObject(obj: DisplayObject, buf: WebGLRenderBuffer, ox: number, oy: number): number;
56
+ }): void;
57
+ }
58
+ //# sourceMappingURL=MaskPipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaskPipe.d.ts","sourceRoot":"","sources":["../../../../src/blakron/player/pipes/MaskPipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACvD,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;IAClC,UAAU,EAAE,aAAa,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACtD,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,UAAU,EAAE,aAAa,CAAC;IAC1B,IAAI,EAAE,mBAAmB,CAAC;CAC1B;AAID;;;;;GAKG;AACH,qBAAa,QAAS,YAAW,UAAU,CAAC,aAAa,CAAC;IAEzD,gBAAuB,OAAO,cAAc;IAC5C,gBAAuB,MAAM,aAAa;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAIrD,mBAAmB,CAAC,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAI3E,gBAAgB,CAAC,WAAW,EAAE,aAAa,GAAG,IAAI;WAI3C,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,mBAAmB;WAY1F,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,mBAAmB,GAAG,kBAAkB;WAUjF,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;WAI5C,UAAU,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAMxD;;;OAGG;IACI,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO;IAiCpF,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI;IAQlF;;;;;;;;;OASG;IACI,eAAe,CACrB,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE;QAAE,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAC1G,iBAAiB,GAAG,SAAS;IAgCzB,cAAc,CACpB,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,iBAAiB,GAAG,SAAS,EAC5C,QAAQ,EAAE;QAAE,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAC1G,IAAI;CAsGP"}