1public:
2// note .. maybe this can be attached to another node structure?
3// depends which works best for cache.
4struct ItemPairs {
5 struct Link {
6 void set(BVHHandle h, void *ud) {
7 handle = h;
8 userdata = ud;
9 }
10 BVHHandle handle;
11 void *userdata;
12 };
13
14 void clear() {
15 num_pairs = 0;
16 extended_pairs.reset();
17 expanded_aabb = BOUNDS();
18 }
19
20 BOUNDS expanded_aabb;
21
22 // maybe we can just use the number in the vector TODO
23 int32_t num_pairs;
24 LocalVector<Link> extended_pairs;
25
26 void add_pair_to(BVHHandle h, void *p_userdata) {
27 Link temp;
28 temp.set(h, p_userdata);
29
30 extended_pairs.push_back(temp);
31 num_pairs++;
32 }
33
34 uint32_t find_pair_to(BVHHandle h) const {
35 for (int n = 0; n < num_pairs; n++) {
36 if (extended_pairs[n].handle == h) {
37 return n;
38 }
39 }
40 return -1;
41 }
42
43 bool contains_pair_to(BVHHandle h) const {
44 return find_pair_to(h) != BVHCommon::INVALID;
45 }
46
47 // return success
48 void *remove_pair_to(BVHHandle h) {
49 void *userdata = nullptr;
50
51 for (int n = 0; n < num_pairs; n++) {
52 if (extended_pairs[n].handle == h) {
53 userdata = extended_pairs[n].userdata;
54 extended_pairs.remove_at_unordered(n);
55 num_pairs--;
56 break;
57 }
58 }
59
60 return userdata;
61 }
62
63 // experiment : scale the pairing expansion by the number of pairs.
64 // when the number of pairs is high, the density is high and a lower collision margin is better.
65 // when there are few local pairs, a larger margin is more optimal.
66 real_t scale_expansion_margin(real_t p_margin) const {
67 real_t x = real_t(num_pairs) * (1.0 / 9.0);
68 x = MIN(x, 1.0);
69 x = 1.0 - x;
70 return p_margin * x;
71 }
72};
73