@flighthq/render 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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/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/sceneRender.d.ts.map +1 -1
- package/dist/sceneRender.js +102 -20
- package/dist/sceneRender.js.map +1 -1
- package/package.json +14 -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 +97 -2
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneRender.d.ts","sourceRoot":"","sources":["../src/sceneRender.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGV,MAAM,
|
|
1
|
+
{"version":3,"file":"sceneRender.d.ts","sourceRoot":"","sources":["../src/sceneRender.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGV,MAAM,EAQN,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,CAiBjB"}
|
package/dist/sceneRender.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { createAabb, createFrustum, createMatrix4, isFrustumIntersectingAabb, multiplyMatrix4, setFrustumFromMatrix4, setOrthographicMatrix4, setPerspectiveMatrix4, transformAabbByMatrix4, } from '@flighthq/geometry';
|
|
2
2
|
import { unpackColorToLinear } from '@flighthq/materials';
|
|
3
3
|
import { getNodeRuntime, getNodeWorldTransformMatrix4 } from '@flighthq/node';
|
|
4
|
-
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
4
|
+
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';
|
|
5
|
+
// Packs the directional + ambient + punctual (point/spot/hemisphere) draw-arg lights into `out` (the
|
|
6
|
+
// GPU-ready light block), converting each packed sRgb color to linear, premultiplied radiance
|
|
7
|
+
// (unpackColorToLinear(color) * intensity) so the shader never sees sRgb. Sets every presence count
|
|
8
|
+
// (directional/ambient 0..1, point/spot/hemisphere 0..MAX_FORWARD_LIGHTS). The float layout matches
|
|
9
|
+
// the shader's std140 light block exactly (SCENE_LIGHT_* offsets/strides in @flighthq/types); absent
|
|
10
|
+
// terms and unused array slots stay zeroed. Punctual arrays beyond MAX_FORWARD_LIGHTS are dropped.
|
|
9
11
|
//
|
|
10
12
|
// `version` bumps only when the packed data or counts actually change from the previous pack — a
|
|
11
13
|
// no-op re-pack of identical lights leaves it untouched. This is the SceneLightBlock contract a
|
|
@@ -26,14 +28,44 @@ export function packSceneLightBlock(out, lights) {
|
|
|
26
28
|
packAmbientLight(scratchLightData, ambient);
|
|
27
29
|
ambientCount = 1;
|
|
28
30
|
}
|
|
31
|
+
let pointCount = 0;
|
|
32
|
+
const point = lights.point;
|
|
33
|
+
if (point !== undefined) {
|
|
34
|
+
pointCount = Math.min(point.length, MAX_FORWARD_LIGHTS);
|
|
35
|
+
for (let i = 0; i < pointCount; i++) {
|
|
36
|
+
packPointLight(scratchLightData, SCENE_LIGHT_POINT_OFFSET + i * SCENE_LIGHT_POINT_STRIDE, point[i]);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
let spotCount = 0;
|
|
40
|
+
const spot = lights.spot;
|
|
41
|
+
if (spot !== undefined) {
|
|
42
|
+
spotCount = Math.min(spot.length, MAX_FORWARD_LIGHTS);
|
|
43
|
+
for (let i = 0; i < spotCount; i++) {
|
|
44
|
+
packSpotLight(scratchLightData, SCENE_LIGHT_SPOT_OFFSET + i * SCENE_LIGHT_SPOT_STRIDE, spot[i]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
let hemisphereCount = 0;
|
|
48
|
+
const hemisphere = lights.hemisphere;
|
|
49
|
+
if (hemisphere !== undefined) {
|
|
50
|
+
hemisphereCount = Math.min(hemisphere.length, MAX_FORWARD_LIGHTS);
|
|
51
|
+
for (let i = 0; i < hemisphereCount; i++) {
|
|
52
|
+
packHemisphereLight(scratchLightData, SCENE_LIGHT_HEMISPHERE_OFFSET + i * SCENE_LIGHT_HEMISPHERE_STRIDE, hemisphere[i]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
29
55
|
if (out.directionalCount === directionalCount &&
|
|
30
56
|
out.ambientCount === ambientCount &&
|
|
57
|
+
out.pointCount === pointCount &&
|
|
58
|
+
out.spotCount === spotCount &&
|
|
59
|
+
out.hemisphereCount === hemisphereCount &&
|
|
31
60
|
isFloat32ArrayEqual(out.data, scratchLightData)) {
|
|
32
61
|
return;
|
|
33
62
|
}
|
|
34
63
|
out.data.set(scratchLightData);
|
|
35
64
|
out.directionalCount = directionalCount;
|
|
36
65
|
out.ambientCount = ambientCount;
|
|
66
|
+
out.pointCount = pointCount;
|
|
67
|
+
out.spotCount = spotCount;
|
|
68
|
+
out.hemisphereCount = hemisphereCount;
|
|
37
69
|
out.version++;
|
|
38
70
|
}
|
|
39
71
|
// The per-frame preparation pass for a 3D scene, the 3D analog of prepareDisplayObjectRender. It is
|
|
@@ -87,7 +119,7 @@ function ensurePreparedScene(state) {
|
|
|
87
119
|
const list = {
|
|
88
120
|
lights: {
|
|
89
121
|
ambientCount: 0,
|
|
90
|
-
data: new Float32Array(
|
|
122
|
+
data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS),
|
|
91
123
|
directionalCount: 0,
|
|
92
124
|
hemisphereCount: 0,
|
|
93
125
|
pointCount: 0,
|
|
@@ -130,19 +162,71 @@ function isMeshVisible(mesh, frustum, worldBounds) {
|
|
|
130
162
|
function packAmbientLight(data, ambient) {
|
|
131
163
|
unpackColorToLinear(scratchColor, ambient.color);
|
|
132
164
|
const intensity = ambient.intensity;
|
|
133
|
-
data[
|
|
134
|
-
data[
|
|
135
|
-
data[
|
|
165
|
+
data[SCENE_LIGHT_AMBIENT_RADIANCE_OFFSET + 0] = scratchColor[0] * intensity;
|
|
166
|
+
data[SCENE_LIGHT_AMBIENT_RADIANCE_OFFSET + 1] = scratchColor[1] * intensity;
|
|
167
|
+
data[SCENE_LIGHT_AMBIENT_RADIANCE_OFFSET + 2] = scratchColor[2] * intensity;
|
|
136
168
|
}
|
|
137
169
|
function packDirectionalLight(data, directional) {
|
|
138
|
-
data[0] = directional.direction.x;
|
|
139
|
-
data[1] = directional.direction.y;
|
|
140
|
-
data[2] = directional.direction.z;
|
|
170
|
+
data[SCENE_LIGHT_DIRECTIONAL_DIRECTION_OFFSET + 0] = directional.direction.x;
|
|
171
|
+
data[SCENE_LIGHT_DIRECTIONAL_DIRECTION_OFFSET + 1] = directional.direction.y;
|
|
172
|
+
data[SCENE_LIGHT_DIRECTIONAL_DIRECTION_OFFSET + 2] = directional.direction.z;
|
|
141
173
|
unpackColorToLinear(scratchColor, directional.color);
|
|
142
174
|
const intensity = directional.intensity;
|
|
143
|
-
data[
|
|
144
|
-
data[
|
|
145
|
-
data[
|
|
175
|
+
data[SCENE_LIGHT_DIRECTIONAL_RADIANCE_OFFSET + 0] = scratchColor[0] * intensity;
|
|
176
|
+
data[SCENE_LIGHT_DIRECTIONAL_RADIANCE_OFFSET + 1] = scratchColor[1] * intensity;
|
|
177
|
+
data[SCENE_LIGHT_DIRECTIONAL_RADIANCE_OFFSET + 2] = scratchColor[2] * intensity;
|
|
178
|
+
}
|
|
179
|
+
// Gradient ambient: sky radiance @+0, ground radiance @+4, world-up @+8. Both colors are premultiplied
|
|
180
|
+
// by the shared intensity. `up` is packed as world +Y so the shader blends sky/ground by dot(N, up)
|
|
181
|
+
// without the HemisphereLight type needing to carry an orientation.
|
|
182
|
+
function packHemisphereLight(data, offset, hemisphere) {
|
|
183
|
+
const intensity = hemisphere.intensity;
|
|
184
|
+
unpackColorToLinear(scratchColor, hemisphere.skyColor);
|
|
185
|
+
data[offset + 0] = scratchColor[0] * intensity;
|
|
186
|
+
data[offset + 1] = scratchColor[1] * intensity;
|
|
187
|
+
data[offset + 2] = scratchColor[2] * intensity;
|
|
188
|
+
unpackColorToLinear(scratchColor, hemisphere.groundColor);
|
|
189
|
+
data[offset + 4] = scratchColor[0] * intensity;
|
|
190
|
+
data[offset + 5] = scratchColor[1] * intensity;
|
|
191
|
+
data[offset + 6] = scratchColor[2] * intensity;
|
|
192
|
+
data[offset + 8] = 0;
|
|
193
|
+
data[offset + 9] = 1;
|
|
194
|
+
data[offset + 10] = 0;
|
|
195
|
+
}
|
|
196
|
+
// Point light: position.xyz + range @+0, radiance.rgb + invSqrRange @+4. `invSqrRange` is 1/range^2
|
|
197
|
+
// (0 for infinite range, range <= 0), the smooth inverse-square windowing factor the shader applies.
|
|
198
|
+
function packPointLight(data, offset, point) {
|
|
199
|
+
const range = point.range;
|
|
200
|
+
data[offset + 0] = point.position.x;
|
|
201
|
+
data[offset + 1] = point.position.y;
|
|
202
|
+
data[offset + 2] = point.position.z;
|
|
203
|
+
data[offset + 3] = range;
|
|
204
|
+
unpackColorToLinear(scratchColor, point.color);
|
|
205
|
+
const intensity = point.intensity;
|
|
206
|
+
data[offset + 4] = scratchColor[0] * intensity;
|
|
207
|
+
data[offset + 5] = scratchColor[1] * intensity;
|
|
208
|
+
data[offset + 6] = scratchColor[2] * intensity;
|
|
209
|
+
data[offset + 7] = range > 0 ? 1 / (range * range) : 0;
|
|
210
|
+
}
|
|
211
|
+
// Spot light: point's position+range @+0 and radiance+invSqrRange @+4, then direction.xyz @+8 and the
|
|
212
|
+
// precomputed cone cosines (inner @+12, outer @+13) the shader smoothsteps between for cone falloff.
|
|
213
|
+
function packSpotLight(data, offset, spot) {
|
|
214
|
+
const range = spot.range;
|
|
215
|
+
data[offset + 0] = spot.position.x;
|
|
216
|
+
data[offset + 1] = spot.position.y;
|
|
217
|
+
data[offset + 2] = spot.position.z;
|
|
218
|
+
data[offset + 3] = range;
|
|
219
|
+
unpackColorToLinear(scratchColor, spot.color);
|
|
220
|
+
const intensity = spot.intensity;
|
|
221
|
+
data[offset + 4] = scratchColor[0] * intensity;
|
|
222
|
+
data[offset + 5] = scratchColor[1] * intensity;
|
|
223
|
+
data[offset + 6] = scratchColor[2] * intensity;
|
|
224
|
+
data[offset + 7] = range > 0 ? 1 / (range * range) : 0;
|
|
225
|
+
data[offset + 8] = spot.direction.x;
|
|
226
|
+
data[offset + 9] = spot.direction.y;
|
|
227
|
+
data[offset + 10] = spot.direction.z;
|
|
228
|
+
data[offset + 12] = spot.innerConeCos;
|
|
229
|
+
data[offset + 13] = spot.outerConeCos;
|
|
146
230
|
}
|
|
147
231
|
// Composes the camera's view-projection (projection x view) into `out`. For a perspective camera the
|
|
148
232
|
// projection's own aspect is used when set (non-zero), else the render state's `aspect` fallback;
|
|
@@ -161,15 +245,13 @@ function setSceneViewProjectionMatrix4(out, camera, aspect) {
|
|
|
161
245
|
}
|
|
162
246
|
// Neutral viewport aspect used when a perspective camera does not carry its own.
|
|
163
247
|
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
248
|
// Per-render-state prepared frames. Keyed by state so independent backends prepare without sharing
|
|
168
249
|
// scratch; a state's entry is freed when the state is GC'd.
|
|
169
250
|
const preparedScenes = new WeakMap();
|
|
170
251
|
const scratchColor = [0, 0, 0, 0];
|
|
171
252
|
const scratchProjection = createMatrix4();
|
|
172
253
|
// 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
|
-
|
|
254
|
+
// committed to `out.data` only when it differs, so an unchanged block never bumps `version`. Sized to
|
|
255
|
+
// the full head + MAX_FORWARD_LIGHTS-per-type layout (SCENE_LIGHT_BLOCK_FLOATS).
|
|
256
|
+
const scratchLightData = new Float32Array(SCENE_LIGHT_BLOCK_FLOATS);
|
|
175
257
|
//# 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.
|
|
3
|
+
"version": "0.2.0",
|
|
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,16 @@
|
|
|
27
32
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
28
33
|
},
|
|
29
34
|
"dependencies": {
|
|
30
|
-
"@flighthq/entity": "0.
|
|
31
|
-
"@flighthq/geometry": "0.
|
|
32
|
-
"@flighthq/
|
|
33
|
-
"@flighthq/
|
|
34
|
-
"@flighthq/
|
|
35
|
-
"@flighthq/
|
|
35
|
+
"@flighthq/entity": "0.2.0",
|
|
36
|
+
"@flighthq/geometry": "0.2.0",
|
|
37
|
+
"@flighthq/log": "0.2.0",
|
|
38
|
+
"@flighthq/materials": "0.2.0",
|
|
39
|
+
"@flighthq/node": "0.2.0",
|
|
40
|
+
"@flighthq/signals": "0.2.0",
|
|
41
|
+
"@flighthq/types": "0.2.0"
|
|
36
42
|
},
|
|
37
43
|
"devDependencies": {
|
|
44
|
+
"@flighthq/adjustments": "*",
|
|
38
45
|
"@flighthq/camera": "*",
|
|
39
46
|
"@flighthq/displayobject": "*",
|
|
40
47
|
"@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
2
|
import { createAabb } from '@flighthq/geometry';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
createAmbientLight,
|
|
5
|
+
createDirectionalLight,
|
|
6
|
+
createHemisphereLight,
|
|
7
|
+
createPointLight,
|
|
8
|
+
createSpotLight,
|
|
9
|
+
} from '@flighthq/lighting';
|
|
4
10
|
import { unpackColorToLinear } from '@flighthq/materials';
|
|
5
11
|
import { computeMeshGeometryBounds, createBoxMeshGeometry } from '@flighthq/mesh';
|
|
6
12
|
import { addNodeChild, invalidateNodeLocalTransform } from '@flighthq/node';
|
|
7
13
|
import { createMesh, createScene } 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,6 +119,89 @@ 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', () => {
|