Add mjs_findElement() to find any element in a spec by name.
Also, remove mjs_findMesh() and mjs_findKeyframe(). PiperOrigin-RevId: 670978980 Change-Id: Id88b800eb8a4c5efc40866f72a4442bf1d1437d0
This commit is contained in:
committed by
Copybara-Service
parent
0e8c0b80eb
commit
d3dfa6f970
+24
-27
@@ -542,18 +542,34 @@ mjsDefault* mjs_getSpecDefault(mjSpec* s) {
|
||||
|
||||
// find body in model by name
|
||||
mjsBody* mjs_findBody(mjSpec* s, const char* name) {
|
||||
mjCModel* model = static_cast<mjCModel*>(s->element);
|
||||
mjCBase* body = 0;
|
||||
if (model->IsCompiled()) {
|
||||
body = model->FindObject(mjOBJ_BODY, std::string(name)); // fast lookup
|
||||
} else {
|
||||
body = model->FindBody(model->GetWorld(), std::string(name)); // recursive search
|
||||
}
|
||||
mjsElement* body = mjs_findElement(s, mjOBJ_BODY, name);
|
||||
return body ? &(static_cast<mjCBody*>(body)->spec) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// find element in spec by name
|
||||
mjsElement* mjs_findElement(mjSpec* s, mjtObj type, const char* name) {
|
||||
mjCModel* model = static_cast<mjCModel*>(s->element);
|
||||
if (model->IsCompiled()) {
|
||||
return model->FindObject(type, std::string(name)); // fast lookup
|
||||
}
|
||||
switch (type) {
|
||||
case mjOBJ_BODY:
|
||||
case mjOBJ_SITE:
|
||||
case mjOBJ_GEOM:
|
||||
case mjOBJ_JOINT:
|
||||
case mjOBJ_CAMERA:
|
||||
case mjOBJ_LIGHT:
|
||||
case mjOBJ_FRAME:
|
||||
return model->FindTree(model->GetWorld(), type, std::string(name)); // recursive search
|
||||
default:
|
||||
return model->FindObject(type, std::string(name)); // always available
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// find child of a body by name
|
||||
mjsBody* mjs_findChild(mjsBody* bodyspec, const char* name) {
|
||||
mjCBody* body = static_cast<mjCBody*>(bodyspec->element);
|
||||
@@ -563,33 +579,14 @@ mjsBody* mjs_findChild(mjsBody* bodyspec, const char* name) {
|
||||
|
||||
|
||||
|
||||
// find mesh by name
|
||||
mjsMesh* mjs_findMesh(mjSpec* s, const char* name) {
|
||||
mjCModel* model = static_cast<mjCModel*>(s->element);
|
||||
mjCMesh* mesh = (mjCMesh*)model->FindObject(mjOBJ_MESH, std::string(name));
|
||||
return mesh ? &(static_cast<mjCMesh*>(mesh)->spec) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// find frame by name
|
||||
mjsFrame* mjs_findFrame(mjSpec* s, const char* name) {
|
||||
mjCModel* model = static_cast<mjCModel*>(s->element);
|
||||
mjCFrame* frame = (mjCFrame*)model->FindFrame(model->GetWorld(), std::string(name));
|
||||
mjsElement* frame = mjs_findElement(s, mjOBJ_FRAME, name);
|
||||
return frame ? &(static_cast<mjCFrame*>(frame)->spec) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// find keyframe by name
|
||||
mjsKey* mjs_findKeyframe(mjSpec* s, const char* name) {
|
||||
mjCModel* model = static_cast<mjCModel*>(s->element);
|
||||
mjCKey* key = (mjCKey*)model->FindObject(mjOBJ_KEY, std::string(name));
|
||||
return key ? &(static_cast<mjCKey*>(key)->spec) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// set frame
|
||||
void mjs_setFrame(mjsElement* dest, mjsFrame* frame) {
|
||||
if (!frame) {
|
||||
|
||||
Reference in New Issue
Block a user