@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.
- package/CHANGELOG.md +127 -0
- package/README.md +14 -14
- package/dist/esm/core/Application.d.ts +25 -6
- package/dist/esm/core/Application.js +42 -8
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Perf.d.ts +23 -0
- package/dist/esm/core/Perf.js +49 -0
- package/dist/esm/core/Perf.js.map +1 -0
- package/dist/esm/core/Scene.d.ts +8 -8
- package/dist/esm/core/Scene.js +7 -7
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.js +2 -2
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +0 -3
- package/dist/esm/core/SceneNode.js +0 -9
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/core/capabilities.d.ts +2 -0
- package/dist/esm/core/capabilities.js +15 -0
- package/dist/esm/core/capabilities.js.map +1 -1
- package/dist/esm/core/dev.d.ts +21 -0
- package/dist/esm/core/dev.js +18 -0
- package/dist/esm/core/dev.js.map +1 -0
- package/dist/esm/core/index.d.ts +1 -0
- package/dist/esm/core/types.d.ts +1 -1
- package/dist/esm/core/utils.d.ts +12 -0
- package/dist/esm/core/utils.js +18 -1
- package/dist/esm/core/utils.js.map +1 -1
- package/dist/esm/index.js +14 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/particles/ParticleSystem.d.ts +8 -5
- package/dist/esm/particles/ParticleSystem.js +9 -5
- package/dist/esm/particles/ParticleSystem.js.map +1 -1
- package/dist/esm/particles/distributions/{Gradient.d.ts → ColorGradient.d.ts} +5 -5
- package/dist/esm/particles/distributions/{Gradient.js → ColorGradient.js} +5 -5
- package/dist/esm/particles/distributions/ColorGradient.js.map +1 -0
- package/dist/esm/particles/distributions/Distribution.d.ts +2 -2
- package/dist/esm/particles/distributions/index.d.ts +2 -2
- package/dist/esm/particles/gpu/ParticleGpuState.js +1 -1
- package/dist/esm/particles/modules/AlphaFadeOverLifetime.d.ts +2 -2
- package/dist/esm/particles/modules/AlphaFadeOverLifetime.js +5 -1
- package/dist/esm/particles/modules/AlphaFadeOverLifetime.js.map +1 -1
- package/dist/esm/particles/modules/ColorOverLifetime.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverLifetime.js.map +1 -1
- package/dist/esm/particles/modules/ColorOverSpeed.d.ts +3 -3
- package/dist/esm/particles/modules/ColorOverSpeed.js.map +1 -1
- package/dist/esm/particles/modules/UpdateModule.d.ts +2 -2
- package/dist/esm/particles/modules/UpdateModule.js +1 -1
- package/dist/esm/particles/modules/WgslContribution.d.ts +2 -2
- package/dist/esm/rendering/Camera.d.ts +33 -0
- package/dist/esm/rendering/Camera.js +38 -0
- package/dist/esm/rendering/Camera.js.map +1 -0
- package/dist/esm/rendering/Container.d.ts +5 -24
- package/dist/esm/rendering/Container.js +8 -71
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +8 -10
- package/dist/esm/rendering/Drawable.js +12 -20
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/RenderBackend.d.ts +18 -0
- package/dist/esm/rendering/RenderNode.d.ts +81 -8
- package/dist/esm/rendering/RenderNode.js +121 -144
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderTarget.d.ts +13 -0
- package/dist/esm/rendering/RenderTarget.js +13 -0
- package/dist/esm/rendering/RenderTarget.js.map +1 -1
- package/dist/esm/rendering/RenderTargetPass.js +17 -0
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/RenderingContext.d.ts +87 -0
- package/dist/esm/rendering/RenderingContext.js +157 -0
- package/dist/esm/rendering/RenderingContext.js.map +1 -0
- package/dist/esm/rendering/TransformBuffer.d.ts +82 -0
- package/dist/esm/rendering/TransformBuffer.js +180 -0
- package/dist/esm/rendering/TransformBuffer.js.map +1 -0
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js +5 -12
- package/dist/esm/rendering/filters/WebGpuShaderFilter.js.map +1 -1
- package/dist/esm/rendering/geometry/Geometry.d.ts +40 -0
- package/dist/esm/rendering/geometry/Geometry.js +228 -0
- package/dist/esm/rendering/geometry/Geometry.js.map +1 -0
- package/dist/esm/rendering/geometry/GeometryAttribute.d.ts +32 -0
- package/dist/esm/rendering/geometry/QuadGeometry.d.ts +5 -0
- package/dist/esm/rendering/gradient/Gradient.d.ts +67 -0
- package/dist/esm/rendering/gradient/Gradient.js +160 -0
- package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
- package/dist/esm/rendering/gradient/LinearGradient.d.ts +18 -0
- package/dist/esm/rendering/gradient/LinearGradient.js +49 -0
- package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
- package/dist/esm/rendering/gradient/RadialGradient.d.ts +18 -0
- package/dist/esm/rendering/gradient/RadialGradient.js +44 -0
- package/dist/esm/rendering/gradient/RadialGradient.js.map +1 -0
- package/dist/esm/rendering/index.d.ts +16 -2
- package/dist/esm/rendering/material/Material.d.ts +114 -0
- package/dist/esm/rendering/material/Material.js +111 -0
- package/dist/esm/rendering/material/Material.js.map +1 -0
- package/dist/esm/rendering/material/MaterialKey.d.ts +18 -0
- package/dist/esm/rendering/material/MaterialKey.js +82 -0
- package/dist/esm/rendering/material/MaterialKey.js.map +1 -0
- package/dist/esm/rendering/material/MeshMaterial.d.ts +16 -0
- package/dist/esm/rendering/material/MeshMaterial.js +21 -0
- package/dist/esm/rendering/material/MeshMaterial.js.map +1 -0
- package/dist/esm/rendering/{mesh/MeshShader.d.ts → material/ShaderSource.d.ts} +29 -62
- package/dist/esm/rendering/{mesh/MeshShader.js → material/ShaderSource.js} +35 -62
- package/dist/esm/rendering/material/ShaderSource.js.map +1 -0
- package/dist/esm/rendering/material/SpriteMaterial.d.ts +15 -0
- package/dist/esm/rendering/material/SpriteMaterial.js +20 -0
- package/dist/esm/rendering/material/SpriteMaterial.js.map +1 -0
- package/dist/esm/rendering/mesh/Mesh.d.ts +29 -12
- package/dist/esm/rendering/mesh/Mesh.js +122 -3
- package/dist/esm/rendering/mesh/Mesh.js.map +1 -1
- package/dist/esm/rendering/pass/RenderPassCoordinator.d.ts +63 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.d.ts +48 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js +16 -0
- package/dist/esm/rendering/pass/RenderPassDescriptor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderCommand.d.ts +86 -0
- package/dist/esm/rendering/plan/RenderCommand.js +127 -0
- package/dist/esm/rendering/plan/RenderCommand.js.map +1 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js +159 -0
- package/dist/esm/rendering/plan/RenderEffectExecutor.js.map +1 -0
- package/dist/esm/rendering/plan/RenderInstruction.d.ts +51 -0
- package/dist/esm/rendering/plan/RenderInstruction.js +45 -0
- package/dist/esm/rendering/plan/RenderInstruction.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlan.d.ts +23 -0
- package/dist/esm/rendering/plan/RenderPlan.js +12 -0
- package/dist/esm/rendering/plan/RenderPlan.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.d.ts +31 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js +242 -0
- package/dist/esm/rendering/plan/RenderPlanBuilder.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.d.ts +10 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js +180 -0
- package/dist/esm/rendering/plan/RenderPlanOptimizer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.d.ts +13 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js +107 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js.map +1 -0
- package/dist/esm/rendering/plan/RenderScope.d.ts +70 -0
- package/dist/esm/rendering/plan/RenderScope.js +16 -0
- package/dist/esm/rendering/plan/RenderScope.js.map +1 -0
- package/dist/esm/rendering/plan/playRenderTree.d.ts +4 -0
- package/dist/esm/rendering/plan/playRenderTree.js +19 -0
- package/dist/esm/rendering/plan/playRenderTree.js.map +1 -0
- package/dist/esm/rendering/primitives/Graphics.d.ts +70 -5
- package/dist/esm/rendering/primitives/Graphics.js +172 -14
- package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
- package/dist/esm/rendering/sprite/Sprite.d.ts +22 -1
- package/dist/esm/rendering/sprite/Sprite.js +33 -2
- package/dist/esm/rendering/sprite/Sprite.js.map +1 -1
- package/dist/esm/rendering/sprite/spriteMaterialSources.d.ts +41 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js +149 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
- package/dist/esm/rendering/text/BitmapText.d.ts +2 -0
- package/dist/esm/rendering/text/BitmapText.js +8 -1
- package/dist/esm/rendering/text/BitmapText.js.map +1 -1
- package/dist/esm/rendering/text/BmFont.js +3 -0
- package/dist/esm/rendering/text/BmFont.js.map +1 -1
- package/dist/esm/rendering/text/GlyphSdf.d.ts +14 -0
- package/dist/esm/rendering/text/GlyphSdf.js +41 -11
- package/dist/esm/rendering/text/GlyphSdf.js.map +1 -1
- package/dist/esm/rendering/text/TextStyle.d.ts +6 -1
- package/dist/esm/rendering/text/TextStyle.js +1 -1
- package/dist/esm/rendering/text/TextStyle.js.map +1 -1
- package/dist/esm/rendering/texture/DataTexture.d.ts +5 -0
- package/dist/esm/rendering/texture/DataTexture.js +7 -0
- package/dist/esm/rendering/texture/DataTexture.js.map +1 -1
- package/dist/esm/rendering/texture/RenderTexture.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +3 -7
- package/dist/esm/rendering/video/Video.js +3 -8
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2Backend.d.ts +62 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +352 -21
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.d.ts +22 -2
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js +404 -112
- package/dist/esm/rendering/webgl2/WebGl2MeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +8 -0
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +8 -0
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.d.ts +57 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js +79 -0
- package/dist/esm/rendering/webgl2/WebGl2PassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +14 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +257 -78
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.d.ts +34 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js +169 -0
- package/dist/esm/rendering/webgl2/WebGl2StencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.d.ts +7 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js +11 -0
- package/dist/esm/rendering/webgl2/WebGl2TextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/glsl/mesh.frag.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/mesh.vert.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/stencil-clip.vert.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/text-color.frag.js +1 -1
- package/dist/esm/rendering/webgpu/WebGpuBackend.d.ts +63 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +180 -19
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +22 -17
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.d.ts +24 -0
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js +524 -98
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +7 -0
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +24 -22
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.d.ts +141 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js +270 -0
- package/dist/esm/rendering/webgpu/WebGpuPassCoordinator.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +25 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +430 -76
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.d.ts +57 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js +257 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilClipper.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.d.ts +14 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js +36 -0
- package/dist/esm/rendering/webgpu/WebGpuStencilState.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.d.ts +7 -0
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js +30 -19
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +48 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +103 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js.map +1 -0
- package/dist/esm/resources/JsonStore.d.ts +18 -0
- package/dist/esm/resources/JsonStore.js +62 -0
- package/dist/esm/resources/JsonStore.js.map +1 -0
- package/dist/esm/resources/Loader.js +1 -1
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/esm/resources/factories/ImageFactory.d.ts +14 -8
- package/dist/esm/resources/factories/ImageFactory.js +13 -6
- package/dist/esm/resources/factories/ImageFactory.js.map +1 -1
- package/dist/esm/resources/factories/TextureFactory.d.ts +4 -4
- package/dist/esm/resources/factories/TextureFactory.js +8 -4
- package/dist/esm/resources/factories/TextureFactory.js.map +1 -1
- package/dist/esm/resources/index.d.ts +1 -0
- package/dist/exo.esm.js +6326 -2350
- package/dist/exo.esm.js.map +1 -1
- package/package.json +34 -24
- package/dist/esm/particles/distributions/Gradient.js.map +0 -1
- package/dist/esm/rendering/mesh/MeshShader.js.map +0 -1
- package/dist/esm/vendor/webgl-debug.js +0 -1160
- 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 @@
|
|
|
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
|
+
}
|