@flighthq/render 0.3.0-next.906.07cea63 → 0.3.1-next.1041.35b950c
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/dist/contract.d.ts +6 -1
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +6 -1
- package/dist/contract.js.map +1 -1
- package/dist/enableColorAdjustmentGuards.d.ts.map +1 -1
- package/dist/enableColorAdjustmentGuards.js +19 -10
- package/dist/enableColorAdjustmentGuards.js.map +1 -1
- package/dist/enableColorAdjustments.d.ts +4 -0
- package/dist/enableColorAdjustments.d.ts.map +1 -0
- package/dist/enableColorAdjustments.js +119 -0
- package/dist/enableColorAdjustments.js.map +1 -0
- package/dist/enableSceneRenderGuards.d.ts +22 -0
- package/dist/enableSceneRenderGuards.d.ts.map +1 -0
- package/dist/enableSceneRenderGuards.js +36 -0
- package/dist/enableSceneRenderGuards.js.map +1 -0
- package/dist/explainScene2DCoverage.d.ts +4 -0
- package/dist/explainScene2DCoverage.d.ts.map +1 -0
- package/dist/explainScene2DCoverage.js +95 -0
- package/dist/explainScene2DCoverage.js.map +1 -0
- package/dist/explainScene2DRender.d.ts.map +1 -1
- package/dist/explainScene2DRender.js +2 -1
- package/dist/explainScene2DRender.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/renderProxy.d.ts.map +1 -1
- package/dist/renderProxy.js +44 -11
- package/dist/renderProxy.js.map +1 -1
- package/dist/renderRegistryGuards.d.ts +5 -0
- package/dist/renderRegistryGuards.d.ts.map +1 -0
- package/dist/renderRegistryGuards.js +89 -0
- package/dist/renderRegistryGuards.js.map +1 -0
- package/dist/renderRegistrySignals.d.ts +3 -0
- package/dist/renderRegistrySignals.d.ts.map +1 -0
- package/dist/renderRegistrySignals.js +19 -0
- package/dist/renderRegistrySignals.js.map +1 -0
- package/dist/renderState.d.ts +3 -1
- package/dist/renderState.d.ts.map +1 -1
- package/dist/renderState.js +32 -3
- package/dist/renderState.js.map +1 -1
- package/dist/renderTarget.d.ts +4 -2
- package/dist/renderTarget.d.ts.map +1 -1
- package/dist/renderTarget.js +52 -2
- package/dist/renderTarget.js.map +1 -1
- package/dist/renderTransform2d.d.ts.map +1 -1
- package/dist/renderTransform2d.js +4 -1
- package/dist/renderTransform2d.js.map +1 -1
- package/dist/renderer.d.ts +1 -0
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +43 -5
- package/dist/renderer.js.map +1 -1
- package/dist/scene2dWorkingColorSpace.d.ts +3 -0
- package/dist/scene2dWorkingColorSpace.d.ts.map +1 -0
- package/dist/scene2dWorkingColorSpace.js +19 -0
- package/dist/scene2dWorkingColorSpace.js.map +1 -0
- package/dist/sceneRender.d.ts +6 -2
- package/dist/sceneRender.d.ts.map +1 -1
- package/dist/sceneRender.js +47 -13
- package/dist/sceneRender.js.map +1 -1
- package/package.json +16 -12
- package/src/enableColorAdjustmentGuards.test.ts +23 -5
- package/src/enableColorAdjustments.test.ts +250 -0
- package/src/enableSceneRenderGuards.test.ts +96 -0
- package/src/explainScene2DCoverage.test.ts +169 -0
- package/src/renderCache.test.ts +2 -1
- package/src/renderProxy.test.ts +156 -12
- package/src/renderQueue.test.ts +1 -1
- package/src/renderRegistryGuards.test.ts +94 -0
- package/src/renderRegistrySignals.test.ts +15 -0
- package/src/renderState.test.ts +60 -6
- package/src/renderTarget.test.ts +113 -5
- package/src/renderTransform2d.test.ts +15 -1
- package/src/renderViewport.test.ts +1 -1
- package/src/renderer.test.ts +174 -12
- package/src/scene2dWorkingColorSpace.test.ts +11 -0
- package/src/sceneRender.test.ts +75 -2
- package/dist/renderColorScaleBias.d.ts +0 -3
- package/dist/renderColorScaleBias.d.ts.map +0 -1
- package/dist/renderColorScaleBias.js +0 -21
- package/dist/renderColorScaleBias.js.map +0 -1
- package/src/renderColorScaleBias.test.ts +0 -53
package/dist/renderProxy.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { createEntity } from '@flighthq/entity/contract';
|
|
2
2
|
import { createMatrix } from '@flighthq/geometry/contract';
|
|
3
|
-
import { getNodeAppearanceRevision, getNodeLocalContentRevision, getNodeLocalTransformRevision, getNodeParent, getNodeRuntime, } from '@flighthq/node/contract';
|
|
4
|
-
import {
|
|
3
|
+
import { getNodeAppearanceRevision, getNodeChildrenRevision, getNodeLocalContentRevision, getNodeLocalTransformRevision, getNodeParentReferenceRevision, getNodeParent, getNodeRuntime, } from '@flighthq/node/contract';
|
|
4
|
+
import { getRegistryTableEntry } from '@flighthq/registry/contract';
|
|
5
|
+
import { BlendMode, RegistryEntryState, RenderRegistry } from '@flighthq/types/contract';
|
|
5
6
|
import { updateRenderProxyAppearance } from './renderAppearance';
|
|
6
|
-
import { updateRenderProxyColorScaleBias } from './renderColorScaleBias';
|
|
7
7
|
import { updateRenderProxyMaterial } from './renderMaterial';
|
|
8
8
|
import { getRenderStateRuntime } from './renderState';
|
|
9
9
|
import { updateRenderProxy2DTransform } from './renderTransform2d';
|
|
10
10
|
export function createRenderProxy(state, source) {
|
|
11
11
|
const runtime = getRenderStateRuntime(state);
|
|
12
|
-
const renderer =
|
|
12
|
+
const renderer = resolveRenderProxyRenderer(state, source.kind);
|
|
13
13
|
return createEntity({
|
|
14
14
|
source: source,
|
|
15
15
|
kind: source.kind,
|
|
@@ -22,8 +22,10 @@ export function createRenderProxy(state, source) {
|
|
|
22
22
|
material: null,
|
|
23
23
|
materialData: null,
|
|
24
24
|
lastAppearanceId: -1,
|
|
25
|
+
lastChildrenId: -1,
|
|
25
26
|
lastLocalContentId: -1,
|
|
26
27
|
lastLocalTransformId: -1,
|
|
28
|
+
lastParentReferenceId: -1,
|
|
27
29
|
name: null,
|
|
28
30
|
renderer: renderer,
|
|
29
31
|
rendererData: renderer?.createData(state, source) ?? null,
|
|
@@ -48,13 +50,15 @@ export function createRenderProxy2D(state, source) {
|
|
|
48
50
|
// renderer's destroyData to free the non-GC GPU resources it owns. Call when a node is removed from
|
|
49
51
|
// rendering for good — otherwise those GPU textures/framebuffers linger until the source is GC'd.
|
|
50
52
|
export function disposeRenderProxy(state, source) {
|
|
51
|
-
const
|
|
53
|
+
const runtime = getRenderStateRuntime(state);
|
|
54
|
+
const renderProxyMap = runtime.renderProxyMap;
|
|
52
55
|
const node = renderProxyMap.get(source);
|
|
53
56
|
if (node === undefined)
|
|
54
57
|
return;
|
|
55
58
|
if (node.rendererData !== null)
|
|
56
59
|
node.renderer?.destroyData?.(state, node.rendererData);
|
|
57
60
|
renderProxyMap.delete(source);
|
|
61
|
+
runtime.renderProxySources.delete(source);
|
|
58
62
|
}
|
|
59
63
|
// Teardown counterpart to prepareScene2DRender: disposes the render of `root` and every descendant —
|
|
60
64
|
// the render proxies that prepareScene2DRender created. Each disposeRenderProxy cascades to the
|
|
@@ -73,6 +77,7 @@ export function getOrCreateRenderProxy2D(state, source) {
|
|
|
73
77
|
if (!node) {
|
|
74
78
|
node = createRenderProxy2D(state, source);
|
|
75
79
|
renderProxyMap.set(source, node);
|
|
80
|
+
runtime.renderProxySources.add(source);
|
|
76
81
|
}
|
|
77
82
|
if (node.rendererMapId !== runtime.rendererMapId) {
|
|
78
83
|
updateRenderProxyRenderer(state, node);
|
|
@@ -89,11 +94,14 @@ export function isRenderProxyDirty(state, source, data, parentData) {
|
|
|
89
94
|
const currentFrameId = getRenderStateRuntime(state).currentFrameId;
|
|
90
95
|
const parentDirty = parentData !== undefined &&
|
|
91
96
|
(parentData.transformFrameId === currentFrameId || parentData.appearanceFrameId === currentFrameId);
|
|
97
|
+
const rendererDirty = data.renderer?.isDirty?.(state, source, data.rendererData) ?? false;
|
|
98
|
+
const hierarchyDirty = data.lastChildrenId !== getNodeChildrenRevision(source) ||
|
|
99
|
+
data.lastParentReferenceId !== getNodeParentReferenceRevision(source);
|
|
92
100
|
const localDirty = state.sceneGraphSyncPolicy === 'refreshDerivedState' ||
|
|
93
101
|
data.lastLocalTransformId !== getNodeLocalTransformRevision(source) ||
|
|
94
102
|
data.lastAppearanceId !== getNodeAppearanceRevision(source) ||
|
|
95
103
|
data.lastLocalContentId !== getNodeLocalContentRevision(source);
|
|
96
|
-
return parentDirty || localDirty;
|
|
104
|
+
return parentDirty || rendererDirty || hierarchyDirty || localDirty;
|
|
97
105
|
}
|
|
98
106
|
export function isRenderProxyVisible(data) {
|
|
99
107
|
return data.visible && data.alpha > 0 && !(data.transform2D.a === 0 && data.transform2D.d === 0);
|
|
@@ -117,18 +125,31 @@ export function updateNodeClip(_state, source, data, parentData) {
|
|
|
117
125
|
// The one per-node update step for the 2D walk: appearance, transform, material, color adjustment,
|
|
118
126
|
// then the clip nesting depth. Sprites and display objects share this single visitor.
|
|
119
127
|
export function updateRenderProxy2D(state, source, data, parentData) {
|
|
128
|
+
const parentReferenceId = getNodeParentReferenceRevision(source);
|
|
129
|
+
if (data.lastParentReferenceId !== parentReferenceId) {
|
|
130
|
+
// A prepared node may be detached while its eventual parent changes, then reattached to the same
|
|
131
|
+
// parent identity. Force both inherited axes through their existing update paths; comparing only
|
|
132
|
+
// the current parent or its "updated this frame" marker would leave that warm proxy stale.
|
|
133
|
+
data.lastAppearanceId = -1;
|
|
134
|
+
data.lastLocalTransformId = -1;
|
|
135
|
+
}
|
|
120
136
|
updateRenderProxyAppearance(state, data, parentData);
|
|
121
137
|
updateRenderProxy2DTransform(state, data, parentData);
|
|
122
138
|
updateRenderProxyMaterial(state, data, parentData);
|
|
123
|
-
|
|
139
|
+
const colorAdjustmentResolver = getRenderStateRuntime(state).registries.colorAdjustments?.entry;
|
|
140
|
+
if (colorAdjustmentResolver?.state === RegistryEntryState.Bound) {
|
|
141
|
+
colorAdjustmentResolver.value(state, data, parentData);
|
|
142
|
+
}
|
|
124
143
|
updateNodeClip(state, source, data, parentData);
|
|
125
|
-
// Record the
|
|
144
|
+
// Record the local and structural revisions this adaptation consumed.
|
|
145
|
+
data.lastChildrenId = getNodeChildrenRevision(source);
|
|
126
146
|
data.lastLocalContentId = getNodeLocalContentRevision(source);
|
|
147
|
+
data.lastParentReferenceId = parentReferenceId;
|
|
127
148
|
getRenderStateRuntime(state).renderAdaptHook?.(state, source, data);
|
|
128
149
|
}
|
|
129
150
|
export function updateRenderProxyRenderer(state, node) {
|
|
130
151
|
const runtime = getRenderStateRuntime(state);
|
|
131
|
-
const renderer =
|
|
152
|
+
const renderer = resolveRenderProxyRenderer(state, node.kind);
|
|
132
153
|
if (node.renderer !== renderer || node.rendererDataSource !== node.source) {
|
|
133
154
|
// Free the outgoing renderer's GPU resources before replacing the data it owned.
|
|
134
155
|
if (node.rendererData !== null)
|
|
@@ -139,18 +160,30 @@ export function updateRenderProxyRenderer(state, node) {
|
|
|
139
160
|
}
|
|
140
161
|
node.rendererMapId = runtime.rendererMapId;
|
|
141
162
|
}
|
|
163
|
+
function resolveRenderProxyRenderer(state, kind) {
|
|
164
|
+
const runtime = getRenderStateRuntime(state);
|
|
165
|
+
const entry = runtime.registries.renderers.entries.get(kind);
|
|
166
|
+
if (entry?.state !== RegistryEntryState.Bound) {
|
|
167
|
+
runtime.registryMiss?.(RenderRegistry.NodeRenderer, kind);
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return entry.value;
|
|
171
|
+
}
|
|
142
172
|
// One generic, dirty-checked pre-order walk over the 2D node graph. `visit` composes the trait
|
|
143
173
|
// update* steps. Sprites and display objects share this single traversal and a single render-node
|
|
144
174
|
// type — what differs is the traits they carry, not the path. Clip is not handled here: it is a
|
|
145
175
|
// trait update step in the visitor (updateNodeClip), realized at draw time by the backend clip hooks.
|
|
146
176
|
export function walkNode(state, root, visit) {
|
|
147
177
|
const runtime = getRenderStateRuntime(state);
|
|
178
|
+
const rootGuardTable = runtime.registries.renderRootGuard;
|
|
179
|
+
if (rootGuardTable)
|
|
180
|
+
getRegistryTableEntry(rootGuardTable, rootGuardTable.registry)?.(state, root);
|
|
148
181
|
++runtime.currentFrameId;
|
|
149
182
|
const tempStack = runtime.tempStack;
|
|
150
183
|
let stackLength = 1;
|
|
151
184
|
tempStack[0] = root;
|
|
152
185
|
let parentData = undefined;
|
|
153
|
-
let lastParent
|
|
186
|
+
let lastParent;
|
|
154
187
|
let treeDirty = false;
|
|
155
188
|
while (stackLength > 0) {
|
|
156
189
|
const current = tempStack[--stackLength];
|
|
@@ -160,7 +193,7 @@ export function walkNode(state, root, visit) {
|
|
|
160
193
|
const parent = getNodeParent(current);
|
|
161
194
|
if (parent === null) {
|
|
162
195
|
parentData = undefined;
|
|
163
|
-
lastParent =
|
|
196
|
+
lastParent = undefined;
|
|
164
197
|
}
|
|
165
198
|
else if (parent !== lastParent) {
|
|
166
199
|
parentData = getOrCreateRenderProxy2D(state, parent);
|
package/dist/renderProxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderProxy.js","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,EAC7B,aAAa,EACb,cAAc,GACf,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"renderProxy.js","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,EAC3B,6BAA6B,EAC7B,8BAA8B,EAC9B,aAAa,EACb,cAAc,GACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAYpE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEzF,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAInE,MAAM,UAAU,iBAAiB,CAAC,KAAkB,EAAE,MAAkB;IACtE,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,YAAY,CAAC;QAClB,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,CAAC;QACR,iBAAiB,EAAE,CAAC,CAAC;QACrB,SAAS,EAAE,SAAS,CAAC,MAAM;QAC3B,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,CAAC,CAAC;QACpB,cAAc,EAAE,CAAC,CAAC;QAClB,kBAAkB,EAAE,CAAC,CAAC;QACtB,oBAAoB,EAAE,CAAC,CAAC;QACxB,qBAAqB,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,QAAQ;QAClB,YAAY,EAAE,QAAQ,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI;QACzD,kBAAkB,EAAE,MAAM;QAC1B,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,gBAAgB,EAAE,CAAC,CAAC;QACpB,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;AACL,CAAC;AAED,+FAA+F;AAC/F,kGAAkG;AAClG,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CACjC,KAAkB,EAClB,MAAwD;IAExD,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAkB,CAAC;IAC/D,IAAI,CAAC,WAAW,GAAG,YAAY,EAAE,CAAC;IAClC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6FAA6F;AAC7F,2FAA2F;AAC3F,oGAAoG;AACpG,kGAAkG;AAClG,MAAM,UAAU,kBAAkB,CAAC,KAAkB,EAAE,MAAkB;IACvE,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;QAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACvF,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,qGAAqG;AACrG,gGAAgG;AAChG,kGAAkG;AAClG,oGAAoG;AACpG,2FAA2F;AAC3F,wGAAwG;AACxG,oDAAoD;AACpD,MAAM,UAAU,oBAAoB,CAAC,KAAkB,EAAE,IAAgB;IACvE,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAkB,EAAE,MAAkB;IAC7E,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC9C,IAAI,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAA8B,CAAC;IACnE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAA0D,CAAC,CAAC;QAC9F,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC;QACjD,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkB,EAAE,MAAkB;IACrE,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAA8B,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAkB,EAAE,EAAa;IACtE,qBAAqB,CAAC,KAAK,CAAC,CAAC,eAAe,GAAG,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAkB,EAClB,MAAkB,EAClB,IAAiB,EACjB,UAAwB;IAExB,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;IACnE,MAAM,WAAW,GACf,UAAU,KAAK,SAAS;QACxB,CAAC,UAAU,CAAC,gBAAgB,KAAK,cAAc,IAAI,UAAU,CAAC,iBAAiB,KAAK,cAAc,CAAC,CAAC;IACtG,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;IAC1F,MAAM,cAAc,GAClB,IAAI,CAAC,cAAc,KAAK,uBAAuB,CAAC,MAAc,CAAC;QAC/D,IAAI,CAAC,qBAAqB,KAAK,8BAA8B,CAAC,MAAc,CAAC,CAAC;IAChF,MAAM,UAAU,GACd,KAAK,CAAC,oBAAoB,KAAK,qBAAqB;QACpD,IAAI,CAAC,oBAAoB,KAAK,6BAA6B,CAAC,MAAc,CAAC;QAC3E,IAAI,CAAC,gBAAgB,KAAK,yBAAyB,CAAC,MAAc,CAAC;QACnE,IAAI,CAAC,kBAAkB,KAAK,2BAA2B,CAAC,MAAc,CAAC,CAAC;IAC1E,OAAO,WAAW,IAAI,aAAa,IAAI,cAAc,IAAI,UAAU,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAmB;IACtD,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,0FAA0F;AAC1F,qGAAqG;AACrG,gGAAgG;AAChG,uGAAuG;AACvG,2CAA2C;AAC3C,MAAM,UAAU,oBAAoB,CAAC,KAAkB,EAAE,MAAkB;IACzE,OAAO,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;AACtD,CAAC;AAED,uGAAuG;AACvG,oGAAoG;AACpG,sGAAsG;AACtG,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAC5B,MAAmB,EACnB,MAAkB,EAClB,IAAmB,EACnB,UAAqC;IAErC,MAAM,WAAW,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,SAAS,GAAG,WAAW,GAAG,CAAE,MAAiB,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,mGAAmG;AACnG,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CACjC,KAAkB,EAClB,MAAkB,EAClB,IAAmB,EACnB,UAAqC;IAErC,MAAM,iBAAiB,GAAG,8BAA8B,CAAC,MAAc,CAAC,CAAC;IACzE,IAAI,IAAI,CAAC,qBAAqB,KAAK,iBAAiB,EAAE,CAAC;QACrD,iGAAiG;QACjG,iGAAiG;QACjG,2FAA2F;QAC3F,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,2BAA2B,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACrD,4BAA4B,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACtD,yBAAyB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,gBAAgB,EAAE,KAAK,CAAC;IAChG,IAAI,uBAAuB,EAAE,KAAK,KAAK,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAChE,uBAAuB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,CAAC;IACD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAChD,sEAAsE;IACtE,IAAI,CAAC,cAAc,GAAG,uBAAuB,CAAC,MAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,kBAAkB,GAAG,2BAA2B,CAAC,MAAc,CAAC,CAAC;IACtE,IAAI,CAAC,qBAAqB,GAAG,iBAAiB,CAAC;IAC/C,qBAAqB,CAAC,KAAK,CAAC,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAkB,EAAE,IAAiB;IAC7E,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1E,iFAAiF;QACjF,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;YAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,QAAQ,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QACrE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;AAC7C,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAkB,EAAE,IAAY;IAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,KAAK,EAAE,KAAK,KAAK,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAC9C,OAAO,CAAC,YAAY,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,+FAA+F;AAC/F,kGAAkG;AAClG,gGAAgG;AAChG,sGAAsG;AACtG,MAAM,UAAU,QAAQ,CAAC,KAAkB,EAAE,IAAgB,EAAE,KAAyB;IACtF,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;IAC1D,IAAI,cAAc;QAAE,qBAAqB,CAAC,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClG,EAAE,OAAO,CAAC,cAAc,CAAC;IAEzB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEpB,IAAI,UAAU,GAA8B,SAAS,CAAC;IACtD,IAAI,UAA4B,CAAC;IACjC,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,OAAO,WAAW,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,WAAW,CAAe,CAAC;QACvD,IAAI,CAAE,OAAgB,CAAC,OAAO;YAAE,SAAS;QAEzC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,aAAa,CAAC,OAAe,CAAC,CAAC;YAC9C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,UAAU,GAAG,SAAS,CAAC;gBACvB,UAAU,GAAG,SAAS,CAAC;YACzB,CAAC;iBAAM,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,UAAU,GAAG,wBAAwB,CAAC,KAAK,EAAE,MAA+B,CAAC,CAAC;gBAC9E,UAAU,GAAG,MAAM,CAAC;YACtB,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEtD,IAAI,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACxC,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAAE,SAAS;QAE1C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAe,CAAC,CAAC,QAAQ,CAAC;YAC1D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAA0B,CAAC;gBAClE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+FAA+F;AAC/F,gGAAgG;AAChG,8FAA8F;AAC9F,wGAAwG;AACxG,SAAS,iBAAiB,CACxB,KAAkB,EAClB,IAAgB,EAChB,KAAqD;IAErD,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IACzD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAEpB,OAAO,WAAW,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,WAAW,CAAe,CAAC;QACvD,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAe,CAAC,CAAC,QAAQ,CAAC;QAC1D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAA0B,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RenderRegistryMissExplanation, RenderState } from '@flighthq/types/contract';
|
|
2
|
+
export declare function areRenderRegistryGuardsEnabled(state: RenderState): boolean;
|
|
3
|
+
export declare function enableRenderRegistryGuards(state: RenderState): void;
|
|
4
|
+
export declare function explainRenderRegistryMisses(state: RenderState): RenderRegistryMissExplanation;
|
|
5
|
+
//# sourceMappingURL=renderRegistryGuards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderRegistryGuards.d.ts","sourceRoot":"","sources":["../src/renderRegistryGuards.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA4B,6BAA6B,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKrH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE1E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAQnE;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,GAAG,6BAA6B,CAM7F"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { logOnce } from '@flighthq/log/contract';
|
|
2
|
+
import { connectSignal } from '@flighthq/signals/contract';
|
|
3
|
+
import { LogLevel, RenderRegistry } from '@flighthq/types/contract';
|
|
4
|
+
import { enableRenderRegistrySignals } from './renderRegistrySignals';
|
|
5
|
+
export function areRenderRegistryGuardsEnabled(state) {
|
|
6
|
+
return _stateIds.has(state);
|
|
7
|
+
}
|
|
8
|
+
export function enableRenderRegistryGuards(state) {
|
|
9
|
+
if (_stateIds.has(state))
|
|
10
|
+
return;
|
|
11
|
+
const stateId = ++_nextStateId;
|
|
12
|
+
_stateIds.set(state, stateId);
|
|
13
|
+
_stateMisses.set(state, []);
|
|
14
|
+
connectSignal(enableRenderRegistrySignals(state).onRegistryMiss, (registry, kind) => {
|
|
15
|
+
recordRenderRegistryMiss(state, stateId, registry, kind);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function explainRenderRegistryMisses(state) {
|
|
19
|
+
const misses = _stateMisses.get(state) ?? [];
|
|
20
|
+
return {
|
|
21
|
+
misses: misses.map((miss) => ({ kind: miss.kind, registry: miss.registry })),
|
|
22
|
+
status: misses.length === 0 ? 'complete' : 'misses-recorded',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function getRenderRegistryMissMessage(state, registry) {
|
|
26
|
+
switch (registry) {
|
|
27
|
+
// GL composites through an explicit per-mode realization; Canvas and DOM express blend modes
|
|
28
|
+
// natively and never report this.
|
|
29
|
+
case RenderRegistry.BlendRealization:
|
|
30
|
+
return 'a blend mode this scene uses has no registered GL realization, so the node composites as Normal instead — call registerGlBlendMode(state, blendMode, realization)';
|
|
31
|
+
case RenderRegistry.EffectPaddingResolver:
|
|
32
|
+
return 'computeRenderEffectPadding: effect kind has no registered padding resolver — call registerRenderEffectPaddingResolver(state, kind, resolver)';
|
|
33
|
+
// Reported by the resource layer, not the frame path: a material kind with no lister has its
|
|
34
|
+
// texture slots invisible to anything that walks materials. Discovery no longer depends on this
|
|
35
|
+
// (it reads the resource back-edge). On an all-unlisted mesh, reveal-on-resolve leaves the starting
|
|
36
|
+
// alpha unchanged. On a mixed mesh, it can reveal after the listed textures settle while an unlisted
|
|
37
|
+
// texture is still pending.
|
|
38
|
+
case RenderRegistry.MaterialTextureLister:
|
|
39
|
+
return "a material kind in this scene has no registered texture lister, so an all-unlisted mesh gets no fade, while a mixed mesh can reveal before that material's textures settle and show a later texture pop-in — call registerScene3DMaterialTextures(registry, kind, lister), or the named door for that family";
|
|
40
|
+
// Reported only by the GPU backends, where an unresolved material means the node does not draw at
|
|
41
|
+
// all. The Canvas renderer treats a missing material renderer as "draw normally", so the same
|
|
42
|
+
// absence there is the ordinary case rather than a defect.
|
|
43
|
+
case RenderRegistry.MaterialRenderer:
|
|
44
|
+
if ('device' in state)
|
|
45
|
+
return 'resolveWgpuMaterialRenderer: material kind has no registered renderer, so nodes using it do not draw — call registerWgpuMaterialRenderer(state, kind, renderer)';
|
|
46
|
+
return 'resolveGlMaterialRenderer: material kind has no registered renderer, so nodes using it do not draw — call registerGlMaterialRenderer(state, kind, renderer)';
|
|
47
|
+
// Reported by the proactive coverage checks (explainGlScene3DCoverage) rather than by a draw-time
|
|
48
|
+
// miss: the shaded compiler resolves a whole stack at once, so a missing snippet surfaces as a
|
|
49
|
+
// material that will not compile, not as one lookup returning null.
|
|
50
|
+
case RenderRegistry.ModifierSnippet:
|
|
51
|
+
if ('device' in state)
|
|
52
|
+
return 'a modifier on this material has no registered shader snippet — call registerWgpuModifierSnippet(state, snippet), or registerBuiltInWgpuModifierSnippets(state)';
|
|
53
|
+
return 'a modifier on this material has no registered shader snippet — call registerGlModifierSnippet(state, snippet), or registerBuiltInGlModifierSnippets(state)';
|
|
54
|
+
case RenderRegistry.NodeRenderer:
|
|
55
|
+
return 'createRenderProxy: node kind has no registered renderer — call registerRenderer(state, kind, renderer)';
|
|
56
|
+
case RenderRegistry.ShapeCommandHandler:
|
|
57
|
+
return 'renderCanvasShapeCommands: shape command key has no registered handler on this state — call registerCanvasShapeCommand(state, command)';
|
|
58
|
+
// The kind reported is the node kind that went undrawn, since nothing here is keyed by anything else.
|
|
59
|
+
case RenderRegistry.ShapeRasterizer:
|
|
60
|
+
if ('device' in state)
|
|
61
|
+
return 'drawWgpuShape: a fill this node uses has no tessellated form and no rasterizer is registered, so it does not draw — call registerWgpuShapeRasterizer(state, createCanvasShapeRasterizer(resolvers))';
|
|
62
|
+
if ('element' in state)
|
|
63
|
+
return 'drawDomShape: a fill this node uses has no tessellated form and no rasterizer is registered, so it does not draw — call registerDomShapeRasterizer(state, createCanvasShapeRasterizer(resolvers))';
|
|
64
|
+
return 'drawGlShape: a fill this node uses has no tessellated form and no rasterizer is registered, so it does not draw — call registerGlShapeRasterizer(state, createCanvasShapeRasterizer(resolvers))';
|
|
65
|
+
case RenderRegistry.TextureResolver:
|
|
66
|
+
if ('gl' in state)
|
|
67
|
+
return 'resolveGlTexture: texture source kind has no registered resolver — call registerGlTextureResolver(state, sourceKind, resolver), or copyGlRenderStateRegistrations(offscreenState, screenState) after a late screen registration';
|
|
68
|
+
if ('device' in state)
|
|
69
|
+
return 'resolveWgpuTexture: texture source kind has no registered resolver — call registerWgpuTextureResolver(state, sourceKind, resolver)';
|
|
70
|
+
if ('element' in state)
|
|
71
|
+
return 'resolveDomTexture: texture source kind has no registered resolver — call registerDomTextureResolver(state, sourceKind, resolver)';
|
|
72
|
+
return 'resolveCanvasTexture: texture source kind has no registered resolver — call registerCanvasTextureResolver(resolvers, sourceKind, resolver) on the set the caller resolves through';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function recordRenderRegistryMiss(state, stateId, registry, kind) {
|
|
76
|
+
const misses = _stateMisses.get(state);
|
|
77
|
+
if (misses === undefined || misses.some((miss) => miss.registry === registry && miss.kind === kind))
|
|
78
|
+
return;
|
|
79
|
+
misses.push({ kind, registry });
|
|
80
|
+
logOnce(`render:registry-miss:${stateId}:${registry}:${kind}`, LogLevel.Warn, {
|
|
81
|
+
kind,
|
|
82
|
+
message: getRenderRegistryMissMessage(state, registry),
|
|
83
|
+
registry,
|
|
84
|
+
}, 'render');
|
|
85
|
+
}
|
|
86
|
+
const _stateIds = new WeakMap();
|
|
87
|
+
const _stateMisses = new WeakMap();
|
|
88
|
+
let _nextStateId = 0;
|
|
89
|
+
//# sourceMappingURL=renderRegistryGuards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderRegistryGuards.js","sourceRoot":"","sources":["../src/renderRegistryGuards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderRegistrySignals.d.ts","sourceRoot":"","sources":["../src/renderRegistrySignals.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAsB,MAAM,0BAA0B,CAAC;AASvG,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,GAAG,qBAAqB,CAWrF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { clearSignal, createSignal, emitSignal } from '@flighthq/signals/contract';
|
|
2
|
+
import { getRenderStateRuntime } from './renderState';
|
|
3
|
+
// Allocates the single opt-in signal seam shared by kind-keyed render registries. Core dispatch owns
|
|
4
|
+
// only a nullable callback, so release bundles that do not import this diagnostics lane carry neither
|
|
5
|
+
// signal emission nor signal teardown machinery.
|
|
6
|
+
export function enableRenderRegistrySignals(state) {
|
|
7
|
+
const runtime = getRenderStateRuntime(state);
|
|
8
|
+
if (runtime.registryMiss !== null)
|
|
9
|
+
return runtime.registryMiss.signals;
|
|
10
|
+
const signals = { onRegistryMiss: createSignal() };
|
|
11
|
+
const emitter = ((registry, kind) => emitSignal(signals.onRegistryMiss, registry, kind));
|
|
12
|
+
Object.assign(emitter, {
|
|
13
|
+
clear: () => clearSignal(signals.onRegistryMiss),
|
|
14
|
+
signals,
|
|
15
|
+
});
|
|
16
|
+
runtime.registryMiss = emitter;
|
|
17
|
+
return signals;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=renderRegistrySignals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderRegistrySignals.js","sourceRoot":"","sources":["../src/renderRegistrySignals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAGnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAItD,qGAAqG;AACrG,sGAAsG;AACtG,iDAAiD;AACjD,MAAM,UAAU,2BAA2B,CAAC,KAAkB;IAC5D,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;IACvE,MAAM,OAAO,GAA0B,EAAE,cAAc,EAAE,YAAY,EAAE,EAAE,CAAC;IAC1E,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,CAA8B,CAAC;IACtH,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QACrB,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC;QAChD,OAAO;KACR,CAAC,CAAC;IACH,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;IAC/B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/renderState.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type { RenderState, RenderStateRuntime } from '@flighthq/types/contract';
|
|
1
|
+
import type { ColorAdjustmentUnsupportedGuard, RenderState, RenderStateRuntime } from '@flighthq/types/contract';
|
|
2
2
|
export declare function createRenderState(obj?: Partial<RenderState>): RenderState;
|
|
3
3
|
export declare function createRenderStateRuntime(): RenderStateRuntime;
|
|
4
|
+
export declare function destroyRenderState(state: RenderState): void;
|
|
5
|
+
export declare function getColorAdjustmentUnsupportedGuard(state: RenderState): ColorAdjustmentUnsupportedGuard | null;
|
|
4
6
|
export declare function getRenderStateRuntime(state: RenderState): RenderStateRuntime;
|
|
5
7
|
//# sourceMappingURL=renderState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderState.d.ts","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderState.d.ts","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,+BAA+B,EAE/B,WAAW,EACX,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAGlC,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAiBzE;AAOD,wBAAgB,wBAAwB,IAAI,kBAAkB,CAe7D;AAID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAO3D;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,WAAW,GAAG,+BAA+B,GAAG,IAAI,CAG7G;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,kBAAkB,CAE5E"}
|
package/dist/renderState.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createEntity, createEntityRuntime } from '@flighthq/entity/contract';
|
|
2
|
-
import {
|
|
2
|
+
import { createKeyedTable, createSlotTable } from '@flighthq/registry/contract';
|
|
3
|
+
import { BlendMode, EntityRuntimeKey, RegistryEntryState } from '@flighthq/types/contract';
|
|
3
4
|
export function createRenderState(obj) {
|
|
4
5
|
const state = createEntity({
|
|
5
6
|
allowSmoothing: obj?.allowSmoothing ?? true,
|
|
@@ -25,19 +26,47 @@ export function createRenderState(obj) {
|
|
|
25
26
|
// intentionally mutable (not Readonly).
|
|
26
27
|
export function createRenderStateRuntime() {
|
|
27
28
|
const runtime = createEntityRuntime();
|
|
28
|
-
runtime.colorAdjustmentUnsupportedGuard = null;
|
|
29
29
|
runtime.currentFrameId = 0;
|
|
30
30
|
runtime.renderAdaptHook = null;
|
|
31
31
|
runtime.renderProxyAdapterMap = new WeakMap();
|
|
32
32
|
runtime.renderProxyMap = new WeakMap();
|
|
33
|
-
runtime.
|
|
33
|
+
runtime.renderProxySources = new Set();
|
|
34
|
+
runtime.registryMiss = null;
|
|
35
|
+
runtime.registries = {
|
|
36
|
+
renderers: createKeyedTable('NodeRenderer', 'Unregistered'),
|
|
37
|
+
strokeTessellator: createSlotTable('StrokeTessellator', 'Rasterize'),
|
|
38
|
+
};
|
|
34
39
|
runtime.rendererMapId = 0;
|
|
35
40
|
runtime.tempStack = [];
|
|
36
41
|
return runtime;
|
|
37
42
|
}
|
|
43
|
+
// Runs every live proxy's renderer teardown hook and clears the state-owned traversal bookkeeping.
|
|
44
|
+
// Backend destroy* functions call this before releasing their own state/context tiers.
|
|
45
|
+
export function destroyRenderState(state) {
|
|
46
|
+
const runtime = getRenderStateRuntime(state);
|
|
47
|
+
for (const source of [...runtime.renderProxySources])
|
|
48
|
+
disposeRenderProxyForShutdown(state, source);
|
|
49
|
+
runtime.registryMiss?.clear();
|
|
50
|
+
runtime.registryMiss = null;
|
|
51
|
+
runtime.registries.effectPaddingResolvers = undefined;
|
|
52
|
+
runtime.tempStack.length = 0;
|
|
53
|
+
}
|
|
54
|
+
export function getColorAdjustmentUnsupportedGuard(state) {
|
|
55
|
+
const entry = getRenderStateRuntime(state).registries.colorAdjustmentUnsupportedGuard?.entry;
|
|
56
|
+
return entry?.state === RegistryEntryState.Bound ? entry.value : null;
|
|
57
|
+
}
|
|
38
58
|
// Resolves the package-private machinery runtime attached to a RenderState. Mutable by design: the
|
|
39
59
|
// render path writes its fields every frame.
|
|
40
60
|
export function getRenderStateRuntime(state) {
|
|
41
61
|
return state[EntityRuntimeKey];
|
|
42
62
|
}
|
|
63
|
+
function disposeRenderProxyForShutdown(state, source) {
|
|
64
|
+
const runtime = getRenderStateRuntime(state);
|
|
65
|
+
const proxy = runtime.renderProxyMap.get(source);
|
|
66
|
+
if (proxy?.rendererData !== null && proxy?.rendererData !== undefined) {
|
|
67
|
+
proxy.renderer?.destroyData?.(state, proxy.rendererData);
|
|
68
|
+
}
|
|
69
|
+
runtime.renderProxyMap.delete(source);
|
|
70
|
+
runtime.renderProxySources.delete(source);
|
|
71
|
+
}
|
|
43
72
|
//# sourceMappingURL=renderState.js.map
|
package/dist/renderState.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderState.js","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"renderState.js","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"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"}
|
package/dist/renderTarget.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MatrixLike, Node2D, RectangleLike, RenderEffectPadding, RenderTargetAxes, RenderTargetAxisDifference, RenderTargetDescriptor, ResolvedRenderTargetDescriptor } from '@flighthq/types/contract';
|
|
2
2
|
/**
|
|
3
3
|
* Writes into outCacheTransform the transform to pass to the cache resolver so the
|
|
4
4
|
* cached image is placed back at the original scene position.
|
|
5
5
|
*/
|
|
6
6
|
export declare function computeRenderCacheTransform(outCacheTransform: MatrixLike, bounds: Readonly<RectangleLike>, contentX?: number, contentY?: number): void;
|
|
7
|
-
export declare function computeRenderTargetSize(bounds: Readonly<RectangleLike>, padding?: number
|
|
7
|
+
export declare function computeRenderTargetSize(bounds: Readonly<RectangleLike>, padding?: number | Readonly<RenderEffectPadding>, minWidth?: number, minHeight?: number): {
|
|
8
8
|
width: number;
|
|
9
9
|
height: number;
|
|
10
10
|
};
|
|
@@ -14,4 +14,6 @@ export declare function computeRenderTargetSize(bounds: Readonly<RectangleLike>,
|
|
|
14
14
|
* that the bounds origin lands at (contentX, contentY).
|
|
15
15
|
*/
|
|
16
16
|
export declare function computeScene2DRenderTargetTransform(outRenderTransform: MatrixLike, source: Node2D, bounds: Readonly<RectangleLike>, contentX?: number, contentY?: number): void;
|
|
17
|
+
export declare function explainRenderTargetAxes(requested: Readonly<RenderTargetAxes>, effective: Readonly<RenderTargetAxes>): RenderTargetAxisDifference[];
|
|
18
|
+
export declare function resolveRenderTargetDescriptor(descriptor: Readonly<RenderTargetDescriptor>): ResolvedRenderTargetDescriptor;
|
|
17
19
|
//# sourceMappingURL=renderTarget.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderTarget.d.ts","sourceRoot":"","sources":["../src/renderTarget.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"renderTarget.d.ts","sourceRoot":"","sources":["../src/renderTarget.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,MAAM,EACN,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,sBAAsB,EACtB,8BAA8B,EAC/B,MAAM,0BAA0B,CAAC;AAElC;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,iBAAiB,EAAE,UAAU,EAC7B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,QAAQ,GAAE,MAAU,EACpB,QAAQ,GAAE,MAAU,GACnB,IAAI,CAON;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,OAAO,GAAE,MAAM,GAAG,QAAQ,CAAC,mBAAmB,CAAK,EACnD,QAAQ,GAAE,MAAU,EACpB,SAAS,GAAE,MAAU,GACpB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAOnC;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,kBAAkB,EAAE,UAAU,EAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,QAAQ,GAAE,MAAU,EACpB,QAAQ,GAAE,MAAU,GACnB,IAAI,CAUN;AAID,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACrC,SAAS,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACpC,0BAA0B,EAAE,CAa9B;AAKD,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAC3C,8BAA8B,CAsBhC"}
|
package/dist/renderTarget.js
CHANGED
|
@@ -13,9 +13,11 @@ export function computeRenderCacheTransform(outCacheTransform, bounds, contentX
|
|
|
13
13
|
outCacheTransform.ty = bounds.y - contentY;
|
|
14
14
|
}
|
|
15
15
|
export function computeRenderTargetSize(bounds, padding = 0, minWidth = 1, minHeight = 1) {
|
|
16
|
+
const horizontal = typeof padding === 'number' ? padding * 2 : padding.left + padding.right;
|
|
17
|
+
const vertical = typeof padding === 'number' ? padding * 2 : padding.top + padding.bottom;
|
|
16
18
|
return {
|
|
17
|
-
width: Math.max(minWidth, Math.ceil(bounds.width) +
|
|
18
|
-
height: Math.max(minHeight, Math.ceil(bounds.height) +
|
|
19
|
+
width: Math.max(minWidth, Math.ceil(bounds.width) + horizontal),
|
|
20
|
+
height: Math.max(minHeight, Math.ceil(bounds.height) + vertical),
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
@@ -34,6 +36,54 @@ export function computeScene2DRenderTargetTransform(outRenderTransform, source,
|
|
|
34
36
|
_tempTranslation.ty = contentY - bounds.y;
|
|
35
37
|
multiplyMatrix(outRenderTransform, _tempTranslation, _tempInvLocal);
|
|
36
38
|
}
|
|
39
|
+
// Returns plain-data axis differences in a stable order. Backends retain the requested and effective
|
|
40
|
+
// shapes, then use this common comparison so every explain* surface reports substitutions uniformly.
|
|
41
|
+
export function explainRenderTargetAxes(requested, effective) {
|
|
42
|
+
const differences = [];
|
|
43
|
+
for (const axis of _renderTargetAxisOrder) {
|
|
44
|
+
const requestedValue = requested[axis];
|
|
45
|
+
const effectiveValue = effective[axis];
|
|
46
|
+
const equal = Array.isArray(requestedValue) && Array.isArray(effectiveValue)
|
|
47
|
+
? requestedValue.length === effectiveValue.length &&
|
|
48
|
+
requestedValue.every((value, index) => value === effectiveValue[index])
|
|
49
|
+
: requestedValue === effectiveValue;
|
|
50
|
+
if (!equal)
|
|
51
|
+
differences.push({ axis, effective: effectiveValue, requested: requestedValue });
|
|
52
|
+
}
|
|
53
|
+
return differences;
|
|
54
|
+
}
|
|
55
|
+
// Resolves every substrate-independent default and normalization once. Backend realizations start
|
|
56
|
+
// here and apply only device capability substitutions (for example GL MAX_SAMPLES or float-render
|
|
57
|
+
// support), so Canvas/GL/WGPU cannot independently reinterpret the descriptor's optional axes.
|
|
58
|
+
export function resolveRenderTargetDescriptor(descriptor) {
|
|
59
|
+
const width = Math.max(1, Math.ceil(descriptor.width));
|
|
60
|
+
const height = Math.max(1, Math.ceil(descriptor.height));
|
|
61
|
+
const colorAttachments = Math.max(1, Math.ceil(descriptor.colorAttachments ?? 1));
|
|
62
|
+
const defaultFormat = descriptor.format ?? 'rgba8';
|
|
63
|
+
const colorFormats = Array.from({ length: colorAttachments }, (_, index) => descriptor.colorFormats?.[index] ?? defaultFormat);
|
|
64
|
+
return {
|
|
65
|
+
width,
|
|
66
|
+
height,
|
|
67
|
+
format: colorFormats[0],
|
|
68
|
+
colorAttachments,
|
|
69
|
+
colorFormats,
|
|
70
|
+
sampleCount: Math.max(1, Math.ceil(descriptor.sampleCount ?? 1)),
|
|
71
|
+
depth: descriptor.depth ?? 'none',
|
|
72
|
+
colorSpace: descriptor.colorSpace ?? 'srgb',
|
|
73
|
+
clearColors: descriptor.clearColors ? [...descriptor.clearColors] : [],
|
|
74
|
+
clearDepth: descriptor.clearDepth ?? 1,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
37
77
|
const _tempInvLocal = createMatrix();
|
|
38
78
|
const _tempTranslation = createMatrix();
|
|
79
|
+
const _renderTargetAxisOrder = [
|
|
80
|
+
'width',
|
|
81
|
+
'height',
|
|
82
|
+
'format',
|
|
83
|
+
'colorAttachments',
|
|
84
|
+
'colorFormats',
|
|
85
|
+
'sampleCount',
|
|
86
|
+
'depth',
|
|
87
|
+
'colorSpace',
|
|
88
|
+
];
|
|
39
89
|
//# sourceMappingURL=renderTarget.js.map
|
package/dist/renderTarget.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderTarget.js","sourceRoot":"","sources":["../src/renderTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"renderTarget.js","sourceRoot":"","sources":["../src/renderTarget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderTransform2d.d.ts","sourceRoot":"","sources":["../src/renderTransform2d.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAwB,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIjG,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,aAAa,GACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"renderTransform2d.d.ts","sourceRoot":"","sources":["../src/renderTransform2d.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAwB,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIjG,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,aAAa,EACnB,UAAU,CAAC,EAAE,aAAa,GACzB,OAAO,CAgBT"}
|
|
@@ -4,7 +4,10 @@ import { getRenderStateRuntime } from './renderState';
|
|
|
4
4
|
export function updateRenderProxy2DTransform(state, data, parentData) {
|
|
5
5
|
const localTransformId = getNodeLocalTransformRevision(data.source);
|
|
6
6
|
const parentDirty = parentData !== undefined && parentData.transformFrameId === getRenderStateRuntime(state).currentFrameId;
|
|
7
|
-
|
|
7
|
+
// The refresh policy deliberately re-reads every live transform each walk. That includes the
|
|
8
|
+
// root transform supplied by the render state: offscreen captures can change their projection
|
|
9
|
+
// while the source node's local transform revision remains unchanged.
|
|
10
|
+
const localDirty = state.sceneGraphSyncPolicy === 'refreshDerivedState' || data.lastLocalTransformId !== localTransformId;
|
|
8
11
|
if (parentDirty || localDirty) {
|
|
9
12
|
recalculateRenderTransform2D(state, data, parentData);
|
|
10
13
|
data.lastLocalTransformId = localTransformId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderTransform2d.js","sourceRoot":"","sources":["../src/renderTransform2d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAG5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,UAAU,4BAA4B,CAC1C,KAAkB,EAClB,IAAmB,EACnB,UAA0B;IAE1B,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAc,CAAC,CAAC;IAC5E,MAAM,WAAW,GACf,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,gBAAgB,KAAK,qBAAqB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;IAC1G,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"renderTransform2d.js","sourceRoot":"","sources":["../src/renderTransform2d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAG5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,UAAU,4BAA4B,CAC1C,KAAkB,EAClB,IAAmB,EACnB,UAA0B;IAE1B,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAc,CAAC,CAAC;IAC5E,MAAM,WAAW,GACf,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,gBAAgB,KAAK,qBAAqB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;IAC1G,6FAA6F;IAC7F,8FAA8F;IAC9F,sEAAsE;IACtE,MAAM,UAAU,GACd,KAAK,CAAC,oBAAoB,KAAK,qBAAqB,IAAI,IAAI,CAAC,oBAAoB,KAAK,gBAAgB,CAAC;IAEzG,IAAI,WAAW,IAAI,UAAU,EAAE,CAAC;QAC9B,4BAA4B,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,oBAAoB,GAAG,gBAAgB,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAkB,EAAE,IAAmB,EAAE,UAA0B;IACvG,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAA+B,CAAC,CAAC;IAC7E,MAAM,iBAAiB,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACtG,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;QAC/B,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;AACtE,CAAC"}
|
package/dist/renderer.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Kind, Renderable, Renderer, RendererData, RenderState } from '@flighthq/types/contract';
|
|
2
2
|
export declare function copyAllRenderersFromRenderState(target: RenderState, source: RenderState): void;
|
|
3
3
|
export declare function copyRenderersFromRenderState(target: RenderState, source: RenderState): void;
|
|
4
|
+
export declare function copyRenderStateRegistrations(target: RenderState, source: RenderState): void;
|
|
4
5
|
export declare function noopRendererData(_state: RenderState, _source: Renderable): RendererData | null;
|
|
5
6
|
export declare function registerRenderer(state: RenderState, kind: Kind, renderer: Renderer): void;
|
|
6
7
|
export declare function registerRenderers(state: RenderState, entries: ReadonlyArray<readonly [Kind, Renderer]>): void;
|
package/dist/renderer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAOtG,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAG9F;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAsB3F;AAKD,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAY3F;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAE9F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAMzF;AAKD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAE7G"}
|