Merge pull request #3340 from devshahofficial:devshahofficial/mjr-renderer-info

PiperOrigin-RevId: 948183711
Change-Id: I28b256eca22e86ec0ba05a4fa26458d678aca130
This commit is contained in:
Copybara-Service
2026-07-15 01:37:11 -07:00
19 changed files with 225 additions and 3 deletions
+28
View File
@@ -5480,6 +5480,34 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([
),
doc='Set default mjrContext.',
)),
('mjr_defaultRendererInfo',
FunctionDecl(
name='mjr_defaultRendererInfo',
return_type=ValueType(name='void'),
parameters=(
FunctionParameterDecl(
name='info',
type=PointerType(
inner_type=ValueType(name='mjrRendererInfo'),
),
),
),
doc='Set default mjrRendererInfo.',
)),
('mjr_getRendererInfo',
FunctionDecl(
name='mjr_getRendererInfo',
return_type=ValueType(name='void'),
parameters=(
FunctionParameterDecl(
name='info',
type=PointerType(
inner_type=ValueType(name='mjrRendererInfo'),
),
),
),
doc='Get active renderer information.',
)),
('mjr_makeContext',
FunctionDecl(
name='mjr_makeContext',
+21
View File
@@ -11005,6 +11005,27 @@ STRUCTS: Mapping[str, StructDecl] = dict([
),
),
)),
('mjrRendererInfo',
StructDecl(
name='mjrRendererInfo',
declname='struct mjrRendererInfo_',
fields=(
StructFieldDecl(
name='renderer',
type=PointerType(
inner_type=ValueType(name='char', is_const=True),
),
doc='renderer family: classic, filament, noop',
),
StructFieldDecl(
name='backend',
type=PointerType(
inner_type=ValueType(name='char', is_const=True),
),
doc='graphics backend: opengl, vulkan; empty if uninitialized',
),
),
)),
('mjrVertexAttribute',
StructDecl(
name='mjrVertexAttribute',
+1
View File
@@ -79,6 +79,7 @@ using MjLogMessage = ::mjLogMessage;
// From mjrender.h
using MjrRect = ::mjrRect;
using MjrRendererInfo = ::mjrRendererInfo;
using MjrContext = ::mjrContext;
using MjrVertexAttribute = ::mjrVertexAttribute;
+28 -1
View File
@@ -143,7 +143,6 @@ void MjrContextWrapper::Free() {
// mjr_freeContext is safe to call multiple times.
InterceptMjErrors(mjr_freeContext)(ptr_);
}
} // namespace _impl
namespace {
@@ -241,10 +240,38 @@ PYBIND11_MODULE(_render, pymodule, pybind11::mod_gil_not_used()) {
X(charWidthBig);
#undef X
// ==================== MJRRENDERERINFO ======================================
py::class_<raw::MjrRendererInfo> mjrRendererInfo(pymodule, "MjrRendererInfo");
mjrRendererInfo.def(py::init([]() {
raw::MjrRendererInfo info;
mjr_defaultRendererInfo(&info);
return info;
}));
mjrRendererInfo.def("__copy__", [](const raw::MjrRendererInfo& other) {
return raw::MjrRendererInfo(other);
});
mjrRendererInfo.def("__deepcopy__",
[](const raw::MjrRendererInfo& other, py::dict) {
return raw::MjrRendererInfo(other);
});
DefineStructFunctions(mjrRendererInfo);
mjrRendererInfo.def_property_readonly("renderer",
[](const raw::MjrRendererInfo& info) {
return info.renderer ? info.renderer
: "";
});
mjrRendererInfo.def_property_readonly("backend",
[](const raw::MjrRendererInfo& info) {
return info.backend ? info.backend
: "";
});
using EigenUnsignedCharVectorX = Eigen::Vector<unsigned char, Eigen::Dynamic>;
using EigenFloatVectorX = Eigen::Vector<float, Eigen::Dynamic>;
// Skipped: mjr_defaultContext (have MjrContext.__init__)
Def<traits::mjr_defaultRendererInfo>(pymodule);
Def<traits::mjr_getRendererInfo>(pymodule);
// Skipped: mjr_makeContext (have MjrContext.__init__)
Def<traits::mjr_changeFont>(pymodule);
Def<traits::mjr_addAux>(pymodule);
+7
View File
@@ -28,6 +28,13 @@ import numpy as np
)
class MuJoCoRendererTest(parameterized.TestCase):
def test_renderer_info_binding(self):
info = mujoco.MjrRendererInfo()
mujoco.mjr_getRendererInfo(info)
self.assertIn(info.renderer, ('classic', 'filament', 'noop'))
self.assertIn(info.backend, ('', 'opengl', 'vulkan', 'unknown'))
def test_renderer_unknown_camera_name(self):
xml = """
<mujoco>