cultmath: integral_clamp_linear normalises lo before the flat branch (gpu-clamp-lo-above-hi-undefined)

lo = min(lo, hi) now precedes the b == 0 branch in C# and HLSL (Unity copy byte-identical, GLSL
regenerated), so no clamp ever sees lo above hi; GLSL leaves that undefined. The b == 0 path used to
call clamp(a, lo, hi) with the raw bounds. New tests: the flat and sloped lo > hi values, the
statement-order check on the committed HLSL and GLSL, and an appended glsl-parity.json family of lo > hi
and infinite-bound edge cases (every earlier case byte-identical).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-14 20:42:04 +02:00
commit 6fd60a979f
7 changed files with 321 additions and 5 deletions

View file

@ -302,10 +302,10 @@ mat3 cultmath_snoise_hessian(vec3 value)
// The integral over [t0, t1] of clamp(a + b t, lo, hi); see the C# math.integral_clamp_linear comment.
float cultmath_integral_clamp_linear(float a, float b, float lo, float hi, float t0, float t1)
{
lo = min(lo, hi);
if (b == 0.0)
return clamp(a, lo, hi) * (t1 - t0);
lo = min(lo, hi);
float direction = t1 < t0 ? -1.0 : 1.0;
float start = min(t0, t1);
float stop = max(t0, t1);

View file

@ -302,10 +302,10 @@ float3x3 cultmath_snoise_hessian(float3 value)
// The integral over [t0, t1] of clamp(a + b t, lo, hi); see the C# math.integral_clamp_linear comment.
float cultmath_integral_clamp_linear(float a, float b, float lo, float hi, float t0, float t1)
{
lo = min(lo, hi);
if (b == 0.0)
return clamp(a, lo, hi) * (t1 - t0);
lo = min(lo, hi);
float direction = t1 < t0 ? -1.0 : 1.0;
float start = min(t0, t1);
float stop = max(t0, t1);

View file

@ -103,16 +103,17 @@ public static partial class math
// at the bound the line starts beyond, the stretch on the ramp (a trapezoid: its length times the
// line's value at the stretch's midpoint), and the stretch held at the far bound. b = 0 is the
// constant clamp(a, lo, hi); t1 < t0 is the negative of the integral over [t1, t0]; lo above hi
// clamps to hi everywhere, as clamp does. A crossing that overflows (b tiny) lies past the span and
// clamps to hi everywhere, as clamp does, and is normalised (lo = min(lo, hi)) before anything reads it,
// so no clamp ever sees lo above hi (GLSL leaves that undefined). A crossing that overflows (b tiny) lies past the span and
// cuts nothing. A held stretch contributes only when its length is positive, so an infinite bound
// (relu has hi = +inf) times a zero length never forms: the integral of a ramp clamped on one side
// only is finite.
public static float integral_clamp_linear(float a, float b, float lo, float hi, float t0, float t1)
{
lo = min(lo, hi);
if (b == 0.0f)
return clamp(a, lo, hi) * (t1 - t0);
lo = min(lo, hi);
var direction = t1 < t0 ? -1.0f : 1.0f;
var start = min(t0, t1);
var stop = max(t0, t1);

View file

@ -45,6 +45,26 @@ public sealed class GlslMirrorTests
}
}
/// <summary>
/// The lowering keeps HLSL's statement order, and GLSL leaves clamp(x, minVal, maxVal) undefined for
/// minVal above maxVal, so integral_clamp_linear must normalise lo = min(lo, hi) before any clamp in
/// its body can see it: in the committed HLSL and the committed GLSL alike, the normalisation precedes
/// the first clamp.
/// </summary>
[Fact]
public void IntegralClampLinearNormalisesLoBeforeAnyClamp()
{
foreach (var (file, text) in Lowered.Where(l => l.File == "CultMath.glsl").Concat(new[] { ("CultMath.hlsl", Hlsl) }))
{
var start = text.IndexOf("cultmath_integral_clamp_linear(float a", StringComparison.Ordinal);
Assert.True(start >= 0, $"{file} has no cultmath_integral_clamp_linear");
var body = text[start..text.IndexOf("}", start, StringComparison.Ordinal)];
var normalise = body.IndexOf("lo = min(lo, hi);", StringComparison.Ordinal);
var firstClamp = body.IndexOf("clamp(", StringComparison.Ordinal);
Assert.True(normalise >= 0 && normalise < firstClamp, $"{file}: lo = min(lo, hi) must come before the first clamp in cultmath_integral_clamp_linear");
}
}
// Identifier boundaries: cultmath_lerp is a CultMath function, lerp( is HLSL.
private static readonly Regex HlslOnly = new(
@"\b(float|u?int|bool)[234]\b|\bfloat3x3\b|\blerp\(|\bfrac\(|\bsaturate\(|\brsqrt\(|\basuint\(|\basfloat\(|\batan2\(|static const|\((float|int|uint)\)|Texture2D|SamplerState|#include|precision (high|medium|low)p");
@ -638,6 +658,23 @@ public sealed class GlslMirrorTests
var lo = Uniform(r, -2.0f, 0.5f);
return new object[] { Uniform(r, -4.0f, 4.0f), r.Next(8) == 0 ? 0.0f : Uniform(r, -4.0f, 4.0f), lo, lo + Uniform(r, 0.0f, 3.0f), Uniform(r, -3.0f, 3.0f), Uniform(r, -3.0f, 3.0f) };
}),
// The edge cases the family above never draws: lo above hi (b = 0 and b != 0; the lowering must
// normalise before any clamp sees it) and infinite bounds (hi = +inf, lo = -inf, both).
new Family("float cultmath_integral_clamp_linear(float, float, float, float, float, float)", "ulp-bounded, lo above hi and infinite bounds",
r =>
{
var a = Uniform(r, -4.0f, 4.0f);
var slope = Uniform(r, -4.0f, 4.0f);
var (t0, t1) = (Uniform(r, -3.0f, 3.0f), Uniform(r, -3.0f, 3.0f));
return r.Next(5) switch
{
0 => new object[] { a, 0.0f, Uniform(r, 0.5f, 2.0f), Uniform(r, -2.0f, 0.4f), t0, t1 },
1 => new object[] { a, slope, Uniform(r, 0.5f, 2.0f), Uniform(r, -2.0f, 0.4f), t0, t1 },
2 => new object[] { a, slope, Uniform(r, -2.0f, 1.0f), float.PositiveInfinity, t0, t1 },
3 => new object[] { a, slope, float.NegativeInfinity, Uniform(r, -1.0f, 2.0f), t0, t1 },
_ => new object[] { a, slope, float.NegativeInfinity, float.PositiveInfinity, t0, t1 },
};
}),
}).ToArray();
// The fixture text, each case's arguments given by family and point index.

View file

@ -345,6 +345,22 @@ public sealed class SpanPrimitiveTests
Assert.Equal(6.0f, integral_clamp_linear(0.0f, 1.0f, 2.0f, inf, 2.0f, 4.0f));
}
/// <summary>
/// lo above hi is normalised before the flat branch reads it: with b = 0 the answer is hi times the
/// span (what clamp(a, lo, hi) gives with lo = min(lo, hi)), and with b != 0 the same. The GLSL
/// lowering would otherwise call clamp with minVal above maxVal, which is undefined there.
/// </summary>
[Fact]
public void IntegralClampLinearNormalisesBeforeTheFlatBranch()
{
// b = 0: a above both, below both and between them all give hi.
foreach (var a in new[] { 9.0f, -9.0f, 3.5f })
Assert.Equal(2.0f * 3.0f, integral_clamp_linear(a, 0.0f, 5.0f, 2.0f, 0.0f, 3.0f));
// b != 0: hi everywhere, whichever way the line runs.
Assert.Equal(2.0f * 3.0f, integral_clamp_linear(0.0f, 1.0f, 5.0f, 2.0f, 0.0f, 3.0f));
Assert.Equal(2.0f * 3.0f, integral_clamp_linear(9.0f, -1.0f, 5.0f, 2.0f, 0.0f, 3.0f));
}
[Fact]
public void IntegralClampLinearHasExactValuesOnTheBinaryFloats()
{

View file

@ -26478,6 +26478,268 @@
"bfdafc5c 404ff2aa bfb94d31 bfa4f005 bfc84ee5 c007567c -> 3f4bbcce",
"c001df13 00000000 bfe57b78 bfe564b4 40132a80 3f82db94 -> 40128a76"
]
},
{
"glsl": "float cultmath_integral_clamp_linear(float, float, float, float, float, float)",
"tolerance": "ulp-bounded, lo above hi and infinite bounds",
"cases": [
"bf0b2a84 c0384244 ff800000 3f9a007c bfc80642 3f5f8200 -> be62fdf0",
"bf903e72 be013e00 ff800000 3f8f124e bfed81c9 4015f3f2 -> c09b895f",
"bffd4268 c0197f86 bfa70b86 7f800000 3ffe5ff8 403e73b0 -> bfa5200e",
"3fb686b4 3ff53690 3f75cfa4 7f800000 be0b6280 4027937e -> 4127a25f",
"bf6bb2f0 c0383fa6 ff800000 3e887584 3faa2b50 3fdde568 -> c009d85d",
"40753aee bf2c5544 bff5b17c 7f800000 3eb30210 402b63e8 -> 40d19059",
"3fd7e728 3f14eae8 3feba88f bff6ba08 bf9bd95e 3f98cd80 -> c094bc52",
"bf55b874 00000000 3f797988 bfe54df5 bfe638a0 3fe6ac28 -> c0ce6a80",
"3fefa58c 00000000 3f9f2a45 bee349b4 bf88b77e c008c9f7 -> 3ef305bd",
"bffd1d32 bff52532 3f14b7bc 7f800000 3f5aeb88 c03b152e -> c0937293",
"4009824e 4052b500 3fc0ea57 bd8e5390 bf7fd568 c0074df4 -> 3d9ea9bd",
"bfdc0802 4061136c be801d20 7f800000 4026e128 40380bc4 -> 4008013a",
"404ffab4 c04ecac4 3fc30ebc bf5da486 be657b80 bff22a7a -> 3fb8d46a",
"3e979c80 3fc0a8cc 3e84ffd0 7f800000 bff86de6 c01bf43d -> be03ea8c",
"c06f0bd2 bf78e25c ff800000 3f877bf0 be80f2f0 bf904c04 -> 402bb6a3",
"3fb318a4 00000000 3f1431a4 bf507b64 bfb71488 bdc34ac0 -> bf8b283f",
"bf87a14e 3dc402c0 ff800000 7f800000 3fe7c320 3fe21f08 -> 3d205f08",
"bfa11404 3f9901dc 3ebdb318 7f800000 3f28ace8 3f096210 -> bd39812e",
"c05920f3 bfc9fe26 3f1ee26e be71a1f0 bf82654b c01a834a -> 3ea89ad5",
"c00556d0 3feebf88 3ef66d70 7f800000 3ea319f0 3f547630 -> 3e7c0825",
"3f828c34 bfe13e0c bd879b50 7f800000 bf9ee05a 3ff55834 -> 40351a31",
"3f656160 bfe976f4 3ff8708d be711278 c00d46e0 4004c750 -> bf810990",
"4049950c 00000000 3f952f50 bc8be500 3fc0e688 3fcb9310 -> babaa746",
"3fabe24c c00711ba 3e068070 7f800000 bf63a110 bf5d45ac -> 3da264c8",
"c0233b98 3fff1294 ff800000 7f800000 402d3600 bf8aac5f -> 40626228",
"3feaba90 c053efca bfecf755 7f800000 40364634 bfffca21 -> c0e1bf93",
"4028f0cc c0612055 3f54dc54 7f800000 402ad238 40290ec6 -> bcbbaf79",
"beb04698 00000000 3f91dbd1 bf53ed66 c00b6465 3f074058 -> c00f62e0",
"406fa864 00000000 3f8b20ef 3e6939a0 bfea8224 3f191d90 -> 3f0db236",
"405fd6fe c0040094 ff800000 7f800000 4002336c be60d030 -> c06a8a31",
"bfb75c48 40201468 ff800000 7f800000 401b77ac 3f03cff8 -> c089cb06",
"40056938 3fe8379c ff800000 7f800000 3fa99ba0 3f9ad530 -> bf018a9f",
"c0556eb0 bc1a2300 3febcf2d bf9750a7 401435c0 c0068484 -> 40a71cf1",
"bef4a0d0 c0415561 bf7228f4 7f800000 403de0a8 bf882153 -> 3fc8f311",
"3e800c00 3e8da060 ff800000 3f7a9082 bda76760 3ff23f68 -> 3f7cfbd7",
"c0467619 00000000 3f4bbbfc bfd7b41d bfd61757 bde41880 -> c028612a",
"3ed56780 bf10add8 3dee9d20 7f800000 bfb672ae 3ffb8258 -> 3fbd0bef",
"4012d6b4 c06f1e30 ff800000 bf78a9fa bf853cf4 3f966510 -> c01493b8",
"c04d58e5 c06ee722 ff800000 3ed04950 3f141838 3fe7dd48 -> c1174a8e",
"3ea47f80 00000000 3f8a8816 3e8963e8 be6dc380 bf4225c8 -> be1096c4",
"4066fa60 c060a340 ff800000 7f800000 3f090cac bf6a8060 -> c0c6a530",
"c077191e 401e0304 3feefde4 bfc95e30 402dbf82 c0021a52 -> 40ef01d3",
"bfd20336 3e8d73f0 3f4e9f9a 3c550000 3f341614 3f8712b0 -> 3b95dd74",
"400b9982 401c9b94 3eb71990 7f800000 3f87b77c 3f41d668 -> bfaae6cb",
"3d15a000 c0799975 ff800000 beedd366 3e647880 bf775c28 -> 3f11e714",
"bf799da4 403f9dfa ff800000 bed08894 4012d1f4 3d588080 -> 3f70da61",
"3fbe1938 00000000 3ff40bd3 beaf5330 3f890abc 401b8f60 -> beee7080",
"3fbd70bc 3f7e1758 ff800000 7f800000 bef05ab8 4026cf76 -> 40fa0e87",
"c0229dc4 c036d32c ff800000 bf150af0 bffe5218 bfdccf14 -> be1c157f",
"bfe6ffe0 bf050038 3f01e041 bfac9dd0 c023de33 3ebccc20 -> c07cd000",
"3f687838 bd8e3b60 3f8f366c bff818ea c000ee81 3e4c9570 -> c08957e4",
"40722c5a 00000000 3fe691e1 be4fc540 3f4be2d8 3fb86d78 -> be05e3b8",
"3ff4b594 00000000 3f1dfd73 bf0697d8 3ffe2e30 c001ddfd -> 400718b2",
"c02fd649 3e5cc9a0 3fceabb6 bfb7fe6e c03c4bcd c0006605 -> bfac3327",
"c014e4f0 c0405a98 ff800000 3f66a948 c0105010 c016cee8 -> bdbb4834",
"bee72060 bedb74f0 3f0387d0 3e392a40 3e224820 c005bf10 -> bed02668",
"40665c3a 00000000 3fcf9ca4 bf880bb7 3d7a3a40 bedafe30 -> 3f05005c",
"3e912a30 bb7e1400 3ff1f167 bed87abc bfc5ea97 bf1a21fc -> becc6313",
"beb05d40 00000000 3fc08ab6 bdce7480 c004a2b4 bf4b4290 -> be03f88a",
"4007114a bf958182 bfa630e2 7f800000 3d523180 3f4c1688 -> 3f9a2e6d",
"bfc774c6 bfd46d30 ff800000 7f800000 bf0b93a0 3f89ac50 -> c04f49cb",
"c05a4f76 00000000 3faf89fd bfdd25e1 3f7c6fb0 be91f730 -> 400c8ee2",
"3db006c0 bf96efd4 ff800000 7f800000 3f98cc04 3fa107e0 -> bdb31de7",
"3fe5ebd4 402a5cb6 ff800000 7f800000 3fbd84a0 4036fb00 -> 412701cd",
"be130280 bf83421c 3f2d0fb4 bfc6d309 3fda2328 bfac537c -> 4097a0d3",
"bf998358 c07f2a7b bfdf42db 7f800000 3fe33530 3ec8fa80 -> 401a54fe",
"c003a422 c051b8fa 3fd169fb 3ec3f8b8 3ec1a460 3eb330b8 -> bc310236",
"c07db7cb 40652b7c bf8650a4 7f800000 3ee24aa0 bfbcc298 -> 4000b7e7",
"c050b426 c064494a ff800000 7f800000 be2c1ea0 3fda20ac -> c133bf2e",
"3ff5bf38 00000000 3febe24a bf246e24 bf8b52fe 3fee7658 -> bff2a785",
"3fef8560 00000000 3fd6bcb1 bf2f4aa8 be05c480 c018ada4 -> 3fc5a368",
"407e47fc bfee3d8c 3f3fd258 bef79ec8 be86f720 3f373aa8 -> bef28150",
"407a9322 4077a70c ff800000 3f16e5c0 4039278e 3e53b450 -> bfcaad7c",
"3ff74adc c074514c ff800000 7f800000 c036692f c00d50d4 -> 40ee1477",
"c0109599 407dcdfc ff800000 3e9826e8 3ff9ef34 bfbad3e8 -> 40f87d8c",
"c064d37e 3fabd540 ff800000 3f0b3400 403d2aee be4aadc0 -> 40ae0317",
"404dda66 405d6af2 bfecf98f 7f800000 3fdd9fe0 3f9e5abc -> c08419fa",
"3f8b94c0 00000000 3fd01cae bfabedbb c0053eb8 3f34f7f8 -> c06fbe1b",
"bfa782ce bfe55598 ff800000 7f800000 bfc85400 bf4eb930 -> 3f1e65b3",
"3fd827f8 c0721f90 ff800000 3faf1ee4 bf6c2dd0 bfd3bc9c -> bf801f26",
"3fe3ef4c 3ff5aa80 bd3e6540 7f800000 3b849000 c036e89e -> bf3e81f6",
"c02720c9 00000000 3fb39588 bffd0e72 bfa5ccee be3dcb80 -> c00c7148",
"4025b204 c0178ad4 ff800000 3f966f62 4035bc96 bf2b03dc -> 3fea7626",
"3f4c5f00 4027a106 bfc3f62d 7f800000 c02341c1 40397f36 -> 4127220a",
"4020b9d8 bfca59f4 ff800000 befd6a32 bffea84d 3fc48c50 -> bfdf5315",
"3fb6059c c03aeb32 ff800000 3f258852 403fb10c 4039b3a0 -> 3f2c3f36",
"3f66acd0 00000000 3f998fea bd8d6c10 3c347200 beab4b58 -> 3cc37c8b",
"bff98cd2 3fb23794 ff800000 3f9b5268 bfcfafe2 3e806180 -> c0ae1e58",
"3f8dc374 3f98a9f8 ff800000 7f800000 bb9b6000 bfe8226a -> bd2be404",
"3f974950 400380f8 ff800000 3d3dd240 c024f56a 400d0d90 -> c07f64b5",
"c07d5b40 bf3a9a3c bf194916 7f800000 3f22b430 bf990456 -> 3f8c5559",
"c07aaed0 402e17d8 ff800000 3fbe27ba bf0fb180 bee83ca0 -> bf121273",
"c00db16a 00000000 3f42cc80 bf57ab38 3ff8c090 3f2679ac -> 3f8b7054",
"3f2cbc60 00000000 3fa3b2db bfc92692 3e942528 c0390c40 -> 409ff36f",
"405fd66a c06cf16e 3e7196c0 7f800000 bf7c1f74 c0305c79 -> c193a29a",
"c044711a c031a2d6 ff800000 7f800000 bebb27d8 3f1155a0 -> c0481673",
"3cf92600 40353762 ff800000 beb7b1b2 bfe10d3c bfd7a9aa -> beb5ece8",
"bfbf100e 00000000 3f3505d8 bff3e8be 3ff63008 bfac1142 -> 40c7401d",
"3f207060 404afd72 bf21122c 7f800000 bf309db8 bfff02d4 -> 3f51c609",
"bf5fae3c 3f0789e0 3f6b63ec 7f800000 3fd8303c bfd41c44 -> c044e8b3",
"3d089500 bf897fbc ff800000 bf4a15df 402b3ed8 c0343436 -> 40c967b0",
"3fddab38 c00a9c2c 3f69bb9a bf8fd314 3fbe5748 3f862be0 -> 3efc747a",
"c061e050 bfa97d26 ff800000 3fda986a 3f9d338c bff7ceed -> 411af31e",
"404a3c54 404c5c1c bf6b4b74 7f800000 bf9c49de be6718b0 -> 3f58a2fb",
"406590ca 3f04dcb0 3fcaaecd bef9b444 4039241a bfe373d9 -> 4011c234",
"3fb551f8 c0020910 3fdfaf6f bfdeb6d5 bfe83ede 4005a37a -> c0d94966",
"c016a797 bfb2770e ff800000 7f800000 401cfafa bfa01d21 -> 413d2608",
"3f1c90a8 00000000 3fc3bac8 bf888bc0 3fe88cdc 3e344ba0 -> 3fe008e9",
"c0559cc6 bfb71176 3fed70d2 bf903083 3f4f3594 c023931e -> 40729e34",
"3fae840c 00000000 3f97115a 3e924de0 3d02eb80 3fb3f834 -> 3ec90777",
"3fc27378 3f494498 bf7d02b8 7f800000 c012410c 400ab734 -> 40d1dbb7",
"bf9e10e2 3f390bf0 ff800000 7f800000 3f972c38 3ed4cf28 -> 3f00e4ca",
"c07d7329 00000000 3f0da4a8 3d818360 c03ddfa2 bfbf8568 -> 3dbe7380",
"3e116060 00000000 3f420c52 3ec06c78 3f564cb8 bf92c392 -> bf3edb08",
"4063ad1e c07e35a3 ff800000 3f462e80 c00212a7 bf6ed200 -> 3f59e669",
"4044483e 402d13a2 3d50ef40 7f800000 402d46cc 40146fd2 -> c075046a",
"3fac2414 3f8b40ac be01e540 7f800000 bf682450 c02f685b -> 3dfedeea",
"c05e65ff c05526f6 3f909a1c bf042384 bfe455e8 bf6eb6bc -> bee10136",
"be776a10 403fd276 3f89268b bf2a53f8 3d3d1180 3e9358c0 -> be249f9f",
"4064ee2e 00000000 3f5e66be 3ec864c0 3e805e10 bf7f648c -> befa2911",
"4074ae32 00000000 3fcdee98 bf64354e bfffca31 3f252220 -> c016cfdc",
"bf87c254 00000000 3fc36d6f 3eaff918 bffe4cd0 400b1ff8 -> 3fb70933",
"c052c89e 4013111e ff800000 3f96e1b2 3f19be14 3f5ed320 -> bedd88e9",
"c009eb35 3fddee68 ff800000 3f044578 bf3ef864 bfa138ba -> 3ffff3a9",
"40691b74 00000000 3fe4e5aa bfb43ed8 3fe3f06c c01bd382 -> 40bdf578",
"3f830a4c c0531431 ff800000 be90363a 40370edc c03245db -> 4139b209",
"3fb8e818 c02ff12b 3fc3a58f bfcd1179 c018b019 3f67df5c -> c0a8bedc",
"3fc93094 3f22f3a0 ff800000 7f800000 4009c918 c01fb787 -> c0d99551",
"3fc13038 bee9dde8 3fcc6902 3dd5f6c0 3df0a1a0 3fcc1fc8 -> 3e1e094a",
"407033da 3f6849a8 bfce467d 7f800000 3fda1130 3fad13ac -> bfe73ad0",
"c031489e c07e39cd ff800000 7f800000 4019c98e c02a48fe -> 4136f1e3",
"c046dc6d 00000000 3fad6b49 bfd899d8 400b65bc bf10f6a4 -> 40949b6a",
"c05e533f c06d210a ff800000 7f800000 3f206210 be288850 -> 405b3391",
"bf7e85d0 40416500 3f8fdc10 be82a520 3fa35f7c c0056fbe -> 3f5b917e",
"40396ff6 402734d2 ff800000 3f60c942 bfc38654 c002fd20 -> 3f6b736f",
"404b1340 00000000 3fc2fb3c bfae7f84 3e430fe0 3e03e530 -> 3dac39e9",
"3f8f488c 00000000 3f6cafbe bf8aa584 3fbddcd4 bf809474 -> 402c76f4",
"40663df8 3f8cd5dc 3f9f57b4 bd8e8900 bfe9f0a6 3f955598 -> be556613",
"bf3bf700 4031fd74 ff800000 7f800000 40096f2c 40372942 -> 408e78dd",
"3f3342d0 c0272e74 ff800000 7f800000 bfeab9ec c0281aa2 -> c0a59170",
"3f3da9b8 00000000 3fb2875a bf319468 3fd6bb68 c000ec58 -> 4023e82d",
"40341d6e 40582d68 ff800000 bf1bc556 bfe0d240 bffe1562 -> 3f4d1a78",
"bf757580 c05a3300 ff800000 bea6f0e8 c02f51c4 c032f8fa -> 3c987746",
"3f86552c 3ed0c070 ff800000 7f800000 40146420 bfaf990a -> c092bb03",
"bdbde020 3f2abbb8 3f2459f1 bfe3ca0b 3f8583a4 3e88a890 -> 3fb0cd8b",
"bedefe38 3f839e38 ff800000 7f800000 40125092 3fb84be8 -> bfa05876",
"3ce15b00 c0108368 ff800000 3fc394ba 3feeb264 c0303e82 -> 3e29a2c0",
"bf995e24 bfd7be92 ff800000 3eddd4cc 3f4f9ff8 3fab76f4 -> bfcbaca5",
"404e6a02 401151c4 ff800000 7f800000 3ea4ac10 bf1f8304 -> c02e4f3d",
"bf0d3864 bfbd35da ff800000 7f800000 3f9e5764 3ff89eb8 -> c002f92a",
"3fb41270 3ee36b90 3ef72070 7f800000 40224ce2 403fee2c -> 3f9c3661",
"c044e618 3fe4f860 ff800000 bf3ab3d6 c02a551f bfc0667b -> c0fc1a14",
"3ea3d780 4021e21a ff800000 7f800000 403324b8 bff2fb70 -> c0db5ad7",
"3fd54e2c 3e944f40 ff800000 3fcca272 40391af2 bff0c14f -> c0e79db9",
"c01b99d7 3f90b97c ff800000 3edae39c 3ee34220 3e7c4700 -> 3ece6418",
"c01ae2cc 3f06c418 bebfa5e0 7f800000 c03305be c0029bb0 -> be90f9fd",
"bffa97b2 c0436485 bfbd3ae5 7f800000 3f685908 bf686f08 -> 3fe960f8",
"4052b922 3faad6ec ff800000 7f800000 be46c010 4001a130 -> 4120547c",
"c003292a 3ff31fd0 be378c10 7f800000 bed82bc8 3fdbb9f8 -> 3e008adc",
"c028fa52 402ef08c ff800000 3f970044 3fd06e10 401db5a4 -> 3f7c6de2",
"bf90e906 40570af6 3fe4ea7d beb7e66c bfa3f8a8 bef68628 -> be9308c8",
"3f59deb0 405c57b2 ff800000 bf4de4a9 403de08c bfad59ea -> 40993e1e",
"bfaf4754 bf8fbd24 3f25c0ac bf858e0c c03acd27 3fecabb0 -> c09f307e",
"bf90e182 40282582 3fc46df6 be554ce0 bf8271ba 3fe93108 -> bf177dcf",
"406af308 403a4800 ff800000 3f32aef0 bf8ba032 3fd28940 -> 3ff382a1",
"bf5d937c bfd430f6 ff800000 3f7dcd38 bedb1fd8 bfca9e2c -> bf3f7814",
"401da4d4 40116556 3f98ec71 be8d3d0c bfce7124 4012e7a8 -> bf89ff65",
"3fe228d8 00000000 3f9f5144 bd4de720 bfc2152a c003ee96 -> 3ce080a7",
"bfd65224 bf871dca bfc4fa72 7f800000 3e38c7c0 3f0a0458 -> bf0d4dd8",
"3eedae10 c0467403 ff800000 bead9056 3faca370 3fba4780 -> bed3e1b9",
"3f9285bc c035a27e ff800000 7f800000 3f8532a4 c0322863 -> c15d6539",
"400e0294 c0645562 ff800000 bf1e37fc 3f2ab790 bfa0f5e6 -> 3f983c47",
"406445f8 c056a1ed ff800000 7f800000 bf750180 3e926600 -> 40baa1c2",
"3f7ed1b0 3fd8acf4 3fdd35f6 bfab6e2e 3f9f492c bfa55d57 -> 405966f4",
"c073d5f9 4006818a ff800000 bf2ec36c 40021aee 3fc28b80 -> 3eb34fac",
"3fc831b0 00000000 3fdd735e bf1fdb88 bd8b8a80 bfb0546d -> 3f5152f5",
"c067b803 c053ee97 ff800000 7f800000 bf8d0f45 bf39c214 -> be65295f",
"40454632 3e33fe40 bef215e0 7f800000 3f873d84 bfc71e5b -> c0fdfdd3",
"c0371b4a 00000000 3f0d7f2c bf9b65f8 3f08eedc bd93ca60 -> 3f3cabee",
"4062a26e 4026084e 3f23621f bff89ca8 400e0fdc 3f65e738 -> 40244a41",
"bebe03d8 3d2fdd80 ff800000 3f835eb0 3f11c9b0 3eaa4138 -> 3daab3ea",
"c0657d7b 3e276860 bf506f04 7f800000 403635f6 4021d69e -> 3e84b269",
"bfafc7b8 bfc778be 3eb2bac8 7f800000 bf254a34 bf9c07fc -> be5744a1",
"c0249e78 bfae5444 bfb04f0c 7f800000 3f2a68e0 403dd784 -> c04acf36",
"c068736e bebe7aa8 ff800000 7f800000 402a1540 c01ed528 -> 4196ac89",
"3fd0127c bf5169a8 3fa4f77c bf8b48c4 3ff02d34 bfd3d383 -> 4075ecde",
"405aa754 c0423731 be096ae0 7f800000 3f1cc1f0 401cf950 -> 3e6661fd",
"3f86b240 3fabb848 ff800000 bf6ee45f 402ca76a 3f352178 -> 3fedb7fa",
"3ecdd950 00000000 3fd260dc bf811808 bfb00f52 400ccb1a -> c066c75e",
"bea6feb0 00000000 3fcca4b9 3ea249c0 bf2cfa20 3d67ae80 -> 3e6dac20",
"3e4a0840 00000000 3ffae0e6 be04b4c0 3e11a6d0 3fad4750 -> be20c604",
"c0799f76 bf85594e 3fe783e2 3ebf4b78 be03f160 bff50393 -> bf2ac2e6",
"bf8c7388 4032a74c ff800000 3fe1876e bfb9ecec bedcf780 -> c0738770",
"3e93efb0 be81bd00 ff800000 3ec55218 becf8b40 3e3f1150 -> 3e3fdd04",
"406241ca c05de18a ff800000 3e80529c bf271fe8 3e73c080 -> 3e64a338",
"c025c02c 00000000 3f5603c2 bf6d7634 c01aa5c0 bf56b0c0 -> bfbb5354",
"3fef160c c0039d40 ff800000 3f874ce4 3e683f80 c0037449 -> c01a4b84",
"40267ca2 00000000 3f31b7ee bfe701df bee92cf0 c01afc8e -> 40631bbc",
"befbf118 401fad5a ff800000 7f800000 bed93b70 c02a5de4 -> 411b762d",
"407c371e c07c0783 ff800000 3f5d20c4 3fa0bb70 c033ef8b -> c0447def",
"4029034e 403c0c0a 3feb36aa bfff3283 3fcad320 c01c200a -> 41005d70",
"3fd1dcc8 c06ea2f7 ff800000 3fff5a82 4038caf0 c03aedd4 -> 409ff98d",
"bfc1e3d2 3f8f931c bee4a428 7f800000 4004a430 4016cbd2 -> 3e8cbd70",
"4070c488 bffe9414 ff800000 7f800000 bf09ef98 3e37a380 -> 403d563f",
"bf8adb0a 00000000 3f530965 be6b63c8 c03047db 3e033610 -> bf29a108",
"3fceea28 3e77c340 ff800000 7f800000 401ff396 bf846d89 -> c0cad675",
"4057d9c8 00000000 3f937e61 bfe2a4ae 3d64f300 3e46d0e0 -> be7aafaf",
"c04cbc5e bf19041c ff800000 becedaf0 c00c7b5c bed40f78 -> c089dd29",
"c034a3ce c0451745 ff800000 3de07e90 c00b3cd8 3da72fe0 -> bfb2f3c5",
"bf2408a4 bfa6832c 3fe35a97 bf5850d4 3fdb6c9c 3fafe434 -> 3e93235a",
"3edb64e0 00000000 3f1f66ec 3eb80448 bfc4daee bf910b46 -> 3e14f87a",
"3fdc6cbc 40590126 ff800000 7f800000 c00231b2 c027f93b -> 406956a4",
"4040c116 40220f9e bfa796c8 7f800000 bf8e5c1a bed7c408 -> 3f3d3b10",
"3f86c7e4 00000000 3fb33aa0 bfc61af4 bf882bc6 c03e63cf -> 403d4a4a",
"40135a32 00000000 3f010b69 bfc53aac 401c8ada 3f067e58 -> 403d666e",
"3fb9ea54 3f667088 ff800000 7f800000 40126b4e bfaa9476 -> c0da143e",
"c0458ed9 40793090 bfaa3bb6 7f800000 bf67a36c 3fc9ac68 -> bf5677fd",
"40688054 c059af7c bfd79392 7f800000 3e2cf960 400c88b0 -> bddc33e8",
"4050b46a c008e7a1 bfc31ca2 7f800000 bbee3c00 3f8f245c -> 40154f21",
"3eca3830 3fddaec4 3fa6bd9f bfe8d46a 3f5c7528 c010e3f2 -> 40b5e713",
"c03e9e6b 40136fc6 3f655bb7 3e7a6900 c0033d1b 400e901c -> 3f85e95a",
"c06d2fc3 3f1626f8 3fa64533 3c6a4000 bebb86b0 bfc4f666 -> bc895477",
"400fca88 c034b1dd ff800000 7f800000 3e1b8dd0 3f763ae0 -> 3f0bd978",
"407c94a4 401ad33a bef86e10 7f800000 3f8a308c 401adac0 -> 412f5c0a",
"c03f7b9c bebc9828 3ffe5c68 befd807c bf8113ec 3ebca1e0 -> bf2e8422",
"4020cfe0 3fbfa9ec ff800000 bec74ee2 bf5da2c8 bec67c50 -> be3e93de",
"c00d2dee 3f50efe0 3fd8618f bfb19656 3f356f28 c025afbf -> 409266e9",
"bf44b364 c07447c3 bfd29b93 7f800000 bf8acc84 3fce3ab8 -> bf91d691",
"be9a1c78 befe9960 3f277228 7f800000 3e805e20 bfae4fde -> bf87017e",
"3f9e00fc bf88e102 ff800000 3eda1fc8 bff76283 3fee13f4 -> 3f76cb83",
"bf8ef440 bed711a0 ff800000 7f800000 3f32f3d4 be428170 -> 3f8b3ffe",
"be067930 bf9e417e bf853207 7f800000 bf648afc bf88e6d6 -> be43d727",
"bf7f9700 3fef7b1c 3f26c61f bfe0524f bf6d1eec c015e85e -> 401ed364",
"c03b0aad 3f01d8f0 bfb759c7 7f800000 403ced4e c01ba186 -> 40f6c684",
"bfe92a4c 00000000 3fe0c054 bff1c0f4 401ca664 3e9bbb10 -> 40818ca7",
"40158400 c07868c5 3fbaa390 3e7b5c90 3f0f2138 4035fb98 -> 3f0f8d26",
"c0252b55 402bdf3c ff800000 bf6bc7ac beec5098 bfd86ca4 -> 40d73441",
"c0439078 c02ab53c ff800000 3e5e0f60 3e709e60 c018c75b -> 401204ed",
"bff046aa c059b87e bf99fa11 7f800000 3f86a3f8 c030ae4e -> c0d2a314",
"40563928 bf14dc14 3ec4c038 7f800000 bfe97076 bed2e7d0 -> 40b49698",
"c014aa4e bdfe0340 3f3605dc bf8dcf77 bf297690 3e2aaf90 -> bf6b05c9",
"4006e3d2 3f612710 3f35e2c0 be124f38 c0008056 4023799c -> bf26dee6",
"bfce98fc 3cb4e000 ff800000 7f800000 c024ad6d c01767f0 -> beb1277d",
"401c9254 400d1d40 ff800000 7f800000 3fb53620 3edcd940 -> c08d3488",
"c0443ea5 40732a4e bfaecf9c 7f800000 c015d256 3f9feb58 -> c06ba7f1",
"3ff551d4 00000000 3f77cbec bef1ad68 bfb84901 3f451778 -> bf8580ed",
"3f38d8f0 00000000 3fd8c54d bfe14821 bf1befd8 3fb0f7f4 -> c06058a8",
"c033affa bf7d4dc8 ff800000 7f800000 40196ef2 3fa0ee0c -> 40a86678",
"bf2cc260 bf934a3e ff800000 bf714bc3 c01d504b 3ead2a20 -> c0291728",
"be5790e0 40534106 3f0bd833 bed0b664 befbb698 bf08982c -> 3c8c11c8",
"bfa83d6c 00000000 3fa24e71 be275838 bee3f830 bff605bb -> 3e77224e",
"4078f8f2 403b7202 bfe30e3b 7f800000 bdeac340 bf99fb7f -> c00891ab",
"400729d0 40616b48 ff800000 bf461e6f be2caae0 3ff7ba54 -> bfd06ba6",
"bf4c31ec 3ff690f8 ff800000 bedca326 c03b59a8 40086c3c -> c138ac1b",
"bda07260 3f5f9400 3f44ceb8 bf7d7ac4 3e564320 bf1a9360 -> 3f4e178c",
"bf878b18 c05db95e ff800000 3ff43ee2 3f871b38 bf1df154 -> 4042a94e"
]
}
]
}

View file

@ -302,10 +302,10 @@ float3x3 cultmath_snoise_hessian(float3 value)
// The integral over [t0, t1] of clamp(a + b t, lo, hi); see the C# math.integral_clamp_linear comment.
float cultmath_integral_clamp_linear(float a, float b, float lo, float hi, float t0, float t1)
{
lo = min(lo, hi);
if (b == 0.0)
return clamp(a, lo, hi) * (t1 - t0);
lo = min(lo, hi);
float direction = t1 < t0 ? -1.0 : 1.0;
float start = min(t0, t1);
float stop = max(t0, t1);