Skip to content

Commit 54661ab

Browse files
MatiasManevicopybara-github
authored andcommitted
Fully generate Emscripten bindings for MuJoCo functions.
PiperOrigin-RevId: 830975595 Change-Id: Ie4d0d16c80f490abaa5ae8218628ac1b3d32c0ef
1 parent ff037f2 commit 54661ab

File tree

5 files changed

+96
-178
lines changed

5 files changed

+96
-178
lines changed

wasm/codegen/generated/bindings.cc

Lines changed: 80 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -12485,6 +12485,8 @@ void mjd_subQuat_wrapper(const NumberArray& qa, const NumberArray& qb, const val
1248512485
}
1248612486

1248712487
EMSCRIPTEN_BINDINGS(mujoco_functions) {
12488+
function("parseXMLString", &parseXMLString, take_ownership());
12489+
function("error", &error_wrapper);
1248812490
function("mj_resetCallbacks", &mj_resetCallbacks);
1248912491
function("mj_version", &mj_version);
1249012492
function("mju_bandDiag", &mju_bandDiag);
@@ -12498,6 +12500,7 @@ EMSCRIPTEN_BINDINGS(mujoco_functions) {
1249812500
function("mju_Halton", &mju_Halton);
1249912501
function("mju_sigmoid", &mju_sigmoid);
1250012502
function("mj_copyBack", &mj_copyBack_wrapper);
12503+
function("mj_saveLastXML", &mj_saveLastXML_wrapper);
1250112504
function("mj_step", &mj_step_wrapper);
1250212505
function("mj_step1", &mj_step1_wrapper);
1250312506
function("mj_step2", &mj_step2_wrapper);
@@ -12514,13 +12517,15 @@ EMSCRIPTEN_BINDINGS(mujoco_functions) {
1251412517
function("mj_resetDataDebug", &mj_resetDataDebug_wrapper);
1251512518
function("mj_resetDataKeyframe", &mj_resetDataKeyframe_wrapper);
1251612519
function("mj_setConst", &mj_setConst_wrapper);
12520+
function("mj_setLengthRange", &mj_setLengthRange_wrapper);
1251712521
function("mjs_activatePlugin", &mjs_activatePlugin_wrapper);
1251812522
function("mjs_setDeepCopy", &mjs_setDeepCopy_wrapper);
1251912523
function("mj_printFormattedModel", &mj_printFormattedModel_wrapper);
1252012524
function("mj_printModel", &mj_printModel_wrapper);
1252112525
function("mj_printFormattedData", &mj_printFormattedData_wrapper);
1252212526
function("mj_printData", &mj_printData_wrapper);
1252312527
function("mju_printMat", &mju_printMat_wrapper);
12528+
function("mju_printMatSparse", &mju_printMatSparse_wrapper);
1252412529
function("mj_printScene", &mj_printScene_wrapper);
1252512530
function("mj_printFormattedScene", &mj_printFormattedScene_wrapper);
1252612531
function("mj_fwdPosition", &mj_fwdPosition_wrapper);
@@ -12552,31 +12557,58 @@ EMSCRIPTEN_BINDINGS(mujoco_functions) {
1255212557
function("mj_crb", &mj_crb_wrapper);
1255312558
function("mj_makeM", &mj_makeM_wrapper);
1255412559
function("mj_factorM", &mj_factorM_wrapper);
12560+
function("mj_solveM", &mj_solveM_wrapper);
12561+
function("mj_solveM2", &mj_solveM2_wrapper);
1255512562
function("mj_comVel", &mj_comVel_wrapper);
1255612563
function("mj_passive", &mj_passive_wrapper);
1255712564
function("mj_subtreeVel", &mj_subtreeVel_wrapper);
12565+
function("mj_rne", &mj_rne_wrapper);
1255812566
function("mj_rnePostConstraint", &mj_rnePostConstraint_wrapper);
1255912567
function("mj_collision", &mj_collision_wrapper);
1256012568
function("mj_makeConstraint", &mj_makeConstraint_wrapper);
1256112569
function("mj_island", &mj_island_wrapper);
1256212570
function("mj_projectConstraint", &mj_projectConstraint_wrapper);
1256312571
function("mj_referenceConstraint", &mj_referenceConstraint_wrapper);
12572+
function("mj_constraintUpdate", &mj_constraintUpdate_wrapper);
1256412573
function("mj_stateSize", &mj_stateSize_wrapper);
12574+
function("mj_getState", &mj_getState_wrapper);
1256512575
function("mj_extractState", &mj_extractState_wrapper);
12576+
function("mj_setState", &mj_setState_wrapper);
1256612577
function("mj_setKeyframe", &mj_setKeyframe_wrapper);
1256712578
function("mj_addContact", &mj_addContact_wrapper);
1256812579
function("mj_isPyramidal", &mj_isPyramidal_wrapper);
1256912580
function("mj_isSparse", &mj_isSparse_wrapper);
1257012581
function("mj_isDual", &mj_isDual_wrapper);
12582+
function("mj_mulJacVec", &mj_mulJacVec_wrapper);
12583+
function("mj_mulJacTVec", &mj_mulJacTVec_wrapper);
12584+
function("mj_jac", &mj_jac_wrapper);
12585+
function("mj_jacBody", &mj_jacBody_wrapper);
12586+
function("mj_jacBodyCom", &mj_jacBodyCom_wrapper);
12587+
function("mj_jacSubtreeCom", &mj_jacSubtreeCom_wrapper);
12588+
function("mj_jacGeom", &mj_jacGeom_wrapper);
12589+
function("mj_jacSite", &mj_jacSite_wrapper);
12590+
function("mj_jacPointAxis", &mj_jacPointAxis_wrapper);
12591+
function("mj_jacDot", &mj_jacDot_wrapper);
12592+
function("mj_angmomMat", &mj_angmomMat_wrapper);
1257112593
function("mj_name2id", &mj_name2id_wrapper);
1257212594
function("mj_id2name", &mj_id2name_wrapper);
12595+
function("mj_fullM", &mj_fullM_wrapper);
12596+
function("mj_mulM", &mj_mulM_wrapper);
12597+
function("mj_mulM2", &mj_mulM2_wrapper);
12598+
function("mj_addM", &mj_addM_wrapper);
12599+
function("mj_applyFT", &mj_applyFT_wrapper);
1257312600
function("mj_objectVelocity", &mj_objectVelocity_wrapper);
1257412601
function("mj_objectAcceleration", &mj_objectAcceleration_wrapper);
12602+
function("mj_geomDistance", &mj_geomDistance_wrapper);
1257512603
function("mj_contactForce", &mj_contactForce_wrapper);
12604+
function("mj_differentiatePos", &mj_differentiatePos_wrapper);
12605+
function("mj_integratePos", &mj_integratePos_wrapper);
12606+
function("mj_normalizeQuat", &mj_normalizeQuat_wrapper);
1257612607
function("mj_local2Global", &mj_local2Global_wrapper);
1257712608
function("mj_getTotalmass", &mj_getTotalmass_wrapper);
1257812609
function("mj_setTotalmass", &mj_setTotalmass_wrapper);
1257912610
function("mj_versionString", &mj_versionString_wrapper);
12611+
function("mj_multiRay", &mj_multiRay_wrapper);
1258012612
function("mj_ray", &mj_ray_wrapper);
1258112613
function("mj_rayHfield", &mj_rayHfield_wrapper);
1258212614
function("mj_rayMesh", &mj_rayMesh_wrapper);
@@ -12631,7 +12663,34 @@ EMSCRIPTEN_BINDINGS(mujoco_functions) {
1263112663
function("mju_unit4", &mju_unit4_wrapper);
1263212664
function("mju_copy4", &mju_copy4_wrapper);
1263312665
function("mju_normalize4", &mju_normalize4_wrapper);
12666+
function("mju_zero", &mju_zero_wrapper);
12667+
function("mju_fill", &mju_fill_wrapper);
12668+
function("mju_copy", &mju_copy_wrapper);
12669+
function("mju_sum", &mju_sum_wrapper);
12670+
function("mju_L1", &mju_L1_wrapper);
12671+
function("mju_scl", &mju_scl_wrapper);
12672+
function("mju_add", &mju_add_wrapper);
12673+
function("mju_sub", &mju_sub_wrapper);
12674+
function("mju_addTo", &mju_addTo_wrapper);
12675+
function("mju_subFrom", &mju_subFrom_wrapper);
12676+
function("mju_addToScl", &mju_addToScl_wrapper);
12677+
function("mju_addScl", &mju_addScl_wrapper);
12678+
function("mju_normalize", &mju_normalize_wrapper);
12679+
function("mju_norm", &mju_norm_wrapper);
12680+
function("mju_dot", &mju_dot_wrapper);
12681+
function("mju_mulMatVec", &mju_mulMatVec_wrapper);
12682+
function("mju_mulMatTVec", &mju_mulMatTVec_wrapper);
12683+
function("mju_mulVecMatVec", &mju_mulVecMatVec_wrapper);
12684+
function("mju_transpose", &mju_transpose_wrapper);
12685+
function("mju_symmetrize", &mju_symmetrize_wrapper);
12686+
function("mju_eye", &mju_eye_wrapper);
12687+
function("mju_mulMatMat", &mju_mulMatMat_wrapper);
12688+
function("mju_mulMatMatT", &mju_mulMatMatT_wrapper);
12689+
function("mju_mulMatTMat", &mju_mulMatTMat_wrapper);
12690+
function("mju_sqrMatTD", &mju_sqrMatTD_wrapper);
1263412691
function("mju_transformSpatial", &mju_transformSpatial_wrapper);
12692+
function("mju_dense2sparse", &mju_dense2sparse_wrapper);
12693+
function("mju_sparse2dense", &mju_sparse2dense_wrapper);
1263512694
function("mju_rotVecQuat", &mju_rotVecQuat_wrapper);
1263612695
function("mju_negQuat", &mju_negQuat_wrapper);
1263712696
function("mju_mulQuat", &mju_mulQuat_wrapper);
@@ -12649,15 +12708,36 @@ EMSCRIPTEN_BINDINGS(mujoco_functions) {
1264912708
function("mju_mulPose", &mju_mulPose_wrapper);
1265012709
function("mju_negPose", &mju_negPose_wrapper);
1265112710
function("mju_trnVecPose", &mju_trnVecPose_wrapper);
12711+
function("mju_cholFactor", &mju_cholFactor_wrapper);
12712+
function("mju_cholSolve", &mju_cholSolve_wrapper);
12713+
function("mju_cholUpdate", &mju_cholUpdate_wrapper);
12714+
function("mju_cholFactorBand", &mju_cholFactorBand_wrapper);
12715+
function("mju_cholSolveBand", &mju_cholSolveBand_wrapper);
12716+
function("mju_band2Dense", &mju_band2Dense_wrapper);
12717+
function("mju_dense2Band", &mju_dense2Band_wrapper);
12718+
function("mju_bandMulMatVec", &mju_bandMulMatVec_wrapper);
1265212719
function("mju_eig3", &mju_eig3_wrapper);
12720+
function("mju_boxQP", &mju_boxQP_wrapper);
1265312721
function("mju_muscleGain", &mju_muscleGain_wrapper);
1265412722
function("mju_muscleBias", &mju_muscleBias_wrapper);
1265512723
function("mju_muscleDynamics", &mju_muscleDynamics_wrapper);
12724+
function("mju_encodePyramid", &mju_encodePyramid_wrapper);
12725+
function("mju_decodePyramid", &mju_decodePyramid_wrapper);
1265612726
function("mju_type2Str", &mju_type2Str_wrapper);
1265712727
function("mju_str2Type", &mju_str2Type_wrapper);
1265812728
function("mju_writeNumBytes", &mju_writeNumBytes_wrapper);
1265912729
function("mju_warningText", &mju_warningText_wrapper);
12730+
function("mju_isZero", &mju_isZero_wrapper);
1266012731
function("mju_standardNormal", &mju_standardNormal_wrapper);
12732+
function("mju_f2n", &mju_f2n_wrapper);
12733+
function("mju_n2f", &mju_n2f_wrapper);
12734+
function("mju_d2n", &mju_d2n_wrapper);
12735+
function("mju_n2d", &mju_n2d_wrapper);
12736+
function("mju_insertionSort", &mju_insertionSort_wrapper);
12737+
function("mju_insertionSortInt", &mju_insertionSortInt_wrapper);
12738+
function("mjd_transitionFD", &mjd_transitionFD_wrapper);
12739+
function("mjd_inverseFD", &mjd_inverseFD_wrapper);
12740+
function("mjd_subQuat", &mjd_subQuat_wrapper);
1266112741
function("mjd_quatIntegrate", &mjd_quatIntegrate_wrapper);
1266212742
function("mjs_attach", &mjs_attach_wrapper);
1266312743
function("mjs_addBody", &mjs_addBody_wrapper);
@@ -12778,87 +12858,6 @@ EMSCRIPTEN_BINDINGS(mujoco_functions) {
1277812858
function("mjs_asTexture", &mjs_asTexture_wrapper);
1277912859
function("mjs_asMaterial", &mjs_asMaterial_wrapper);
1278012860
function("mjs_asPlugin", &mjs_asPlugin_wrapper);
12781-
12782-
function("parseXMLString", &parseXMLString, take_ownership());
12783-
function("error", &error_wrapper);
12784-
function("mju_printMatSparse", &mju_printMatSparse_wrapper);
12785-
function("mj_solveM", &mj_solveM_wrapper);
12786-
function("mj_solveM2", &mj_solveM2_wrapper);
12787-
function("mj_rne", &mj_rne_wrapper);
12788-
function("mj_saveLastXML", &mj_saveLastXML_wrapper);
12789-
function("mj_setLengthRange", &mj_setLengthRange_wrapper);
12790-
function("mj_constraintUpdate", &mj_constraintUpdate_wrapper);
12791-
function("mj_getState", &mj_getState_wrapper);
12792-
function("mj_setState", &mj_setState_wrapper);
12793-
function("mj_mulJacVec", &mj_mulJacVec_wrapper);
12794-
function("mj_mulJacTVec", &mj_mulJacTVec_wrapper);
12795-
function("mj_jac", &mj_jac_wrapper);
12796-
function("mj_jacBody", &mj_jacBody_wrapper);
12797-
function("mj_jacBodyCom", &mj_jacBodyCom_wrapper);
12798-
function("mj_jacSubtreeCom", &mj_jacSubtreeCom_wrapper);
12799-
function("mj_jacGeom", &mj_jacGeom_wrapper);
12800-
function("mj_jacSite", &mj_jacSite_wrapper);
12801-
function("mj_jacPointAxis", &mj_jacPointAxis_wrapper);
12802-
function("mj_jacDot", &mj_jacDot_wrapper);
12803-
function("mj_angmomMat", &mj_angmomMat_wrapper);
12804-
function("mj_fullM", &mj_fullM_wrapper);
12805-
function("mj_mulM", &mj_mulM_wrapper);
12806-
function("mj_mulM2", &mj_mulM2_wrapper);
12807-
function("mj_addM", &mj_addM_wrapper);
12808-
function("mj_applyFT", &mj_applyFT_wrapper);
12809-
function("mj_geomDistance", &mj_geomDistance_wrapper);
12810-
function("mj_differentiatePos", &mj_differentiatePos_wrapper);
12811-
function("mj_integratePos", &mj_integratePos_wrapper);
12812-
function("mj_normalizeQuat", &mj_normalizeQuat_wrapper);
12813-
function("mj_multiRay", &mj_multiRay_wrapper);
12814-
function("mju_zero", &mju_zero_wrapper);
12815-
function("mju_fill", &mju_fill_wrapper);
12816-
function("mju_copy", &mju_copy_wrapper);
12817-
function("mju_sum", &mju_sum_wrapper);
12818-
function("mju_L1", &mju_L1_wrapper);
12819-
function("mju_scl", &mju_scl_wrapper);
12820-
function("mju_add", &mju_add_wrapper);
12821-
function("mju_sub", &mju_sub_wrapper);
12822-
function("mju_addTo", &mju_addTo_wrapper);
12823-
function("mju_subFrom", &mju_subFrom_wrapper);
12824-
function("mju_addToScl", &mju_addToScl_wrapper);
12825-
function("mju_addScl", &mju_addScl_wrapper);
12826-
function("mju_normalize", &mju_normalize_wrapper);
12827-
function("mju_norm", &mju_norm_wrapper);
12828-
function("mju_dot", &mju_dot_wrapper);
12829-
function("mju_mulMatVec", &mju_mulMatVec_wrapper);
12830-
function("mju_mulMatTVec", &mju_mulMatTVec_wrapper);
12831-
function("mju_mulVecMatVec", &mju_mulVecMatVec_wrapper);
12832-
function("mju_transpose", &mju_transpose_wrapper);
12833-
function("mju_symmetrize", &mju_symmetrize_wrapper);
12834-
function("mju_eye", &mju_eye_wrapper);
12835-
function("mju_mulMatMat", &mju_mulMatMat_wrapper);
12836-
function("mju_mulMatMatT", &mju_mulMatMatT_wrapper);
12837-
function("mju_mulMatTMat", &mju_mulMatTMat_wrapper);
12838-
function("mju_sqrMatTD", &mju_sqrMatTD_wrapper);
12839-
function("mju_dense2sparse", &mju_dense2sparse_wrapper);
12840-
function("mju_sparse2dense", &mju_sparse2dense_wrapper);
12841-
function("mju_cholFactor", &mju_cholFactor_wrapper);
12842-
function("mju_cholSolve", &mju_cholSolve_wrapper);
12843-
function("mju_cholUpdate", &mju_cholUpdate_wrapper);
12844-
function("mju_cholFactorBand", &mju_cholFactorBand_wrapper);
12845-
function("mju_cholSolveBand", &mju_cholSolveBand_wrapper);
12846-
function("mju_band2Dense", &mju_band2Dense_wrapper);
12847-
function("mju_dense2Band", &mju_dense2Band_wrapper);
12848-
function("mju_bandMulMatVec", &mju_bandMulMatVec_wrapper);
12849-
function("mju_boxQP", &mju_boxQP_wrapper);
12850-
function("mju_encodePyramid", &mju_encodePyramid_wrapper);
12851-
function("mju_decodePyramid", &mju_decodePyramid_wrapper);
12852-
function("mju_isZero", &mju_isZero_wrapper);
12853-
function("mju_f2n", &mju_f2n_wrapper);
12854-
function("mju_n2f", &mju_n2f_wrapper);
12855-
function("mju_d2n", &mju_d2n_wrapper);
12856-
function("mju_n2d", &mju_n2d_wrapper);
12857-
function("mju_insertionSort", &mju_insertionSort_wrapper);
12858-
function("mju_insertionSortInt", &mju_insertionSortInt_wrapper);
12859-
function("mjd_transitionFD", &mjd_transitionFD_wrapper);
12860-
function("mjd_inverseFD", &mjd_inverseFD_wrapper);
12861-
function("mjd_subQuat", &mjd_subQuat_wrapper);
1286212861
class_<WasmBuffer<float>>("FloatBuffer")
1286312862
.constructor<int>()
1286412863
.class_function("FromArray", &WasmBuffer<float>::FromArray)

wasm/codegen/generators/binding_builder.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from introspect import functions as introspect_functions
1818

1919
from wasm.codegen.generators import common
20-
from wasm.codegen.generators import constants
2120
from wasm.codegen.generators import enums
2221
from wasm.codegen.generators import functions
2322
from wasm.codegen.generators import structs
@@ -53,8 +52,7 @@ def set_functions(self):
5352
functions_to_bind: dict[str, ast_nodes.FunctionDecl] = {}
5453
for name, func in introspect_functions.FUNCTIONS.items():
5554
if not functions.is_excluded_function_name(name):
56-
if name not in constants.BOUNDCHECK_FUNCS:
57-
functions_to_bind[name] = func
55+
functions_to_bind[name] = func
5856

5957
generator = functions.Generator(functions_to_bind)
6058
self.markers_and_content += generator.generate()

wasm/codegen/generators/functions.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -366,18 +366,18 @@ def _generate_wrappers(self) -> str:
366366

367367
code = []
368368
for func in self.wrapper_bind_functions:
369-
wrapper_code = generate_function_wrapper(func)
370-
code.append(wrapper_code)
369+
if func.name not in constants.BOUNDCHECK_FUNCS:
370+
wrapper_code = generate_function_wrapper(func)
371+
code.append(wrapper_code)
371372

372373
return "\n\n".join(code)
373374

374-
def _generate_direct_bindable_functions(self) -> str:
375+
def _generate_direct_bindable_functions(self) -> list[str]:
375376
"""Generates Embind bindings for all directly bindable functions."""
376377

377-
result = ""
378+
result = []
378379
for func in self.direct_bind_functions:
379-
result += code_builder.INDENT
380-
result += self._generate_function_binding(func)
380+
result.append(self._generate_function_binding(func))
381381

382382
return result
383383

@@ -390,15 +390,14 @@ def _generate_function_binding(
390390
if is_wrapper:
391391
cpp_func += "_wrapper"
392392

393-
return f'function("{js_name}", &{cpp_func});\n'
393+
return f'function("{js_name}", &{cpp_func});'
394394

395-
def _generate_wrapper_bindable_functions(self) -> str:
395+
def _generate_wrapper_bindable_functions(self) -> list[str]:
396396
"""Generates Embind bindings for all functions that need wrappers."""
397397

398-
result = ""
398+
result = []
399399
for func in self.wrapper_bind_functions:
400-
result += code_builder.INDENT
401-
result += self._generate_function_binding(func, True)
400+
result.append(self._generate_function_binding(func, True))
402401

403402
return result
404403

@@ -411,5 +410,5 @@ def generate(self) -> list[tuple[str, list[str]]]:
411410

412411
return [
413412
("// {{ WRAPPER_FUNCTIONS }}", [wrapper_functions]),
414-
("// {{ FUNCTION_BINDINGS }}", [function_bindings]),
413+
("// {{ FUNCTION_BINDINGS }}", ["\n".join(function_bindings)]),
415414
]

0 commit comments

Comments
 (0)