From 317d6d9ebedf8f280750b5d4b31fdb5abefba3c1 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Tue, 17 Oct 2023 10:27:55 -0700 Subject: [PATCH] Move edge creation after element reordering in mjCFlex. PiperOrigin-RevId: 574193046 Change-Id: If2fb01b3494d637d4b220d03e7d7d84e4a9f7a2d --- src/user/user_mesh.cc | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/user/user_mesh.cc b/src/user/user_mesh.cc index 18d18cba..b0e1175a 100644 --- a/src/user/user_mesh.cc +++ b/src/user/user_mesh.cc @@ -2302,36 +2302,6 @@ void mjCFlex::Compile(const mjVFS* vfs) { } } - // create edges - std::vector edgeidx(elem.size()*kNumEdges[dim-1]); - - // map from edge vertices to their index in `edges` vector - std::unordered_map, int, PairHash> edge_indices; - - // insert local edges into global vector - for (int f = 0; f < (int)elem.size()/(dim+1); f++) { - int* v = elem.data() + f*(dim+1); - for (int e = 0; e < kNumEdges[dim-1]; e++) { - auto pair = std::pair( - std::min(v[eledge[dim-1][e][0]], v[eledge[dim-1][e][1]]), - std::max(v[eledge[dim-1][e][0]], v[eledge[dim-1][e][1]]) - ); - - // if edge is already present in the vector only store its index - auto [it, inserted] = edge_indices.insert({pair, nedge}); - - if (inserted) { - edge.push_back(pair); - edgeidx[f*kNumEdges[dim-1]+e] = nedge++; - } else { - edgeidx[f*kNumEdges[dim-1]+e] = it->second; - } - } - } - - // set size - nedge = (int)edge.size(); - // determine rigid if not already set if (!rigid) { rigid = true; @@ -2394,6 +2364,36 @@ void mjCFlex::Compile(const mjVFS* vfs) { } } + // create edges + std::vector edgeidx(elem.size()*kNumEdges[dim-1]); + + // map from edge vertices to their index in `edges` vector + std::unordered_map, int, PairHash> edge_indices; + + // insert local edges into global vector + for (int f = 0; f < (int)elem.size()/(dim+1); f++) { + int* v = elem.data() + f*(dim+1); + for (int e = 0; e < kNumEdges[dim-1]; e++) { + auto pair = std::pair( + std::min(v[eledge[dim-1][e][0]], v[eledge[dim-1][e][1]]), + std::max(v[eledge[dim-1][e][0]], v[eledge[dim-1][e][1]]) + ); + + // if edge is already present in the vector only store its index + auto [it, inserted] = edge_indices.insert({pair, nedge}); + + if (inserted) { + edge.push_back(pair); + edgeidx[f*kNumEdges[dim-1]+e] = nedge++; + } else { + edgeidx[f*kNumEdges[dim-1]+e] = it->second; + } + } + } + + // set size + nedge = (int)edge.size(); + // add plugins std::string userface, useredge; mjXUtil::Vector2String(userface, elem);