@matboks/utilities 0.0.2 → 0.0.18
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/shader-modules/modules/constants.d.ts +1 -1
- package/dist/shader-modules/modules/constants.js +9 -6
- package/dist/shader-modules/modules/noise.d.ts +1 -1
- package/dist/shader-modules/modules/noise.js +237 -29
- package/dist/shader-modules/modules/random.d.ts +1 -1
- package/dist/shader-modules/modules/random.js +55 -42
- package/package.json +1 -1
- package/dist/constants 2.js +0 -1
- package/dist/constants 3.js +0 -1
- package/dist/constants.d 2.ts +0 -1
- package/dist/constants.d 3.ts +0 -1
- package/dist/index 2.js +0 -11
- package/dist/index 3.js +0 -11
- package/dist/index.d 2.ts +0 -11
- package/dist/index.d 3.ts +0 -11
- package/dist/shader-modules/modules/sdf.d.ts +0 -1
- package/dist/shader-modules/modules/sdf.js +0 -126
- package/dist/tilings/tiler.d.ts +0 -1
- package/dist/tilings/tiler.js +0 -4
- package/dist/types 2.js +0 -1
- package/dist/types 3.js +0 -1
- package/dist/types.d 2.ts +0 -1
- package/dist/types.d 3.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const constantsDefinition = "\n\nexport {\n PI, TWO_PI, SQRT_2, INV_SQRT_2, EPS\n}\n\nconst float PI
|
|
1
|
+
export declare const constantsDefinition = "\n\nexport {\n PI, TWO_PI, SQRT_2, INV_SQRT_2, SQRT_3, E, GOLDEN_RATIO, EPS\n}\n\nconst float PI = 3.1415926535897932384626433832795;\nconst float TWO_PI = 6.2831853071795864769252867665590;\nconst float SQRT_2 = 1.4142135623730950488016887242097;\nconst float INV_SQRT_2 = 0.7071067811865475244008443621048;\nconst float SQRT_3 = 1.7320508075688772935274463415058;\nconst float E = 2.7182818284590452353602874713527;\nconst float GOLDEN_RATIO = 1.6180339887498948482045868343656;\nconst float EPS = 1e-9;\n\n\n";
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
export const constantsDefinition = /*glsl*/ `
|
|
2
2
|
|
|
3
3
|
export {
|
|
4
|
-
PI, TWO_PI, SQRT_2, INV_SQRT_2, EPS
|
|
4
|
+
PI, TWO_PI, SQRT_2, INV_SQRT_2, SQRT_3, E, GOLDEN_RATIO, EPS
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
const float PI
|
|
8
|
-
const float TWO_PI
|
|
9
|
-
const float SQRT_2
|
|
10
|
-
const float INV_SQRT_2
|
|
11
|
-
const float
|
|
7
|
+
const float PI = 3.1415926535897932384626433832795;
|
|
8
|
+
const float TWO_PI = 6.2831853071795864769252867665590;
|
|
9
|
+
const float SQRT_2 = 1.4142135623730950488016887242097;
|
|
10
|
+
const float INV_SQRT_2 = 0.7071067811865475244008443621048;
|
|
11
|
+
const float SQRT_3 = 1.7320508075688772935274463415058;
|
|
12
|
+
const float E = 2.7182818284590452353602874713527;
|
|
13
|
+
const float GOLDEN_RATIO = 1.6180339887498948482045868343656;
|
|
14
|
+
const float EPS = 1e-9;
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const noiseDefinition = "\nimport { random, random2, random3, randomUnit } from \"@/random\";\nimport { triangleWave, dot2 } from \"@/utils\";\nimport { rotate, axisAngle } from \"@/geometry\";\nimport { PI } from \"@/constants\";\n\nexport {\n valueNoise, perlinNoise, worleyNoise, voroNoise, gaboroNoise, \n octaveNoise1D, octaveNoise2D, octaveNoise3D\n}\n\nfloat valueNoise(float p, float scale, float seed) {\n p *= scale;\n\n float pi = floor(p);\n float pf = fract(p);\n\n float sf = smoothstep(0.0, 1.0, pf);\n\n return mix(random(pi, seed), random(pi + 1.0, seed), sf);\n}\n\nfloat valueNoise(vec2 p, float scale, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n vec2 pf = fract(p);\n\n vec2 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n return mix(\n mix(random(pi, seed), random(pi + o.xy, seed), sf.x),\n mix(random(pi + o.yx, seed), random(pi + o.xx, seed), sf.x),\n sf.y\n );\n}\n\nfloat valueNoise(vec3 p, float scale, float seed) {\n p *= scale;\n\n vec3 pi = floor(p);\n vec3 pf = fract(p);\n\n vec3 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n return mix(\n mix(\n mix(random(pi, seed), random(pi + o.xyy, seed), sf.x),\n mix(random(pi + o.yxy, seed), random(pi + o.xxy, seed), sf.x),\n sf.y\n ),\n mix(\n mix(random(pi + o.yyx, seed), random(pi + o.xyx, seed), sf.x),\n mix(random(pi + o.yxx, seed), random(pi + o.xxx, seed), sf.x),\n sf.y\n ), \n sf.z\n );\n\n}\n\nfloat valueNoise(vec4 p, float scale, float seed) {\n p *= scale;\n\n vec4 pi = floor(p);\n vec4 pf = fract(p);\n\n vec4 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n return mix(\n mix(\n mix(\n mix(random(pi, seed), random(pi + o.xyyy, seed), sf.x),\n mix(random(pi + o.yxyy, seed), random(pi + o.xxyy, seed), sf.x),\n sf.y\n ),\n mix(\n mix(random(pi + o.yyxy, seed), random(pi + o.xyxy, seed), sf.x),\n mix(random(pi + o.yxxy, seed), random(pi + o.xxxy, seed), sf.x),\n sf.y\n ), \n sf.z\n ),\n mix(\n mix(\n mix(random(pi + o.yyyx, seed), random(pi + o.xyyx, seed), sf.x),\n mix(random(pi + o.yxyx, seed), random(pi + o.xxyx, seed), sf.x),\n sf.y\n ),\n mix(\n mix(random(pi + o.yyxx, seed), random(pi + o.xyxx, seed), sf.x),\n mix(random(pi + o.yxxx, seed), random(pi + o.xxxx, seed), sf.x),\n sf.y\n ), \n sf.z\n ),\n sf.w\n );\n}\n\nfloat perlinNoise(float p, float scale, float seed) {\n p *= scale;\n\n float pi = floor(p);\n float pf = fract(p);\n\n float sf = smoothstep(0.0, 1.0, pf);\n\n float signed = mix(random(pi, seed)*pf, random(pi + 1.0, seed)*(pf - 1.0), sf);\n \n // Signed is in range [-1/2, 1/2], map to [0, 1]\n return 0.5 + signed;\n}\n\nfloat perlinNoise(vec2 p, float scale, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n vec2 pf = fract(p);\n\n vec2 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n float signed = mix(\n mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xy, seed), pf - o.xy), sf.x),\n mix(dot(randomUnit(pi + o.yx, seed), pf - o.yx), dot(randomUnit(pi + o.xx, seed), pf - o.xx), sf.x),\n sf.y\n );\n \n // Signed is in range [-sqrt(2)/2, sqrt(2)/2], map to [0, 1]\n return 0.5 + 0.70710678118654752*signed;\n}\n\nfloat perlinNoise(vec3 p, float scale, float seed) {\n p *= scale;\n\n vec3 pi = floor(p);\n vec3 pf = fract(p);\n\n vec3 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n float signed = mix(\n mix(\n mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xyy, seed), pf - o.xyy), sf.x),\n mix(dot(randomUnit(pi + o.yxy, seed), pf - o.yxy), dot(randomUnit(pi + o.xxy, seed), pf - o.xxy), sf.x),\n sf.y\n ),\n mix(\n mix(dot(randomUnit(pi + o.yyx, seed), pf - o.yyx), dot(randomUnit(pi + o.xyx, seed), pf - o.xyx), sf.x),\n mix(dot(randomUnit(pi + o.yxx, seed), pf - o.yxx), dot(randomUnit(pi + o.xxx, seed), pf - o.xxx), sf.x),\n sf.y\n ), \n sf.z\n );\n\n // Signed is in range [-sqrt(3/4), sqrt(3/4)], map to [0, 1]\n return 0.5 + 0.57735026918962576*signed;\n}\n\nfloat worleyNoise(float p, float scale, float seed) {\n p *= scale;\n\n float pi = floor(p);\n float pf = fract(p);\n\n float minDist = 1e9;\n\n for (int index = -1; index <= 1; index++) {\n float fi = float(index);\n float centerToPosition = fi + random(pi + fi, seed) - pf;\n\n minDist = min(minDist, abs(centerToPosition));\n }\n\n return minDist;\n}\n\nfloat worleyNoise(vec2 p, float scale, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n vec2 pf = fract(p);\n\n float minDist2 = 1e9;\n\n for (int row = -1; row <= 1; row++) {\n for (int col = -1; col <= 1; col++) {\n vec2 index = vec2(col, row);\n \n vec2 centerToPosition = index + random2(pi + index, seed) - pf;\n float dist2 = dot2(centerToPosition);\n\n minDist2 = min(minDist2, dist2);\n }\n }\n\n return sqrt(minDist2);\n}\n\nfloat worleyNoise(vec3 p, float scale, float seed) {\n p *= scale;\n\n vec3 pi = floor(p);\n vec3 pf = fract(p);\n\n float minDist2 = 1e9;\n\n for (int row = -1; row <= 1; row++) {\n for (int col = -1; col <= 1; col++) {\n for (int slice = -1; slice <= 1; slice++) {\n vec3 index = vec3(col, row, slice);\n \n vec3 centerToPosition = index + random3(pi + index, seed) - pf;\n float dist2 = dot2(centerToPosition);\n\n minDist2 = min(minDist2, dist2);\n }\n }\n }\n\n return sqrt(minDist2);\n}\n\n// Adapted version of https://iquilezles.org/articles/voronoise/\nfloat voroNoise(vec2 p, float scale, float disorder, float smoothness, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n vec2 pf = fract(p);\n\n float s = 1.0;\n int kernel = 2;\n\n float power = 64.0 - 63.0*pow(smoothness, 0.1);\n\n float sum = 0.0;\n float weightSum = 0.0;\n\n for (int row = -kernel; row <= kernel; row++) {\n for (int col = -kernel; col <= kernel; col++) {\n vec2 index = vec2(col, row);\n\n // xy is cell center, z is value\n vec3 data = random3(pi + index, seed);\n\n vec2 centerToPosition = index + data.xy*disorder - pf;\n\n float dist2 = dot2(centerToPosition);\n\n float weight = pow(smoothstep(1.0, 0.0, sqrt(0.5*dist2)), power );\n\n sum += weight*data.z;\n weightSum += weight;\n }\n }\n\n return sum / weightSum;\n}\n\nfloat gaboroNoise(vec2 p, float level, float scale, float radius, float freq, float hatchAmount, float hatchAngle, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n float exponent = 1. / (radius*radius);\n\n float valueSum = 0., weightSum = 0.;\n for (int i = -1; i <= 1; i++) {\n for (int j = -1; j <= 1; j++) {\n vec2 cellIndex = pi + vec2(i, j);\n vec2 cellCenter = cellIndex + random2(cellIndex, seed);\n \n float se = random(cellCenter, seed);\n\n vec2 diff = p - cellCenter;\n float rotation = PI*random(se);\n \n float weight = exp(-exponent*dot(diff, diff));\n \n vec2 texturePosition = diff*freq;\n \n float value = max(triangleWave(texturePosition, rotation), hatchAmount*triangleWave(texturePosition, rotation + hatchAngle));\n \n weightSum += weight;\n valueSum += weight*value;\n }\n }\n \n level = mix(level, sqrt(level), hatchAmount);\n\n return smoothstep(0.05, -0.05, valueSum / weightSum - level);\n //return valueSum / weightSum;\n}\n\nfloat idwNoise(float p, float power, float scale, float seed, int window) {\n p *= scale;\n\n float pi = floor(p);\n\n float sum = 0.0;\n float weightSum = 0.0;\n float powerCoeff = -power;\n\n for (int i = -window; i <= window; i++) {\n float cellCorner = pi + i;\n float value = random(cellCorner, seed);\n\n float cellPosition = cellCorner + random(cellCorner, seed);\n\n float w = pow(abs(p - cellPosition), powerCoeff);\n \n if (isinf(w)) return value;\n\n sum += w*value;\n weightSum += w; \n }\n\n return sum / weightSum;\n}\n\nfloat idwNoise(vec2 p, float power, float scale, float seed, int window) {\n p *= scale;\n\n vec2 pi = floor(p);\n\n float sum = 0.0;\n float weightSum = 0.0;\n float powerCoeff = -0.5*power;\n\n for (int i = -window; i <= window; i++) {\n for (int j = -window; j <= window; j++) {\n vec2 cellCorner = pi + vec2(i, j);\n float value = random(cellCorner, seed);\n\n vec2 cellPosition = cellCorner + random2(cellCorner, seed);\n\n float w = pow(dot2(p - cellPosition), powerCoeff);\n \n if (isinf(w)) return value;\n\n sum += w*value;\n weightSum += w;\n } \n }\n\n return sum / weightSum;\n}\n\nfloat idwNoise(vec3 p, float power, float scale, float seed, int window) {\n p *= scale;\n\n vec3 pi = floor(p);\n\n float sum = 0.0;\n float weightSum = 0.0;\n float powerCoeff = -0.5*power;\n\n for (int i = -window; i <= window; i++) {\n for (int j = -window; j <= window; j++) {\n for (int k = -window; k <= window; k++) {\n vec3 cellCorner = pi + vec3(i, j, k);\n float value = random(cellCorner, seed);\n\n vec3 cellPosition = cellCorner + random3(cellCorner, seed);\n\n float w = pow(dot2(p - cellPosition), powerCoeff);\n \n if (isinf(w)) return value;\n\n sum += w*value;\n weightSum += w;\n } \n } \n }\n\n return sum / weightSum;\n}\n\nfloat standardizeOctaveNoise(float value, int octaves) {\n float norm = clamp((float(octaves) - 1.0)/9.0, 0.0, 1.0);\n float l = 0.25*pow(norm, 0.125);\n return (value - l)/(1.0 - 2.0*l);\n}\n\nfloat octaveNoise1D(float p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(float, float)) {\n p *= scale;\n\n float sum = 0.0;\n float amplitude = 1.0;\n float amplitudeSum = 0.0;\n\n for (int i = 0; i < octaves; i++) {\n float value = noise(p, seed + float(i));\n sum += amplitude*value;\n amplitudeSum += amplitude;\n\n p = lacunarity*p + PI;\n amplitude *= falloff;\n }\n\n // return standardizeOctaveNoise(sum / amplitudeSum, octaves);\n return sum / amplitudeSum;\n}\n\nfloat octaveNoise2D(vec2 p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(vec2, float)) {\n p *= scale;\n\n float sum = 0.0;\n float amplitude = 1.0;\n float amplitudeSum = 0.0;\n\n for (int i = 0; i < octaves; i++) {\n float value = noise(p, seed + float(i));\n sum += amplitude*value;\n amplitudeSum += amplitude;\n\n p = rotate(lacunarity*p, 1.2);\n amplitude *= falloff;\n }\n\n // return standardizeOctaveNoise(sum / amplitudeSum, octaves);\n return sum / amplitudeSum;\n}\n\nfloat octaveNoise3D(vec3 p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(vec3, float)) {\n p *= scale;\n\n float sum = 0.0;\n float amplitude = 1.0;\n float amplitudeSum = 0.0;\n\n vec3 axis = vec3(0.5092382307155079, -0.23643203568934296, 0.8275121249127003);\n\n for (int i = 0; i < octaves; i++) {\n float value = noise(p, seed + float(i));\n sum += amplitude*value;\n amplitudeSum += amplitude;\n\n p = axisAngle(lacunarity*p, axis, 1.2);\n amplitude *= falloff;\n }\n\n // return standardizeOctaveNoise(sum / amplitudeSum, octaves);\n return sum / amplitudeSum;\n}\n\n";
|
|
1
|
+
export declare const noiseDefinition = "\nimport { random, random2, random3, random4, randomUnit } from \"@/random\";\nimport { triangleWave, dot2, signed } from \"@/utils\";\nimport { rotate, axisAngle } from \"@/geometry\";\nimport { PI, SQRT_2 } from \"@/constants\";\n\nexport {\n valueNoise, perlinNoise, worleyNoise, voroNoise, gaboroNoise,\n idwNoise, simplexNoise,\n octaveNoise1D, octaveNoise2D, octaveNoise3D\n}\n\nfloat valueNoise(float p, float scale, float seed) {\n p *= scale;\n\n float pi = floor(p);\n float pf = fract(p);\n\n float sf = smoothstep(0.0, 1.0, pf);\n\n return mix(random(pi, seed), random(pi + 1.0, seed), sf);\n}\n\nfloat valueNoise(vec2 p, float scale, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n vec2 pf = fract(p);\n\n vec2 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n return mix(\n mix(random(pi, seed), random(pi + o.xy, seed), sf.x),\n mix(random(pi + o.yx, seed), random(pi + o.xx, seed), sf.x),\n sf.y\n );\n}\n\nfloat valueNoise(vec3 p, float scale, float seed) {\n p *= scale;\n\n vec3 pi = floor(p);\n vec3 pf = fract(p);\n\n vec3 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n return mix(\n mix(\n mix(random(pi, seed), random(pi + o.xyy, seed), sf.x),\n mix(random(pi + o.yxy, seed), random(pi + o.xxy, seed), sf.x),\n sf.y\n ),\n mix(\n mix(random(pi + o.yyx, seed), random(pi + o.xyx, seed), sf.x),\n mix(random(pi + o.yxx, seed), random(pi + o.xxx, seed), sf.x),\n sf.y\n ), \n sf.z\n );\n\n}\n\nfloat valueNoise(vec4 p, float scale, float seed) {\n p *= scale;\n\n vec4 pi = floor(p);\n vec4 pf = fract(p);\n\n vec4 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n return mix(\n mix(\n mix(\n mix(random(pi, seed), random(pi + o.xyyy, seed), sf.x),\n mix(random(pi + o.yxyy, seed), random(pi + o.xxyy, seed), sf.x),\n sf.y\n ),\n mix(\n mix(random(pi + o.yyxy, seed), random(pi + o.xyxy, seed), sf.x),\n mix(random(pi + o.yxxy, seed), random(pi + o.xxxy, seed), sf.x),\n sf.y\n ), \n sf.z\n ),\n mix(\n mix(\n mix(random(pi + o.yyyx, seed), random(pi + o.xyyx, seed), sf.x),\n mix(random(pi + o.yxyx, seed), random(pi + o.xxyx, seed), sf.x),\n sf.y\n ),\n mix(\n mix(random(pi + o.yyxx, seed), random(pi + o.xyxx, seed), sf.x),\n mix(random(pi + o.yxxx, seed), random(pi + o.xxxx, seed), sf.x),\n sf.y\n ), \n sf.z\n ),\n sf.w\n );\n}\n\nfloat perlinNoise(float p, float scale, float seed) {\n p *= scale;\n\n float pi = floor(p);\n float pf = fract(p);\n\n float sf = smoothstep(0.0, 1.0, pf);\n\n float value = mix(signed(random(pi, seed))*pf, signed(random(pi + 1.0, seed))*(pf - 1.0), sf);\n \n return 0.5 + value;\n}\n\nfloat perlinNoise(vec2 p, float scale, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n vec2 pf = fract(p);\n\n vec2 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n float value = mix(\n mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xy, seed), pf - o.xy), sf.x),\n mix(dot(randomUnit(pi + o.yx, seed), pf - o.yx), dot(randomUnit(pi + o.xx, seed), pf - o.xx), sf.x),\n sf.y\n );\n \n return 0.5 + 0.70710678118654752*value;\n}\n\nfloat perlinNoise(vec3 p, float scale, float seed) {\n p *= scale;\n\n vec3 pi = floor(p);\n vec3 pf = fract(p);\n\n vec3 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n float value = mix(\n mix(\n mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xyy, seed), pf - o.xyy), sf.x),\n mix(dot(randomUnit(pi + o.yxy, seed), pf - o.yxy), dot(randomUnit(pi + o.xxy, seed), pf - o.xxy), sf.x),\n sf.y\n ),\n mix(\n mix(dot(randomUnit(pi + o.yyx, seed), pf - o.yyx), dot(randomUnit(pi + o.xyx, seed), pf - o.xyx), sf.x),\n mix(dot(randomUnit(pi + o.yxx, seed), pf - o.yxx), dot(randomUnit(pi + o.xxx, seed), pf - o.xxx), sf.x),\n sf.y\n ), \n sf.z\n );\n\n return 0.5 + 0.75*value;\n}\n\nfloat perlinNoise(vec4 p, float scale, float seed) {\n p *= scale;\n\n vec4 pi = floor(p);\n vec4 pf = fract(p);\n\n vec4 sf = smoothstep(0.0, 1.0, pf);\n vec2 o = vec2(1, 0);\n\n float value = mix(\n mix(\n mix(\n mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xyyy, seed), pf - o.xyyy), sf.x),\n mix(dot(randomUnit(pi + o.yxyy, seed), pf - o.yxyy), dot(randomUnit(pi + o.xxyy, seed), pf - o.xxyy), sf.x),\n sf.y\n ),\n mix(\n mix(dot(randomUnit(pi + o.yyxy, seed), pf - o.yyxy), dot(randomUnit(pi + o.xyxy, seed), pf - o.xyxy), sf.x),\n mix(dot(randomUnit(pi + o.yxxy, seed), pf - o.yxxy), dot(randomUnit(pi + o.xxxy, seed), pf - o.xxxy), sf.x),\n sf.y\n ), \n sf.z\n ),\n mix(\n mix(\n mix(dot(randomUnit(pi + o.yyyx, seed), pf - o.yyyx), dot(randomUnit(pi + o.xyyx, seed), pf - o.xyyx), sf.x),\n mix(dot(randomUnit(pi + o.yxyx, seed), pf - o.yxyx), dot(randomUnit(pi + o.xxyx, seed), pf - o.xxyx), sf.x),\n sf.y\n ),\n mix(\n mix(dot(randomUnit(pi + o.yyxx, seed), pf - o.yyxx), dot(randomUnit(pi + o.xyxx, seed), pf - o.xyxx), sf.x),\n mix(dot(randomUnit(pi + o.yxxx, seed), pf - o.yxxx), dot(randomUnit(pi + o.xxxx, seed), pf - o.xxxx), sf.x),\n sf.y\n ), \n sf.z\n ),\n sf.w\n );\n\n return 0.5 + value;\n}\n\nfloat worleyNoise(float p, float scale, float seed) {\n p *= scale;\n\n float pi = floor(p);\n\n float minDist = 1e9;\n\n for (int index = -1; index <= 1; index++) {\n float fi = pi + float(index);\n float centerToPosition = fi + random(fi, seed) - p;\n\n minDist = min(minDist, abs(centerToPosition));\n }\n\n return minDist;\n}\n\nfloat worleyNoise(vec2 p, float scale, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n\n float minDist2 = 1e9;\n\n for (int row = -1; row <= 1; row++) {\n for (int col = -1; col <= 1; col++) {\n vec2 index = pi + vec2(col, row);\n \n vec2 centerToPosition = index + random2(index, seed) - p;\n float dist2 = dot2(centerToPosition);\n\n minDist2 = min(minDist2, dist2);\n }\n }\n\n return sqrt(minDist2);\n}\n\nfloat worleyNoise(vec3 p, float scale, float seed) {\n p *= scale;\n\n vec3 pi = floor(p);\n\n float minDist2 = 1e9;\n\n for (int row = -1; row <= 1; row++) {\n for (int col = -1; col <= 1; col++) {\n for (int slice = -1; slice <= 1; slice++) {\n vec3 index = pi + vec3(col, row, slice);\n \n vec3 centerToPosition = index + random3(index, seed) - p;\n float dist2 = dot2(centerToPosition);\n\n minDist2 = min(minDist2, dist2);\n }\n }\n }\n\n return sqrt(minDist2);\n}\n\nfloat worleyNoise(vec4 p, float scale, float seed) {\n p *= scale;\n\n vec4 pi = floor(p);\n\n float minDist2 = 1e9;\n\n for (int row = -1; row <= 1; row++) {\n for (int col = -1; col <= 1; col++) {\n for (int slice = -1; slice <= 1; slice++) {\n for (int depth = -1; depth <= 1; depth++) {\n vec4 index = pi + vec4(col, row, slice, depth);\n \n vec4 centerToPosition = index + random4(index, seed) - p;\n float dist2 = dot(centerToPosition, centerToPosition);\n\n minDist2 = min(minDist2, dist2);\n }\n }\n }\n }\n\n return sqrt(minDist2);\n}\n\n// Adapted version of https://iquilezles.org/articles/voronoise/\nfloat voroNoise(vec2 p, float scale, float disorder, float smoothness, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n\n float s = 1.0;\n int kernel = 2;\n\n float power = 64.0 - 63.0*pow(smoothness, 0.1);\n\n float sum = 0.0;\n float weightSum = 0.0;\n\n for (int row = -kernel; row <= kernel; row++) {\n for (int col = -kernel; col <= kernel; col++) {\n vec2 index = pi + vec2(col, row);\n\n // xy is cell center, z is value\n vec3 data = random3(index, seed);\n\n vec2 centerToPosition = index + data.xy*disorder - p;\n\n float dist = length(centerToPosition);\n\n float weight = pow(smoothstep(SQRT_2, 0.0, dist), power);\n\n sum += weight*data.z;\n weightSum += weight;\n }\n }\n\n return sum / weightSum;\n}\n\n\nfloat voroNoise(vec3 p, float scale, float disorder, float smoothness, float seed) {\n p *= scale;\n\n vec3 pi = floor(p);\n\n float s = 1.0;\n int kernel = 2;\n\n float power = 64.0 - 63.0*pow(smoothness, 0.1);\n\n float sum = 0.0;\n float weightSum = 0.0;\n\n for (int row = -kernel; row <= kernel; row++) {\n for (int col = -kernel; col <= kernel; col++) {\n for (int slice = -kernel; slice < kernel; slice++) {\n vec3 index = pi + vec3(col, row, slice);\n\n vec3 cellPosition = random3(index, seed);\n float value = random(index, seed);\n\n vec3 centerToPosition = index + cellPosition*disorder - p;\n\n float dist = length(centerToPosition);\n\n float weight = pow(smoothstep(SQRT_2, 0.0, dist), power);\n\n sum += weight*value;\n weightSum += weight;\n }\n }\n }\n\n return sum / weightSum;\n}\n\nfloat voroNoise(vec4 p, float scale, float disorder, float smoothness, float seed) {\n p *= scale;\n\n vec4 pi = floor(p);\n\n int kernel = 2;\n\n float power = 64.0 - 63.0*pow(smoothness, 0.1);\n\n float sum = 0.0;\n float weightSum = 0.0;\n\n for (int row = -kernel; row <= kernel; row++) {\n for (int col = -kernel; col <= kernel; col++) {\n for (int slice = -kernel; slice < kernel; slice++) {\n for (int depth = -kernel; depth < kernel; depth++) {\n vec4 index = pi + vec4(col, row, slice, depth);\n\n vec4 cellPosition = random4(index, seed);\n float value = random(index, seed);\n\n vec4 centerToPosition = index + cellPosition*disorder - p;\n\n float dist = length(centerToPosition);\n\n float weight = pow(smoothstep(1.2, 0.0, dist), power);\n\n sum += weight*value;\n weightSum += weight;\n }\n }\n }\n }\n\n return sum / weightSum;\n}\n\nfloat gaboroNoise(vec2 p, float level, float scale, float radius, float freq, float hatchAmount, float hatchAngle, float seed) {\n p *= scale;\n\n vec2 pi = floor(p);\n float exponent = 1. / (radius*radius);\n\n float valueSum = 0., weightSum = 0.;\n for (int i = -1; i <= 1; i++) {\n for (int j = -1; j <= 1; j++) {\n vec2 cellIndex = pi + vec2(i, j);\n vec2 cellCenter = cellIndex + random2(cellIndex, seed);\n \n float se = random(cellCenter, seed);\n\n vec2 diff = p - cellCenter;\n float rotation = PI*random(se);\n \n float weight = exp(-exponent*dot(diff, diff));\n \n vec2 texturePosition = diff*freq;\n \n float value = max(triangleWave(texturePosition, rotation), hatchAmount*triangleWave(texturePosition, rotation + hatchAngle));\n \n weightSum += weight;\n valueSum += weight*value;\n }\n }\n \n level = mix(level, sqrt(level), hatchAmount);\n\n return smoothstep(0.05, -0.05, valueSum / weightSum - level);\n //return valueSum / weightSum;\n}\n\nfloat idwNoise(float p, float power, float scale, float seed, int window) {\n p *= scale;\n\n float pi = floor(p);\n\n float sum = 0.0;\n float weightSum = 0.0;\n float powerCoeff = -power;\n\n for (int i = -window; i <= window; i++) {\n float cellCorner = pi + float(i);\n float value = random(cellCorner, seed);\n\n float cellPosition = cellCorner + random(cellCorner, seed);\n\n float w = pow(abs(p - cellPosition), powerCoeff);\n \n if (isinf(w)) return value;\n\n sum += w*value;\n weightSum += w; \n }\n\n return sum / weightSum;\n}\n\nfloat idwNoise(vec2 p, float power, float scale, float seed, int window) {\n p *= scale;\n\n vec2 pi = floor(p);\n\n float sum = 0.0;\n float weightSum = 0.0;\n float powerCoeff = -0.5*power;\n\n for (int i = -window; i <= window; i++) {\n for (int j = -window; j <= window; j++) {\n vec2 cellCorner = pi + vec2(i, j);\n float value = random(cellCorner, seed);\n\n vec2 cellPosition = cellCorner + random2(cellCorner, seed);\n\n float w = pow(dot2(p - cellPosition), powerCoeff);\n \n if (isinf(w)) return value;\n\n sum += w*value;\n weightSum += w;\n } \n }\n\n return sum / weightSum;\n}\n\nfloat idwNoise(vec3 p, float power, float scale, float seed, int window) {\n p *= scale;\n\n vec3 pi = floor(p);\n\n float sum = 0.0;\n float weightSum = 0.0;\n float powerCoeff = -0.5*power;\n\n for (int i = -window; i <= window; i++) {\n for (int j = -window; j <= window; j++) {\n for (int k = -window; k <= window; k++) {\n vec3 cellCorner = pi + vec3(i, j, k);\n float value = random(cellCorner, seed);\n\n vec3 cellPosition = cellCorner + random3(cellCorner, seed);\n\n float w = pow(dot2(p - cellPosition), powerCoeff);\n \n if (isinf(w)) return value;\n\n sum += w*value;\n weightSum += w;\n } \n } \n }\n\n return sum / weightSum;\n}\n\nfloat idwNoise(vec4 p, float power, float scale, float seed, int window) {\n p *= scale;\n\n vec4 pi = floor(p);\n\n float sum = 0.0;\n float weightSum = 0.0;\n float powerCoeff = -0.5*power;\n\n for (int i = -window; i <= window; i++) {\n for (int j = -window; j <= window; j++) {\n for (int k = -window; k <= window; k++) {\n for (int l = -window; l <= window; l++) {\n vec4 cellCorner = pi + vec4(i, j, k, l);\n float value = random(cellCorner, seed);\n\n vec4 cellPosition = cellCorner + random4(cellCorner, seed);\n\n float w = pow(dot2(p - cellPosition), powerCoeff);\n \n if (isinf(w)) return value;\n\n sum += w*value;\n weightSum += w;\n }\n } \n } \n }\n\n return sum / weightSum;\n}\n\nmat2 ISOMETRIC_TO_SQUARE = mat2(\n 1.0 + sqrt(3.0),\n 1.0 - sqrt(3.0),\n 1.0 - sqrt(3.0),\n 1.0 + sqrt(3.0)\n) / (2.0*sqrt(2.0));\n\nmat2 SQUARE_TO_ISOMETRIC = mat2(\n sqrt(3.0) + 1.0,\n sqrt(3.0) - 1.0,\n sqrt(3.0) - 1.0,\n sqrt(3.0) + 1.0\n) / sqrt(6.0);\n\n\nfloat simplexNoise(vec2 p, float scale, float seed) {\n p *= scale;\n \n vec2 pt = SQUARE_TO_ISOMETRIC*p;\n vec2 pi = floor(pt);\n vec2 pf = fract(pt);\n\n vec2 a = ISOMETRIC_TO_SQUARE*pi;\n vec2 b = ISOMETRIC_TO_SQUARE*(pi + vec2(1, 1));\n vec2 c = ISOMETRIC_TO_SQUARE*(pi + (pf.x > pf.y ? vec2(1, 0) : vec2(0, 1)));\n\n float weightFn = (vec2 p, vec2 v) => pow(1.0 - dot2(p - v), 4.);\n \n float w0 = weightFn(p, a);\n float w1 = weightFn(p, b);\n float w2 = weightFn(p, c);\n \n float v0 = dot(randomUnit(a, seed), p - a);\n float v1 = dot(randomUnit(b, seed), p - b);\n float v2 = dot(randomUnit(c, seed), p - c);\n \n float v = (w0*v0 + w1*v1 + w2*v2)/(w0 + w1 + w2);\n\n return 0.5 + 0.9*v;\n}\n\nfloat standardizeOctaveNoise(float value, int octaves) {\n float norm = clamp((float(octaves) - 1.0)/9.0, 0.0, 1.0);\n float l = 0.25*pow(norm, 0.125);\n return (value - l)/(1.0 - 2.0*l);\n}\n\nfloat octaveNoise1D(float p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(float, float)) {\n p *= scale;\n\n float sum = 0.0;\n float amplitude = 1.0;\n float amplitudeSum = 0.0;\n\n for (int i = 0; i < octaves; i++) {\n float value = noise(p, seed + float(i));\n sum += amplitude*value;\n amplitudeSum += amplitude;\n\n p = lacunarity*p + PI;\n amplitude *= falloff;\n }\n\n // return standardizeOctaveNoise(sum / amplitudeSum, octaves);\n return sum / amplitudeSum;\n}\n\nfloat octaveNoise2D(vec2 p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(vec2, float)) {\n p *= scale;\n\n float sum = 0.0;\n float amplitude = 1.0;\n float amplitudeSum = 0.0;\n\n for (int i = 0; i < octaves; i++) {\n float value = noise(p, seed + float(i));\n sum += amplitude*value;\n amplitudeSum += amplitude;\n\n p = rotate(lacunarity*p, 1.2);\n amplitude *= falloff;\n }\n\n // return standardizeOctaveNoise(sum / amplitudeSum, octaves);\n return sum / amplitudeSum;\n}\n\nfloat octaveNoise3D(vec3 p, float scale, int octaves, float falloff, float lacunarity, float seed, float noise(vec3, float)) {\n p *= scale;\n\n float sum = 0.0;\n float amplitude = 1.0;\n float amplitudeSum = 0.0;\n\n vec3 axis = vec3(0.5092382307155079, -0.23643203568934296, 0.8275121249127003);\n\n for (int i = 0; i < octaves; i++) {\n float value = noise(p, seed + float(i));\n sum += amplitude*value;\n amplitudeSum += amplitude;\n\n p = axisAngle(lacunarity*p, axis, 1.2);\n amplitude *= falloff;\n }\n\n // return standardizeOctaveNoise(sum / amplitudeSum, octaves);\n return sum / amplitudeSum;\n}\n\n";
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export const noiseDefinition = /*glsl*/ `
|
|
2
|
-
import { random, random2, random3, randomUnit } from "@/random";
|
|
3
|
-
import { triangleWave, dot2 } from "@/utils";
|
|
2
|
+
import { random, random2, random3, random4, randomUnit } from "@/random";
|
|
3
|
+
import { triangleWave, dot2, signed } from "@/utils";
|
|
4
4
|
import { rotate, axisAngle } from "@/geometry";
|
|
5
|
-
import { PI } from "@/constants";
|
|
5
|
+
import { PI, SQRT_2 } from "@/constants";
|
|
6
6
|
|
|
7
7
|
export {
|
|
8
|
-
valueNoise, perlinNoise, worleyNoise, voroNoise, gaboroNoise,
|
|
8
|
+
valueNoise, perlinNoise, worleyNoise, voroNoise, gaboroNoise,
|
|
9
|
+
idwNoise, simplexNoise,
|
|
9
10
|
octaveNoise1D, octaveNoise2D, octaveNoise3D
|
|
10
11
|
}
|
|
11
12
|
|
|
@@ -109,10 +110,9 @@ float perlinNoise(float p, float scale, float seed) {
|
|
|
109
110
|
|
|
110
111
|
float sf = smoothstep(0.0, 1.0, pf);
|
|
111
112
|
|
|
112
|
-
float
|
|
113
|
+
float value = mix(signed(random(pi, seed))*pf, signed(random(pi + 1.0, seed))*(pf - 1.0), sf);
|
|
113
114
|
|
|
114
|
-
|
|
115
|
-
return 0.5 + signed;
|
|
115
|
+
return 0.5 + value;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
float perlinNoise(vec2 p, float scale, float seed) {
|
|
@@ -124,14 +124,13 @@ float perlinNoise(vec2 p, float scale, float seed) {
|
|
|
124
124
|
vec2 sf = smoothstep(0.0, 1.0, pf);
|
|
125
125
|
vec2 o = vec2(1, 0);
|
|
126
126
|
|
|
127
|
-
float
|
|
127
|
+
float value = mix(
|
|
128
128
|
mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xy, seed), pf - o.xy), sf.x),
|
|
129
129
|
mix(dot(randomUnit(pi + o.yx, seed), pf - o.yx), dot(randomUnit(pi + o.xx, seed), pf - o.xx), sf.x),
|
|
130
130
|
sf.y
|
|
131
131
|
);
|
|
132
132
|
|
|
133
|
-
|
|
134
|
-
return 0.5 + 0.70710678118654752*signed;
|
|
133
|
+
return 0.5 + 0.70710678118654752*value;
|
|
135
134
|
}
|
|
136
135
|
|
|
137
136
|
float perlinNoise(vec3 p, float scale, float seed) {
|
|
@@ -143,7 +142,7 @@ float perlinNoise(vec3 p, float scale, float seed) {
|
|
|
143
142
|
vec3 sf = smoothstep(0.0, 1.0, pf);
|
|
144
143
|
vec2 o = vec2(1, 0);
|
|
145
144
|
|
|
146
|
-
float
|
|
145
|
+
float value = mix(
|
|
147
146
|
mix(
|
|
148
147
|
mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xyy, seed), pf - o.xyy), sf.x),
|
|
149
148
|
mix(dot(randomUnit(pi + o.yxy, seed), pf - o.yxy), dot(randomUnit(pi + o.xxy, seed), pf - o.xxy), sf.x),
|
|
@@ -157,21 +156,61 @@ float perlinNoise(vec3 p, float scale, float seed) {
|
|
|
157
156
|
sf.z
|
|
158
157
|
);
|
|
159
158
|
|
|
160
|
-
|
|
161
|
-
|
|
159
|
+
return 0.5 + 0.75*value;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
float perlinNoise(vec4 p, float scale, float seed) {
|
|
163
|
+
p *= scale;
|
|
164
|
+
|
|
165
|
+
vec4 pi = floor(p);
|
|
166
|
+
vec4 pf = fract(p);
|
|
167
|
+
|
|
168
|
+
vec4 sf = smoothstep(0.0, 1.0, pf);
|
|
169
|
+
vec2 o = vec2(1, 0);
|
|
170
|
+
|
|
171
|
+
float value = mix(
|
|
172
|
+
mix(
|
|
173
|
+
mix(
|
|
174
|
+
mix(dot(randomUnit(pi, seed), pf), dot(randomUnit(pi + o.xyyy, seed), pf - o.xyyy), sf.x),
|
|
175
|
+
mix(dot(randomUnit(pi + o.yxyy, seed), pf - o.yxyy), dot(randomUnit(pi + o.xxyy, seed), pf - o.xxyy), sf.x),
|
|
176
|
+
sf.y
|
|
177
|
+
),
|
|
178
|
+
mix(
|
|
179
|
+
mix(dot(randomUnit(pi + o.yyxy, seed), pf - o.yyxy), dot(randomUnit(pi + o.xyxy, seed), pf - o.xyxy), sf.x),
|
|
180
|
+
mix(dot(randomUnit(pi + o.yxxy, seed), pf - o.yxxy), dot(randomUnit(pi + o.xxxy, seed), pf - o.xxxy), sf.x),
|
|
181
|
+
sf.y
|
|
182
|
+
),
|
|
183
|
+
sf.z
|
|
184
|
+
),
|
|
185
|
+
mix(
|
|
186
|
+
mix(
|
|
187
|
+
mix(dot(randomUnit(pi + o.yyyx, seed), pf - o.yyyx), dot(randomUnit(pi + o.xyyx, seed), pf - o.xyyx), sf.x),
|
|
188
|
+
mix(dot(randomUnit(pi + o.yxyx, seed), pf - o.yxyx), dot(randomUnit(pi + o.xxyx, seed), pf - o.xxyx), sf.x),
|
|
189
|
+
sf.y
|
|
190
|
+
),
|
|
191
|
+
mix(
|
|
192
|
+
mix(dot(randomUnit(pi + o.yyxx, seed), pf - o.yyxx), dot(randomUnit(pi + o.xyxx, seed), pf - o.xyxx), sf.x),
|
|
193
|
+
mix(dot(randomUnit(pi + o.yxxx, seed), pf - o.yxxx), dot(randomUnit(pi + o.xxxx, seed), pf - o.xxxx), sf.x),
|
|
194
|
+
sf.y
|
|
195
|
+
),
|
|
196
|
+
sf.z
|
|
197
|
+
),
|
|
198
|
+
sf.w
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
return 0.5 + value;
|
|
162
202
|
}
|
|
163
203
|
|
|
164
204
|
float worleyNoise(float p, float scale, float seed) {
|
|
165
205
|
p *= scale;
|
|
166
206
|
|
|
167
207
|
float pi = floor(p);
|
|
168
|
-
float pf = fract(p);
|
|
169
208
|
|
|
170
209
|
float minDist = 1e9;
|
|
171
210
|
|
|
172
211
|
for (int index = -1; index <= 1; index++) {
|
|
173
|
-
float fi = float(index);
|
|
174
|
-
float centerToPosition = fi + random(
|
|
212
|
+
float fi = pi + float(index);
|
|
213
|
+
float centerToPosition = fi + random(fi, seed) - p;
|
|
175
214
|
|
|
176
215
|
minDist = min(minDist, abs(centerToPosition));
|
|
177
216
|
}
|
|
@@ -183,15 +222,14 @@ float worleyNoise(vec2 p, float scale, float seed) {
|
|
|
183
222
|
p *= scale;
|
|
184
223
|
|
|
185
224
|
vec2 pi = floor(p);
|
|
186
|
-
vec2 pf = fract(p);
|
|
187
225
|
|
|
188
226
|
float minDist2 = 1e9;
|
|
189
227
|
|
|
190
228
|
for (int row = -1; row <= 1; row++) {
|
|
191
229
|
for (int col = -1; col <= 1; col++) {
|
|
192
|
-
vec2 index = vec2(col, row);
|
|
230
|
+
vec2 index = pi + vec2(col, row);
|
|
193
231
|
|
|
194
|
-
vec2 centerToPosition = index + random2(
|
|
232
|
+
vec2 centerToPosition = index + random2(index, seed) - p;
|
|
195
233
|
float dist2 = dot2(centerToPosition);
|
|
196
234
|
|
|
197
235
|
minDist2 = min(minDist2, dist2);
|
|
@@ -205,16 +243,15 @@ float worleyNoise(vec3 p, float scale, float seed) {
|
|
|
205
243
|
p *= scale;
|
|
206
244
|
|
|
207
245
|
vec3 pi = floor(p);
|
|
208
|
-
vec3 pf = fract(p);
|
|
209
246
|
|
|
210
247
|
float minDist2 = 1e9;
|
|
211
248
|
|
|
212
249
|
for (int row = -1; row <= 1; row++) {
|
|
213
250
|
for (int col = -1; col <= 1; col++) {
|
|
214
251
|
for (int slice = -1; slice <= 1; slice++) {
|
|
215
|
-
vec3 index = vec3(col, row, slice);
|
|
252
|
+
vec3 index = pi + vec3(col, row, slice);
|
|
216
253
|
|
|
217
|
-
vec3 centerToPosition = index + random3(
|
|
254
|
+
vec3 centerToPosition = index + random3(index, seed) - p;
|
|
218
255
|
float dist2 = dot2(centerToPosition);
|
|
219
256
|
|
|
220
257
|
minDist2 = min(minDist2, dist2);
|
|
@@ -225,12 +262,36 @@ float worleyNoise(vec3 p, float scale, float seed) {
|
|
|
225
262
|
return sqrt(minDist2);
|
|
226
263
|
}
|
|
227
264
|
|
|
265
|
+
float worleyNoise(vec4 p, float scale, float seed) {
|
|
266
|
+
p *= scale;
|
|
267
|
+
|
|
268
|
+
vec4 pi = floor(p);
|
|
269
|
+
|
|
270
|
+
float minDist2 = 1e9;
|
|
271
|
+
|
|
272
|
+
for (int row = -1; row <= 1; row++) {
|
|
273
|
+
for (int col = -1; col <= 1; col++) {
|
|
274
|
+
for (int slice = -1; slice <= 1; slice++) {
|
|
275
|
+
for (int depth = -1; depth <= 1; depth++) {
|
|
276
|
+
vec4 index = pi + vec4(col, row, slice, depth);
|
|
277
|
+
|
|
278
|
+
vec4 centerToPosition = index + random4(index, seed) - p;
|
|
279
|
+
float dist2 = dot(centerToPosition, centerToPosition);
|
|
280
|
+
|
|
281
|
+
minDist2 = min(minDist2, dist2);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return sqrt(minDist2);
|
|
288
|
+
}
|
|
289
|
+
|
|
228
290
|
// Adapted version of https://iquilezles.org/articles/voronoise/
|
|
229
291
|
float voroNoise(vec2 p, float scale, float disorder, float smoothness, float seed) {
|
|
230
292
|
p *= scale;
|
|
231
293
|
|
|
232
294
|
vec2 pi = floor(p);
|
|
233
|
-
vec2 pf = fract(p);
|
|
234
295
|
|
|
235
296
|
float s = 1.0;
|
|
236
297
|
int kernel = 2;
|
|
@@ -242,16 +303,16 @@ float voroNoise(vec2 p, float scale, float disorder, float smoothness, float see
|
|
|
242
303
|
|
|
243
304
|
for (int row = -kernel; row <= kernel; row++) {
|
|
244
305
|
for (int col = -kernel; col <= kernel; col++) {
|
|
245
|
-
vec2 index = vec2(col, row);
|
|
306
|
+
vec2 index = pi + vec2(col, row);
|
|
246
307
|
|
|
247
308
|
// xy is cell center, z is value
|
|
248
|
-
vec3 data = random3(
|
|
309
|
+
vec3 data = random3(index, seed);
|
|
249
310
|
|
|
250
|
-
vec2 centerToPosition = index + data.xy*disorder -
|
|
311
|
+
vec2 centerToPosition = index + data.xy*disorder - p;
|
|
251
312
|
|
|
252
|
-
float
|
|
313
|
+
float dist = length(centerToPosition);
|
|
253
314
|
|
|
254
|
-
float weight = pow(smoothstep(
|
|
315
|
+
float weight = pow(smoothstep(SQRT_2, 0.0, dist), power);
|
|
255
316
|
|
|
256
317
|
sum += weight*data.z;
|
|
257
318
|
weightSum += weight;
|
|
@@ -261,6 +322,80 @@ float voroNoise(vec2 p, float scale, float disorder, float smoothness, float see
|
|
|
261
322
|
return sum / weightSum;
|
|
262
323
|
}
|
|
263
324
|
|
|
325
|
+
|
|
326
|
+
float voroNoise(vec3 p, float scale, float disorder, float smoothness, float seed) {
|
|
327
|
+
p *= scale;
|
|
328
|
+
|
|
329
|
+
vec3 pi = floor(p);
|
|
330
|
+
|
|
331
|
+
float s = 1.0;
|
|
332
|
+
int kernel = 2;
|
|
333
|
+
|
|
334
|
+
float power = 64.0 - 63.0*pow(smoothness, 0.1);
|
|
335
|
+
|
|
336
|
+
float sum = 0.0;
|
|
337
|
+
float weightSum = 0.0;
|
|
338
|
+
|
|
339
|
+
for (int row = -kernel; row <= kernel; row++) {
|
|
340
|
+
for (int col = -kernel; col <= kernel; col++) {
|
|
341
|
+
for (int slice = -kernel; slice < kernel; slice++) {
|
|
342
|
+
vec3 index = pi + vec3(col, row, slice);
|
|
343
|
+
|
|
344
|
+
vec3 cellPosition = random3(index, seed);
|
|
345
|
+
float value = random(index, seed);
|
|
346
|
+
|
|
347
|
+
vec3 centerToPosition = index + cellPosition*disorder - p;
|
|
348
|
+
|
|
349
|
+
float dist = length(centerToPosition);
|
|
350
|
+
|
|
351
|
+
float weight = pow(smoothstep(SQRT_2, 0.0, dist), power);
|
|
352
|
+
|
|
353
|
+
sum += weight*value;
|
|
354
|
+
weightSum += weight;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
return sum / weightSum;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
float voroNoise(vec4 p, float scale, float disorder, float smoothness, float seed) {
|
|
363
|
+
p *= scale;
|
|
364
|
+
|
|
365
|
+
vec4 pi = floor(p);
|
|
366
|
+
|
|
367
|
+
int kernel = 2;
|
|
368
|
+
|
|
369
|
+
float power = 64.0 - 63.0*pow(smoothness, 0.1);
|
|
370
|
+
|
|
371
|
+
float sum = 0.0;
|
|
372
|
+
float weightSum = 0.0;
|
|
373
|
+
|
|
374
|
+
for (int row = -kernel; row <= kernel; row++) {
|
|
375
|
+
for (int col = -kernel; col <= kernel; col++) {
|
|
376
|
+
for (int slice = -kernel; slice < kernel; slice++) {
|
|
377
|
+
for (int depth = -kernel; depth < kernel; depth++) {
|
|
378
|
+
vec4 index = pi + vec4(col, row, slice, depth);
|
|
379
|
+
|
|
380
|
+
vec4 cellPosition = random4(index, seed);
|
|
381
|
+
float value = random(index, seed);
|
|
382
|
+
|
|
383
|
+
vec4 centerToPosition = index + cellPosition*disorder - p;
|
|
384
|
+
|
|
385
|
+
float dist = length(centerToPosition);
|
|
386
|
+
|
|
387
|
+
float weight = pow(smoothstep(1.2, 0.0, dist), power);
|
|
388
|
+
|
|
389
|
+
sum += weight*value;
|
|
390
|
+
weightSum += weight;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
return sum / weightSum;
|
|
397
|
+
}
|
|
398
|
+
|
|
264
399
|
float gaboroNoise(vec2 p, float level, float scale, float radius, float freq, float hatchAmount, float hatchAngle, float seed) {
|
|
265
400
|
p *= scale;
|
|
266
401
|
|
|
@@ -305,7 +440,7 @@ float idwNoise(float p, float power, float scale, float seed, int window) {
|
|
|
305
440
|
float powerCoeff = -power;
|
|
306
441
|
|
|
307
442
|
for (int i = -window; i <= window; i++) {
|
|
308
|
-
float cellCorner = pi + i;
|
|
443
|
+
float cellCorner = pi + float(i);
|
|
309
444
|
float value = random(cellCorner, seed);
|
|
310
445
|
|
|
311
446
|
float cellPosition = cellCorner + random(cellCorner, seed);
|
|
@@ -379,6 +514,79 @@ float idwNoise(vec3 p, float power, float scale, float seed, int window) {
|
|
|
379
514
|
return sum / weightSum;
|
|
380
515
|
}
|
|
381
516
|
|
|
517
|
+
float idwNoise(vec4 p, float power, float scale, float seed, int window) {
|
|
518
|
+
p *= scale;
|
|
519
|
+
|
|
520
|
+
vec4 pi = floor(p);
|
|
521
|
+
|
|
522
|
+
float sum = 0.0;
|
|
523
|
+
float weightSum = 0.0;
|
|
524
|
+
float powerCoeff = -0.5*power;
|
|
525
|
+
|
|
526
|
+
for (int i = -window; i <= window; i++) {
|
|
527
|
+
for (int j = -window; j <= window; j++) {
|
|
528
|
+
for (int k = -window; k <= window; k++) {
|
|
529
|
+
for (int l = -window; l <= window; l++) {
|
|
530
|
+
vec4 cellCorner = pi + vec4(i, j, k, l);
|
|
531
|
+
float value = random(cellCorner, seed);
|
|
532
|
+
|
|
533
|
+
vec4 cellPosition = cellCorner + random4(cellCorner, seed);
|
|
534
|
+
|
|
535
|
+
float w = pow(dot2(p - cellPosition), powerCoeff);
|
|
536
|
+
|
|
537
|
+
if (isinf(w)) return value;
|
|
538
|
+
|
|
539
|
+
sum += w*value;
|
|
540
|
+
weightSum += w;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
return sum / weightSum;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
mat2 ISOMETRIC_TO_SQUARE = mat2(
|
|
550
|
+
1.0 + sqrt(3.0),
|
|
551
|
+
1.0 - sqrt(3.0),
|
|
552
|
+
1.0 - sqrt(3.0),
|
|
553
|
+
1.0 + sqrt(3.0)
|
|
554
|
+
) / (2.0*sqrt(2.0));
|
|
555
|
+
|
|
556
|
+
mat2 SQUARE_TO_ISOMETRIC = mat2(
|
|
557
|
+
sqrt(3.0) + 1.0,
|
|
558
|
+
sqrt(3.0) - 1.0,
|
|
559
|
+
sqrt(3.0) - 1.0,
|
|
560
|
+
sqrt(3.0) + 1.0
|
|
561
|
+
) / sqrt(6.0);
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
float simplexNoise(vec2 p, float scale, float seed) {
|
|
565
|
+
p *= scale;
|
|
566
|
+
|
|
567
|
+
vec2 pt = SQUARE_TO_ISOMETRIC*p;
|
|
568
|
+
vec2 pi = floor(pt);
|
|
569
|
+
vec2 pf = fract(pt);
|
|
570
|
+
|
|
571
|
+
vec2 a = ISOMETRIC_TO_SQUARE*pi;
|
|
572
|
+
vec2 b = ISOMETRIC_TO_SQUARE*(pi + vec2(1, 1));
|
|
573
|
+
vec2 c = ISOMETRIC_TO_SQUARE*(pi + (pf.x > pf.y ? vec2(1, 0) : vec2(0, 1)));
|
|
574
|
+
|
|
575
|
+
float weightFn = (vec2 p, vec2 v) => pow(1.0 - dot2(p - v), 4.);
|
|
576
|
+
|
|
577
|
+
float w0 = weightFn(p, a);
|
|
578
|
+
float w1 = weightFn(p, b);
|
|
579
|
+
float w2 = weightFn(p, c);
|
|
580
|
+
|
|
581
|
+
float v0 = dot(randomUnit(a, seed), p - a);
|
|
582
|
+
float v1 = dot(randomUnit(b, seed), p - b);
|
|
583
|
+
float v2 = dot(randomUnit(c, seed), p - c);
|
|
584
|
+
|
|
585
|
+
float v = (w0*v0 + w1*v1 + w2*v2)/(w0 + w1 + w2);
|
|
586
|
+
|
|
587
|
+
return 0.5 + 0.9*v;
|
|
588
|
+
}
|
|
589
|
+
|
|
382
590
|
float standardizeOctaveNoise(float value, int octaves) {
|
|
383
591
|
float norm = clamp((float(octaves) - 1.0)/9.0, 0.0, 1.0);
|
|
384
592
|
float l = 0.25*pow(norm, 0.125);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const randomDefinition = "\nimport { TWO_PI, PI } from \"@/constants\";\n\nexport { \n random, random2, random3, random4,\n
|
|
1
|
+
export declare const randomDefinition = "\nimport { TWO_PI, PI } from \"@/constants\";\n\nexport { \n random, random2, random3, random4,\n randomUnit\n };\n\nconst float SEED_OFFSET = 2123.1415926535897932384626433832795;\n\nuint hash(uint x) {\n x += 2127912214u;\n x ^= x >> 15;\n x *= 3545902487u;\n return x;\n}\n\nuint hash(uvec2 v) {\n return hash(v.x ^ hash(v.y));\n}\n\nuint hash(uvec3 v) {\n return hash(v.x ^ hash(v.y ^ hash(v.z)));\n}\n\nuint hash(uvec4 v) {\n return hash(v.x ^ hash(v.y ^ hash(v.z ^ hash(v.w))));\n}\n\nuint hash(uvec4 v, uint u) {\n return hash(v.x ^ hash(v.y ^ hash(v.z ^ hash(v.w ^ hash(u)))));\n}\n\nfloat hashToFloat(uint u) {\n uint mant = 8388607u;\n uint one = 1065353216u;\n\n u &= mant;\n u |= one;\n\n float f = uintBitsToFloat(u);\n return f - 1.0;\n}\n\nfloat random(float p) {\n return hashToFloat(hash(floatBitsToUint(p)));\n}\n\nfloat random(vec2 p) {\n return hashToFloat(hash(floatBitsToUint(p)));\n}\n\nfloat random(vec3 p) {\n return hashToFloat(hash(floatBitsToUint(p)));\n}\n\nfloat random(vec4 p) {\n return hashToFloat(hash(floatBitsToUint(p)));\n}\n\nfloat random(float p, float seed) {\n return random(vec2(p, seed));\n}\n\nfloat random(vec2 p, float seed) {\n return random(vec3(p, seed));\n}\n\nfloat random(vec3 p, float seed) {\n return random(vec4(p, seed));\n}\n\nfloat random(vec4 p, float seed) {\n return hashToFloat(hash(floatBitsToUint(p), floatBitsToUint(seed)));\n}\n\nvec2 random2(float p, float seed) {\n return vec2(\n random(p, seed), \n random(p, seed += SEED_OFFSET)\n );\n}\n\nvec2 random2(float p) {\n return random2(p, 0.);\n}\n\nvec2 random2(vec2 p, float seed) {\n return vec2(\n random(p, seed), \n random(p, seed += SEED_OFFSET)\n );\n}\n\nvec2 random2(vec2 p) {\n return random2(p, 0.0);\n}\n\nvec2 random2(vec3 p, float seed) {\n return vec2(\n random(p, seed), \n random(p, seed += SEED_OFFSET)\n );\n}\n\nvec2 random2(vec3 p) {\n return random2(p, 0.0);\n}\n\nvec3 random3(float p, float seed) {\n return vec3(\n random(p, seed), \n random(p, seed += SEED_OFFSET), \n random(p, seed += SEED_OFFSET)\n );\n}\n\nvec3 random3(float p) {\n return random3(p, 0.0);\n}\n\nvec3 random3(vec2 p, float seed) {\n return vec3(\n random(p, seed), \n random(p, seed += SEED_OFFSET), \n random(p, seed += SEED_OFFSET)\n );\n}\n\nvec3 random3(vec2 p) {\n return random3(p, 0.0);\n}\n\nvec3 random3(vec3 p, float seed) {\n return vec3(\n random(p, seed), \n random(p, seed += SEED_OFFSET), \n random(p, seed += SEED_OFFSET)\n );\n}\n\nvec4 random4(vec4 p, float seed) {\n return vec4(\n random(p, seed),\n random(p, seed += SEED_OFFSET),\n random(p, seed += SEED_OFFSET),\n random(p, seed += SEED_OFFSET)\n );\n}\n\nvec4 random4(vec4 p) {\n return random4(p, 0.0);\n}\n\nvec2 randomUnit(vec2 p, float seed) {\n float direction = TWO_PI*random(p, seed);\n return vec2(cos(direction), sin(direction));\n}\n\nvec3 randomUnit(vec3 p, float seed) {\n float z = -1.0 + 2.0*random(p, seed);\n float theta = TWO_PI*random(p, seed += SEED_OFFSET);\n float r = sqrt(1.0 - z*z);\n return vec3(\n r*cos(theta),\n r*sin(theta),\n z\n );\n}\n\nvec4 randomUnit(vec4 p, float seed) {\n float a1 = TWO_PI*random(p, seed);\n float a2 = TWO_PI*random(p, seed += SEED_OFFSET);\n float u = random(p, seed += SEED_OFFSET);\n float r1 = sqrt(u); \n float r2 = sqrt(1.0 - u);\n\n return vec4(\n cos(a1) * r1,\n sin(a1) * r1, \n cos(a2) * r2, \n sin(a2) * r2\n );\n}\n\n";
|
|
@@ -3,17 +3,16 @@ import { TWO_PI, PI } from "@/constants";
|
|
|
3
3
|
|
|
4
4
|
export {
|
|
5
5
|
random, random2, random3, random4,
|
|
6
|
-
randomGauss,
|
|
7
6
|
randomUnit
|
|
8
7
|
};
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
value += 2127912214u;
|
|
12
|
-
value ^= value >> 12;
|
|
13
|
-
value *= 3345072700u;
|
|
14
|
-
value ^= value >> 19;
|
|
9
|
+
const float SEED_OFFSET = 2123.1415926535897932384626433832795;
|
|
15
10
|
|
|
16
|
-
|
|
11
|
+
uint hash(uint x) {
|
|
12
|
+
x += 2127912214u;
|
|
13
|
+
x ^= x >> 15;
|
|
14
|
+
x *= 3545902487u;
|
|
15
|
+
return x;
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
uint hash(uvec2 v) {
|
|
@@ -76,7 +75,10 @@ float random(vec4 p, float seed) {
|
|
|
76
75
|
}
|
|
77
76
|
|
|
78
77
|
vec2 random2(float p, float seed) {
|
|
79
|
-
return vec2(
|
|
78
|
+
return vec2(
|
|
79
|
+
random(p, seed),
|
|
80
|
+
random(p, seed += SEED_OFFSET)
|
|
81
|
+
);
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
vec2 random2(float p) {
|
|
@@ -84,7 +86,10 @@ vec2 random2(float p) {
|
|
|
84
86
|
}
|
|
85
87
|
|
|
86
88
|
vec2 random2(vec2 p, float seed) {
|
|
87
|
-
return vec2(
|
|
89
|
+
return vec2(
|
|
90
|
+
random(p, seed),
|
|
91
|
+
random(p, seed += SEED_OFFSET)
|
|
92
|
+
);
|
|
88
93
|
}
|
|
89
94
|
|
|
90
95
|
vec2 random2(vec2 p) {
|
|
@@ -92,7 +97,10 @@ vec2 random2(vec2 p) {
|
|
|
92
97
|
}
|
|
93
98
|
|
|
94
99
|
vec2 random2(vec3 p, float seed) {
|
|
95
|
-
return vec2(
|
|
100
|
+
return vec2(
|
|
101
|
+
random(p, seed),
|
|
102
|
+
random(p, seed += SEED_OFFSET)
|
|
103
|
+
);
|
|
96
104
|
}
|
|
97
105
|
|
|
98
106
|
vec2 random2(vec3 p) {
|
|
@@ -101,9 +109,9 @@ vec2 random2(vec3 p) {
|
|
|
101
109
|
|
|
102
110
|
vec3 random3(float p, float seed) {
|
|
103
111
|
return vec3(
|
|
104
|
-
random(
|
|
105
|
-
random(
|
|
106
|
-
random(
|
|
112
|
+
random(p, seed),
|
|
113
|
+
random(p, seed += SEED_OFFSET),
|
|
114
|
+
random(p, seed += SEED_OFFSET)
|
|
107
115
|
);
|
|
108
116
|
}
|
|
109
117
|
|
|
@@ -112,7 +120,11 @@ vec3 random3(float p) {
|
|
|
112
120
|
}
|
|
113
121
|
|
|
114
122
|
vec3 random3(vec2 p, float seed) {
|
|
115
|
-
return vec3(
|
|
123
|
+
return vec3(
|
|
124
|
+
random(p, seed),
|
|
125
|
+
random(p, seed += SEED_OFFSET),
|
|
126
|
+
random(p, seed += SEED_OFFSET)
|
|
127
|
+
);
|
|
116
128
|
}
|
|
117
129
|
|
|
118
130
|
vec3 random3(vec2 p) {
|
|
@@ -120,54 +132,55 @@ vec3 random3(vec2 p) {
|
|
|
120
132
|
}
|
|
121
133
|
|
|
122
134
|
vec3 random3(vec3 p, float seed) {
|
|
123
|
-
return vec3(
|
|
135
|
+
return vec3(
|
|
136
|
+
random(p, seed),
|
|
137
|
+
random(p, seed += SEED_OFFSET),
|
|
138
|
+
random(p, seed += SEED_OFFSET)
|
|
139
|
+
);
|
|
124
140
|
}
|
|
125
141
|
|
|
126
142
|
vec4 random4(vec4 p, float seed) {
|
|
127
143
|
return vec4(
|
|
128
144
|
random(p, seed),
|
|
129
|
-
random(p,
|
|
130
|
-
random(p,
|
|
131
|
-
random(p,
|
|
145
|
+
random(p, seed += SEED_OFFSET),
|
|
146
|
+
random(p, seed += SEED_OFFSET),
|
|
147
|
+
random(p, seed += SEED_OFFSET)
|
|
132
148
|
);
|
|
133
149
|
}
|
|
134
150
|
|
|
135
|
-
vec4 random4(vec4 p
|
|
151
|
+
vec4 random4(vec4 p) {
|
|
136
152
|
return random4(p, 0.0);
|
|
137
153
|
}
|
|
138
154
|
|
|
139
|
-
float randomGaussian(vec3 p, float seed) {
|
|
140
|
-
float u1 = random(vec4(p, 1), seed);
|
|
141
|
-
float u2 = random(vec4(p, 2), seed);
|
|
142
|
-
return sqrt(-2.0 * log(u1)) * cos(TWO_PI * u2);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
float randomGaussian(vec4 p, float seed) {
|
|
146
|
-
float u1 = random(p, seed);
|
|
147
|
-
float u2 = random(p, random(seed));
|
|
148
|
-
return sqrt(-2.0 * log(u1)) * cos(TWO_PI * u2);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
155
|
vec2 randomUnit(vec2 p, float seed) {
|
|
152
156
|
float direction = TWO_PI*random(p, seed);
|
|
153
157
|
return vec2(cos(direction), sin(direction));
|
|
154
158
|
}
|
|
155
159
|
|
|
156
160
|
vec3 randomUnit(vec3 p, float seed) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
161
|
+
float z = -1.0 + 2.0*random(p, seed);
|
|
162
|
+
float theta = TWO_PI*random(p, seed += SEED_OFFSET);
|
|
163
|
+
float r = sqrt(1.0 - z*z);
|
|
164
|
+
return vec3(
|
|
165
|
+
r*cos(theta),
|
|
166
|
+
r*sin(theta),
|
|
167
|
+
z
|
|
168
|
+
);
|
|
162
169
|
}
|
|
163
170
|
|
|
164
171
|
vec4 randomUnit(vec4 p, float seed) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
172
|
+
float a1 = TWO_PI*random(p, seed);
|
|
173
|
+
float a2 = TWO_PI*random(p, seed += SEED_OFFSET);
|
|
174
|
+
float u = random(p, seed += SEED_OFFSET);
|
|
175
|
+
float r1 = sqrt(u);
|
|
176
|
+
float r2 = sqrt(1.0 - u);
|
|
177
|
+
|
|
178
|
+
return vec4(
|
|
179
|
+
cos(a1) * r1,
|
|
180
|
+
sin(a1) * r1,
|
|
181
|
+
cos(a2) * r2,
|
|
182
|
+
sin(a2) * r2
|
|
183
|
+
);
|
|
171
184
|
}
|
|
172
185
|
|
|
173
186
|
`;
|
package/package.json
CHANGED
package/dist/constants 2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const EPS = 1e-9;
|
package/dist/constants 3.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const EPS = 1e-9;
|
package/dist/constants.d 2.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const EPS = 1e-9;
|
package/dist/constants.d 3.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const EPS = 1e-9;
|
package/dist/index 2.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export * from "./geometry/index.js";
|
|
2
|
-
export * from "./math/index.js";
|
|
3
|
-
export * from "./utilities/index.js";
|
|
4
|
-
export * from "./noise/index.js";
|
|
5
|
-
export * from "./constants.js";
|
|
6
|
-
export * from "./tilings/index.js";
|
|
7
|
-
export * from "./transformations/index.js";
|
|
8
|
-
export * from "./types.js";
|
|
9
|
-
export * from "./shader-renderer/index.js";
|
|
10
|
-
export * from "./shader-modules/index.js";
|
|
11
|
-
export * from "./constants.js";
|
package/dist/index 3.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export * from "./geometry/index.js";
|
|
2
|
-
export * from "./math/index.js";
|
|
3
|
-
export * from "./utilities/index.js";
|
|
4
|
-
export * from "./noise/index.js";
|
|
5
|
-
export * from "./constants.js";
|
|
6
|
-
export * from "./tilings/index.js";
|
|
7
|
-
export * from "./transforms/index.js";
|
|
8
|
-
export * from "./types.js";
|
|
9
|
-
export * from "./shader-renderer/index.js";
|
|
10
|
-
export * from "./shader-modules/index.js";
|
|
11
|
-
export * from "./constants.js";
|
package/dist/index.d 2.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export * from "./geometry/index.js";
|
|
2
|
-
export * from "./math/index.js";
|
|
3
|
-
export * from "./utilities/index.js";
|
|
4
|
-
export * from "./noise/index.js";
|
|
5
|
-
export * from "./constants.js";
|
|
6
|
-
export * from "./tilings/index.js";
|
|
7
|
-
export * from "./transformations/index.js";
|
|
8
|
-
export * from "./types.js";
|
|
9
|
-
export * from "./shader-renderer/index.js";
|
|
10
|
-
export * from "./shader-modules/index.js";
|
|
11
|
-
export * from "./constants.js";
|
package/dist/index.d 3.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export * from "./geometry/index.js";
|
|
2
|
-
export * from "./math/index.js";
|
|
3
|
-
export * from "./utilities/index.js";
|
|
4
|
-
export * from "./noise/index.js";
|
|
5
|
-
export * from "./constants.js";
|
|
6
|
-
export * from "./tilings/index.js";
|
|
7
|
-
export * from "./transforms/index.js";
|
|
8
|
-
export * from "./types.js";
|
|
9
|
-
export * from "./shader-renderer/index.js";
|
|
10
|
-
export * from "./shader-modules/index.js";
|
|
11
|
-
export * from "./constants.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const sdfDefinition = "\n\nimport { barycentric, transformToZAxis } from \"@/geometry\";\nimport { lerp, signed } from \"@/utils\";\n\nexport {\n sphere, box, rectangularCylinder, \n discoBall, polygon, donut, boxFrame,\n triangleSDFSquared, meshSDF, sdfNormal\n}\n\nfloat sphere(vec3 p, vec3 center, float radius) {\n return length(p - center) - radius;\n}\n\nfloat box(vec3 p, vec3 center, vec3 direction, vec3 size) {\n p = transformToZAxis(p, center, direction, 0.0);\n p = abs(p) - size/2.0;\n\n // First part gives distance inside box, second part outside\n return min(max(max(p.x, p.y), p.z), 0.0) + length(max(p, vec3(0)));\n}\n\nfloat rectangularCylinder(vec3 p, vec3 center, vec3 direction, vec2 size, float height, bool offsetCenter, float rotation) {\n if (offsetCenter) center += 0.5*height*normalize(direction);\n p = transformToZAxis(p, center, direction, rotation);\n return box(p, vec3(0), vec3(0, 0, 1), vec3(size, height));\n}\n\nfloat discoBall(vec3 p, vec3 center, float radius, float n, float o) {\n p -= center;\n float phi = -PI + 2.0*PI*(round(lerp(atan(p.y, p.x), -PI, PI)*n)/n + o);\n float theta = PI*(round(lerp(acos(p.z/length(p)), 0.0, PI)*n)/n + o);\n\n vec3 bp = vec3(sin(theta)*cos(phi), sin(theta)*sin(phi), cos(theta));\n\n return dot(bp, p - radius*bp);\n}\n\nfloat discoBall(vec3 p, vec3 center, float radius, float n) {\n return discoBall(p, center, radius, n, 0.0);\n}\n\nfloat polygon(vec2 p, float radius, float n) {\n float theta = PI*signed((floor(lerp(atan(p.y, p.x), -PI, PI)*n) + .5)/n);\n vec2 pp = vec2(cos(theta), sin(theta));\n return dot(pp, p - radius*pp);\n}\n\nfloat donut(vec3 p, vec3 center, vec3 direction, float innerRadius, float outerRadius, float rotation, float sections, float sides) {\n p = transformToZAxis(p, center, direction, 0.0);\n\n vec3 xy = normalize(vec3(p.xy, 0));\n float angle = mod(atan(xy.y, xy.x), 2.*PI);\n\n angle = 2.*PI*round(sections*angle/(2.*PI))/sections;\n innerRadius *= sqrt(PI/(sections*tan(PI/sections)));\n outerRadius *= sqrt(PI/(sides*tan(PI/sides)));\n return polygon(rotate(vec2(dot(p, vec3(cos(angle), sin(angle), 0)) - innerRadius, p.z), rotation + PI/4.), outerRadius, sides);\n}\n\nfloat boxFrame(vec3 p, vec3 center, vec3 direction, vec3 size, float thickness) {\n float dBox = box(p, center, direction, size);\n\n p = transformToZAxis(p, center, direction, 0.0);\n\n vec3 o = 2.0*vec3(thickness, thickness, -1e9);\n float dX = box(p, vec3(0), vec3(1, 0, 0), size.yzx - o);\n float dY = box(p, vec3(0), vec3(0, 1, 0), size.zxy - o);\n float dZ = box(p, vec3(0), vec3(0, 0, 1), size.xyz - o);\n\n float dInner = min(dX, min(dY, dZ));\n return max(dBox, -dInner);\n}\n\n// x is distance squared, y indicates which side of triangle p is on \n// (relative to normal: positive if p is above, negative if below)\nvec2 triangleSDFSquared(vec3 p, vec3 a, vec3 b, vec3 c) {\n vec3 ab = b - a;\n vec3 ca = a - c;\n vec3 bc = c - b;\n\n vec3 ap = p - a;\n vec3 bp = p - b;\n vec3 cp = p - c;\n\n vec3 normal = cross(ab, -ca); // Negate to make cross(ab, ac), follows right-hand rule assuming abc is CCW\n \n bool isInsideTriangle = all(greaterThan(barycentric(p, a, b, c), vec3(0)));\n \n float dot2 = (vec3 v) => dot(v, v); \n\n bool isInsideXYProjection = all(greaterThan(barycentric(p.xy, a.xy, b.xy, c.xy), vec3(0)));\n\n float distSquared;\n bool isAboveXYProjection;\n\n // If p is above XY projection, then dist = dot(ap, normal) > 0 when normal points upwards\n // and dist < 0 when it points downwards. sign(normal.z)*dist > 0.0 then tells us if p is above \n if (isInsideTriangle) {\n float dist = dot(ap, normalize(normal));\n distSquared = dist*dist;\n isAboveXYProjection = isInsideXYProjection && sign(normal.z)*dist > 0.0;\n } else {\n distSquared = min(min(\n dot2(ap - ab*clamp(dot(ap, ab) / dot2(ab), 0.0, 1.0)),\n dot2(bp - bc*clamp(dot(bp, bc) / dot2(bc), 0.0, 1.0))),\n dot2(cp - ca*clamp(dot(cp, ca) / dot2(ca), 0.0, 1.0))\n );\n isAboveXYProjection = isInsideXYProjection && sign(normal.z)*dot(ap, normal) > 0.0;\n }\n\n return vec2(distSquared, isAboveXYProjection ? -1.0 : 1.0);\n}\n\nvec3 sdfNormal(vec3 p, float sdf(vec3), float h) {\n vec2 o = vec2(1, -1)*h;\n return normalize( \n o.xyy*sdf(p + o.xyy) + \n o.yyx*sdf(p + o.yyx) + \n o.yxy*sdf(p + o.yxy) + \n o.xxx*sdf(p + o.xxx)\n );\n}\n\n";
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
export const sdfDefinition = /*glsl*/ `
|
|
2
|
-
|
|
3
|
-
import { barycentric, transformToZAxis } from "@/geometry";
|
|
4
|
-
import { lerp, signed } from "@/utils";
|
|
5
|
-
|
|
6
|
-
export {
|
|
7
|
-
sphere, box, rectangularCylinder,
|
|
8
|
-
discoBall, polygon, donut, boxFrame,
|
|
9
|
-
triangleSDFSquared, meshSDF, sdfNormal
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
float sphere(vec3 p, vec3 center, float radius) {
|
|
13
|
-
return length(p - center) - radius;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
float box(vec3 p, vec3 center, vec3 direction, vec3 size) {
|
|
17
|
-
p = transformToZAxis(p, center, direction, 0.0);
|
|
18
|
-
p = abs(p) - size/2.0;
|
|
19
|
-
|
|
20
|
-
// First part gives distance inside box, second part outside
|
|
21
|
-
return min(max(max(p.x, p.y), p.z), 0.0) + length(max(p, vec3(0)));
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
float rectangularCylinder(vec3 p, vec3 center, vec3 direction, vec2 size, float height, bool offsetCenter, float rotation) {
|
|
25
|
-
if (offsetCenter) center += 0.5*height*normalize(direction);
|
|
26
|
-
p = transformToZAxis(p, center, direction, rotation);
|
|
27
|
-
return box(p, vec3(0), vec3(0, 0, 1), vec3(size, height));
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
float discoBall(vec3 p, vec3 center, float radius, float n, float o) {
|
|
31
|
-
p -= center;
|
|
32
|
-
float phi = -PI + 2.0*PI*(round(lerp(atan(p.y, p.x), -PI, PI)*n)/n + o);
|
|
33
|
-
float theta = PI*(round(lerp(acos(p.z/length(p)), 0.0, PI)*n)/n + o);
|
|
34
|
-
|
|
35
|
-
vec3 bp = vec3(sin(theta)*cos(phi), sin(theta)*sin(phi), cos(theta));
|
|
36
|
-
|
|
37
|
-
return dot(bp, p - radius*bp);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
float discoBall(vec3 p, vec3 center, float radius, float n) {
|
|
41
|
-
return discoBall(p, center, radius, n, 0.0);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
float polygon(vec2 p, float radius, float n) {
|
|
45
|
-
float theta = PI*signed((floor(lerp(atan(p.y, p.x), -PI, PI)*n) + .5)/n);
|
|
46
|
-
vec2 pp = vec2(cos(theta), sin(theta));
|
|
47
|
-
return dot(pp, p - radius*pp);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
float donut(vec3 p, vec3 center, vec3 direction, float innerRadius, float outerRadius, float rotation, float sections, float sides) {
|
|
51
|
-
p = transformToZAxis(p, center, direction, 0.0);
|
|
52
|
-
|
|
53
|
-
vec3 xy = normalize(vec3(p.xy, 0));
|
|
54
|
-
float angle = mod(atan(xy.y, xy.x), 2.*PI);
|
|
55
|
-
|
|
56
|
-
angle = 2.*PI*round(sections*angle/(2.*PI))/sections;
|
|
57
|
-
innerRadius *= sqrt(PI/(sections*tan(PI/sections)));
|
|
58
|
-
outerRadius *= sqrt(PI/(sides*tan(PI/sides)));
|
|
59
|
-
return polygon(rotate(vec2(dot(p, vec3(cos(angle), sin(angle), 0)) - innerRadius, p.z), rotation + PI/4.), outerRadius, sides);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
float boxFrame(vec3 p, vec3 center, vec3 direction, vec3 size, float thickness) {
|
|
63
|
-
float dBox = box(p, center, direction, size);
|
|
64
|
-
|
|
65
|
-
p = transformToZAxis(p, center, direction, 0.0);
|
|
66
|
-
|
|
67
|
-
vec3 o = 2.0*vec3(thickness, thickness, -1e9);
|
|
68
|
-
float dX = box(p, vec3(0), vec3(1, 0, 0), size.yzx - o);
|
|
69
|
-
float dY = box(p, vec3(0), vec3(0, 1, 0), size.zxy - o);
|
|
70
|
-
float dZ = box(p, vec3(0), vec3(0, 0, 1), size.xyz - o);
|
|
71
|
-
|
|
72
|
-
float dInner = min(dX, min(dY, dZ));
|
|
73
|
-
return max(dBox, -dInner);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// x is distance squared, y indicates which side of triangle p is on
|
|
77
|
-
// (relative to normal: positive if p is above, negative if below)
|
|
78
|
-
vec2 triangleSDFSquared(vec3 p, vec3 a, vec3 b, vec3 c) {
|
|
79
|
-
vec3 ab = b - a;
|
|
80
|
-
vec3 ca = a - c;
|
|
81
|
-
vec3 bc = c - b;
|
|
82
|
-
|
|
83
|
-
vec3 ap = p - a;
|
|
84
|
-
vec3 bp = p - b;
|
|
85
|
-
vec3 cp = p - c;
|
|
86
|
-
|
|
87
|
-
vec3 normal = cross(ab, -ca); // Negate to make cross(ab, ac), follows right-hand rule assuming abc is CCW
|
|
88
|
-
|
|
89
|
-
bool isInsideTriangle = all(greaterThan(barycentric(p, a, b, c), vec3(0)));
|
|
90
|
-
|
|
91
|
-
float dot2 = (vec3 v) => dot(v, v);
|
|
92
|
-
|
|
93
|
-
bool isInsideXYProjection = all(greaterThan(barycentric(p.xy, a.xy, b.xy, c.xy), vec3(0)));
|
|
94
|
-
|
|
95
|
-
float distSquared;
|
|
96
|
-
bool isAboveXYProjection;
|
|
97
|
-
|
|
98
|
-
// If p is above XY projection, then dist = dot(ap, normal) > 0 when normal points upwards
|
|
99
|
-
// and dist < 0 when it points downwards. sign(normal.z)*dist > 0.0 then tells us if p is above
|
|
100
|
-
if (isInsideTriangle) {
|
|
101
|
-
float dist = dot(ap, normalize(normal));
|
|
102
|
-
distSquared = dist*dist;
|
|
103
|
-
isAboveXYProjection = isInsideXYProjection && sign(normal.z)*dist > 0.0;
|
|
104
|
-
} else {
|
|
105
|
-
distSquared = min(min(
|
|
106
|
-
dot2(ap - ab*clamp(dot(ap, ab) / dot2(ab), 0.0, 1.0)),
|
|
107
|
-
dot2(bp - bc*clamp(dot(bp, bc) / dot2(bc), 0.0, 1.0))),
|
|
108
|
-
dot2(cp - ca*clamp(dot(cp, ca) / dot2(ca), 0.0, 1.0))
|
|
109
|
-
);
|
|
110
|
-
isAboveXYProjection = isInsideXYProjection && sign(normal.z)*dot(ap, normal) > 0.0;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return vec2(distSquared, isAboveXYProjection ? -1.0 : 1.0);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
vec3 sdfNormal(vec3 p, float sdf(vec3), float h) {
|
|
117
|
-
vec2 o = vec2(1, -1)*h;
|
|
118
|
-
return normalize(
|
|
119
|
-
o.xyy*sdf(p + o.xyy) +
|
|
120
|
-
o.yyx*sdf(p + o.yyx) +
|
|
121
|
-
o.yxy*sdf(p + o.yxy) +
|
|
122
|
-
o.xxx*sdf(p + o.xxx)
|
|
123
|
-
);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
`;
|
package/dist/tilings/tiler.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/tilings/tiler.js
DELETED
package/dist/types 2.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/types 3.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/types.d 2.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/types.d 3.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|