@@ -5,40 +5,46 @@ using namespace metal;
55
66kernel void
77 drawMetaballs(texture2d<float, access::write> outTexture[[texture(0)]],
8− constant float *metaballBuffer [[buffer(0)]],
8+ constant float *edgesBuffer[[buffer(1)]],
9+ constant float *metaballBuffer[[buffer(0)]],
910 uint2 gid[[thread_position_in_grid]]) {
1011
11− char numberOfMetaballs = metaballBuffer[0];
12− char metaballArraySize = numberOfMetaballs * 2 + 1;
12+ uint numberOfMetaballs = metaballBuffer[0];
13+ uint metaballArraySize = numberOfMetaballs * 2 + 1;
1314
1415 float sum = 0;
1516
16− for (char i = 1; i < metaballArraySize; i += 2) {
17− for (char j = i + 2; j < metaballArraySize; j += 2) {
18− float2 metaball1 = float2(metaballBuffer[i],
19− metaballBuffer[i + 1]);
17+ uint i, j, x, y;
2018
21− float2 metaball2 = float2(metaballBuffer[j],
22− metaballBuffer[j + 1]);
19+ for (i = 1, x = 0; i < metaballArraySize; i += 2, x += 1) {
20+ for (j = i + 2, y = x + 1; j < metaballArraySize; j += 2, y += 1) {
21+ float2 metaball1 = float2(metaballBuffer[i], metaballBuffer[i + 1]);
22+
23+ float2 metaball2 = float2(metaballBuffer[j], metaballBuffer[j + 1]);
2324
2425 float2 metaball1Vector
2526 = float2(metaball1.x - gid.x, metaball1.y - gid.y);
2627 float2 metaball2Vector
2728 = float2(metaball2.x - gid.x, metaball2.y - gid.y);
2829
30+ float value1 = 2048 / (dot(metaball1Vector, metaball1Vector) + 1);
31+ float value2 = 2048 / (dot(metaball2Vector, metaball2Vector) + 1);
32+
33+ float v = value1 + value2;
34+
35+ float weightedValue = 0.5 * v;
36+
37+ char edgeIndex = y * numberOfMetaballs + x;
38+ float edgeWeight = edgesBuffer[edgeIndex];
2939 float2 direction1 = normalize(metaball1Vector);
3040 float2 direction2 = normalize(metaball2Vector);
3141
3242 float cosine = dot(direction1, direction2);
3343
34− float value1 = 2048 / (dot(metaball1Vector, metaball1Vector) + 1);
35− float value2 = 2048 / (dot(metaball2Vector, metaball2Vector) + 1);
36−
37− float v = value1 + value2;
3844 float link = pow(((1 - cosine) * 0.5), 100);
3945
40− float weightedLink = 0.6 * link;
41− float weightedValue = 0.5 * v;
46+ float weightedLink = 0.6 * link * edgeWeight;
47+
4248
4349 sum += mix(0.0, 1.0, step(0.5, weightedValue + weightedLink));
4450 }