Add object-based accessors for mjData in WASM bindings.

PiperOrigin-RevId: 862736608
Change-Id: I0618e9d2af37e377bad1aead1b3fd1a12334df35
This commit is contained in:
Google DeepMind
2026-01-29 07:54:50 -08:00
committed by Copybara-Service
parent 59c5017073
commit d2efc0e154
5 changed files with 727 additions and 125 deletions
+30
View File
@@ -413,6 +413,30 @@ def build_struct_header(
MJMODEL_ACCESSORS
#undef X_ACCESSOR""".lstrip())
elif w == "MjData":
builder.line("""
// Generates functions to return accessor classes.
#define X_ACCESSOR(NAME, Name, OBJTYPE, accessor_name, nfield) \\
MjData##Name##Accessor accessor_name(const NumberOrString& val) const { \\
if (val.isString()) { \\
int id = mj_name2id(model, OBJTYPE, val.as<std::string>().c_str()); \\
if (id == -1) { \\
mju_error("%s", KeyErrorMessage(model, OBJTYPE, model->nfield, val.as<std::string>(), #accessor_name).c_str()); \\
} \\
return MjData##Name##Accessor(ptr_, model, id); \\
} else if (val.isNumber()) { \\
int id = val.as<int>(); \\
if (id < 0 || id >= model->nfield) { \\
mju_error("%s", IndexErrorMessage(id, model->nfield, #accessor_name).c_str()); \\
} \\
return MjData##Name##Accessor(ptr_, model, id); \\
} else { \\
mju_error(#accessor_name "() argument must be a string or number"); \\
return MjData##Name##Accessor(nullptr, nullptr, 0); \\
} \\
}
MJDATA_ACCESSORS
#undef X_ACCESSOR""".lstrip())
# define private struct members
builder.private()
@@ -518,6 +542,12 @@ def _build_struct_bindings(
if w == "MjData":
builder.line(".constructor<MjModel *>()")
builder.line(".constructor<const MjModel &, const MjData &>()")
builder.line("""
// Binds the functions on MjData that return accessors.
#define X_ACCESSOR(NAME, Name, OBJTYPE, field_name, nfield) \\
.function(#field_name, &MjData::field_name)
MJDATA_ACCESSORS
#undef X_ACCESSOR""".lstrip())
elif w == "MjModel":
f1 = common.wrapped_function_name(
introspect_functions.FUNCTIONS["mj_loadXML"]