@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,86 @@
1
+ import type { Drawable } from '@/rendering/Drawable';
2
+ import type { RenderBackend } from '@/rendering/RenderBackend';
3
+ import type { BlendModes } from '@/rendering/types';
4
+ /** @internal */
5
+ export declare const enum RenderEntryKind {
6
+ Draw = 0,
7
+ Group = 1,
8
+ Barrier = 2
9
+ }
10
+ /**
11
+ * @internal
12
+ *
13
+ * Stable material identity used for safe draw-command grouping and
14
+ * eventual instanced batching.
15
+ *
16
+ * - {@link pipelineKey} drives pipeline/program reuse: identical key ⇒
17
+ * identical GPU pipeline state (shader + blend + sampler). Two draws
18
+ * with the same pipeline key can be issued with a single pipeline bind.
19
+ * - {@link bindKey} drives texture-bind reuse: identical key ⇒ identical
20
+ * texture bindings. Two draws with the same bind key can share a bind
21
+ * group / texture-slot state.
22
+ *
23
+ * When the drawable carries a {@link Material}, both keys are taken
24
+ * directly from `material.pipelineKey` and `material.bindKey` (the Material
25
+ * system). When the drawable uses its default path (no material),
26
+ * the keys are derived conservatively from renderer identity, blend mode,
27
+ * and texture identity so grouping never accidentally merges draws with
28
+ * incompatible state.
29
+ */
30
+ export interface MaterialKey {
31
+ readonly rendererId: number;
32
+ readonly blendMode: BlendModes;
33
+ readonly textureId: number;
34
+ readonly shaderId: number;
35
+ readonly pipelineKey: number;
36
+ readonly bindKey: number;
37
+ }
38
+ /** @internal */
39
+ export interface DrawCommand {
40
+ readonly kind: RenderEntryKind.Draw;
41
+ readonly drawable: Drawable;
42
+ nodeIndex: number;
43
+ seq: number;
44
+ zIndex: number;
45
+ material: MaterialKey;
46
+ /** Assigned by the optimizer; consecutive draws with the same groupIndex
47
+ * form a batch-safe unit. Undefined before optimisation. */
48
+ groupIndex?: number;
49
+ minX: number;
50
+ minY: number;
51
+ maxX: number;
52
+ maxY: number;
53
+ }
54
+ /**
55
+ * Derive a stable material key from the drawable.
56
+ *
57
+ * When the drawable carries a {@link Material} (e.g. a {@link MeshMaterial}
58
+ * or {@link SpriteMaterial}), the pipeline and bind keys are taken directly
59
+ * from the material so identically configured materials group together.
60
+ * When the drawable uses its default rendering path, both keys fall back
61
+ * to a conservative derivation from renderer identity, blend mode, and
62
+ * texture identity — keeping grouping safe but still enabling adjacency
63
+ * coalescing for default-pipeline draws of the same type.
64
+ *
65
+ * @internal
66
+ */
67
+ export declare const makeMaterialKey: (drawable: Drawable, backend: RenderBackend | null) => MaterialKey;
68
+ /**
69
+ * Whether a draw command's renderer reads the shared {@link TransformBuffer} /
70
+ * transform storage. The render-group upload boundary packs each command's
71
+ * world transform (+ tint) keyed by its `nodeIndex`; only renderers that fetch
72
+ * those rows back from the buffer need a record written.
73
+ *
74
+ * Sprite and Mesh (and their subclasses — {@link AnimatedSprite}, Video,
75
+ * Graphics' meshes) fetch the transform via `nodeIndex` and therefore consume
76
+ * it. Text/BitmapText and particle renderers pack their own per-node data into
77
+ * a private data texture / uniforms and never touch the shared buffer, so they
78
+ * opt out via `_consumesSharedTransform === false` and their writes are skipped.
79
+ *
80
+ * Anything else — a custom renderer, or a drawable with no registered renderer
81
+ * (resolve throws) — defaults to writing, so behaviour is unchanged for any
82
+ * path that might still rely on the shared transform.
83
+ *
84
+ * @internal
85
+ */
86
+ export declare const drawCommandUsesSharedTransform: (command: DrawCommand, backend: RenderBackend) => boolean;
@@ -0,0 +1,127 @@
1
+ /** @internal */
2
+ var RenderEntryKind;
3
+ (function (RenderEntryKind) {
4
+ RenderEntryKind[RenderEntryKind["Draw"] = 0] = "Draw";
5
+ RenderEntryKind[RenderEntryKind["Group"] = 1] = "Group";
6
+ RenderEntryKind[RenderEntryKind["Barrier"] = 2] = "Barrier";
7
+ })(RenderEntryKind || (RenderEntryKind = {}));
8
+ const rendererIds = new WeakMap();
9
+ const constructorRendererIds = new WeakMap();
10
+ const textureIds = new WeakMap();
11
+ const shaderIds = new WeakMap();
12
+ let nextRendererId = 1;
13
+ let nextTextureId = 1;
14
+ let nextShaderId = 1;
15
+ const getOrCreateId = (map, target, allocate) => {
16
+ const cached = map.get(target);
17
+ if (cached !== undefined) {
18
+ return cached;
19
+ }
20
+ const id = allocate();
21
+ map.set(target, id);
22
+ return id;
23
+ };
24
+ const getRendererId = (drawable, backend) => {
25
+ const registry = backend?.rendererRegistry;
26
+ if (registry && typeof registry.resolve === 'function') {
27
+ try {
28
+ const renderer = registry.resolve(drawable);
29
+ if (renderer && typeof renderer === 'object') {
30
+ return getOrCreateId(rendererIds, renderer, () => nextRendererId++);
31
+ }
32
+ }
33
+ catch {
34
+ // Resolve can throw if no renderer is registered for a custom drawable.
35
+ // Fall back to a conservative constructor-based id.
36
+ }
37
+ }
38
+ const ctor = drawable.constructor;
39
+ if (ctor && typeof ctor === 'function') {
40
+ return getOrCreateId(constructorRendererIds, ctor, () => nextRendererId++);
41
+ }
42
+ return 0;
43
+ };
44
+ const getTextureId = (drawable) => {
45
+ const texture = drawable.texture;
46
+ if (texture && typeof texture === 'object') {
47
+ return getOrCreateId(textureIds, texture, () => nextTextureId++);
48
+ }
49
+ return -1;
50
+ };
51
+ const getShaderId = (drawable) => {
52
+ const shader = drawable.shader;
53
+ if (shader && typeof shader === 'object') {
54
+ return getOrCreateId(shaderIds, shader, () => nextShaderId++);
55
+ }
56
+ return -1;
57
+ };
58
+ const getMaterial = (drawable) => {
59
+ const material = drawable.material;
60
+ return material ?? null;
61
+ };
62
+ /**
63
+ * Derive a stable material key from the drawable.
64
+ *
65
+ * When the drawable carries a {@link Material} (e.g. a {@link MeshMaterial}
66
+ * or {@link SpriteMaterial}), the pipeline and bind keys are taken directly
67
+ * from the material so identically configured materials group together.
68
+ * When the drawable uses its default rendering path, both keys fall back
69
+ * to a conservative derivation from renderer identity, blend mode, and
70
+ * texture identity — keeping grouping safe but still enabling adjacency
71
+ * coalescing for default-pipeline draws of the same type.
72
+ *
73
+ * @internal
74
+ */
75
+ const makeMaterialKey = (drawable, backend) => {
76
+ const rendererId = getRendererId(drawable, backend);
77
+ const blendMode = drawable.blendMode;
78
+ const textureId = getTextureId(drawable);
79
+ const shaderId = getShaderId(drawable);
80
+ const material = getMaterial(drawable);
81
+ const pipelineKey = material !== null ? material.pipelineKey : rendererId * 31 + blendMode;
82
+ const bindKey = material !== null ? material.bindKey : rendererId * 31 + (textureId > 0 ? textureId : 0);
83
+ return {
84
+ rendererId,
85
+ blendMode,
86
+ textureId,
87
+ shaderId,
88
+ pipelineKey,
89
+ bindKey,
90
+ };
91
+ };
92
+ /**
93
+ * Whether a draw command's renderer reads the shared {@link TransformBuffer} /
94
+ * transform storage. The render-group upload boundary packs each command's
95
+ * world transform (+ tint) keyed by its `nodeIndex`; only renderers that fetch
96
+ * those rows back from the buffer need a record written.
97
+ *
98
+ * Sprite and Mesh (and their subclasses — {@link AnimatedSprite}, Video,
99
+ * Graphics' meshes) fetch the transform via `nodeIndex` and therefore consume
100
+ * it. Text/BitmapText and particle renderers pack their own per-node data into
101
+ * a private data texture / uniforms and never touch the shared buffer, so they
102
+ * opt out via `_consumesSharedTransform === false` and their writes are skipped.
103
+ *
104
+ * Anything else — a custom renderer, or a drawable with no registered renderer
105
+ * (resolve throws) — defaults to writing, so behaviour is unchanged for any
106
+ * path that might still rely on the shared transform.
107
+ *
108
+ * @internal
109
+ */
110
+ const drawCommandUsesSharedTransform = (command, backend) => {
111
+ const registry = backend.rendererRegistry;
112
+ if (!registry || typeof registry.resolve !== 'function') {
113
+ return true;
114
+ }
115
+ try {
116
+ const renderer = registry.resolve(command.drawable);
117
+ return renderer._consumesSharedTransform !== false;
118
+ }
119
+ catch {
120
+ // No renderer registered for a custom drawable: keep the conservative
121
+ // write so any consumer of the shared transform keeps working.
122
+ return true;
123
+ }
124
+ };
125
+
126
+ export { RenderEntryKind, drawCommandUsesSharedTransform, makeMaterialKey };
127
+ //# sourceMappingURL=RenderCommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderCommand.js","sources":["../../../../../src/rendering/plan/RenderCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { RenderBackend } from '@/rendering/RenderBackend';
2
+ import { type BarrierScope, type GroupScope } from './RenderScope';
3
+ /** @internal */
4
+ export declare class RenderEffectExecutor {
5
+ static play(barrier: BarrierScope, backend: RenderBackend, playScope: (scope: GroupScope) => void): void;
6
+ private static _withClip;
7
+ private static _withRectClip;
8
+ private static _withMask;
9
+ private static _resolveMaskTexture;
10
+ }
@@ -0,0 +1,159 @@
1
+ import { Rectangle } from '../../math/Rectangle.js';
2
+ import { RenderTexture } from '../texture/RenderTexture.js';
3
+ import { Texture } from '../texture/Texture.js';
4
+ import { ClipKind } from './RenderScope.js';
5
+
6
+ /** @internal */
7
+ class RenderEffectExecutor {
8
+ static play(barrier, backend, playScope) {
9
+ const { node, effect } = barrier;
10
+ const hasFilters = effect.filters.length > 0;
11
+ const needsBitmapCache = effect.cacheAsBitmap;
12
+ const { left, top, width, height } = barrier;
13
+ if (!hasFilters && !needsBitmapCache) {
14
+ this._withClip(node, backend, barrier, () => {
15
+ if (barrier.childPlan !== null) {
16
+ playScope(barrier.childPlan);
17
+ }
18
+ });
19
+ return;
20
+ }
21
+ if (needsBitmapCache && barrier.childPlan === null) {
22
+ const cachedTexture = node._renderPlanGetCacheTexture();
23
+ if (cachedTexture !== null) {
24
+ this._withClip(node, backend, barrier, () => {
25
+ node._renderPlanDrawTexture(backend, cachedTexture, left, top, width, height, effect.blendMode);
26
+ });
27
+ }
28
+ return;
29
+ }
30
+ const cacheTexture = needsBitmapCache ? node._renderPlanEnsureCacheTexture(width, height) : null;
31
+ let pooledTexture = null;
32
+ try {
33
+ const sourceTexture = needsBitmapCache && !hasFilters ? cacheTexture : backend.acquireRenderTexture(width, height);
34
+ if (sourceTexture !== cacheTexture) {
35
+ pooledTexture = sourceTexture;
36
+ }
37
+ node._renderPlanRenderToTexture(backend, sourceTexture, left, top, width, height, () => {
38
+ if (barrier.childPlan !== null) {
39
+ playScope(barrier.childPlan);
40
+ }
41
+ });
42
+ let finalTexture = sourceTexture;
43
+ if (hasFilters) {
44
+ for (let index = 0; index < effect.filters.length; index++) {
45
+ const isLast = index === effect.filters.length - 1;
46
+ const output = isLast && needsBitmapCache ? cacheTexture : backend.acquireRenderTexture(width, height);
47
+ try {
48
+ effect.filters[index].apply(backend, finalTexture, output);
49
+ }
50
+ catch (error) {
51
+ if (output !== cacheTexture) {
52
+ backend.releaseRenderTexture(output);
53
+ }
54
+ throw error;
55
+ }
56
+ if (pooledTexture !== null) {
57
+ backend.releaseRenderTexture(pooledTexture);
58
+ pooledTexture = null;
59
+ }
60
+ finalTexture = output;
61
+ if (output !== cacheTexture) {
62
+ pooledTexture = output;
63
+ }
64
+ }
65
+ }
66
+ if (needsBitmapCache) {
67
+ node._renderPlanStoreCacheTexture(cacheTexture, left, top, width, height);
68
+ }
69
+ this._withClip(node, backend, barrier, () => {
70
+ node._renderPlanDrawTexture(backend, finalTexture, left, top, width, height, effect.blendMode);
71
+ });
72
+ }
73
+ finally {
74
+ if (pooledTexture !== null) {
75
+ backend.releaseRenderTexture(pooledTexture);
76
+ }
77
+ }
78
+ }
79
+ // Clip wraps the mask block as the outermost effect boundary, so it acts on
80
+ // the final filtered/masked output. Stencil (Geometry) is outermost; the Rect
81
+ // scissor sits between it and the alpha-mask machinery; both compose with any
82
+ // existing mask scissor since scissors/stencil are all restrictive.
83
+ static _withClip(node, backend, barrier, callback) {
84
+ if (barrier.effect.clip === ClipKind.Stencil) {
85
+ backend.pushStencilClip(barrier.effect.clipShape, node.getGlobalTransform());
86
+ try {
87
+ this._withRectClip(node, backend, barrier, callback);
88
+ }
89
+ finally {
90
+ backend.popStencilClip();
91
+ }
92
+ return;
93
+ }
94
+ this._withRectClip(node, backend, barrier, callback);
95
+ }
96
+ static _withRectClip(node, backend, barrier, callback) {
97
+ if (barrier.effect.clip === ClipKind.Rect) {
98
+ const rect = barrier.effect.clipShape ?? node.getBounds();
99
+ if (rect.width <= 0 || rect.height <= 0) {
100
+ return;
101
+ }
102
+ backend.pushScissorRect(rect);
103
+ try {
104
+ this._withMask(node, backend, barrier, callback);
105
+ }
106
+ finally {
107
+ backend.popScissorRect();
108
+ }
109
+ return;
110
+ }
111
+ this._withMask(node, backend, barrier, callback);
112
+ }
113
+ static _withMask(node, backend, barrier, callback) {
114
+ const mask = barrier.effect.maskSource;
115
+ if (mask === null) {
116
+ callback();
117
+ return;
118
+ }
119
+ if (mask instanceof Rectangle) {
120
+ if (mask.width <= 0 || mask.height <= 0) {
121
+ return;
122
+ }
123
+ backend.pushScissorRect(mask);
124
+ try {
125
+ callback();
126
+ }
127
+ finally {
128
+ backend.popScissorRect();
129
+ }
130
+ return;
131
+ }
132
+ const contentTexture = backend.acquireRenderTexture(barrier.width, barrier.height);
133
+ const releasePool = [contentTexture];
134
+ try {
135
+ node._renderPlanRenderToTexture(backend, contentTexture, barrier.left, barrier.top, barrier.width, barrier.height, callback);
136
+ const maskTexture = this._resolveMaskTexture(node, backend, mask, barrier, releasePool);
137
+ backend.composeWithAlphaMask(contentTexture, maskTexture, barrier.left, barrier.top, barrier.width, barrier.height, barrier.effect.blendMode);
138
+ }
139
+ finally {
140
+ for (const texture of releasePool) {
141
+ backend.releaseRenderTexture(texture);
142
+ }
143
+ }
144
+ }
145
+ static _resolveMaskTexture(node, backend, mask, barrier, releasePool) {
146
+ if (!(mask instanceof Texture) && !(mask instanceof RenderTexture)) {
147
+ const maskTexture = backend.acquireRenderTexture(barrier.width, barrier.height);
148
+ releasePool.push(maskTexture);
149
+ node._renderPlanRenderToTexture(backend, maskTexture, barrier.left, barrier.top, barrier.width, barrier.height, () => {
150
+ mask.render(backend);
151
+ });
152
+ return maskTexture;
153
+ }
154
+ return mask;
155
+ }
156
+ }
157
+
158
+ export { RenderEffectExecutor };
159
+ //# sourceMappingURL=RenderEffectExecutor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderEffectExecutor.js","sources":["../../../../../src/rendering/plan/RenderEffectExecutor.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { type DrawCommand, type MaterialKey } from './RenderCommand';
2
+ import type { GroupScope } from './RenderScope';
3
+ /**
4
+ * The canonical, reorderable unit of work in a render plan: a single draw
5
+ * that the plan player submits to the backend.
6
+ *
7
+ * Today a render instruction is exactly a {@link DrawCommand}; the alias
8
+ * names the concept the plan player consumes and that the batching layer
9
+ * reorders, independent of how the draw happens to be stored in the scope
10
+ * tree. Future {@link TransformBuffer} slotting keys on each instruction's
11
+ * stable {@link DrawCommand.nodeIndex} (within the `[0, plan.nodeCount)`
12
+ * slot space).
13
+ *
14
+ * @internal
15
+ */
16
+ export type RenderInstruction = DrawCommand;
17
+ /**
18
+ * A materialized batch unit: a maximal run of consecutive
19
+ * {@link RenderInstruction}s within a single {@link GroupScope} that share a
20
+ * GPU pipeline/bind state and may therefore be submitted together.
21
+ *
22
+ * The optimizer ({@link RenderPlanOptimizer}) already stamps this grouping
23
+ * implicitly onto each {@link DrawCommand.groupIndex}; a `RenderGroup` makes
24
+ * that batch unit explicit as a value without altering playback. The mesh
25
+ * renderers continue to detect batches by comparing adjacent `groupIndex`es,
26
+ * so this representation is purely additive.
27
+ *
28
+ * @internal
29
+ */
30
+ export interface RenderGroup {
31
+ /** Optimizer-assigned batch identity shared by every instruction in the run. */
32
+ readonly groupIndex: number;
33
+ /** Pipeline/bind state shared by the run; taken from its first instruction. */
34
+ readonly material: MaterialKey;
35
+ /** Draw instructions in submit order. */
36
+ readonly instructions: readonly RenderInstruction[];
37
+ }
38
+ /**
39
+ * Materialize the {@link RenderGroup} batch units contained directly in
40
+ * `scope`. Consecutive draw instructions that share a defined `groupIndex`
41
+ * coalesce into one group; any non-draw entry (a nested group or barrier)
42
+ * breaks the run, and a draw whose `groupIndex` is still `undefined` (i.e.
43
+ * the plan has not been optimized) forms its own singleton group — mirroring
44
+ * the adjacency semantics the mesh renderers already rely on.
45
+ *
46
+ * This is a read-only view over an (optimized) scope; it does not mutate the
47
+ * plan or affect playback order.
48
+ *
49
+ * @internal
50
+ */
51
+ export declare function collectRenderGroups(scope: GroupScope): RenderGroup[];
@@ -0,0 +1,45 @@
1
+ import { RenderEntryKind } from './RenderCommand.js';
2
+
3
+ /**
4
+ * Materialize the {@link RenderGroup} batch units contained directly in
5
+ * `scope`. Consecutive draw instructions that share a defined `groupIndex`
6
+ * coalesce into one group; any non-draw entry (a nested group or barrier)
7
+ * breaks the run, and a draw whose `groupIndex` is still `undefined` (i.e.
8
+ * the plan has not been optimized) forms its own singleton group — mirroring
9
+ * the adjacency semantics the mesh renderers already rely on.
10
+ *
11
+ * This is a read-only view over an (optimized) scope; it does not mutate the
12
+ * plan or affect playback order.
13
+ *
14
+ * @internal
15
+ */
16
+ function collectRenderGroups(scope) {
17
+ const groups = [];
18
+ let current = null;
19
+ for (const entry of scope.entries) {
20
+ if (entry.kind !== RenderEntryKind.Draw) {
21
+ current = null;
22
+ continue;
23
+ }
24
+ const command = entry.command;
25
+ const groupIndex = command.groupIndex;
26
+ if (current !== null && groupIndex !== undefined && groupIndex === current.groupIndex) {
27
+ current.instructions.push(command);
28
+ continue;
29
+ }
30
+ current = {
31
+ groupIndex: groupIndex ?? 0,
32
+ material: command.material,
33
+ instructions: [command],
34
+ };
35
+ groups.push(current);
36
+ if (groupIndex === undefined) {
37
+ // Unoptimized / non-batchable draw: never coalesce with the next one.
38
+ current = null;
39
+ }
40
+ }
41
+ return groups;
42
+ }
43
+
44
+ export { collectRenderGroups };
45
+ //# sourceMappingURL=RenderInstruction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderInstruction.js","sources":["../../../../../src/rendering/plan/RenderInstruction.ts"],"sourcesContent":[null],"names":[],"mappings":";;AA8CA;;;;;;;;;;;;AAYG;AACG,SAAU,mBAAmB,CAAC,KAAiB,EAAA;IACnD,MAAM,MAAM,GAAkB,EAAE;IAChC,IAAI,OAAO,GAA8B,IAAI;AAE7C,IAAA,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,EAAE;YACvC,OAAO,GAAG,IAAI;YAEd;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;AAC7B,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU;AAErC,QAAA,IAAI,OAAO,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE;AACrF,YAAA,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;YAElC;QACF;AAEA,QAAA,OAAO,GAAG;YACR,UAAU,EAAE,UAAU,IAAI,CAAC;YAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,CAAC,OAAO,CAAC;SACxB;AACD,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;AAEpB,QAAA,IAAI,UAAU,KAAK,SAAS,EAAE;;YAE5B,OAAO,GAAG,IAAI;QAChB;IACF;AAEA,IAAA,OAAO,MAAM;AACf;;;;"}
@@ -0,0 +1,23 @@
1
+ import type { Color } from '@/core/Color';
2
+ import type { RenderTarget } from '@/rendering/RenderTarget';
3
+ import type { View } from '@/rendering/View';
4
+ import type { GroupScope } from './RenderScope';
5
+ /** @internal */
6
+ export interface RenderPassScope {
7
+ target: RenderTarget | null;
8
+ view: View;
9
+ clearColor: Color | null;
10
+ root: GroupScope;
11
+ }
12
+ /** @internal */
13
+ export interface RenderPlan {
14
+ passes: RenderPassScope[];
15
+ nodeCount: number;
16
+ reset(): void;
17
+ }
18
+ /** @internal */
19
+ export declare class MutableRenderPlan implements RenderPlan {
20
+ readonly passes: RenderPassScope[];
21
+ nodeCount: number;
22
+ reset(): void;
23
+ }
@@ -0,0 +1,12 @@
1
+ /** @internal */
2
+ class MutableRenderPlan {
3
+ passes = [];
4
+ nodeCount = 0;
5
+ reset() {
6
+ this.passes.length = 0;
7
+ this.nodeCount = 0;
8
+ }
9
+ }
10
+
11
+ export { MutableRenderPlan };
12
+ //# sourceMappingURL=RenderPlan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderPlan.js","sources":["../../../../../src/rendering/plan/RenderPlan.ts"],"sourcesContent":[null],"names":[],"mappings":"AAqBA;MACa,iBAAiB,CAAA;IACZ,MAAM,GAAsB,EAAE;IACvC,SAAS,GAAG,CAAC;IAEb,KAAK,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC;IACpB;AACD;;;;"}
@@ -0,0 +1,31 @@
1
+ import type { Drawable } from '@/rendering/Drawable';
2
+ import type { RenderBackend } from '@/rendering/RenderBackend';
3
+ import type { RenderNode } from '@/rendering/RenderNode';
4
+ import type { View } from '@/rendering/View';
5
+ import { type RenderPlan } from './RenderPlan';
6
+ /** @internal */
7
+ export declare class RenderPlanBuilder {
8
+ private static readonly _available;
9
+ private static readonly _active;
10
+ static acquire(): RenderPlanBuilder;
11
+ static release(builder: RenderPlanBuilder): void;
12
+ backend: RenderBackend;
13
+ private _view;
14
+ private readonly _plan;
15
+ private readonly _groupPool;
16
+ private readonly _scopeStack;
17
+ private _groupPoolCursor;
18
+ private _pendingEntryPlacement;
19
+ private _nodeIndex;
20
+ build(root: RenderNode, backend: RenderBackend): RenderPlan;
21
+ get view(): View;
22
+ emitNode(node: RenderNode, seq?: number): void;
23
+ emitDraw(drawable: Drawable, seq?: number): void;
24
+ private _resetRuntimeState;
25
+ private _acquireGroupScope;
26
+ private _reserveEntryPlacement;
27
+ private _pushEntry;
28
+ private _currentScope;
29
+ private _resolvePreserveDrawOrder;
30
+ private _createEffectDescriptor;
31
+ }