@matboks/utilities 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants 2.js +1 -0
- package/dist/constants 3.js +1 -0
- package/dist/constants.d 2.ts +1 -0
- package/dist/constants.d 3.ts +1 -0
- package/dist/index 2.js +11 -0
- package/dist/index 3.js +11 -0
- package/dist/index.d 2.ts +11 -0
- package/dist/index.d 3.ts +11 -0
- package/dist/shader-modules/modules/camera.js +42 -42
- package/dist/shader-modules/modules/color/blend.js +107 -107
- package/dist/shader-modules/modules/color/index.js +134 -134
- package/dist/shader-modules/modules/constants.js +13 -13
- package/dist/shader-modules/modules/geometry.js +109 -109
- package/dist/shader-modules/modules/math.js +18 -18
- package/dist/shader-modules/modules/noise.d.ts +1 -1
- package/dist/shader-modules/modules/noise.js +449 -409
- package/dist/shader-modules/modules/random.d.ts +1 -1
- package/dist/shader-modules/modules/random.js +172 -146
- package/dist/shader-modules/modules/ray-marching.js +53 -53
- package/dist/shader-modules/modules/sdf/index.js +182 -182
- package/dist/shader-modules/modules/sdf/operations.js +76 -76
- package/dist/shader-modules/modules/sdf.d.ts +1 -0
- package/dist/shader-modules/modules/sdf.js +126 -0
- package/dist/shader-modules/modules/utils.js +114 -114
- package/dist/shader-modules/shaders.js +107 -107
- package/dist/shader-renderer/pixel-vertex-shader.js +13 -13
- package/dist/tilings/tiler.d.ts +1 -0
- package/dist/tilings/tiler.js +4 -0
- package/dist/types 2.js +1 -0
- package/dist/types 3.js +1 -0
- package/dist/types.d 2.ts +1 -0
- package/dist/types.d 3.ts +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const randomDefinition = "\nimport { TWO_PI, PI } from \"@/constants\";\n\nexport { \n random, random2, random3,\n randomGauss,\n randomUnit\n };\n\nuint hash(uint value) {\n value
|
|
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,147 +1,173 @@
|
|
|
1
|
-
export const randomDefinition = /*glsl*/ `
|
|
2
|
-
import { TWO_PI, PI } from "@/constants";
|
|
3
|
-
|
|
4
|
-
export {
|
|
5
|
-
random, random2, random3,
|
|
6
|
-
randomGauss,
|
|
7
|
-
randomUnit
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
uint hash(uint value) {
|
|
11
|
-
value
|
|
12
|
-
value
|
|
13
|
-
value
|
|
14
|
-
value
|
|
15
|
-
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
uint hash(uvec2 v) {
|
|
20
|
-
return hash(v.x ^ hash(v.y));
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
uint hash(uvec3 v) {
|
|
24
|
-
return hash(v.x ^ hash(v.y ^ hash(v.z)));
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
uint hash(uvec4 v) {
|
|
28
|
-
return hash(v.x ^ hash(v.y ^ hash(v.z ^ hash(v.w))));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
uint hash(uvec4 v, uint u) {
|
|
32
|
-
return hash(v.x ^ hash(v.y ^ hash(v.z ^ hash(v.w ^ hash(u)))));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
float hashToFloat(uint u) {
|
|
36
|
-
uint mant = 8388607u;
|
|
37
|
-
uint one = 1065353216u;
|
|
38
|
-
|
|
39
|
-
u &= mant;
|
|
40
|
-
u |= one;
|
|
41
|
-
|
|
42
|
-
float f = uintBitsToFloat(u);
|
|
43
|
-
return f - 1.0;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
float random(float p) {
|
|
47
|
-
return hashToFloat(hash(floatBitsToUint(p)));
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
float random(vec2 p) {
|
|
51
|
-
return hashToFloat(hash(floatBitsToUint(p)));
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
float random(vec3 p) {
|
|
55
|
-
return hashToFloat(hash(floatBitsToUint(p)));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
float random(vec4 p) {
|
|
59
|
-
return hashToFloat(hash(floatBitsToUint(p)));
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
float random(float p, float seed) {
|
|
63
|
-
return random(vec2(p, seed));
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
float random(vec2 p, float seed) {
|
|
67
|
-
return random(vec3(p, seed));
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
float random(vec3 p, float seed) {
|
|
71
|
-
return random(vec4(p, seed));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
float random(vec4 p, float seed) {
|
|
75
|
-
return hashToFloat(hash(floatBitsToUint(p), floatBitsToUint(seed)));
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
vec2 random2(float p, float seed) {
|
|
79
|
-
return vec2(random(vec3(p, seed, 0), random(vec3(p, seed, 1))));
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
vec2 random2(float p) {
|
|
83
|
-
return random2(p, 0.);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
vec2 random2(vec2 p, float seed) {
|
|
87
|
-
return vec2(random(vec4(p, seed, 0)), random(vec4(p, seed, 1)));
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
vec2 random2(vec2 p) {
|
|
91
|
-
return random2(p, 0.0);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
vec2 random2(vec3 p, float seed) {
|
|
95
|
-
return vec2(random(vec4(p, seed), 0.), random(vec4(p, seed), 1.));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
vec2 random2(vec3 p) {
|
|
99
|
-
return random2(p, 0.0);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
vec3 random3(float p, float seed) {
|
|
103
|
-
return vec3(
|
|
104
|
-
random(vec3(p, seed, 0)),
|
|
105
|
-
random(vec3(p, seed, 1)),
|
|
106
|
-
random(vec3(p, seed, 2))
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
vec3 random3(float p) {
|
|
111
|
-
return random3(p, 0.0);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
vec3 random3(vec2 p, float seed) {
|
|
115
|
-
return vec3(random(vec4(p, seed, 0)), random(vec4(p, seed, 1)), random(vec4(p, seed, 2)));
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
vec3 random3(vec2 p) {
|
|
119
|
-
return random3(p, 0.0);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
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));
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
));
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
1
|
+
export const randomDefinition = /*glsl*/ `
|
|
2
|
+
import { TWO_PI, PI } from "@/constants";
|
|
3
|
+
|
|
4
|
+
export {
|
|
5
|
+
random, random2, random3, random4,
|
|
6
|
+
randomGauss,
|
|
7
|
+
randomUnit
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
uint hash(uint value) {
|
|
11
|
+
value += 2127912214u;
|
|
12
|
+
value ^= value >> 12;
|
|
13
|
+
value *= 3345072700u;
|
|
14
|
+
value ^= value >> 19;
|
|
15
|
+
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
uint hash(uvec2 v) {
|
|
20
|
+
return hash(v.x ^ hash(v.y));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
uint hash(uvec3 v) {
|
|
24
|
+
return hash(v.x ^ hash(v.y ^ hash(v.z)));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
uint hash(uvec4 v) {
|
|
28
|
+
return hash(v.x ^ hash(v.y ^ hash(v.z ^ hash(v.w))));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
uint hash(uvec4 v, uint u) {
|
|
32
|
+
return hash(v.x ^ hash(v.y ^ hash(v.z ^ hash(v.w ^ hash(u)))));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
float hashToFloat(uint u) {
|
|
36
|
+
uint mant = 8388607u;
|
|
37
|
+
uint one = 1065353216u;
|
|
38
|
+
|
|
39
|
+
u &= mant;
|
|
40
|
+
u |= one;
|
|
41
|
+
|
|
42
|
+
float f = uintBitsToFloat(u);
|
|
43
|
+
return f - 1.0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
float random(float p) {
|
|
47
|
+
return hashToFloat(hash(floatBitsToUint(p)));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
float random(vec2 p) {
|
|
51
|
+
return hashToFloat(hash(floatBitsToUint(p)));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
float random(vec3 p) {
|
|
55
|
+
return hashToFloat(hash(floatBitsToUint(p)));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
float random(vec4 p) {
|
|
59
|
+
return hashToFloat(hash(floatBitsToUint(p)));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
float random(float p, float seed) {
|
|
63
|
+
return random(vec2(p, seed));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
float random(vec2 p, float seed) {
|
|
67
|
+
return random(vec3(p, seed));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
float random(vec3 p, float seed) {
|
|
71
|
+
return random(vec4(p, seed));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
float random(vec4 p, float seed) {
|
|
75
|
+
return hashToFloat(hash(floatBitsToUint(p), floatBitsToUint(seed)));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
vec2 random2(float p, float seed) {
|
|
79
|
+
return vec2(random(vec3(p, seed, 0), random(vec3(p, seed, 1))));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
vec2 random2(float p) {
|
|
83
|
+
return random2(p, 0.);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
vec2 random2(vec2 p, float seed) {
|
|
87
|
+
return vec2(random(vec4(p, seed, 0)), random(vec4(p, seed, 1)));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
vec2 random2(vec2 p) {
|
|
91
|
+
return random2(p, 0.0);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
vec2 random2(vec3 p, float seed) {
|
|
95
|
+
return vec2(random(vec4(p, seed), 0.), random(vec4(p, seed), 1.));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
vec2 random2(vec3 p) {
|
|
99
|
+
return random2(p, 0.0);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
vec3 random3(float p, float seed) {
|
|
103
|
+
return vec3(
|
|
104
|
+
random(vec3(p, seed, 0)),
|
|
105
|
+
random(vec3(p, seed, 1)),
|
|
106
|
+
random(vec3(p, seed, 2))
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
vec3 random3(float p) {
|
|
111
|
+
return random3(p, 0.0);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
vec3 random3(vec2 p, float seed) {
|
|
115
|
+
return vec3(random(vec4(p, seed, 0)), random(vec4(p, seed, 1)), random(vec4(p, seed, 2)));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
vec3 random3(vec2 p) {
|
|
119
|
+
return random3(p, 0.0);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
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));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
vec4 random4(vec4 p, float seed) {
|
|
127
|
+
return vec4(
|
|
128
|
+
random(p, seed),
|
|
129
|
+
random(p, random(seed, 1.0)),
|
|
130
|
+
random(p, random(seed, 2.0)),
|
|
131
|
+
random(p, random(seed, 3.0))
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
vec4 random4(vec4 p, float seed) {
|
|
136
|
+
return random4(p, 0.0);
|
|
137
|
+
}
|
|
138
|
+
|
|
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
|
+
vec2 randomUnit(vec2 p, float seed) {
|
|
152
|
+
float direction = TWO_PI*random(p, seed);
|
|
153
|
+
return vec2(cos(direction), sin(direction));
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
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
|
+
));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
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
|
+
));
|
|
171
|
+
}
|
|
172
|
+
|
|
147
173
|
`;
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
export const rayMarchingDefinition = /*glsl*/ `
|
|
2
|
-
|
|
3
|
-
export {
|
|
4
|
-
rayMarch,
|
|
5
|
-
Ray, RayMarchResult
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
struct Ray {
|
|
9
|
-
vec3 origin;
|
|
10
|
-
vec3 direction;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
struct RayMarchResult {
|
|
14
|
-
vec3 position;
|
|
15
|
-
vec3 partialPosition;
|
|
16
|
-
float minimumDistance;
|
|
17
|
-
bool hit;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
RayMarchResult rayMarch(Ray ray, float minThreshold, float maxThreshold, int partialIterations, float maxIterations, float sdf(vec3)) {
|
|
21
|
-
vec3 position;
|
|
22
|
-
float t = 0.0;
|
|
23
|
-
|
|
24
|
-
vec3 origin = ray.origin;
|
|
25
|
-
vec3 direction = ray.direction;
|
|
26
|
-
|
|
27
|
-
vec3 partialPosition;
|
|
28
|
-
float minimumDistance = 1e20;
|
|
29
|
-
bool hit = false;
|
|
30
|
-
|
|
31
|
-
int n = int(maxIterations) + 1;
|
|
32
|
-
for (int i = 0; i <= n; i++) {
|
|
33
|
-
position = origin + direction*t;
|
|
34
|
-
float d = sdf(position);
|
|
35
|
-
|
|
36
|
-
if (i == partialIterations) partialPosition = position;
|
|
37
|
-
|
|
38
|
-
t += d*min(1.0, maxIterations - float(i));
|
|
39
|
-
minimumDistance = min(minimumDistance, d);
|
|
40
|
-
|
|
41
|
-
if (abs(d) < minThreshold) {
|
|
42
|
-
hit = true;
|
|
43
|
-
break;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (d > maxThreshold) {
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return RayMarchResult(position, partialPosition, minimumDistance, hit);
|
|
52
|
-
}
|
|
53
|
-
|
|
1
|
+
export const rayMarchingDefinition = /*glsl*/ `
|
|
2
|
+
|
|
3
|
+
export {
|
|
4
|
+
rayMarch,
|
|
5
|
+
Ray, RayMarchResult
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
struct Ray {
|
|
9
|
+
vec3 origin;
|
|
10
|
+
vec3 direction;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
struct RayMarchResult {
|
|
14
|
+
vec3 position;
|
|
15
|
+
vec3 partialPosition;
|
|
16
|
+
float minimumDistance;
|
|
17
|
+
bool hit;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
RayMarchResult rayMarch(Ray ray, float minThreshold, float maxThreshold, int partialIterations, float maxIterations, float sdf(vec3)) {
|
|
21
|
+
vec3 position;
|
|
22
|
+
float t = 0.0;
|
|
23
|
+
|
|
24
|
+
vec3 origin = ray.origin;
|
|
25
|
+
vec3 direction = ray.direction;
|
|
26
|
+
|
|
27
|
+
vec3 partialPosition;
|
|
28
|
+
float minimumDistance = 1e20;
|
|
29
|
+
bool hit = false;
|
|
30
|
+
|
|
31
|
+
int n = int(maxIterations) + 1;
|
|
32
|
+
for (int i = 0; i <= n; i++) {
|
|
33
|
+
position = origin + direction*t;
|
|
34
|
+
float d = sdf(position);
|
|
35
|
+
|
|
36
|
+
if (i == partialIterations) partialPosition = position;
|
|
37
|
+
|
|
38
|
+
t += d*min(1.0, maxIterations - float(i));
|
|
39
|
+
minimumDistance = min(minimumDistance, d);
|
|
40
|
+
|
|
41
|
+
if (abs(d) < minThreshold) {
|
|
42
|
+
hit = true;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (d > maxThreshold) {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return RayMarchResult(position, partialPosition, minimumDistance, hit);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
54
|
`;
|