@flighthq/render 0.1.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/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/renderAppearance.d.ts +3 -0
- package/dist/renderAppearance.d.ts.map +1 -0
- package/dist/renderAppearance.js +35 -0
- package/dist/renderAppearance.js.map +1 -0
- package/dist/renderCache.d.ts +36 -0
- package/dist/renderCache.d.ts.map +1 -0
- package/dist/renderCache.js +83 -0
- package/dist/renderCache.js.map +1 -0
- package/dist/renderColor.d.ts +3 -0
- package/dist/renderColor.d.ts.map +1 -0
- package/dist/renderColor.js +17 -0
- package/dist/renderColor.js.map +1 -0
- package/dist/renderMaterial.d.ts +3 -0
- package/dist/renderMaterial.d.ts.map +1 -0
- package/dist/renderMaterial.js +9 -0
- package/dist/renderMaterial.js.map +1 -0
- package/dist/renderProxy.d.ts +19 -0
- package/dist/renderProxy.d.ts.map +1 -0
- package/dist/renderProxy.js +203 -0
- package/dist/renderProxy.js.map +1 -0
- package/dist/renderProxyAdapter.d.ts +7 -0
- package/dist/renderProxyAdapter.d.ts.map +1 -0
- package/dist/renderProxyAdapter.js +32 -0
- package/dist/renderProxyAdapter.js.map +1 -0
- package/dist/renderQueue.d.ts +9 -0
- package/dist/renderQueue.d.ts.map +1 -0
- package/dist/renderQueue.js +97 -0
- package/dist/renderQueue.js.map +1 -0
- package/dist/renderState.d.ts +5 -0
- package/dist/renderState.d.ts.map +1 -0
- package/dist/renderState.js +42 -0
- package/dist/renderState.js.map +1 -0
- package/dist/renderTarget.d.ts +21 -0
- package/dist/renderTarget.d.ts.map +1 -0
- package/dist/renderTarget.js +39 -0
- package/dist/renderTarget.js.map +1 -0
- package/dist/renderTransform2d.d.ts +3 -0
- package/dist/renderTransform2d.d.ts.map +1 -0
- package/dist/renderTransform2d.js +26 -0
- package/dist/renderTransform2d.js.map +1 -0
- package/dist/renderViewport.d.ts +6 -0
- package/dist/renderViewport.d.ts.map +1 -0
- package/dist/renderViewport.js +57 -0
- package/dist/renderViewport.js.map +1 -0
- package/dist/renderer.d.ts +6 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +24 -0
- package/dist/renderer.js.map +1 -0
- package/dist/sceneRender.d.ts +4 -0
- package/dist/sceneRender.d.ts.map +1 -0
- package/dist/sceneRender.js +175 -0
- package/dist/sceneRender.js.map +1 -0
- package/package.json +48 -0
- package/src/renderAppearance.test.ts +109 -0
- package/src/renderCache.test.ts +151 -0
- package/src/renderColor.test.ts +10 -0
- package/src/renderMaterial.test.ts +30 -0
- package/src/renderProxy.test.ts +531 -0
- package/src/renderProxyAdapter.test.ts +101 -0
- package/src/renderQueue.test.ts +210 -0
- package/src/renderState.test.ts +93 -0
- package/src/renderTarget.test.ts +84 -0
- package/src/renderTransform2d.test.ts +59 -0
- package/src/renderViewport.test.ts +187 -0
- package/src/renderer.test.ts +128 -0
- package/src/sceneRender.test.ts +207 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from './renderAppearance';
|
|
2
|
+
export * from './renderCache';
|
|
3
|
+
export * from './renderColor';
|
|
4
|
+
export * from './renderer';
|
|
5
|
+
export * from './renderMaterial';
|
|
6
|
+
export * from './renderProxy';
|
|
7
|
+
export * from './renderProxyAdapter';
|
|
8
|
+
export * from './renderQueue';
|
|
9
|
+
export * from './renderState';
|
|
10
|
+
export * from './renderTarget';
|
|
11
|
+
export * from './renderTransform2d';
|
|
12
|
+
export * from './renderViewport';
|
|
13
|
+
export * from './sceneRender';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from './renderAppearance';
|
|
2
|
+
export * from './renderCache';
|
|
3
|
+
export * from './renderColor';
|
|
4
|
+
export * from './renderer';
|
|
5
|
+
export * from './renderMaterial';
|
|
6
|
+
export * from './renderProxy';
|
|
7
|
+
export * from './renderProxyAdapter';
|
|
8
|
+
export * from './renderQueue';
|
|
9
|
+
export * from './renderState';
|
|
10
|
+
export * from './renderTarget';
|
|
11
|
+
export * from './renderTransform2d';
|
|
12
|
+
export * from './renderViewport';
|
|
13
|
+
export * from './sceneRender';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderAppearance.d.ts","sourceRoot":"","sources":["../src/renderAppearance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAuB,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAIrF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,OAAO,CAWpH"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getNodeAppearanceRevision } from '@flighthq/node';
|
|
2
|
+
import { getRenderStateRuntime } from './renderState';
|
|
3
|
+
export function updateRenderProxyAppearance(state, data, parentData) {
|
|
4
|
+
const appearanceId = getNodeAppearanceRevision(data.source);
|
|
5
|
+
if ((parentData !== undefined && parentData.appearanceFrameId === getRenderStateRuntime(state).currentFrameId) ||
|
|
6
|
+
data.lastAppearanceId !== appearanceId) {
|
|
7
|
+
recalculateAppearance(state, data, parentData);
|
|
8
|
+
data.lastAppearanceId = appearanceId;
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
function recalculateAppearance(state, data, parentData) {
|
|
14
|
+
const source = data.source;
|
|
15
|
+
if (parentData !== undefined) {
|
|
16
|
+
data.visible = source.visible && parentData.visible;
|
|
17
|
+
if (!data.visible)
|
|
18
|
+
return;
|
|
19
|
+
data.alpha = source.alpha * parentData.alpha;
|
|
20
|
+
if (data.alpha <= 0)
|
|
21
|
+
return;
|
|
22
|
+
data.blendMode = source.blendMode;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
data.visible = source.visible;
|
|
26
|
+
if (!data.visible)
|
|
27
|
+
return;
|
|
28
|
+
data.alpha = source.alpha * state.renderAlpha;
|
|
29
|
+
if (data.alpha <= 0)
|
|
30
|
+
return;
|
|
31
|
+
data.blendMode = state.renderBlendMode !== null ? state.renderBlendMode : source.blendMode;
|
|
32
|
+
}
|
|
33
|
+
data.appearanceFrameId = getRenderStateRuntime(state).currentFrameId;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=renderAppearance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderAppearance.js","sourceRoot":"","sources":["../src/renderAppearance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,UAAU,2BAA2B,CAAC,KAAkB,EAAE,IAAiB,EAAE,UAAwB;IACzG,MAAM,YAAY,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAc,CAAC,CAAC;IACpE,IACE,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,iBAAiB,KAAK,qBAAqB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;QAC1G,IAAI,CAAC,gBAAgB,KAAK,YAAY,EACtC,CAAC;QACD,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAkB,EAAE,IAAiB,EAAE,UAAwB;IAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,MAAkC,CAAC;IACvD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;QAC7C,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;YAAE,OAAO;QAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC;QAC9C,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;YAAE,OAAO;QAC5B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,iBAAiB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Renderable, RenderCache, RenderCacheAdapter, Renderer, RenderState } from '@flighthq/types';
|
|
2
|
+
import { RenderCacheKind } from '@flighthq/types';
|
|
3
|
+
export { RenderCacheKind };
|
|
4
|
+
export type { RenderCache, RenderCacheAdapter };
|
|
5
|
+
/**
|
|
6
|
+
* Creates a backend-agnostic cache handle. The handle owns no resource; a backend
|
|
7
|
+
* allocates and stores its own render target on the render state, keyed by this handle,
|
|
8
|
+
* when the cache is first refreshed.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createRenderCache(): RenderCache;
|
|
11
|
+
/**
|
|
12
|
+
* Creates an adapter that, during the render update pass, substitutes its cache handle
|
|
13
|
+
* for `source` so the cached result is composited instead of the source subtree being
|
|
14
|
+
* traversed. Returns null from `adapt` (renders normally) until a cache is attached.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createRenderCacheAdapter(cache?: RenderCache | null): RenderCacheAdapter;
|
|
17
|
+
/**
|
|
18
|
+
* Opts an adapter into the onPrepare signal, emitted each time the adapter is consulted
|
|
19
|
+
* during the update pass — a hook for refreshing the cache lazily before it is composited.
|
|
20
|
+
*/
|
|
21
|
+
export declare function enableRenderCacheAdapterSignals(adapter: RenderCacheAdapter): void;
|
|
22
|
+
/**
|
|
23
|
+
* Resolves the cache handle a cache renderer should composite for a render node, by reading the
|
|
24
|
+
* cache adapter attached to the node's source on this state. Returns null if none is attached.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getRenderProxyCache(state: RenderState, source: Renderable): RenderCache | null;
|
|
27
|
+
export declare function isRenderCache(source: unknown): source is RenderCache;
|
|
28
|
+
export declare function isRenderCacheAdapter(value: unknown): value is RenderCacheAdapter;
|
|
29
|
+
export declare function registerRenderCacheRenderer(state: RenderState, renderer: Renderer): void;
|
|
30
|
+
/**
|
|
31
|
+
* Attaches `cache` to `source` on this state: subsequent renders composite the cache
|
|
32
|
+
* instead of rendering the source subtree. Reuses an existing cache adapter on the source
|
|
33
|
+
* if present. The cache shows nothing until it is refreshed with content.
|
|
34
|
+
*/
|
|
35
|
+
export declare function useRenderCache(state: RenderState, source: Renderable, cache: RenderCache): RenderCacheAdapter;
|
|
36
|
+
//# sourceMappingURL=renderCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderCache.d.ts","sourceRoot":"","sources":["../src/renderCache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKlD,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,GAAE,WAAW,GAAG,IAAW,GAAG,kBAAkB,CAmB7F;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAEjF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAG9F;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,WAAW,CAEpE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAOhF;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAExF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,kBAAkB,CAS7G"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
2
|
+
import { createMatrix, multiplyMatrix } from '@flighthq/geometry';
|
|
3
|
+
import { createSignal } from '@flighthq/signals';
|
|
4
|
+
import { RenderCacheKind } from '@flighthq/types';
|
|
5
|
+
import { registerRenderer } from './renderer';
|
|
6
|
+
import { getRenderProxyAdapter, setRenderProxyAdapter } from './renderProxyAdapter';
|
|
7
|
+
export { RenderCacheKind };
|
|
8
|
+
/**
|
|
9
|
+
* Creates a backend-agnostic cache handle. The handle owns no resource; a backend
|
|
10
|
+
* allocates and stores its own render target on the render state, keyed by this handle,
|
|
11
|
+
* when the cache is first refreshed.
|
|
12
|
+
*/
|
|
13
|
+
export function createRenderCache() {
|
|
14
|
+
return createEntity({ kind: RenderCacheKind, transform: createMatrix() });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Creates an adapter that, during the render update pass, substitutes its cache handle
|
|
18
|
+
* for `source` so the cached result is composited instead of the source subtree being
|
|
19
|
+
* traversed. Returns null from `adapt` (renders normally) until a cache is attached.
|
|
20
|
+
*/
|
|
21
|
+
export function createRenderCacheAdapter(cache = null) {
|
|
22
|
+
const adapter = {
|
|
23
|
+
cache,
|
|
24
|
+
signals: null,
|
|
25
|
+
adapt(_state, _source, node) {
|
|
26
|
+
adapter.signals?.onPrepare.emit();
|
|
27
|
+
const attached = adapter.cache ?? null;
|
|
28
|
+
if (attached === null)
|
|
29
|
+
return null;
|
|
30
|
+
// Switch the render node to the cache renderer and fold in the cache's placement
|
|
31
|
+
// transform, but keep node.source as the original scene node — the appearance and
|
|
32
|
+
// transform passes read node.source every (dirty) frame, and the handle is not a Node.
|
|
33
|
+
// The cache renderer resolves the handle from this adapter via getRenderProxyCache.
|
|
34
|
+
node.kind = RenderCacheKind;
|
|
35
|
+
multiplyMatrix(node.transform2D, node.transform2D, attached.transform);
|
|
36
|
+
return false;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
return adapter;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Opts an adapter into the onPrepare signal, emitted each time the adapter is consulted
|
|
43
|
+
* during the update pass — a hook for refreshing the cache lazily before it is composited.
|
|
44
|
+
*/
|
|
45
|
+
export function enableRenderCacheAdapterSignals(adapter) {
|
|
46
|
+
adapter.signals ??= { onPrepare: createSignal() };
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolves the cache handle a cache renderer should composite for a render node, by reading the
|
|
50
|
+
* cache adapter attached to the node's source on this state. Returns null if none is attached.
|
|
51
|
+
*/
|
|
52
|
+
export function getRenderProxyCache(state, source) {
|
|
53
|
+
const adapter = getRenderProxyAdapter(state, source);
|
|
54
|
+
return isRenderCacheAdapter(adapter) ? (adapter.cache ?? null) : null;
|
|
55
|
+
}
|
|
56
|
+
export function isRenderCache(source) {
|
|
57
|
+
return typeof source === 'object' && source !== null && source.kind === RenderCacheKind;
|
|
58
|
+
}
|
|
59
|
+
export function isRenderCacheAdapter(value) {
|
|
60
|
+
return (typeof value === 'object' &&
|
|
61
|
+
value !== null &&
|
|
62
|
+
typeof value.adapt === 'function' &&
|
|
63
|
+
'cache' in value);
|
|
64
|
+
}
|
|
65
|
+
export function registerRenderCacheRenderer(state, renderer) {
|
|
66
|
+
registerRenderer(state, RenderCacheKind, renderer);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Attaches `cache` to `source` on this state: subsequent renders composite the cache
|
|
70
|
+
* instead of rendering the source subtree. Reuses an existing cache adapter on the source
|
|
71
|
+
* if present. The cache shows nothing until it is refreshed with content.
|
|
72
|
+
*/
|
|
73
|
+
export function useRenderCache(state, source, cache) {
|
|
74
|
+
const existing = getRenderProxyAdapter(state, source);
|
|
75
|
+
if (isRenderCacheAdapter(existing)) {
|
|
76
|
+
existing.cache = cache;
|
|
77
|
+
return existing;
|
|
78
|
+
}
|
|
79
|
+
const adapter = createRenderCacheAdapter(cache);
|
|
80
|
+
setRenderProxyAdapter(state, source, adapter);
|
|
81
|
+
return adapter;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=renderCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderCache.js","sourceRoot":"","sources":["../src/renderCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,OAAO,EAAE,eAAe,EAAE,CAAC;AAG3B;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,YAAY,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAA4B,IAAI;IACvE,MAAM,OAAO,GAAuB;QAClC,KAAK;QACL,OAAO,EAAE,IAAI;QAEb,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI;YACzB,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;YACvC,IAAI,QAAQ,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACnC,iFAAiF;YACjF,kFAAkF;YAClF,uFAAuF;YACvF,oFAAoF;YACpF,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;YAC5B,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAAC,OAA2B;IACzE,OAAO,CAAC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAkB,EAAE,MAAkB;IACxE,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAK,MAAsB,CAAC,IAAI,KAAK,eAAe,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAQ,KAA4B,CAAC,KAAK,KAAK,UAAU;QACzD,OAAO,IAAK,KAA4B,CACzC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAkB,EAAE,QAAkB;IAChF,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAkB,EAAE,MAAkB,EAAE,KAAkB;IACvF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACtD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAChD,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderColor.d.ts","sourceRoot":"","sources":["../src/renderColor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAerF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function setRenderStateBackgroundColor(state, color) {
|
|
2
|
+
// backgroundColor/RGBA/String are readonly on the entity but owned and written here; narrow
|
|
3
|
+
// writable cast at this one call site avoids reintroducing a broad internal-cast type.
|
|
4
|
+
const _state = state;
|
|
5
|
+
const uint = color >>> 0;
|
|
6
|
+
_state.backgroundColor = uint;
|
|
7
|
+
const r = (uint & 0xff000000) >>> 24;
|
|
8
|
+
const g = (uint & 0x00ff0000) >>> 16;
|
|
9
|
+
const b = (uint & 0x0000ff00) >>> 8;
|
|
10
|
+
const a = uint & 0xff;
|
|
11
|
+
_state.backgroundColorRgba[0] = r / 0xff;
|
|
12
|
+
_state.backgroundColorRgba[1] = g / 0xff;
|
|
13
|
+
_state.backgroundColorRgba[2] = b / 0xff;
|
|
14
|
+
_state.backgroundColorRgba[3] = a / 0xff;
|
|
15
|
+
_state.backgroundColorString = '#' + uint.toString(16).padStart(8, '0').toUpperCase();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=renderColor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderColor.js","sourceRoot":"","sources":["../src/renderColor.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,6BAA6B,CAAC,KAAkB,EAAE,KAAa;IAC7E,4FAA4F;IAC5F,uFAAuF;IACvF,MAAM,MAAM,GAAG,KAAkG,CAAC;IAClH,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC;IACzB,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderMaterial.d.ts","sourceRoot":"","sources":["../src/renderMaterial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK7E,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAIhH"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Resolves a node's material and its per-node material data onto the render node. Non-inheriting: a
|
|
2
|
+
// node uses its own material (or none → the default pipeline). Called for every node in the render
|
|
3
|
+
// walk — materials are a core feature, not opt-in.
|
|
4
|
+
export function updateRenderProxyMaterial(state, data, _parentData) {
|
|
5
|
+
const source = data.source;
|
|
6
|
+
data.material = source.material ?? null;
|
|
7
|
+
data.materialData = source.materialData ?? null;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=renderMaterial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderMaterial.js","sourceRoot":"","sources":["../src/renderMaterial.ts"],"names":[],"mappings":"AAEA,oGAAoG;AACpG,mGAAmG;AACnG,mDAAmD;AACnD,MAAM,UAAU,yBAAyB,CAAC,KAAkB,EAAE,IAAiB,EAAE,WAAyB;IACxG,MAAM,MAAM,GAAG,IAAI,CAAC,MAA8B,CAAC;IACnD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;IACxC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { HasBoundsRectangle, HasTransform2D, Renderable, RenderProxy, RenderProxy2D, RenderState } from '@flighthq/types';
|
|
2
|
+
type AdaptHook = (state: RenderState, source: Renderable, data: RenderProxy2D) => void;
|
|
3
|
+
export type RenderProxyVisitor = (state: RenderState, source: Renderable, data: RenderProxy2D, parentData: RenderProxy2D | undefined) => void;
|
|
4
|
+
export declare function createRenderProxy(state: RenderState, source: Renderable): RenderProxy;
|
|
5
|
+
export declare function createRenderProxy2D(state: RenderState, source: Renderable & HasTransform2D & HasBoundsRectangle): RenderProxy2D;
|
|
6
|
+
export declare function disposeDisplayObjectRender(state: RenderState, root: Renderable): void;
|
|
7
|
+
export declare function disposeRenderProxy(state: RenderState, source: Renderable): void;
|
|
8
|
+
export declare function getOrCreateRenderProxy2D(state: RenderState, source: Renderable): RenderProxy2D;
|
|
9
|
+
export declare function getRenderProxy2D(state: RenderState, source: Renderable): RenderProxy2D | undefined;
|
|
10
|
+
export declare function installRenderAdaptHook(state: RenderState, fn: AdaptHook): void;
|
|
11
|
+
export declare function isRenderProxyDirty(state: RenderState, source: Renderable, data: RenderProxy, parentData?: RenderProxy): boolean;
|
|
12
|
+
export declare function isRenderProxyVisible(data: RenderProxy2D): boolean;
|
|
13
|
+
export declare function prepareDisplayObjectRender(state: RenderState, source: Renderable): boolean;
|
|
14
|
+
export declare function updateNodeClip(_state: RenderState, source: Renderable, data: RenderProxy2D, parentData: RenderProxy2D | undefined): void;
|
|
15
|
+
export declare function updateRenderProxy2D(state: RenderState, source: Renderable, data: RenderProxy2D, parentData: RenderProxy2D | undefined): void;
|
|
16
|
+
export declare function updateRenderProxyRenderer(state: RenderState, node: RenderProxy): void;
|
|
17
|
+
export declare function walkNode(state: RenderState, root: Renderable, visit: RenderProxyVisitor): boolean;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=renderProxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderProxy.d.ts","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAEV,kBAAkB,EAClB,cAAc,EAEd,UAAU,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAQzB,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;AAIvF,MAAM,MAAM,kBAAkB,GAAG,CAC/B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,aAAa,GAAG,SAAS,KAClC,IAAI,CAAC;AAEV,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,CAuBrF;AAKD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,kBAAkB,GACvD,aAAa,CAMf;AASD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAErF;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAM/E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,aAAa,CAY9F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,SAAS,CAElG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAE9E;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,WAAW,EACjB,UAAU,CAAC,EAAE,WAAW,GACvB,OAAO,CAWT;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAEjE;AAOD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAE1F;AAMD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,aAAa,GAAG,SAAS,GACpC,IAAI,CAGN;AAID,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,aAAa,GAAG,SAAS,GACpC,IAAI,CAQN;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAWrF;AAMD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CA+CjG"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity';
|
|
2
|
+
import { createMatrix } from '@flighthq/geometry';
|
|
3
|
+
import { getNodeAppearanceRevision, getNodeLocalContentRevision, getNodeLocalTransformRevision, getNodeParent, getNodeRuntime, } from '@flighthq/node';
|
|
4
|
+
import { BlendMode } from '@flighthq/types';
|
|
5
|
+
import { updateRenderProxyAppearance } from './renderAppearance';
|
|
6
|
+
import { updateRenderProxyMaterial } from './renderMaterial';
|
|
7
|
+
import { getRenderStateRuntime } from './renderState';
|
|
8
|
+
import { updateRenderProxy2DTransform } from './renderTransform2d';
|
|
9
|
+
export function createRenderProxy(state, source) {
|
|
10
|
+
const runtime = getRenderStateRuntime(state);
|
|
11
|
+
const renderer = runtime.rendererMap.get(source.kind) ?? null;
|
|
12
|
+
return createEntity({
|
|
13
|
+
source: source,
|
|
14
|
+
kind: source.kind,
|
|
15
|
+
next: null,
|
|
16
|
+
alpha: 1,
|
|
17
|
+
appearanceFrameId: -1,
|
|
18
|
+
blendMode: BlendMode.Normal,
|
|
19
|
+
material: null,
|
|
20
|
+
materialData: null,
|
|
21
|
+
lastAppearanceId: -1,
|
|
22
|
+
lastLocalContentId: -1,
|
|
23
|
+
lastLocalTransformId: -1,
|
|
24
|
+
name: null,
|
|
25
|
+
renderer: renderer,
|
|
26
|
+
rendererData: renderer?.createData(state, source) ?? null,
|
|
27
|
+
rendererDataSource: source,
|
|
28
|
+
rendererMapId: runtime.rendererMapId,
|
|
29
|
+
transformFrameId: -1,
|
|
30
|
+
visible: true,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
// The one render-node allocator for the 2D graph. Sprites and display objects produce the same
|
|
34
|
+
// RenderProxy2D — there is no per-family render identity. What differs between them is the traits
|
|
35
|
+
// their source carries (the clip trait), not the render node type.
|
|
36
|
+
export function createRenderProxy2D(state, source) {
|
|
37
|
+
const node = createRenderProxy(state, source);
|
|
38
|
+
node.transform2D = createMatrix();
|
|
39
|
+
node.traverseChildren = true;
|
|
40
|
+
node.clipDepth = 0;
|
|
41
|
+
return node;
|
|
42
|
+
}
|
|
43
|
+
// Teardown counterpart to prepareDisplayObjectRender: disposes the render of `root` and every descendant —
|
|
44
|
+
// the render proxies that prepareDisplayObjectRender created. Each disposeRenderProxy cascades to the
|
|
45
|
+
// renderer's destroyData, so the GPU textures/framebuffers are freed now while the proxies become
|
|
46
|
+
// GC-eligible. Sprites and display objects share one render proxy, so a single dispose serves both;
|
|
47
|
+
// there is no mask proxy to dispose separately (masks were retired into clips). Call after
|
|
48
|
+
// removeNodeChild for nodes that will never be rendered again. Unlike prepareDisplayObjectRender, this visits
|
|
49
|
+
// all nodes regardless of enabled or visible state.
|
|
50
|
+
export function disposeDisplayObjectRender(state, root) {
|
|
51
|
+
walkRenderSubtree(state, root, disposeRenderProxy);
|
|
52
|
+
}
|
|
53
|
+
// Disposes the framework-side render proxy for `source`: drops it from the renderProxyMap (a
|
|
54
|
+
// WeakMap, so this just makes the GC-managed proxy collectable sooner) and cascades to the
|
|
55
|
+
// renderer's destroyData to free the non-GC GPU resources it owns. Call when a node is removed from
|
|
56
|
+
// rendering for good — otherwise those GPU textures/framebuffers linger until the source is GC'd.
|
|
57
|
+
export function disposeRenderProxy(state, source) {
|
|
58
|
+
const renderProxyMap = getRenderStateRuntime(state).renderProxyMap;
|
|
59
|
+
const node = renderProxyMap.get(source);
|
|
60
|
+
if (node === undefined)
|
|
61
|
+
return;
|
|
62
|
+
if (node.rendererData !== null)
|
|
63
|
+
node.renderer?.destroyData?.(state, node.rendererData);
|
|
64
|
+
renderProxyMap.delete(source);
|
|
65
|
+
}
|
|
66
|
+
export function getOrCreateRenderProxy2D(state, source) {
|
|
67
|
+
const runtime = getRenderStateRuntime(state);
|
|
68
|
+
const renderProxyMap = runtime.renderProxyMap;
|
|
69
|
+
let node = renderProxyMap.get(source);
|
|
70
|
+
if (!node) {
|
|
71
|
+
node = createRenderProxy2D(state, source);
|
|
72
|
+
renderProxyMap.set(source, node);
|
|
73
|
+
}
|
|
74
|
+
if (node.rendererMapId !== runtime.rendererMapId) {
|
|
75
|
+
updateRenderProxyRenderer(state, node);
|
|
76
|
+
}
|
|
77
|
+
return node;
|
|
78
|
+
}
|
|
79
|
+
export function getRenderProxy2D(state, source) {
|
|
80
|
+
return getRenderStateRuntime(state).renderProxyMap.get(source);
|
|
81
|
+
}
|
|
82
|
+
export function installRenderAdaptHook(state, fn) {
|
|
83
|
+
getRenderStateRuntime(state).renderAdaptHook = fn;
|
|
84
|
+
}
|
|
85
|
+
export function isRenderProxyDirty(state, source, data, parentData) {
|
|
86
|
+
const currentFrameId = getRenderStateRuntime(state).currentFrameId;
|
|
87
|
+
const parentDirty = parentData !== undefined &&
|
|
88
|
+
(parentData.transformFrameId === currentFrameId || parentData.appearanceFrameId === currentFrameId);
|
|
89
|
+
const localDirty = state.sceneGraphSyncPolicy === 'refreshDerivedState' ||
|
|
90
|
+
data.lastLocalTransformId !== getNodeLocalTransformRevision(source) ||
|
|
91
|
+
data.lastAppearanceId !== getNodeAppearanceRevision(source) ||
|
|
92
|
+
data.lastLocalContentId !== getNodeLocalContentRevision(source);
|
|
93
|
+
return parentDirty || localDirty;
|
|
94
|
+
}
|
|
95
|
+
export function isRenderProxyVisible(data) {
|
|
96
|
+
return data.visible && data.alpha > 0 && !(data.transform2D.a === 0 && data.transform2D.d === 0);
|
|
97
|
+
}
|
|
98
|
+
// The pre-render update pass for the 2D graph. Sprites align onto DisplayObject — they share one
|
|
99
|
+
// identical trait base — so there is a single prepare named for the trait-complete entity it readies
|
|
100
|
+
// (Node + DisplayObject traits); the former per-graph prepares collapsed into this. Masks were retired
|
|
101
|
+
// into clips, so there is no second tree pass; clips are realized by the backend clip hooks during the
|
|
102
|
+
// draw walk, keyed off each node's `clip`.
|
|
103
|
+
export function prepareDisplayObjectRender(state, source) {
|
|
104
|
+
return walkNode(state, source, updateRenderProxy2D);
|
|
105
|
+
}
|
|
106
|
+
// Sets a node's clip nesting depth from its parent. Stateless (derived from the parent's depth), so it
|
|
107
|
+
// composes as a trait update step. Both display objects and sprites carry the HasClip trait; a null
|
|
108
|
+
// clip contributes no depth (rect and path clips both count), so the same step is safe in every walk.
|
|
109
|
+
// Render caches (the other Renderable) leave the field undefined, which is also null-ish.
|
|
110
|
+
export function updateNodeClip(_state, source, data, parentData) {
|
|
111
|
+
const parentDepth = parentData !== undefined ? parentData.clipDepth : 0;
|
|
112
|
+
data.clipDepth = parentDepth + (source.clip != null ? 1 : 0);
|
|
113
|
+
}
|
|
114
|
+
// The one per-node update step for the 2D walk: appearance, transform, material, then the clip nesting
|
|
115
|
+
// depth. Sprites and display objects share this single visitor.
|
|
116
|
+
export function updateRenderProxy2D(state, source, data, parentData) {
|
|
117
|
+
updateRenderProxyAppearance(state, data, parentData);
|
|
118
|
+
updateRenderProxy2DTransform(state, data, parentData);
|
|
119
|
+
updateRenderProxyMaterial(state, data, parentData);
|
|
120
|
+
updateNodeClip(state, source, data, parentData);
|
|
121
|
+
// Record the content revision we synced at, so a later content-only change re-dirties the node.
|
|
122
|
+
data.lastLocalContentId = getNodeLocalContentRevision(source);
|
|
123
|
+
getRenderStateRuntime(state).renderAdaptHook?.(state, source, data);
|
|
124
|
+
}
|
|
125
|
+
export function updateRenderProxyRenderer(state, node) {
|
|
126
|
+
const runtime = getRenderStateRuntime(state);
|
|
127
|
+
const renderer = runtime.rendererMap.get(node.kind) ?? null;
|
|
128
|
+
if (node.renderer !== renderer || node.rendererDataSource !== node.source) {
|
|
129
|
+
// Free the outgoing renderer's GPU resources before replacing the data it owned.
|
|
130
|
+
if (node.rendererData !== null)
|
|
131
|
+
node.renderer?.destroyData?.(state, node.rendererData);
|
|
132
|
+
node.renderer = renderer;
|
|
133
|
+
node.rendererData = renderer?.createData(state, node.source) ?? null;
|
|
134
|
+
node.rendererDataSource = node.source;
|
|
135
|
+
}
|
|
136
|
+
node.rendererMapId = runtime.rendererMapId;
|
|
137
|
+
}
|
|
138
|
+
// One generic, dirty-checked pre-order walk over the 2D node graph. `visit` composes the trait
|
|
139
|
+
// update* steps. Sprites and display objects share this single traversal and a single render-node
|
|
140
|
+
// type — what differs is the traits they carry, not the path. Clip is not handled here: it is a
|
|
141
|
+
// trait update step in the visitor (updateNodeClip), realized at draw time by the backend clip hooks.
|
|
142
|
+
export function walkNode(state, root, visit) {
|
|
143
|
+
const runtime = getRenderStateRuntime(state);
|
|
144
|
+
++runtime.currentFrameId;
|
|
145
|
+
const tempStack = runtime.tempStack;
|
|
146
|
+
let stackLength = 1;
|
|
147
|
+
tempStack[0] = root;
|
|
148
|
+
let parentData = undefined;
|
|
149
|
+
let lastParent = null;
|
|
150
|
+
let treeDirty = false;
|
|
151
|
+
while (stackLength > 0) {
|
|
152
|
+
const current = tempStack[--stackLength];
|
|
153
|
+
if (!current.enabled)
|
|
154
|
+
continue;
|
|
155
|
+
if (current !== root) {
|
|
156
|
+
const parent = getNodeParent(current);
|
|
157
|
+
if (parent === null) {
|
|
158
|
+
parentData = undefined;
|
|
159
|
+
lastParent = null;
|
|
160
|
+
}
|
|
161
|
+
else if (parent !== lastParent) {
|
|
162
|
+
parentData = getOrCreateRenderProxy2D(state, parent);
|
|
163
|
+
lastParent = parent;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const data = getOrCreateRenderProxy2D(state, current);
|
|
167
|
+
if (isRenderProxyDirty(state, current, data, parentData)) {
|
|
168
|
+
visit(state, current, data, parentData);
|
|
169
|
+
treeDirty = true;
|
|
170
|
+
}
|
|
171
|
+
if (!isRenderProxyVisible(data))
|
|
172
|
+
continue;
|
|
173
|
+
if (data.traverseChildren) {
|
|
174
|
+
const children = getNodeRuntime(current).children;
|
|
175
|
+
if (children !== null) {
|
|
176
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
177
|
+
tempStack[stackLength++] = children[i];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return treeDirty;
|
|
183
|
+
}
|
|
184
|
+
// Pre-order walk over `root` and its full graph subtree, calling `visit` once per node. Unlike
|
|
185
|
+
// walkNode (the render-prepare walk), it advances no frame id and skips no nodes — disabled and
|
|
186
|
+
// hidden nodes are visited too, since their render proxies still need teardown. Shared by the
|
|
187
|
+
// dispose* render-teardown functions. Uses state.tempStack as scratch, so it must not run re-entrantly.
|
|
188
|
+
function walkRenderSubtree(state, root, visit) {
|
|
189
|
+
const tempStack = getRenderStateRuntime(state).tempStack;
|
|
190
|
+
let stackLength = 1;
|
|
191
|
+
tempStack[0] = root;
|
|
192
|
+
while (stackLength > 0) {
|
|
193
|
+
const current = tempStack[--stackLength];
|
|
194
|
+
visit(state, current);
|
|
195
|
+
const children = getNodeRuntime(current).children;
|
|
196
|
+
if (children !== null) {
|
|
197
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
198
|
+
tempStack[stackLength++] = children[i];
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=renderProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderProxy.js","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Renderable, RenderProxy2D, RenderProxyAdapter, RenderState } from '@flighthq/types';
|
|
2
|
+
export declare function applyRenderProxyAdapter(state: RenderState, source: Renderable, data: RenderProxy2D & {
|
|
3
|
+
traverseChildren: boolean;
|
|
4
|
+
}): void;
|
|
5
|
+
export declare function getRenderProxyAdapter(state: RenderState, source: Renderable): RenderProxyAdapter | null;
|
|
6
|
+
export declare function setRenderProxyAdapter(state: RenderState, source: Renderable, adapter: RenderProxyAdapter | null): void;
|
|
7
|
+
//# sourceMappingURL=renderProxyAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderProxyAdapter.d.ts","sourceRoot":"","sources":["../src/renderProxyAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAKxG,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,aAAa,GAAG;IAAE,gBAAgB,EAAE,OAAO,CAAA;CAAE,GAClD,IAAI,CAWN;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,IAAI,CAEvG;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,kBAAkB,GAAG,IAAI,GACjC,IAAI,CAWN"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { invalidateNodeAppearance } from '@flighthq/node';
|
|
2
|
+
import { installRenderAdaptHook, updateRenderProxyRenderer } from './renderProxy';
|
|
3
|
+
import { getRenderStateRuntime } from './renderState';
|
|
4
|
+
export function applyRenderProxyAdapter(state, source, data) {
|
|
5
|
+
const renderAdapter = getRenderStateRuntime(state).renderProxyAdapterMap.get(source) ?? null;
|
|
6
|
+
let traverseChildren = true;
|
|
7
|
+
if (renderAdapter !== null) {
|
|
8
|
+
const result = renderAdapter.adapt(state, source, data);
|
|
9
|
+
if (result !== null) {
|
|
10
|
+
traverseChildren = result;
|
|
11
|
+
updateRenderProxyRenderer(state, data);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
data.traverseChildren = traverseChildren;
|
|
15
|
+
}
|
|
16
|
+
export function getRenderProxyAdapter(state, source) {
|
|
17
|
+
return getRenderStateRuntime(state).renderProxyAdapterMap.get(source) ?? null;
|
|
18
|
+
}
|
|
19
|
+
export function setRenderProxyAdapter(state, source, adapter) {
|
|
20
|
+
if (getRenderStateRuntime(state).renderAdaptHook !== applyRenderProxyAdapter) {
|
|
21
|
+
installRenderAdaptHook(state, applyRenderProxyAdapter);
|
|
22
|
+
}
|
|
23
|
+
const runtime = getRenderStateRuntime(state);
|
|
24
|
+
if (adapter === null) {
|
|
25
|
+
runtime.renderProxyAdapterMap.delete(source);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
runtime.renderProxyAdapterMap.set(source, adapter);
|
|
29
|
+
}
|
|
30
|
+
invalidateNodeAppearance(source);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=renderProxyAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderProxyAdapter.js","sourceRoot":"","sources":["../src/renderProxyAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,UAAU,uBAAuB,CACrC,KAAkB,EAClB,MAAkB,EAClB,IAAmD;IAEnD,MAAM,aAAa,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC7F,IAAI,gBAAgB,GAAG,IAAI,CAAC;IAC5B,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,gBAAgB,GAAG,MAAM,CAAC;YAC1B,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAkB,EAAE,MAAkB;IAC1E,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAkB,EAClB,MAAkB,EAClB,OAAkC;IAElC,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC,eAAe,KAAK,uBAAuB,EAAE,CAAC;QAC7E,sBAAsB,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IACD,wBAAwB,CAAC,MAAc,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Renderable, RenderProxy, RenderQueue, RenderQueueEntry, RenderSortKey, RenderState } from '@flighthq/types';
|
|
2
|
+
export declare function buildRenderQueue(state: RenderState, source: Renderable, out: RenderQueue): void;
|
|
3
|
+
export declare function clearRenderQueue(queue: RenderQueue): void;
|
|
4
|
+
export declare function compareRenderQueueEntries(a: RenderQueueEntry, b: RenderQueueEntry): number;
|
|
5
|
+
export declare function createRenderQueue(): RenderQueue;
|
|
6
|
+
export declare function packRenderSortKey(layer: number, depth: number, isTransparent: boolean): RenderSortKey;
|
|
7
|
+
export declare function pushRenderQueueEntry(queue: RenderQueue, proxy: RenderProxy, sortKey: RenderSortKey): void;
|
|
8
|
+
export declare function sortRenderQueue(queue: RenderQueue, compare?: (a: RenderQueueEntry, b: RenderQueueEntry) => number): void;
|
|
9
|
+
//# sourceMappingURL=renderQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderQueue.d.ts","sourceRoot":"","sources":["../src/renderQueue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,UAAU,EACV,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAWzB,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA0B/F;AAID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAEzD;AAGD,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAE1F;AAID,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C;AAUD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,aAAa,CAKrG;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAQzG;AAMD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,KAAK,MAAM,GAC7D,IAAI,CAON"}
|