@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,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":"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"}
|
|
@@ -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;
|