1 #ifndef B3_REDUCE_CONTACTS_H
2 #define B3_REDUCE_CONTACTS_H
4 inline int b3ReduceContacts(const b3Float4* p, int nPoints, const b3Float4& nearNormal, b3Int4* contactIdx)
15 b3Float4 center = b3MakeFloat4(0, 0, 0, 0);
17 for (int i = 0; i < nPoints; i++)
19 center /= (float)nPoints;
22 // sample 4 directions
24 b3Float4 aVector = p[0] - center;
25 b3Float4 u = b3Cross3(nearNormal, aVector);
26 b3Float4 v = b3Cross3(nearNormal, u);
27 u = b3FastNormalized3(u);
28 v = b3FastNormalized3(v);
30 //keep point with deepest penetration
42 for (int ie = 0; ie < nPoints; ie++)
50 b3Float4 r = p[ie] - center;
80 if (contactIdx[0].x != minIndex && contactIdx[0].y != minIndex && contactIdx[0].z != minIndex && contactIdx[0].w != minIndex)
82 //replace the first contact with minimum (todo: replace contact with least penetration)
83 contactIdx[0].x = minIndex;
89 #endif //B3_REDUCE_CONTACTS_H