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 =
floor(coord);
315 vector2 localPosition = coord - cellPosition;
318 vector2 targetOffset = vector2(0.0, 0.0);
319 vector2 targetPosition = vector2(0.0, 0.0);
320 for (
int j = -1; j <= 1; j++) {
321 for (
int i = -1; i <= 1; i++) {
322 vector2 cellOffset = vector2(i, j);
326 if (distanceToPoint < minDistance) {
327 targetOffset = cellOffset;
328 minDistance = distanceToPoint;
329 targetPosition = pointPosition;
343 vector2 cellPosition =
floor(coord);
344 vector2 localPosition = coord - cellPosition;
346 float smoothDistance = 0.0;
348 vector2 smoothPosition = vector2(0.0, 0.0);
350 for (
int j = -2; j <= 2; j++) {
351 for (
int i = -2; i <= 2; i++) {
352 vector2 cellOffset = vector2(i, j);
359 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) /
params.smoothness);
360 float correctionFactor =
params.smoothness * h * (1.0 - h);
361 smoothDistance =
mix(smoothDistance, distanceToPoint, h) - correctionFactor;
362 correctionFactor /= 1.0 + 3.0 *
params.smoothness;
364 smoothColor =
mix(smoothColor, cellColor, h) - correctionFactor;
365 smoothPosition =
mix(smoothPosition, pointPosition, h) - correctionFactor;
371 octave.
Color = smoothColor;
378 vector2 cellPosition =
floor(coord);
379 vector2 localPosition = coord - cellPosition;
383 vector2 offsetF1 = vector2(0.0, 0.0);
384 vector2 positionF1 = vector2(0.0, 0.0);
385 vector2 offsetF2 = vector2(0.0, 0.0);
386 vector2 positionF2 = vector2(0.0, 0.0);
387 for (
int j = -1; j <= 1; j++) {
388 for (
int i = -1; i <= 1; i++) {
389 vector2 cellOffset = vector2(i, j);
393 if (distanceToPoint < distanceF1) {
394 distanceF2 = distanceF1;
395 distanceF1 = distanceToPoint;
397 offsetF1 = cellOffset;
398 positionF2 = positionF1;
399 positionF1 = pointPosition;
401 else if (distanceToPoint < distanceF2) {
402 distanceF2 = distanceToPoint;
403 offsetF2 = cellOffset;
404 positionF2 = pointPosition;
418 vector2 cellPosition =
floor(coord);
419 vector2 localPosition = coord - cellPosition;
421 vector2 vectorToClosest = vector2(0.0, 0.0);
423 for (
int j = -1; j <= 1; j++) {
424 for (
int i = -1; i <= 1; i++) {
425 vector2 cellOffset = vector2(i, j);
426 vector2 vectorToPoint = cellOffset +
430 float distanceToPoint =
dot(vectorToPoint, vectorToPoint);
431 if (distanceToPoint < minDistance) {
432 minDistance = distanceToPoint;
433 vectorToClosest = vectorToPoint;
439 for (
int j = -1; j <= 1; j++) {
440 for (
int i = -1; i <= 1; i++) {
441 vector2 cellOffset = vector2(i, j);
442 vector2 vectorToPoint = cellOffset +
446 vector2 perpendicularToEdge = vectorToPoint - vectorToClosest;
447 if (
dot(perpendicularToEdge, perpendicularToEdge) > 0.0001) {
448 float distanceToEdge =
dot((vectorToClosest + vectorToPoint) / 2.0,
450 minDistance =
min(minDistance, distanceToEdge);
460 vector2 cellPosition =
floor(coord);
461 vector2 localPosition = coord - cellPosition;
463 vector2 closestPoint = vector2(0.0, 0.0);
464 vector2 closestPointOffset = vector2(0.0, 0.0);
466 for (
int j = -1; j <= 1; j++) {
467 for (
int i = -1; i <= 1; i++) {
468 vector2 cellOffset = vector2(i, j);
471 float distanceToPoint =
distance(pointPosition, localPosition);
472 if (distanceToPoint < minDistance) {
473 minDistance = distanceToPoint;
474 closestPoint = pointPosition;
475 closestPointOffset = cellOffset;
481 vector2 closestPointToClosestPoint = vector2(0.0, 0.0);
482 for (
int j = -1; j <= 1; j++) {
483 for (
int i = -1; i <= 1; i++) {
484 if (i == 0 && j == 0) {
487 vector2 cellOffset = vector2(i, j) + closestPointOffset;
490 float distanceToPoint =
distance(closestPoint, pointPosition);
491 if (distanceToPoint < minDistance) {
492 minDistance = distanceToPoint;
493 closestPointToClosestPoint = pointPosition;
498 return distance(closestPointToClosestPoint, closestPoint) / 2.0;
505 return vector4(coord.x, coord.y, coord.z, 0.0);
511 vector3 localPosition = coord - cellPosition;
516 for (
int k = -1; k <= 1; k++) {
517 for (
int j = -1; j <= 1; j++) {
518 for (
int i = -1; i <= 1; i++) {
523 if (distanceToPoint < minDistance) {
524 targetOffset = cellOffset;
525 minDistance = distanceToPoint;
526 targetPosition = pointPosition;
542 vector3 localPosition = coord - cellPosition;
544 float smoothDistance = 0.0;
548 for (
int k = -2; k <= 2; k++) {
549 for (
int j = -2; j <= 2; j++) {
550 for (
int i = -2; i <= 2; i++) {
558 0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) /
params.smoothness);
559 float correctionFactor =
params.smoothness * h * (1.0 - h);
560 smoothDistance =
mix(smoothDistance, distanceToPoint, h) - correctionFactor;
561 correctionFactor /= 1.0 + 3.0 *
params.smoothness;
563 smoothColor =
mix(smoothColor, cellColor, h) - correctionFactor;
564 smoothPosition =
mix(smoothPosition, pointPosition, h) - correctionFactor;
571 octave.
Color = smoothColor;
579 vector3 localPosition = coord - cellPosition;
587 for (
int k = -1; k <= 1; k++) {
588 for (
int j = -1; j <= 1; j++) {
589 for (
int i = -1; i <= 1; i++) {
594 if (distanceToPoint < distanceF1) {
595 distanceF2 = distanceF1;
596 distanceF1 = distanceToPoint;
598 offsetF1 = cellOffset;
599 positionF2 = positionF1;
600 positionF1 = pointPosition;
602 else if (distanceToPoint < distanceF2) {
603 distanceF2 = distanceToPoint;
604 offsetF2 = cellOffset;
605 positionF2 = pointPosition;
621 vector3 localPosition = coord - cellPosition;
625 for (
int k = -1; k <= 1; k++) {
626 for (
int j = -1; j <= 1; j++) {
627 for (
int i = -1; i <= 1; i++) {
629 vector3 vectorToPoint = cellOffset +
633 float distanceToPoint =
dot(vectorToPoint, vectorToPoint);
634 if (distanceToPoint < minDistance) {
635 minDistance = distanceToPoint;
636 vectorToClosest = vectorToPoint;
643 for (
int k = -1; k <= 1; k++) {
644 for (
int j = -1; j <= 1; j++) {
645 for (
int i = -1; i <= 1; i++) {
647 vector3 vectorToPoint = cellOffset +
651 vector3 perpendicularToEdge = vectorToPoint - vectorToClosest;
652 if (
dot(perpendicularToEdge, perpendicularToEdge) > 0.0001) {
653 float distanceToEdge =
dot((vectorToClosest + vectorToPoint) / 2.0,
655 minDistance =
min(minDistance, distanceToEdge);
667 vector3 localPosition = coord - cellPosition;
672 for (
int k = -1; k <= 1; k++) {
673 for (
int j = -1; j <= 1; j++) {
674 for (
int i = -1; i <= 1; i++) {
678 float distanceToPoint =
distance(pointPosition, localPosition);
679 if (distanceToPoint < minDistance) {
680 minDistance = distanceToPoint;
681 closestPoint = pointPosition;
682 closestPointOffset = cellOffset;
690 for (
int k = -1; k <= 1; k++) {
691 for (
int j = -1; j <= 1; j++) {
692 for (
int i = -1; i <= 1; i++) {
693 if (i == 0 && j == 0 && k == 0) {
699 float distanceToPoint =
distance(closestPoint, pointPosition);
700 if (distanceToPoint < minDistance) {
701 minDistance = distanceToPoint;
702 closestPointToClosestPoint = pointPosition;
708 return distance(closestPointToClosestPoint, closestPoint) / 2.0;
720 vector4 cellPosition =
floor(coord);
721 vector4 localPosition = coord - cellPosition;
724 vector4 targetOffset = vector4(0.0, 0.0, 0.0, 0.0);
725 vector4 targetPosition = vector4(0.0, 0.0, 0.0, 0.0);
726 for (
int u = -1; u <= 1; u++) {
727 for (
int k = -1; k <= 1; k++) {
728 for (
int j = -1; j <= 1; j++) {
729 for (
int i = -1; i <= 1; i++) {
730 vector4 cellOffset = vector4(i, j, k, u);
734 if (distanceToPoint < minDistance) {
735 targetOffset = cellOffset;
736 minDistance = distanceToPoint;
737 targetPosition = pointPosition;
753 vector4 cellPosition =
floor(coord);
754 vector4 localPosition = coord - cellPosition;
756 float smoothDistance = 0.0;
758 vector4 smoothPosition = vector4(0.0, 0.0, 0.0, 0.0);
760 for (
int u = -2; u <= 2; u++) {
761 for (
int k = -2; k <= 2; k++) {
762 for (
int j = -2; j <= 2; j++) {
763 for (
int i = -2; i <= 2; i++) {
764 vector4 cellOffset = vector4(i, j, k, u);
772 0.5 + 0.5 * (smoothDistance - distanceToPoint) /
params.smoothness);
773 float correctionFactor =
params.smoothness * h * (1.0 - h);
774 smoothDistance =
mix(smoothDistance, distanceToPoint, h) - correctionFactor;
775 correctionFactor /= 1.0 + 3.0 *
params.smoothness;
777 smoothColor =
mix(smoothColor, cellColor, h) - correctionFactor;
778 smoothPosition =
mix(smoothPosition, pointPosition, h) - correctionFactor;
786 octave.
Color = smoothColor;
793 vector4 cellPosition =
floor(coord);
794 vector4 localPosition = coord - cellPosition;
798 vector4 offsetF1 = vector4(0.0, 0.0, 0.0, 0.0);
799 vector4 positionF1 = vector4(0.0, 0.0, 0.0, 0.0);
800 vector4 offsetF2 = vector4(0.0, 0.0, 0.0, 0.0);
801 vector4 positionF2 = vector4(0.0, 0.0, 0.0, 0.0);
802 for (
int u = -1; u <= 1; u++) {
803 for (
int k = -1; k <= 1; k++) {
804 for (
int j = -1; j <= 1; j++) {
805 for (
int i = -1; i <= 1; i++) {
806 vector4 cellOffset = vector4(i, j, k, u);
810 if (distanceToPoint < distanceF1) {
811 distanceF2 = distanceF1;
812 distanceF1 = distanceToPoint;
814 offsetF1 = cellOffset;
815 positionF2 = positionF1;
816 positionF1 = pointPosition;
818 else if (distanceToPoint < distanceF2) {
819 distanceF2 = distanceToPoint;
820 offsetF2 = cellOffset;
821 positionF2 = pointPosition;
837 vector4 cellPosition =
floor(coord);
838 vector4 localPosition = coord - cellPosition;
840 vector4 vectorToClosest = vector4(0.0, 0.0, 0.0, 0.0);
842 for (
int u = -1; u <= 1; u++) {
843 for (
int k = -1; k <= 1; k++) {
844 for (
int j = -1; j <= 1; j++) {
845 for (
int i = -1; i <= 1; i++) {
846 vector4 cellOffset = vector4(i, j, k, u);
847 vector4 vectorToPoint = cellOffset +
851 float distanceToPoint =
dot(vectorToPoint, vectorToPoint);
852 if (distanceToPoint < minDistance) {
853 minDistance = distanceToPoint;
854 vectorToClosest = vectorToPoint;
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 vector4 cellOffset = vector4(i, j, k, u);
867 vector4 vectorToPoint = cellOffset +
871 vector4 perpendicularToEdge = vectorToPoint - vectorToClosest;
872 if (
dot(perpendicularToEdge, perpendicularToEdge) > 0.0001) {
873 float distanceToEdge =
dot((vectorToClosest + vectorToPoint) / 2.0,
875 minDistance =
min(minDistance, distanceToEdge);
887 vector4 cellPosition =
floor(coord);
888 vector4 localPosition = coord - cellPosition;
890 vector4 closestPoint = vector4(0.0, 0.0, 0.0, 0.0);
891 vector4 closestPointOffset = vector4(0.0, 0.0, 0.0, 0.0);
893 for (
int u = -1; u <= 1; u++) {
894 for (
int k = -1; k <= 1; k++) {
895 for (
int j = -1; j <= 1; j++) {
896 for (
int i = -1; i <= 1; i++) {
897 vector4 cellOffset = vector4(i, j, k, u);
900 float distanceToPoint =
distance(pointPosition, localPosition);
901 if (distanceToPoint < minDistance) {
902 minDistance = distanceToPoint;
903 closestPoint = pointPosition;
904 closestPointOffset = cellOffset;
912 vector4 closestPointToClosestPoint = vector4(0.0, 0.0, 0.0, 0.0);
913 for (
int u = -1; u <= 1; u++) {
914 for (
int k = -1; k <= 1; k++) {
915 for (
int j = -1; j <= 1; j++) {
916 for (
int i = -1; i <= 1; i++) {
917 if (i == 0 && j == 0 && k == 0 && u == 0) {
920 vector4 cellOffset = vector4(i, j, k, u) + closestPointOffset;
923 float distanceToPoint =
distance(closestPoint, pointPosition);
924 if (distanceToPoint < minDistance) {
925 minDistance = distanceToPoint;
926 closestPointToClosestPoint = pointPosition;
933 return distance(closestPointToClosestPoint, closestPoint) / 2.0;
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
SIMD_FORCE_INLINE btScalar length() const
Return the length of the vector.
local_group_size(16, 16) .push_constant(Type b
pow(value.r - subtrahend, 2.0)") .do_static_compilation(true)
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
MINLINE float smoothstep(float edge0, float edge1, float x)
ccl_device_inline float2 floor(const float2 a)
color hash_vector3_to_color(vector3 k)
color hash_float_to_color(float k)
color hash_vector4_to_color(vector4 k)
color hash_vector2_to_color(vector2 k)
vector2 hash_vector2_to_vector2(vector2 k)
vector4 hash_vector4_to_vector4(vector4 k)
float hash_float_to_float(float k)
vector3 hash_vector3_to_vector3(vector3 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)
ccl_device_inline int abs(int x)