Replace mjQUICKSORT with std::stable_sort in user_mesh.cc
PiperOrigin-RevId: 677864209 Change-Id: I1cca8e1ae8c84e652b12c24cfddfbca97d8c6841
This commit is contained in:
committed by
Copybara-Service
parent
bbe8a0c516
commit
5219893813
+14
-17
@@ -55,7 +55,6 @@
|
|||||||
#include <mujoco/mjtnum.h>
|
#include <mujoco/mjtnum.h>
|
||||||
#include "engine/engine_crossplatform.h"
|
#include "engine/engine_crossplatform.h"
|
||||||
#include "engine/engine_plugin.h"
|
#include "engine/engine_plugin.h"
|
||||||
#include "engine/engine_sort.h"
|
|
||||||
#include "engine/engine_util_errmem.h"
|
#include "engine/engine_util_errmem.h"
|
||||||
#include "user/user_cache.h"
|
#include "user/user_cache.h"
|
||||||
#include "user/user_model.h"
|
#include "user/user_model.h"
|
||||||
@@ -843,33 +842,31 @@ void mjCMesh::FitGeom(mjCGeom* geom, double* meshpos) {
|
|||||||
|
|
||||||
|
|
||||||
// comparison function for vertex sorting
|
// comparison function for vertex sorting
|
||||||
quicksortfunc(vertcompare, context, el1, el2) {
|
bool vertcompare(int index1, int index2, const std::vector<float>& vert) {
|
||||||
float* vert = (float*) context;
|
for (int i = 0; i < 3; i++) {
|
||||||
float x1 = vert[3*(*(int*)el1)] + 1e-2*vert[1+3*(*(int*)el1)] + 1e-4*vert[2+3*(*(int*)el1)];
|
if (vert[3*index1 + i] < vert[3*index2 + i]) {
|
||||||
float x2 = vert[3*(*(int*)el2)] + 1e-2*vert[1+3*(*(int*)el2)] + 1e-4*vert[2+3*(*(int*)el2)];
|
return true;
|
||||||
|
}
|
||||||
if (x1 < x2) {
|
if (vert[3*index1 + i] > vert[3*index2 + i]) {
|
||||||
return -1;
|
return false;
|
||||||
} else if (x1 == x2) {
|
}
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove repeated vertices
|
// remove repeated vertices
|
||||||
void mjCMesh::RemoveRepeated() {
|
void mjCMesh::RemoveRepeated() {
|
||||||
int repeated = 0;
|
int repeated = 0;
|
||||||
|
|
||||||
// allocate sort and redirection indices, set to identity
|
std::vector<int> index(nvert());
|
||||||
auto index = std::unique_ptr<int[]>(new int[nvert()]);
|
std::vector<int> redirect(nvert());
|
||||||
auto redirect = std::unique_ptr<int[]>(new int[nvert()]);
|
|
||||||
for (int i=0; i < nvert(); i++) {
|
for (int i=0; i < nvert(); i++) {
|
||||||
index[i] = redirect[i] = i;
|
index[i] = redirect[i] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// sort vertices
|
std::stable_sort(index.begin(), index.end(), [&vert = vert_](int a, int b) {
|
||||||
mjQUICKSORT(index.get(), nvert(), sizeof(int), vertcompare, vert_.data());
|
return vertcompare(a, b, vert);
|
||||||
|
});
|
||||||
|
|
||||||
// find repeated vertices, set redirect
|
// find repeated vertices, set redirect
|
||||||
for (int i=1; i < nvert(); i++) {
|
for (int i=1; i < nvert(); i++) {
|
||||||
|
|||||||
Reference in New Issue
Block a user