diff --git a/python/mujoco/specs_test.py b/python/mujoco/specs_test.py index 08d47c0d..82e05e4a 100644 --- a/python/mujoco/specs_test.py +++ b/python/mujoco/specs_test.py @@ -1001,6 +1001,14 @@ class SpecsTest(absltest.TestCase): texture.data = np.zeros((2, 2, 3), dtype=np.uint8).tobytes() spec.compile() + def test_find_unnamed_texture(self): + spec = mujoco.MjSpec() + texture_file = spec.add_texture(file='file.png') + texture_name = spec.add_texture(name='name') + self.assertEqual(spec.texture('file'), texture_file) + self.assertEqual(spec.texture('name'), texture_name) + self.assertIsNone(spec.texture('none')) + def test_attach_units(self): child = mujoco.MjSpec() parent = mujoco.MjSpec() diff --git a/src/user/user_api.cc b/src/user/user_api.cc index be326503..c8bde69c 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -936,6 +936,8 @@ mjsElement* mjs_findElement(mjSpec* s, mjtObj type, const char* name) { case mjOBJ_LIGHT: case mjOBJ_FRAME: return model->FindTree(model->GetWorld(), type, std::string(name)); // recursive search + case mjOBJ_TEXTURE: + return model->FindTexture(std::string(name)); // check filename too default: return model->FindObject(type, std::string(name)); // always available } diff --git a/src/user/user_model.cc b/src/user/user_model.cc index c05a2bff..a02ad654 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -24,6 +24,7 @@ #include #include #include +#include // NOLINT(build/c++17) #include #include #include @@ -1369,6 +1370,23 @@ static T* findobject(std::string_view name, const vector& list, const mjKeyM return list[id->second]; } + + +mjCBase* mjCModel::FindTexture(std::string_view name) const { + for (unsigned int i=0; i < textures_.size(); i++) { + if (textures_[i]->name == name) { + return textures_[i]; + } + if (textures_[i]->name.empty() && + std::filesystem::path(textures_[i]->spec_file_).filename().stem() == name) { + return textures_[i]; + } + } + return nullptr; +} + + + // find object in global lists given string type and name mjCBase* mjCModel::FindObject(mjtObj type, string name) const { if (!object_lists_[type]) { diff --git a/src/user/user_model.h b/src/user/user_model.h index d0bf43fa..cd03914d 100644 --- a/src/user/user_model.h +++ b/src/user/user_model.h @@ -248,6 +248,7 @@ class mjCModel : public mjCModel_, private mjSpec { mjCDef* FindDefault(std::string name); // find defaults class name mjCDef* AddDefault(std::string name, mjCDef* parent = nullptr); // add defaults class to array mjCBase* FindObject(mjtObj type, std::string name) const; // find object given type and name + mjCBase* FindTexture(std::string_view name) const; // find texture given name mjCBase* FindTree(mjCBody* body, mjtObj type, std::string name); // find tree object given name mjSpec* FindSpec(std::string name) const; // find spec given name mjSpec* FindSpec(const mjsCompiler* compiler_); // find spec given mjsCompiler