diff --git a/src/bundles/graphics/_graphics/mesh_edges.cpp b/src/bundles/graphics/_graphics/mesh_edges.cpp
index e0537a835..d4449d505 100644
a
|
b
|
|
13 | 13 | * === UCSF ChimeraX Copyright === |
14 | 14 | */ |
15 | 15 | |
16 | | #include <set> // use std::set |
| 16 | #include <unordered_set> // use std::unordered_set |
17 | 17 | |
18 | 18 | #include <arrays/pythonarray.h> // use array_from_python() |
19 | 19 | #include <arrays/rcarray.h> // use Numeric_Array, Array<T> |
… |
… |
|
25 | 25 | namespace Map_Cpp |
26 | 26 | { |
27 | 27 | |
| 28 | |
| 29 | struct edge_hash |
| 30 | { |
| 31 | std::size_t operator() (const std::pair<int, int> &edge) const noexcept |
| 32 | { |
| 33 | // hash used by Blender: https://github.com/blender/blender/blob/594f47ecd2d5367ca936cf6fc6ec8168c2b360d0/source/blender/blenlib/intern/edgehash.c#L93 |
| 34 | return edge.first << 8 ^ edge.second; |
| 35 | } |
| 36 | }; |
| 37 | |
28 | 38 | // ---------------------------------------------------------------------------- |
29 | 39 | // Find edges of displayed triangles. Edges that appear in 2 or more triangles |
30 | 40 | // are only listed once. |
… |
… |
namespace Map_Cpp
|
32 | 42 | static IArray calculate_masked_edges(const IArray &triangles, |
33 | 43 | const BArray &tmask, const BArray &emask) |
34 | 44 | { |
35 | | std::set< std::pair<int,int> > edges; |
| 45 | std::unordered_set< std::pair<int,int>, edge_hash > edges; |
36 | 46 | |
37 | 47 | unsigned char *show_t = (tmask.size() > 0 ? tmask.values() : NULL); |
38 | 48 | unsigned char *show_e = (emask.size() > 0 ? emask.values() : NULL); |
… |
… |
static IArray calculate_masked_edges(const IArray &triangles,
|
56 | 66 | int64_t size[2] = {(int64_t)edges.size(), 2}; |
57 | 67 | IArray masked_edges(2, size); |
58 | 68 | int *eiarray = masked_edges.values(); |
59 | | for (std::set< std::pair<int,int> >::iterator ei = edges.begin() ; |
| 69 | for (auto ei = edges.begin() ; |
60 | 70 | ei != edges.end() ; ++ei) |
61 | 71 | { |
62 | 72 | *eiarray = (*ei).first; eiarray += 1; |