Add renderer info query API
This commit is contained in:
@@ -125,6 +125,14 @@ class MuJoCoBindingsTest(parameterized.TestCase):
|
||||
self.model: mujoco.MjModel = mujoco.MjModel.from_xml_string(TEST_XML)
|
||||
self.data = mujoco.MjData(self.model)
|
||||
|
||||
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'))
|
||||
self.assertIsInstance(info.backend_version, str)
|
||||
|
||||
def test_load_xml_can_handle_name_clash(self):
|
||||
xml_1 = r"""
|
||||
<mujoco>
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -10995,6 +10995,34 @@ 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',
|
||||
),
|
||||
StructFieldDecl(
|
||||
name='backend_version',
|
||||
type=PointerType(
|
||||
inner_type=ValueType(name='char', is_const=True),
|
||||
),
|
||||
doc='backend version string, empty if unknown',
|
||||
),
|
||||
),
|
||||
)),
|
||||
('mjrVertexAttribute',
|
||||
StructDecl(
|
||||
name='mjrVertexAttribute',
|
||||
|
||||
@@ -79,6 +79,7 @@ using MjLogMessage = ::mjLogMessage;
|
||||
|
||||
// From mjrender.h
|
||||
using MjrRect = ::mjrRect;
|
||||
using MjrRendererInfo = ::mjrRendererInfo;
|
||||
using MjrContext = ::mjrContext;
|
||||
using MjrVertexAttribute = ::mjrVertexAttribute;
|
||||
|
||||
|
||||
@@ -245,6 +245,8 @@ PYBIND11_MODULE(_render, pymodule, pybind11::mod_gil_not_used()) {
|
||||
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);
|
||||
|
||||
@@ -1049,6 +1049,36 @@ This is useful for example when the MJB is not available as a file on disk.)"));
|
||||
X(height);
|
||||
#undef X
|
||||
|
||||
// ==================== MJRRENDERERINFO ======================================
|
||||
py::class_<raw::MjrRendererInfo> mjrRendererInfo(m, "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
|
||||
: "";
|
||||
});
|
||||
mjrRendererInfo.def_property_readonly(
|
||||
"backend_version", [](const raw::MjrRendererInfo& info) {
|
||||
return info.backend_version ? info.backend_version : "";
|
||||
});
|
||||
|
||||
// ==================== MJRVERTEXATTRIBUTE ===================================
|
||||
py::class_<raw::MjrVertexAttribute> mjrVertexAttribute(m,
|
||||
"MjrVertexAttribute");
|
||||
|
||||
Reference in New Issue
Block a user