@codexo/exojs 0.9.0 → 0.10.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 +44 -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/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/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 +38 -0
- package/dist/esm/rendering/TransformBuffer.js +116 -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 +34 -0
- package/dist/esm/rendering/gradient/Gradient.js +114 -0
- package/dist/esm/rendering/gradient/Gradient.js.map +1 -0
- package/dist/esm/rendering/gradient/LinearGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/LinearGradient.js +26 -0
- package/dist/esm/rendering/gradient/LinearGradient.js.map +1 -0
- package/dist/esm/rendering/gradient/RadialGradient.d.ts +10 -0
- package/dist/esm/rendering/gradient/RadialGradient.js +25 -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 +67 -0
- package/dist/esm/rendering/plan/RenderCommand.js +94 -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/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 +9 -0
- package/dist/esm/rendering/plan/RenderPlanPlayer.js +56 -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/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 +36 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js +128 -0
- package/dist/esm/rendering/sprite/spriteMaterialSources.js.map +1 -0
- package/dist/esm/rendering/text/TextStyle.d.ts +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/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 +40 -0
- package/dist/esm/rendering/webgl2/WebGl2Backend.js +303 -22
- 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/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 +12 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +214 -58
- 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.js +4 -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/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/webgpu/WebGpuBackend.d.ts +50 -0
- package/dist/esm/rendering/webgpu/WebGpuBackend.js +135 -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 +488 -74
- package/dist/esm/rendering/webgpu/WebGpuMeshRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +13 -17
- 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 +16 -0
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +335 -26
- 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.js +14 -12
- package/dist/esm/rendering/webgpu/WebGpuTextRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.d.ts +16 -0
- package/dist/esm/rendering/webgpu/WebGpuTransformStorage.js +57 -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/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 +5424 -2205
- package/dist/exo.esm.js.map +1 -1
- package/package.json +30 -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,67 @@
|
|
|
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` (Phase 4+
|
|
25
|
+
* Material 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;
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
+
export { RenderEntryKind, makeMaterialKey };
|
|
94
|
+
//# 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,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
|
+
}
|
|
@@ -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
|