From 97ee1dcf26b62f48e351b6392c11a30775619442 Mon Sep 17 00:00:00 2001 From: yum Date: Wed, 21 Jan 2026 16:03:52 -0800 Subject: Fur: add domain warping --- math.cginc | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) (limited to 'math.cginc') diff --git a/math.cginc b/math.cginc index 3112418..cbf162c 100644 --- a/math.cginc +++ b/math.cginc @@ -307,7 +307,57 @@ float2 hex_to_cart(float3 cart) { (cart[1] - cart[2]) * SQRT_3_OVER_2); } -// Rotate 45 degrees. -float2 rot45(float2 v) { return float2(v.x - v.y, v.x + v.y) * RCP_SQRT_2; } +// Rotate 45 degrees. +float2 rot45(float2 v) { return float2(v.x - v.y, v.x + v.y) * RCP_SQRT_2; } + +// p = point to get noise for +float valueNoise2D( + float2 p) { + // quantized part + float2 q = floor(p); + // fractional part + float2 f = frac(p); + + float l00 = rand2(q); + float l01 = rand2(q + float2(0, 1)); + float l10 = rand2(q + float2(1, 0)); + float l11 = rand2(q + float2(1, 1)); + + // Cubic interpolation. + f = f * f * (3.0f - 2.0f * f); + + float l0 = lerp(l00, l01, f.y); + float l1 = lerp(l10, l11, f.y); + return lerp(l0, l1, f.x); +} + +// p = point to get noise for +float valueNoise3D( + float3 p) { + // quantized part + float3 q = floor(p); + // fractional part + float3 f = frac(p); + + float l000 = rand3(q); + float l001 = rand3(q + float3(0, 0, 1)); + float l010 = rand3(q + float3(0, 1, 0)); + float l011 = rand3(q + float3(0, 1, 1)); + float l100 = rand3(q + float3(1, 0, 0)); + float l101 = rand3(q + float3(1, 0, 1)); + float l110 = rand3(q + float3(1, 1, 0)); + float l111 = rand3(q + float3(1, 1, 1)); + + // Cubic interpolation. + f = f * f * (3.0f - 2.0f * f); + + float l00 = lerp(l000, l001, f.z); + float l01 = lerp(l010, l011, f.z); + float l10 = lerp(l100, l101, f.z); + float l11 = lerp(l110, l111, f.z); + float l0 = lerp(l00, l01, f.y); + float l1 = lerp(l10, l11, f.y); + return lerp(l0, l1, f.x); +} #endif // __MATH_INC -- cgit v1.2.3