@aardworx/wombat.rendering 0.9.11 → 0.9.13
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/runtime/derivedUniforms/codegen.d.ts +8 -0
- package/dist/runtime/derivedUniforms/codegen.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/codegen.js +449 -0
- package/dist/runtime/derivedUniforms/codegen.js.map +1 -0
- package/dist/runtime/derivedUniforms/dispatch.d.ts +14 -93
- package/dist/runtime/derivedUniforms/dispatch.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/dispatch.js +123 -299
- package/dist/runtime/derivedUniforms/dispatch.js.map +1 -1
- package/dist/runtime/derivedUniforms/flatten.d.ts +25 -0
- package/dist/runtime/derivedUniforms/flatten.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/flatten.js +71 -0
- package/dist/runtime/derivedUniforms/flatten.js.map +1 -0
- package/dist/runtime/derivedUniforms/index.d.ts +10 -5
- package/dist/runtime/derivedUniforms/index.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/index.js +24 -19
- package/dist/runtime/derivedUniforms/index.js.map +1 -1
- package/dist/runtime/derivedUniforms/marker.d.ts +76 -0
- package/dist/runtime/derivedUniforms/marker.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/marker.js +156 -0
- package/dist/runtime/derivedUniforms/marker.js.map +1 -0
- package/dist/runtime/derivedUniforms/recipes.d.ts +6 -41
- package/dist/runtime/derivedUniforms/recipes.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/recipes.js +53 -129
- package/dist/runtime/derivedUniforms/recipes.js.map +1 -1
- package/dist/runtime/derivedUniforms/records.d.ts +40 -0
- package/dist/runtime/derivedUniforms/records.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/records.js +151 -0
- package/dist/runtime/derivedUniforms/records.js.map +1 -0
- package/dist/runtime/derivedUniforms/registry.d.ts +33 -0
- package/dist/runtime/derivedUniforms/registry.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/registry.js +58 -0
- package/dist/runtime/derivedUniforms/registry.js.map +1 -0
- package/dist/runtime/derivedUniforms/rule.d.ts +26 -0
- package/dist/runtime/derivedUniforms/rule.d.ts.map +1 -0
- package/dist/runtime/derivedUniforms/rule.js +35 -0
- package/dist/runtime/derivedUniforms/rule.js.map +1 -0
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts +34 -33
- package/dist/runtime/derivedUniforms/sceneIntegration.d.ts.map +1 -1
- package/dist/runtime/derivedUniforms/sceneIntegration.js +80 -90
- package/dist/runtime/derivedUniforms/sceneIntegration.js.map +1 -1
- package/dist/runtime/heapScene.d.ts.map +1 -1
- package/dist/runtime/heapScene.js +78 -26
- package/dist/runtime/heapScene.js.map +1 -1
- package/dist/runtime/hybridScene.js +1 -1
- package/dist/runtime/hybridScene.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +2 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/renderTask.js +1 -1
- package/dist/runtime/renderTask.js.map +1 -1
- package/dist/runtime/runtime.js +1 -1
- package/dist/runtime/runtime.js.map +1 -1
- package/package.json +1 -1
- package/src/runtime/derivedUniforms/codegen.ts +477 -0
- package/src/runtime/derivedUniforms/dispatch.ts +135 -341
- package/src/runtime/derivedUniforms/flatten.ts +89 -0
- package/src/runtime/derivedUniforms/index.ts +50 -34
- package/src/runtime/derivedUniforms/marker.ts +169 -0
- package/src/runtime/derivedUniforms/recipes.ts +63 -155
- package/src/runtime/derivedUniforms/records.ts +158 -0
- package/src/runtime/derivedUniforms/registry.ts +77 -0
- package/src/runtime/derivedUniforms/rule.ts +59 -0
- package/src/runtime/derivedUniforms/sceneIntegration.ts +115 -149
- package/src/runtime/heapScene.ts +77 -28
- package/src/runtime/hybridScene.ts +1 -1
- package/src/runtime/index.ts +8 -0
- package/src/runtime/renderTask.ts +1 -1
- package/src/runtime/runtime.ts +1 -1
- package/dist/runtime/derivedUniforms/slotId.d.ts +0 -15
- package/dist/runtime/derivedUniforms/slotId.d.ts.map +0 -1
- package/dist/runtime/derivedUniforms/slotId.js +0 -30
- package/dist/runtime/derivedUniforms/slotId.js.map +0 -1
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts +0 -13
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.d.ts.map +0 -1
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.js +0 -218
- package/dist/runtime/derivedUniforms/uberKernel.wgsl.js.map +0 -1
- package/src/runtime/derivedUniforms/slotId.ts +0 -35
- package/src/runtime/derivedUniforms/uberKernel.wgsl.ts +0 -220
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
1
|
+
export { type DerivedRule, type IRFragment, ruleFromIR, uniformRef, sameType, hashIR, isDerivedRule, } from "./rule.js";
|
|
2
|
+
export { derivedUniform, DerivedExpr, type DerivedScope, } from "./marker.js";
|
|
3
|
+
export { type RuleInput, flatten, inputsOf, } from "./flatten.js";
|
|
4
|
+
export { DerivedUniformRegistry, type RuleEntry, } from "./registry.js";
|
|
5
|
+
export { RecordsBuffer, SlotTag, makeHandle, handleTag, handlePayload, type RecordOwner, } from "./records.js";
|
|
6
|
+
export { buildUberKernel, type UberKernel, } from "./codegen.js";
|
|
7
|
+
export { DerivedUniformsDispatcher, uploadConstituentsRange, type DerivedUniformsResources, } from "./dispatch.js";
|
|
8
|
+
export { ConstituentSlots, DF32_MAT4_BYTES, type SlotIndex, type PairedSlots, type SubscribeFn, } from "./slots.js";
|
|
9
|
+
export { DerivedUniformsScene, type DerivedUniformsSceneOptions, registerRoDerivations, deregisterRoDerivations, type RoDerivedRequest, type RoRegistration, } from "./sceneIntegration.js";
|
|
10
|
+
export { STANDARD_DERIVED_RULES, STANDARD_TRAFO_LEAVES, isStandardDerivedName, } from "./recipes.js";
|
|
6
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,KAAK,WAAW,EAAE,KAAK,UAAU,EACjC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,GACxD,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EAAE,WAAW,EAAE,KAAK,YAAY,GAC/C,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,KAAK,SAAS,EACd,OAAO,EAAE,QAAQ,GAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,sBAAsB,EAAE,KAAK,SAAS,GACvC,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,SAAS,EAAE,aAAa,EACpC,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,eAAe,EAAE,KAAK,UAAU,GACjC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,yBAAyB,EAAE,uBAAuB,EAClD,KAAK,wBAAwB,GAC9B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAAE,eAAe,EACjC,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,GACnD,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,oBAAoB,EAAE,KAAK,2BAA2B,EACtD,qBAAqB,EAAE,uBAAuB,EAC9C,KAAK,gBAAgB,EAAE,KAAK,cAAc,GAC3C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,EAAE,qBAAqB,EAAE,qBAAqB,GACrE,MAAM,cAAc,CAAC"}
|
|
@@ -1,26 +1,31 @@
|
|
|
1
|
-
// §7 derived-uniforms module — public surface
|
|
1
|
+
// §7 derived-uniforms module — public surface (v2: content-keyed rule registry,
|
|
2
|
+
// chain flattening, codegen-emitted uber-kernel, one dispatch).
|
|
2
3
|
//
|
|
3
|
-
// Caller responsibilities (
|
|
4
|
+
// Caller responsibilities (heapScene.ts):
|
|
4
5
|
//
|
|
5
|
-
// 1. Construct one DerivedUniformsScene per heap scene,
|
|
6
|
-
//
|
|
7
|
-
// shared constituents storage buffer + dirty bitmask + pipeline.
|
|
6
|
+
// 1. Construct one DerivedUniformsScene per heap scene (owns the rule registry,
|
|
7
|
+
// the records buffer, the constituents heap + GPU buffer, the dispatcher).
|
|
8
8
|
// 2. In the parent scene-object's `inputChanged(t, o)` router, call
|
|
9
|
-
// `scene.routeInputChanged(o)
|
|
10
|
-
// 3.
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// 4.
|
|
14
|
-
//
|
|
15
|
-
// const dirty = scene.constituents.pullDirty(token);
|
|
9
|
+
// `scene.routeInputChanged(o)` — returns true iff `o` is a tracked trafo aval.
|
|
10
|
+
// 3. Per RO add: `registerRoDerivations(scene, owner, req)` — flattens + registers
|
|
11
|
+
// each rule, resolves its input leaves to constituent / host slots, pushes one
|
|
12
|
+
// record per derived uniform. Per RO remove: `deregisterRoDerivations(scene, reg)`.
|
|
13
|
+
// 4. Per frame, inside the scene's `evaluateAlways(token, …)` scope:
|
|
14
|
+
// const dirty = scene.pullDirty(token); // re-subscribes on changed trafo avals
|
|
16
15
|
// scene.uploadDirty(dirty);
|
|
17
|
-
//
|
|
18
|
-
// All
|
|
16
|
+
// scene.encode(enc); // one compute dispatch
|
|
17
|
+
// All O(changed); clean frames no-op.
|
|
19
18
|
//
|
|
20
|
-
//
|
|
21
|
-
|
|
19
|
+
// The standard trafo recipes (ModelViewProjTrafo etc.) live in ./recipes as
|
|
20
|
+
// `DerivedRule` constants — `STANDARD_DERIVED_RULES` / `isStandardDerivedName`.
|
|
21
|
+
export { ruleFromIR, uniformRef, sameType, hashIR, isDerivedRule, } from "./rule.js";
|
|
22
|
+
export { derivedUniform, DerivedExpr, } from "./marker.js";
|
|
23
|
+
export { flatten, inputsOf, } from "./flatten.js";
|
|
24
|
+
export { DerivedUniformRegistry, } from "./registry.js";
|
|
25
|
+
export { RecordsBuffer, SlotTag, makeHandle, handleTag, handlePayload, } from "./records.js";
|
|
26
|
+
export { buildUberKernel, } from "./codegen.js";
|
|
27
|
+
export { DerivedUniformsDispatcher, uploadConstituentsRange, } from "./dispatch.js";
|
|
22
28
|
export { ConstituentSlots, DF32_MAT4_BYTES, } from "./slots.js";
|
|
23
|
-
export {
|
|
24
|
-
export {
|
|
25
|
-
export { DERIVED_UBER_KERNEL_WGSL, } from "./uberKernel.wgsl.js";
|
|
29
|
+
export { DerivedUniformsScene, registerRoDerivations, deregisterRoDerivations, } from "./sceneIntegration.js";
|
|
30
|
+
export { STANDARD_DERIVED_RULES, STANDARD_TRAFO_LEAVES, isStandardDerivedName, } from "./recipes.js";
|
|
26
31
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gEAAgE;AAChE,EAAE;AACF,0CAA0C;AAC1C,EAAE;AACF,kFAAkF;AAClF,gFAAgF;AAChF,sEAAsE;AACtE,oFAAoF;AACpF,qFAAqF;AACrF,oFAAoF;AACpF,yFAAyF;AACzF,uEAAuE;AACvE,yFAAyF;AACzF,mCAAmC;AACnC,0EAA0E;AAC1E,2CAA2C;AAC3C,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAEhF,OAAO,EAEL,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,GACxD,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EAAE,WAAW,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,OAAO,EAAE,QAAQ,GAClB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,SAAS,EAAE,aAAa,GAErC,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,yBAAyB,EAAE,uBAAuB,GAEnD,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAAE,eAAe,GAElC,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EAAE,uBAAuB,GAE/C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,sBAAsB,EAAE,qBAAqB,EAAE,qBAAqB,GACrE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Expr, Type } from "@aardworx/wombat.shader/ir";
|
|
2
|
+
import { type DerivedRule } from "./rule.js";
|
|
3
|
+
/** Leaf type names accepted by `DerivedExpr.as(...)`. */
|
|
4
|
+
export type LeafTypeName = "f32" | "u32" | "i32" | "vec2" | "vec3" | "vec4" | "mat3" | "mat4";
|
|
5
|
+
/** A traced expression in a `derivedUniform` builder. */
|
|
6
|
+
export declare class DerivedExpr {
|
|
7
|
+
readonly ir: Expr;
|
|
8
|
+
constructor(ir: Expr);
|
|
9
|
+
get type(): Type;
|
|
10
|
+
/** Matrix product `this · other` (also matrix·vector / vector·matrix by operand types). */
|
|
11
|
+
mul(other: DerivedExpr): DerivedExpr;
|
|
12
|
+
add(other: DerivedExpr): DerivedExpr;
|
|
13
|
+
sub(other: DerivedExpr): DerivedExpr;
|
|
14
|
+
neg(): DerivedExpr;
|
|
15
|
+
/** Inverse (of a constituent trafo this reads its stored backward half; otherwise unsupported in codegen). */
|
|
16
|
+
inverse(): DerivedExpr;
|
|
17
|
+
transpose(): DerivedExpr;
|
|
18
|
+
/** Upper-left 3×3 (mat → mat3). */
|
|
19
|
+
upperLeft3x3(): DerivedExpr;
|
|
20
|
+
/** This mat4 applied to the origin `(0,0,0,1)`, returning the resulting position (xyz). */
|
|
21
|
+
transformOrigin(): DerivedExpr;
|
|
22
|
+
/** This mat4 applied to the direction `(x,y,z,0)` (no translation), returning the result (xyz). */
|
|
23
|
+
transformDir(x: number, y: number, z: number): DerivedExpr;
|
|
24
|
+
/** vecN swizzle, e.g. `.swizzle("xyz")`. Single component ⇒ scalar. */
|
|
25
|
+
swizzle(comps: string): DerivedExpr;
|
|
26
|
+
get x(): DerivedExpr;
|
|
27
|
+
get y(): DerivedExpr;
|
|
28
|
+
get z(): DerivedExpr;
|
|
29
|
+
get w(): DerivedExpr;
|
|
30
|
+
/**
|
|
31
|
+
* Re-type a leaf — `u.<Name>` defaults to a mat4 trafo leaf; `.as("vec4")` (etc.) gives the
|
|
32
|
+
* leaf its real type so you can read *any* uniform: `u.Tint.as("vec4").swizzle("xyz")`.
|
|
33
|
+
* Only valid directly on a `u.<Name>` leaf.
|
|
34
|
+
*/
|
|
35
|
+
as(typeName: LeafTypeName): DerivedExpr;
|
|
36
|
+
/** Escape hatch: an arbitrary builtin call `name(this, ...others)` producing `resultType`. */
|
|
37
|
+
call(name: string, resultType: Type, ...others: DerivedExpr[]): DerivedExpr;
|
|
38
|
+
private u1;
|
|
39
|
+
private bin;
|
|
40
|
+
sin(): DerivedExpr;
|
|
41
|
+
cos(): DerivedExpr;
|
|
42
|
+
tan(): DerivedExpr;
|
|
43
|
+
abs(): DerivedExpr;
|
|
44
|
+
floor(): DerivedExpr;
|
|
45
|
+
ceil(): DerivedExpr;
|
|
46
|
+
fract(): DerivedExpr;
|
|
47
|
+
sqrt(): DerivedExpr;
|
|
48
|
+
exp(): DerivedExpr;
|
|
49
|
+
log(): DerivedExpr;
|
|
50
|
+
exp2(): DerivedExpr;
|
|
51
|
+
log2(): DerivedExpr;
|
|
52
|
+
sign(): DerivedExpr;
|
|
53
|
+
normalize(): DerivedExpr;
|
|
54
|
+
min(o: DerivedExpr): DerivedExpr;
|
|
55
|
+
max(o: DerivedExpr): DerivedExpr;
|
|
56
|
+
pow(o: DerivedExpr): DerivedExpr;
|
|
57
|
+
atan2(o: DerivedExpr): DerivedExpr;
|
|
58
|
+
step(edge: DerivedExpr): DerivedExpr;
|
|
59
|
+
clamp(lo: DerivedExpr, hi: DerivedExpr): DerivedExpr;
|
|
60
|
+
mix(o: DerivedExpr, t: DerivedExpr): DerivedExpr;
|
|
61
|
+
dot(o: DerivedExpr): DerivedExpr;
|
|
62
|
+
cross(o: DerivedExpr): DerivedExpr;
|
|
63
|
+
length(): DerivedExpr;
|
|
64
|
+
distance(o: DerivedExpr): DerivedExpr;
|
|
65
|
+
reflect(n: DerivedExpr): DerivedExpr;
|
|
66
|
+
}
|
|
67
|
+
/** The `u` passed to a `derivedUniform` builder. `u.<Name>` is a mat4 trafo leaf. */
|
|
68
|
+
export type DerivedScope = {
|
|
69
|
+
readonly [name: string]: DerivedExpr;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Define a derived uniform. `derivedUniform(u => u.ViewTrafo.mul(u.ModelTrafo))` makes a
|
|
73
|
+
* rule that slots in wherever a uniform value goes — see this module's header.
|
|
74
|
+
*/
|
|
75
|
+
export declare function derivedUniform<T = unknown>(build: (u: DerivedScope) => DerivedExpr): DerivedRule<T>;
|
|
76
|
+
//# sourceMappingURL=marker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/marker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// §7 v2 — `derivedUniform((u) => …)` author-facing marker.
|
|
2
|
+
//
|
|
3
|
+
// A uniform binding is either a *value* (an `aval` / constant) or a *rule*
|
|
4
|
+
// (`derivedUniform((u) => u.ViewTrafo.mul(u.ModelTrafo))`). A rule reads other
|
|
5
|
+
// uniforms — `u.<Name>` is a leaf, and is resolved per RenderObject at registration
|
|
6
|
+
// time (a `Trafo3d` aval ⇒ a df32 constituent slot; anything else ⇒ a host uniform).
|
|
7
|
+
//
|
|
8
|
+
// This builds the rule's IR by tracing: `u.<Name>` is a mat4 leaf (the trafo case —
|
|
9
|
+
// the vast majority of derived uniforms), and the `DerivedExpr` methods compose them
|
|
10
|
+
// (the result type follows from the ops, so `.upperLeft3x3()` yields a mat3 rule, etc.).
|
|
11
|
+
// For non-mat4-leaf rules use `ruleFromIR` with hand-built IR, or — once it lands — the
|
|
12
|
+
// build-time `derivedUniform(...)` vite marker, which reads leaf types from the program.
|
|
13
|
+
import { ruleFromIR, uniformRef } from "./rule.js";
|
|
14
|
+
const Tf32 = { kind: "Float", width: 32 };
|
|
15
|
+
const mat = (n) => ({ kind: "Matrix", element: Tf32, rows: n, cols: n });
|
|
16
|
+
const vec = (n) => ({ kind: "Vector", element: Tf32, dim: n });
|
|
17
|
+
const Tu32 = { kind: "Int", signed: false, width: 32 };
|
|
18
|
+
const Ti32 = { kind: "Int", signed: true, width: 32 };
|
|
19
|
+
const LEAF_TYPES = {
|
|
20
|
+
f32: Tf32, u32: Tu32, i32: Ti32,
|
|
21
|
+
vec2: vec(2), vec3: vec(3), vec4: vec(4), mat3: mat(3), mat4: mat(4),
|
|
22
|
+
};
|
|
23
|
+
function transposed(t) {
|
|
24
|
+
return t.kind === "Matrix" ? { kind: "Matrix", element: t.element, rows: t.cols, cols: t.rows } : t;
|
|
25
|
+
}
|
|
26
|
+
function constVec4(x, y, z, w) {
|
|
27
|
+
const c = (v) => ({ kind: "Const", type: Tf32, value: { kind: "Float", value: v } });
|
|
28
|
+
return { kind: "NewVector", components: [c(x), c(y), c(z), c(w)], type: vec(4) };
|
|
29
|
+
}
|
|
30
|
+
function elemOf(t) {
|
|
31
|
+
return t.kind === "Vector" || t.kind === "Matrix" ? t.element : t;
|
|
32
|
+
}
|
|
33
|
+
/** A `CallIntrinsic` node — `op` is a minimal stub (this IR is only ever printed by the
|
|
34
|
+
* derived-uniform codegen, never run through the shader compiler). */
|
|
35
|
+
function intrinsicExpr(name, type, args) {
|
|
36
|
+
return {
|
|
37
|
+
kind: "CallIntrinsic",
|
|
38
|
+
op: { name, returnTypeOf: () => type, pure: true, emit: { glsl: name, wgsl: name } },
|
|
39
|
+
args,
|
|
40
|
+
type,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** A traced expression in a `derivedUniform` builder. */
|
|
44
|
+
export class DerivedExpr {
|
|
45
|
+
ir;
|
|
46
|
+
constructor(ir) {
|
|
47
|
+
this.ir = ir;
|
|
48
|
+
}
|
|
49
|
+
get type() { return this.ir.type; }
|
|
50
|
+
/** Matrix product `this · other` (also matrix·vector / vector·matrix by operand types). */
|
|
51
|
+
mul(other) {
|
|
52
|
+
const a = this.ir.type, b = other.ir.type;
|
|
53
|
+
if (a.kind === "Matrix" && b.kind === "Matrix") {
|
|
54
|
+
return new DerivedExpr({ kind: "MulMatMat", lhs: this.ir, rhs: other.ir, type: { kind: "Matrix", element: a.element, rows: a.rows, cols: b.cols } });
|
|
55
|
+
}
|
|
56
|
+
if (a.kind === "Matrix" && b.kind === "Vector") {
|
|
57
|
+
return new DerivedExpr({ kind: "MulMatVec", lhs: this.ir, rhs: other.ir, type: { kind: "Vector", element: b.element, dim: a.rows } });
|
|
58
|
+
}
|
|
59
|
+
if (a.kind === "Vector" && b.kind === "Matrix") {
|
|
60
|
+
return new DerivedExpr({ kind: "MulVecMat", lhs: this.ir, rhs: other.ir, type: { kind: "Vector", element: a.element, dim: b.cols } });
|
|
61
|
+
}
|
|
62
|
+
return new DerivedExpr({ kind: "Mul", lhs: this.ir, rhs: other.ir, type: a.kind === "Float" ? b : a });
|
|
63
|
+
}
|
|
64
|
+
add(other) { return new DerivedExpr({ kind: "Add", lhs: this.ir, rhs: other.ir, type: this.ir.type }); }
|
|
65
|
+
sub(other) { return new DerivedExpr({ kind: "Sub", lhs: this.ir, rhs: other.ir, type: this.ir.type }); }
|
|
66
|
+
neg() { return new DerivedExpr({ kind: "Neg", value: this.ir, type: this.ir.type }); }
|
|
67
|
+
/** Inverse (of a constituent trafo this reads its stored backward half; otherwise unsupported in codegen). */
|
|
68
|
+
inverse() { return new DerivedExpr({ kind: "Inverse", value: this.ir, type: this.ir.type }); }
|
|
69
|
+
transpose() { return new DerivedExpr({ kind: "Transpose", value: this.ir, type: transposed(this.ir.type) }); }
|
|
70
|
+
/** Upper-left 3×3 (mat → mat3). */
|
|
71
|
+
upperLeft3x3() { return new DerivedExpr({ kind: "ConvertMatrix", value: this.ir, type: mat(3) }); }
|
|
72
|
+
/** This mat4 applied to the origin `(0,0,0,1)`, returning the resulting position (xyz). */
|
|
73
|
+
transformOrigin() {
|
|
74
|
+
const v4 = { kind: "MulMatVec", lhs: this.ir, rhs: constVec4(0, 0, 0, 1), type: vec(4) };
|
|
75
|
+
return new DerivedExpr({ kind: "VecSwizzle", value: v4, comps: ["x", "y", "z"], type: vec(3) });
|
|
76
|
+
}
|
|
77
|
+
/** This mat4 applied to the direction `(x,y,z,0)` (no translation), returning the result (xyz). */
|
|
78
|
+
transformDir(x, y, z) {
|
|
79
|
+
const v4 = { kind: "MulMatVec", lhs: this.ir, rhs: constVec4(x, y, z, 0), type: vec(4) };
|
|
80
|
+
return new DerivedExpr({ kind: "VecSwizzle", value: v4, comps: ["x", "y", "z"], type: vec(3) });
|
|
81
|
+
}
|
|
82
|
+
/** vecN swizzle, e.g. `.swizzle("xyz")`. Single component ⇒ scalar. */
|
|
83
|
+
swizzle(comps) {
|
|
84
|
+
const c = comps.split("");
|
|
85
|
+
return new DerivedExpr({ kind: "VecSwizzle", value: this.ir, comps: c, type: c.length === 1 ? Tf32 : vec(c.length) });
|
|
86
|
+
}
|
|
87
|
+
get x() { return this.swizzle("x"); }
|
|
88
|
+
get y() { return this.swizzle("y"); }
|
|
89
|
+
get z() { return this.swizzle("z"); }
|
|
90
|
+
get w() { return this.swizzle("w"); }
|
|
91
|
+
/**
|
|
92
|
+
* Re-type a leaf — `u.<Name>` defaults to a mat4 trafo leaf; `.as("vec4")` (etc.) gives the
|
|
93
|
+
* leaf its real type so you can read *any* uniform: `u.Tint.as("vec4").swizzle("xyz")`.
|
|
94
|
+
* Only valid directly on a `u.<Name>` leaf.
|
|
95
|
+
*/
|
|
96
|
+
as(typeName) {
|
|
97
|
+
if (this.ir.kind !== "ReadInput" || this.ir.scope !== "Uniform") {
|
|
98
|
+
throw new Error("DerivedExpr.as(...): only valid on a `u.<Name>` uniform leaf");
|
|
99
|
+
}
|
|
100
|
+
return new DerivedExpr({ kind: "ReadInput", scope: "Uniform", name: this.ir.name, type: LEAF_TYPES[typeName] });
|
|
101
|
+
}
|
|
102
|
+
// ── Intrinsics — every WGSL builtin (name passed straight through). ──
|
|
103
|
+
/** Escape hatch: an arbitrary builtin call `name(this, ...others)` producing `resultType`. */
|
|
104
|
+
call(name, resultType, ...others) {
|
|
105
|
+
return new DerivedExpr(intrinsicExpr(name, resultType, [this.ir, ...others.map((o) => o.ir)]));
|
|
106
|
+
}
|
|
107
|
+
u1(name) { return new DerivedExpr(intrinsicExpr(name, this.ir.type, [this.ir])); }
|
|
108
|
+
bin(name, o) { return new DerivedExpr(intrinsicExpr(name, this.ir.type, [this.ir, o.ir])); }
|
|
109
|
+
sin() { return this.u1("sin"); }
|
|
110
|
+
cos() { return this.u1("cos"); }
|
|
111
|
+
tan() { return this.u1("tan"); }
|
|
112
|
+
abs() { return this.u1("abs"); }
|
|
113
|
+
floor() { return this.u1("floor"); }
|
|
114
|
+
ceil() { return this.u1("ceil"); }
|
|
115
|
+
fract() { return this.u1("fract"); }
|
|
116
|
+
sqrt() { return this.u1("sqrt"); }
|
|
117
|
+
exp() { return this.u1("exp"); }
|
|
118
|
+
log() { return this.u1("log"); }
|
|
119
|
+
exp2() { return this.u1("exp2"); }
|
|
120
|
+
log2() { return this.u1("log2"); }
|
|
121
|
+
sign() { return this.u1("sign"); }
|
|
122
|
+
normalize() { return this.u1("normalize"); }
|
|
123
|
+
min(o) { return this.bin("min", o); }
|
|
124
|
+
max(o) { return this.bin("max", o); }
|
|
125
|
+
pow(o) { return this.bin("pow", o); }
|
|
126
|
+
atan2(o) { return this.bin("atan2", o); }
|
|
127
|
+
step(edge) { return new DerivedExpr(intrinsicExpr("step", this.ir.type, [edge.ir, this.ir])); }
|
|
128
|
+
clamp(lo, hi) { return new DerivedExpr(intrinsicExpr("clamp", this.ir.type, [this.ir, lo.ir, hi.ir])); }
|
|
129
|
+
mix(o, t) { return new DerivedExpr(intrinsicExpr("mix", this.ir.type, [this.ir, o.ir, t.ir])); }
|
|
130
|
+
dot(o) { return new DerivedExpr(intrinsicExpr("dot", elemOf(this.ir.type), [this.ir, o.ir])); }
|
|
131
|
+
cross(o) { return new DerivedExpr(intrinsicExpr("cross", this.ir.type, [this.ir, o.ir])); }
|
|
132
|
+
length() { return new DerivedExpr(intrinsicExpr("length", elemOf(this.ir.type), [this.ir])); }
|
|
133
|
+
distance(o) { return new DerivedExpr(intrinsicExpr("distance", elemOf(this.ir.type), [this.ir, o.ir])); }
|
|
134
|
+
reflect(n) { return new DerivedExpr(intrinsicExpr("reflect", this.ir.type, [this.ir, n.ir])); }
|
|
135
|
+
}
|
|
136
|
+
function makeScope() {
|
|
137
|
+
return new Proxy({}, {
|
|
138
|
+
get(_t, key) {
|
|
139
|
+
if (typeof key !== "string")
|
|
140
|
+
throw new Error("derivedUniform: leaf names must be strings");
|
|
141
|
+
return new DerivedExpr(uniformRef(key, mat(4)));
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Define a derived uniform. `derivedUniform(u => u.ViewTrafo.mul(u.ModelTrafo))` makes a
|
|
147
|
+
* rule that slots in wherever a uniform value goes — see this module's header.
|
|
148
|
+
*/
|
|
149
|
+
export function derivedUniform(build) {
|
|
150
|
+
const result = build(makeScope());
|
|
151
|
+
if (!(result instanceof DerivedExpr)) {
|
|
152
|
+
throw new Error("derivedUniform: the builder must return a derived expression, e.g. u.ViewTrafo.mul(u.ModelTrafo)");
|
|
153
|
+
}
|
|
154
|
+
return ruleFromIR(result.ir, result.ir.type);
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marker.js","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/marker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
/** (Model.bwd)ᵀ upper-3×3 → f32 mat3. */
|
|
8
|
-
NormalMatrix = 2,
|
|
9
|
-
/** View.fwd · Model.fwd → f32 mat4. */
|
|
10
|
-
ModelViewTrafo = 3,
|
|
11
|
-
/** Model.bwd · View.bwd → f32 mat4. */
|
|
12
|
-
ModelViewTrafoInv = 4,
|
|
13
|
-
/** Proj.fwd · View.fwd · Model.fwd → f32 mat4. */
|
|
14
|
-
ModelViewProjTrafo = 5,
|
|
15
|
-
/** Model.bwd · View.bwd · Proj.bwd → f32 mat4. */
|
|
16
|
-
ModelViewProjTrafoInv = 6,
|
|
17
|
-
/** View.fwd → f32 mat4. */
|
|
18
|
-
ViewTrafo = 7,
|
|
19
|
-
/** View.bwd → f32 mat4. */
|
|
20
|
-
ViewTrafoInv = 8,
|
|
21
|
-
/** Proj.fwd · View.fwd → f32 mat4. */
|
|
22
|
-
ViewProjTrafo = 9,
|
|
23
|
-
/** View.bwd · Proj.bwd → f32 mat4. */
|
|
24
|
-
ViewProjTrafoInv = 10,
|
|
25
|
-
/** Proj.fwd → f32 mat4. */
|
|
26
|
-
ProjTrafo = 11,
|
|
27
|
-
/** Proj.bwd → f32 mat4. */
|
|
28
|
-
ProjTrafoInv = 12
|
|
29
|
-
}
|
|
30
|
-
export declare function recipeInputCount(id: RecipeId): 1 | 2 | 3;
|
|
31
|
-
/** Output shape — drives drawHeader byte allocation. */
|
|
32
|
-
export type RecipeOutput = "mat4" | "mat3";
|
|
33
|
-
export declare function recipeOutput(id: RecipeId): RecipeOutput;
|
|
34
|
-
/** Which side (forward/backward) of which Trafo3d each input slot draws from. */
|
|
35
|
-
export type ConstituentRef = "Model.fwd" | "Model.bwd" | "View.fwd" | "View.bwd" | "Proj.fwd" | "Proj.bwd";
|
|
36
|
-
export declare function recipeInputs(id: RecipeId): readonly ConstituentRef[];
|
|
37
|
-
/** All recipe IDs in switch order. */
|
|
38
|
-
export declare const ALL_RECIPES: readonly RecipeId[];
|
|
39
|
-
export declare const DERIVED_UNIFORM_NAMES: ReadonlySet<string>;
|
|
40
|
-
export declare function recipeIdByName(name: string): RecipeId | undefined;
|
|
41
|
-
export declare function recipeName(id: RecipeId): string;
|
|
1
|
+
import { type DerivedRule } from "./rule.js";
|
|
2
|
+
/** Standard derived rules, keyed by the drawHeader uniform name each produces. */
|
|
3
|
+
export declare const STANDARD_DERIVED_RULES: ReadonlyMap<string, DerivedRule>;
|
|
4
|
+
/** Leaf name → the RO uniform (`spec.inputs[…]`) that supplies its `aval<Trafo3d>`. */
|
|
5
|
+
export declare const STANDARD_TRAFO_LEAVES: ReadonlyMap<string, string>;
|
|
6
|
+
export declare function isStandardDerivedName(name: string): boolean;
|
|
42
7
|
//# sourceMappingURL=recipes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/recipes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../../src/runtime/derivedUniforms/recipes.ts"],"names":[],"mappings":"AAgBA,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAmBrE,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAmBlE,CAAC;AAEH,uFAAuF;AACvF,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAI5D,CAAC;AAEH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
|
@@ -1,134 +1,58 @@
|
|
|
1
|
-
// §7
|
|
1
|
+
// §7 v2 — the standard trafo recipes, as DerivedRule constants.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
3
|
+
// These replace the hardcoded RecipeId table. Each rule reads BASE-trafo leaves
|
|
4
|
+
// (`Model` / `View` / `Proj` — the raw `aval<Trafo3d>`s the RO binds as
|
|
5
|
+
// `ModelTrafo` / `ViewTrafo` / `ProjTrafo` uniforms) and produces the derived
|
|
6
|
+
// uniform the shader reads (`ModelViewProjTrafo`, `NormalMatrix`, …). A leaf
|
|
7
|
+
// wrapped in `Inverse(...)` selects that trafo's stored backward half (free).
|
|
7
8
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
9
|
+
// `Inverse`-of-a-product (e.g. `ModelViewProjTrafoInv`) is written as the product
|
|
10
|
+
// of the inverted factors in reverse order — `(P·V·M)⁻¹ = M⁻¹·V⁻¹·P⁻¹` — so it
|
|
11
|
+
// stays a constituent matmul chain the codegen recognizes.
|
|
11
12
|
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
[
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
[
|
|
51
|
-
[
|
|
52
|
-
[
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
[RecipeId.ViewProjTrafoInv]: 2,
|
|
57
|
-
[RecipeId.ProjTrafo]: 1,
|
|
58
|
-
[RecipeId.ProjTrafoInv]: 1,
|
|
59
|
-
};
|
|
60
|
-
export function recipeInputCount(id) {
|
|
61
|
-
return INPUT_COUNT[id];
|
|
62
|
-
}
|
|
63
|
-
const OUTPUT = {
|
|
64
|
-
[RecipeId.ModelTrafo]: "mat4",
|
|
65
|
-
[RecipeId.ModelTrafoInv]: "mat4",
|
|
66
|
-
[RecipeId.NormalMatrix]: "mat3",
|
|
67
|
-
[RecipeId.ModelViewTrafo]: "mat4",
|
|
68
|
-
[RecipeId.ModelViewTrafoInv]: "mat4",
|
|
69
|
-
[RecipeId.ModelViewProjTrafo]: "mat4",
|
|
70
|
-
[RecipeId.ModelViewProjTrafoInv]: "mat4",
|
|
71
|
-
[RecipeId.ViewTrafo]: "mat4",
|
|
72
|
-
[RecipeId.ViewTrafoInv]: "mat4",
|
|
73
|
-
[RecipeId.ViewProjTrafo]: "mat4",
|
|
74
|
-
[RecipeId.ViewProjTrafoInv]: "mat4",
|
|
75
|
-
[RecipeId.ProjTrafo]: "mat4",
|
|
76
|
-
[RecipeId.ProjTrafoInv]: "mat4",
|
|
77
|
-
};
|
|
78
|
-
export function recipeOutput(id) {
|
|
79
|
-
return OUTPUT[id];
|
|
80
|
-
}
|
|
81
|
-
const INPUTS = {
|
|
82
|
-
[RecipeId.ModelTrafo]: ["Model.fwd"],
|
|
83
|
-
[RecipeId.ModelTrafoInv]: ["Model.bwd"],
|
|
84
|
-
[RecipeId.NormalMatrix]: ["Model.bwd"],
|
|
85
|
-
// df_mul args are ordered (outer, inner) so the math product
|
|
86
|
-
// matches Aardvark's `View.mul(Model).forward = View.fwd · Model.fwd`.
|
|
87
|
-
[RecipeId.ModelViewTrafo]: ["View.fwd", "Model.fwd"],
|
|
88
|
-
[RecipeId.ModelViewTrafoInv]: ["Model.bwd", "View.bwd"],
|
|
89
|
-
[RecipeId.ModelViewProjTrafo]: ["Proj.fwd", "View.fwd", "Model.fwd"],
|
|
90
|
-
[RecipeId.ModelViewProjTrafoInv]: ["Model.bwd", "View.bwd", "Proj.bwd"],
|
|
91
|
-
[RecipeId.ViewTrafo]: ["View.fwd"],
|
|
92
|
-
[RecipeId.ViewTrafoInv]: ["View.bwd"],
|
|
93
|
-
[RecipeId.ViewProjTrafo]: ["Proj.fwd", "View.fwd"],
|
|
94
|
-
[RecipeId.ViewProjTrafoInv]: ["View.bwd", "Proj.bwd"],
|
|
95
|
-
[RecipeId.ProjTrafo]: ["Proj.fwd"],
|
|
96
|
-
[RecipeId.ProjTrafoInv]: ["Proj.bwd"],
|
|
97
|
-
};
|
|
98
|
-
export function recipeInputs(id) {
|
|
99
|
-
return INPUTS[id];
|
|
100
|
-
}
|
|
101
|
-
/** Public uniform name (one per recipe). */
|
|
102
|
-
const NAME = {
|
|
103
|
-
[RecipeId.ModelTrafo]: "ModelTrafo",
|
|
104
|
-
[RecipeId.ModelTrafoInv]: "ModelTrafoInv",
|
|
105
|
-
[RecipeId.NormalMatrix]: "NormalMatrix",
|
|
106
|
-
[RecipeId.ModelViewTrafo]: "ModelViewTrafo",
|
|
107
|
-
[RecipeId.ModelViewTrafoInv]: "ModelViewTrafoInv",
|
|
108
|
-
[RecipeId.ModelViewProjTrafo]: "ModelViewProjTrafo",
|
|
109
|
-
[RecipeId.ModelViewProjTrafoInv]: "ModelViewProjTrafoInv",
|
|
110
|
-
[RecipeId.ViewTrafo]: "ViewTrafo",
|
|
111
|
-
[RecipeId.ViewTrafoInv]: "ViewTrafoInv",
|
|
112
|
-
[RecipeId.ViewProjTrafo]: "ViewProjTrafo",
|
|
113
|
-
[RecipeId.ViewProjTrafoInv]: "ViewProjTrafoInv",
|
|
114
|
-
[RecipeId.ProjTrafo]: "ProjTrafo",
|
|
115
|
-
[RecipeId.ProjTrafoInv]: "ProjTrafoInv",
|
|
116
|
-
};
|
|
117
|
-
/** All recipe IDs in switch order. */
|
|
118
|
-
export const ALL_RECIPES = [
|
|
119
|
-
RecipeId.ModelTrafo, RecipeId.ModelTrafoInv, RecipeId.NormalMatrix,
|
|
120
|
-
RecipeId.ModelViewTrafo, RecipeId.ModelViewTrafoInv,
|
|
121
|
-
RecipeId.ModelViewProjTrafo, RecipeId.ModelViewProjTrafoInv,
|
|
122
|
-
RecipeId.ViewTrafo, RecipeId.ViewTrafoInv,
|
|
123
|
-
RecipeId.ViewProjTrafo, RecipeId.ViewProjTrafoInv,
|
|
124
|
-
RecipeId.ProjTrafo, RecipeId.ProjTrafoInv,
|
|
125
|
-
];
|
|
126
|
-
const BY_NAME = new Map(ALL_RECIPES.map(id => [NAME[id], id]));
|
|
127
|
-
export const DERIVED_UNIFORM_NAMES = new Set(ALL_RECIPES.map(id => NAME[id]));
|
|
128
|
-
export function recipeIdByName(name) {
|
|
129
|
-
return BY_NAME.get(name);
|
|
130
|
-
}
|
|
131
|
-
export function recipeName(id) {
|
|
132
|
-
return NAME[id];
|
|
13
|
+
// `NormalMatrix` is `(Model⁻¹)ᵀ` truncated to its upper-3×3 — declared as a mat3
|
|
14
|
+
// output; the codegen's normal-matrix arm does the transpose + truncation.
|
|
15
|
+
import { ruleFromIR, uniformRef } from "./rule.js";
|
|
16
|
+
const Tf32 = { kind: "Float", width: 32 };
|
|
17
|
+
const Tmat4 = { kind: "Matrix", element: Tf32, rows: 4, cols: 4 };
|
|
18
|
+
const Tmat3 = { kind: "Matrix", element: Tf32, rows: 3, cols: 3 };
|
|
19
|
+
const mat4 = (name) => uniformRef(name, Tmat4);
|
|
20
|
+
const inv = (v) => ({ kind: "Inverse", value: v, type: Tmat4 });
|
|
21
|
+
const mul = (lhs, rhs) => ({ kind: "MulMatMat", lhs, rhs, type: Tmat4 });
|
|
22
|
+
/** Left-fold `A·B·C·…` (multiplication order). */
|
|
23
|
+
const chain = (...fs) => fs.reduce((acc, f) => mul(acc, f));
|
|
24
|
+
/** mat4 → mat3 truncation (upper-left 3×3). */
|
|
25
|
+
const upper3 = (v) => ({ kind: "ConvertMatrix", value: v, type: Tmat3 });
|
|
26
|
+
const transpose = (v) => ({ kind: "Transpose", value: v, type: Tmat4 });
|
|
27
|
+
const Model = mat4("Model");
|
|
28
|
+
const View = mat4("View");
|
|
29
|
+
const Proj = mat4("Proj");
|
|
30
|
+
/** Standard derived rules, keyed by the drawHeader uniform name each produces. */
|
|
31
|
+
export const STANDARD_DERIVED_RULES = new Map([
|
|
32
|
+
// Trafo passthroughs (collapse the df32 fwd/bwd half to an f32 mat4).
|
|
33
|
+
["ModelTrafo", ruleFromIR(Model)],
|
|
34
|
+
["ModelTrafoInv", ruleFromIR(inv(Model))],
|
|
35
|
+
["ViewTrafo", ruleFromIR(View)],
|
|
36
|
+
["ViewTrafoInv", ruleFromIR(inv(View))],
|
|
37
|
+
["ProjTrafo", ruleFromIR(Proj)],
|
|
38
|
+
["ProjTrafoInv", ruleFromIR(inv(Proj))],
|
|
39
|
+
// Composites. `mul(a,b)` ⇒ matrix product `a · b`.
|
|
40
|
+
["ModelViewTrafo", ruleFromIR(chain(View, Model))],
|
|
41
|
+
["ModelViewTrafoInv", ruleFromIR(chain(inv(Model), inv(View)))],
|
|
42
|
+
["ModelViewProjTrafo", ruleFromIR(chain(Proj, View, Model))],
|
|
43
|
+
["ModelViewProjTrafoInv", ruleFromIR(chain(inv(Model), inv(View), inv(Proj)))],
|
|
44
|
+
["ViewProjTrafo", ruleFromIR(chain(Proj, View))],
|
|
45
|
+
["ViewProjTrafoInv", ruleFromIR(chain(inv(View), inv(Proj)))],
|
|
46
|
+
// NormalMatrix = (Model⁻¹)ᵀ, upper-3×3.
|
|
47
|
+
["NormalMatrix", ruleFromIR(upper3(transpose(inv(Model))), Tmat3)],
|
|
48
|
+
]);
|
|
49
|
+
/** Leaf name → the RO uniform (`spec.inputs[…]`) that supplies its `aval<Trafo3d>`. */
|
|
50
|
+
export const STANDARD_TRAFO_LEAVES = new Map([
|
|
51
|
+
["Model", "ModelTrafo"],
|
|
52
|
+
["View", "ViewTrafo"],
|
|
53
|
+
["Proj", "ProjTrafo"],
|
|
54
|
+
]);
|
|
55
|
+
export function isStandardDerivedName(name) {
|
|
56
|
+
return STANDARD_DERIVED_RULES.has(name);
|
|
133
57
|
}
|
|
134
58
|
//# sourceMappingURL=recipes.js.map
|