Add write_physics_ as a state variable on ModelWriter.
This way we don't have to worry about passing the write_physics param everywhere. PiperOrigin-RevId: 764394280 Change-Id: I2c879ae57bdc30f50189960864097c932f967330
This commit is contained in:
committed by
Copybara-Service
parent
fc69ef1084
commit
6b919162d1
@@ -166,6 +166,9 @@ class ModelWriter {
|
|||||||
// Create the world body.
|
// Create the world body.
|
||||||
body_paths_[kWorldIndex] = WriteWorldBody(kWorldIndex);
|
body_paths_[kWorldIndex] = WriteWorldBody(kWorldIndex);
|
||||||
|
|
||||||
|
// Set working parameters.
|
||||||
|
write_physics_ = write_physics;
|
||||||
|
|
||||||
SetLayerMetadata(data_, pxr::SdfFieldKeys->Documentation,
|
SetLayerMetadata(data_, pxr::SdfFieldKeys->Documentation,
|
||||||
"Generated by mujoco model writer.");
|
"Generated by mujoco model writer.");
|
||||||
// Mujoco is Z up by default.
|
// Mujoco is Z up by default.
|
||||||
@@ -181,9 +184,9 @@ class ModelWriter {
|
|||||||
WritePhysicsScene();
|
WritePhysicsScene();
|
||||||
|
|
||||||
// Author mesh scope + mesh prims to be referenced.
|
// Author mesh scope + mesh prims to be referenced.
|
||||||
WriteMeshes(write_physics);
|
WriteMeshes();
|
||||||
WriteMaterials();
|
WriteMaterials();
|
||||||
WriteBodies(write_physics);
|
WriteBodies();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -199,6 +202,8 @@ class ModelWriter {
|
|||||||
std::vector<pxr::SdfPath> body_paths_;
|
std::vector<pxr::SdfPath> body_paths_;
|
||||||
// Mapping from mesh names to Mesh prim path.
|
// Mapping from mesh names to Mesh prim path.
|
||||||
std::unordered_map<std::string, pxr::SdfPath> mesh_paths_;
|
std::unordered_map<std::string, pxr::SdfPath> mesh_paths_;
|
||||||
|
// Whether to write physics data.
|
||||||
|
bool write_physics_ = false;
|
||||||
|
|
||||||
// Given a name index and a parent prim path this returns a
|
// Given a name index and a parent prim path this returns a
|
||||||
// token such that appending it to the parent prim path does not
|
// token such that appending it to the parent prim path does not
|
||||||
@@ -299,8 +304,7 @@ class ModelWriter {
|
|||||||
SetAttributeDefault(data_, xform_op_order_path, new_order);
|
SetAttributeDefault(data_, xform_op_order_path, new_order);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteMesh(const mjsMesh *mesh, const pxr::SdfPath &parent_path,
|
void WriteMesh(const mjsMesh *mesh, const pxr::SdfPath &parent_path) {
|
||||||
bool write_physics) {
|
|
||||||
auto name = GetAvailablePrimName(*mesh->name, pxr::UsdGeomTokens->Mesh,
|
auto name = GetAvailablePrimName(*mesh->name, pxr::UsdGeomTokens->Mesh,
|
||||||
parent_path);
|
parent_path);
|
||||||
pxr::SdfPath subcomponent_path =
|
pxr::SdfPath subcomponent_path =
|
||||||
@@ -310,7 +314,7 @@ class ModelWriter {
|
|||||||
pxr::UsdGeomTokens->Mesh);
|
pxr::UsdGeomTokens->Mesh);
|
||||||
mesh_paths_[*mesh->name] = subcomponent_path;
|
mesh_paths_[*mesh->name] = subcomponent_path;
|
||||||
|
|
||||||
if (write_physics) {
|
if (write_physics_) {
|
||||||
ApplyApiSchema(data_, mesh_path, MjcPhysicsTokens->MeshCollisionAPI);
|
ApplyApiSchema(data_, mesh_path, MjcPhysicsTokens->MeshCollisionAPI);
|
||||||
|
|
||||||
pxr::TfToken inertia = MjcPhysicsTokens->legacy;
|
pxr::TfToken inertia = MjcPhysicsTokens->legacy;
|
||||||
@@ -602,7 +606,7 @@ class ModelWriter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteMeshes(bool write_physics) {
|
void WriteMeshes() {
|
||||||
// Create a scope for the meshes to keep things organized
|
// Create a scope for the meshes to keep things organized
|
||||||
pxr::SdfPath scope_path =
|
pxr::SdfPath scope_path =
|
||||||
CreatePrimSpec(data_, body_paths_[kWorldIndex], kTokens->meshScope,
|
CreatePrimSpec(data_, body_paths_[kWorldIndex], kTokens->meshScope,
|
||||||
@@ -614,7 +618,7 @@ class ModelWriter {
|
|||||||
|
|
||||||
mjsMesh *mesh = mjs_asMesh(mjs_firstElement(spec_, mjOBJ_MESH));
|
mjsMesh *mesh = mjs_asMesh(mjs_firstElement(spec_, mjOBJ_MESH));
|
||||||
while (mesh) {
|
while (mesh) {
|
||||||
WriteMesh(mesh, scope_path, write_physics);
|
WriteMesh(mesh, scope_path);
|
||||||
mesh = mjs_asMesh(mjs_nextElement(spec_, mesh->element));
|
mesh = mjs_asMesh(mjs_nextElement(spec_, mesh->element));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1016,7 +1020,7 @@ class ModelWriter {
|
|||||||
site_path, pxr::VtArray<pxr::TfToken>{kTokens->xformOpTransform});
|
site_path, pxr::VtArray<pxr::TfToken>{kTokens->xformOpTransform});
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteGeom(mjsGeom *geom, const mjsBody *body, bool write_physics) {
|
void WriteGeom(mjsGeom *geom, const mjsBody *body) {
|
||||||
const int body_id = mjs_getId(body->element);
|
const int body_id = mjs_getId(body->element);
|
||||||
const auto &body_path = body_paths_[body_id];
|
const auto &body_path = body_paths_[body_id];
|
||||||
|
|
||||||
@@ -1052,8 +1056,8 @@ class ModelWriter {
|
|||||||
|
|
||||||
// Apply the physics schemas if we are writing physics and the
|
// Apply the physics schemas if we are writing physics and the
|
||||||
// geom participates in collisions.
|
// geom participates in collisions.
|
||||||
if (write_physics && (model_->geom_contype[geom_id] != 0 ||
|
if (write_physics_ && (model_->geom_contype[geom_id] != 0 ||
|
||||||
model_->geom_conaffinity[geom_id] != 0)) {
|
model_->geom_conaffinity[geom_id] != 0)) {
|
||||||
ApplyApiSchema(data_, geom_path,
|
ApplyApiSchema(data_, geom_path,
|
||||||
pxr::UsdPhysicsTokens->PhysicsCollisionAPI);
|
pxr::UsdPhysicsTokens->PhysicsCollisionAPI);
|
||||||
ApplyApiSchema(data_, geom_path, MjcPhysicsTokens->CollisionAPI);
|
ApplyApiSchema(data_, geom_path, MjcPhysicsTokens->CollisionAPI);
|
||||||
@@ -1178,10 +1182,10 @@ class ModelWriter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteGeoms(mjsBody *body, bool write_physics) {
|
void WriteGeoms(mjsBody *body) {
|
||||||
mjsGeom *geom = mjs_asGeom(mjs_firstChild(body, mjOBJ_GEOM, false));
|
mjsGeom *geom = mjs_asGeom(mjs_firstChild(body, mjOBJ_GEOM, false));
|
||||||
while (geom) {
|
while (geom) {
|
||||||
WriteGeom(geom, body, write_physics);
|
WriteGeom(geom, body);
|
||||||
geom = mjs_asGeom(mjs_nextChild(body, geom->element, false));
|
geom = mjs_asGeom(mjs_nextChild(body, geom->element, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1268,7 +1272,7 @@ class ModelWriter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteBody(mjsBody *body, bool write_physics) {
|
void WriteBody(mjsBody *body) {
|
||||||
int body_id = mjs_getId(body->element);
|
int body_id = mjs_getId(body->element);
|
||||||
// This should be safe as we process parent bodies before children.
|
// This should be safe as we process parent bodies before children.
|
||||||
mjsBody *parent = mjs_getParent(body->element);
|
mjsBody *parent = mjs_getParent(body->element);
|
||||||
@@ -1286,7 +1290,7 @@ class ModelWriter {
|
|||||||
SetPrimKind(data_, body_path, kind);
|
SetPrimKind(data_, body_path, kind);
|
||||||
|
|
||||||
// Apply the PhysicsRigidBodyAPI schema if we are writing physics.
|
// Apply the PhysicsRigidBodyAPI schema if we are writing physics.
|
||||||
if (write_physics) {
|
if (write_physics_) {
|
||||||
// If the body had a mass specified then it must have either inertia or
|
// If the body had a mass specified then it must have either inertia or
|
||||||
// fullinertia specified per inertia element XML documentation.
|
// fullinertia specified per inertia element XML documentation.
|
||||||
// Therefore it is sufficient to check if the mass is non-zero to see if
|
// Therefore it is sufficient to check if the mass is non-zero to see if
|
||||||
@@ -1373,17 +1377,17 @@ class ModelWriter {
|
|||||||
body_paths_[body_id] = body_path;
|
body_paths_[body_id] = body_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteBodies(bool write_physics) {
|
void WriteBodies() {
|
||||||
mjsBody *body = mjs_asBody(mjs_firstElement(spec_, mjOBJ_BODY));
|
mjsBody *body = mjs_asBody(mjs_firstElement(spec_, mjOBJ_BODY));
|
||||||
while (body) {
|
while (body) {
|
||||||
// Only write a rigidbody if we are not the world body.
|
// Only write a rigidbody if we are not the world body.
|
||||||
// We fall through since the world body might have static
|
// We fall through since the world body might have static
|
||||||
// geom children.
|
// geom children.
|
||||||
if (mjs_getId(body->element) != kWorldIndex) {
|
if (mjs_getId(body->element) != kWorldIndex) {
|
||||||
WriteBody(body, write_physics);
|
WriteBody(body);
|
||||||
}
|
}
|
||||||
WriteSites(body);
|
WriteSites(body);
|
||||||
WriteGeoms(body, write_physics);
|
WriteGeoms(body);
|
||||||
WriteCameras(body);
|
WriteCameras(body);
|
||||||
WriteLights(body);
|
WriteLights(body);
|
||||||
body = mjs_asBody(mjs_nextElement(spec_, body->element));
|
body = mjs_asBody(mjs_nextElement(spec_, body->element));
|
||||||
|
|||||||
Reference in New Issue
Block a user