@flighthq/shading 0.5.1-next.815.cc08b93 → 0.5.1-next.903.f434bc2

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 (54) hide show
  1. package/README.md +2 -2
  2. package/dist/contract.d.ts +11 -0
  3. package/dist/contract.d.ts.map +1 -1
  4. package/dist/contract.js +11 -0
  5. package/dist/contract.js.map +1 -1
  6. package/dist/createAnimatedNormalModifier.d.ts +3 -2
  7. package/dist/createAnimatedNormalModifier.d.ts.map +1 -1
  8. package/dist/createAnimatedNormalModifier.js +14 -11
  9. package/dist/createAnimatedNormalModifier.js.map +1 -1
  10. package/dist/createDissolveModifier.d.ts +3 -2
  11. package/dist/createDissolveModifier.d.ts.map +1 -1
  12. package/dist/createDissolveModifier.js +14 -11
  13. package/dist/createDissolveModifier.js.map +1 -1
  14. package/dist/createEmissiveModifier.d.ts +3 -2
  15. package/dist/createEmissiveModifier.d.ts.map +1 -1
  16. package/dist/createEmissiveModifier.js +14 -11
  17. package/dist/createEmissiveModifier.js.map +1 -1
  18. package/dist/createEnvReflectModifier.d.ts +3 -2
  19. package/dist/createEnvReflectModifier.d.ts.map +1 -1
  20. package/dist/createEnvReflectModifier.js +13 -9
  21. package/dist/createEnvReflectModifier.js.map +1 -1
  22. package/dist/createFogModifier.d.ts +3 -2
  23. package/dist/createFogModifier.d.ts.map +1 -1
  24. package/dist/createFogModifier.js +14 -10
  25. package/dist/createFogModifier.js.map +1 -1
  26. package/dist/createRimModifier.d.ts +3 -2
  27. package/dist/createRimModifier.d.ts.map +1 -1
  28. package/dist/createRimModifier.js +13 -9
  29. package/dist/createRimModifier.js.map +1 -1
  30. package/dist/createShadedMaterial.d.ts +2 -1
  31. package/dist/createShadedMaterial.d.ts.map +1 -1
  32. package/dist/createShadedMaterial.js +19 -15
  33. package/dist/createShadedMaterial.js.map +1 -1
  34. package/dist/createToonModifier.d.ts +3 -2
  35. package/dist/createToonModifier.d.ts.map +1 -1
  36. package/dist/createToonModifier.js +11 -7
  37. package/dist/createToonModifier.js.map +1 -1
  38. package/dist/createVertexDisplaceModifier.d.ts +3 -3
  39. package/dist/createVertexDisplaceModifier.d.ts.map +1 -1
  40. package/dist/createVertexDisplaceModifier.js +16 -13
  41. package/dist/createVertexDisplaceModifier.js.map +1 -1
  42. package/dist/modifier.d.ts +3 -0
  43. package/dist/modifier.d.ts.map +1 -0
  44. package/dist/modifier.js +5 -0
  45. package/dist/modifier.js.map +1 -0
  46. package/dist/modifierRegistry.d.ts +2 -1
  47. package/dist/modifierRegistry.d.ts.map +1 -1
  48. package/dist/modifierRegistry.js +7 -2
  49. package/dist/modifierRegistry.js.map +1 -1
  50. package/package.json +3 -3
  51. package/src/getUnregisteredModifierKinds.test.ts +19 -3
  52. package/src/isModifierStackValid.test.ts +10 -1
  53. package/src/modifierRegistry.test.ts +11 -1
  54. package/src/orderModifierStack.test.ts +7 -2
package/README.md CHANGED
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/shading`. The `@flig
13
13
  This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
14
14
 
15
15
  - [Flight project](https://github.com/flighthq/flight)
16
- - [Source for @flighthq/shading@0.5.1-next.815.cc08b93](https://github.com/flighthq/flight/tree/cc08b93ef981080fa86bdd5143dc61dbdbf2665b/packages/shading)
17
- - [License](https://github.com/flighthq/flight/blob/cc08b93ef981080fa86bdd5143dc61dbdbf2665b/LICENSE.md)
16
+ - [Source for @flighthq/shading@0.5.1-next.903.f434bc2](https://github.com/flighthq/flight/tree/f434bc233778d75aeea61995df3a8cfaec459a85/packages/shading)
17
+ - [License](https://github.com/flighthq/flight/blob/f434bc233778d75aeea61995df3a8cfaec459a85/LICENSE.md)
@@ -1,4 +1,5 @@
1
1
  export * from './createAnimatedNormalModifier';
2
+ export * from './modifier';
2
3
  export * from './createDissolveModifier';
3
4
  export * from './createEmissiveModifier';
4
5
  export * from './createEnvReflectModifier';
@@ -14,4 +15,14 @@ export * from './isModifierStackValid';
14
15
  export * from './modifierRegistry';
15
16
  export * from './orderModifierStack';
16
17
  export * from './registerBuiltInModifiers';
18
+ export { initializeVertexDisplaceModifier } from './createVertexDisplaceModifier';
19
+ export { initializeShadedMaterial } from './createShadedMaterial';
20
+ export { initializeEnvReflectModifier } from './createEnvReflectModifier';
21
+ export { initializeEmissiveModifier } from './createEmissiveModifier';
22
+ export { initializeAnimatedNormalModifier } from './createAnimatedNormalModifier';
23
+ export { initializeToonModifier } from './createToonModifier';
24
+ export { initializeDissolveModifier } from './createDissolveModifier';
25
+ export { initializeFogModifier } from './createFogModifier';
26
+ export { initializeRimModifier } from './createRimModifier';
27
+ export { initializeModifierRegistry } from './modifierRegistry';
17
28
  //# sourceMappingURL=contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/contract.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './createAnimatedNormalModifier';
2
+ export * from './modifier';
2
3
  export * from './createDissolveModifier';
3
4
  export * from './createEmissiveModifier';
4
5
  export * from './createEnvReflectModifier';
@@ -14,4 +15,14 @@ export * from './isModifierStackValid';
14
15
  export * from './modifierRegistry';
15
16
  export * from './orderModifierStack';
16
17
  export * from './registerBuiltInModifiers';
18
+ export { initializeVertexDisplaceModifier } from './createVertexDisplaceModifier';
19
+ export { initializeShadedMaterial } from './createShadedMaterial';
20
+ export { initializeEnvReflectModifier } from './createEnvReflectModifier';
21
+ export { initializeEmissiveModifier } from './createEmissiveModifier';
22
+ export { initializeAnimatedNormalModifier } from './createAnimatedNormalModifier';
23
+ export { initializeToonModifier } from './createToonModifier';
24
+ export { initializeDissolveModifier } from './createDissolveModifier';
25
+ export { initializeFogModifier } from './createFogModifier';
26
+ export { initializeRimModifier } from './createRimModifier';
27
+ export { initializeModifierRegistry } from './modifierRegistry';
17
28
  //# sourceMappingURL=contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,3 +1,4 @@
1
- import type { AnimatedNormalModifier, AnimatedNormalModifierOptions, NonEntityCreateResult } from '@flighthq/types/contract';
2
- export declare function createAnimatedNormalModifier(options: Readonly<AnimatedNormalModifierOptions>): NonEntityCreateResult<AnimatedNormalModifier, 'descriptor'>;
1
+ import type { AnimatedNormalModifier, AnimatedNormalModifierOptions, EntityConstruction } from '@flighthq/types/contract';
2
+ export declare function createAnimatedNormalModifier(options: Readonly<AnimatedNormalModifierOptions>): AnimatedNormalModifier;
3
+ export declare function initializeAnimatedNormalModifier(out: EntityConstruction<AnimatedNormalModifier>, options: Readonly<AnimatedNormalModifierOptions>): void;
3
4
  //# sourceMappingURL=createAnimatedNormalModifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createAnimatedNormalModifier.d.ts","sourceRoot":"","sources":["../src/createAnimatedNormalModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,6BAA6B,EAC7B,qBAAqB,EACtB,MAAM,0BAA0B,CAAC;AAclC,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAC/C,qBAAqB,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAW7D"}
1
+ {"version":3,"file":"createAnimatedNormalModifier.d.ts","sourceRoot":"","sources":["../src/createAnimatedNormalModifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAUlC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,sBAAsB,CAIrH;AAQD,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,kBAAkB,CAAC,sBAAsB,CAAC,EAC/C,OAAO,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAC/C,IAAI,CAON"}
@@ -1,26 +1,29 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import { AnimatedNormalModifierKind, ModifierSlot } from '@flighthq/types/contract';
3
+ import { initializeModifier } from './modifier';
2
4
  // The options for `createAnimatedNormalModifier`. `map` (nullable) and `scroll` are required; the
3
5
  // optional second layer and `strength` carry documented defaults. `map` presence and `secondaryMap`
4
6
  // presence are compile-time structural — they drive the define-key signature (disabled / single /
5
7
  // dual) — while `scroll`/`strength` are uniform-fed.
8
+ export function createAnimatedNormalModifier(options) {
9
+ const out = allocateEntity();
10
+ initializeAnimatedNormalModifier(out, options);
11
+ return finishEntity(out);
12
+ }
6
13
  // Builds an AnimatedNormalModifier (slot: Normal) — a UV-panned normal map that perturbs the surface
7
14
  // normal, scrolled by the shading tier's per-frame `time` uniform. Covers animated water, lava, and
8
15
  // flow. `scroll` is the pan speed in UV units per second (a plain Vector2Like value, copied by
9
16
  // reference); `strength` defaults to 1. An optional `secondaryMap` (+ `secondaryScroll`) adds a
10
17
  // second layer panning at a different rate to break up tiling — omitted leaves the modifier a single
11
18
  // layer.
12
- export function createAnimatedNormalModifier(options) {
13
- const modifier = {
14
- kind: AnimatedNormalModifierKind,
15
- slot: ModifierSlot.Normal,
16
- map: options.map,
17
- scroll: options.scroll,
18
- strength: options.strength ?? 1,
19
- };
19
+ export function initializeAnimatedNormalModifier(out, options) {
20
+ initializeModifier(out, AnimatedNormalModifierKind, ModifierSlot.Normal);
21
+ out.map = options.map;
22
+ out.scroll = options.scroll;
23
+ out.strength = options.strength ?? 1;
20
24
  if (options.secondaryMap !== undefined)
21
- modifier.secondaryMap = options.secondaryMap;
25
+ out.secondaryMap = options.secondaryMap;
22
26
  if (options.secondaryScroll !== undefined)
23
- modifier.secondaryScroll = options.secondaryScroll;
24
- return modifier;
27
+ out.secondaryScroll = options.secondaryScroll;
25
28
  }
26
29
  //# sourceMappingURL=createAnimatedNormalModifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createAnimatedNormalModifier.js","sourceRoot":"","sources":["../src/createAnimatedNormalModifier.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEpF,kGAAkG;AAClG,oGAAoG;AACpG,kGAAkG;AAClG,qDAAqD;AAErD,qGAAqG;AACrG,oGAAoG;AACpG,+FAA+F;AAC/F,gGAAgG;AAChG,qGAAqG;AACrG,SAAS;AACT,MAAM,UAAU,4BAA4B,CAC1C,OAAgD;IAEhD,MAAM,QAAQ,GAA2B;QACvC,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,YAAY,CAAC,MAAM;QACzB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;KAChC,CAAC;IACF,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;QAAE,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACrF,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS;QAAE,QAAQ,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAC9F,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"createAnimatedNormalModifier.js","sourceRoot":"","sources":["../src/createAnimatedNormalModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAMzE,OAAO,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,kGAAkG;AAClG,oGAAoG;AACpG,kGAAkG;AAClG,qDAAqD;AAErD,MAAM,UAAU,4BAA4B,CAAC,OAAgD;IAC3F,MAAM,GAAG,GAAG,cAAc,EAA0B,CAAC;IACrD,gCAAgC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,qGAAqG;AACrG,oGAAoG;AACpG,+FAA+F;AAC/F,gGAAgG;AAChG,qGAAqG;AACrG,SAAS;AACT,MAAM,UAAU,gCAAgC,CAC9C,GAA+C,EAC/C,OAAgD;IAEhD,kBAAkB,CAAC,GAAG,EAAE,0BAA0B,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IACzE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACtB,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS;QAAE,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAChF,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS;QAAE,GAAG,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;AAC3F,CAAC"}
@@ -1,3 +1,4 @@
1
- import type { DissolveModifier, DissolveModifierOptions, NonEntityCreateResult } from '@flighthq/types/contract';
2
- export declare function createDissolveModifier(options: Readonly<DissolveModifierOptions>): NonEntityCreateResult<DissolveModifier, 'descriptor'>;
1
+ import type { DissolveModifier, DissolveModifierOptions, EntityConstruction } from '@flighthq/types/contract';
2
+ export declare function createDissolveModifier(options: Readonly<DissolveModifierOptions>): DissolveModifier;
3
+ export declare function initializeDissolveModifier(out: EntityConstruction<DissolveModifier>, options: Readonly<DissolveModifierOptions>): void;
3
4
  //# sourceMappingURL=createDissolveModifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createDissolveModifier.d.ts","sourceRoot":"","sources":["../src/createDissolveModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAajH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GACzC,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAWvD"}
1
+ {"version":3,"file":"createDissolveModifier.d.ts","sourceRoot":"","sources":["../src/createDissolveModifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAS9G,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAInG;AAQD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EACzC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GACzC,IAAI,CAON"}
@@ -1,24 +1,27 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import { DissolveModifierKind, ModifierSlot } from '@flighthq/types/contract';
3
+ import { initializeModifier } from './modifier';
2
4
  // The options for `createDissolveModifier`. Only `threshold` is required; the rest carry documented
3
5
  // defaults. `map` presence is compile-time structural (sampled mask vs procedural noise, driving the
4
6
  // define-key signature); `threshold`/`edgeWidth`/`scale` are uniform-fed and `edgeColor` is packed.
7
+ export function createDissolveModifier(options) {
8
+ const out = allocateEntity();
9
+ initializeDissolveModifier(out, options);
10
+ return finishEntity(out);
11
+ }
5
12
  // Builds a DissolveModifier (slot: Effect) — a clip/burn dissolve of the shaded output. A per-fragment
6
13
  // noise value (procedural over the UV, or sampled from `map`'s red channel) is compared against
7
14
  // `threshold`; fragments below it are discarded and a band of width `edgeWidth` above it glows
8
15
  // `edgeColor`. Animate `threshold` from 0 to 1 to disintegrate the surface. `edgeColor` is packed sRgb
9
16
  // RGBA (default 0xff6600ff); `edgeWidth` defaults to 0.05 (0 = hard clip); `scale` (procedural-noise
10
17
  // frequency, ignored with `map`) defaults to 8. `map` is copied by reference only when provided.
11
- export function createDissolveModifier(options) {
12
- const modifier = {
13
- kind: DissolveModifierKind,
14
- slot: ModifierSlot.Effect,
15
- threshold: options.threshold,
16
- edgeColor: options.edgeColor ?? 0xff6600ff,
17
- edgeWidth: options.edgeWidth ?? 0.05,
18
- scale: options.scale ?? 8,
19
- };
18
+ export function initializeDissolveModifier(out, options) {
19
+ initializeModifier(out, DissolveModifierKind, ModifierSlot.Effect);
20
+ out.threshold = options.threshold;
21
+ out.edgeColor = options.edgeColor ?? 0xff6600ff;
22
+ out.edgeWidth = options.edgeWidth ?? 0.05;
23
+ out.scale = options.scale ?? 8;
20
24
  if (options.map !== undefined)
21
- modifier.map = options.map;
22
- return modifier;
25
+ out.map = options.map;
23
26
  }
24
27
  //# sourceMappingURL=createDissolveModifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createDissolveModifier.js","sourceRoot":"","sources":["../src/createDissolveModifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE9E,oGAAoG;AACpG,qGAAqG;AACrG,oGAAoG;AAEpG,uGAAuG;AACvG,gGAAgG;AAChG,+FAA+F;AAC/F,uGAAuG;AACvG,qGAAqG;AACrG,iGAAiG;AACjG,MAAM,UAAU,sBAAsB,CACpC,OAA0C;IAE1C,MAAM,QAAQ,GAAqB;QACjC,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,YAAY,CAAC,MAAM;QACzB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,UAAU;QAC1C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;KAC1B,CAAC;IACF,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS;QAAE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAC1D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"createDissolveModifier.js","sourceRoot":"","sources":["../src/createDissolveModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,oGAAoG;AACpG,qGAAqG;AACrG,oGAAoG;AAEpG,MAAM,UAAU,sBAAsB,CAAC,OAA0C;IAC/E,MAAM,GAAG,GAAG,cAAc,EAAoB,CAAC;IAC/C,0BAA0B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,uGAAuG;AACvG,gGAAgG;AAChG,+FAA+F;AAC/F,uGAAuG;AACvG,qGAAqG;AACrG,iGAAiG;AACjG,MAAM,UAAU,0BAA0B,CACxC,GAAyC,EACzC,OAA0C;IAE1C,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IACnE,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAClC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;IAChD,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC1C,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IAC/B,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS;QAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;AACvD,CAAC"}
@@ -1,3 +1,4 @@
1
- import type { EmissiveModifier, EmissiveModifierOptions, NonEntityCreateResult } from '@flighthq/types/contract';
2
- export declare function createEmissiveModifier(options: Readonly<EmissiveModifierOptions>): NonEntityCreateResult<EmissiveModifier, 'descriptor'>;
1
+ import type { EmissiveModifier, EmissiveModifierOptions, EntityConstruction } from '@flighthq/types/contract';
2
+ export declare function createEmissiveModifier(options: Readonly<EmissiveModifierOptions>): EmissiveModifier;
3
+ export declare function initializeEmissiveModifier(out: EntityConstruction<EmissiveModifier>, options: Readonly<EmissiveModifierOptions>): void;
3
4
  //# sourceMappingURL=createEmissiveModifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createEmissiveModifier.d.ts","sourceRoot":"","sources":["../src/createEmissiveModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAcjH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GACzC,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAWvD"}
1
+ {"version":3,"file":"createEmissiveModifier.d.ts","sourceRoot":"","sources":["../src/createEmissiveModifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAU9G,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAInG;AAQD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,EACzC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GACzC,IAAI,CAON"}
@@ -1,25 +1,28 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import { EmissiveModifierFacing, EmissiveModifierKind, ModifierSlot } from '@flighthq/types/contract';
3
+ import { initializeModifier } from './modifier';
2
4
  // The options for `createEmissiveModifier`. Only `color` is required; every other field carries a
3
5
  // documented default so the returned descriptor is fully populated (the define-key signature reads
4
6
  // `mask`/`facing` structurally, so leaving them at their defaults yields the unmasked, ungated
5
7
  // program variant).
8
+ export function createEmissiveModifier(options) {
9
+ const out = allocateEntity();
10
+ initializeEmissiveModifier(out, options);
11
+ return finishEntity(out);
12
+ }
6
13
  // Builds an EmissiveModifier (slot: Emissive) — a self-illuminating contribution added to the shaded
7
14
  // output, optionally masked and optionally gated by surface facing (the night-side city-lights case
8
15
  // uses `AwayFromLight`). `color` is packed sRgb-albedo RGBA (0xrrggbbaa); `strength` scales linear
9
16
  // radiance and defaults to 1; `facing` defaults to Ignore (emit everywhere) and `facingSoftness` to
10
17
  // 0 (a hard terminator). `mask` is copied by reference only when provided — omitted leaves the
11
18
  // descriptor unmasked.
12
- export function createEmissiveModifier(options) {
13
- const modifier = {
14
- kind: EmissiveModifierKind,
15
- slot: ModifierSlot.Emissive,
16
- color: options.color,
17
- strength: options.strength ?? 1,
18
- facing: options.facing ?? EmissiveModifierFacing.Ignore,
19
- facingSoftness: options.facingSoftness ?? 0,
20
- };
19
+ export function initializeEmissiveModifier(out, options) {
20
+ initializeModifier(out, EmissiveModifierKind, ModifierSlot.Emissive);
21
+ out.color = options.color;
22
+ out.strength = options.strength ?? 1;
23
+ out.facing = options.facing ?? EmissiveModifierFacing.Ignore;
24
+ out.facingSoftness = options.facingSoftness ?? 0;
21
25
  if (options.mask !== undefined)
22
- modifier.mask = options.mask;
23
- return modifier;
26
+ out.mask = options.mask;
24
27
  }
25
28
  //# sourceMappingURL=createEmissiveModifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createEmissiveModifier.js","sourceRoot":"","sources":["../src/createEmissiveModifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtG,kGAAkG;AAClG,mGAAmG;AACnG,+FAA+F;AAC/F,oBAAoB;AAEpB,qGAAqG;AACrG,oGAAoG;AACpG,mGAAmG;AACnG,oGAAoG;AACpG,+FAA+F;AAC/F,uBAAuB;AACvB,MAAM,UAAU,sBAAsB,CACpC,OAA0C;IAE1C,MAAM,QAAQ,GAAqB;QACjC,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,YAAY,CAAC,QAAQ;QAC3B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,sBAAsB,CAAC,MAAM;QACvD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC;KAC5C,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7D,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"createEmissiveModifier.js","sourceRoot":"","sources":["../src/createEmissiveModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEtG,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,kGAAkG;AAClG,mGAAmG;AACnG,+FAA+F;AAC/F,oBAAoB;AAEpB,MAAM,UAAU,sBAAsB,CAAC,OAA0C;IAC/E,MAAM,GAAG,GAAG,cAAc,EAAoB,CAAC;IAC/C,0BAA0B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,qGAAqG;AACrG,oGAAoG;AACpG,mGAAmG;AACnG,oGAAoG;AACpG,+FAA+F;AAC/F,uBAAuB;AACvB,MAAM,UAAU,0BAA0B,CACxC,GAAyC,EACzC,OAA0C;IAE1C,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACrE,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACrC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC;IAC7D,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAC1D,CAAC"}
@@ -1,3 +1,4 @@
1
- import type { EnvReflectModifier, EnvReflectModifierOptions, NonEntityCreateResult } from '@flighthq/types/contract';
2
- export declare function createEnvReflectModifier(options?: Readonly<EnvReflectModifierOptions>): NonEntityCreateResult<EnvReflectModifier, 'descriptor'>;
1
+ import type { EnvReflectModifier, EnvReflectModifierOptions, EntityConstruction } from '@flighthq/types/contract';
2
+ export declare function createEnvReflectModifier(options?: Readonly<EnvReflectModifierOptions>): EnvReflectModifier;
3
+ export declare function initializeEnvReflectModifier(out: EntityConstruction<EnvReflectModifier>, options?: Readonly<EnvReflectModifierOptions>): void;
3
4
  //# sourceMappingURL=createEnvReflectModifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createEnvReflectModifier.d.ts","sourceRoot":"","sources":["../src/createEnvReflectModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAarH,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAC5C,qBAAqB,CAAC,kBAAkB,EAAE,YAAY,CAAC,CASzD"}
1
+ {"version":3,"file":"createEnvReflectModifier.d.ts","sourceRoot":"","sources":["../src/createEnvReflectModifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AASlH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAAG,kBAAkB,CAI1G;AAQD,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,EAC3C,OAAO,CAAC,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAC5C,IAAI,CAMN"}
@@ -1,21 +1,25 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import { EnvReflectModifierKind, ModifierSlot } from '@flighthq/types/contract';
3
+ import { initializeModifier } from './modifier';
2
4
  // The options for `createEnvReflectModifier`. Every field is optional and carries a documented
3
5
  // default so the returned descriptor is fully populated (all four are uniform-fed scalars, so an
4
6
  // env-reflect modifier has a single define-key signature regardless of their values).
7
+ export function createEnvReflectModifier(options) {
8
+ const out = allocateEntity();
9
+ initializeEnvReflectModifier(out, options);
10
+ return finishEntity(out);
11
+ }
5
12
  // Builds an EnvReflectModifier (slot: Effect) — a view-dependent reflection of the scene's baked
6
13
  // environment cubemap added to the shaded output. It samples the SAME prefiltered environment the lit
7
14
  // block already binds (no second cubemap), reflecting the view vector about the surface normal and
8
15
  // blending by a Fresnel-Schlick ramp. `tint` is packed sRgb RGBA over the sampled color and defaults
9
16
  // to opaque white; `intensity` scales the whole term (default 1); `fresnelBias` is f0 (default 0.04,
10
17
  // a dielectric); `roughness` selects a blurrier prefiltered mip (default 0 = mirror-sharp).
11
- export function createEnvReflectModifier(options) {
12
- return {
13
- kind: EnvReflectModifierKind,
14
- slot: ModifierSlot.Effect,
15
- tint: options?.tint ?? 0xffffffff,
16
- intensity: options?.intensity ?? 1,
17
- fresnelBias: options?.fresnelBias ?? 0.04,
18
- roughness: options?.roughness ?? 0,
19
- };
18
+ export function initializeEnvReflectModifier(out, options) {
19
+ initializeModifier(out, EnvReflectModifierKind, ModifierSlot.Effect);
20
+ out.tint = options?.tint ?? 0xffffffff;
21
+ out.intensity = options?.intensity ?? 1;
22
+ out.fresnelBias = options?.fresnelBias ?? 0.04;
23
+ out.roughness = options?.roughness ?? 0;
20
24
  }
21
25
  //# sourceMappingURL=createEnvReflectModifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createEnvReflectModifier.js","sourceRoot":"","sources":["../src/createEnvReflectModifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEhF,+FAA+F;AAC/F,iGAAiG;AACjG,sFAAsF;AAEtF,iGAAiG;AACjG,sGAAsG;AACtG,mGAAmG;AACnG,qGAAqG;AACrG,qGAAqG;AACrG,4FAA4F;AAC5F,MAAM,UAAU,wBAAwB,CACtC,OAA6C;IAE7C,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,IAAI,EAAE,YAAY,CAAC,MAAM;QACzB,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,UAAU;QACjC,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC;QAClC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,IAAI;QACzC,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,CAAC;KACnC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createEnvReflectModifier.js","sourceRoot":"","sources":["../src/createEnvReflectModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,+FAA+F;AAC/F,iGAAiG;AACjG,sFAAsF;AAEtF,MAAM,UAAU,wBAAwB,CAAC,OAA6C;IACpF,MAAM,GAAG,GAAG,cAAc,EAAsB,CAAC;IACjD,4BAA4B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,iGAAiG;AACjG,sGAAsG;AACtG,mGAAmG;AACnG,qGAAqG;AACrG,qGAAqG;AACrG,4FAA4F;AAC5F,MAAM,UAAU,4BAA4B,CAC1C,GAA2C,EAC3C,OAA6C;IAE7C,kBAAkB,CAAC,GAAG,EAAE,sBAAsB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IACrE,GAAG,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,UAAU,CAAC;IACvC,GAAG,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC;IACxC,GAAG,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC;IAC/C,GAAG,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC;AAC1C,CAAC"}
@@ -1,3 +1,4 @@
1
- import type { FogModifier, FogModifierOptions, NonEntityCreateResult } from '@flighthq/types/contract';
2
- export declare function createFogModifier(options: Readonly<FogModifierOptions>): NonEntityCreateResult<FogModifier, 'descriptor'>;
1
+ import type { FogModifier, FogModifierOptions, EntityConstruction } from '@flighthq/types/contract';
2
+ export declare function createFogModifier(options: Readonly<FogModifierOptions>): FogModifier;
3
+ export declare function initializeFogModifier(out: EntityConstruction<FogModifier>, options: Readonly<FogModifierOptions>): void;
3
4
  //# sourceMappingURL=createFogModifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createFogModifier.d.ts","sourceRoot":"","sources":["../src/createFogModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAavG,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACpC,qBAAqB,CAAC,WAAW,EAAE,YAAY,CAAC,CAUlD"}
1
+ {"version":3,"file":"createFogModifier.d.ts","sourceRoot":"","sources":["../src/createFogModifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAUpG,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAIpF;AAOD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,kBAAkB,CAAC,WAAW,CAAC,EACpC,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACpC,IAAI,CAON"}
@@ -1,22 +1,26 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import { FogModifierKind, FogModifierMode, ModifierSlot } from '@flighthq/types/contract';
3
+ import { initializeModifier } from './modifier';
2
4
  // The options for `createFogModifier`. Only `color` is required; `mode`/`near`/`far`/`density` carry
3
5
  // documented defaults. `mode` is compile-time structural (each curve emits different GLSL, so it
4
6
  // drives the define-key signature); the numeric fields are uniform-fed and leave the program shape
5
7
  // identical.
8
+ export function createFogModifier(options) {
9
+ const out = allocateEntity();
10
+ initializeFogModifier(out, options);
11
+ return finishEntity(out);
12
+ }
6
13
  // Builds a FogModifier (slot: Effect) — blends the shaded output toward `color` by camera-distance
7
14
  // density. `color` is packed sRgb RGBA. `mode` defaults to Linear (using `near`/`far` as the ramp
8
15
  // endpoints, defaults 0 and 1); the Exponential/Exponential2 modes use `density` (default 1) as the
9
16
  // falloff rate. This is the per-material forward-shaded fog term, the compiled sibling of the
10
17
  // post-process ScreenSpaceFogEffect.
11
- export function createFogModifier(options) {
12
- return {
13
- kind: FogModifierKind,
14
- slot: ModifierSlot.Effect,
15
- color: options.color,
16
- mode: options.mode ?? FogModifierMode.Linear,
17
- near: options.near ?? 0,
18
- far: options.far ?? 1,
19
- density: options.density ?? 1,
20
- };
18
+ export function initializeFogModifier(out, options) {
19
+ initializeModifier(out, FogModifierKind, ModifierSlot.Effect);
20
+ out.color = options.color;
21
+ out.mode = options.mode ?? FogModifierMode.Linear;
22
+ out.near = options.near ?? 0;
23
+ out.far = options.far ?? 1;
24
+ out.density = options.density ?? 1;
21
25
  }
22
26
  //# sourceMappingURL=createFogModifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createFogModifier.js","sourceRoot":"","sources":["../src/createFogModifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE1F,qGAAqG;AACrG,iGAAiG;AACjG,mGAAmG;AACnG,aAAa;AAEb,mGAAmG;AACnG,kGAAkG;AAClG,oGAAoG;AACpG,8FAA8F;AAC9F,qCAAqC;AACrC,MAAM,UAAU,iBAAiB,CAC/B,OAAqC;IAErC,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,YAAY,CAAC,MAAM;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC,MAAM;QAC5C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC;QACvB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;KAC9B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createFogModifier.js","sourceRoot":"","sources":["../src/createFogModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,qGAAqG;AACrG,iGAAiG;AACjG,mGAAmG;AACnG,aAAa;AAEb,MAAM,UAAU,iBAAiB,CAAC,OAAqC;IACrE,MAAM,GAAG,GAAG,cAAc,EAAe,CAAC;IAC1C,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,mGAAmG;AACnG,kGAAkG;AAClG,oGAAoG;AACpG,8FAA8F;AAC9F,qCAAqC;AACrC,MAAM,UAAU,qBAAqB,CACnC,GAAoC,EACpC,OAAqC;IAErC,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9D,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC;IAClD,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;IAC7B,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3B,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;AACrC,CAAC"}
@@ -1,3 +1,4 @@
1
- import type { NonEntityCreateResult, RimModifier, RimModifierOptions } from '@flighthq/types/contract';
2
- export declare function createRimModifier(options: Readonly<RimModifierOptions>): NonEntityCreateResult<RimModifier, 'descriptor'>;
1
+ import type { RimModifier, RimModifierOptions, EntityConstruction } from '@flighthq/types/contract';
2
+ export declare function createRimModifier(options: Readonly<RimModifierOptions>): RimModifier;
3
+ export declare function initializeRimModifier(out: EntityConstruction<RimModifier>, options: Readonly<RimModifierOptions>): void;
3
4
  //# sourceMappingURL=createRimModifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createRimModifier.d.ts","sourceRoot":"","sources":["../src/createRimModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAYvG,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACpC,qBAAqB,CAAC,WAAW,EAAE,YAAY,CAAC,CASlD"}
1
+ {"version":3,"file":"createRimModifier.d.ts","sourceRoot":"","sources":["../src/createRimModifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AASpG,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAIpF;AAOD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,kBAAkB,CAAC,WAAW,CAAC,EACpC,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACpC,IAAI,CAMN"}
@@ -1,20 +1,24 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import { ModifierSlot, RimModifierKind } from '@flighthq/types/contract';
3
+ import { initializeModifier } from './modifier';
2
4
  // The options for `createRimModifier`. Only `color` is required; `power`/`intensity`/`bias` carry
3
5
  // documented defaults. All three are uniform-fed scalars — they do not change the emitted program,
4
6
  // so a rim modifier has a single define-key signature regardless of their values.
7
+ export function createRimModifier(options) {
8
+ const out = allocateEntity();
9
+ initializeRimModifier(out, options);
10
+ return finishEntity(out);
11
+ }
5
12
  // Builds a RimModifier (slot: Effect) — a view-dependent Fresnel rim added to the shaded output at
6
13
  // grazing angles, following `bias + intensity * pow(1 - dot(N, V), power)`. Covers the atmospheric
7
14
  // halo, force-field shields, and NPR rim light. `color` is packed sRgb-albedo RGBA (0xrrggbbaa);
8
15
  // `power` (falloff exponent, higher = tighter) defaults to 3, `intensity` to 1, and `bias` (the
9
16
  // constant floor before the falloff) to 0 (pure Fresnel).
10
- export function createRimModifier(options) {
11
- return {
12
- kind: RimModifierKind,
13
- slot: ModifierSlot.Effect,
14
- color: options.color,
15
- power: options.power ?? 3,
16
- intensity: options.intensity ?? 1,
17
- bias: options.bias ?? 0,
18
- };
17
+ export function initializeRimModifier(out, options) {
18
+ initializeModifier(out, RimModifierKind, ModifierSlot.Effect);
19
+ out.color = options.color;
20
+ out.power = options.power ?? 3;
21
+ out.intensity = options.intensity ?? 1;
22
+ out.bias = options.bias ?? 0;
19
23
  }
20
24
  //# sourceMappingURL=createRimModifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createRimModifier.js","sourceRoot":"","sources":["../src/createRimModifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEzE,kGAAkG;AAClG,mGAAmG;AACnG,kFAAkF;AAElF,mGAAmG;AACnG,mGAAmG;AACnG,iGAAiG;AACjG,gGAAgG;AAChG,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB,CAC/B,OAAqC;IAErC,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,YAAY,CAAC,MAAM;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QACzB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC;QACjC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC;KACxB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createRimModifier.js","sourceRoot":"","sources":["../src/createRimModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,kGAAkG;AAClG,mGAAmG;AACnG,kFAAkF;AAElF,MAAM,UAAU,iBAAiB,CAAC,OAAqC;IACrE,MAAM,GAAG,GAAG,cAAc,EAAe,CAAC;IAC1C,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACpC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,mGAAmG;AACnG,mGAAmG;AACnG,iGAAiG;AACjG,gGAAgG;AAChG,0DAA0D;AAC1D,MAAM,UAAU,qBAAqB,CACnC,GAAoC,EACpC,OAAqC;IAErC,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9D,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IAC/B,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -1,3 +1,4 @@
1
- import type { ShadedMaterial, ShadedMaterialOptions } from '@flighthq/types/contract';
1
+ import type { EntityConstruction, ShadedMaterial, ShadedMaterialOptions } from '@flighthq/types/contract';
2
2
  export declare function createShadedMaterial(options?: Readonly<ShadedMaterialOptions>): ShadedMaterial;
3
+ export declare function initializeShadedMaterial(out: EntityConstruction<ShadedMaterial>, options: Readonly<ShadedMaterialOptions>): void;
3
4
  //# sourceMappingURL=createShadedMaterial.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createShadedMaterial.d.ts","sourceRoot":"","sources":["../src/createShadedMaterial.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAiBtF,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,cAAc,CAe9F"}
1
+ {"version":3,"file":"createShadedMaterial.d.ts","sourceRoot":"","sources":["../src/createShadedMaterial.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAiB1G,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,cAAc,CAI9F;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,kBAAkB,CAAC,cAAc,CAAC,EACvC,OAAO,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GACvC,IAAI,CAcN"}
@@ -1,4 +1,4 @@
1
- import { createEntity } from '@flighthq/entity/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
2
  import { BlendMode, ShadedMaterialKind } from '@flighthq/types/contract';
3
3
  // The options for `createShadedMaterial`. Every field is optional and defaults to the classic lit
4
4
  // base at neutral values (white diffuse/specular, shininess 32, no maps, an empty modifier stack);
@@ -14,19 +14,23 @@ import { BlendMode, ShadedMaterialKind } from '@flighthq/types/contract';
14
14
  // construction, exactly as for BlinnPhong/PBR. The result is an entity (it carries runtime/binding
15
15
  // identity), not a plain literal.
16
16
  export function createShadedMaterial(options) {
17
- const material = createEntity({ kind: ShadedMaterialKind });
18
- material.alphaCutoff = options?.alphaCutoff ?? 0.5;
19
- material.alphaMode = options?.alphaMode ?? 'opaque';
20
- material.blendMode = options?.blendMode ?? BlendMode.Normal;
21
- material.diffuse = options?.diffuse ?? 0xffffffff;
22
- material.diffuseMap = options?.diffuseMap ?? null;
23
- material.doubleSided = options?.doubleSided ?? false;
24
- material.modifiers = options?.modifiers ?? [];
25
- material.normalMap = options?.normalMap ?? null;
26
- material.normalScale = options?.normalScale ?? 1;
27
- material.shininess = options?.shininess ?? 32;
28
- material.specular = options?.specular ?? 0xffffffff;
29
- material.specularMap = options?.specularMap ?? null;
30
- return material;
17
+ const out = allocateEntity();
18
+ initializeShadedMaterial(out, options ?? {});
19
+ return finishEntity(out);
20
+ }
21
+ export function initializeShadedMaterial(out, options) {
22
+ out.kind = ShadedMaterialKind;
23
+ out.alphaCutoff = options.alphaCutoff ?? 0.5;
24
+ out.alphaMode = options.alphaMode ?? 'opaque';
25
+ out.blendMode = options.blendMode ?? BlendMode.Normal;
26
+ out.diffuse = options.diffuse ?? 0xffffffff;
27
+ out.diffuseMap = options.diffuseMap ?? null;
28
+ out.doubleSided = options.doubleSided ?? false;
29
+ out.modifiers = options.modifiers ?? [];
30
+ out.normalMap = options.normalMap ?? null;
31
+ out.normalScale = options.normalScale ?? 1;
32
+ out.shininess = options.shininess ?? 32;
33
+ out.specular = options.specular ?? 0xffffffff;
34
+ out.specularMap = options.specularMap ?? null;
31
35
  }
32
36
  //# sourceMappingURL=createShadedMaterial.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createShadedMaterial.js","sourceRoot":"","sources":["../src/createShadedMaterial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,kGAAkG;AAClG,mGAAmG;AACnG,mEAAmE;AAEnE,+FAA+F;AAC/F,qGAAqG;AACrG,iGAAiG;AACjG,oGAAoG;AACpG,mGAAmG;AACnG,wGAAwG;AACxG,0GAA0G;AAC1G,uGAAuG;AACvG,mGAAmG;AACnG,kCAAkC;AAClC,MAAM,UAAU,oBAAoB,CAAC,OAAyC;IAC5E,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAmB,CAAC;IAC9E,QAAQ,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,GAAG,CAAC;IACnD,QAAQ,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,QAAQ,CAAC;IACpD,QAAQ,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC;IAC5D,QAAQ,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,UAAU,CAAC;IAClD,QAAQ,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;IAClD,QAAQ,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,KAAK,CAAC;IACrD,QAAQ,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;IAC9C,QAAQ,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;IAChD,QAAQ,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC;IACjD,QAAQ,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;IAC9C,QAAQ,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,UAAU,CAAC;IACpD,QAAQ,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"createShadedMaterial.js","sourceRoot":"","sources":["../src/createShadedMaterial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,kGAAkG;AAClG,mGAAmG;AACnG,mEAAmE;AAEnE,+FAA+F;AAC/F,qGAAqG;AACrG,iGAAiG;AACjG,oGAAoG;AACpG,mGAAmG;AACnG,wGAAwG;AACxG,0GAA0G;AAC1G,uGAAuG;AACvG,mGAAmG;AACnG,kCAAkC;AAClC,MAAM,UAAU,oBAAoB,CAAC,OAAyC;IAC5E,MAAM,GAAG,GAAG,cAAc,EAAkB,CAAC;IAC7C,wBAAwB,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC7C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,GAAuC,EACvC,OAAwC;IAExC,GAAG,CAAC,IAAI,GAAG,kBAAkB,CAAC;IAC9B,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;IAC7C,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC;IAC9C,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC;IACtD,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC;IAC5C,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;IAC5C,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC;IAC/C,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IACxC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC1C,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3C,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IACxC,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;IAC9C,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;AAChD,CAAC"}
@@ -1,3 +1,4 @@
1
- import type { NonEntityCreateResult, ToonModifier, ToonModifierOptions } from '@flighthq/types/contract';
2
- export declare function createToonModifier(options: Readonly<ToonModifierOptions>): NonEntityCreateResult<ToonModifier, 'descriptor'>;
1
+ import type { ToonModifier, ToonModifierOptions, EntityConstruction } from '@flighthq/types/contract';
2
+ export declare function createToonModifier(options: Readonly<ToonModifierOptions>): ToonModifier;
3
+ export declare function initializeToonModifier(out: EntityConstruction<ToonModifier>, options: Readonly<ToonModifierOptions>): void;
3
4
  //# sourceMappingURL=createToonModifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createToonModifier.d.ts","sourceRoot":"","sources":["../src/createToonModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAYzG,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GACrC,qBAAqB,CAAC,YAAY,EAAE,YAAY,CAAC,CAOnD"}
1
+ {"version":3,"file":"createToonModifier.d.ts","sourceRoot":"","sources":["../src/createToonModifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAStG,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,YAAY,CAIvF;AAOD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,kBAAkB,CAAC,YAAY,CAAC,EACrC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GACrC,IAAI,CAIN"}
@@ -1,18 +1,22 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import { ModifierSlot, ToonModifierKind } from '@flighthq/types/contract';
3
+ import { initializeModifier } from './modifier';
2
4
  // The options for `createToonModifier`. Only `steps` is required; `smoothness` carries a documented
3
5
  // default. Both are uniform-fed scalars — they do not change the emitted program, so a toon modifier
4
6
  // has a single define-key signature regardless of their values.
7
+ export function createToonModifier(options) {
8
+ const out = allocateEntity();
9
+ initializeToonModifier(out, options);
10
+ return finishEntity(out);
11
+ }
5
12
  // Builds a ToonModifier (slot: Effect) — quantizes the shaded radiance into `steps` flat cel bands,
6
13
  // producing the hard light/shadow terminator of toon shading as a MODIFIER over the ShadedMaterial
7
14
  // base (the compiled sibling of the standalone ToonMaterial, so a toon look stacks with emissive/rim/
8
15
  // fog). `steps` is the number of shading bands (values below 2 clamp to 2 in the shader); `smoothness`
9
16
  // softens each band edge and defaults to 0 (crisp cel edges).
10
- export function createToonModifier(options) {
11
- return {
12
- kind: ToonModifierKind,
13
- slot: ModifierSlot.Effect,
14
- steps: options.steps,
15
- smoothness: options.smoothness ?? 0,
16
- };
17
+ export function initializeToonModifier(out, options) {
18
+ initializeModifier(out, ToonModifierKind, ModifierSlot.Effect);
19
+ out.steps = options.steps;
20
+ out.smoothness = options.smoothness ?? 0;
17
21
  }
18
22
  //# sourceMappingURL=createToonModifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createToonModifier.js","sourceRoot":"","sources":["../src/createToonModifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,oGAAoG;AACpG,qGAAqG;AACrG,gEAAgE;AAEhE,oGAAoG;AACpG,mGAAmG;AACnG,sGAAsG;AACtG,uGAAuG;AACvG,8DAA8D;AAC9D,MAAM,UAAU,kBAAkB,CAChC,OAAsC;IAEtC,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,YAAY,CAAC,MAAM;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;KACpC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createToonModifier.js","sourceRoot":"","sources":["../src/createToonModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,oGAAoG;AACpG,qGAAqG;AACrG,gEAAgE;AAEhE,MAAM,UAAU,kBAAkB,CAAC,OAAsC;IACvE,MAAM,GAAG,GAAG,cAAc,EAAgB,CAAC;IAC3C,sBAAsB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,oGAAoG;AACpG,mGAAmG;AACnG,sGAAsG;AACtG,uGAAuG;AACvG,8DAA8D;AAC9D,MAAM,UAAU,sBAAsB,CACpC,GAAqC,EACrC,OAAsC;IAEtC,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAC/D,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;AAC3C,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { NonEntityCreateResult, VertexDisplaceModifierOptions } from '@flighthq/types/contract';
2
- import type { VertexDisplaceModifier } from '@flighthq/types/contract';
3
- export declare function createVertexDisplaceModifier(options: Readonly<VertexDisplaceModifierOptions>): NonEntityCreateResult<VertexDisplaceModifier, 'descriptor'>;
1
+ import type { VertexDisplaceModifier, VertexDisplaceModifierOptions, EntityConstruction } from '@flighthq/types/contract';
2
+ export declare function createVertexDisplaceModifier(options: Readonly<VertexDisplaceModifierOptions>): VertexDisplaceModifier;
3
+ export declare function initializeVertexDisplaceModifier(out: EntityConstruction<VertexDisplaceModifier>, options: Readonly<VertexDisplaceModifierOptions>): void;
4
4
  //# sourceMappingURL=createVertexDisplaceModifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createVertexDisplaceModifier.d.ts","sourceRoot":"","sources":["../src/createVertexDisplaceModifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAe,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAElH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAYvE,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAC/C,qBAAqB,CAAC,sBAAsB,EAAE,YAAY,CAAC,CAa7D"}
1
+ {"version":3,"file":"createVertexDisplaceModifier.d.ts","sourceRoot":"","sources":["../src/createVertexDisplaceModifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,sBAAsB,EACtB,6BAA6B,EAC7B,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAUlC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,sBAAsB,CAIrH;AAOD,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,kBAAkB,CAAC,sBAAsB,CAAC,EAC/C,OAAO,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAC/C,IAAI,CASN"}
@@ -1,28 +1,31 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import { ModifierSlot, VertexDisplaceModifierKind } from '@flighthq/types/contract';
3
+ import { initializeModifier } from './modifier';
2
4
  // The options for `createVertexDisplaceModifier`. `source` and `amplitude` are required; the rest
3
5
  // carry documented defaults. `source`, `axis` presence, and (for HeightMap) `map` presence are
4
6
  // compile-time structural — they drive the define-key signature — while `amplitude`/`frequency`/
5
7
  // `speed` are uniform-fed.
8
+ export function createVertexDisplaceModifier(options) {
9
+ const out = allocateEntity();
10
+ initializeVertexDisplaceModifier(out, options);
11
+ return finishEntity(out);
12
+ }
6
13
  // Builds a VertexDisplaceModifier (slot: Vertex) — the one built-in VERTEX-scene2d modifier, displacing
7
14
  // each vertex along its normal (or a fixed `axis`) before the model transform. `Sine` is a procedural
8
15
  // traveling wave animated by the shading tier's per-frame `time` (using `frequency` default 1, `speed`
9
16
  // default 1, `direction` default +X); `HeightMap` reads the amount from `map`'s red channel. `axis`,
10
17
  // `map`, and `direction` are plain value pairs copied by reference only when provided.
11
- export function createVertexDisplaceModifier(options) {
12
- const modifier = {
13
- kind: VertexDisplaceModifierKind,
14
- slot: ModifierSlot.Vertex,
15
- source: options.source,
16
- amplitude: options.amplitude,
17
- frequency: options.frequency ?? 1,
18
- speed: options.speed ?? 1,
19
- direction: options.direction ?? DEFAULT_DIRECTION,
20
- };
18
+ export function initializeVertexDisplaceModifier(out, options) {
19
+ initializeModifier(out, VertexDisplaceModifierKind, ModifierSlot.Vertex);
20
+ out.source = options.source;
21
+ out.amplitude = options.amplitude;
22
+ out.frequency = options.frequency ?? 1;
23
+ out.speed = options.speed ?? 1;
24
+ out.direction = options.direction ?? DEFAULT_DIRECTION;
21
25
  if (options.axis !== undefined)
22
- modifier.axis = options.axis;
26
+ out.axis = options.axis;
23
27
  if (options.map !== undefined)
24
- modifier.map = options.map;
25
- return modifier;
28
+ out.map = options.map;
26
29
  }
27
30
  const DEFAULT_DIRECTION = { x: 1, y: 0, z: 0 };
28
31
  //# sourceMappingURL=createVertexDisplaceModifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createVertexDisplaceModifier.js","sourceRoot":"","sources":["../src/createVertexDisplaceModifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAGpF,kGAAkG;AAClG,+FAA+F;AAC/F,iGAAiG;AACjG,2BAA2B;AAE3B,wGAAwG;AACxG,sGAAsG;AACtG,uGAAuG;AACvG,qGAAqG;AACrG,uFAAuF;AACvF,MAAM,UAAU,4BAA4B,CAC1C,OAAgD;IAEhD,MAAM,QAAQ,GAA2B;QACvC,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,YAAY,CAAC,MAAM;QACzB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC;QACjC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QACzB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,iBAAiB;KAClD,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7D,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS;QAAE,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAC1D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,iBAAiB,GAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"createVertexDisplaceModifier.js","sourceRoot":"","sources":["../src/createVertexDisplaceModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAOzE,OAAO,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,kGAAkG;AAClG,+FAA+F;AAC/F,iGAAiG;AACjG,2BAA2B;AAE3B,MAAM,UAAU,4BAA4B,CAAC,OAAgD;IAC3F,MAAM,GAAG,GAAG,cAAc,EAA0B,CAAC;IACrD,gCAAgC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,wGAAwG;AACxG,sGAAsG;AACtG,uGAAuG;AACvG,qGAAqG;AACrG,uFAAuF;AACvF,MAAM,UAAU,gCAAgC,CAC9C,GAA+C,EAC/C,OAAgD;IAEhD,kBAAkB,CAAC,GAAG,EAAE,0BAA0B,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IACzE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAClC,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;IAC/B,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,iBAAiB,CAAC;IACvD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACxD,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS;QAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;AACvD,CAAC;AAED,MAAM,iBAAiB,GAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { EntityConstruction, Modifier, ModifierKind, ModifierSlot } from '@flighthq/types/contract';
2
+ export declare function initializeModifier<T extends Modifier>(out: EntityConstruction<T>, kind: ModifierKind, slot: ModifierSlot): void;
3
+ //# sourceMappingURL=modifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifier.d.ts","sourceRoot":"","sources":["../src/modifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEzG,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,QAAQ,EACnD,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAC1B,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,YAAY,GACjB,IAAI,CAGN"}
@@ -0,0 +1,5 @@
1
+ export function initializeModifier(out, kind, slot) {
2
+ out.kind = kind;
3
+ out.slot = slot;
4
+ }
5
+ //# sourceMappingURL=modifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modifier.js","sourceRoot":"","sources":["../src/modifier.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAChC,GAA0B,EAC1B,IAAkB,EAClB,IAAkB;IAElB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAChB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;AAClB,CAAC"}
@@ -1,5 +1,6 @@
1
- import type { ModifierDefinition, ModifierKind, ModifierRegistry } from '@flighthq/types/contract';
1
+ import type { EntityConstruction, ModifierDefinition, ModifierKind, ModifierRegistry } from '@flighthq/types/contract';
2
2
  export declare function createModifierRegistry(): ModifierRegistry;
3
+ export declare function initializeModifierRegistry(out: EntityConstruction<ModifierRegistry>): void;
3
4
  export declare function registerModifier(registry: Readonly<ModifierRegistry>, definition: Readonly<ModifierDefinition>): void;
4
5
  export declare function resolveModifier(registry: Readonly<ModifierRegistry>, kind: ModifierKind): ModifierDefinition | null;
5
6
  //# sourceMappingURL=modifierRegistry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"modifierRegistry.d.ts","sourceRoot":"","sources":["../src/modifierRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAsBnG,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD;AAMD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAErH;AAID,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,kBAAkB,GAAG,IAAI,CAEnH"}
1
+ {"version":3,"file":"modifierRegistry.d.ts","sourceRoot":"","sources":["../src/modifierRegistry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAsBvH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAIzD;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAE1F;AAMD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAErH;AAID,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,kBAAkB,GAAG,IAAI,CAEnH"}
@@ -1,4 +1,4 @@
1
- import { createEntity } from '@flighthq/entity/contract';
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
2
2
  // The substrate-agnostic registration record for one modifier kind: where it injects (`slot`) and
3
3
  // how its descriptor's compile-time structure contributes to the define-key (`getDefineSignature`).
4
4
  // It carries NO backend GLSL — per-backend compilers (e.g. @flighthq/scene3d-gl) register their own
@@ -18,7 +18,12 @@ import { createEntity } from '@flighthq/entity/contract';
18
18
  // Allocates an empty modifier registry. The only allocating registry function; register and resolve
19
19
  // read or mutate an existing registry in place.
20
20
  export function createModifierRegistry() {
21
- return createEntity({ definitions: new Map() });
21
+ const out = allocateEntity();
22
+ initializeModifierRegistry(out);
23
+ return finishEntity(out);
24
+ }
25
+ export function initializeModifierRegistry(out) {
26
+ out.definitions = new Map();
22
27
  }
23
28
  // Registers (or replaces) the definition for `definition.kind`. Last-write-wins: a later
24
29
  // registration of the same kind overrides the earlier one, so a user can shadow a built-in with a
@@ -1 +1 @@
1
- {"version":3,"file":"modifierRegistry.js","sourceRoot":"","sources":["../src/modifierRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,kGAAkG;AAClG,oGAAoG;AACpG,oGAAoG;AACpG,kGAAkG;AAClG,0FAA0F;AAC1F,EAAE;AACF,oGAAoG;AACpG,kGAAkG;AAClG,qGAAqG;AACrG,oGAAoG;AACpG,wFAAwF;AAExF,mGAAmG;AACnG,kGAAkG;AAClG,mGAAmG;AACnG,mGAAmG;AACnG,gGAAgG;AAEhG,oGAAoG;AACpG,gDAAgD;AAChD,MAAM,UAAU,sBAAsB;IACpC,OAAO,YAAY,CAAC,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,yFAAyF;AACzF,kGAAkG;AAClG,oGAAoG;AACpG,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,QAAoC,EAAE,UAAwC;IAC7G,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED,iGAAiG;AACjG,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,QAAoC,EAAE,IAAkB;IACtF,OAAO,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"modifierRegistry.js","sourceRoot":"","sources":["../src/modifierRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzE,kGAAkG;AAClG,oGAAoG;AACpG,oGAAoG;AACpG,kGAAkG;AAClG,0FAA0F;AAC1F,EAAE;AACF,oGAAoG;AACpG,kGAAkG;AAClG,qGAAqG;AACrG,oGAAoG;AACpG,wFAAwF;AAExF,mGAAmG;AACnG,kGAAkG;AAClG,mGAAmG;AACnG,mGAAmG;AACnG,gGAAgG;AAEhG,oGAAoG;AACpG,gDAAgD;AAChD,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,cAAc,EAAoB,CAAC;IAC/C,0BAA0B,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAyC;IAClF,GAAG,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,yFAAyF;AACzF,kGAAkG;AAClG,oGAAoG;AACpG,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,QAAoC,EAAE,UAAwC;IAC7G,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED,iGAAiG;AACjG,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,QAAoC,EAAE,IAAkB;IACtF,OAAO,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAChD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/shading",
3
- "version": "0.5.1-next.815.cc08b93",
3
+ "version": "0.5.1-next.903.f434bc2",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,8 +38,8 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/entity": "0.5.1-next.815.cc08b93",
42
- "@flighthq/types": "0.5.1-next.815.cc08b93"
41
+ "@flighthq/entity": "0.5.1-next.903.f434bc2",
42
+ "@flighthq/types": "0.5.1-next.903.f434bc2"
43
43
  },
44
44
  "devDependencies": {
45
45
  "typescript": "^5.3.0"
@@ -1,3 +1,4 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import type { Modifier } from '@flighthq/types/contract';
2
3
  import { EmissiveModifierKind } from '@flighthq/types/contract';
3
4
  import { describe, expect, it } from 'vitest';
@@ -24,10 +25,25 @@ describe('getUnregisteredModifierKinds', () => {
24
25
  const registry = createModifierRegistry();
25
26
  registerBuiltInModifiers(registry);
26
27
  const stack: Modifier[] = [
27
- { kind: 'acme.Missing', slot: 'Effect' },
28
+ (() => {
29
+ const out = allocateEntity<any>();
30
+ out.kind = 'acme.Missing';
31
+ out.slot = 'Effect';
32
+ return finishEntity(out);
33
+ })(),
28
34
  createEmissiveModifier({ color: 0xffffffff }),
29
- { kind: 'acme.Other', slot: 'Normal' },
30
- { kind: 'acme.Missing', slot: 'Effect' },
35
+ (() => {
36
+ const out = allocateEntity<any>();
37
+ out.kind = 'acme.Other';
38
+ out.slot = 'Normal';
39
+ return finishEntity(out);
40
+ })(),
41
+ (() => {
42
+ const out = allocateEntity<any>();
43
+ out.kind = 'acme.Missing';
44
+ out.slot = 'Effect';
45
+ return finishEntity(out);
46
+ })(),
31
47
  ];
32
48
  expect(getUnregisteredModifierKinds(registry, stack)).toEqual(['acme.Missing', 'acme.Other']);
33
49
  });
@@ -1,3 +1,4 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import type { Modifier } from '@flighthq/types/contract';
2
3
  import { describe, expect, it } from 'vitest';
3
4
 
@@ -21,7 +22,15 @@ describe('isModifierStackValid', () => {
21
22
  it('is false when any kind is unregistered', () => {
22
23
  const registry = createModifierRegistry();
23
24
  registerBuiltInModifiers(registry);
24
- const stack: Modifier[] = [createEmissiveModifier({ color: 0xffffffff }), { kind: 'acme.Missing', slot: 'Effect' }];
25
+ const stack: Modifier[] = [
26
+ createEmissiveModifier({ color: 0xffffffff }),
27
+ (() => {
28
+ const out = allocateEntity<any>();
29
+ out.kind = 'acme.Missing';
30
+ out.slot = 'Effect';
31
+ return finishEntity(out);
32
+ })(),
33
+ ];
25
34
  expect(isModifierStackValid(registry, stack)).toBe(false);
26
35
  });
27
36
  });
@@ -1,3 +1,4 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import type { Modifier } from '@flighthq/types/contract';
2
3
  import { describe, expect, it } from 'vitest';
3
4
 
@@ -40,7 +41,16 @@ describe('registerModifier', () => {
40
41
  getDefineSignature: (modifier: Readonly<Modifier>) => modifier.slot,
41
42
  });
42
43
  const definition = resolveModifier(registry, 'acme.Foo');
43
- expect(definition?.getDefineSignature?.({ kind: 'acme.Foo', slot: 'Effect' })).toBe('Effect');
44
+ expect(
45
+ definition?.getDefineSignature?.(
46
+ (() => {
47
+ const out = allocateEntity<any>();
48
+ out.kind = 'acme.Foo';
49
+ out.slot = 'Effect';
50
+ return finishEntity(out);
51
+ })(),
52
+ ),
53
+ ).toBe('Effect');
44
54
  });
45
55
  });
46
56
 
@@ -1,3 +1,4 @@
1
+ import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
1
2
  import type { Modifier } from '@flighthq/types/contract';
2
3
  import { describe, expect, it } from 'vitest';
3
4
 
@@ -30,8 +31,12 @@ describe('orderModifierStack', () => {
30
31
  });
31
32
 
32
33
  it('sorts unknown and reserved slots after every built-in slot, stably', () => {
33
- const ambient: Modifier = { kind: 'acme.Ambient', slot: 'Ambient' };
34
- const vendor: Modifier = { kind: 'acme.Custom', slot: 'acme.Weird' };
34
+ const ambient = allocateEntity<Modifier>();
35
+ ambient.kind = 'acme.Ambient';
36
+ ambient.slot = 'Ambient';
37
+ const vendor = allocateEntity<Modifier>();
38
+ vendor.kind = 'acme.Custom';
39
+ vendor.slot = 'acme.Weird';
35
40
  const ordered = orderModifierStack([ambient, rim, vendor, normal]);
36
41
  expect(ordered).toEqual([normal, rim, ambient, vendor]);
37
42
  });