Add a free() method to mujoco.MjrContext.

Up the mujoco bindings version to 2.1.2.post2.

Keep the capsule deconstructor which calls mj_freeContext, because mjr_freeContext is idempotent.

PiperOrigin-RevId: 435714183
Change-Id: I9f8615f85f2b3e383f447f6684e61200039d57d4
This commit is contained in:
Nimrod Gileadi
2022-03-18 13:00:32 -07:00
committed by Saran Tunyasuvunakool
parent df202d23b1
commit c6984b42af
3 changed files with 32 additions and 7 deletions
+12
View File
@@ -37,6 +37,8 @@ class MjWrapper<raw::MjrContext> : public WrapperBase<raw::MjrContext> {
MjWrapper(MjWrapper&&) = default;
~MjWrapper() = default;
void Free();
#define X(var) py_array_or_tuple_t<mjtNum> var
X(fogRGBA);
X(auxWidth);
@@ -121,6 +123,12 @@ MjrContextWrapper::MjWrapper(const MjModelWrapper& model, int fontscale)
X(charWidthBig) {}
#undef X_SKIN
#undef X
void MjrContextWrapper::Free() {
// mjr_freeContext is safe to call multiple times.
InterceptMjErrors(mjr_freeContext)(ptr_);
}
} // namespace _impl
namespace {
@@ -156,6 +164,10 @@ PYBIND11_MODULE(_render, pymodule) {
py::class_<MjrContextWrapper> mjrContext(pymodule, "MjrContext");
mjrContext.def(py::init<>());
mjrContext.def(py::init<const MjModelWrapper&, int>());
mjrContext.def(
"free", [](MjrContextWrapper& self) { self.Free(); },
py::doc("Frees resources in current active OpenGL context, sets struct "
"to default."));
#define X(var) \
mjrContext.def_property( \
#var, [](const MjrContextWrapper& c) { return c.get()->var; }, \
+19 -6
View File
@@ -49,13 +49,10 @@ class MuJoCoRenderTest(absltest.TestCase):
scene = mujoco.MjvScene(self.model, maxgeom=0)
mujoco.mjv_updateScene(
self.model, self.data, mujoco.MjvOption(), mujoco.MjvPerturb(),
mujoco.MjvCamera(), mujoco.mjtCatBit.mjCAT_ALL.value, scene)
mujoco.MjvCamera(), mujoco.mjtCatBit.mjCAT_ALL, scene)
context = mujoco.MjrContext(
self.model,
mujoco.mjtFontScale.mjFONTSCALE_150.value)
mujoco.mjr_setBuffer(
mujoco.mjtFramebuffer.mjFB_OFFSCREEN.value, context)
context = mujoco.MjrContext(self.model, mujoco.mjtFontScale.mjFONTSCALE_150)
mujoco.mjr_setBuffer(mujoco.mjtFramebuffer.mjFB_OFFSCREEN, context)
# MuJoCo's default render buffer size is 640x480.
full_rect = mujoco.MjrRect(0, 0, 640, 480)
@@ -76,6 +73,22 @@ class MuJoCoRenderTest(absltest.TestCase):
mujoco.mjr_readPixels(
np.reshape(upside_down_image, -1), None, full_rect, context)
np.testing.assert_array_equal(upside_down_image, expected_upside_down_image)
context.free()
def test_safe_to_free_context_twice(self):
self.model = mujoco.MjModel.from_xml_string('<mujoco><worldbody/></mujoco>')
self.data = mujoco.MjData(self.model)
scene = mujoco.MjvScene(self.model, maxgeom=0)
mujoco.mjv_updateScene(
self.model, self.data, mujoco.MjvOption(), None,
mujoco.MjvCamera(), mujoco.mjtCatBit.mjCAT_ALL, scene)
context = mujoco.MjrContext(self.model, mujoco.mjtFontScale.mjFONTSCALE_150)
mujoco.mjr_setBuffer(mujoco.mjtFramebuffer.mjFB_OFFSCREEN, context)
context.free()
context.free()
if __name__ == '__main__':
absltest.main()
+1 -1
View File
@@ -30,7 +30,7 @@ from setuptools import find_packages
from setuptools import setup
from setuptools.command import build_ext
__version__ = '2.1.2.post1'
__version__ = '2.1.2.post2'
MUJOCO_CMAKE = 'MUJOCO_CMAKE'
MUJOCO_CMAKE_ARGS = 'MUJOCO_CMAKE_ARGS'