@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.
Files changed (36) hide show
  1. package/dist/enableColorAdjustmentGuards.d.ts +4 -0
  2. package/dist/enableColorAdjustmentGuards.d.ts.map +1 -0
  3. package/dist/enableColorAdjustmentGuards.js +22 -0
  4. package/dist/enableColorAdjustmentGuards.js.map +1 -0
  5. package/dist/explainDisplayObjectRender.d.ts +12 -0
  6. package/dist/explainDisplayObjectRender.d.ts.map +1 -0
  7. package/dist/explainDisplayObjectRender.js +40 -0
  8. package/dist/explainDisplayObjectRender.js.map +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/renderAppearance.d.ts.map +1 -1
  14. package/dist/renderAppearance.js.map +1 -1
  15. package/dist/renderColorTransform.d.ts +3 -0
  16. package/dist/renderColorTransform.d.ts.map +1 -0
  17. package/dist/renderColorTransform.js +21 -0
  18. package/dist/renderColorTransform.js.map +1 -0
  19. package/dist/renderProxy.d.ts.map +1 -1
  20. package/dist/renderProxy.js +5 -2
  21. package/dist/renderProxy.js.map +1 -1
  22. package/dist/renderState.d.ts.map +1 -1
  23. package/dist/renderState.js +1 -0
  24. package/dist/renderState.js.map +1 -1
  25. package/dist/renderTarget.js +2 -2
  26. package/dist/renderTarget.js.map +1 -1
  27. package/dist/renderTransform2d.js +2 -2
  28. package/dist/renderTransform2d.js.map +1 -1
  29. package/dist/sceneRender.d.ts.map +1 -1
  30. package/dist/sceneRender.js +125 -25
  31. package/dist/sceneRender.js.map +1 -1
  32. package/package.json +16 -7
  33. package/src/enableColorAdjustmentGuards.test.ts +58 -0
  34. package/src/explainDisplayObjectRender.test.ts +130 -0
  35. package/src/renderColorTransform.test.ts +51 -0
  36. 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';
@@ -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,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"}
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,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"}
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,3 @@
1
+ import type { RenderProxy, RenderState } from '@flighthq/types';
2
+ export declare function updateRenderProxyColorTransform(state: RenderState, data: RenderProxy, _parentData?: RenderProxy): void;
3
+ //# sourceMappingURL=renderColorTransform.d.ts.map
@@ -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;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"}
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"}
@@ -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, then the clip nesting
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);
@@ -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,CAU7D;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,kBAAkB,CAE5E"}
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"}
@@ -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();
@@ -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"}
@@ -1,12 +1,12 @@
1
1
  import { createMatrix, inverseMatrix, multiplyMatrix } from '@flighthq/geometry';
2
- import { getNodeLocalTransformMatrix } from '@flighthq/node';
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 = getNodeLocalTransformMatrix(source);
9
+ const localTransform = getNodeLocalMatrix(source);
10
10
  inverseMatrix(_tempInvLocal, localTransform);
11
11
  _tempTranslation.a = 1;
12
12
  _tempTranslation.b = 0;
@@ -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,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAQ7D;;;;GAIG;AACH,MAAM,UAAU,yCAAyC,CACvD,kBAA8B,EAC9B,MAAqB,EACrB,MAA+B,EAC/B,WAAmB,CAAC,EACpB,WAAmB,CAAC;IAEpB,MAAM,cAAc,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAC3D,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
+ {"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 { getNodeLocalTransformMatrix, getNodeLocalTransformRevision } from '@flighthq/node';
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 = getNodeLocalTransformMatrix(data.source);
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,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAG5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,UAAU,4BAA4B,CAC1C,KAAkB,EAClB,IAAmB,EACnB,UAA0B;IAE1B,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAc,CAAC,CAAC;IAC5E,MAAM,WAAW,GACf,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,gBAAgB,KAAK,qBAAqB,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;IAC1G,MAAM,UAAU,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,2BAA2B,CAAC,IAAI,CAAC,MAA+B,CAAC,CAAC;IACtF,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
+ {"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":"AAcA,OAAO,KAAK,EAGV,MAAM,EAMN,WAAW,EACX,eAAe,EACf,WAAW,EACX,SAAS,EACT,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAazB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CA6B7F;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,CAiBjB"}
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"}
@@ -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 { unpackColorToLinear } from '@flighthq/materials';
3
- import { getNodeRuntime, getNodeWorldTransformMatrix4 } from '@flighthq/node';
4
- // Packs the directional + ambient draw-arg lights into `out` (the GPU-ready light block), converting
5
- // each packed sRgb color to linear, premultiplied radiance (unpackColorToLinear(color) * intensity)
6
- // so the shader never sees sRgb. Sets the presence counts (0 or 1 each). The float layout matches the
7
- // shader's std140 light block: directional { direction.xyz, _pad, radiance.rgb, _pad } then ambient
8
- // { radiance.rgb, _pad }. An absent term leaves its slots zeroed.
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 worldMatrix (parentWorld x localMatrix, resolved lazily on the node runtime and
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
- if (!node.enabled) {
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(LIGHT_BLOCK_FLOATS),
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, getNodeWorldTransformMatrix4(mesh));
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[8] = scratchColor[0] * intensity;
134
- data[9] = scratchColor[1] * intensity;
135
- data[10] = scratchColor[2] * intensity;
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[4] = scratchColor[0] * intensity;
144
- data[5] = scratchColor[1] * intensity;
145
- data[6] = scratchColor[2] * intensity;
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
- const scratchLightData = new Float32Array(LIGHT_BLOCK_FLOATS);
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
@@ -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.0",
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/entity": "0.1.0",
31
- "@flighthq/geometry": "0.1.0",
32
- "@flighthq/materials": "0.1.0",
33
- "@flighthq/node": "0.1.0",
34
- "@flighthq/signals": "0.1.0",
35
- "@flighthq/types": "0.1.0"
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
+ });
@@ -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 { createAmbientLight, createDirectionalLight } from '@flighthq/lighting';
4
- import { unpackColorToLinear } from '@flighthq/materials';
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, createScene } from '@flighthq/scene';
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(12),
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 = createScene();
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 = createScene();
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 = createScene();
235
+ const scene = createSceneNode(SceneNodeKind);
141
236
  const mesh = createMesh(boundedBox(), [null]);
142
- mesh.localMatrix.m[14] = 1000;
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 = createScene();
247
+ const scene = createSceneNode(SceneNodeKind);
153
248
  const mesh = createMesh(createBoxMeshGeometry(), [null]);
154
249
  mesh.geometry.bounds = null;
155
- mesh.localMatrix.m[14] = 1000;
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 = createScene();
166
- const group = createScene({ enabled: false });
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 = createScene();
178
- const group = createScene();
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.localMatrix.m[12] = 1;
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 = createScene();
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 = createScene();
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);