@matboks/utilities 0.0.1 → 0.0.2
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/constants 2.js +1 -0
- package/dist/constants 3.js +1 -0
- package/dist/constants.d 2.ts +1 -0
- package/dist/constants.d 3.ts +1 -0
- package/dist/index 2.js +11 -0
- package/dist/index 3.js +11 -0
- package/dist/index.d 2.ts +11 -0
- package/dist/index.d 3.ts +11 -0
- package/dist/shader-modules/modules/camera.js +42 -42
- package/dist/shader-modules/modules/color/blend.js +107 -107
- package/dist/shader-modules/modules/color/index.js +134 -134
- package/dist/shader-modules/modules/constants.js +13 -13
- package/dist/shader-modules/modules/geometry.js +109 -109
- package/dist/shader-modules/modules/math.js +18 -18
- package/dist/shader-modules/modules/noise.d.ts +1 -1
- package/dist/shader-modules/modules/noise.js +449 -409
- package/dist/shader-modules/modules/random.d.ts +1 -1
- package/dist/shader-modules/modules/random.js +172 -146
- package/dist/shader-modules/modules/ray-marching.js +53 -53
- package/dist/shader-modules/modules/sdf/index.js +182 -182
- package/dist/shader-modules/modules/sdf/operations.js +76 -76
- package/dist/shader-modules/modules/sdf.d.ts +1 -0
- package/dist/shader-modules/modules/sdf.js +126 -0
- package/dist/shader-modules/modules/utils.js +114 -114
- package/dist/shader-modules/shaders.js +107 -107
- package/dist/shader-renderer/pixel-vertex-shader.js +13 -13
- package/dist/tilings/tiler.d.ts +1 -0
- package/dist/tilings/tiler.js +4 -0
- package/dist/types 2.js +1 -0
- package/dist/types 3.js +1 -0
- package/dist/types.d 2.ts +1 -0
- package/dist/types.d 3.ts +1 -0
- package/package.json +2 -2
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
export const geometryDefinition = /*glsl*/ `
|
|
2
|
-
|
|
3
|
-
export {
|
|
4
|
-
rotate,
|
|
5
|
-
barycentric,
|
|
6
|
-
distanceToSegment,
|
|
7
|
-
axisAngle, axisAngleMatrix,
|
|
8
|
-
create2DBasisVectors,
|
|
9
|
-
transformToZAxis
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
vec2 rotate(vec2 vector, float rotation) {
|
|
13
|
-
float c = cos(rotation);
|
|
14
|
-
float s = sin(rotation);
|
|
15
|
-
return mat2(c, s, -s, c)*vector;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
vec2 rotate(vec2 vector, vec2 center, float rotation) {
|
|
19
|
-
return center + rotate(vector - center, rotation);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Rotates a vector around an axis using Rodrigues' formula
|
|
23
|
-
vec3 axisAngle(vec3 vector, vec3 axis, float rotation) {
|
|
24
|
-
float c = cos(rotation);
|
|
25
|
-
float s = sin(rotation);
|
|
26
|
-
return vector*c + cross(axis, vector)*s + axis*dot(axis, vector)*(1.0 - c);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
vec3 axisAngle(vec3 vector, vec3 origin, vec3 axis, float rotation) {
|
|
30
|
-
return axisAngle(vector - origin, axis, rotation) + origin;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
mat3 axisAngleMatrix(vec3 axis, float rotation) {
|
|
34
|
-
mat3 K = mat3(
|
|
35
|
-
0, axis.z, -axis.y,
|
|
36
|
-
-axis.z, 0, axis.x,
|
|
37
|
-
axis.y, -axis.x, 0
|
|
38
|
-
);
|
|
39
|
-
return mat3(1.0) + sin(rotation)*K + (1.0 - cos(rotation))*K*K;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Assumes first point has already been subtracted
|
|
43
|
-
vec3 barycentric(vec2 p, vec2 b, vec2 c) {
|
|
44
|
-
float dbb = dot(b, b);
|
|
45
|
-
float dbc = dot(b, c);
|
|
46
|
-
float dcc = dot(c, c);
|
|
47
|
-
float dcp = dot(c, p);
|
|
48
|
-
float dbp = dot(b, p);
|
|
49
|
-
|
|
50
|
-
float denom = dbb * dcc - dbc * dbc;
|
|
51
|
-
float v = (dcc * dbp - dbc * dcp) / denom;
|
|
52
|
-
float w = (dbb * dcp - dbc * dbp) / denom;
|
|
53
|
-
return vec3(1.0 - v - w, v, w);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
vec3 barycentric(vec2 p, vec2 a, vec2 b, vec2 c) {
|
|
57
|
-
return barycentric(p - a, b - a, c - a);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Assumes first point has already been subtracted
|
|
61
|
-
vec3 barycentric(vec3 p, vec3 b, vec3 c) {
|
|
62
|
-
float dbb = dot(b, b);
|
|
63
|
-
float dbc = dot(b, c);
|
|
64
|
-
float dcc = dot(c, c);
|
|
65
|
-
float dcp = dot(c, p);
|
|
66
|
-
float dbp = dot(b, p);
|
|
67
|
-
|
|
68
|
-
float denom = dbb * dcc - dbc * dbc;
|
|
69
|
-
float v = (dcc * dbp - dbc * dcp) / denom;
|
|
70
|
-
float w = (dbb * dcp - dbc * dbp) / denom;
|
|
71
|
-
return vec3(1.0 - v - w, v, w);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
vec3 barycentric(vec3 p, vec3 a, vec3 b, vec3 c) {
|
|
75
|
-
return barycentric(p - a, b - a, c - a);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
float distanceToSegment(vec3 p, vec3 a, vec3 b) {
|
|
79
|
-
vec3 ab = b - a;
|
|
80
|
-
vec3 ap = p - a;
|
|
81
|
-
|
|
82
|
-
float t = clamp(dot(ap, ab) / dot(ab, ab), 0.0, 1.0);
|
|
83
|
-
|
|
84
|
-
vec3 projection = a + t * ab;
|
|
85
|
-
return length(p - projection);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
mat2x3 create2DBasisVectors(vec3 normal) {
|
|
89
|
-
vec3 i = normalize(cross(normal, abs(normal.z) > 0.999 ? vec3(1, 0, 0) : vec3(0, 0, 1)));
|
|
90
|
-
vec3 j = cross(normal, i);
|
|
91
|
-
|
|
92
|
-
return mat2x3(i, j);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
mat2x3 create2DBasisVectors(vec3 normal, float rotation) {
|
|
96
|
-
mat3 rotationMatrix = axisAngleMatrix(normal, rotation);
|
|
97
|
-
mat2x3 basis = create2DBasisVectors(normal);
|
|
98
|
-
return rotationMatrix*basis;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
vec3 transformToZAxis(vec3 pos, vec3 center, vec3 direction, float orientation) {
|
|
102
|
-
vec3 r = normalize(direction); // Normal of transformed plane
|
|
103
|
-
bool isZ = length(r.xy) < 1e-9;
|
|
104
|
-
float angle = isZ ? 0.0 : atan(r.y, r.x);
|
|
105
|
-
vec3 i = isZ ? vec3(1, 0, 0) : normalize(vec3(r.y, -r.x, 0)); // Direction of x-axis transformed plane
|
|
106
|
-
vec3 j = cross(i, r); // Direction of y-axis along transformed plane
|
|
107
|
-
return axisAngle((pos - center)*mat3(i, j, r), vec3(0, 0, 1), angle + orientation);
|
|
108
|
-
}
|
|
109
|
-
|
|
1
|
+
export const geometryDefinition = /*glsl*/ `
|
|
2
|
+
|
|
3
|
+
export {
|
|
4
|
+
rotate,
|
|
5
|
+
barycentric,
|
|
6
|
+
distanceToSegment,
|
|
7
|
+
axisAngle, axisAngleMatrix,
|
|
8
|
+
create2DBasisVectors,
|
|
9
|
+
transformToZAxis
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
vec2 rotate(vec2 vector, float rotation) {
|
|
13
|
+
float c = cos(rotation);
|
|
14
|
+
float s = sin(rotation);
|
|
15
|
+
return mat2(c, s, -s, c)*vector;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
vec2 rotate(vec2 vector, vec2 center, float rotation) {
|
|
19
|
+
return center + rotate(vector - center, rotation);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Rotates a vector around an axis using Rodrigues' formula
|
|
23
|
+
vec3 axisAngle(vec3 vector, vec3 axis, float rotation) {
|
|
24
|
+
float c = cos(rotation);
|
|
25
|
+
float s = sin(rotation);
|
|
26
|
+
return vector*c + cross(axis, vector)*s + axis*dot(axis, vector)*(1.0 - c);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
vec3 axisAngle(vec3 vector, vec3 origin, vec3 axis, float rotation) {
|
|
30
|
+
return axisAngle(vector - origin, axis, rotation) + origin;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
mat3 axisAngleMatrix(vec3 axis, float rotation) {
|
|
34
|
+
mat3 K = mat3(
|
|
35
|
+
0, axis.z, -axis.y,
|
|
36
|
+
-axis.z, 0, axis.x,
|
|
37
|
+
axis.y, -axis.x, 0
|
|
38
|
+
);
|
|
39
|
+
return mat3(1.0) + sin(rotation)*K + (1.0 - cos(rotation))*K*K;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Assumes first point has already been subtracted
|
|
43
|
+
vec3 barycentric(vec2 p, vec2 b, vec2 c) {
|
|
44
|
+
float dbb = dot(b, b);
|
|
45
|
+
float dbc = dot(b, c);
|
|
46
|
+
float dcc = dot(c, c);
|
|
47
|
+
float dcp = dot(c, p);
|
|
48
|
+
float dbp = dot(b, p);
|
|
49
|
+
|
|
50
|
+
float denom = dbb * dcc - dbc * dbc;
|
|
51
|
+
float v = (dcc * dbp - dbc * dcp) / denom;
|
|
52
|
+
float w = (dbb * dcp - dbc * dbp) / denom;
|
|
53
|
+
return vec3(1.0 - v - w, v, w);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
vec3 barycentric(vec2 p, vec2 a, vec2 b, vec2 c) {
|
|
57
|
+
return barycentric(p - a, b - a, c - a);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Assumes first point has already been subtracted
|
|
61
|
+
vec3 barycentric(vec3 p, vec3 b, vec3 c) {
|
|
62
|
+
float dbb = dot(b, b);
|
|
63
|
+
float dbc = dot(b, c);
|
|
64
|
+
float dcc = dot(c, c);
|
|
65
|
+
float dcp = dot(c, p);
|
|
66
|
+
float dbp = dot(b, p);
|
|
67
|
+
|
|
68
|
+
float denom = dbb * dcc - dbc * dbc;
|
|
69
|
+
float v = (dcc * dbp - dbc * dcp) / denom;
|
|
70
|
+
float w = (dbb * dcp - dbc * dbp) / denom;
|
|
71
|
+
return vec3(1.0 - v - w, v, w);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
vec3 barycentric(vec3 p, vec3 a, vec3 b, vec3 c) {
|
|
75
|
+
return barycentric(p - a, b - a, c - a);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
float distanceToSegment(vec3 p, vec3 a, vec3 b) {
|
|
79
|
+
vec3 ab = b - a;
|
|
80
|
+
vec3 ap = p - a;
|
|
81
|
+
|
|
82
|
+
float t = clamp(dot(ap, ab) / dot(ab, ab), 0.0, 1.0);
|
|
83
|
+
|
|
84
|
+
vec3 projection = a + t * ab;
|
|
85
|
+
return length(p - projection);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
mat2x3 create2DBasisVectors(vec3 normal) {
|
|
89
|
+
vec3 i = normalize(cross(normal, abs(normal.z) > 0.999 ? vec3(1, 0, 0) : vec3(0, 0, 1)));
|
|
90
|
+
vec3 j = cross(normal, i);
|
|
91
|
+
|
|
92
|
+
return mat2x3(i, j);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
mat2x3 create2DBasisVectors(vec3 normal, float rotation) {
|
|
96
|
+
mat3 rotationMatrix = axisAngleMatrix(normal, rotation);
|
|
97
|
+
mat2x3 basis = create2DBasisVectors(normal);
|
|
98
|
+
return rotationMatrix*basis;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
vec3 transformToZAxis(vec3 pos, vec3 center, vec3 direction, float orientation) {
|
|
102
|
+
vec3 r = normalize(direction); // Normal of transformed plane
|
|
103
|
+
bool isZ = length(r.xy) < 1e-9;
|
|
104
|
+
float angle = isZ ? 0.0 : atan(r.y, r.x);
|
|
105
|
+
vec3 i = isZ ? vec3(1, 0, 0) : normalize(vec3(r.y, -r.x, 0)); // Direction of x-axis transformed plane
|
|
106
|
+
vec3 j = cross(i, r); // Direction of y-axis along transformed plane
|
|
107
|
+
return axisAngle((pos - center)*mat3(i, j, r), vec3(0, 0, 1), angle + orientation);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
110
|
`;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
export const mathDefinition = /*glsl*/ `
|
|
2
|
-
|
|
3
|
-
export { binom }
|
|
4
|
-
|
|
5
|
-
// Computes the binomial coefficient ("n choose k")
|
|
6
|
-
int binom(int n, int k) {
|
|
7
|
-
float nf = float(n);
|
|
8
|
-
float kf = float(min(k, n - k));
|
|
9
|
-
float result = 1.0;
|
|
10
|
-
|
|
11
|
-
for (float i = 0; i < kf; i++) {
|
|
12
|
-
result *= (nf - i)/(i + 1);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return int(result);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
export const mathDefinition = /*glsl*/ `
|
|
2
|
+
|
|
3
|
+
export { binom }
|
|
4
|
+
|
|
5
|
+
// Computes the binomial coefficient ("n choose k")
|
|
6
|
+
int binom(int n, int k) {
|
|
7
|
+
float nf = float(n);
|
|
8
|
+
float kf = float(min(k, n - k));
|
|
9
|
+
float result = 1.0;
|
|
10
|
+
|
|
11
|
+
for (float i = 0; i < kf; i++) {
|
|
12
|
+
result *= (nf - i)/(i + 1);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return int(result);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
19
|
`;
|
|
@@ -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 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, 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";
|