@flighthq/render 0.1.0 → 0.2.1-next.410.a23f189
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/enableColorAdjustmentGuards.d.ts +4 -0
- package/dist/enableColorAdjustmentGuards.d.ts.map +1 -0
- package/dist/enableColorAdjustmentGuards.js +22 -0
- package/dist/enableColorAdjustmentGuards.js.map +1 -0
- package/dist/explainDisplayObjectRender.d.ts +12 -0
- package/dist/explainDisplayObjectRender.d.ts.map +1 -0
- package/dist/explainDisplayObjectRender.js +40 -0
- package/dist/explainDisplayObjectRender.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/renderAppearance.d.ts.map +1 -1
- package/dist/renderAppearance.js.map +1 -1
- package/dist/renderColorTransform.d.ts +3 -0
- package/dist/renderColorTransform.d.ts.map +1 -0
- package/dist/renderColorTransform.js +21 -0
- package/dist/renderColorTransform.js.map +1 -0
- package/dist/renderProxy.d.ts.map +1 -1
- package/dist/renderProxy.js +5 -2
- package/dist/renderProxy.js.map +1 -1
- package/dist/renderState.d.ts.map +1 -1
- package/dist/renderState.js +1 -0
- package/dist/renderState.js.map +1 -1
- package/dist/renderTarget.js +2 -2
- package/dist/renderTarget.js.map +1 -1
- package/dist/renderTransform2d.js +2 -2
- package/dist/renderTransform2d.js.map +1 -1
- package/dist/sceneRender.d.ts.map +1 -1
- package/dist/sceneRender.js +125 -25
- package/dist/sceneRender.js.map +1 -1
- package/package.json +16 -7
- package/src/enableColorAdjustmentGuards.test.ts +58 -0
- package/src/explainDisplayObjectRender.test.ts +130 -0
- package/src/renderColorTransform.test.ts +51 -0
- package/src/sceneRender.test.ts +142 -17
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RenderState } from '@flighthq/types';
|
|
2
|
+
export declare function areColorAdjustmentGuardsEnabled(state: RenderState): boolean;
|
|
3
|
+
export declare function enableColorAdjustmentGuards(state: RenderState): void;
|
|
4
|
+
//# sourceMappingURL=enableColorAdjustmentGuards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enableColorAdjustmentGuards.d.ts","sourceRoot":"","sources":["../src/enableColorAdjustmentGuards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMnD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE3E;AAQD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAEpE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { logOnce } from '@flighthq/log';
|
|
2
|
+
import { LogLevel } from '@flighthq/types';
|
|
3
|
+
import { getRenderStateRuntime } from './renderState';
|
|
4
|
+
// Returns whether the color-adjustment deferral guard is installed on `state`.
|
|
5
|
+
export function areColorAdjustmentGuardsEnabled(state) {
|
|
6
|
+
return getRenderStateRuntime(state).colorAdjustmentChannelMixingGuard != null;
|
|
7
|
+
}
|
|
8
|
+
// Installs the shakeable color-adjustment guard on `state`: when a node's color-adjustment stack contains
|
|
9
|
+
// an off-diagonal channel-mixing adjustment (saturation/hue/sepia/channelMixer) that the affine inline
|
|
10
|
+
// fold cannot represent yet, the render walk reaches this guard through its nullable runtime slot and
|
|
11
|
+
// warns once (only the affine part of the tint is applied — the non-affine part is skipped, never a
|
|
12
|
+
// throw). Not calling this — the production default — costs the render walk nothing, since the message
|
|
13
|
+
// and @flighthq/log dependency live only in this separately-imported module. Idempotent.
|
|
14
|
+
export function enableColorAdjustmentGuards(state) {
|
|
15
|
+
getRenderStateRuntime(state).colorAdjustmentChannelMixingGuard = warnColorAdjustmentChannelMixingNotInlineable;
|
|
16
|
+
}
|
|
17
|
+
function warnColorAdjustmentChannelMixingNotInlineable() {
|
|
18
|
+
logOnce('render:color-adjustment-channel-mixing-not-inlineable', LogLevel.Warn, {
|
|
19
|
+
message: 'updateRenderProxyColorTransform: per-object channel-mixing color adjustment (saturation/hue/sepia/channelMixer) is not inline-able yet — the 4×5 fold is deferred, so only the affine part of the stack was applied. Use an Effect pass for the channel-mixing op.',
|
|
20
|
+
}, 'render');
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=enableColorAdjustmentGuards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enableColorAdjustmentGuards.js","sourceRoot":"","sources":["../src/enableColorAdjustmentGuards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,+EAA+E;AAC/E,MAAM,UAAU,+BAA+B,CAAC,KAAkB;IAChE,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,iCAAiC,IAAI,IAAI,CAAC;AAChF,CAAC;AAED,0GAA0G;AAC1G,uGAAuG;AACvG,sGAAsG;AACtG,oGAAoG;AACpG,uGAAuG;AACvG,yFAAyF;AACzF,MAAM,UAAU,2BAA2B,CAAC,KAAkB;IAC5D,qBAAqB,CAAC,KAAK,CAAC,CAAC,iCAAiC,GAAG,6CAA6C,CAAC;AACjH,CAAC;AAED,SAAS,6CAA6C;IACpD,OAAO,CACL,uDAAuD,EACvD,QAAQ,CAAC,IAAI,EACb;QACE,OAAO,EACL,oQAAoQ;KACvQ,EACD,QAAQ,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Kind, Renderable, RenderState } from '@flighthq/types';
|
|
2
|
+
export interface DisplayObjectRenderExplanation {
|
|
3
|
+
readonly kind: Kind;
|
|
4
|
+
readonly hasRenderer: boolean;
|
|
5
|
+
readonly prepared: boolean;
|
|
6
|
+
readonly visible: boolean;
|
|
7
|
+
readonly effectiveAlpha: number;
|
|
8
|
+
readonly reason: DisplayObjectRenderBlankReason;
|
|
9
|
+
}
|
|
10
|
+
export type DisplayObjectRenderBlankReason = 'no-renderer' | 'not-prepared' | 'not-visible' | 'zero-alpha' | 'ok';
|
|
11
|
+
export declare function explainDisplayObjectRender(state: RenderState, source: Renderable): DisplayObjectRenderExplanation;
|
|
12
|
+
//# sourceMappingURL=explainDisplayObjectRender.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainDisplayObjectRender.d.ts","sourceRoot":"","sources":["../src/explainDisplayObjectRender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AASpF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAIpB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAG9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAQ3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,8BAA8B,CAAC;CACjD;AAKD,MAAM,MAAM,8BAA8B,GAAG,aAAa,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,IAAI,CAAC;AAkBlH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,GAAG,8BAA8B,CAmBjH"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getRenderProxy2D } from './renderProxy';
|
|
2
|
+
import { getRenderStateRuntime } from './renderState';
|
|
3
|
+
// Recomputes why `source` would or would not draw against `state`, and returns it as plain data. Pure:
|
|
4
|
+
// reads only, allocates only the returned record, never mutates state (in particular never creates a
|
|
5
|
+
// proxy — it uses getRenderProxy2D, not getOrCreate), never throws even on a bare node, and retains
|
|
6
|
+
// nothing. Import it to debug a blank frame; it sheds from production when unimported.
|
|
7
|
+
//
|
|
8
|
+
// The reason is root-cause prioritized rather than following buildRenderQueue's literal check order
|
|
9
|
+
// (which drops on proxy===undefined, then !proxy.visible, then renderer===null). no-renderer is
|
|
10
|
+
// surfaced first because it is a static setup error — the "forgot registerRenderer for this kind"
|
|
11
|
+
// bug — that keeps the node blank no matter how the transient visible/alpha gates are fixed, and it is
|
|
12
|
+
// re-derivable from `kind` alone even before the node is prepared. not-prepared outranks the
|
|
13
|
+
// appearance gates for the same reason: nothing downstream matters until a proxy exists.
|
|
14
|
+
//
|
|
15
|
+
// Colocated with the render functions whose blank frame it explains — registerRenderer (renderer.ts),
|
|
16
|
+
// prepareDisplayObjectRender (renderProxy.ts), and buildRenderQueue (renderQueue.ts). This is the
|
|
17
|
+
// maintenance seam: a pull query duplicates the draw path's drop conditions, so if the draw path grows
|
|
18
|
+
// a new blank-reason gate, this function must gain the matching check or it silently goes stale.
|
|
19
|
+
export function explainDisplayObjectRender(state, source) {
|
|
20
|
+
const kind = source.kind;
|
|
21
|
+
const hasRenderer = getRenderStateRuntime(state).rendererMap.get(kind) !== undefined;
|
|
22
|
+
const proxy = getRenderProxy2D(state, source);
|
|
23
|
+
const prepared = proxy !== undefined;
|
|
24
|
+
const appearance = source;
|
|
25
|
+
const visible = proxy !== undefined ? proxy.visible : appearance.visible;
|
|
26
|
+
const effectiveAlpha = proxy !== undefined ? proxy.alpha : appearance.alpha;
|
|
27
|
+
let reason;
|
|
28
|
+
if (!hasRenderer)
|
|
29
|
+
reason = 'no-renderer';
|
|
30
|
+
else if (!prepared)
|
|
31
|
+
reason = 'not-prepared';
|
|
32
|
+
else if (!visible)
|
|
33
|
+
reason = 'not-visible';
|
|
34
|
+
else if (effectiveAlpha <= 0)
|
|
35
|
+
reason = 'zero-alpha';
|
|
36
|
+
else
|
|
37
|
+
reason = 'ok';
|
|
38
|
+
return { kind, hasRenderer, prepared, visible, effectiveAlpha, reason };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=explainDisplayObjectRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explainDisplayObjectRender.js","sourceRoot":"","sources":["../src/explainDisplayObjectRender.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAgCtD,uGAAuG;AACvG,qGAAqG;AACrG,oGAAoG;AACpG,uFAAuF;AACvF,EAAE;AACF,oGAAoG;AACpG,gGAAgG;AAChG,kGAAkG;AAClG,uGAAuG;AACvG,6FAA6F;AAC7F,yFAAyF;AACzF,EAAE;AACF,sGAAsG;AACtG,kGAAkG;AAClG,uGAAuG;AACvG,iGAAiG;AACjG,MAAM,UAAU,0BAA0B,CAAC,KAAkB,EAAE,MAAkB;IAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;IAErF,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;IAErC,MAAM,UAAU,GAAG,MAAkC,CAAC;IACtD,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;IACzE,MAAM,cAAc,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;IAE5E,IAAI,MAAsC,CAAC;IAC3C,IAAI,CAAC,WAAW;QAAE,MAAM,GAAG,aAAa,CAAC;SACpC,IAAI,CAAC,QAAQ;QAAE,MAAM,GAAG,cAAc,CAAC;SACvC,IAAI,CAAC,OAAO;QAAE,MAAM,GAAG,aAAa,CAAC;SACrC,IAAI,cAAc,IAAI,CAAC;QAAE,MAAM,GAAG,YAAY,CAAC;;QAC/C,MAAM,GAAG,IAAI,CAAC;IAEnB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;AAC1E,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
export * from './enableColorAdjustmentGuards';
|
|
2
|
+
export * from './explainDisplayObjectRender';
|
|
1
3
|
export * from './renderAppearance';
|
|
2
4
|
export * from './renderCache';
|
|
3
5
|
export * from './renderColor';
|
|
6
|
+
export * from './renderColorTransform';
|
|
4
7
|
export * from './renderer';
|
|
5
8
|
export * from './renderMaterial';
|
|
6
9
|
export * from './renderProxy';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,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
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
export * from './enableColorAdjustmentGuards';
|
|
2
|
+
export * from './explainDisplayObjectRender';
|
|
1
3
|
export * from './renderAppearance';
|
|
2
4
|
export * from './renderCache';
|
|
3
5
|
export * from './renderColor';
|
|
6
|
+
export * from './renderColorTransform';
|
|
4
7
|
export * from './renderer';
|
|
5
8
|
export * from './renderMaterial';
|
|
6
9
|
export * from './renderProxy';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderAppearance.d.ts","sourceRoot":"","sources":["../src/renderAppearance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"renderAppearance.d.ts","sourceRoot":"","sources":["../src/renderAppearance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqC,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInG,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,OAAO,CAWpH"}
|
|
@@ -1 +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,
|
|
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,MAAiD,CAAC;IACtE,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 @@
|
|
|
1
|
+
{"version":3,"file":"renderColorTransform.d.ts","sourceRoot":"","sources":["../src/renderColorTransform.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAelF,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,WAAW,EACjB,WAAW,CAAC,EAAE,WAAW,GACxB,IAAI,CAMN"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getNodeRuntime } from '@flighthq/node';
|
|
2
|
+
import { getRenderStateRuntime } from './renderState';
|
|
3
|
+
// Hands the node's resolved color transform to the render node. A node's color-adjustment stack
|
|
4
|
+
// (NodeRuntime.colorAdjustments) is fused once into the affine `resolvedColorTransform` cache by the
|
|
5
|
+
// set-accessors on change — never per frame — so this hot-path visitor is a single field read, identical
|
|
6
|
+
// in cost to reading the old `.colorTransform`. Non-inheriting: a node uses its own resolved value (or
|
|
7
|
+
// none → null). The value is the Adjustment-tier fold input; it is not a material and does not key the
|
|
8
|
+
// batch.
|
|
9
|
+
//
|
|
10
|
+
// When the fused stack carries off-diagonal channel-mixing terms the 8-float inline fold cannot represent
|
|
11
|
+
// yet (the 4×5 path is deferred), the node is flagged `colorAdjustmentsChannelMixing`: only the affine
|
|
12
|
+
// part is applied, and the render state's shakeable guard (enableColorAdjustmentGuards) is invoked so the
|
|
13
|
+
// deferral is reported rather than silent.
|
|
14
|
+
export function updateRenderProxyColorTransform(state, data, _parentData) {
|
|
15
|
+
const runtime = getNodeRuntime(data.source);
|
|
16
|
+
data.colorTransform = runtime.resolvedColorTransform ?? null;
|
|
17
|
+
if (runtime.colorAdjustmentsChannelMixing) {
|
|
18
|
+
getRenderStateRuntime(state).colorAdjustmentChannelMixingGuard?.(state, data.source);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=renderColorTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderColorTransform.js","sourceRoot":"","sources":["../src/renderColorTransform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,gGAAgG;AAChG,qGAAqG;AACrG,yGAAyG;AACzG,uGAAuG;AACvG,uGAAuG;AACvG,SAAS;AACT,EAAE;AACF,0GAA0G;AAC1G,uGAAuG;AACvG,0GAA0G;AAC1G,2CAA2C;AAC3C,MAAM,UAAU,+BAA+B,CAC7C,KAAkB,EAClB,IAAiB,EACjB,WAAyB;IAEzB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,MAAc,CAAC,CAAC;IACpD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,sBAAsB,IAAI,IAAI,CAAC;IAC7D,IAAI,OAAO,CAAC,6BAA6B,EAAE,CAAC;QAC1C,qBAAqB,CAAC,KAAK,CAAC,CAAC,iCAAiC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,MAAoB,CAAC,CAAC;IACrG,CAAC;AACH,CAAC"}
|
|
@@ -1 +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;
|
|
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;AASzB,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,CAwBrF;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,CASN;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"}
|
package/dist/renderProxy.js
CHANGED
|
@@ -3,6 +3,7 @@ import { createMatrix } from '@flighthq/geometry';
|
|
|
3
3
|
import { getNodeAppearanceRevision, getNodeLocalContentRevision, getNodeLocalTransformRevision, getNodeParent, getNodeRuntime, } from '@flighthq/node';
|
|
4
4
|
import { BlendMode } from '@flighthq/types';
|
|
5
5
|
import { updateRenderProxyAppearance } from './renderAppearance';
|
|
6
|
+
import { updateRenderProxyColorTransform } from './renderColorTransform';
|
|
6
7
|
import { updateRenderProxyMaterial } from './renderMaterial';
|
|
7
8
|
import { getRenderStateRuntime } from './renderState';
|
|
8
9
|
import { updateRenderProxy2DTransform } from './renderTransform2d';
|
|
@@ -16,6 +17,7 @@ export function createRenderProxy(state, source) {
|
|
|
16
17
|
alpha: 1,
|
|
17
18
|
appearanceFrameId: -1,
|
|
18
19
|
blendMode: BlendMode.Normal,
|
|
20
|
+
colorTransform: null,
|
|
19
21
|
material: null,
|
|
20
22
|
materialData: null,
|
|
21
23
|
lastAppearanceId: -1,
|
|
@@ -111,12 +113,13 @@ export function updateNodeClip(_state, source, data, parentData) {
|
|
|
111
113
|
const parentDepth = parentData !== undefined ? parentData.clipDepth : 0;
|
|
112
114
|
data.clipDepth = parentDepth + (source.clip != null ? 1 : 0);
|
|
113
115
|
}
|
|
114
|
-
// The one per-node update step for the 2D walk: appearance, transform, material,
|
|
115
|
-
// depth. Sprites and display objects share this single visitor.
|
|
116
|
+
// The one per-node update step for the 2D walk: appearance, transform, material, color transform,
|
|
117
|
+
// then the clip nesting depth. Sprites and display objects share this single visitor.
|
|
116
118
|
export function updateRenderProxy2D(state, source, data, parentData) {
|
|
117
119
|
updateRenderProxyAppearance(state, data, parentData);
|
|
118
120
|
updateRenderProxy2DTransform(state, data, parentData);
|
|
119
121
|
updateRenderProxyMaterial(state, data, parentData);
|
|
122
|
+
updateRenderProxyColorTransform(state, data, parentData);
|
|
120
123
|
updateNodeClip(state, source, data, parentData);
|
|
121
124
|
// Record the content revision we synced at, so a later content-only change re-dirties the node.
|
|
122
125
|
data.lastLocalContentId = getNodeLocalContentRevision(source);
|
package/dist/renderProxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderProxy.js","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"renderProxy.js","sourceRoot":"","sources":["../src/renderProxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderState.d.ts","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGvE,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAiBzE;AAOD,wBAAgB,wBAAwB,IAAI,kBAAkB,
|
|
1
|
+
{"version":3,"file":"renderState.d.ts","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGvE,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAiBzE;AAOD,wBAAgB,wBAAwB,IAAI,kBAAkB,CAW7D;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,kBAAkB,CAE5E"}
|
package/dist/renderState.js
CHANGED
|
@@ -25,6 +25,7 @@ export function createRenderState(obj) {
|
|
|
25
25
|
// intentionally mutable (not Readonly).
|
|
26
26
|
export function createRenderStateRuntime() {
|
|
27
27
|
const runtime = createEntityRuntime();
|
|
28
|
+
runtime.colorAdjustmentChannelMixingGuard = null;
|
|
28
29
|
runtime.currentFrameId = 0;
|
|
29
30
|
runtime.renderAdaptHook = null;
|
|
30
31
|
runtime.renderProxyAdapterMap = new WeakMap();
|
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,kBAAkB,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,UAAU,iBAAiB,CAAC,GAA0B;IAC1D,MAAM,KAAK,GAAG,YAAY,CAAC;QACzB,cAAc,EAAE,GAAG,EAAE,cAAc,IAAI,IAAI;QAC3C,eAAe,EAAE,GAAG,EAAE,eAAe,IAAI,CAAC;QAC1C,mBAAmB,EAAE,GAAG,EAAE,mBAAmB,IAAI,EAAE;QACnD,qBAAqB,EAAE,GAAG,EAAE,qBAAqB,IAAI,EAAE;QACvD,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,IAAI,CAAC;QAC5C,sBAAsB,EAAE,GAAG,EAAE,sBAAsB,IAAI,IAAI;QAC3D,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,CAAC;QAChC,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC;QAClC,eAAe,EAAE,GAAG,EAAE,eAAe,IAAI,SAAS,CAAC,MAAM;QACzD,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,IAAI,IAAI;QACjD,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,KAAK;QACtC,oBAAoB,EAAE,GAAG,EAAE,oBAAoB,IAAI,qBAAqB;KACzE,CAAgB,CAAC;IAClB,KAAK,CAAC,gBAAgB,CAAC,GAAG,wBAAwB,EAAE,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oGAAoG;AACpG,0FAA0F;AAC1F,sGAAsG;AACtG,2FAA2F;AAC3F,wCAAwC;AACxC,MAAM,UAAU,wBAAwB;IACtC,MAAM,OAAO,GAAG,mBAAmB,EAAwB,CAAC;IAC5D,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,qBAAqB,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9C,OAAO,CAAC,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;IACvC,OAAO,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;IAChC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;IAC1B,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mGAAmG;AACnG,6CAA6C;AAC7C,MAAM,UAAU,qBAAqB,CAAC,KAAkB;IACtD,OAAO,KAAK,CAAC,gBAAgB,CAAuB,CAAC;AACvD,CAAC"}
|
|
1
|
+
{"version":3,"file":"renderState.js","sourceRoot":"","sources":["../src/renderState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE9D,MAAM,UAAU,iBAAiB,CAAC,GAA0B;IAC1D,MAAM,KAAK,GAAG,YAAY,CAAC;QACzB,cAAc,EAAE,GAAG,EAAE,cAAc,IAAI,IAAI;QAC3C,eAAe,EAAE,GAAG,EAAE,eAAe,IAAI,CAAC;QAC1C,mBAAmB,EAAE,GAAG,EAAE,mBAAmB,IAAI,EAAE;QACnD,qBAAqB,EAAE,GAAG,EAAE,qBAAqB,IAAI,EAAE;QACvD,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,IAAI,CAAC;QAC5C,sBAAsB,EAAE,GAAG,EAAE,sBAAsB,IAAI,IAAI;QAC3D,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,CAAC;QAChC,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,CAAC;QAClC,eAAe,EAAE,GAAG,EAAE,eAAe,IAAI,SAAS,CAAC,MAAM;QACzD,iBAAiB,EAAE,GAAG,EAAE,iBAAiB,IAAI,IAAI;QACjD,WAAW,EAAE,GAAG,EAAE,WAAW,IAAI,KAAK;QACtC,oBAAoB,EAAE,GAAG,EAAE,oBAAoB,IAAI,qBAAqB;KACzE,CAAgB,CAAC;IAClB,KAAK,CAAC,gBAAgB,CAAC,GAAG,wBAAwB,EAAE,CAAC;IACrD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oGAAoG;AACpG,0FAA0F;AAC1F,sGAAsG;AACtG,2FAA2F;AAC3F,wCAAwC;AACxC,MAAM,UAAU,wBAAwB;IACtC,MAAM,OAAO,GAAG,mBAAmB,EAAwB,CAAC;IAC5D,OAAO,CAAC,iCAAiC,GAAG,IAAI,CAAC;IACjD,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,qBAAqB,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9C,OAAO,CAAC,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;IACvC,OAAO,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;IAChC,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC;IAC1B,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mGAAmG;AACnG,6CAA6C;AAC7C,MAAM,UAAU,qBAAqB,CAAC,KAAkB;IACtD,OAAO,KAAK,CAAC,gBAAgB,CAAuB,CAAC;AACvD,CAAC"}
|
package/dist/renderTarget.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { createMatrix, inverseMatrix, multiplyMatrix } from '@flighthq/geometry';
|
|
2
|
-
import {
|
|
2
|
+
import { getNodeLocalMatrix } from '@flighthq/node';
|
|
3
3
|
/**
|
|
4
4
|
* Writes into outRenderTransform the transform to set as state.renderTransform2D when
|
|
5
5
|
* capturing source into a render target. Maps source content into target pixel space so
|
|
6
6
|
* that the bounds origin lands at (contentX, contentY).
|
|
7
7
|
*/
|
|
8
8
|
export function computeDisplayObjectRenderTargetTransform(outRenderTransform, source, bounds, contentX = 0, contentY = 0) {
|
|
9
|
-
const localTransform =
|
|
9
|
+
const localTransform = getNodeLocalMatrix(source);
|
|
10
10
|
inverseMatrix(_tempInvLocal, localTransform);
|
|
11
11
|
_tempTranslation.a = 1;
|
|
12
12
|
_tempTranslation.b = 0;
|
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,oBAAoB,CAAC;AACjF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"renderTarget.js","sourceRoot":"","sources":["../src/renderTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAQpD;;;;GAIG;AACH,MAAM,UAAU,yCAAyC,CACvD,kBAA8B,EAC9B,MAAqB,EACrB,MAA+B,EAC/B,WAAmB,CAAC,EACpB,WAAmB,CAAC;IAEpB,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAClD,aAAa,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC7C,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,gBAAgB,CAAC,EAAE,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC;IAC1C,gBAAgB,CAAC,EAAE,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC;IAC1C,cAAc,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,iBAA6B,EAC7B,MAA+B,EAC/B,WAAmB,CAAC,EACpB,WAAmB,CAAC;IAEpB,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;IACxB,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;IACxB,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;IACxB,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;IACxB,iBAAiB,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC;IAC3C,iBAAiB,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAA+B,EAC/B,UAAkB,CAAC,EACnB,WAAmB,CAAC,EACpB,YAAoB,CAAC;IAErB,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;QAChE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;KACpE,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAG,YAAY,EAAE,CAAC;AACrC,MAAM,gBAAgB,GAAG,YAAY,EAAE,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { copyMatrix, multiplyMatrix } from '@flighthq/geometry';
|
|
2
|
-
import {
|
|
2
|
+
import { getNodeLocalMatrix, getNodeLocalTransformRevision } from '@flighthq/node';
|
|
3
3
|
import { getRenderStateRuntime } from './renderState';
|
|
4
4
|
export function updateRenderProxy2DTransform(state, data, parentData) {
|
|
5
5
|
const localTransformId = getNodeLocalTransformRevision(data.source);
|
|
@@ -13,7 +13,7 @@ export function updateRenderProxy2DTransform(state, data, parentData) {
|
|
|
13
13
|
return false;
|
|
14
14
|
}
|
|
15
15
|
function recalculateRenderTransform2D(state, data, parentData) {
|
|
16
|
-
const transform2D =
|
|
16
|
+
const transform2D = getNodeLocalMatrix(data.source);
|
|
17
17
|
const parentTransform2D = parentData !== undefined ? parentData.transform2D : state.renderTransform2D;
|
|
18
18
|
if (parentTransform2D !== null) {
|
|
19
19
|
multiplyMatrix(data.transform2D, parentTransform2D, transform2D);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderTransform2d.js","sourceRoot":"","sources":["../src/renderTransform2d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"renderTransform2d.js","sourceRoot":"","sources":["../src/renderTransform2d.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAGnF,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,GAAG,IAAI,CAAC,oBAAoB,KAAK,gBAAgB,CAAC;IAElE,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneRender.d.ts","sourceRoot":"","sources":["../src/sceneRender.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sceneRender.d.ts","sourceRoot":"","sources":["../src/sceneRender.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAGV,MAAM,EASN,WAAW,EACX,eAAe,EACf,WAAW,EACX,SAAS,EACT,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AA2BzB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAkE7F;AAcD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC5B,eAAe,CA6BjB"}
|
package/dist/sceneRender.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
1
2
|
import { createAabb, createFrustum, createMatrix4, isFrustumIntersectingAabb, multiplyMatrix4, setFrustumFromMatrix4, setOrthographicMatrix4, setPerspectiveMatrix4, transformAabbByMatrix4, } from '@flighthq/geometry';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
3
|
+
import { getNodeRuntime, getNodeWorldMatrix4 } from '@flighthq/node';
|
|
4
|
+
import { computeSkeleton3DJointMatrices } from '@flighthq/skeleton3d';
|
|
5
|
+
import { MAX_FORWARD_LIGHTS, SCENE_LIGHT_AMBIENT_RADIANCE_OFFSET, SCENE_LIGHT_BLOCK_FLOATS, SCENE_LIGHT_DIRECTIONAL_DIRECTION_OFFSET, SCENE_LIGHT_DIRECTIONAL_RADIANCE_OFFSET, SCENE_LIGHT_HEMISPHERE_OFFSET, SCENE_LIGHT_HEMISPHERE_STRIDE, SCENE_LIGHT_POINT_OFFSET, SCENE_LIGHT_POINT_STRIDE, SCENE_LIGHT_SPOT_OFFSET, SCENE_LIGHT_SPOT_STRIDE, } from '@flighthq/types';
|
|
6
|
+
// Packs the directional + ambient + punctual (point/spot/hemisphere) draw-arg lights into `out` (the
|
|
7
|
+
// GPU-ready light block), converting each packed sRgb color to linear, premultiplied radiance
|
|
8
|
+
// (unpackColorToLinear(color) * intensity) so the shader never sees sRgb. Sets every presence count
|
|
9
|
+
// (directional/ambient 0..1, point/spot/hemisphere 0..MAX_FORWARD_LIGHTS). The float layout matches
|
|
10
|
+
// the shader's std140 light block exactly (SCENE_LIGHT_* offsets/strides in @flighthq/types); absent
|
|
11
|
+
// terms and unused array slots stay zeroed. Punctual arrays beyond MAX_FORWARD_LIGHTS are dropped.
|
|
9
12
|
//
|
|
10
13
|
// `version` bumps only when the packed data or counts actually change from the previous pack — a
|
|
11
14
|
// no-op re-pack of identical lights leaves it untouched. This is the SceneLightBlock contract a
|
|
@@ -26,19 +29,49 @@ export function packSceneLightBlock(out, lights) {
|
|
|
26
29
|
packAmbientLight(scratchLightData, ambient);
|
|
27
30
|
ambientCount = 1;
|
|
28
31
|
}
|
|
32
|
+
let pointCount = 0;
|
|
33
|
+
const point = lights.point;
|
|
34
|
+
if (point !== undefined) {
|
|
35
|
+
pointCount = Math.min(point.length, MAX_FORWARD_LIGHTS);
|
|
36
|
+
for (let i = 0; i < pointCount; i++) {
|
|
37
|
+
packPointLight(scratchLightData, SCENE_LIGHT_POINT_OFFSET + i * SCENE_LIGHT_POINT_STRIDE, point[i]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
let spotCount = 0;
|
|
41
|
+
const spot = lights.spot;
|
|
42
|
+
if (spot !== undefined) {
|
|
43
|
+
spotCount = Math.min(spot.length, MAX_FORWARD_LIGHTS);
|
|
44
|
+
for (let i = 0; i < spotCount; i++) {
|
|
45
|
+
packSpotLight(scratchLightData, SCENE_LIGHT_SPOT_OFFSET + i * SCENE_LIGHT_SPOT_STRIDE, spot[i]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
let hemisphereCount = 0;
|
|
49
|
+
const hemisphere = lights.hemisphere;
|
|
50
|
+
if (hemisphere !== undefined) {
|
|
51
|
+
hemisphereCount = Math.min(hemisphere.length, MAX_FORWARD_LIGHTS);
|
|
52
|
+
for (let i = 0; i < hemisphereCount; i++) {
|
|
53
|
+
packHemisphereLight(scratchLightData, SCENE_LIGHT_HEMISPHERE_OFFSET + i * SCENE_LIGHT_HEMISPHERE_STRIDE, hemisphere[i]);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
29
56
|
if (out.directionalCount === directionalCount &&
|
|
30
57
|
out.ambientCount === ambientCount &&
|
|
58
|
+
out.pointCount === pointCount &&
|
|
59
|
+
out.spotCount === spotCount &&
|
|
60
|
+
out.hemisphereCount === hemisphereCount &&
|
|
31
61
|
isFloat32ArrayEqual(out.data, scratchLightData)) {
|
|
32
62
|
return;
|
|
33
63
|
}
|
|
34
64
|
out.data.set(scratchLightData);
|
|
35
65
|
out.directionalCount = directionalCount;
|
|
36
66
|
out.ambientCount = ambientCount;
|
|
67
|
+
out.pointCount = pointCount;
|
|
68
|
+
out.spotCount = spotCount;
|
|
69
|
+
out.hemisphereCount = hemisphereCount;
|
|
37
70
|
out.version++;
|
|
38
71
|
}
|
|
39
72
|
// The per-frame preparation pass for a 3D scene, the 3D analog of prepareDisplayObjectRender. It is
|
|
40
73
|
// backend-agnostic (no GPU context): it walks the SceneNode hierarchy rooted at `scene`, propagating
|
|
41
|
-
// each node's
|
|
74
|
+
// each node's world matrix (parentWorld x local matrix, resolved lazily on the node runtime and
|
|
42
75
|
// alias-safe), computes the draw camera's view-projection, frustum-culls every Mesh against its
|
|
43
76
|
// world-space bounds, and packs `lights` into the shared SceneLightBlock (sRgb->linear at pack time).
|
|
44
77
|
// The returned SceneRenderList is the render-ready frame the backend drawScene consumes — it only
|
|
@@ -60,12 +93,29 @@ export function prepareSceneRender(state, scene, camera, lights) {
|
|
|
60
93
|
prepared.meshes.length = 0;
|
|
61
94
|
collectVisibleMeshes(scene, prepared.frustum, prepared.worldBounds, prepared.meshes);
|
|
62
95
|
list.meshCount = prepared.meshes.length;
|
|
96
|
+
// Refresh the GPU skin palette for every visible skinned mesh from its joints' current world
|
|
97
|
+
// transforms (jointWorld * inverseBind). The backend uploads skeleton.jointMatrices through the
|
|
98
|
+
// proxy and the HAS_SKIN vertex variant deforms from it, so the app poses the joints and this
|
|
99
|
+
// pass alone readies the palette — it need not call the CPU updateMeshSkin on a GPU backend
|
|
100
|
+
// (doing both would deform twice). Rigid meshes carry no skin and are skipped. Morph is driven by
|
|
101
|
+
// the GL backend's draw (updateMeshMorph in drawGlScene), not here, to keep render backend-neutral
|
|
102
|
+
// and free of a @flighthq/scene dependency.
|
|
103
|
+
for (let m = 0; m < prepared.meshes.length; m++) {
|
|
104
|
+
const skin = prepared.meshes[m].skin;
|
|
105
|
+
if (skin != null)
|
|
106
|
+
computeSkeleton3DJointMatrices(skin.skeleton);
|
|
107
|
+
}
|
|
63
108
|
return list;
|
|
64
109
|
}
|
|
65
110
|
function collectVisibleMeshes(node, frustum, worldBounds, out) {
|
|
66
|
-
|
|
111
|
+
// `enabled` gates graph participation; `visible` gates rendering. A hidden subtree is skipped whole,
|
|
112
|
+
// so `visible` propagates (a hidden group hides its descendants) without a resolved-visibility cache.
|
|
113
|
+
if (!node.enabled || !node.visible) {
|
|
67
114
|
return;
|
|
68
115
|
}
|
|
116
|
+
// worldAlpha is not folded in this walk: it is lazily ensured on access (getSceneNodeWorldAlpha), the
|
|
117
|
+
// appearance analog of the ensure-on-access world matrix the renderer resolves at draw time. This walk
|
|
118
|
+
// is culling + mesh collection only.
|
|
69
119
|
// A node is a drawable Mesh (not a transform-only group) when it carries geometry. Structural,
|
|
70
120
|
// so it holds for Meshes created with a custom kind, not just MeshKind.
|
|
71
121
|
const mesh = node;
|
|
@@ -87,7 +137,7 @@ function ensurePreparedScene(state) {
|
|
|
87
137
|
const list = {
|
|
88
138
|
lights: {
|
|
89
139
|
ambientCount: 0,
|
|
90
|
-
data: new Float32Array(
|
|
140
|
+
data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS),
|
|
91
141
|
directionalCount: 0,
|
|
92
142
|
hemisphereCount: 0,
|
|
93
143
|
pointCount: 0,
|
|
@@ -124,25 +174,77 @@ function isMeshVisible(mesh, frustum, worldBounds) {
|
|
|
124
174
|
// No cached local bounds: cannot cull, so conservatively keep the mesh.
|
|
125
175
|
return true;
|
|
126
176
|
}
|
|
127
|
-
transformAabbByMatrix4(worldBounds, bounds,
|
|
177
|
+
transformAabbByMatrix4(worldBounds, bounds, getNodeWorldMatrix4(mesh));
|
|
128
178
|
return isFrustumIntersectingAabb(frustum, worldBounds);
|
|
129
179
|
}
|
|
130
180
|
function packAmbientLight(data, ambient) {
|
|
131
181
|
unpackColorToLinear(scratchColor, ambient.color);
|
|
132
182
|
const intensity = ambient.intensity;
|
|
133
|
-
data[
|
|
134
|
-
data[
|
|
135
|
-
data[
|
|
183
|
+
data[SCENE_LIGHT_AMBIENT_RADIANCE_OFFSET + 0] = scratchColor[0] * intensity;
|
|
184
|
+
data[SCENE_LIGHT_AMBIENT_RADIANCE_OFFSET + 1] = scratchColor[1] * intensity;
|
|
185
|
+
data[SCENE_LIGHT_AMBIENT_RADIANCE_OFFSET + 2] = scratchColor[2] * intensity;
|
|
136
186
|
}
|
|
137
187
|
function packDirectionalLight(data, directional) {
|
|
138
|
-
data[0] = directional.direction.x;
|
|
139
|
-
data[1] = directional.direction.y;
|
|
140
|
-
data[2] = directional.direction.z;
|
|
188
|
+
data[SCENE_LIGHT_DIRECTIONAL_DIRECTION_OFFSET + 0] = directional.direction.x;
|
|
189
|
+
data[SCENE_LIGHT_DIRECTIONAL_DIRECTION_OFFSET + 1] = directional.direction.y;
|
|
190
|
+
data[SCENE_LIGHT_DIRECTIONAL_DIRECTION_OFFSET + 2] = directional.direction.z;
|
|
141
191
|
unpackColorToLinear(scratchColor, directional.color);
|
|
142
192
|
const intensity = directional.intensity;
|
|
143
|
-
data[
|
|
144
|
-
data[
|
|
145
|
-
data[
|
|
193
|
+
data[SCENE_LIGHT_DIRECTIONAL_RADIANCE_OFFSET + 0] = scratchColor[0] * intensity;
|
|
194
|
+
data[SCENE_LIGHT_DIRECTIONAL_RADIANCE_OFFSET + 1] = scratchColor[1] * intensity;
|
|
195
|
+
data[SCENE_LIGHT_DIRECTIONAL_RADIANCE_OFFSET + 2] = scratchColor[2] * intensity;
|
|
196
|
+
}
|
|
197
|
+
// Gradient ambient: sky radiance @+0, ground radiance @+4, world-up @+8. Both colors are premultiplied
|
|
198
|
+
// by the shared intensity. `up` is packed as world +Y so the shader blends sky/ground by dot(N, up)
|
|
199
|
+
// without the HemisphereLight type needing to carry an orientation.
|
|
200
|
+
function packHemisphereLight(data, offset, hemisphere) {
|
|
201
|
+
const intensity = hemisphere.intensity;
|
|
202
|
+
unpackColorToLinear(scratchColor, hemisphere.skyColor);
|
|
203
|
+
data[offset + 0] = scratchColor[0] * intensity;
|
|
204
|
+
data[offset + 1] = scratchColor[1] * intensity;
|
|
205
|
+
data[offset + 2] = scratchColor[2] * intensity;
|
|
206
|
+
unpackColorToLinear(scratchColor, hemisphere.groundColor);
|
|
207
|
+
data[offset + 4] = scratchColor[0] * intensity;
|
|
208
|
+
data[offset + 5] = scratchColor[1] * intensity;
|
|
209
|
+
data[offset + 6] = scratchColor[2] * intensity;
|
|
210
|
+
data[offset + 8] = 0;
|
|
211
|
+
data[offset + 9] = 1;
|
|
212
|
+
data[offset + 10] = 0;
|
|
213
|
+
}
|
|
214
|
+
// Point light: position.xyz + range @+0, radiance.rgb + invSqrRange @+4. `invSqrRange` is 1/range^2
|
|
215
|
+
// (0 for infinite range, range <= 0), the smooth inverse-square windowing factor the shader applies.
|
|
216
|
+
function packPointLight(data, offset, point) {
|
|
217
|
+
const range = point.range;
|
|
218
|
+
data[offset + 0] = point.position.x;
|
|
219
|
+
data[offset + 1] = point.position.y;
|
|
220
|
+
data[offset + 2] = point.position.z;
|
|
221
|
+
data[offset + 3] = range;
|
|
222
|
+
unpackColorToLinear(scratchColor, point.color);
|
|
223
|
+
const intensity = point.intensity;
|
|
224
|
+
data[offset + 4] = scratchColor[0] * intensity;
|
|
225
|
+
data[offset + 5] = scratchColor[1] * intensity;
|
|
226
|
+
data[offset + 6] = scratchColor[2] * intensity;
|
|
227
|
+
data[offset + 7] = range > 0 ? 1 / (range * range) : 0;
|
|
228
|
+
}
|
|
229
|
+
// Spot light: point's position+range @+0 and radiance+invSqrRange @+4, then direction.xyz @+8 and the
|
|
230
|
+
// precomputed cone cosines (inner @+12, outer @+13) the shader smoothsteps between for cone falloff.
|
|
231
|
+
function packSpotLight(data, offset, spot) {
|
|
232
|
+
const range = spot.range;
|
|
233
|
+
data[offset + 0] = spot.position.x;
|
|
234
|
+
data[offset + 1] = spot.position.y;
|
|
235
|
+
data[offset + 2] = spot.position.z;
|
|
236
|
+
data[offset + 3] = range;
|
|
237
|
+
unpackColorToLinear(scratchColor, spot.color);
|
|
238
|
+
const intensity = spot.intensity;
|
|
239
|
+
data[offset + 4] = scratchColor[0] * intensity;
|
|
240
|
+
data[offset + 5] = scratchColor[1] * intensity;
|
|
241
|
+
data[offset + 6] = scratchColor[2] * intensity;
|
|
242
|
+
data[offset + 7] = range > 0 ? 1 / (range * range) : 0;
|
|
243
|
+
data[offset + 8] = spot.direction.x;
|
|
244
|
+
data[offset + 9] = spot.direction.y;
|
|
245
|
+
data[offset + 10] = spot.direction.z;
|
|
246
|
+
data[offset + 12] = spot.innerConeCos;
|
|
247
|
+
data[offset + 13] = spot.outerConeCos;
|
|
146
248
|
}
|
|
147
249
|
// Composes the camera's view-projection (projection x view) into `out`. For a perspective camera the
|
|
148
250
|
// projection's own aspect is used when set (non-zero), else the render state's `aspect` fallback;
|
|
@@ -161,15 +263,13 @@ function setSceneViewProjectionMatrix4(out, camera, aspect) {
|
|
|
161
263
|
}
|
|
162
264
|
// Neutral viewport aspect used when a perspective camera does not carry its own.
|
|
163
265
|
const DEFAULT_VIEWPORT_ASPECT = 1;
|
|
164
|
-
// One directional ({ direction.xyz, _pad, radiance.rgb, _pad }) + one ambient ({ radiance.rgb,
|
|
165
|
-
// _pad }) = 12 floats, std140-aligned (vec4 boundaries).
|
|
166
|
-
const LIGHT_BLOCK_FLOATS = 12;
|
|
167
266
|
// Per-render-state prepared frames. Keyed by state so independent backends prepare without sharing
|
|
168
267
|
// scratch; a state's entry is freed when the state is GC'd.
|
|
169
268
|
const preparedScenes = new WeakMap();
|
|
170
269
|
const scratchColor = [0, 0, 0, 0];
|
|
171
270
|
const scratchProjection = createMatrix4();
|
|
172
271
|
// Reused staging buffer for packSceneLightBlock's pack-then-compare: the new block is packed here and
|
|
173
|
-
// committed to `out.data` only when it differs, so an unchanged block never bumps `version`.
|
|
174
|
-
|
|
272
|
+
// committed to `out.data` only when it differs, so an unchanged block never bumps `version`. Sized to
|
|
273
|
+
// the full head + MAX_FORWARD_LIGHTS-per-type layout (SCENE_LIGHT_BLOCK_FLOATS).
|
|
274
|
+
const scratchLightData = new Float32Array(SCENE_LIGHT_BLOCK_FLOATS);
|
|
175
275
|
//# sourceMappingURL=sceneRender.js.map
|
package/dist/sceneRender.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneRender.js","sourceRoot":"","sources":["../src/sceneRender.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sceneRender.js","sourceRoot":"","sources":["../src/sceneRender.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/render",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.2.1-next.410.a23f189",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/flighthq/flight.git",
|
|
7
|
+
"directory": "packages/render"
|
|
8
|
+
},
|
|
4
9
|
"type": "module",
|
|
5
10
|
"main": "dist/index.js",
|
|
6
11
|
"types": "dist/index.d.ts",
|
|
@@ -27,14 +32,18 @@
|
|
|
27
32
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
28
33
|
},
|
|
29
34
|
"dependencies": {
|
|
30
|
-
"@flighthq/
|
|
31
|
-
"@flighthq/
|
|
32
|
-
"@flighthq/
|
|
33
|
-
"@flighthq/
|
|
34
|
-
"@flighthq/
|
|
35
|
-
"@flighthq/
|
|
35
|
+
"@flighthq/color": "0.2.1-next.410.a23f189",
|
|
36
|
+
"@flighthq/entity": "0.2.1-next.410.a23f189",
|
|
37
|
+
"@flighthq/geometry": "0.2.1-next.410.a23f189",
|
|
38
|
+
"@flighthq/log": "0.2.1-next.410.a23f189",
|
|
39
|
+
"@flighthq/materials": "0.2.1-next.410.a23f189",
|
|
40
|
+
"@flighthq/node": "0.2.1-next.410.a23f189",
|
|
41
|
+
"@flighthq/signals": "0.2.1-next.410.a23f189",
|
|
42
|
+
"@flighthq/skeleton3d": "0.2.1-next.410.a23f189",
|
|
43
|
+
"@flighthq/types": "0.2.1-next.410.a23f189"
|
|
36
44
|
},
|
|
37
45
|
"devDependencies": {
|
|
46
|
+
"@flighthq/adjustments": "*",
|
|
38
47
|
"@flighthq/camera": "*",
|
|
39
48
|
"@flighthq/displayobject": "*",
|
|
40
49
|
"@flighthq/lighting": "*",
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createColorTransformAdjustment, createSaturationColorMatrix } from '@flighthq/adjustments';
|
|
2
|
+
import { createDisplayObject, setDisplayObjectColorAdjustments } from '@flighthq/displayobject';
|
|
3
|
+
import { addLogSink, createMemoryLogSink, getMemoryLogSinkEntries, removeLogSink } from '@flighthq/log';
|
|
4
|
+
import { createColorTransform } from '@flighthq/materials';
|
|
5
|
+
import type { Adjustment, Renderable } from '@flighthq/types';
|
|
6
|
+
|
|
7
|
+
import { areColorAdjustmentGuardsEnabled, enableColorAdjustmentGuards } from './enableColorAdjustmentGuards';
|
|
8
|
+
import { updateRenderProxyColorTransform } from './renderColorTransform';
|
|
9
|
+
import { createRenderProxy } from './renderProxy';
|
|
10
|
+
import { createRenderState } from './renderState';
|
|
11
|
+
|
|
12
|
+
describe('areColorAdjustmentGuardsEnabled', () => {
|
|
13
|
+
it('reports false until guards are installed, then true', () => {
|
|
14
|
+
const state = createRenderState();
|
|
15
|
+
expect(areColorAdjustmentGuardsEnabled(state)).toBe(false);
|
|
16
|
+
enableColorAdjustmentGuards(state);
|
|
17
|
+
expect(areColorAdjustmentGuardsEnabled(state)).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe('enableColorAdjustmentGuards', () => {
|
|
22
|
+
it('warns once when a node carries a non-inline-able channel-mixing adjustment', () => {
|
|
23
|
+
const state = createRenderState();
|
|
24
|
+
enableColorAdjustmentGuards(state);
|
|
25
|
+
const node = createDisplayObject();
|
|
26
|
+
const saturation: Adjustment = { kind: 'Saturation', colorMatrix: createSaturationColorMatrix(0) } as Adjustment;
|
|
27
|
+
setDisplayObjectColorAdjustments(node, [saturation]);
|
|
28
|
+
const data = createRenderProxy(state, node as unknown as Renderable);
|
|
29
|
+
const sink = createMemoryLogSink(8);
|
|
30
|
+
addLogSink(sink.sink);
|
|
31
|
+
try {
|
|
32
|
+
updateRenderProxyColorTransform(state, data);
|
|
33
|
+
const entries = getMemoryLogSinkEntries(sink);
|
|
34
|
+
expect(entries.length).toBe(1);
|
|
35
|
+
expect(String((entries[0].data as Record<string, unknown>).message)).toContain('channel-mixing');
|
|
36
|
+
} finally {
|
|
37
|
+
removeLogSink(sink.sink);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('stays silent for an affine (inline-able) color-adjustment stack', () => {
|
|
42
|
+
const state = createRenderState();
|
|
43
|
+
enableColorAdjustmentGuards(state);
|
|
44
|
+
const node = createDisplayObject();
|
|
45
|
+
setDisplayObjectColorAdjustments(node, [
|
|
46
|
+
createColorTransformAdjustment(createColorTransform({ redMultiplier: 0.5 })),
|
|
47
|
+
]);
|
|
48
|
+
const data = createRenderProxy(state, node as unknown as Renderable);
|
|
49
|
+
const sink = createMemoryLogSink(8);
|
|
50
|
+
addLogSink(sink.sink);
|
|
51
|
+
try {
|
|
52
|
+
updateRenderProxyColorTransform(state, data);
|
|
53
|
+
expect(getMemoryLogSinkEntries(sink).length).toBe(0);
|
|
54
|
+
} finally {
|
|
55
|
+
removeLogSink(sink.sink);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { createDisplayObject } from '@flighthq/displayobject';
|
|
2
|
+
import { addNodeChild } from '@flighthq/node';
|
|
3
|
+
|
|
4
|
+
import { explainDisplayObjectRender } from './explainDisplayObjectRender';
|
|
5
|
+
import { registerRenderer } from './renderer';
|
|
6
|
+
import { getRenderProxy2D, prepareDisplayObjectRender } from './renderProxy';
|
|
7
|
+
import { createRenderState, getRenderStateRuntime } from './renderState';
|
|
8
|
+
|
|
9
|
+
function makeRenderer() {
|
|
10
|
+
return { createData: () => ({ tag: 'data' }), submit: vi.fn() } as any;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
describe('explainDisplayObjectRender', () => {
|
|
14
|
+
it('reports no-renderer for a node whose kind has no registered renderer', () => {
|
|
15
|
+
const state = createRenderState();
|
|
16
|
+
const source = createDisplayObject();
|
|
17
|
+
prepareDisplayObjectRender(state, source);
|
|
18
|
+
|
|
19
|
+
const explanation = explainDisplayObjectRender(state, source);
|
|
20
|
+
|
|
21
|
+
expect(explanation.hasRenderer).toBe(false);
|
|
22
|
+
expect(explanation.reason).toBe('no-renderer');
|
|
23
|
+
expect(explanation.kind).toBe(source.kind);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('reports not-prepared for a registered node that was never prepared', () => {
|
|
27
|
+
const state = createRenderState();
|
|
28
|
+
const source = createDisplayObject();
|
|
29
|
+
registerRenderer(state, source.kind, makeRenderer());
|
|
30
|
+
|
|
31
|
+
const explanation = explainDisplayObjectRender(state, source);
|
|
32
|
+
|
|
33
|
+
expect(explanation.hasRenderer).toBe(true);
|
|
34
|
+
expect(explanation.prepared).toBe(false);
|
|
35
|
+
expect(explanation.reason).toBe('not-prepared');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('reports ok for a prepared, visible, opaque node with a renderer', () => {
|
|
39
|
+
const state = createRenderState();
|
|
40
|
+
const source = createDisplayObject();
|
|
41
|
+
registerRenderer(state, source.kind, makeRenderer());
|
|
42
|
+
prepareDisplayObjectRender(state, source);
|
|
43
|
+
|
|
44
|
+
const explanation = explainDisplayObjectRender(state, source);
|
|
45
|
+
|
|
46
|
+
expect(explanation.prepared).toBe(true);
|
|
47
|
+
expect(explanation.visible).toBe(true);
|
|
48
|
+
expect(explanation.effectiveAlpha).toBe(1);
|
|
49
|
+
expect(explanation.reason).toBe('ok');
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('reports not-visible for a hidden node', () => {
|
|
53
|
+
const state = createRenderState();
|
|
54
|
+
const source = createDisplayObject();
|
|
55
|
+
source.visible = false;
|
|
56
|
+
registerRenderer(state, source.kind, makeRenderer());
|
|
57
|
+
prepareDisplayObjectRender(state, source);
|
|
58
|
+
|
|
59
|
+
const explanation = explainDisplayObjectRender(state, source);
|
|
60
|
+
|
|
61
|
+
expect(explanation.visible).toBe(false);
|
|
62
|
+
expect(explanation.reason).toBe('not-visible');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('reports zero-alpha for a visible node whose effective alpha is zero', () => {
|
|
66
|
+
const state = createRenderState();
|
|
67
|
+
const source = createDisplayObject();
|
|
68
|
+
source.alpha = 0;
|
|
69
|
+
registerRenderer(state, source.kind, makeRenderer());
|
|
70
|
+
prepareDisplayObjectRender(state, source);
|
|
71
|
+
|
|
72
|
+
const explanation = explainDisplayObjectRender(state, source);
|
|
73
|
+
|
|
74
|
+
expect(explanation.visible).toBe(true);
|
|
75
|
+
expect(explanation.effectiveAlpha).toBe(0);
|
|
76
|
+
expect(explanation.reason).toBe('zero-alpha');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('reports not-prepared for a descendant of a hidden ancestor, since the prepare walk stops there', () => {
|
|
80
|
+
const state = createRenderState();
|
|
81
|
+
const parent = createDisplayObject();
|
|
82
|
+
const child = createDisplayObject();
|
|
83
|
+
parent.visible = false;
|
|
84
|
+
addNodeChild(parent, child);
|
|
85
|
+
registerRenderer(state, child.kind, makeRenderer());
|
|
86
|
+
prepareDisplayObjectRender(state, parent);
|
|
87
|
+
|
|
88
|
+
const explanation = explainDisplayObjectRender(state, child);
|
|
89
|
+
|
|
90
|
+
expect(explanation.prepared).toBe(false);
|
|
91
|
+
expect(explanation.reason).toBe('not-prepared');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('folds a reached ancestor alpha into the child effective alpha', () => {
|
|
95
|
+
const state = createRenderState();
|
|
96
|
+
const parent = createDisplayObject();
|
|
97
|
+
const child = createDisplayObject();
|
|
98
|
+
parent.alpha = 0.5;
|
|
99
|
+
child.alpha = 0.5;
|
|
100
|
+
addNodeChild(parent, child);
|
|
101
|
+
registerRenderer(state, child.kind, makeRenderer());
|
|
102
|
+
prepareDisplayObjectRender(state, parent);
|
|
103
|
+
|
|
104
|
+
const explanation = explainDisplayObjectRender(state, child);
|
|
105
|
+
|
|
106
|
+
expect(explanation.effectiveAlpha).toBeCloseTo(0.25);
|
|
107
|
+
expect(explanation.reason).toBe('ok');
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('does not throw or mutate state, and never creates a proxy', () => {
|
|
111
|
+
const state = createRenderState();
|
|
112
|
+
const source = createDisplayObject();
|
|
113
|
+
registerRenderer(state, source.kind, makeRenderer());
|
|
114
|
+
|
|
115
|
+
expect(() => explainDisplayObjectRender(state, source)).not.toThrow();
|
|
116
|
+
// Two calls agree and neither materialized a proxy — the query is a pure read.
|
|
117
|
+
const first = explainDisplayObjectRender(state, source);
|
|
118
|
+
const second = explainDisplayObjectRender(state, source);
|
|
119
|
+
expect(second).toEqual(first);
|
|
120
|
+
expect(getRenderProxy2D(state, source)).toBeUndefined();
|
|
121
|
+
expect(getRenderStateRuntime(state).renderProxyMap.get(source)).toBeUndefined();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('never throws on a bare edge node with no appearance fields', () => {
|
|
125
|
+
const state = createRenderState();
|
|
126
|
+
const bare = { kind: 'DisplayObject' } as any;
|
|
127
|
+
|
|
128
|
+
expect(() => explainDisplayObjectRender(state, bare)).not.toThrow();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createColorTransformAdjustment } from '@flighthq/adjustments';
|
|
2
|
+
import {
|
|
3
|
+
createDisplayObject,
|
|
4
|
+
getDisplayObjectRuntime,
|
|
5
|
+
setDisplayObjectColorAdjustments,
|
|
6
|
+
} from '@flighthq/displayobject';
|
|
7
|
+
import { createColorTransform } from '@flighthq/materials';
|
|
8
|
+
import type { Renderable } from '@flighthq/types';
|
|
9
|
+
|
|
10
|
+
import { updateRenderProxyColorTransform } from './renderColorTransform';
|
|
11
|
+
import { createRenderProxy } from './renderProxy';
|
|
12
|
+
import { createRenderState } from './renderState';
|
|
13
|
+
|
|
14
|
+
describe('updateRenderProxyColorTransform', () => {
|
|
15
|
+
it('resolves a node color-adjustment stack onto the render node as an affine ColorTransform', () => {
|
|
16
|
+
const state = createRenderState();
|
|
17
|
+
const node = createDisplayObject();
|
|
18
|
+
setDisplayObjectColorAdjustments(node, [
|
|
19
|
+
createColorTransformAdjustment(createColorTransform({ redMultiplier: 0.5, greenMultiplier: 0 })),
|
|
20
|
+
]);
|
|
21
|
+
const data = createRenderProxy(state, node as unknown as Renderable);
|
|
22
|
+
updateRenderProxyColorTransform(state, data);
|
|
23
|
+
expect(data.colorTransform).not.toBeNull();
|
|
24
|
+
expect(data.colorTransform!.redMultiplier).toBe(0.5);
|
|
25
|
+
expect(data.colorTransform!.greenMultiplier).toBe(0);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('resolves to null when the node carries no adjustments', () => {
|
|
29
|
+
const state = createRenderState();
|
|
30
|
+
const node = createDisplayObject();
|
|
31
|
+
const data = createRenderProxy(state, node as unknown as Renderable);
|
|
32
|
+
updateRenderProxyColorTransform(state, data);
|
|
33
|
+
expect(data.colorTransform).toBeNull();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('reads the cache the accessor fused once (the walk never re-fuses)', () => {
|
|
37
|
+
const state = createRenderState();
|
|
38
|
+
const node = createDisplayObject();
|
|
39
|
+
setDisplayObjectColorAdjustments(node, [
|
|
40
|
+
createColorTransformAdjustment(createColorTransform({ redMultiplier: 0.25 })),
|
|
41
|
+
]);
|
|
42
|
+
// The set-accessor fused the stack once; the runtime already holds the cached resolved value.
|
|
43
|
+
const cached = getDisplayObjectRuntime(node).resolvedColorTransform;
|
|
44
|
+
expect(cached).not.toBeNull();
|
|
45
|
+
const data = createRenderProxy(state, node as unknown as Renderable);
|
|
46
|
+
updateRenderProxyColorTransform(state, data);
|
|
47
|
+
expect(data.colorTransform).toBe(cached);
|
|
48
|
+
updateRenderProxyColorTransform(state, data);
|
|
49
|
+
expect(data.colorTransform).toBe(cached);
|
|
50
|
+
});
|
|
51
|
+
});
|
package/src/sceneRender.test.ts
CHANGED
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
import { createCamera, createPerspectiveProjection, setCameraViewMatrix4FromLookAt } from '@flighthq/camera';
|
|
2
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
3
|
import { createAabb } from '@flighthq/geometry';
|
|
3
|
-
import {
|
|
4
|
-
|
|
4
|
+
import {
|
|
5
|
+
createAmbientLight,
|
|
6
|
+
createDirectionalLight,
|
|
7
|
+
createHemisphereLight,
|
|
8
|
+
createPointLight,
|
|
9
|
+
createSpotLight,
|
|
10
|
+
} from '@flighthq/lighting';
|
|
5
11
|
import { computeMeshGeometryBounds, createBoxMeshGeometry } from '@flighthq/mesh';
|
|
6
12
|
import { addNodeChild, invalidateNodeLocalTransform } from '@flighthq/node';
|
|
7
|
-
import { createMesh,
|
|
13
|
+
import { createMesh, createSceneNode, SceneNodeKind, getSceneNodeWorldAlpha } from '@flighthq/scene';
|
|
8
14
|
import type { Camera, Material, MeshGeometry, SceneLightBlock, SceneLights } from '@flighthq/types';
|
|
15
|
+
import {
|
|
16
|
+
SCENE_LIGHT_BLOCK_FLOATS,
|
|
17
|
+
SCENE_LIGHT_HEMISPHERE_OFFSET,
|
|
18
|
+
SCENE_LIGHT_POINT_OFFSET,
|
|
19
|
+
SCENE_LIGHT_SPOT_OFFSET,
|
|
20
|
+
} from '@flighthq/types';
|
|
9
21
|
import { describe, expect, it } from 'vitest';
|
|
10
22
|
|
|
11
23
|
import { createRenderState } from './renderState';
|
|
@@ -36,7 +48,7 @@ function emptyLights(): SceneLights {
|
|
|
36
48
|
function newLightBlock(): SceneLightBlock {
|
|
37
49
|
return {
|
|
38
50
|
ambientCount: 0,
|
|
39
|
-
data: new Float32Array(
|
|
51
|
+
data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS),
|
|
40
52
|
directionalCount: 0,
|
|
41
53
|
hemisphereCount: 0,
|
|
42
54
|
pointCount: 0,
|
|
@@ -107,12 +119,95 @@ describe('packSceneLightBlock', () => {
|
|
|
107
119
|
expect(block.data[8]).toBeLessThan(0x80 / 0xff);
|
|
108
120
|
expect(block.data[8]).toBeGreaterThan(0);
|
|
109
121
|
});
|
|
122
|
+
|
|
123
|
+
it('packs point lights: position + range, and linear radiance + inverse-square range', () => {
|
|
124
|
+
const block = newLightBlock();
|
|
125
|
+
const point = createPointLight({ color: 0xffffffff, intensity: 3, position: { x: 1, y: 2, z: 3 }, range: 10 });
|
|
126
|
+
packSceneLightBlock(block, { ambient: null, directional: null, point: [point] });
|
|
127
|
+
expect(block.pointCount).toBe(1);
|
|
128
|
+
const o = SCENE_LIGHT_POINT_OFFSET;
|
|
129
|
+
expect(block.data[o + 0]).toBeCloseTo(1);
|
|
130
|
+
expect(block.data[o + 1]).toBeCloseTo(2);
|
|
131
|
+
expect(block.data[o + 2]).toBeCloseTo(3);
|
|
132
|
+
expect(block.data[o + 3]).toBeCloseTo(10);
|
|
133
|
+
const expected = unpackColorToLinear([0, 0, 0, 0], 0xffffffff);
|
|
134
|
+
expect(block.data[o + 4]).toBeCloseTo(expected[0] * 3);
|
|
135
|
+
expect(block.data[o + 7]).toBeCloseTo(1 / (10 * 10));
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('packs an infinite-range point light with invSqrRange 0 (no cutoff)', () => {
|
|
139
|
+
const block = newLightBlock();
|
|
140
|
+
const point = createPointLight({ range: -1 });
|
|
141
|
+
packSceneLightBlock(block, { ambient: null, directional: null, point: [point] });
|
|
142
|
+
expect(block.data[SCENE_LIGHT_POINT_OFFSET + 3]).toBeCloseTo(-1);
|
|
143
|
+
expect(block.data[SCENE_LIGHT_POINT_OFFSET + 7]).toBe(0);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('packs spot lights: point record plus direction and the precomputed cone cosines', () => {
|
|
147
|
+
const block = newLightBlock();
|
|
148
|
+
const spot = createSpotLight({
|
|
149
|
+
direction: { x: 0, y: -1, z: 0 },
|
|
150
|
+
innerConeDegrees: 10,
|
|
151
|
+
outerConeDegrees: 30,
|
|
152
|
+
position: { x: 4, y: 5, z: 6 },
|
|
153
|
+
});
|
|
154
|
+
packSceneLightBlock(block, { ambient: null, directional: null, spot: [spot] });
|
|
155
|
+
expect(block.spotCount).toBe(1);
|
|
156
|
+
const o = SCENE_LIGHT_SPOT_OFFSET;
|
|
157
|
+
expect(block.data[o + 0]).toBeCloseTo(4);
|
|
158
|
+
expect(block.data[o + 8]).toBeCloseTo(0);
|
|
159
|
+
expect(block.data[o + 9]).toBeCloseTo(-1);
|
|
160
|
+
expect(block.data[o + 10]).toBeCloseTo(0);
|
|
161
|
+
expect(block.data[o + 12]).toBeCloseTo(spot.innerConeCos);
|
|
162
|
+
expect(block.data[o + 13]).toBeCloseTo(spot.outerConeCos);
|
|
163
|
+
// Inner cone (smaller angle) has the larger cosine.
|
|
164
|
+
expect(block.data[o + 12]).toBeGreaterThan(block.data[o + 13]);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('packs hemisphere lights: sky, ground, and packed world-up', () => {
|
|
168
|
+
const block = newLightBlock();
|
|
169
|
+
const hemisphere = createHemisphereLight({ groundColor: 0x000000ff, intensity: 2, skyColor: 0xffffffff });
|
|
170
|
+
packSceneLightBlock(block, { ambient: null, directional: null, hemisphere: [hemisphere] });
|
|
171
|
+
expect(block.hemisphereCount).toBe(1);
|
|
172
|
+
const o = SCENE_LIGHT_HEMISPHERE_OFFSET;
|
|
173
|
+
const sky = unpackColorToLinear([0, 0, 0, 0], 0xffffffff);
|
|
174
|
+
expect(block.data[o + 0]).toBeCloseTo(sky[0] * 2);
|
|
175
|
+
expect(block.data[o + 4]).toBeCloseTo(0);
|
|
176
|
+
// Packed world-up (0, 1, 0).
|
|
177
|
+
expect(block.data[o + 8]).toBeCloseTo(0);
|
|
178
|
+
expect(block.data[o + 9]).toBeCloseTo(1);
|
|
179
|
+
expect(block.data[o + 10]).toBeCloseTo(0);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('caps each punctual array at MAX_FORWARD_LIGHTS', () => {
|
|
183
|
+
const block = newLightBlock();
|
|
184
|
+
const many = Array.from({ length: 9 }, () => createPointLight());
|
|
185
|
+
packSceneLightBlock(block, { ambient: null, directional: null, point: many });
|
|
186
|
+
expect(block.pointCount).toBe(4);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it('reports zero counts for empty punctual arrays', () => {
|
|
190
|
+
const block = newLightBlock();
|
|
191
|
+
packSceneLightBlock(block, { ambient: null, directional: null, hemisphere: [], point: [], spot: [] });
|
|
192
|
+
expect(block.pointCount).toBe(0);
|
|
193
|
+
expect(block.spotCount).toBe(0);
|
|
194
|
+
expect(block.hemisphereCount).toBe(0);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('does not bump version when re-packed with identical punctual lights', () => {
|
|
198
|
+
const block = newLightBlock();
|
|
199
|
+
const lights = { ambient: null, directional: null, point: [createPointLight({ range: 5 })] };
|
|
200
|
+
packSceneLightBlock(block, lights);
|
|
201
|
+
const v = block.version;
|
|
202
|
+
packSceneLightBlock(block, lights);
|
|
203
|
+
expect(block.version).toBe(v);
|
|
204
|
+
});
|
|
110
205
|
});
|
|
111
206
|
|
|
112
207
|
describe('prepareSceneRender', () => {
|
|
113
208
|
it('returns the lit, view-projected frame with the visible mesh', () => {
|
|
114
209
|
const state = createRenderState();
|
|
115
|
-
const scene =
|
|
210
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
116
211
|
const mesh = createMesh(boundedBox(), [null]);
|
|
117
212
|
addNodeChild(scene, mesh);
|
|
118
213
|
|
|
@@ -129,7 +224,7 @@ describe('prepareSceneRender', () => {
|
|
|
129
224
|
|
|
130
225
|
it('computes a non-identity view-projection', () => {
|
|
131
226
|
const state = createRenderState();
|
|
132
|
-
const scene =
|
|
227
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
133
228
|
const list = prepareSceneRender(state, scene, frontCamera(), emptyLights());
|
|
134
229
|
// A perspective view-projection is not the identity matrix.
|
|
135
230
|
expect(list.viewProjection.m[15]).not.toBe(1);
|
|
@@ -137,9 +232,9 @@ describe('prepareSceneRender', () => {
|
|
|
137
232
|
|
|
138
233
|
it('culls a mesh placed far behind the camera', () => {
|
|
139
234
|
const state = createRenderState();
|
|
140
|
-
const scene =
|
|
235
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
141
236
|
const mesh = createMesh(boundedBox(), [null]);
|
|
142
|
-
mesh.
|
|
237
|
+
mesh.position.z = 1000;
|
|
143
238
|
invalidateNodeLocalTransform(mesh);
|
|
144
239
|
addNodeChild(scene, mesh);
|
|
145
240
|
|
|
@@ -149,10 +244,10 @@ describe('prepareSceneRender', () => {
|
|
|
149
244
|
|
|
150
245
|
it('keeps a mesh whose geometry has no cached bounds', () => {
|
|
151
246
|
const state = createRenderState();
|
|
152
|
-
const scene =
|
|
247
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
153
248
|
const mesh = createMesh(createBoxMeshGeometry(), [null]);
|
|
154
249
|
mesh.geometry.bounds = null;
|
|
155
|
-
mesh.
|
|
250
|
+
mesh.position.z = 1000;
|
|
156
251
|
invalidateNodeLocalTransform(mesh);
|
|
157
252
|
addNodeChild(scene, mesh);
|
|
158
253
|
|
|
@@ -162,8 +257,21 @@ describe('prepareSceneRender', () => {
|
|
|
162
257
|
|
|
163
258
|
it('skips disabled subtrees', () => {
|
|
164
259
|
const state = createRenderState();
|
|
165
|
-
const scene =
|
|
166
|
-
const group =
|
|
260
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
261
|
+
const group = createSceneNode(SceneNodeKind, { enabled: false });
|
|
262
|
+
const mesh = createMesh(boundedBox(), [null]);
|
|
263
|
+
addNodeChild(group, mesh);
|
|
264
|
+
addNodeChild(scene, group);
|
|
265
|
+
|
|
266
|
+
const list = prepareSceneRender(state, scene, frontCamera(), emptyLights());
|
|
267
|
+
expect(list.meshCount).toBe(0);
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('skips a hidden subtree (visible=false propagates to descendants)', () => {
|
|
271
|
+
const state = createRenderState();
|
|
272
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
273
|
+
const group = createSceneNode(SceneNodeKind);
|
|
274
|
+
group.visible = false;
|
|
167
275
|
const mesh = createMesh(boundedBox(), [null]);
|
|
168
276
|
addNodeChild(group, mesh);
|
|
169
277
|
addNodeChild(scene, group);
|
|
@@ -174,12 +282,12 @@ describe('prepareSceneRender', () => {
|
|
|
174
282
|
|
|
175
283
|
it('resolves world transforms through nested groups', () => {
|
|
176
284
|
const state = createRenderState();
|
|
177
|
-
const scene =
|
|
178
|
-
const group =
|
|
285
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
286
|
+
const group = createSceneNode(SceneNodeKind);
|
|
179
287
|
const mesh = createMesh(boundedBox(), [null]);
|
|
180
288
|
addNodeChild(group, mesh);
|
|
181
289
|
addNodeChild(scene, group);
|
|
182
|
-
group.
|
|
290
|
+
group.position.x = 1;
|
|
183
291
|
invalidateNodeLocalTransform(group);
|
|
184
292
|
|
|
185
293
|
const list = prepareSceneRender(state, scene, frontCamera(), emptyLights());
|
|
@@ -187,9 +295,26 @@ describe('prepareSceneRender', () => {
|
|
|
187
295
|
expect(list.visibleMeshes[0]).toBe(mesh);
|
|
188
296
|
});
|
|
189
297
|
|
|
298
|
+
it('folds parent x self alpha into each node resolved worldAlpha', () => {
|
|
299
|
+
const state = createRenderState();
|
|
300
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
301
|
+
const group = createSceneNode(SceneNodeKind);
|
|
302
|
+
const mesh = createMesh(boundedBox(), [null]);
|
|
303
|
+
addNodeChild(group, mesh);
|
|
304
|
+
addNodeChild(scene, group);
|
|
305
|
+
scene.alpha = 0.5;
|
|
306
|
+
group.alpha = 0.5;
|
|
307
|
+
mesh.alpha = 0.5;
|
|
308
|
+
|
|
309
|
+
prepareSceneRender(state, scene, frontCamera(), emptyLights());
|
|
310
|
+
expect(getSceneNodeWorldAlpha(scene)).toBeCloseTo(0.5);
|
|
311
|
+
expect(getSceneNodeWorldAlpha(group)).toBeCloseTo(0.25);
|
|
312
|
+
expect(getSceneNodeWorldAlpha(mesh)).toBeCloseTo(0.125);
|
|
313
|
+
});
|
|
314
|
+
|
|
190
315
|
it('reuses the same list per render state across calls', () => {
|
|
191
316
|
const state = createRenderState();
|
|
192
|
-
const scene =
|
|
317
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
193
318
|
const first = prepareSceneRender(state, scene, frontCamera(), emptyLights());
|
|
194
319
|
const second = prepareSceneRender(state, scene, frontCamera(), emptyLights());
|
|
195
320
|
expect(second).toBe(first);
|
|
@@ -197,7 +322,7 @@ describe('prepareSceneRender', () => {
|
|
|
197
322
|
|
|
198
323
|
it('honors a positional material on a mesh', () => {
|
|
199
324
|
const state = createRenderState();
|
|
200
|
-
const scene =
|
|
325
|
+
const scene = createSceneNode(SceneNodeKind);
|
|
201
326
|
const material = { kind: 'TestMaterial' } as unknown as Material;
|
|
202
327
|
const mesh = createMesh(boundedBox(), [material]);
|
|
203
328
|
addNodeChild(scene, mesh);
|