Move edge creation after element reordering in mjCFlex.
PiperOrigin-RevId: 574193046 Change-Id: If2fb01b3494d637d4b220d03e7d7d84e4a9f7a2d
This commit is contained in:
committed by
Copybara-Service
parent
139a8ae298
commit
317d6d9ebe
+30
-30
@@ -2302,36 +2302,6 @@ void mjCFlex::Compile(const mjVFS* vfs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// create edges
|
|
||||||
std::vector<int> edgeidx(elem.size()*kNumEdges[dim-1]);
|
|
||||||
|
|
||||||
// map from edge vertices to their index in `edges` vector
|
|
||||||
std::unordered_map<std::pair<int, int>, 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
|
// determine rigid if not already set
|
||||||
if (!rigid) {
|
if (!rigid) {
|
||||||
rigid = true;
|
rigid = true;
|
||||||
@@ -2394,6 +2364,36 @@ void mjCFlex::Compile(const mjVFS* vfs) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create edges
|
||||||
|
std::vector<int> edgeidx(elem.size()*kNumEdges[dim-1]);
|
||||||
|
|
||||||
|
// map from edge vertices to their index in `edges` vector
|
||||||
|
std::unordered_map<std::pair<int, int>, 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
|
// add plugins
|
||||||
std::string userface, useredge;
|
std::string userface, useredge;
|
||||||
mjXUtil::Vector2String(userface, elem);
|
mjXUtil::Vector2String(userface, elem);
|
||||||
|
|||||||
Reference in New Issue
Block a user