@matboks/utilities 0.0.1

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.
Files changed (177) hide show
  1. package/dist/constants.d.ts +1 -0
  2. package/dist/constants.js +1 -0
  3. package/dist/geometry/aabb.d.ts +40 -0
  4. package/dist/geometry/aabb.js +143 -0
  5. package/dist/geometry/cut-polygon.d.ts +7 -0
  6. package/dist/geometry/cut-polygon.js +116 -0
  7. package/dist/geometry/hollowgon.d.ts +24 -0
  8. package/dist/geometry/hollowgon.js +156 -0
  9. package/dist/geometry/index.d.ts +13 -0
  10. package/dist/geometry/index.js +14 -0
  11. package/dist/geometry/line.d.ts +10 -0
  12. package/dist/geometry/line.js +26 -0
  13. package/dist/geometry/polygon-operations.d.ts +31 -0
  14. package/dist/geometry/polygon-operations.js +159 -0
  15. package/dist/geometry/polygon.d.ts +55 -0
  16. package/dist/geometry/polygon.js +353 -0
  17. package/dist/geometry/polyline.d.ts +23 -0
  18. package/dist/geometry/polyline.js +100 -0
  19. package/dist/geometry/ray.d.ts +6 -0
  20. package/dist/geometry/ray.js +6 -0
  21. package/dist/geometry/ray3.d.ts +7 -0
  22. package/dist/geometry/ray3.js +10 -0
  23. package/dist/geometry/segment.d.ts +16 -0
  24. package/dist/geometry/segment.js +50 -0
  25. package/dist/geometry/shared.d.ts +5 -0
  26. package/dist/geometry/shared.js +60 -0
  27. package/dist/geometry/transformations.d.ts +7 -0
  28. package/dist/geometry/transformations.js +28 -0
  29. package/dist/geometry/vec2.d.ts +71 -0
  30. package/dist/geometry/vec2.js +225 -0
  31. package/dist/geometry/vec3.d.ts +102 -0
  32. package/dist/geometry/vec3.js +256 -0
  33. package/dist/geometry/vec4.d.ts +71 -0
  34. package/dist/geometry/vec4.js +238 -0
  35. package/dist/index.d.ts +11 -0
  36. package/dist/index.js +11 -0
  37. package/dist/math/clamp.d.ts +1 -0
  38. package/dist/math/clamp.js +5 -0
  39. package/dist/math/fract.d.ts +1 -0
  40. package/dist/math/fract.js +3 -0
  41. package/dist/math/index.d.ts +8 -0
  42. package/dist/math/index.js +8 -0
  43. package/dist/math/mix.d.ts +1 -0
  44. package/dist/math/mix.js +3 -0
  45. package/dist/math/mod.d.ts +1 -0
  46. package/dist/math/mod.js +5 -0
  47. package/dist/math/signed.d.ts +1 -0
  48. package/dist/math/signed.js +3 -0
  49. package/dist/math/smoothstep.d.ts +3 -0
  50. package/dist/math/smoothstep.js +24 -0
  51. package/dist/math/split-into-int-and-fract.d.ts +1 -0
  52. package/dist/math/split-into-int-and-fract.js +5 -0
  53. package/dist/math/units.d.ts +2 -0
  54. package/dist/math/units.js +6 -0
  55. package/dist/noise/idw.d.ts +11 -0
  56. package/dist/noise/idw.js +10 -0
  57. package/dist/noise/index.d.ts +6 -0
  58. package/dist/noise/index.js +6 -0
  59. package/dist/noise/perlin.d.ts +5 -0
  60. package/dist/noise/perlin.js +29 -0
  61. package/dist/noise/random.d.ts +13 -0
  62. package/dist/noise/random.js +39 -0
  63. package/dist/noise/value.d.ts +4 -0
  64. package/dist/noise/value.js +20 -0
  65. package/dist/noise/voronoise.d.ts +10 -0
  66. package/dist/noise/voronoise.js +26 -0
  67. package/dist/noise/worley.d.ts +4 -0
  68. package/dist/noise/worley.js +39 -0
  69. package/dist/shader-modules/index.d.ts +2 -0
  70. package/dist/shader-modules/index.js +2 -0
  71. package/dist/shader-modules/library.d.ts +2 -0
  72. package/dist/shader-modules/library.js +36 -0
  73. package/dist/shader-modules/modules/camera.d.ts +1 -0
  74. package/dist/shader-modules/modules/camera.js +43 -0
  75. package/dist/shader-modules/modules/color/blend.d.ts +1 -0
  76. package/dist/shader-modules/modules/color/blend.js +108 -0
  77. package/dist/shader-modules/modules/color/index.d.ts +1 -0
  78. package/dist/shader-modules/modules/color/index.js +135 -0
  79. package/dist/shader-modules/modules/constants.d.ts +1 -0
  80. package/dist/shader-modules/modules/constants.js +14 -0
  81. package/dist/shader-modules/modules/geometry.d.ts +1 -0
  82. package/dist/shader-modules/modules/geometry.js +110 -0
  83. package/dist/shader-modules/modules/math.d.ts +1 -0
  84. package/dist/shader-modules/modules/math.js +19 -0
  85. package/dist/shader-modules/modules/noise.d.ts +1 -0
  86. package/dist/shader-modules/modules/noise.js +410 -0
  87. package/dist/shader-modules/modules/random.d.ts +1 -0
  88. package/dist/shader-modules/modules/random.js +147 -0
  89. package/dist/shader-modules/modules/ray-marching.d.ts +1 -0
  90. package/dist/shader-modules/modules/ray-marching.js +54 -0
  91. package/dist/shader-modules/modules/sdf/index.d.ts +1 -0
  92. package/dist/shader-modules/modules/sdf/index.js +183 -0
  93. package/dist/shader-modules/modules/sdf/operations.d.ts +1 -0
  94. package/dist/shader-modules/modules/sdf/operations.js +77 -0
  95. package/dist/shader-modules/modules/utils.d.ts +1 -0
  96. package/dist/shader-modules/modules/utils.js +115 -0
  97. package/dist/shader-modules/registry.d.ts +2 -0
  98. package/dist/shader-modules/registry.js +7 -0
  99. package/dist/shader-modules/shaders.d.ts +1 -0
  100. package/dist/shader-modules/shaders.js +109 -0
  101. package/dist/shader-renderer/helpers.d.ts +10 -0
  102. package/dist/shader-renderer/helpers.js +19 -0
  103. package/dist/shader-renderer/index.d.ts +2 -0
  104. package/dist/shader-renderer/index.js +2 -0
  105. package/dist/shader-renderer/pixel-shader.d.ts +32 -0
  106. package/dist/shader-renderer/pixel-shader.js +172 -0
  107. package/dist/shader-renderer/pixel-vertex-shader.d.ts +1 -0
  108. package/dist/shader-renderer/pixel-vertex-shader.js +14 -0
  109. package/dist/shader-renderer/texture.d.ts +28 -0
  110. package/dist/shader-renderer/texture.js +97 -0
  111. package/dist/shader-renderer/types.d.ts +17 -0
  112. package/dist/shader-renderer/types.js +4 -0
  113. package/dist/shader-renderer/uniform.d.ts +16 -0
  114. package/dist/shader-renderer/uniform.js +134 -0
  115. package/dist/tilings/delaunay.d.ts +11 -0
  116. package/dist/tilings/delaunay.js +28 -0
  117. package/dist/tilings/grid.d.ts +5 -0
  118. package/dist/tilings/grid.js +29 -0
  119. package/dist/tilings/hexagononal.d.ts +4 -0
  120. package/dist/tilings/hexagononal.js +40 -0
  121. package/dist/tilings/index.d.ts +12 -0
  122. package/dist/tilings/index.js +12 -0
  123. package/dist/tilings/line.d.ts +5 -0
  124. package/dist/tilings/line.js +19 -0
  125. package/dist/tilings/mediterranean.d.ts +3 -0
  126. package/dist/tilings/mediterranean.js +49 -0
  127. package/dist/tilings/pythagorean.d.ts +3 -0
  128. package/dist/tilings/pythagorean.js +40 -0
  129. package/dist/tilings/random-cuts.d.ts +6 -0
  130. package/dist/tilings/random-cuts.js +16 -0
  131. package/dist/tilings/recursive-cuts.d.ts +5 -0
  132. package/dist/tilings/recursive-cuts.js +11 -0
  133. package/dist/tilings/rhombille.d.ts +3 -0
  134. package/dist/tilings/rhombille.js +16 -0
  135. package/dist/tilings/rightangled-triangle.d.ts +3 -0
  136. package/dist/tilings/rightangled-triangle.js +29 -0
  137. package/dist/tilings/triangle.d.ts +3 -0
  138. package/dist/tilings/triangle.js +17 -0
  139. package/dist/tilings/voronoi.d.ts +11 -0
  140. package/dist/tilings/voronoi.js +29 -0
  141. package/dist/tilings/weaving.d.ts +1 -0
  142. package/dist/tilings/weaving.js +8 -0
  143. package/dist/transforms/camera/camera.d.ts +32 -0
  144. package/dist/transforms/camera/camera.js +60 -0
  145. package/dist/transforms/camera/index.d.ts +3 -0
  146. package/dist/transforms/camera/index.js +3 -0
  147. package/dist/transforms/camera/orthographic.d.ts +15 -0
  148. package/dist/transforms/camera/orthographic.js +31 -0
  149. package/dist/transforms/camera/perspective.d.ts +16 -0
  150. package/dist/transforms/camera/perspective.js +40 -0
  151. package/dist/transforms/index.d.ts +2 -0
  152. package/dist/transforms/index.js +2 -0
  153. package/dist/transforms/normalize-transform.d.ts +12 -0
  154. package/dist/transforms/normalize-transform.js +20 -0
  155. package/dist/types.d.ts +1 -0
  156. package/dist/types.js +1 -0
  157. package/dist/utilities/create-frame.d.ts +2 -0
  158. package/dist/utilities/create-frame.js +6 -0
  159. package/dist/utilities/ensure-array.d.ts +1 -0
  160. package/dist/utilities/ensure-array.js +3 -0
  161. package/dist/utilities/idw-interpolator.d.ts +9 -0
  162. package/dist/utilities/idw-interpolator.js +18 -0
  163. package/dist/utilities/index.d.ts +8 -0
  164. package/dist/utilities/index.js +8 -0
  165. package/dist/utilities/marching-squares.d.ts +51 -0
  166. package/dist/utilities/marching-squares.js +177 -0
  167. package/dist/utilities/point-sampler.d.ts +12 -0
  168. package/dist/utilities/point-sampler.js +24 -0
  169. package/dist/utilities/poisson/grid.d.ts +21 -0
  170. package/dist/utilities/poisson/grid.js +51 -0
  171. package/dist/utilities/poisson/poissonnier.d.ts +50 -0
  172. package/dist/utilities/poisson/poissonnier.js +118 -0
  173. package/dist/utilities/resolution.d.ts +10 -0
  174. package/dist/utilities/resolution.js +14 -0
  175. package/dist/utilities/rng.d.ts +13 -0
  176. package/dist/utilities/rng.js +80 -0
  177. package/package.json +28 -0
@@ -0,0 +1,135 @@
1
+ export const colorDefinition = /*glsl*/ `
2
+
3
+ export {
4
+ hslToRgb, rgbToHsl, shiftRgbInHsl,
5
+ hsvToRgb, rgbToHsv
6
+ }
7
+
8
+ vec3 hslToRgb(vec3 hsl) {
9
+ float h = mod(hsl.r, 360.0);
10
+ float s = clamp(hsl.g, 0.0, 1.0);
11
+ float l = clamp(hsl.b, 0.0, 1.0);
12
+
13
+ float c = s*(1.0 - abs(2.0*l - 1.0));
14
+ float x = c*(1.0 - abs(mod(h / 60.0, 2.0) - 1.0));
15
+ float m = l - c / 2.0;
16
+
17
+ float r = 0.0;
18
+ float g = 0.0;
19
+ float b = 0.0;
20
+
21
+ if (h < 60.0) {
22
+ r = c;
23
+ g = x;
24
+ } else if (h < 120.0) {
25
+ r = x;
26
+ g = c;
27
+ } else if (h < 180.0) {
28
+ g = c;
29
+ b = x;
30
+ } else if (h < 240.0) {
31
+ g = x;
32
+ b = c;
33
+ } else if (h < 300.0) {
34
+ r = x;
35
+ b = c;
36
+ } else {
37
+ r = c;
38
+ b = x;
39
+ }
40
+ return vec3(r, g, b) + m;
41
+ }
42
+
43
+ vec3 hslToRgb(float h, float s, float l) {
44
+ return hslToRgb(vec3(h, s, l));
45
+ }
46
+
47
+ vec3 rgbToHsl(vec3 rgb) {
48
+ float r = rgb.r;
49
+ float g = rgb.g;
50
+ float b = rgb.b;
51
+
52
+ float cMax = max(r, max(g, b));
53
+ float cMin = min(r, min(g, b));
54
+ float delta = cMax - cMin;
55
+
56
+ float h;
57
+
58
+ if (delta == 0.0) {
59
+ h = 0.0;
60
+ } else if (r == cMax) {
61
+ h = mod((g - b)/delta, 6.0);
62
+ } else if (g == cMax) {
63
+ h = (b - r)/delta + 2.0;
64
+ } else if (b == cMax) {
65
+ h = (r - g)/delta + 4.0;
66
+ }
67
+ h *= 60.0;
68
+ h = mod(h, 360.0);
69
+
70
+ float l = (cMax + cMin)/2.0;
71
+
72
+ float s = 0.0;
73
+ if (delta > 0.0) {
74
+ s = delta/(1.0 - abs(2.0*l - 1.0));
75
+ }
76
+
77
+ return vec3(h, s, l);
78
+ }
79
+
80
+ vec3 rgbToHsl(float r, float g, float b) {
81
+ return rgbToHsl(vec3(r, g, b));
82
+ }
83
+
84
+ vec3 shiftRgbInHsl(vec3 rgb, vec3 shift) {
85
+ if (shift.z > 0.0) {
86
+ rgb = mix(rgb, vec3(1.0), shift.z);
87
+ } else {
88
+ rgb = mix(rgb, vec3(0.0), -shift.z);
89
+ }
90
+
91
+ vec3 hsl = rgbToHsl(rgb);
92
+
93
+ hsl.x += shift.x;
94
+
95
+ float sShift = shift.y;
96
+ if (sShift > 0.0) {
97
+ hsl.y = (1.0 - sShift)*hsl.y + sShift;
98
+ } else {
99
+ hsl.y = (1.0 + sShift)*hsl.y;
100
+ }
101
+
102
+ vec3 res = hslToRgb(hsl);
103
+
104
+ return res;
105
+ }
106
+
107
+ vec3 rgbToHsv(vec3 c)
108
+ {
109
+ vec4 K = vec4(0.0, -1.0/3.0, 2.0/3.0, -1.0);
110
+ vec4 p = mix(vec4(c.bg, K.wz),
111
+ vec4(c.gb, K.xy),
112
+ step(c.b, c.g));
113
+ vec4 q = mix(vec4(p.xyw, c.r),
114
+ vec4(c.r, p.yzx),
115
+ step(p.x, c.r));
116
+
117
+ float d = q.x - min(q.w, q.y);
118
+ float e = 1.0e-10;
119
+
120
+ return vec3(
121
+ abs(q.z + (q.w - q.y) / (6.0 * d + e)),
122
+ d / (q.x + e),
123
+ q.x
124
+ );
125
+ }
126
+
127
+ vec3 hsv2Rgb(vec3 c)
128
+ {
129
+ vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0);
130
+ vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
131
+
132
+ return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
133
+ }
134
+
135
+ `;
@@ -0,0 +1 @@
1
+ export declare const constantsDefinition = "\n\nexport {\n PI, TWO_PI, SQRT_2, INV_SQRT_2, EPS\n}\n\nconst float PI = 3.14159265;\nconst float TWO_PI = 2.*PI;\nconst float SQRT_2 = sqrt(2.0);\nconst float INV_SQRT_2 = 0.5*SQRT_2;\nconst float EPS = 1e-9;\n\n\n";
@@ -0,0 +1,14 @@
1
+ export const constantsDefinition = /*glsl*/ `
2
+
3
+ export {
4
+ PI, TWO_PI, SQRT_2, INV_SQRT_2, EPS
5
+ }
6
+
7
+ const float PI = 3.14159265;
8
+ const float TWO_PI = 2.*PI;
9
+ const float SQRT_2 = sqrt(2.0);
10
+ const float INV_SQRT_2 = 0.5*SQRT_2;
11
+ const float EPS = 1e-9;
12
+
13
+
14
+ `;
@@ -0,0 +1 @@
1
+ export declare const geometryDefinition = "\n\nexport { \n rotate,\n barycentric,\n distanceToSegment,\n axisAngle, axisAngleMatrix,\n create2DBasisVectors,\n transformToZAxis\n}\n\nvec2 rotate(vec2 vector, float rotation) {\n float c = cos(rotation);\n float s = sin(rotation);\n return mat2(c, s, -s, c)*vector;\n}\n\nvec2 rotate(vec2 vector, vec2 center, float rotation) {\n return center + rotate(vector - center, rotation);\n}\n\n// Rotates a vector around an axis using Rodrigues' formula\nvec3 axisAngle(vec3 vector, vec3 axis, float rotation) {\n float c = cos(rotation);\n float s = sin(rotation);\n return vector*c + cross(axis, vector)*s + axis*dot(axis, vector)*(1.0 - c);\n}\n\nvec3 axisAngle(vec3 vector, vec3 origin, vec3 axis, float rotation) {\n return axisAngle(vector - origin, axis, rotation) + origin;\n}\n\nmat3 axisAngleMatrix(vec3 axis, float rotation) {\n mat3 K = mat3(\n 0, axis.z, -axis.y,\n -axis.z, 0, axis.x,\n axis.y, -axis.x, 0\n );\n return mat3(1.0) + sin(rotation)*K + (1.0 - cos(rotation))*K*K;\n}\n\n// Assumes first point has already been subtracted\nvec3 barycentric(vec2 p, vec2 b, vec2 c) {\n float dbb = dot(b, b);\n float dbc = dot(b, c);\n float dcc = dot(c, c);\n float dcp = dot(c, p);\n float dbp = dot(b, p);\n\n float denom = dbb * dcc - dbc * dbc;\n float v = (dcc * dbp - dbc * dcp) / denom;\n float w = (dbb * dcp - dbc * dbp) / denom;\n return vec3(1.0 - v - w, v, w);\n}\n\nvec3 barycentric(vec2 p, vec2 a, vec2 b, vec2 c) {\n return barycentric(p - a, b - a, c - a);\n}\n\n// Assumes first point has already been subtracted\nvec3 barycentric(vec3 p, vec3 b, vec3 c) {\n float dbb = dot(b, b);\n float dbc = dot(b, c);\n float dcc = dot(c, c);\n float dcp = dot(c, p);\n float dbp = dot(b, p);\n\n float denom = dbb * dcc - dbc * dbc;\n float v = (dcc * dbp - dbc * dcp) / denom;\n float w = (dbb * dcp - dbc * dbp) / denom;\n return vec3(1.0 - v - w, v, w);\n}\n\nvec3 barycentric(vec3 p, vec3 a, vec3 b, vec3 c) {\n return barycentric(p - a, b - a, c - a);\n}\n\nfloat distanceToSegment(vec3 p, vec3 a, vec3 b) {\n vec3 ab = b - a;\n vec3 ap = p - a;\n\n float t = clamp(dot(ap, ab) / dot(ab, ab), 0.0, 1.0);\n\n vec3 projection = a + t * ab;\n return length(p - projection);\n}\n\nmat2x3 create2DBasisVectors(vec3 normal) {\n vec3 i = normalize(cross(normal, abs(normal.z) > 0.999 ? vec3(1, 0, 0) : vec3(0, 0, 1)));\n vec3 j = cross(normal, i);\n\n return mat2x3(i, j);\n}\n\nmat2x3 create2DBasisVectors(vec3 normal, float rotation) {\n mat3 rotationMatrix = axisAngleMatrix(normal, rotation);\n mat2x3 basis = create2DBasisVectors(normal);\n return rotationMatrix*basis;\n}\n\nvec3 transformToZAxis(vec3 pos, vec3 center, vec3 direction, float orientation) {\n vec3 r = normalize(direction); // Normal of transformed plane\n bool isZ = length(r.xy) < 1e-9;\n float angle = isZ ? 0.0 : atan(r.y, r.x);\n vec3 i = isZ ? vec3(1, 0, 0) : normalize(vec3(r.y, -r.x, 0)); // Direction of x-axis transformed plane\n vec3 j = cross(i, r); // Direction of y-axis along transformed plane\n return axisAngle((pos - center)*mat3(i, j, r), vec3(0, 0, 1), angle + orientation);\n}\n\n";
@@ -0,0 +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
+
110
+ `;
@@ -0,0 +1 @@
1
+ export declare const mathDefinition = "\n\nexport { binom }\n\n// Computes the binomial coefficient (\"n choose k\")\nint binom(int n, int k) {\n float nf = float(n);\n float kf = float(min(k, n - k));\n float result = 1.0;\n\n for (float i = 0; i < kf; i++) {\n result *= (nf - i)/(i + 1);\n }\n\n return int(result);\n}\n\n\n";
@@ -0,0 +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
+
19
+ `;
@@ -0,0 +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";