diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-02-10 15:31:59 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-02-10 15:34:09 +0300 |
commit | 0178915ce94d7aab89109e8ea6786e2df88653cc (patch) | |
tree | a06c7648936b37f7acc47af6a5abfef7dfd15fab /intern/cycles/blender | |
parent | fd7e9f797433e6739798f33ed3cb33022c0f7d2f (diff) |
Cycles: Make an utility class for edge map
Simplifies some logic.
Diffstat (limited to 'intern/cycles/blender')
-rw-r--r-- | intern/cycles/blender/blender_mesh.cpp | 48 |
1 files changed, 35 insertions, 13 deletions
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index c3e8c28adbc..7e527ed6250 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -524,6 +524,36 @@ static void attr_create_uv_map(Scene *scene, } } +/* TODO(sergey): Move this to some better place? */ +class EdgeMap { +public: + EdgeMap() { + } + + void clear() { + edges_.clear(); + } + + void insert(int v0, int v1) { + get_sorted_verts(v0, v1); + edges_.insert(std::pair<int, int>(v0, v1)); + } + + bool exists(int v0, int v1) { + get_sorted_verts(v0, v1); + return edges_.find(std::pair<int, int>(v0, v1)) != edges_.end(); + } + +protected: + void get_sorted_verts(int& v0, int& v1) { + if(v0 > v1) { + swap(v0, v1); + } + } + + set< std::pair<int, int> > edges_; +}; + /* Create vertex pointiness attributes. */ static void attr_create_pointiness(Scene *scene, Mesh *mesh, @@ -593,20 +623,16 @@ static void attr_create_pointiness(Scene *scene, vector<float> raw_data(num_verts, 0.0f); vector<float3> edge_accum(num_verts, make_float3(0.0f, 0.0f, 0.0f)); BL::Mesh::edges_iterator e; - set< std::pair<int, int> > visited_edges; + EdgeMap visited_edges; int edge_index = 0; memset(&counter[0], 0, sizeof(int) * counter.size()); for(b_mesh.edges.begin(e); e != b_mesh.edges.end(); ++e, ++edge_index) { const int v0 = vert_orig_index[b_mesh.edges[edge_index].vertices()[0]], v1 = vert_orig_index[b_mesh.edges[edge_index].vertices()[1]]; - int sorted_v0 = v0, sorted_v1 = v1; - if(sorted_v0 > sorted_v1) { - swap(sorted_v0, sorted_v1); - } - if(visited_edges.find(std::pair<int, int>(sorted_v0, sorted_v1)) != visited_edges.end()) { + if(visited_edges.exists(v0, v1)) { continue; } - visited_edges.insert(std::pair<int, int>(sorted_v0, sorted_v1)); + visited_edges.insert(v0, v1); float3 co0 = get_float3(b_mesh.vertices[v0].co()), co1 = get_float3(b_mesh.vertices[v1].co()); float3 edge = normalize(co1 - co0); @@ -641,14 +667,10 @@ static void attr_create_pointiness(Scene *scene, for(b_mesh.edges.begin(e); e != b_mesh.edges.end(); ++e, ++edge_index) { const int v0 = vert_orig_index[b_mesh.edges[edge_index].vertices()[0]], v1 = vert_orig_index[b_mesh.edges[edge_index].vertices()[1]]; - int sorted_v0 = v0, sorted_v1 = v1; - if(sorted_v0 > sorted_v1) { - swap(sorted_v0, sorted_v1); - } - if(visited_edges.find(std::pair<int, int>(sorted_v0, sorted_v1)) != visited_edges.end()) { + if(visited_edges.exists(v0, v1)) { continue; } - visited_edges.insert(std::pair<int, int>(sorted_v0, sorted_v1)); + visited_edges.insert(v0, v1); data[v0] += raw_data[v1]; data[v1] += raw_data[v0]; ++counter[v0]; |