@vitreajs/vitrea 0.11.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{dist-JWOMZCFF.js → dist-2V7EQHSR.js} +509 -19
- package/dist/dist-2V7EQHSR.js.map +1 -0
- package/dist/index.d.ts +330 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/dist-JWOMZCFF.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1665,9 +1665,153 @@ interface MaterialOptics {
|
|
|
1665
1665
|
/** Rim band half-width in CSS px, and its ambient brightness. */
|
|
1666
1666
|
readonly rimWidth: number;
|
|
1667
1667
|
readonly rimAlpha: number;
|
|
1668
|
-
/**
|
|
1668
|
+
/**
|
|
1669
|
+
* **The rim band's half-width at dpr 2** (W23; claims §5.100 §5, Decision
|
|
1670
|
+
* Log 2 (d)) — `rimWidth`'s second reading, on the precedent of
|
|
1671
|
+
* `sizeScatterGainMax2x` and its siblings and interpolated by the same
|
|
1672
|
+
* `rampAtScale`.
|
|
1673
|
+
*
|
|
1674
|
+
* The rim's amplitude below is one law for both scales, and it cannot be: read
|
|
1675
|
+
* at the contour, vitrea's per-CSS-px band integral RISES 19 % between 1x and
|
|
1676
|
+
* 2x (0.068 → 0.081) while the reference's FALLS 10 % (0.229 → 0.205), so the
|
|
1677
|
+
* same amplitude that lands the 1x dark-backdrop solids at −0.003…−0.007 lands
|
|
1678
|
+
* the 2x rows at +0.037…+0.051. The mismatch is the band's shape and not its
|
|
1679
|
+
* height: at 1x over a dark backdrop the two rims are already the same
|
|
1680
|
+
* one-pixel line (the reference's second contour row carries 8 % of the peak
|
|
1681
|
+
* and vitrea's −7 %), and at 2x vitrea spreads 35 % of its peak onto the second
|
|
1682
|
+
* row where the reference puts 55 % of a NARROWER line. So `rimWidth` does not
|
|
1683
|
+
* move — the 1x rows do not ask it to — and the 2x band narrows instead.
|
|
1684
|
+
*
|
|
1685
|
+
* At dpr ≤ 1 this constant is not read at all (`rimWidthAtScale`), so a profile
|
|
1686
|
+
* that carries it renders the 1x material unchanged by construction.
|
|
1687
|
+
*/
|
|
1688
|
+
readonly rimWidth2x: number;
|
|
1689
|
+
/**
|
|
1690
|
+
* Specular exponent and gain on the rim — **RETIRED from the rim (W24 G2;
|
|
1691
|
+
* claims §5.108 §1, W24 Decision Log 2 (a)), and the note is set beside the
|
|
1692
|
+
* W22 fit below rather than over it.**
|
|
1693
|
+
*
|
|
1694
|
+
* The term was `max(dot(normal, lightDirection), 0)^specularPower ×
|
|
1695
|
+
* specularGain`, one-sided, added to the rim's amplitude. W24 read the
|
|
1696
|
+
* reference's rim around the whole contour instead of per side and found the
|
|
1697
|
+
* variation it was reaching for — but symmetric about the diagonal, not
|
|
1698
|
+
* one-sided: the two ends of that diagonal are drawn EQUAL to a thousandth
|
|
1699
|
+
* (2x dark tl 0.0418 against br 0.0418; 2x light 0.2786 against 0.2823), and
|
|
1700
|
+
* over the nineteen untinted solid rows the one-sided form reaches a
|
|
1701
|
+
* normalised RMS of 0.288 against the symmetric form's 0.148, degenerating in
|
|
1702
|
+
* the fit to the ceiling of both its exponent and its floor trying to become
|
|
1703
|
+
* symmetric. So the shape was wrong, which is the deeper reason W22 G1 rightly
|
|
1704
|
+
* fitted the gain to 0 on the regular variant (claims §5.94 §3): no amount of
|
|
1705
|
+
* a term with the wrong shape helps. `rimLitExponent` below is the shape the
|
|
1706
|
+
* rows chose, and it replaces this one.
|
|
1707
|
+
*
|
|
1708
|
+
* Nothing on either canonical bed moves: the shipped profiles carry
|
|
1709
|
+
* `specularGain` 0 on `regular` since W21/W22, and no scene on either bed or in
|
|
1710
|
+
* the golden suite declares `clear`. What DOES change is the `clear` variant's
|
|
1711
|
+
* unfitted structural 0.45, which drew a one-sided highlight this material is
|
|
1712
|
+
* now measured not to have; it is recorded rather than replaced, because the
|
|
1713
|
+
* lit factor is inert on `clear` for want of rows.
|
|
1714
|
+
*
|
|
1715
|
+
* The two constants stay on the profile so that the W22 fit's record and the
|
|
1716
|
+
* profile documents that carry it remain readable, and so that removing them
|
|
1717
|
+
* is one reviewable change of the profile's SHAPE rather than a side effect of
|
|
1718
|
+
* a material gate. Nothing reads them.
|
|
1719
|
+
*/
|
|
1669
1720
|
readonly specularPower: number;
|
|
1670
1721
|
readonly specularGain: number;
|
|
1722
|
+
/**
|
|
1723
|
+
* **The rim's amplitude law (W23; claims §5.100 §4, Decision Log 2 (a))** — the
|
|
1724
|
+
* term that lets the rim depend on what it is drawn over, which `rimAlpha`
|
|
1725
|
+
* alone cannot.
|
|
1726
|
+
*
|
|
1727
|
+
* `rimAlpha` was an additive constant: the shader added `rimWeight × rimAlpha`
|
|
1728
|
+
* and nothing scaled it. The reference's rim is not a constant. Read at the
|
|
1729
|
+
* contour (claims §5.99, §5.100 §2; W23 X1) the light reference's rim is
|
|
1730
|
+
* +0.23…0.26 of linear luminance over a dark solid, +0.13…0.21 over a
|
|
1731
|
+
* structured backdrop and clipped to white over `light-solid`, while vitrea
|
|
1732
|
+
* drew the same +0.060…0.078 everywhere; and the dark reference's rim GROWS
|
|
1733
|
+
* with what is behind it, +0.026 over `dark-solid` and +0.103 over
|
|
1734
|
+
* `light-solid`, at a body that moves by only a twelfth as much.
|
|
1735
|
+
*
|
|
1736
|
+
* `rimLevelGain` is the coefficient of the surface's OWN rendered level: the
|
|
1737
|
+
* rim becomes `rimAlpha + rimLevelGain × luminance(surface)`. Four candidate
|
|
1738
|
+
* forms were fitted on the reference's own solid, unclipped, uncollapsed sides
|
|
1739
|
+
* — 44 in light and 36 in dark, from both canonical scales and both probe grids
|
|
1740
|
+
* — and this one wins in both schemes on mean |residual|: 0.0081 / 0.0013
|
|
1741
|
+
* against 0.0249 / 0.0253 for the additive constant, 0.0168 / 0.0259 for a pure
|
|
1742
|
+
* screen and 0.0105 / 0.0042 for screen plus an environment term.
|
|
1743
|
+
*
|
|
1744
|
+
* The gain is SIGNED, and its sign is the whole finding. A negative gain is the
|
|
1745
|
+
* screen form — a white line composited source-over at a fraction of the body's
|
|
1746
|
+
* headroom, which is what the CSS tier's inset `box-shadow` already is — and
|
|
1747
|
+
* the light material's rows want one. A positive gain is a rim that rides its
|
|
1748
|
+
* own body up, and the dark material's rows want that, strongly.
|
|
1749
|
+
*
|
|
1750
|
+
* **The environment term is not here, and its absence is a measurement.** W23
|
|
1751
|
+
* chartered `rimEnvGain` — a coefficient on the backdrop source's own average
|
|
1752
|
+
* luminance — as the candidate (L3) for what makes the reference's rim clip
|
|
1753
|
+
* over a bright backdrop while its body is nowhere near white. It is declined
|
|
1754
|
+
* and REMOVED rather than shipped at 0: it is worse than this law on the
|
|
1755
|
+
* reference in both schemes, and no row of either bed separates it on vitrea's
|
|
1756
|
+
* side (a rendered ladder point at +0.10 of gain moved every solid cell by 0 or
|
|
1757
|
+
* 0.0005, because `light-solid` clips and the dark solids have no environment
|
|
1758
|
+
* to speak of). C9a §6.2's rule is that a constant whose rows do not separate
|
|
1759
|
+
* it is not carried. What the reference does there is real and is recorded in
|
|
1760
|
+
* the wave's Deferred list with its numbers: a bed with a mid-bright solid
|
|
1761
|
+
* backdrop under a light-scheme thick surface would tell the environment apart
|
|
1762
|
+
* from the body, and no bed that exists can.
|
|
1763
|
+
*/
|
|
1764
|
+
readonly rimLevelGain: number;
|
|
1765
|
+
/**
|
|
1766
|
+
* **The lit edge (W24; claims §5.107)** — the exponent of the directional
|
|
1767
|
+
* factor `(√2 · |n · L|)^rimLitExponent` the rim's whole amplitude is
|
|
1768
|
+
* multiplied by, with `L` the profile's `rimLitAxis`.
|
|
1769
|
+
*
|
|
1770
|
+
* W23 gave the rim the right AMOUNT and the wrong SHAPE. Read around the whole
|
|
1771
|
+
* contour rather than per side (`results/2026-09-09-w24-lit-edge/g0/
|
|
1772
|
+
* read-angular.py`), Apple's rim is not constant: on the 2x dark
|
|
1773
|
+
* `dark-solid__rrect-md` the bins whose normal points north-west and
|
|
1774
|
+
* south-east read 0.0408 and 0.0418 against 0.0016 for north-east and
|
|
1775
|
+
* south-west, with the four straight sides at 0.0312–0.0328; the same cell in
|
|
1776
|
+
* the light scheme reads 0.284 / 0.286 against 0.038, sides 0.233–0.247.
|
|
1777
|
+
* vitrea drew one number everywhere — a drawn line, which is what the user's
|
|
1778
|
+
* eye called an aesthetic regression on the W23 landing sheet.
|
|
1779
|
+
*
|
|
1780
|
+
* No per-side reader could see it, and the reason is geometric: a light on the
|
|
1781
|
+
* 45° diagonal projects EQUALLY on all four straight sides, so `L−R` and
|
|
1782
|
+
* `T−B` are 0 for the reference exactly as they are for vitrea. The variation
|
|
1783
|
+
* lives in the corner arcs, which W23's contour reader excludes by
|
|
1784
|
+
* construction and W21's band reader averages into its corner overshoot.
|
|
1785
|
+
*
|
|
1786
|
+
* **The form is symmetric and it is not a Lambert.** Fitted on the reference's
|
|
1787
|
+
* own bins over the 19 untinted solid cells of both canonical beds and both
|
|
1788
|
+
* probe grids, `(√2 · |n · L|)^p` reaches an RMS of 0.148 of each cell's own
|
|
1789
|
+
* peak against 0.288 for the one-sided `max(n · L, 0)^p` that W22's `spec`
|
|
1790
|
+
* term draws and 0.312 for the flat rim vitrea ships. The one-sided form
|
|
1791
|
+
* cannot reach both ends of a diagonal whose two corners the reference draws
|
|
1792
|
+
* equal to a thousandth, and that — not its gain — is why W22 rightly fitted
|
|
1793
|
+
* `specularGain` to 0.
|
|
1794
|
+
*
|
|
1795
|
+
* **There is no ambient floor.** The wave chartered `a + (1 − a)|n · L|^p` with
|
|
1796
|
+
* `a` expected around 0.15 dark and 0.25 light. Every grouping of the rows fits
|
|
1797
|
+
* `a` to 0.000 (the search ran 0…0.6 in steps of 0.005), because the bin mean
|
|
1798
|
+
* of `|cos|^p` over the 22.5° straddling the null is already 0.10–0.16 and
|
|
1799
|
+
* supplies everything the null bins carry. A constant every row fits to zero is
|
|
1800
|
+
* a constant the material does not have (C9a §6.2), so it is not here.
|
|
1801
|
+
*
|
|
1802
|
+
* **The `√2` is the amplitude's re-expression, in closed form.** W23 fitted
|
|
1803
|
+
* `rimAlpha` and `rimLevelGain` on the STRAIGHT SPANS, which under this factor
|
|
1804
|
+
* sit at `(cos 45°)^p` of the peak. Normalising the dot product by `cos 45°`
|
|
1805
|
+
* inside the power makes the factor exactly 1 wherever the normal is
|
|
1806
|
+
* horizontal or vertical, at every exponent — so no fitted amplitude moves,
|
|
1807
|
+
* W23's straight-span reads hold identically rather than approximately, and
|
|
1808
|
+
* only the corners and the arcs change. It is why the CSS tier, whose inset
|
|
1809
|
+
* shadow cannot vary around a contour, needs no re-fit either.
|
|
1810
|
+
*
|
|
1811
|
+
* At 0 the factor is `pow(x, 0)` = 1 for every normal, so a profile that does
|
|
1812
|
+
* not carry this constant renders the W23 material byte for byte.
|
|
1813
|
+
*/
|
|
1814
|
+
readonly rimLitExponent: number;
|
|
1671
1815
|
/** Inner-shadow depth (0..1) and how much of it is applied. */
|
|
1672
1816
|
readonly shadowDepth: number;
|
|
1673
1817
|
readonly shadowAlpha: number;
|
|
@@ -2531,6 +2675,160 @@ interface MaterialProfile {
|
|
|
2531
2675
|
readonly backdropToneLow: number;
|
|
2532
2676
|
readonly backdropToneHigh: number;
|
|
2533
2677
|
readonly backdropToneSizeBias: number;
|
|
2678
|
+
/**
|
|
2679
|
+
* **The transmission the collapse keeps (W24 G1)** — and the correction, set
|
|
2680
|
+
* BESIDE the paragraph above rather than over it, of what "texture collapse"
|
|
2681
|
+
* was measured on.
|
|
2682
|
+
*
|
|
2683
|
+
* W7 fitted the collapse on `dark-solid`, a backdrop with no texture in it,
|
|
2684
|
+
* and the paragraph above therefore says the collapse converges the interior
|
|
2685
|
+
* on the backdrop's mean COLOUR. On a solid backdrop the mean and the pixel
|
|
2686
|
+
* are the same number, so the fit could not tell the two apart; the impulse
|
|
2687
|
+
* bed can, and it says they are not the same. Through the reference's
|
|
2688
|
+
* collapsed `impulse__capsule-button` the centre dot still comes through at
|
|
2689
|
+
* +0.0065 linear over a body of 0.0065 at 1x and +0.0254 over 0.0065 at 2x,
|
|
2690
|
+
* where vitrea's collapsed capsule passes exactly 0.0000 (claims §5.107 §2).
|
|
2691
|
+
* The reference's collapsed material is a dark glass that still transmits what
|
|
2692
|
+
* lies beneath it, blurred — it collapses the LEVEL, not the structure.
|
|
2693
|
+
*
|
|
2694
|
+
* The arithmetic the collapse already has makes the correction one constant.
|
|
2695
|
+
* Writing `M` for the unadapted composite this pass would otherwise produce,
|
|
2696
|
+
* the (colour, alpha) pair the shader solves reduces exactly to
|
|
2697
|
+
* `colour = (1 − k)·M + k·target`, and `target` is today the group's mean
|
|
2698
|
+
* backdrop colour — one number for the whole surface, which is precisely what
|
|
2699
|
+
* flattens the dot away at `k` 1. So `collapseTransmission` lerps the TARGET
|
|
2700
|
+
* from that mean (0) to the per-pixel blurred backdrop sample the refraction
|
|
2701
|
+
* path already computed (1):
|
|
2702
|
+
*
|
|
2703
|
+
* target = mix(toneColour.rgb, backdrop, collapseTransmission)
|
|
2704
|
+
*
|
|
2705
|
+
* The tone axis's ARGUMENT is untouched — `k` is still read from the group's
|
|
2706
|
+
* mean luminance and the size bias, and the response law still solves against
|
|
2707
|
+
* `toneAnchor.w` — so the collapse collapses exactly as far as it did and
|
|
2708
|
+
* only stops flattening what is under it. The blurred sample's mean under the
|
|
2709
|
+
* surface is the group's mean to within the difference between a local and a
|
|
2710
|
+
* global average, so the body's LEVEL moves by less than a code where the
|
|
2711
|
+
* backdrop is anything like uniform, and not at all where it is solid: over
|
|
2712
|
+
* `dark-solid` the sample IS the mean and every collapsed cell of that bed is
|
|
2713
|
+
* byte-identical at any value of this constant. That is the stop the fit is
|
|
2714
|
+
* checked against.
|
|
2715
|
+
*
|
|
2716
|
+
* At 0 the target is the mean and the shader's arithmetic is W7's to the bit,
|
|
2717
|
+
* which is why this can be added without moving a pixel anywhere.
|
|
2718
|
+
*
|
|
2719
|
+
* What it cannot carry is the reference's WIDTH. Fitted on the reference's own
|
|
2720
|
+
* dot the transmitted profile is a 4 CSS px box convolved with σ 2.63 device
|
|
2721
|
+
* px at 1x and σ 1.38 device px at 2x — the same kernel the reference's
|
|
2722
|
+
* UNCOLLAPSED cells show (σ 2.86 / 1.40 device px on `impulse__rrect-md`), so
|
|
2723
|
+
* the collapse does not change Apple's blur, but that kernel is neither
|
|
2724
|
+
* CSS-invariant nor device-invariant and vitrea's is neither of those numbers.
|
|
2725
|
+
* This constant sets how MUCH comes through; how WIDE it arrives is the
|
|
2726
|
+
* material's own scatter law and is recorded as a gap, not fitted here
|
|
2727
|
+
* (W24 G1 findings).
|
|
2728
|
+
*/
|
|
2729
|
+
readonly collapseTransmission: number;
|
|
2730
|
+
/**
|
|
2731
|
+
* **The collapse's transmission at dpr 2** (W24 G1), the second anchor of the
|
|
2732
|
+
* constant above, on the pattern `sizeScatterGainMax2x` established for the
|
|
2733
|
+
* body's own second scale (claims §5.69 §1).
|
|
2734
|
+
*
|
|
2735
|
+
* It is a per-scale reading and not a per-scheme one, and the evidence is the
|
|
2736
|
+
* fixtures': the light and dark captures of the collapsed cells are the same
|
|
2737
|
+
* bytes, so the collapsed appearance is one appearance in both schemes, while
|
|
2738
|
+
* the width the reference transmits through is a different number at each
|
|
2739
|
+
* scale. Fitted on the reference's own dot, its kernel is a 4 CSS px box
|
|
2740
|
+
* convolved with σ 2.63 device px at 1x and σ 1.38 device px at 2x — a width
|
|
2741
|
+
* that is invariant in neither CSS nor device pixels — so the SHARE that comes
|
|
2742
|
+
* through cannot be one number over a kernel that is two.
|
|
2743
|
+
*
|
|
2744
|
+
* Defaults to the 1x constant, so a profile that names only that one renders
|
|
2745
|
+
* it at every ratio and this anchor is the identity on the landed material.
|
|
2746
|
+
*/
|
|
2747
|
+
readonly collapseTransmission2x: number;
|
|
2748
|
+
/**
|
|
2749
|
+
* **The rim that survives the collapse (W23)** — the one mark the collapsed
|
|
2750
|
+
* appearance keeps.
|
|
2751
|
+
*
|
|
2752
|
+
* The paragraph above is right about the body and wrong about the rim. W7 read
|
|
2753
|
+
* the settled reference's `dark-solid__capsule-button` as "byte-identical to
|
|
2754
|
+
* its own background, rim included", and at the contour it never was: the
|
|
2755
|
+
* fixture carries a body one code BELOW its backdrop and a contour rim of
|
|
2756
|
+
* +0.020 linear per CSS px (55/255 on a 28/255 backdrop at 2x), in every
|
|
2757
|
+
* standard profile, at both scales, in both schemes (claims §5.99). vitrea
|
|
2758
|
+
* folds that rim out with everything else through the shader's one
|
|
2759
|
+
* `present = 1 − toneAdapt`, and the user's eye named the result: "not one of
|
|
2760
|
+
* our glasses is visible on black, where Apple's clearly show their presence."
|
|
2761
|
+
*
|
|
2762
|
+
* So the shader's rim becomes
|
|
2763
|
+
* `rimWeight × (rimAmplitude × present + rimCollapsed × toneAdapt)`: the
|
|
2764
|
+
* scheme's own rim fading out with the adaptation as it does now, and an
|
|
2765
|
+
* absolute rim the collapsed appearance owns rising with it. At `toneAdapt` 0
|
|
2766
|
+
* nothing changes at all, which is why this constant can be added without
|
|
2767
|
+
* moving a single uncollapsed pixel.
|
|
2768
|
+
*
|
|
2769
|
+
* It lives on the profile and NOT in the dark patch, because the collapsed
|
|
2770
|
+
* appearance is scheme-independent and the fixtures say so: the light and dark
|
|
2771
|
+
* fixtures of `dark-solid__capsule-button` are byte-identical at both scales
|
|
2772
|
+
* (W23 X4). A reading that separates the schemes under collapse is a finding
|
|
2773
|
+
* about the wave, not a second constant. G0 strengthened the evidence: the
|
|
2774
|
+
* identity survives an AUTHOR TINT — `dark-solid__capsule-button__rest-tint-
|
|
2775
|
+
* orange` is the same bytes in both schemes at both scales — so what the
|
|
2776
|
+
* collapse draws is one appearance however the surface was painted.
|
|
2777
|
+
*
|
|
2778
|
+
* It is expressed in its own units and not in the dark rim's, because the two
|
|
2779
|
+
* were measured apart: see the value's own note on the default profile.
|
|
2780
|
+
*/
|
|
2781
|
+
readonly rimCollapsed: number;
|
|
2782
|
+
/**
|
|
2783
|
+
* **The rim a PAINTED surface keeps under the collapse** (W23 G1; claims
|
|
2784
|
+
* §5.100 §5, Decision Log 2 (c)) — `rimCollapsed`'s sibling, at the author
|
|
2785
|
+
* tint's full coverage, with the two lerped by the coverage between them.
|
|
2786
|
+
*
|
|
2787
|
+
* The reference's collapsed capsules keep +0.020 of contour rim bare and
|
|
2788
|
+
* **+0.115 painted** (`dark-solid` and `impulse` `capsule-button`
|
|
2789
|
+
* `rest-tint-orange`, both schemes, both scales, on fixtures that are the same
|
|
2790
|
+
* bytes in the two schemes). An author tint over black is painted, not
|
|
2791
|
+
* adapted: the tone collapse takes the material's own appearance to its
|
|
2792
|
+
* backdrop and the colour the author put on it does not go with it.
|
|
2793
|
+
*
|
|
2794
|
+
* It is ABSOLUTE, in its own units, for the same reason `rimCollapsed` is and
|
|
2795
|
+
* on the same evidence — and G1 measured what the alternative would have cost.
|
|
2796
|
+
* Decision Log 2 (c) proposed gating the collapse itself on the tint's
|
|
2797
|
+
* coverage, so that a painted surface keeps its APPEARANCE's own rim; rendered,
|
|
2798
|
+
* that mechanism needs a gate of 0.534 on the light bed and 0.294 on the dark
|
|
2799
|
+
* one to reach +0.115 on a cell whose reference fixture is byte-identical
|
|
2800
|
+
* between the schemes, because it makes the kept rim proportional to each
|
|
2801
|
+
* scheme's own amplitude law and those differ by 1.8× there. A proportional
|
|
2802
|
+
* form cannot draw one appearance from two materials; an absolute one does,
|
|
2803
|
+
* which is X4 again and the reason this constant has the shape it has.
|
|
2804
|
+
*
|
|
2805
|
+
* It is fitted on orange alone, and that is a stated limit: the reference's
|
|
2806
|
+
* collapsed tint-blue capsule reads +0.176 against orange's +0.115, so the
|
|
2807
|
+
* quantity depends on the tint's own colour, and every collapsed blue cell on
|
|
2808
|
+
* the bed is holdout. What lands here is the orange rows' answer with the
|
|
2809
|
+
* colour dependence recorded as future work.
|
|
2810
|
+
*/
|
|
2811
|
+
readonly rimCollapsedTinted: number;
|
|
2812
|
+
/**
|
|
2813
|
+
* **How much of an author tint's own colour the rim's light is spent in**
|
|
2814
|
+
* (W23 G3; claims §5.102) — 0…1, multiplied by the surface's tint coverage.
|
|
2815
|
+
*
|
|
2816
|
+
* Apple's rim on a painted surface is the paint LIFTED, not white added over
|
|
2817
|
+
* it. Read on the contour row's straight-span mean colour at 2x in light, an
|
|
2818
|
+
* orange paint of (255, 148, 0) rises to (254, 188, 0) with its blue channel
|
|
2819
|
+
* still at 0, and a blue paint of (8, 120, 236) to (59, 199, 248); vitrea drew
|
|
2820
|
+
* (255, 192, 130) and (145, 183, 255) — the same rim in white, which turns an
|
|
2821
|
+
* orange edge peach and a blue edge lilac. No luminance clause sees it: the
|
|
2822
|
+
* rim's amplitude is right and its colour is not.
|
|
2823
|
+
*
|
|
2824
|
+
* So the rim's light is spent in `mix(white, paint / max(paint), chroma × s)`.
|
|
2825
|
+
* The paint is normalised by its own brightest channel rather than by its
|
|
2826
|
+
* luminance, so a dark paint darkens the rim's HUE and not its amount, and the
|
|
2827
|
+
* factor is the pixel's own tint strength, so an untinted surface keeps a white
|
|
2828
|
+
* rim at every value of this constant — which is what makes the mechanism reach
|
|
2829
|
+
* painted pixels only and every untinted capture byte-identical (W23 S10).
|
|
2830
|
+
*/
|
|
2831
|
+
readonly rimTintChroma: number;
|
|
2534
2832
|
/**
|
|
2535
2833
|
* **The backdrop tone response (W9)** — the law that owns the interior MEAN,
|
|
2536
2834
|
* where the four constants above own texture collapse and nothing else.
|
|
@@ -2591,6 +2889,31 @@ interface MaterialProfile {
|
|
|
2591
2889
|
* specular from.
|
|
2592
2890
|
*/
|
|
2593
2891
|
readonly lightDirection: readonly [number, number];
|
|
2892
|
+
/**
|
|
2893
|
+
* **The lit edge's axis (W24; claims §5.107)** — the unit direction `L` the
|
|
2894
|
+
* rim's directional factor is symmetric about, in the same viewport
|
|
2895
|
+
* coordinates as `lightDirection`, y pointing down.
|
|
2896
|
+
*
|
|
2897
|
+
* It is a SEPARATE constant from `lightDirection` and not a second reading of
|
|
2898
|
+
* it, for two reasons the rows give. First, they are measured to differ: the
|
|
2899
|
+
* rim's axis fits at 136° of compass bearing over the 19 solid rows (135.0° ±
|
|
2900
|
+
* 0.7° over the dark rows alone, 137.7° ± 1.5° over the light ones), where
|
|
2901
|
+
* `lightDirection` [−0.3714, −0.9285] is a bearing of 338.2°, an axis of
|
|
2902
|
+
* 158.2° — 22° away, and it was fitted for the inner shadow and the sweep, not
|
|
2903
|
+
* for the contour. Second, `light.xy` reaches the one-sided `spec` term this
|
|
2904
|
+
* factor replaces, and re-pointing it to fit the contour would move the
|
|
2905
|
+
* shadow's own light with it; a constant of its own keeps that seam where W2
|
|
2906
|
+
* and W22 left it.
|
|
2907
|
+
*
|
|
2908
|
+
* The default is the exact diagonal (−1, −1)/√2 — a bearing of 135° — and not
|
|
2909
|
+
* the fitted 136°: the rows do not separate the two (the joint fit's RMS moves
|
|
2910
|
+
* by less than a thousandth between them), and only the exact diagonal makes
|
|
2911
|
+
* the factor equal on all four straight sides, which is what lets the
|
|
2912
|
+
* amplitude's re-expression be exact rather than a 2 % trade against W23's
|
|
2913
|
+
* straight-span reads. `rimLitExponent` is 0, so the axis draws nothing until a
|
|
2914
|
+
* profile carries an exponent.
|
|
2915
|
+
*/
|
|
2916
|
+
readonly rimLitAxis: readonly [number, number];
|
|
2594
2917
|
/** Specular sweep band width in radians, and the press glow's reach in CSS px. */
|
|
2595
2918
|
readonly sweepBandRadians: number;
|
|
2596
2919
|
readonly glowRadiusCss: number;
|
|
@@ -2653,12 +2976,18 @@ interface MaterialProfilePatch {
|
|
|
2653
2976
|
readonly backdropToneLow?: number;
|
|
2654
2977
|
readonly backdropToneHigh?: number;
|
|
2655
2978
|
readonly backdropToneSizeBias?: number;
|
|
2979
|
+
readonly collapseTransmission?: number;
|
|
2980
|
+
readonly collapseTransmission2x?: number;
|
|
2981
|
+
readonly rimCollapsed?: number;
|
|
2982
|
+
readonly rimCollapsedTinted?: number;
|
|
2983
|
+
readonly rimTintChroma?: number;
|
|
2656
2984
|
readonly backdropToneAnchorX?: readonly [number, number, number];
|
|
2657
2985
|
readonly backdropToneResponseThin?: readonly [number, number, number];
|
|
2658
2986
|
readonly backdropToneResponseThick?: readonly [number, number, number];
|
|
2659
2987
|
readonly backdropToneResponseStrength?: number;
|
|
2660
2988
|
readonly outerShadow?: Readonly<Partial<MaterialOuterShadow>>;
|
|
2661
2989
|
readonly lightDirection?: readonly [number, number];
|
|
2990
|
+
readonly rimLitAxis?: readonly [number, number];
|
|
2662
2991
|
readonly sweepBandRadians?: number;
|
|
2663
2992
|
readonly glowRadiusCss?: number;
|
|
2664
2993
|
readonly glowGain?: number;
|
package/dist/index.js
CHANGED
|
@@ -1092,7 +1092,7 @@ function isHealthy(state) {
|
|
|
1092
1092
|
|
|
1093
1093
|
// src/renderer-seam.ts
|
|
1094
1094
|
async function loadWebGPURendererModule() {
|
|
1095
|
-
return import('./dist-
|
|
1095
|
+
return import('./dist-2V7EQHSR.js');
|
|
1096
1096
|
}
|
|
1097
1097
|
async function loadWebGPURenderer() {
|
|
1098
1098
|
const { createWebGPURenderer } = await loadWebGPURendererModule();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitreajs/vitrea",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Framework-agnostic Liquid Glass material runtime: scene model, capability resolution, material policy, accessibility policy.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/SSFSKIM/designer",
|