Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/svm/svm_voronoi.h
| Show First 20 Lines • Show All 678 Lines • ▼ Show 20 Lines | ccl_device void voronoi_f1_4d(float4 coord, | ||||
| float4 cellPosition = floor(coord); | float4 cellPosition = floor(coord); | ||||
| float4 localPosition = coord - cellPosition; | float4 localPosition = coord - cellPosition; | ||||
| float minDistance = 8.0f; | float minDistance = 8.0f; | ||||
| float4 targetOffset = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 targetOffset = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| float4 targetPosition = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 targetPosition = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| for (int u = -1; u <= 1; u++) { | for (int u = -1; u <= 1; u++) { | ||||
| for (int k = -1; k <= 1; k++) { | for (int k = -1; k <= 1; k++) { | ||||
| for (int j = -1; j <= 1; j++) { | ccl_loop_no_unroll for (int j = -1; j <= 1; j++) | ||||
| { | |||||
| for (int i = -1; i <= 1; i++) { | for (int i = -1; i <= 1; i++) { | ||||
| float4 cellOffset = make_float4(i, j, k, u); | float4 cellOffset = make_float4(i, j, k, u); | ||||
| float4 pointPosition = cellOffset + | float4 pointPosition = cellOffset + | ||||
| hash_float4_to_float4(cellPosition + cellOffset) * randomness; | hash_float4_to_float4(cellPosition + cellOffset) * randomness; | ||||
| float distanceToPoint = voronoi_distance_4d( | float distanceToPoint = voronoi_distance_4d( | ||||
| pointPosition, localPosition, metric, exponent); | pointPosition, localPosition, metric, exponent); | ||||
| if (distanceToPoint < minDistance) { | if (distanceToPoint < minDistance) { | ||||
| targetOffset = cellOffset; | targetOffset = cellOffset; | ||||
| Show All 21 Lines | ccl_device void voronoi_smooth_f1_4d(float4 coord, | ||||
| float4 cellPosition = floor(coord); | float4 cellPosition = floor(coord); | ||||
| float4 localPosition = coord - cellPosition; | float4 localPosition = coord - cellPosition; | ||||
| float smoothDistance = 8.0f; | float smoothDistance = 8.0f; | ||||
| float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f); | float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f); | ||||
| float4 smoothPosition = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 smoothPosition = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| for (int u = -2; u <= 2; u++) { | for (int u = -2; u <= 2; u++) { | ||||
| for (int k = -2; k <= 2; k++) { | for (int k = -2; k <= 2; k++) { | ||||
| for (int j = -2; j <= 2; j++) { | ccl_loop_no_unroll for (int j = -2; j <= 2; j++) | ||||
| { | |||||
| for (int i = -2; i <= 2; i++) { | for (int i = -2; i <= 2; i++) { | ||||
| float4 cellOffset = make_float4(i, j, k, u); | float4 cellOffset = make_float4(i, j, k, u); | ||||
| float4 pointPosition = cellOffset + | float4 pointPosition = cellOffset + | ||||
| hash_float4_to_float4(cellPosition + cellOffset) * randomness; | hash_float4_to_float4(cellPosition + cellOffset) * randomness; | ||||
| float distanceToPoint = voronoi_distance_4d( | float distanceToPoint = voronoi_distance_4d( | ||||
| pointPosition, localPosition, metric, exponent); | pointPosition, localPosition, metric, exponent); | ||||
| float h = smoothstep( | float h = smoothstep( | ||||
| 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness); | 0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness); | ||||
| Show All 26 Lines | ccl_device void voronoi_f2_4d(float4 coord, | ||||
| float distanceF1 = 8.0f; | float distanceF1 = 8.0f; | ||||
| float distanceF2 = 8.0f; | float distanceF2 = 8.0f; | ||||
| float4 offsetF1 = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 offsetF1 = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| float4 positionF1 = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 positionF1 = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| float4 offsetF2 = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 offsetF2 = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| float4 positionF2 = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 positionF2 = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| for (int u = -1; u <= 1; u++) { | for (int u = -1; u <= 1; u++) { | ||||
| for (int k = -1; k <= 1; k++) { | for (int k = -1; k <= 1; k++) { | ||||
| for (int j = -1; j <= 1; j++) { | ccl_loop_no_unroll for (int j = -1; j <= 1; j++) | ||||
| { | |||||
| for (int i = -1; i <= 1; i++) { | for (int i = -1; i <= 1; i++) { | ||||
| float4 cellOffset = make_float4(i, j, k, u); | float4 cellOffset = make_float4(i, j, k, u); | ||||
| float4 pointPosition = cellOffset + | float4 pointPosition = cellOffset + | ||||
| hash_float4_to_float4(cellPosition + cellOffset) * randomness; | hash_float4_to_float4(cellPosition + cellOffset) * randomness; | ||||
| float distanceToPoint = voronoi_distance_4d( | float distanceToPoint = voronoi_distance_4d( | ||||
| pointPosition, localPosition, metric, exponent); | pointPosition, localPosition, metric, exponent); | ||||
| if (distanceToPoint < distanceF1) { | if (distanceToPoint < distanceF1) { | ||||
| distanceF2 = distanceF1; | distanceF2 = distanceF1; | ||||
| Show All 21 Lines | |||||
| { | { | ||||
| float4 cellPosition = floor(coord); | float4 cellPosition = floor(coord); | ||||
| float4 localPosition = coord - cellPosition; | float4 localPosition = coord - cellPosition; | ||||
| float4 vectorToClosest = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 vectorToClosest = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| float minDistance = 8.0f; | float minDistance = 8.0f; | ||||
| for (int u = -1; u <= 1; u++) { | for (int u = -1; u <= 1; u++) { | ||||
| for (int k = -1; k <= 1; k++) { | for (int k = -1; k <= 1; k++) { | ||||
| for (int j = -1; j <= 1; j++) { | ccl_loop_no_unroll for (int j = -1; j <= 1; j++) | ||||
| { | |||||
| for (int i = -1; i <= 1; i++) { | for (int i = -1; i <= 1; i++) { | ||||
| float4 cellOffset = make_float4(i, j, k, u); | float4 cellOffset = make_float4(i, j, k, u); | ||||
| float4 vectorToPoint = cellOffset + | float4 vectorToPoint = cellOffset + | ||||
| hash_float4_to_float4(cellPosition + cellOffset) * randomness - | hash_float4_to_float4(cellPosition + cellOffset) * randomness - | ||||
| localPosition; | localPosition; | ||||
| float distanceToPoint = dot(vectorToPoint, vectorToPoint); | float distanceToPoint = dot(vectorToPoint, vectorToPoint); | ||||
| if (distanceToPoint < minDistance) { | if (distanceToPoint < minDistance) { | ||||
| minDistance = distanceToPoint; | minDistance = distanceToPoint; | ||||
| vectorToClosest = vectorToPoint; | vectorToClosest = vectorToPoint; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| minDistance = 8.0f; | minDistance = 8.0f; | ||||
| for (int u = -1; u <= 1; u++) { | for (int u = -1; u <= 1; u++) { | ||||
| for (int k = -1; k <= 1; k++) { | for (int k = -1; k <= 1; k++) { | ||||
| for (int j = -1; j <= 1; j++) { | ccl_loop_no_unroll for (int j = -1; j <= 1; j++) | ||||
| { | |||||
| for (int i = -1; i <= 1; i++) { | for (int i = -1; i <= 1; i++) { | ||||
| float4 cellOffset = make_float4(i, j, k, u); | float4 cellOffset = make_float4(i, j, k, u); | ||||
| float4 vectorToPoint = cellOffset + | float4 vectorToPoint = cellOffset + | ||||
| hash_float4_to_float4(cellPosition + cellOffset) * randomness - | hash_float4_to_float4(cellPosition + cellOffset) * randomness - | ||||
| localPosition; | localPosition; | ||||
| float4 perpendicularToEdge = vectorToPoint - vectorToClosest; | float4 perpendicularToEdge = vectorToPoint - vectorToClosest; | ||||
| if (dot(perpendicularToEdge, perpendicularToEdge) > 0.0001f) { | if (dot(perpendicularToEdge, perpendicularToEdge) > 0.0001f) { | ||||
| float distanceToEdge = dot((vectorToClosest + vectorToPoint) / 2.0f, | float distanceToEdge = dot((vectorToClosest + vectorToPoint) / 2.0f, | ||||
| Show All 12 Lines | ccl_device void voronoi_n_sphere_radius_4d(float4 coord, float randomness, float *outRadius) | ||||
| float4 cellPosition = floor(coord); | float4 cellPosition = floor(coord); | ||||
| float4 localPosition = coord - cellPosition; | float4 localPosition = coord - cellPosition; | ||||
| float4 closestPoint = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 closestPoint = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| float4 closestPointOffset = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 closestPointOffset = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| float minDistance = 8.0f; | float minDistance = 8.0f; | ||||
| for (int u = -1; u <= 1; u++) { | for (int u = -1; u <= 1; u++) { | ||||
| for (int k = -1; k <= 1; k++) { | for (int k = -1; k <= 1; k++) { | ||||
| for (int j = -1; j <= 1; j++) { | ccl_loop_no_unroll for (int j = -1; j <= 1; j++) | ||||
| { | |||||
| for (int i = -1; i <= 1; i++) { | for (int i = -1; i <= 1; i++) { | ||||
| float4 cellOffset = make_float4(i, j, k, u); | float4 cellOffset = make_float4(i, j, k, u); | ||||
| float4 pointPosition = cellOffset + | float4 pointPosition = cellOffset + | ||||
| hash_float4_to_float4(cellPosition + cellOffset) * randomness; | hash_float4_to_float4(cellPosition + cellOffset) * randomness; | ||||
| float distanceToPoint = distance(pointPosition, localPosition); | float distanceToPoint = distance(pointPosition, localPosition); | ||||
| if (distanceToPoint < minDistance) { | if (distanceToPoint < minDistance) { | ||||
| minDistance = distanceToPoint; | minDistance = distanceToPoint; | ||||
| closestPoint = pointPosition; | closestPoint = pointPosition; | ||||
| closestPointOffset = cellOffset; | closestPointOffset = cellOffset; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| minDistance = 8.0f; | minDistance = 8.0f; | ||||
| float4 closestPointToClosestPoint = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | float4 closestPointToClosestPoint = make_float4(0.0f, 0.0f, 0.0f, 0.0f); | ||||
| for (int u = -1; u <= 1; u++) { | for (int u = -1; u <= 1; u++) { | ||||
| for (int k = -1; k <= 1; k++) { | for (int k = -1; k <= 1; k++) { | ||||
| for (int j = -1; j <= 1; j++) { | ccl_loop_no_unroll for (int j = -1; j <= 1; j++) | ||||
| { | |||||
| for (int i = -1; i <= 1; i++) { | for (int i = -1; i <= 1; i++) { | ||||
| if (i == 0 && j == 0 && k == 0 && u == 0) { | if (i == 0 && j == 0 && k == 0 && u == 0) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| float4 cellOffset = make_float4(i, j, k, u) + closestPointOffset; | float4 cellOffset = make_float4(i, j, k, u) + closestPointOffset; | ||||
| float4 pointPosition = cellOffset + | float4 pointPosition = cellOffset + | ||||
| hash_float4_to_float4(cellPosition + cellOffset) * randomness; | hash_float4_to_float4(cellPosition + cellOffset) * randomness; | ||||
| float distanceToPoint = distance(closestPoint, pointPosition); | float distanceToPoint = distance(closestPoint, pointPosition); | ||||
| ▲ Show 20 Lines • Show All 250 Lines • Show Last 20 Lines | |||||