56 if (
params.metric ==
"euclidean") {
59 else if (
params.metric ==
"manhattan") {
60 return abs(a.x -
b.x) +
abs(a.y -
b.y);
62 else if (
params.metric ==
"chebychev") {
65 else if (
params.metric ==
"minkowski") {
76 if (
params.metric ==
"euclidean") {
79 else if (
params.metric ==
"manhattan") {
80 return abs(a[0] -
b[0]) +
abs(a[1] -
b[1]) +
abs(a[2] -
b[2]);
82 else if (
params.metric ==
"chebychev") {
85 else if (
params.metric ==
"minkowski") {
97 if (
params.metric ==
"euclidean") {
100 else if (
params.metric ==
"manhattan") {
103 else if (
params.metric ==
"chebychev") {
106 else if (
params.metric ==
"minkowski") {
120 return vector2((
b != 0.0) ? a.x /
b : 0.0, (
b != 0.0) ? a.y /
b : 0.0);
125 return vector4((
b != 0.0) ? a.x /
b : 0.0,
126 (
b != 0.0) ? a.y /
b : 0.0,
127 (
b != 0.0) ? a.z /
b : 0.0,
128 (
b != 0.0) ? a.w /
b : 0.0);
151 return vector4(0.0, 0.0, 0.0, coord);
156 float cellPosition =
floor(coord);
157 float localPosition = coord - cellPosition;
160 float targetOffset = 0.0;
161 float targetPosition = 0.0;
162 for (
int i = -1;
i <= 1;
i++) {
163 float cellOffset =
i;
164 float pointPosition = cellOffset +
167 if (distanceToPoint < minDistance) {
168 targetOffset = cellOffset;
169 minDistance = distanceToPoint;
170 targetPosition = pointPosition;
183 float cellPosition =
floor(coord);
184 float localPosition = coord - cellPosition;
186 float smoothDistance = 0.0;
187 float smoothPosition = 0.0;
190 for (
int i = -2;
i <= 2;
i++) {
191 float cellOffset =
i;
192 float pointPosition = cellOffset +
195 h = h == -1.0 ? 1.0 :
198 0.5 + 0.5 * (smoothDistance - distanceToPoint) /
params.smoothness);
199 float correctionFactor =
params.smoothness * h * (1.0 - h);
200 smoothDistance =
mix(smoothDistance, distanceToPoint, h) - correctionFactor;
201 correctionFactor /= 1.0 + 3.0 *
params.smoothness;
203 smoothColor =
mix(smoothColor, cellColor, h) - correctionFactor;
204 smoothPosition =
mix(smoothPosition, pointPosition, h) - correctionFactor;
209 octave.
Color = smoothColor;
216 float cellPosition =
floor(coord);
217 float localPosition = coord - cellPosition;
221 float offsetF1 = 0.0;
222 float positionF1 = 0.0;
223 float offsetF2 = 0.0;
224 float positionF2 = 0.0;
225 for (
int i = -1;
i <= 1;
i++) {
226 float cellOffset =
i;
227 float pointPosition = cellOffset +
230 if (distanceToPoint < distanceF1) {
231 distanceF2 = distanceF1;
232 distanceF1 = distanceToPoint;
234 offsetF1 = cellOffset;
235 positionF2 = positionF1;
236 positionF1 = pointPosition;
238 else if (distanceToPoint < distanceF2) {
239 distanceF2 = distanceToPoint;
240 offsetF2 = cellOffset;
241 positionF2 = pointPosition;
254 float cellPosition =
floor(coord);
255 float localPosition = coord - cellPosition;
260 float distanceToMidLeft =
abs((midPointPosition + leftPointPosition) / 2.0 - localPosition);
261 float distanceToMidRight =
abs((midPointPosition + rightPointPosition) / 2.0 - localPosition);
263 return min(distanceToMidLeft, distanceToMidRight);
268 float cellPosition =
floor(coord);
269 float localPosition = coord - cellPosition;
271 float closestPoint = 0.0;
272 float closestPointOffset = 0.0;
274 for (
int i = -1;
i <= 1;
i++) {
275 float cellOffset =
i;
276 float pointPosition = cellOffset +
278 float distanceToPoint =
abs(pointPosition - localPosition);
279 if (distanceToPoint < minDistance) {
280 minDistance = distanceToPoint;
281 closestPoint = pointPosition;
282 closestPointOffset = cellOffset;
287 float closestPointToClosestPoint = 0.0;
288 for (
int i = -1;
i <= 1;
i++) {
292 float cellOffset =
i + closestPointOffset;
293 float pointPosition = cellOffset +
295 float distanceToPoint =
abs(closestPoint - pointPosition);
296 if (distanceToPoint < minDistance) {
297 minDistance = distanceToPoint;
298 closestPointToClosestPoint = pointPosition;
302 return abs(closestPointToClosestPoint - closestPoint) / 2.0;
309 return vector4(coord.x, coord.y, 0.0, 0.0);
314 vector2 cellPosition_f =
floor(coord);
315 vector2 localPosition = coord - cellPosition_f;
319 int2 targetOffset = {0, 0};
320 vector2 targetPosition = vector2(0.0, 0.0);
321 for (
int j = -1; j <= 1; j++) {
322 for (
int i = -1;
i <= 1;
i++) {
323 int2 cellOffset = {
i, j};
327 if (distanceToPoint < minDistance) {
328 targetOffset = cellOffset;
329 minDistance = distanceToPoint;
330 targetPosition = pointPosition;
344 vector2 cellPosition_f =
floor(coord);
345 vector2 localPosition = coord - cellPosition_f;
348 float smoothDistance = 0.0;
350 vector2 smoothPosition = vector2(0.0, 0.0);
352 for (
int j = -2; j <= 2; j++) {
353 for (
int i = -2;
i <= 2;
i++) {
354 int2 cellOffset = {
i, j};
361 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) /
params.smoothness);
362 float correctionFactor =
params.smoothness * h * (1.0 - h);
363 smoothDistance =
mix(smoothDistance, distanceToPoint, h) - correctionFactor;
364 correctionFactor /= 1.0 + 3.0 *
params.smoothness;
366 smoothColor =
mix(smoothColor, cellColor, h) - correctionFactor;
367 smoothPosition =
mix(smoothPosition, pointPosition, h) - correctionFactor;
373 octave.
Color = smoothColor;
380 vector2 cellPosition_f =
floor(coord);
381 vector2 localPosition = coord - cellPosition_f;
386 int2 offsetF1 = {0, 0};
387 vector2 positionF1 = vector2(0.0, 0.0);
388 int2 offsetF2 = {0, 0};
389 vector2 positionF2 = vector2(0.0, 0.0);
390 for (
int j = -1; j <= 1; j++) {
391 for (
int i = -1;
i <= 1;
i++) {
392 int2 cellOffset = {
i, j};
396 if (distanceToPoint < distanceF1) {
397 distanceF2 = distanceF1;
398 distanceF1 = distanceToPoint;
400 offsetF1 = cellOffset;
401 positionF2 = positionF1;
402 positionF1 = pointPosition;
404 else if (distanceToPoint < distanceF2) {
405 distanceF2 = distanceToPoint;
406 offsetF2 = cellOffset;
407 positionF2 = pointPosition;
421 vector2 cellPosition_f =
floor(coord);
422 vector2 localPosition = coord - cellPosition_f;
425 vector2 vectorToClosest = vector2(0.0, 0.0);
427 for (
int j = -1; j <= 1; j++) {
428 for (
int i = -1;
i <= 1;
i++) {
429 int2 cellOffset = {
i, j};
433 float distanceToPoint =
dot(vectorToPoint, vectorToPoint);
434 if (distanceToPoint < minDistance) {
435 minDistance = distanceToPoint;
436 vectorToClosest = vectorToPoint;
442 for (
int j = -1; j <= 1; j++) {
443 for (
int i = -1;
i <= 1;
i++) {
444 int2 cellOffset = {
i, j};
448 vector2 perpendicularToEdge = vectorToPoint - vectorToClosest;
449 if (
dot(perpendicularToEdge, perpendicularToEdge) > 0.0001) {
450 float distanceToEdge =
dot((vectorToClosest + vectorToPoint) / 2.0,
452 minDistance =
min(minDistance, distanceToEdge);
462 vector2 cellPosition_f =
floor(coord);
463 vector2 localPosition = coord - cellPosition_f;
466 vector2 closestPoint = vector2(0.0, 0.0);
467 int2 closestPointOffset = {0, 0};
469 for (
int j = -1; j <= 1; j++) {
470 for (
int i = -1;
i <= 1;
i++) {
471 int2 cellOffset = {
i, j};
474 float distanceToPoint =
distance(pointPosition, localPosition);
475 if (distanceToPoint < minDistance) {
476 minDistance = distanceToPoint;
477 closestPoint = pointPosition;
478 closestPointOffset = cellOffset;
484 vector2 closestPointToClosestPoint = vector2(0.0, 0.0);
485 for (
int j = -1; j <= 1; j++) {
486 for (
int i = -1;
i <= 1;
i++) {
487 if (
i == 0 && j == 0) {
490 int2 cellOffset =
int2(
i, j) + closestPointOffset;
493 float distanceToPoint =
distance(closestPoint, pointPosition);
494 if (distanceToPoint < minDistance) {
495 minDistance = distanceToPoint;
496 closestPointToClosestPoint = pointPosition;
501 return distance(closestPointToClosestPoint, closestPoint) / 2.0;
508 return vector4(coord.x, coord.y, coord.z, 0.0);
514 vector3 localPosition = coord - cellPosition_f;
518 int3 targetOffset = {0, 0, 0};
520 for (
int k = -1; k <= 1; k++) {
521 for (
int j = -1; j <= 1; j++) {
522 for (
int i = -1;
i <= 1;
i++) {
523 int3 cellOffset = {
i, j, k};
528 if (distanceToPoint < minDistance) {
529 targetOffset = cellOffset;
530 minDistance = distanceToPoint;
531 targetPosition = pointPosition;
547 vector3 localPosition = coord - cellPosition_f;
550 float smoothDistance = 0.0;
554 for (
int k = -2; k <= 2; k++) {
555 for (
int j = -2; j <= 2; j++) {
556 for (
int i = -2;
i <= 2;
i++) {
557 int3 cellOffset = {
i, j, k};
565 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) /
params.smoothness);
566 float correctionFactor =
params.smoothness * h * (1.0 - h);
567 smoothDistance =
mix(smoothDistance, distanceToPoint, h) - correctionFactor;
568 correctionFactor /= 1.0 + 3.0 *
params.smoothness;
570 smoothColor =
mix(smoothColor, cellColor, h) - correctionFactor;
571 smoothPosition =
mix(smoothPosition, pointPosition, h) - correctionFactor;
578 octave.
Color = smoothColor;
586 vector3 localPosition = coord - cellPosition_f;
591 int3 offsetF1 = {0, 0, 0};
593 int3 offsetF2 = {0, 0, 0};
595 for (
int k = -1; k <= 1; k++) {
596 for (
int j = -1; j <= 1; j++) {
597 for (
int i = -1;
i <= 1;
i++) {
598 int3 cellOffset = {
i, j, k};
603 if (distanceToPoint < distanceF1) {
604 distanceF2 = distanceF1;
605 distanceF1 = distanceToPoint;
607 offsetF1 = cellOffset;
608 positionF2 = positionF1;
609 positionF1 = pointPosition;
611 else if (distanceToPoint < distanceF2) {
612 distanceF2 = distanceToPoint;
613 offsetF2 = cellOffset;
614 positionF2 = pointPosition;
630 vector3 localPosition = coord - cellPosition_f;
635 for (
int k = -1; k <= 1; k++) {
636 for (
int j = -1; j <= 1; j++) {
637 for (
int i = -1;
i <= 1;
i++) {
638 int3 cellOffset = {
i, j, k};
643 float distanceToPoint =
dot(vectorToPoint, vectorToPoint);
644 if (distanceToPoint < minDistance) {
645 minDistance = distanceToPoint;
646 vectorToClosest = vectorToPoint;
653 for (
int k = -1; k <= 1; k++) {
654 for (
int j = -1; j <= 1; j++) {
655 for (
int i = -1;
i <= 1;
i++) {
656 int3 cellOffset = {
i, j, k};
661 vector3 perpendicularToEdge = vectorToPoint - vectorToClosest;
662 if (
dot(perpendicularToEdge, perpendicularToEdge) > 0.0001) {
663 float distanceToEdge =
dot((vectorToClosest + vectorToPoint) / 2.0,
665 minDistance =
min(minDistance, distanceToEdge);
677 vector3 localPosition = coord - cellPosition_f;
681 int3 closestPointOffset = {0, 0, 0};
683 for (
int k = -1; k <= 1; k++) {
684 for (
int j = -1; j <= 1; j++) {
685 for (
int i = -1;
i <= 1;
i++) {
686 int3 cellOffset = {
i, j, k};
690 float distanceToPoint =
distance(pointPosition, localPosition);
691 if (distanceToPoint < minDistance) {
692 minDistance = distanceToPoint;
693 closestPoint = pointPosition;
694 closestPointOffset = cellOffset;
702 for (
int k = -1; k <= 1; k++) {
703 for (
int j = -1; j <= 1; j++) {
704 for (
int i = -1;
i <= 1;
i++) {
705 if (
i == 0 && j == 0 && k == 0) {
708 int3 cellOffset =
int3(
i, j, k) + closestPointOffset;
712 float distanceToPoint =
distance(closestPoint, pointPosition);
713 if (distanceToPoint < minDistance) {
714 minDistance = distanceToPoint;
715 closestPointToClosestPoint = pointPosition;
721 return distance(closestPointToClosestPoint, closestPoint) / 2.0;
733 vector4 cellPosition_f =
floor(coord);
734 vector4 localPosition = coord - cellPosition_f;
738 int4 targetOffset = {0, 0, 0, 0};
739 vector4 targetPosition = vector4(0.0, 0.0, 0.0, 0.0);
740 for (
int u = -1; u <= 1; u++) {
741 for (
int k = -1; k <= 1; k++) {
742 for (
int j = -1; j <= 1; j++) {
743 for (
int i = -1;
i <= 1;
i++) {
744 int4 cellOffset = {
i, j, k, u};
749 if (distanceToPoint < minDistance) {
750 targetOffset = cellOffset;
751 minDistance = distanceToPoint;
752 targetPosition = pointPosition;
768 vector4 cellPosition_f =
floor(coord);
769 vector4 localPosition = coord - cellPosition_f;
772 float smoothDistance = 0.0;
774 vector4 smoothPosition = vector4(0.0, 0.0, 0.0, 0.0);
776 for (
int u = -2; u <= 2; u++) {
777 for (
int k = -2; k <= 2; k++) {
778 for (
int j = -2; j <= 2; j++) {
779 for (
int i = -2;
i <= 2;
i++) {
780 int4 cellOffset = {
i, j, k, u};
789 0.5 + 0.5 * (smoothDistance - distanceToPoint) /
params.smoothness);
790 float correctionFactor =
params.smoothness * h * (1.0 - h);
791 smoothDistance =
mix(smoothDistance, distanceToPoint, h) - correctionFactor;
792 correctionFactor /= 1.0 + 3.0 *
params.smoothness;
794 smoothColor =
mix(smoothColor, cellColor, h) - correctionFactor;
795 smoothPosition =
mix(smoothPosition, pointPosition, h) - correctionFactor;
803 octave.
Color = smoothColor;
810 vector4 cellPosition_f =
floor(coord);
811 vector4 localPosition = coord - cellPosition_f;
816 int4 offsetF1 = {0, 0, 0, 0};
817 vector4 positionF1 = vector4(0.0, 0.0, 0.0, 0.0);
818 int4 offsetF2 = {0, 0, 0, 0};
819 vector4 positionF2 = vector4(0.0, 0.0, 0.0, 0.0);
820 for (
int u = -1; u <= 1; u++) {
821 for (
int k = -1; k <= 1; k++) {
822 for (
int j = -1; j <= 1; j++) {
823 for (
int i = -1;
i <= 1;
i++) {
824 int4 cellOffset = {
i, j, k, u};
829 if (distanceToPoint < distanceF1) {
830 distanceF2 = distanceF1;
831 distanceF1 = distanceToPoint;
833 offsetF1 = cellOffset;
834 positionF2 = positionF1;
835 positionF1 = pointPosition;
837 else if (distanceToPoint < distanceF2) {
838 distanceF2 = distanceToPoint;
839 offsetF2 = cellOffset;
840 positionF2 = pointPosition;
856 vector4 cellPosition_f =
floor(coord);
857 vector4 localPosition = coord - cellPosition_f;
860 vector4 vectorToClosest = vector4(0.0, 0.0, 0.0, 0.0);
862 for (
int u = -1; u <= 1; u++) {
863 for (
int k = -1; k <= 1; k++) {
864 for (
int j = -1; j <= 1; j++) {
865 for (
int i = -1;
i <= 1;
i++) {
866 int4 cellOffset = {
i, j, k, u};
871 float distanceToPoint =
dot(vectorToPoint, vectorToPoint);
872 if (distanceToPoint < minDistance) {
873 minDistance = distanceToPoint;
874 vectorToClosest = vectorToPoint;
882 for (
int u = -1; u <= 1; u++) {
883 for (
int k = -1; k <= 1; k++) {
884 for (
int j = -1; j <= 1; j++) {
885 for (
int i = -1;
i <= 1;
i++) {
886 int4 cellOffset = {
i, j, k, u};
891 vector4 perpendicularToEdge = vectorToPoint - vectorToClosest;
892 if (
dot(perpendicularToEdge, perpendicularToEdge) > 0.0001) {
893 float distanceToEdge =
dot((vectorToClosest + vectorToPoint) / 2.0,
895 minDistance =
min(minDistance, distanceToEdge);
907 vector4 cellPosition_f =
floor(coord);
908 vector4 localPosition = coord - cellPosition_f;
911 vector4 closestPoint = vector4(0.0, 0.0, 0.0, 0.0);
912 int4 closestPointOffset = {0, 0, 0, 0};
914 for (
int u = -1; u <= 1; u++) {
915 for (
int k = -1; k <= 1; k++) {
916 for (
int j = -1; j <= 1; j++) {
917 for (
int i = -1;
i <= 1;
i++) {
918 int4 cellOffset = {
i, j, k, u};
922 float distanceToPoint =
distance(pointPosition, localPosition);
923 if (distanceToPoint < minDistance) {
924 minDistance = distanceToPoint;
925 closestPoint = pointPosition;
926 closestPointOffset = cellOffset;
934 vector4 closestPointToClosestPoint = vector4(0.0, 0.0, 0.0, 0.0);
935 for (
int u = -1; u <= 1; u++) {
936 for (
int k = -1; k <= 1; k++) {
937 for (
int j = -1; j <= 1; j++) {
938 for (
int i = -1;
i <= 1;
i++) {
939 if (
i == 0 && j == 0 && k == 0 && u == 0) {
942 int4 cellOffset =
int4(
i, j, k, u) + closestPointOffset;
946 float distanceToPoint =
distance(closestPoint, pointPosition);
947 if (distanceToPoint < minDistance) {
948 minDistance = distanceToPoint;
949 closestPointToClosestPoint = pointPosition;
956 return distance(closestPointToClosestPoint, closestPoint) / 2.0;
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
VecBase< float, D > normalize(VecOp< float, D >) RET
vector2 int2_to_vec2(int2 k)
int4 vec4_to_int4(vector4 k)
point int3_to_vec3(int3 k)
int2 vec2_to_int2(vector2 k)
vector4 int4_to_vec4(int4 k)
int3 vec3_to_int3(point k)
MINLINE float smoothstep(float edge0, float edge1, float x)
color hash_int4_to_color(int4 k)
color hash_float_to_color(float k)
vector2 hash_int2_to_vector2(int2 k)
vector3 hash_int3_to_vector3(int3 k)
color hash_int2_to_color(int2 k)
vector4 hash_int4_to_vector4(int4 k)
float hash_float_to_float(float k)
float distance(float a, float b)
float voronoi_distance(float a, float b)
vector2 safe_divide(vector2 a, float b)
float voronoi_n_sphere_radius(VoronoiParams params, float coord)
vector4 voronoi_position(float coord)
VoronoiOutput voronoi_f1(VoronoiParams params, float coord)
VoronoiOutput voronoi_smooth_f1(VoronoiParams params, float coord)
VoronoiOutput voronoi_f2(VoronoiParams params, float coord)
float voronoi_distance_to_edge(VoronoiParams params, float coord)