@codexo/exojs 0.9.0 → 0.11.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 (242) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/README.md +14 -14
  3. package/dist/esm/core/Application.d.ts +25 -6
  4. package/dist/esm/core/Application.js +42 -8
  5. package/dist/esm/core/Application.js.map +1 -1
  6. package/dist/esm/core/Perf.d.ts +23 -0
  7. package/dist/esm/core/Perf.js +49 -0
  8. package/dist/esm/core/Perf.js.map +1 -0
  9. package/dist/esm/core/Scene.d.ts +8 -8
  10. package/dist/esm/core/Scene.js +7 -7
  11. package/dist/esm/core/Scene.js.map +1 -1
  12. package/dist/esm/core/SceneManager.js +2 -2
  13. package/dist/esm/core/SceneManager.js.map +1 -1
  14. package/dist/esm/core/SceneNode.d.ts +0 -3
  15. package/dist/esm/core/SceneNode.js +0 -9
  16. package/dist/esm/core/SceneNode.js.map +1 -1
  17. package/dist/esm/core/capabilities.d.ts +2 -0
  18. package/dist/esm/core/capabilities.js +15 -0
  19. package/dist/esm/core/capabilities.js.map +1 -1
  20. package/dist/esm/core/dev.d.ts +21 -0
  21. package/dist/esm/core/dev.js +18 -0
  22. package/dist/esm/core/dev.js.map +1 -0
  23. package/dist/esm/core/index.d.ts +1 -0
  24. package/dist/esm/core/types.d.ts +1 -1
  25. package/dist/esm/core/utils.d.ts +12 -0
  26. package/dist/esm/core/utils.js +18 -1
  27. package/dist/esm/core/utils.js.map +1 -1
  28. package/dist/esm/index.js +14 -3
  29. package/dist/esm/index.js.map +1 -1
  30. package/dist/esm/particles/ParticleSystem.d.ts +8 -5
  31. package/dist/esm/particles/ParticleSystem.js +9 -5
  32. package/dist/esm/particles/ParticleSystem.js.map +1 -1
  33. package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
  34. package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
  35. package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
  36. package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
  37. package/dist/esm/particles/distributions/index.d.ts +2 -2
  38. package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
  39. package/dist/esm/particles/modules/AlphaFadeOverLifetime.d.ts +2 -2
  40. package/dist/esm/particles/modules/AlphaFadeOverLifetime.js +5 -1
  41. package/dist/esm/particles/modules/AlphaFadeOverLifetime.js.map +1 -1
  42. package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
  43. package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
  44. package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
  45. package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
  46. package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
  47. package/dist/esm/particles/modules/UpdateModule.js +1 -1
  48. package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
  49. package/dist/esm/rendering/Camera.d.ts +33 -0
  50. package/dist/esm/rendering/Camera.js +38 -0
  51. package/dist/esm/rendering/Camera.js.map +1 -0
  52. package/dist/esm/rendering/Container.d.ts +5 -24
  53. package/dist/esm/rendering/Container.js +8 -71
  54. package/dist/esm/rendering/Container.js.map +1 -1
  55. package/dist/esm/rendering/Drawable.d.ts +8 -10
  56. package/dist/esm/rendering/Drawable.js +12 -20
  57. package/dist/esm/rendering/Drawable.js.map +1 -1
  58. package/dist/esm/rendering/RenderBackend.d.ts +18 -0
  59. package/dist/esm/rendering/RenderNode.d.ts +81 -8
  60. package/dist/esm/rendering/RenderNode.js +121 -144
  61. package/dist/esm/rendering/RenderNode.js.map +1 -1
  62. package/dist/esm/rendering/RenderTarget.d.ts +13 -0
  63. package/dist/esm/rendering/RenderTarget.js +13 -0
  64. package/dist/esm/rendering/RenderTarget.js.map +1 -1
  65. package/dist/esm/rendering/RenderTargetPass.js +17 -0
  66. package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
  67. package/dist/esm/rendering/RenderingContext.d.ts +87 -0
  68. package/dist/esm/rendering/RenderingContext.js +157 -0
  69. package/dist/esm/rendering/RenderingContext.js.map +1 -0
  70. package/dist/esm/rendering/TransformBuffer.d.ts +82 -0
  71. package/dist/esm/rendering/TransformBuffer.js +180 -0
  72. package/dist/esm/rendering/TransformBuffer.js.map +1 -0
  73. package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
  74. package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
  75. package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
  76. package/dist/esm/rendering/geometry/Geometry.js +228 -0
  77. package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
  78. package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
  79. package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
  80. package/dist/esm/rendering/gradient/Gradient.d.ts +67 -0
  81. package/dist/esm/rendering/gradient/Gradient.js +160 -0
  82. package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
  83. package/dist/esm/rendering/gradient/LinearGradient.d.ts +18 -0
  84. package/dist/esm/rendering/gradient/LinearGradient.js +49 -0
  85. package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
  86. package/dist/esm/rendering/gradient/RadialGradient.d.ts +18 -0
  87. package/dist/esm/rendering/gradient/RadialGradient.js +44 -0
  88. package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
  89. package/dist/esm/rendering/index.d.ts +16 -2
  90. package/dist/esm/rendering/material/Material.d.ts +114 -0
  91. package/dist/esm/rendering/material/Material.js +111 -0
  92. package/dist/esm/rendering/material/Material.js.map +1 -0
  93. package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
  94. package/dist/esm/rendering/material/MaterialKey.js +82 -0
  95. package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
  96. package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
  97. package/dist/esm/rendering/material/MeshMaterial.js +21 -0
  98. package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
  99. package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +29 -62
  100. package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +35 -62
  101. package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
  102. package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
  103. package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
  104. package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
  105. package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
  106. package/dist/esm/rendering/mesh/Mesh.js +122 -3
  107. package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
  108. package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
  109. package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
  110. package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
  111. package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
  112. package/dist/esm/rendering/plan/RenderCommand.d.ts +86 -0
  113. package/dist/esm/rendering/plan/RenderCommand.js +127 -0
  114. package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
  115. package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
  116. package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
  117. package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
  118. package/dist/esm/rendering/plan/RenderInstruction.d.ts +51 -0
  119. package/dist/esm/rendering/plan/RenderInstruction.js +45 -0
  120. package/dist/esm/rendering/plan/RenderInstruction.js.map +1 -0
  121. package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
  122. package/dist/esm/rendering/plan/RenderPlan.js +12 -0
  123. package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
  124. package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
  125. package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
  126. package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
  127. package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
  128. package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
  129. package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
  130. package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +13 -0
  131. package/dist/esm/rendering/plan/RenderPlanPlayer.js +107 -0
  132. package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
  133. package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
  134. package/dist/esm/rendering/plan/RenderScope.js +16 -0
  135. package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
  136. package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
  137. package/dist/esm/rendering/plan/playRenderTree.js +19 -0
  138. package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
  139. package/dist/esm/rendering/primitives/Graphics.d.ts +70 -5
  140. package/dist/esm/rendering/primitives/Graphics.js +172 -14
  141. package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
  142. package/dist/esm/rendering/sprite/Sprite.d.ts +22 -1
  143. package/dist/esm/rendering/sprite/Sprite.js +33 -2
  144. package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
  145. package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +41 -0
  146. package/dist/esm/rendering/sprite/spriteMaterialSources.js +149 -0
  147. package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
  148. package/dist/esm/rendering/text/BitmapText.d.ts +2 -0
  149. package/dist/esm/rendering/text/BitmapText.js +8 -1
  150. package/dist/esm/rendering/text/BitmapText.js.map +1 -1
  151. package/dist/esm/rendering/text/BmFont.js +3 -0
  152. package/dist/esm/rendering/text/BmFont.js.map +1 -1
  153. package/dist/esm/rendering/text/GlyphSdf.d.ts +14 -0
  154. package/dist/esm/rendering/text/GlyphSdf.js +41 -11
  155. package/dist/esm/rendering/text/GlyphSdf.js.map +1 -1
  156. package/dist/esm/rendering/text/TextStyle.d.ts +6 -1
  157. package/dist/esm/rendering/text/TextStyle.js +1 -1
  158. package/dist/esm/rendering/text/TextStyle.js.map +1 -1
  159. package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
  160. package/dist/esm/rendering/texture/DataTexture.js +7 -0
  161. package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
  162. package/dist/esm/rendering/texture/RenderTexture.js.map +1 -1
  163. package/dist/esm/rendering/video/Video.d.ts +3 -7
  164. package/dist/esm/rendering/video/Video.js +3 -8
  165. package/dist/esm/rendering/video/Video.js.map +1 -1
  166. package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +62 -0
  167. package/dist/esm/rendering/webgl2/WebGl2Backend.js +352 -21
  168. package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
  169. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
  170. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
  171. package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
  172. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +8 -0
  173. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +8 -0
  174. package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
  175. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
  176. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
  177. package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
  178. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +14 -0
  179. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +257 -78
  180. package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
  181. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
  182. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
  183. package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
  184. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +7 -0
  185. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +11 -0
  186. package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
  187. package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
  188. package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
  189. package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +1 -1
  190. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
  191. package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
  192. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
  193. package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
  194. package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +1 -1
  195. package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +63 -0
  196. package/dist/esm/rendering/webgpu/WebGpuBackend.js +180 -19
  197. package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
  198. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
  199. package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
  200. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +24 -0
  201. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +524 -98
  202. package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
  203. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +7 -0
  204. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +24 -22
  205. package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
  206. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
  207. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
  208. package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
  209. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +25 -1
  210. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +430 -76
  211. package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
  212. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
  213. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
  214. package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
  215. package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
  216. package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
  217. package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
  218. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +7 -0
  219. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +30 -19
  220. package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
  221. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +48 -0
  222. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +103 -0
  223. package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
  224. package/dist/esm/resources/JsonStore.d.ts +18 -0
  225. package/dist/esm/resources/JsonStore.js +62 -0
  226. package/dist/esm/resources/JsonStore.js.map +1 -0
  227. package/dist/esm/resources/Loader.js +1 -1
  228. package/dist/esm/resources/Loader.js.map +1 -1
  229. package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
  230. package/dist/esm/resources/factories/ImageFactory.js +13 -6
  231. package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
  232. package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
  233. package/dist/esm/resources/factories/TextureFactory.js +8 -4
  234. package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
  235. package/dist/esm/resources/index.d.ts +1 -0
  236. package/dist/exo.esm.js +6326 -2350
  237. package/dist/exo.esm.js.map +1 -1
  238. package/package.json +34 -24
  239. package/dist/esm/particles/distributions/Gradient.js.map +0 -1
  240. package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
  241. package/dist/esm/vendor/webgl-debug.js +0 -1160
  242. package/dist/esm/vendor/webgl-debug.js.map +0 -1
@@ -0,0 +1,242 @@
1
+ import { Rectangle } from '../../math/Rectangle.js';
2
+ import { RenderEntryKind, makeMaterialKey } from './RenderCommand.js';
3
+ import { MutableRenderPlan } from './RenderPlan.js';
4
+ import { ClipKind } from './RenderScope.js';
5
+
6
+ /** @internal */
7
+ class RenderPlanBuilder {
8
+ static _available = [];
9
+ static _active = [];
10
+ static acquire() {
11
+ const builder = RenderPlanBuilder._available.pop() ?? new RenderPlanBuilder();
12
+ RenderPlanBuilder._active.push(builder);
13
+ return builder;
14
+ }
15
+ static release(builder) {
16
+ const index = RenderPlanBuilder._active.lastIndexOf(builder);
17
+ if (index === -1) {
18
+ return;
19
+ }
20
+ RenderPlanBuilder._active.splice(index, 1);
21
+ builder._resetRuntimeState();
22
+ RenderPlanBuilder._available.push(builder);
23
+ }
24
+ backend;
25
+ _view = null;
26
+ _plan = new MutableRenderPlan();
27
+ _groupPool = [];
28
+ _scopeStack = [];
29
+ _groupPoolCursor = 0;
30
+ _pendingEntryPlacement = null;
31
+ _nodeIndex = 0;
32
+ build(root, backend) {
33
+ this.backend = backend;
34
+ this._view = null;
35
+ this._plan.reset();
36
+ this._groupPoolCursor = 0;
37
+ this._scopeStack.length = 0;
38
+ this._pendingEntryPlacement = null;
39
+ this._nodeIndex = 0;
40
+ const rootScope = this._acquireGroupScope(false);
41
+ this._scopeStack.push(rootScope);
42
+ root._collect(this);
43
+ this._scopeStack.pop();
44
+ if (rootScope.entries.length > 0) {
45
+ this._plan.passes.push({
46
+ target: null,
47
+ view: this.view,
48
+ clearColor: null,
49
+ root: rootScope,
50
+ });
51
+ }
52
+ this._plan.nodeCount = this._nodeIndex;
53
+ return this._plan;
54
+ }
55
+ get view() {
56
+ if (this._view === null) {
57
+ this._view = this.backend.view;
58
+ }
59
+ return this._view;
60
+ }
61
+ emitNode(node, seq) {
62
+ const placement = this._reserveEntryPlacement(seq, node.zIndex);
63
+ if (node._renderPlanHasBarrierEffects()) {
64
+ const effect = this._createEffectDescriptor(node);
65
+ const hasAlphaMask = effect.maskSource !== null && !(effect.maskSource instanceof Rectangle);
66
+ const needsBounds = effect.cacheAsBitmap || effect.filters.length > 0 || hasAlphaMask;
67
+ let left = 0;
68
+ let top = 0;
69
+ let width = 0;
70
+ let height = 0;
71
+ if (needsBounds) {
72
+ const bounds = node.getBounds();
73
+ if (bounds.width <= 0 || bounds.height <= 0) {
74
+ return;
75
+ }
76
+ left = Math.floor(bounds.left);
77
+ top = Math.floor(bounds.top);
78
+ width = Math.max(1, Math.ceil(bounds.width));
79
+ height = Math.max(1, Math.ceil(bounds.height));
80
+ }
81
+ const childPlan = effect.cacheAsBitmap && node._renderPlanCanReuseBitmapCache(left, top, width, height)
82
+ ? null
83
+ : this._acquireGroupScope(this._resolvePreserveDrawOrder(node));
84
+ const barrierScope = {
85
+ kind: RenderEntryKind.Barrier,
86
+ node,
87
+ effect,
88
+ childPlan,
89
+ left,
90
+ top,
91
+ width,
92
+ height,
93
+ };
94
+ this._pushEntry({
95
+ kind: RenderEntryKind.Barrier,
96
+ seq: placement.seq,
97
+ zIndex: placement.zIndex,
98
+ scope: barrierScope,
99
+ });
100
+ if (childPlan !== null) {
101
+ this._scopeStack.push(childPlan);
102
+ try {
103
+ node._collectForRenderPlan(this);
104
+ }
105
+ finally {
106
+ this._scopeStack.pop();
107
+ }
108
+ }
109
+ return;
110
+ }
111
+ if (node._isDrawableForRenderPlan()) {
112
+ this._pendingEntryPlacement = placement;
113
+ try {
114
+ node._collectForRenderPlan(this);
115
+ }
116
+ finally {
117
+ this._pendingEntryPlacement = null;
118
+ }
119
+ return;
120
+ }
121
+ const groupScope = this._acquireGroupScope(this._resolvePreserveDrawOrder(node));
122
+ this._pushEntry({
123
+ kind: RenderEntryKind.Group,
124
+ seq: placement.seq,
125
+ zIndex: placement.zIndex,
126
+ scope: groupScope,
127
+ });
128
+ this._scopeStack.push(groupScope);
129
+ try {
130
+ node._collectForRenderPlan(this);
131
+ }
132
+ finally {
133
+ this._scopeStack.pop();
134
+ }
135
+ }
136
+ emitDraw(drawable, seq) {
137
+ const pendingPlacement = this._pendingEntryPlacement;
138
+ if (pendingPlacement !== null) {
139
+ this._pendingEntryPlacement = null;
140
+ }
141
+ const zIndex = pendingPlacement?.zIndex ?? drawable.zIndex;
142
+ const placement = this._reserveEntryPlacement(seq ?? pendingPlacement?.seq, zIndex);
143
+ const bounds = drawable.getBounds();
144
+ const command = {
145
+ kind: RenderEntryKind.Draw,
146
+ drawable,
147
+ nodeIndex: this._nodeIndex++,
148
+ seq: placement.seq,
149
+ zIndex: placement.zIndex,
150
+ material: makeMaterialKey(drawable, this.backend),
151
+ minX: bounds.left,
152
+ minY: bounds.top,
153
+ maxX: bounds.right,
154
+ maxY: bounds.bottom,
155
+ };
156
+ this._pushEntry({
157
+ kind: RenderEntryKind.Draw,
158
+ seq: placement.seq,
159
+ zIndex: placement.zIndex,
160
+ command,
161
+ });
162
+ }
163
+ _resetRuntimeState() {
164
+ this._scopeStack.length = 0;
165
+ this._pendingEntryPlacement = null;
166
+ this._groupPoolCursor = 0;
167
+ this._view = null;
168
+ this._nodeIndex = 0;
169
+ }
170
+ _acquireGroupScope(preserveDrawOrder) {
171
+ const scope = this._groupPool[this._groupPoolCursor] ?? {
172
+ kind: RenderEntryKind.Group,
173
+ entries: [],
174
+ hasMixedZ: false,
175
+ preserveDrawOrder: false,
176
+ _nextSeq: 0,
177
+ firstZ: null,
178
+ };
179
+ this._groupPool[this._groupPoolCursor] = scope;
180
+ this._groupPoolCursor++;
181
+ scope.entries.length = 0;
182
+ scope.hasMixedZ = false;
183
+ scope.preserveDrawOrder = preserveDrawOrder;
184
+ scope._nextSeq = 0;
185
+ scope.firstZ = null;
186
+ return scope;
187
+ }
188
+ _reserveEntryPlacement(seq, zIndex) {
189
+ const scope = this._currentScope();
190
+ const nextSeq = seq ?? scope._nextSeq;
191
+ if (nextSeq >= scope._nextSeq) {
192
+ scope._nextSeq = nextSeq + 1;
193
+ }
194
+ if (scope.firstZ === null) {
195
+ scope.firstZ = zIndex;
196
+ }
197
+ else if (!scope.hasMixedZ && scope.firstZ !== zIndex) {
198
+ scope.hasMixedZ = true;
199
+ }
200
+ return { seq: nextSeq, zIndex };
201
+ }
202
+ _pushEntry(entry) {
203
+ this._currentScope().entries.push(entry);
204
+ }
205
+ _currentScope() {
206
+ const scope = this._scopeStack[this._scopeStack.length - 1];
207
+ if (!scope) {
208
+ throw new Error('RenderPlanBuilder scope stack is empty.');
209
+ }
210
+ return scope;
211
+ }
212
+ _resolvePreserveDrawOrder(node) {
213
+ return node.preserveDrawOrder;
214
+ }
215
+ _createEffectDescriptor(node) {
216
+ const mask = node._renderPlanGetMaskSource();
217
+ let clip = ClipKind.None;
218
+ let clipShape = null;
219
+ if (node.clip) {
220
+ const shape = node.clipShape;
221
+ if (shape === null || shape instanceof Rectangle) {
222
+ clip = ClipKind.Rect;
223
+ clipShape = shape;
224
+ }
225
+ else {
226
+ clip = ClipKind.Stencil;
227
+ clipShape = shape;
228
+ }
229
+ }
230
+ return {
231
+ filters: node._renderPlanGetFilters(),
232
+ clip,
233
+ clipShape,
234
+ maskSource: mask,
235
+ cacheAsBitmap: node.cacheAsBitmap,
236
+ blendMode: node._renderPlanGetBlendMode(),
237
+ };
238
+ }
239
+ }
240
+
241
+ export { RenderPlanBuilder };
242
+ //# sourceMappingURL=RenderPlanBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderPlanBuilder.js","sources":["../../../../../src/rendering/plan/RenderPlanBuilder.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { RenderPlan } from './RenderPlan';
2
+ /** @internal */
3
+ export declare class RenderPlanOptimizer {
4
+ static optimize(plan: RenderPlan): void;
5
+ private static _optimizeGroup;
6
+ private static _applyMaterialGrouping;
7
+ private static _assignGroupIndices;
8
+ private static _materialGroupSegment;
9
+ private static _overlapAwareGroup;
10
+ }
@@ -0,0 +1,180 @@
1
+ import { RenderEntryKind } from './RenderCommand.js';
2
+
3
+ const groupKey = (material) => `${material.pipelineKey}:${material.bindKey}`;
4
+ const aabbOverlap = (a, b) => a.minX < b.maxX && a.maxX > b.minX && a.minY < b.maxY && a.maxY > b.minY;
5
+ /** @internal */
6
+ class RenderPlanOptimizer {
7
+ static optimize(plan) {
8
+ for (const pass of plan.passes) {
9
+ this._optimizeGroup(pass.root);
10
+ }
11
+ }
12
+ static _optimizeGroup(scope) {
13
+ if (scope.hasMixedZ) {
14
+ const indexed = scope.entries.map((entry, index) => ({ entry, index }));
15
+ indexed.sort((left, right) => {
16
+ return left.entry.zIndex - right.entry.zIndex || left.entry.seq - right.entry.seq || left.index - right.index;
17
+ });
18
+ for (let i = 0; i < indexed.length; i++) {
19
+ scope.entries[i] = indexed[i].entry;
20
+ }
21
+ }
22
+ this._applyMaterialGrouping(scope);
23
+ for (const entry of scope.entries) {
24
+ if (entry.kind === RenderEntryKind.Group) {
25
+ this._optimizeGroup(entry.scope);
26
+ }
27
+ else if (entry.kind === RenderEntryKind.Barrier && entry.scope.childPlan !== null) {
28
+ this._optimizeGroup(entry.scope.childPlan);
29
+ }
30
+ }
31
+ }
32
+ static _applyMaterialGrouping(scope) {
33
+ const entries = scope.entries;
34
+ const n = entries.length;
35
+ if (n === 0) {
36
+ return;
37
+ }
38
+ let segStart = 0;
39
+ for (let i = 0; i <= n; i++) {
40
+ const entry = i < n ? entries[i] : null;
41
+ const isBoundary = entry === null || entry.kind === RenderEntryKind.Group || entry.kind === RenderEntryKind.Barrier;
42
+ if (isBoundary && i > segStart) {
43
+ const segEnd = i;
44
+ const segLen = segEnd - segStart;
45
+ if (segLen >= 1) {
46
+ this._materialGroupSegment(entries, segStart, segEnd, scope.preserveDrawOrder);
47
+ }
48
+ segStart = i + 1;
49
+ }
50
+ else if (isBoundary) {
51
+ segStart = i + 1;
52
+ }
53
+ }
54
+ this._assignGroupIndices(scope);
55
+ }
56
+ static _assignGroupIndices(scope) {
57
+ let nextGroupIndex = 1;
58
+ let prevKey = null;
59
+ let prevZ = null;
60
+ for (const entry of scope.entries) {
61
+ if (entry.kind !== RenderEntryKind.Draw) {
62
+ prevKey = null;
63
+ prevZ = null;
64
+ continue;
65
+ }
66
+ const key = groupKey(entry.command.material);
67
+ const z = entry.zIndex;
68
+ if (prevKey === null || prevZ === null || key !== prevKey || z !== prevZ) {
69
+ nextGroupIndex++;
70
+ prevKey = key;
71
+ prevZ = z;
72
+ }
73
+ entry.command.groupIndex = nextGroupIndex;
74
+ }
75
+ }
76
+ static _materialGroupSegment(entries, start, end, preserveDrawOrder) {
77
+ const len = end - start;
78
+ if (len <= 1) {
79
+ return;
80
+ }
81
+ const draws = [];
82
+ for (let i = start; i < end; i++) {
83
+ const entry = entries[i];
84
+ if (entry.kind === RenderEntryKind.Draw) {
85
+ draws.push({ entry, origIdx: i });
86
+ }
87
+ }
88
+ if (draws.length <= 1) {
89
+ return;
90
+ }
91
+ if (!preserveDrawOrder) {
92
+ const zGroups = new Map();
93
+ for (const d of draws) {
94
+ const z = d.entry.zIndex;
95
+ const list = zGroups.get(z) ?? [];
96
+ list.push(d);
97
+ zGroups.set(z, list);
98
+ }
99
+ for (const zGroup of zGroups.values()) {
100
+ if (zGroup.length > 1) {
101
+ this._overlapAwareGroup(zGroup, entries, start, end);
102
+ }
103
+ }
104
+ }
105
+ }
106
+ static _overlapAwareGroup(zGroup, entries, segStart, segEnd) {
107
+ const keyGroups = new Map();
108
+ for (const d of zGroup) {
109
+ const key = groupKey(d.entry.command.material);
110
+ const list = keyGroups.get(key) ?? [];
111
+ list.push(d);
112
+ keyGroups.set(key, list);
113
+ }
114
+ if (keyGroups.size <= 1) {
115
+ return;
116
+ }
117
+ for (const group of keyGroups.values()) {
118
+ if (group.length <= 1) {
119
+ continue;
120
+ }
121
+ const positions = [];
122
+ for (const g of group) {
123
+ const pos = entries.indexOf(g.entry, segStart);
124
+ if (pos >= segStart && pos < segEnd) {
125
+ positions.push(pos);
126
+ }
127
+ }
128
+ positions.sort((a, b) => a - b);
129
+ const first = positions[0];
130
+ const last = positions[positions.length - 1];
131
+ if (last - first + 1 === positions.length) {
132
+ continue;
133
+ }
134
+ let blocked = false;
135
+ for (let p = first + 1; p < last && !blocked; p++) {
136
+ const mid = entries[p];
137
+ if (mid.kind !== RenderEntryKind.Draw) {
138
+ continue;
139
+ }
140
+ const midKey = groupKey(mid.command.material);
141
+ if (midKey === groupKey(group[0].entry.command.material)) {
142
+ continue;
143
+ }
144
+ for (const g of group) {
145
+ if (aabbOverlap(g.entry.command, mid.command)) {
146
+ blocked = true;
147
+ break;
148
+ }
149
+ }
150
+ }
151
+ if (blocked) {
152
+ continue;
153
+ }
154
+ const beforeFirst = [];
155
+ for (let p = segStart; p < first; p++) {
156
+ beforeFirst.push(entries[p]);
157
+ }
158
+ const afterLast = [];
159
+ for (let p = last + 1; p < segEnd; p++) {
160
+ afterLast.push(entries[p]);
161
+ }
162
+ const groupSet = new Set(group.map(g => g.entry));
163
+ const betweenNonGroup = [];
164
+ for (let p = first; p <= last; p++) {
165
+ if (!groupSet.has(entries[p])) {
166
+ betweenNonGroup.push(entries[p]);
167
+ }
168
+ }
169
+ const groupEntries = group.map(g => g.entry);
170
+ const reordered = [...beforeFirst, ...groupEntries, ...betweenNonGroup, ...afterLast];
171
+ for (let p = segStart; p < segEnd; p++) {
172
+ entries[p] = reordered[p - segStart];
173
+ }
174
+ break;
175
+ }
176
+ }
177
+ }
178
+
179
+ export { RenderPlanOptimizer };
180
+ //# sourceMappingURL=RenderPlanOptimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderPlanOptimizer.js","sources":["../../../../../src/rendering/plan/RenderPlanOptimizer.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA,MAAM,QAAQ,GAAG,CAAC,QAAqB,KAAa,CAAA,EAAG,QAAQ,CAAC,WAAW,CAAA,CAAA,EAAI,QAAQ,CAAC,OAAO,EAAE;AAEjG,MAAM,WAAW,GAAG,CAAC,CAAc,EAAE,CAAc,KAAc,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;AAEzI;MACa,mBAAmB,CAAA;IACvB,OAAO,QAAQ,CAAC,IAAgB,EAAA;AACrC,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AAC9B,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC;IACF;IAEQ,OAAO,cAAc,CAAC,KAAiB,EAAA;AAC7C,QAAA,IAAI,KAAK,CAAC,SAAS,EAAE;YACnB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAEvE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAC3B,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;AAC/G,YAAA,CAAC,CAAC;AAEF,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,gBAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK;YACrC;QACF;AAEA,QAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;AAElC,QAAA,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,EAAE;AACxC,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;YAClC;AAAO,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,EAAE;gBACnF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C;QACF;IACF;IAEQ,OAAO,sBAAsB,CAAC,KAAiB,EAAA;AACrD,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;AAC7B,QAAA,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM;AAExB,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE;YACX;QACF;QAEA,IAAI,QAAQ,GAAG,CAAC;AAEhB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC3B,YAAA,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;YACvC,MAAM,UAAU,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,OAAO;AAEnH,YAAA,IAAI,UAAU,IAAI,CAAC,GAAG,QAAQ,EAAE;gBAC9B,MAAM,MAAM,GAAG,CAAC;AAChB,gBAAA,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ;AAEhC,gBAAA,IAAI,MAAM,IAAI,CAAC,EAAE;AACf,oBAAA,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,iBAAiB,CAAC;gBAChF;AAEA,gBAAA,QAAQ,GAAG,CAAC,GAAG,CAAC;YAClB;iBAAO,IAAI,UAAU,EAAE;AACrB,gBAAA,QAAQ,GAAG,CAAC,GAAG,CAAC;YAClB;QACF;AAEA,QAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;IACjC;IAEQ,OAAO,mBAAmB,CAAC,KAAiB,EAAA;QAClD,IAAI,cAAc,GAAG,CAAC;QACtB,IAAI,OAAO,GAAkB,IAAI;QACjC,IAAI,KAAK,GAAkB,IAAI;AAE/B,QAAA,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,EAAE;gBACvC,OAAO,GAAG,IAAI;gBACd,KAAK,GAAG,IAAI;gBAEZ;YACF;YAEA,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;AAC5C,YAAA,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM;AAEtB,YAAA,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,EAAE;AACxE,gBAAA,cAAc,EAAE;gBAChB,OAAO,GAAG,GAAG;gBACb,KAAK,GAAG,CAAC;YACX;AAEA,YAAA,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,cAAc;QAC3C;IACF;IAEQ,OAAO,qBAAqB,CAAC,OAAqB,EAAE,KAAa,EAAE,GAAW,EAAE,iBAA0B,EAAA;AAChH,QAAA,MAAM,GAAG,GAAG,GAAG,GAAG,KAAK;AAEvB,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE;YACZ;QACF;QAEA,MAAM,KAAK,GAAsD,EAAE;AAEnE,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AAChC,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;YAExB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,EAAE;gBACvC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YACnC;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;YACrB;QACF;QAEA,IAAI,CAAC,iBAAiB,EAAE;AACtB,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6D;AAEpF,YAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;AACrB,gBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM;gBACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;AAEjC,gBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACZ,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;YACtB;YAEA,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE;AACrC,gBAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBACrB,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC;gBACtD;YACF;QACF;IACF;IAEQ,OAAO,kBAAkB,CAAC,MAAyD,EAAE,OAAqB,EAAE,QAAgB,EAAE,MAAc,EAAA;AAClJ,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA6D;AAEtF,QAAA,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;AACtB,YAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;AAErC,YAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACZ,YAAA,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;QAC1B;AAEA,QAAA,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC,EAAE;YACvB;QACF;QAEA,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE;AACtC,YAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;gBACrB;YACF;YAEA,MAAM,SAAS,GAAa,EAAE;AAE9B,YAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;AACrB,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC;gBAE9C,IAAI,GAAG,IAAI,QAAQ,IAAI,GAAG,GAAG,MAAM,EAAE;AACnC,oBAAA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;gBACrB;YACF;AAEA,YAAA,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAE/B,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAE5C,IAAI,IAAI,GAAG,KAAK,GAAG,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE;gBACzC;YACF;YAEA,IAAI,OAAO,GAAG,KAAK;AAEnB,YAAA,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;AACjD,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;gBAEtB,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,EAAE;oBACrC;gBACF;gBAEA,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;AAE7C,gBAAA,IAAI,MAAM,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;oBACxD;gBACF;AAEA,gBAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;AACrB,oBAAA,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;wBAC7C,OAAO,GAAG,IAAI;wBAEd;oBACF;gBACF;YACF;YAEA,IAAI,OAAO,EAAE;gBACX;YACF;YAEA,MAAM,WAAW,GAAiB,EAAE;AAEpC,YAAA,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBACrC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9B;YAEA,MAAM,SAAS,GAAiB,EAAE;AAElC,YAAA,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,eAAe,GAAiB,EAAE;AAExC,YAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE;gBAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAmB,CAAC,EAAE;oBAC/C,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClC;YACF;AAEA,YAAA,MAAM,YAAY,GAAiB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;AAC1D,YAAA,MAAM,SAAS,GAAiB,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,EAAE,GAAG,eAAe,EAAE,GAAG,SAAS,CAAC;AAEnG,YAAA,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,QAAQ,CAAC;YACtC;YAEA;QACF;IACF;AACD;;;;"}
@@ -0,0 +1,13 @@
1
+ import type { RenderBackend } from '@/rendering/RenderBackend';
2
+ import type { RenderPlan } from './RenderPlan';
3
+ import type { RenderScope } from './RenderScope';
4
+ /** @internal */
5
+ export declare class RenderPlanPlayer {
6
+ static play(plan: RenderPlan, backend: RenderBackend): void;
7
+ static playScope(scope: RenderScope, backend: RenderBackend): void;
8
+ private static _playScope;
9
+ private static _playGroup;
10
+ private static _createPlaybackContext;
11
+ private static _createRenderGroupPlaybackContext;
12
+ private static _createRenderInstructionSlot;
13
+ }
@@ -0,0 +1,107 @@
1
+ import { RenderEntryKind } from './RenderCommand.js';
2
+ import { RenderEffectExecutor } from './RenderEffectExecutor.js';
3
+ import { collectRenderGroups } from './RenderInstruction.js';
4
+
5
+ /** @internal */
6
+ class RenderPlanPlayer {
7
+ static play(plan, backend) {
8
+ const hooks = backend;
9
+ hooks._beginDrawPlan?.(plan.nodeCount);
10
+ try {
11
+ for (const pass of plan.passes) {
12
+ if (pass.target !== null && backend.renderTarget !== pass.target) {
13
+ backend.setRenderTarget(pass.target);
14
+ }
15
+ if (backend.view !== pass.view) {
16
+ backend.setView(pass.view);
17
+ }
18
+ if (pass.clearColor !== null) {
19
+ backend.clear(pass.clearColor);
20
+ }
21
+ this._playScope(pass.root, backend, hooks, this._createPlaybackContext());
22
+ }
23
+ }
24
+ finally {
25
+ hooks._endDrawPlan?.();
26
+ }
27
+ }
28
+ static playScope(scope, backend) {
29
+ const hooks = backend;
30
+ this._playScope(scope, backend, hooks, this._createPlaybackContext());
31
+ }
32
+ static _playScope(scope, backend, hooks, context) {
33
+ if (scope.kind === RenderEntryKind.Barrier) {
34
+ RenderEffectExecutor.play(scope, backend, childScope => {
35
+ this._playScope(childScope, backend, hooks, context);
36
+ });
37
+ return;
38
+ }
39
+ this._playGroup(scope, backend, hooks, context);
40
+ }
41
+ static _playGroup(scope, backend, hooks, context) {
42
+ const groups = collectRenderGroups(scope);
43
+ let groupCursor = 0;
44
+ let currentGroup = null;
45
+ let currentInstructionIndex = 0;
46
+ for (const entry of scope.entries) {
47
+ if (entry.kind === RenderEntryKind.Draw) {
48
+ if (currentGroup === null) {
49
+ currentGroup = groups[groupCursor];
50
+ currentInstructionIndex = 0;
51
+ hooks._beginRenderGroup?.(currentGroup);
52
+ hooks._prepareRenderGroupUpload?.(currentGroup, this._createRenderGroupPlaybackContext(currentGroup.instructions.length, context.passInstructionIndex, context.passGroupIndex));
53
+ context.passGroupIndex++;
54
+ }
55
+ // Allocate the per-draw instruction slot only when a backend consumes
56
+ // it. No shipped backend implements `_prepareRenderInstructionSlot`, so
57
+ // skipping the `Object.freeze` slot allocation removes per-draw garbage
58
+ // from the playback hot path while preserving the extension point.
59
+ if (hooks._prepareRenderInstructionSlot !== undefined) {
60
+ const slot = this._createRenderInstructionSlot(currentInstructionIndex, context.passInstructionIndex);
61
+ hooks._prepareRenderInstructionSlot(entry.command, slot);
62
+ }
63
+ hooks._prepareDrawCommand?.(entry.command);
64
+ backend.draw(entry.command.drawable);
65
+ currentInstructionIndex++;
66
+ context.passInstructionIndex++;
67
+ if (currentGroup !== null && currentInstructionIndex === currentGroup.instructions.length) {
68
+ hooks._endRenderGroup?.(currentGroup);
69
+ currentGroup = null;
70
+ currentInstructionIndex = 0;
71
+ groupCursor++;
72
+ }
73
+ }
74
+ else if (entry.kind === RenderEntryKind.Group) {
75
+ this._playGroup(entry.scope, backend, hooks, context);
76
+ }
77
+ else {
78
+ RenderEffectExecutor.play(entry.scope, backend, childScope => {
79
+ this._playScope(childScope, backend, hooks, context);
80
+ });
81
+ }
82
+ }
83
+ }
84
+ static _createPlaybackContext() {
85
+ return {
86
+ passInstructionIndex: 0,
87
+ passGroupIndex: 0,
88
+ };
89
+ }
90
+ static _createRenderGroupPlaybackContext(groupInstructionCount, firstPassInstructionIndex, passGroupIndex) {
91
+ return Object.freeze({
92
+ groupInstructionCount,
93
+ firstPassInstructionIndex,
94
+ lastPassInstructionIndex: firstPassInstructionIndex + groupInstructionCount - 1,
95
+ passGroupIndex,
96
+ });
97
+ }
98
+ static _createRenderInstructionSlot(groupInstructionIndex, passInstructionIndex) {
99
+ return Object.freeze({
100
+ groupInstructionIndex,
101
+ passInstructionIndex,
102
+ });
103
+ }
104
+ }
105
+
106
+ export { RenderPlanPlayer };
107
+ //# sourceMappingURL=RenderPlanPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderPlanPlayer.js","sources":["../../../../../src/rendering/plan/RenderPlanPlayer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type { Rectangle } from '@/math/Rectangle';
2
+ import type { Filter } from '@/rendering/filters/Filter';
3
+ import type { Geometry } from '@/rendering/geometry/Geometry';
4
+ import type { MaskSource, RenderNode } from '@/rendering/RenderNode';
5
+ import type { BlendModes } from '@/rendering/types';
6
+ import type { DrawCommand, RenderEntryKind } from './RenderCommand';
7
+ /**
8
+ * Geometric clip kind for a {@link RenderNode}'s `clip`/`clipShape`. Distinct
9
+ * from `maskSource` (alpha/visibility masking): `Rect` uses the GPU scissor
10
+ * fast path, `Stencil` writes a {@link Geometry} silhouette into the stencil
11
+ * buffer. `maskSource` continues to drive the separate alpha-mask machinery.
12
+ * @internal
13
+ */
14
+ export declare const enum ClipKind {
15
+ None = 0,
16
+ Rect = 1,
17
+ Stencil = 2
18
+ }
19
+ /** @internal */
20
+ export interface EffectDescriptor {
21
+ readonly filters: readonly Filter[];
22
+ readonly clip: ClipKind;
23
+ readonly clipShape: Rectangle | Geometry | null;
24
+ readonly maskSource: MaskSource;
25
+ readonly cacheAsBitmap: boolean;
26
+ readonly blendMode: BlendModes;
27
+ }
28
+ /** @internal */
29
+ export interface DrawScopeEntry {
30
+ readonly kind: RenderEntryKind.Draw;
31
+ readonly seq: number;
32
+ readonly zIndex: number;
33
+ readonly command: DrawCommand;
34
+ }
35
+ /** @internal */
36
+ export interface GroupScopeEntry {
37
+ readonly kind: RenderEntryKind.Group;
38
+ readonly seq: number;
39
+ readonly zIndex: number;
40
+ readonly scope: GroupScope;
41
+ }
42
+ /** @internal */
43
+ export interface BarrierScopeEntry {
44
+ readonly kind: RenderEntryKind.Barrier;
45
+ readonly seq: number;
46
+ readonly zIndex: number;
47
+ readonly scope: BarrierScope;
48
+ }
49
+ /** @internal */
50
+ export type ScopeEntry = DrawScopeEntry | GroupScopeEntry | BarrierScopeEntry;
51
+ /** @internal */
52
+ export interface GroupScope {
53
+ readonly kind: RenderEntryKind.Group;
54
+ entries: ScopeEntry[];
55
+ hasMixedZ: boolean;
56
+ preserveDrawOrder: boolean;
57
+ }
58
+ /** @internal */
59
+ export interface BarrierScope {
60
+ readonly kind: RenderEntryKind.Barrier;
61
+ readonly node: RenderNode;
62
+ readonly effect: EffectDescriptor;
63
+ childPlan: GroupScope | null;
64
+ left: number;
65
+ top: number;
66
+ width: number;
67
+ height: number;
68
+ }
69
+ /** @internal */
70
+ export type RenderScope = GroupScope | BarrierScope;