Cache SDF octree.
PiperOrigin-RevId: 781500550 Change-Id: I0077d41f13be0243bff292534cc6bce2bdc1caa4
This commit is contained in:
committed by
Copybara-Service
parent
fbea72d767
commit
d81ab17bf5
+31
-30
@@ -362,6 +362,7 @@ void mjCMesh::LoadSDF() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
needreorient_ = false;
|
needreorient_ = false;
|
||||||
|
needoct_ = false;
|
||||||
normal_ = std::move(usernormal);
|
normal_ = std::move(usernormal);
|
||||||
face_ = std::move(userface);
|
face_ = std::move(userface);
|
||||||
ProcessVertices(uservert);
|
ProcessVertices(uservert);
|
||||||
@@ -631,8 +632,7 @@ void mjCMesh::TryCompile(const mjVFS* vfs) {
|
|||||||
resource_ = LoadResource(modelfiledir_.Str(), filename.Str(), vfs);
|
resource_ = LoadResource(modelfiledir_.Str(), filename.Str(), vfs);
|
||||||
|
|
||||||
// try loading from cache
|
// try loading from cache
|
||||||
// TODO: move octree to mesh frame so it can be cached
|
if (cache != nullptr && LoadCachedMesh(cache, resource_)) {
|
||||||
if (cache != nullptr && !needoct_ && LoadCachedMesh(cache, resource_)) {
|
|
||||||
mju_closeResource(resource_);
|
mju_closeResource(resource_);
|
||||||
resource_ = nullptr;
|
resource_ = nullptr;
|
||||||
fromCache = true;
|
fromCache = true;
|
||||||
@@ -682,12 +682,39 @@ void mjCMesh::TryCompile(const mjVFS* vfs) {
|
|||||||
// compute mesh properties
|
// compute mesh properties
|
||||||
if (!fromCache) {
|
if (!fromCache) {
|
||||||
Process();
|
Process();
|
||||||
|
}
|
||||||
|
|
||||||
if (!file_.empty()) {
|
// make octree
|
||||||
CacheMesh(cache, resource_);
|
if (!needoct_) {
|
||||||
|
octree_.Clear(); // this occurs when a non-SDF mesh is loaded from a cached SDF mesh
|
||||||
|
} else if (octree_.Nodes().empty()) {
|
||||||
|
octree_.SetFace(vert_, face_);
|
||||||
|
octree_.CreateOctree(aamm_);
|
||||||
|
|
||||||
|
// compute sdf coefficients
|
||||||
|
if (!plugin.active) {
|
||||||
|
tmd::TriangleMeshDistance sdf(vert_.data(), nvert(), face_.data(), nface());
|
||||||
|
|
||||||
|
// TODO: do not evaluate the SDF multiple times at the same vertex
|
||||||
|
// TODO: the value at hanging vertices should be computed from the parent
|
||||||
|
const double* nodes = octree_.Nodes().data();
|
||||||
|
for (int i = 0; i < octree_.NumNodes(); ++i) {
|
||||||
|
for (int j = 0; j < 8; j++) {
|
||||||
|
mjtNum v[3];
|
||||||
|
v[0] = nodes[6*i+0] + (j&1 ? 1 : -1) * nodes[6*i+3];
|
||||||
|
v[1] = nodes[6*i+1] + (j&2 ? 1 : -1) * nodes[6*i+4];
|
||||||
|
v[2] = nodes[6*i+2] + (j&4 ? 1 : -1) * nodes[6*i+5];
|
||||||
|
octree_.AddCoeff(sdf.signed_distance(v).distance);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cache mesh
|
||||||
|
if (!fromCache && !file_.empty()) {
|
||||||
|
CacheMesh(cache, resource_);
|
||||||
|
}
|
||||||
|
|
||||||
// close resource
|
// close resource
|
||||||
if (resource_ != nullptr) {
|
if (resource_ != nullptr) {
|
||||||
mju_closeResource(resource_);
|
mju_closeResource(resource_);
|
||||||
@@ -1549,32 +1576,6 @@ void mjCMesh::Process() {
|
|||||||
}
|
}
|
||||||
Rotate(quattmp);
|
Rotate(quattmp);
|
||||||
|
|
||||||
// make octree in mesh frame
|
|
||||||
if (!needoct_) {
|
|
||||||
octree_.Clear();
|
|
||||||
} else if (octree_.Nodes().empty()) {
|
|
||||||
octree_.SetFace(vert_, face_);
|
|
||||||
octree_.CreateOctree(aamm_);
|
|
||||||
|
|
||||||
// compute sdf coefficients
|
|
||||||
if (!plugin.active) {
|
|
||||||
tmd::TriangleMeshDistance sdf(vert_.data(), nvert(), face_.data(), nface());
|
|
||||||
|
|
||||||
// TODO: do not evaluate the SDF multiple times at the same vertex
|
|
||||||
// TODO: the value at hanging vertices should be computed from the parent
|
|
||||||
const double* nodes = octree_.Nodes().data();
|
|
||||||
for (int i = 0; i < octree_.NumNodes(); ++i) {
|
|
||||||
for (int j = 0; j < 8; j++) {
|
|
||||||
mjtNum v[3];
|
|
||||||
v[0] = nodes[6*i+0] + (j&1 ? 1 : -1) * nodes[6*i+3];
|
|
||||||
v[1] = nodes[6*i+1] + (j&2 ? 1 : -1) * nodes[6*i+4];
|
|
||||||
v[2] = nodes[6*i+2] + (j&4 ? 1 : -1) * nodes[6*i+5];
|
|
||||||
octree_.AddCoeff(sdf.signed_distance(v).distance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// save the pos and quat that was used to transform the mesh
|
// save the pos and quat that was used to transform the mesh
|
||||||
mjuu_copyvec(pos_, CoM, 3);
|
mjuu_copyvec(pos_, CoM, 3);
|
||||||
mjuu_copyvec(quat_, quattmp, 4);
|
mjuu_copyvec(quat_, quattmp, 4);
|
||||||
|
|||||||
Reference in New Issue
Block a user