@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.
@@ -1 +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";
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 = 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;
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 signed = mix(random(pi, seed)*pf, random(pi + 1.0, seed)*(pf - 1.0), sf);
113
+ float value = mix(signed(random(pi, seed))*pf, signed(random(pi + 1.0, seed))*(pf - 1.0), sf);
113
114
 
114
- // Signed is in range [-1/2, 1/2], map to [0, 1]
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 signed = mix(
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
- // Signed is in range [-sqrt(2)/2, sqrt(2)/2], map to [0, 1]
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 signed = mix(
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
- // Signed is in range [-sqrt(3/4), sqrt(3/4)], map to [0, 1]
161
- return 0.5 + 0.57735026918962576*signed;
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(pi + fi, seed) - pf;
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(pi + index, seed) - pf;
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(pi + index, seed) - pf;
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(pi + index, seed);
309
+ vec3 data = random3(index, seed);
249
310
 
250
- vec2 centerToPosition = index + data.xy*disorder - pf;
311
+ vec2 centerToPosition = index + data.xy*disorder - p;
251
312
 
252
- float dist2 = dot2(centerToPosition);
313
+ float dist = length(centerToPosition);
253
314
 
254
- float weight = pow(smoothstep(1.0, 0.0, sqrt(0.5*dist2)), power );
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 randomGauss,\n randomUnit\n };\n\nuint hash(uint value) {\n value += 2127912214u;\n value ^= value >> 12;\n value *= 3345072700u;\n value ^= value >> 19;\n\n return value;\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(random(vec3(p, seed, 0), random(vec3(p, seed, 1))));\n}\n\nvec2 random2(float p) {\n return random2(p, 0.);\n}\n\nvec2 random2(vec2 p, float seed) {\n return vec2(random(vec4(p, seed, 0)), random(vec4(p, seed, 1)));\n}\n\nvec2 random2(vec2 p) {\n return random2(p, 0.0);\n}\n\nvec2 random2(vec3 p, float seed) {\n return vec2(random(vec4(p, seed), 0.), random(vec4(p, seed), 1.));\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(vec3(p, seed, 0)), \n random(vec3(p, seed, 1)), \n random(vec3(p, seed, 2))\n );\n}\n\nvec3 random3(float p) {\n return random3(p, 0.0);\n}\n\nvec3 random3(vec2 p, float seed) {\n return vec3(random(vec4(p, seed, 0)), random(vec4(p, seed, 1)), random(vec4(p, seed, 2)));\n}\n\nvec3 random3(vec2 p) {\n return random3(p, 0.0);\n}\n\nvec3 random3(vec3 p, float seed) {\n return vec3(random(vec4(p, seed), 0.0), random(vec4(p, seed), 1.0), random(vec4(p, seed), 2.0));\n}\n\nvec4 random4(vec4 p, float seed) {\n return vec4(\n random(p, seed),\n random(p, random(seed, 1.0)),\n random(p, random(seed, 2.0)),\n random(p, random(seed, 3.0))\n );\n}\n\nvec4 random4(vec4 p, float seed) {\n return random4(p, 0.0);\n}\n\nfloat randomGaussian(vec3 p, float seed) {\n float u1 = random(vec4(p, 1), seed);\n float u2 = random(vec4(p, 2), seed);\n return sqrt(-2.0 * log(u1)) * cos(TWO_PI * u2);\n}\n\nfloat randomGaussian(vec4 p, float seed) {\n float u1 = random(p, seed);\n float u2 = random(p, random(seed));\n return sqrt(-2.0 * log(u1)) * cos(TWO_PI * u2);\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 return normalize(vec3(\n randomGaussian(p, seed),\n randomGaussian(p, random(seed, 1.)),\n randomGaussian(p, random(seed, 2.))\n ));\n}\n\nvec4 randomUnit(vec4 p, float seed) {\n return normalize(vec4(\n randomGaussian(p, seed),\n randomGaussian(p, random(seed, 1.)),\n randomGaussian(p, random(seed, 2.)),\n randomGaussian(p, random(seed, 3.))\n ));\n}\n\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
- uint hash(uint value) {
11
- value += 2127912214u;
12
- value ^= value >> 12;
13
- value *= 3345072700u;
14
- value ^= value >> 19;
9
+ const float SEED_OFFSET = 2123.1415926535897932384626433832795;
15
10
 
16
- return value;
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(random(vec3(p, seed, 0), random(vec3(p, seed, 1))));
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(random(vec4(p, seed, 0)), random(vec4(p, seed, 1)));
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(random(vec4(p, seed), 0.), random(vec4(p, seed), 1.));
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(vec3(p, seed, 0)),
105
- random(vec3(p, seed, 1)),
106
- random(vec3(p, seed, 2))
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(random(vec4(p, seed, 0)), random(vec4(p, seed, 1)), random(vec4(p, seed, 2)));
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(random(vec4(p, seed), 0.0), random(vec4(p, seed), 1.0), random(vec4(p, seed), 2.0));
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, random(seed, 1.0)),
130
- random(p, random(seed, 2.0)),
131
- random(p, random(seed, 3.0))
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, float seed) {
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
- return normalize(vec3(
158
- randomGaussian(p, seed),
159
- randomGaussian(p, random(seed, 1.)),
160
- randomGaussian(p, random(seed, 2.))
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
- return normalize(vec4(
166
- randomGaussian(p, seed),
167
- randomGaussian(p, random(seed, 1.)),
168
- randomGaussian(p, random(seed, 2.)),
169
- randomGaussian(p, random(seed, 3.))
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matboks/utilities",
3
- "version": "0.0.2",
3
+ "version": "0.0.18",
4
4
  "main": "./dist/index.js",
5
5
  "files": [
6
6
  "dist"
@@ -1 +0,0 @@
1
- export const EPS = 1e-9;
@@ -1 +0,0 @@
1
- export const EPS = 1e-9;
@@ -1 +0,0 @@
1
- export declare const EPS = 1e-9;
@@ -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";
@@ -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";
@@ -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
- `;
@@ -1 +0,0 @@
1
- export {};
@@ -1,4 +0,0 @@
1
- // abstract class Tiler {
2
- export {};
3
- // abstract tileSingleShape(shape: )
4
- // }
package/dist/types 2.js DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/types 3.js DELETED
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- export {};