# `ShadowSpec`

> Contract 2.0.0 · package sha256 `a857eca95b35921109faf997094bb4192f12527d9d0fcd4be7e97f06425bad6e` · generated from `configurator-runtime.d.ts` by `services/onsite-scripter/scripts/build-contract-docs.mjs`; edit the source, not this file.

Type · `import type { ShadowSpec } from '@holostep-configurators/runtime-client/contract';` · stable · since 2.0.0 · section 7. Collections and shapes

The runtime owns the shadow map and its filter per quality tier (`info().renderer.tier`): high
2048 px, medium 1024 px, low 1024 px with a tighter filter (today's live tiers). No tier drops
the shadow. The filter and bias also follow the receivers. While a part of role 'product'
receives this shadow, the filter narrows to about 3 shadow-map texels, so on a 1024 px map a lit
face that receives it shows no screen-fixed self-shadow grain and the floor no smeared blotch;
with only the ground and scenery receiving, it stays at 14 texels, today's soft default. A scene
model's parts receive only through a `receive: true` rule ([`PartState.shadows`](PartState.shadows.md)), so with no
such rule and no receiving product item the base stays 14.
`softness` scales that base: the filter radius is max(1, base × softness / 0.3) shadow-map
texels, so the default 0.3 is the base and 0 the hardest the tier draws; the low tier's tighter
filter applies on top. A tier or receiver change re-applies them; apps
write no tier or filter code.

## Declaration

```ts
export type ShadowSpec = boolean | {
  softness?: number;
  strength?: number;
  thinParts?: boolean;
  covers?: Query;
};
```

## Generic-API test (spec 3.1)

| Rule | Result |
| --- | --- |
| 1. Neutral name | pass: `ShadowSpec` names no product |
| 2. A precedent | pass: [Unity Light.shadows](https://docs.unity3d.com/ScriptReference/Light-shadows.html) (row `K27`); [Babylon.js ShadowGenerator](https://github.com/BabylonJS/Babylon.js/blob/master/packages/dev/core/src/Lights/Shadows/shadowGenerator.ts) (row `K27`) |
| 3. Two apps, or labs | pass: 10 apps (ledger: app-378d190f1b, app-4f16d2f6da, app-510d750508, app-59c5b5751e, app-ceb4eccc72, app-fc07850558, app-fc306ec3dc; fleet cross-check: app-04c2774145, app-4762caacdc, app-4f16d2f6da, app-59c5b5751e, app-ceb4eccc72, app-e61a0b42ad, app-fc306ec3dc) |
| 4. The cheaper fix first | decided per need in Appendix B: rows `K27` at tier stable (a member only where no rule, data, asset or app code serves the need) |
