Ticket #5964: mesh_edges.cpp.diff

File mesh_edges.cpp.diff, 1.8 KB (added by Tristan Croll, 4 years ago)

Added by email2trac

  • src/bundles/graphics/_graphics/mesh_edges.cpp

    diff --git a/src/bundles/graphics/_graphics/mesh_edges.cpp b/src/bundles/graphics/_graphics/mesh_edges.cpp
    index e0537a835..d4449d505 100644
    a b  
    1313 * === UCSF ChimeraX Copyright ===
    1414 */
    1515
    16 #include <set>                          // use std::set
     16#include <unordered_set>                                // use std::unordered_set
    1717
    1818#include <arrays/pythonarray.h>         // use array_from_python()
    1919#include <arrays/rcarray.h>             // use Numeric_Array, Array<T>
     
    2525namespace Map_Cpp
    2626{
    2727
     28
     29struct 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
    2838// ----------------------------------------------------------------------------
    2939// Find edges of displayed triangles.  Edges that appear in 2 or more triangles
    3040// are only listed once.
    namespace Map_Cpp  
    3242static IArray calculate_masked_edges(const IArray &triangles,
    3343                                     const BArray &tmask, const BArray &emask)
    3444{
    35   std::set< std::pair<int,int> > edges;
     45  std::unordered_set< std::pair<int,int>, edge_hash > edges;
    3646
    3747  unsigned char *show_t = (tmask.size() > 0 ? tmask.values() : NULL);
    3848  unsigned char *show_e = (emask.size() > 0 ? emask.values() : NULL);
    static IArray calculate_masked_edges(const IArray &triangles,  
    5666  int64_t size[2] = {(int64_t)edges.size(), 2};
    5767  IArray masked_edges(2, size);
    5868  int *eiarray = masked_edges.values();
    59   for (std::set< std::pair<int,int> >::iterator ei = edges.begin() ;
     69  for (auto ei = edges.begin() ;
    6070       ei != edges.end() ; ++ei)
    6171    {
    6272      *eiarray = (*ei).first; eiarray += 1;