| … | … | @@ -21,7 +21,7 @@ Everything dated here was measured on that day; anything older is marked. |
| 21 | 21 | 3. Rebuild C++ AFTER the bump — **all three targets**, see Build |
| 22 | 22 | 4. .so is **symlinked** to hyper-tps (no copy needed) |
| 23 | 23 | |
| 24 | | **Current version: 0.60.0** (branch: `sdf-volume-bridge`, 25 commits unpushed |
| 24 | **Current version: 0.61.0** (branch: `sdf-volume-bridge`, 26 commits unpushed |
| 25 | 25 | to `bare` as of 2026-09-04) |
| 26 | 26 | |
| 27 | 27 | ## Where things are |
| … | … | @@ -163,8 +163,9 @@ top two came out exact first try. |
| 163 | 163 | | C++ (`proc-nodes/src/shared/erosion_filter.inc`) | Blender group | worst delta | |
| 164 | 164 | |---|---|---| |
| 165 | 165 | | `erosion_hash` | `ProcNodes_ErosionHash` | bit-for-bit, 7 lattice points | |
| 166 | | | `grad_noised_2d` | `ProcNodes_Noised` | via GradientNoise 1.000000 | |
| 167 | | | `fractal_noise_2d` | `ProcNodes_FBMNoised` (Repeat Zone) | same | |
| 166 | | `grad_noised_2d` | `ProcNodes_Noised` | **height + ANALYTIC deriv** | |
| 167 | | `fractal_noise_2d` | `ProcNodes_FBMNoised` (Repeat Zone) | deriv accumulated per octave | |
| 168 | | `GradientNoiseNode` | `ProcNodes_GradientNoise`, 3 nodes | **1.907e-06**, height and both slopes | |
| 168 | 169 | | 5 scalar helpers | `ProcNodes_{PowInv,EaseOut,SmoothStart,NormalizeSafe}` | 18 assertions | |
| 169 | 170 | | `phacelle_noise` | `ProcNodes_Phacelle`, 64 nodes | **9.537e-07** | |
| 170 | 171 | | `erosion_filter` | `ProcNodes_ErosionFilter`, 122 nodes | **2.980e-08** | |
| … | … | @@ -183,11 +184,23 @@ z. v0.47.2 flipped U; v0.47.3 replaced it with a V flip reasoning that "M maps |
| 183 | 184 | Godot Z to Blender Y, reversing V" — M does map Z to Y, in the SAME direction, |
| 184 | 185 | and it is X that is negated. Neither measured it. v0.60.0 put it back. |
| 185 | 186 | |
| 186 | | ⚠ **`ProcNodes_GradientNoise` is NOT exact**, and it is the whole remaining |
| 187 | | end-to-end residual. `grad_noised_2d` returns iq's ANALYTIC derivatives; the |
| 188 | | group takes FINITE DIFFERENCES, three evaluations per sample. Height agrees to |
| 189 | | ~7e-3, **slope differs by up to 5e-2**. It was recorded as "1.000000", which was |
| 190 | | a correlation on the height — the slope was never compared to anything. |
| 187 | **The terrain path is exact end to end** as of v0.61.0: correlation 1.000000, |
| 188 | RMS 1.967e-07, median residual 3.553e-15 over 576 vertices. |
| 189 | |
| 190 | It was not, and the two defects that kept it from being are the clearest example |
| 191 | in this repo of a number that looks like a pass. `ProcNodes_Noised` multiplied |
| 192 | the height by **0.982** — a "normalization factor matching iq/Blender" that |
| 193 | `grad_noised_2d` does not have — and returned the height ALONE, so |
| 194 | `ProcNodes_GradientNoise` finite-differenced the whole fBM three times with |
| 195 | eps=0.001. Slope was out by up to **5e-1**. The number of record, "GradientNoise |
| 196 | parity 1.000000", was a **correlation on the height**: 1.8% out and perfectly |
| 197 | correlated reads as 1.000000, and the slope was never compared to anything. |
| 198 | |
| 199 | When accumulating an fBM derivative the per-octave term is |
| 200 | `d.yz * amp * freq` — the extra `freq` is the chain rule for evaluating at |
| 201 | `p * nf`. Dropping it fails every case; it is the one part worth reading off |
| 202 | `fractal_noise_2d_lod` rather than re-deriving, because a missing `nf` looks |
| 203 | like a plausible slope. |
| 191 | 204 | |
| 192 | 205 | `ProcNodes_ErosionNoise` is the node users place, and it is a port of the |
| 193 | 206 | **SUPERSEDED** filter — the frequency approach (2018 clayjohn / 2023 Fewes), |
| … | … | @@ -628,8 +641,7 @@ reach fingertips (Z already aligns with chain). Works for all leaf bones (breast |
| 628 | 641 | now a SYMLINK to the source, so there is nothing to copy — but the restart is |
| 629 | 642 | still required. |
| 630 | 643 | - **The C++ test suites do not build** — source only, no SConstruct targets |
| 631 | | - **`ProcNodes_GradientNoise` uses finite differences where the C++ is |
| 632 | | analytic** — the last known numerical gap in the terrain path |
| 644 | - No known numerical gap in the terrain path as of v0.61.0 |
| 633 | 645 | |
| 634 | 646 | ## Testing |
| 635 | 647 | |