From dbd451138c673aba6cc38efecda5e37a510e5e1b Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Sat, 2 May 2026 00:13:09 -0700 Subject: [PATCH] Add flex_bendingadr to mjModel. PiperOrigin-RevId: 909088123 Change-Id: If062335d0aa3702c1e0b082dd9e29c3be0e76ea6 --- doc/includes/references.h | 4 +- include/mujoco/mjmodel.h | 4 +- include/mujoco/mjxmacro.h | 4 +- python/mujoco/introspect/structs.py | 15 +++- src/engine/engine_io.c | 29 +++---- src/engine/engine_io.h | 10 +-- src/user/user_model.cc | 111 ++++++++++++++------------- src/user/user_model.h | 1 + unity/Runtime/Bindings/MjBindings.cs | 2 + wasm/codegen/generated/bindings.cc | 13 +++- 10 files changed, 115 insertions(+), 78 deletions(-) diff --git a/doc/includes/references.h b/doc/includes/references.h index 4d767933..c594a32d 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -1041,6 +1041,7 @@ struct mjModel_ { mjtSize nflexelem; // number of elements in all flexes mjtSize nflexelemdata; // number of element vertex ids in all flexes mjtSize nflexstiffness; // number of stiffness parameters in all flexes + mjtSize nflexbending; // number of bending parameters in all flexes mjtSize nflexelemedge; // number of element edge ids in all flexes mjtSize nflexshelldata; // number of shell fragment vertex ids in all flexes mjtSize nflexevpair; // number of element-vertex pairs in all flexes @@ -1328,6 +1329,7 @@ struct mjModel_ { int* flex_elemdataadr; // first element vertex id address (nflex x 1) int* flex_stiffnessadr; // stiffness matrix address (nflex x 1) int* flex_elemedgeadr; // first element edge id address (nflex x 1) + int* flex_bendingadr; // first bending data address (nflex x 1) int* flex_shellnum; // number of shells (nflex x 1) int* flex_shelldataadr; // first shell data address (nflex x 1) int* flex_evpairadr; // first evpair address (nflex x 1) @@ -1356,7 +1358,7 @@ struct mjModel_ { mjtNum* flex_radius; // radius around primitive element (nflex x 1) mjtNum* flex_size; // vertex bounding box half sizes in qpos0 (nflex x 3) mjtNum* flex_stiffness; // finite element stiffness matrix (nflexstiffness x 1) - mjtNum* flex_bending; // bending stiffness (nflexedge x 17) + mjtNum* flex_bending; // bending stiffness (nflexbending x 1) mjtNum* flex_damping; // Rayleigh's damping coefficient (nflex x 1) mjtNum* flex_edgestiffness; // edge stiffness (nflex x 1) mjtNum* flex_edgedamping; // edge damping (nflex x 1) diff --git a/include/mujoco/mjmodel.h b/include/mujoco/mjmodel.h index 1c9214ae..ec2c8250 100644 --- a/include/mujoco/mjmodel.h +++ b/include/mujoco/mjmodel.h @@ -704,6 +704,7 @@ struct mjModel_ { mjtSize nflexelem; // number of elements in all flexes mjtSize nflexelemdata; // number of element vertex ids in all flexes mjtSize nflexstiffness; // number of stiffness parameters in all flexes + mjtSize nflexbending; // number of bending parameters in all flexes mjtSize nflexelemedge; // number of element edge ids in all flexes mjtSize nflexshelldata; // number of shell fragment vertex ids in all flexes mjtSize nflexevpair; // number of element-vertex pairs in all flexes @@ -991,6 +992,7 @@ struct mjModel_ { int* flex_elemdataadr; // first element vertex id address (nflex x 1) int* flex_stiffnessadr; // stiffness matrix address (nflex x 1) int* flex_elemedgeadr; // first element edge id address (nflex x 1) + int* flex_bendingadr; // first bending data address (nflex x 1) int* flex_shellnum; // number of shells (nflex x 1) int* flex_shelldataadr; // first shell data address (nflex x 1) int* flex_evpairadr; // first evpair address (nflex x 1) @@ -1019,7 +1021,7 @@ struct mjModel_ { mjtNum* flex_radius; // radius around primitive element (nflex x 1) mjtNum* flex_size; // vertex bounding box half sizes in qpos0 (nflex x 3) mjtNum* flex_stiffness; // finite element stiffness matrix (nflexstiffness x 1) - mjtNum* flex_bending; // bending stiffness (nflexedge x 17) + mjtNum* flex_bending; // bending stiffness (nflexbending x 1) mjtNum* flex_damping; // Rayleigh's damping coefficient (nflex x 1) mjtNum* flex_edgestiffness; // edge stiffness (nflex x 1) mjtNum* flex_edgedamping; // edge damping (nflex x 1) diff --git a/include/mujoco/mjxmacro.h b/include/mujoco/mjxmacro.h index 4efaf94b..080cbc07 100644 --- a/include/mujoco/mjxmacro.h +++ b/include/mujoco/mjxmacro.h @@ -186,6 +186,7 @@ X( nflexelem ) \ X( nflexelemdata ) \ X( nflexstiffness ) \ + X( nflexbending ) \ X( nflexelemedge ) \ X( nflexshelldata ) \ X( nflexevpair ) \ @@ -467,6 +468,7 @@ X ( int, flex_elemdataadr, nflex, 1 ) \ X ( int, flex_stiffnessadr, nflex, 1 ) \ X ( int, flex_elemedgeadr, nflex, 1 ) \ + X ( int, flex_bendingadr, nflex, 1 ) \ X ( int, flex_shellnum, nflex, 1 ) \ X ( int, flex_shelldataadr, nflex, 1 ) \ X ( int, flex_evpairadr, nflex, 1 ) \ @@ -495,7 +497,7 @@ X ( mjtNum, flex_radius, nflex, 1 ) \ X ( mjtNum, flex_size, nflex, 3 ) \ X ( mjtNum, flex_stiffness, nflexstiffness, 1 ) \ - X ( mjtNum, flex_bending, nflexedge, 17 ) \ + X ( mjtNum, flex_bending, nflexbending, 1 ) \ X ( mjtNum, flex_damping, nflex, 1 ) \ X ( mjtNum, flex_edgestiffness, nflex, 1 ) \ X ( mjtNum, flex_edgedamping, nflex, 1 ) \ diff --git a/python/mujoco/introspect/structs.py b/python/mujoco/introspect/structs.py index 9bd45295..6ce4cb62 100644 --- a/python/mujoco/introspect/structs.py +++ b/python/mujoco/introspect/structs.py @@ -977,6 +977,11 @@ STRUCTS: Mapping[str, StructDecl] = dict([ type=ValueType(name='mjtSize'), doc='number of stiffness parameters in all flexes', ), + StructFieldDecl( + name='nflexbending', + type=ValueType(name='mjtSize'), + doc='number of bending parameters in all flexes', + ), StructFieldDecl( name='nflexelemedge', type=ValueType(name='mjtSize'), @@ -2772,6 +2777,14 @@ STRUCTS: Mapping[str, StructDecl] = dict([ doc='first element edge id address', array_extent=('nflex',), ), + StructFieldDecl( + name='flex_bendingadr', + type=PointerType( + inner_type=ValueType(name='int'), + ), + doc='first bending data address', + array_extent=('nflex',), + ), StructFieldDecl( name='flex_shellnum', type=PointerType( @@ -3002,7 +3015,7 @@ STRUCTS: Mapping[str, StructDecl] = dict([ inner_type=ValueType(name='mjtNum'), ), doc='bending stiffness', - array_extent=('nflexedge', 17), + array_extent=('nflexbending',), ), StructFieldDecl( name='flex_damping', diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index 33fafe6c..77dd0063 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -205,9 +205,9 @@ void mj_makeModel(mjModel** dest, mjtSize nbvhdynamic, mjtSize noct, mjtSize njnt, mjtSize ntree, mjtSize nM, mjtSize nB, mjtSize nC, mjtSize nD, mjtSize ngeom, mjtSize nsite, mjtSize ncam, mjtSize nlight, mjtSize nflex, mjtSize nflexnode, mjtSize nflexvert, mjtSize nflexedge, mjtSize nflexelem, - mjtSize nflexelemdata, mjtSize nflexstiffness, mjtSize nflexelemedge, mjtSize nflexshelldata, - mjtSize nflexevpair, mjtSize nflextexcoord, mjtSize nJfe, mjtSize nJfv, mjtSize nmesh, - mjtSize nmeshvert, mjtSize nmeshnormal, mjtSize nmeshtexcoord, mjtSize nmeshface, + mjtSize nflexelemdata, mjtSize nflexstiffness, mjtSize nflexbending, mjtSize nflexelemedge, + mjtSize nflexshelldata, mjtSize nflexevpair, mjtSize nflextexcoord, mjtSize nJfe, mjtSize nJfv, + mjtSize nmesh, mjtSize nmeshvert, mjtSize nmeshnormal, mjtSize nmeshtexcoord, mjtSize nmeshface, mjtSize nmeshgraph, mjtSize nmeshpoly, mjtSize nmeshpolyvert, mjtSize nmeshpolymap, mjtSize nskin, mjtSize nskinvert, mjtSize nskintexvert, mjtSize nskinface, mjtSize nskinbone, mjtSize nskinbonevert, mjtSize nhfield, mjtSize nhfielddata, mjtSize ntex, mjtSize ntexdata, @@ -294,6 +294,7 @@ void mj_makeModel(mjModel** dest, m->nflexelem = nflexelem; m->nflexelemdata = nflexelemdata; m->nflexstiffness = nflexstiffness; + m->nflexbending = nflexbending; m->nflexelemedge = nflexelemedge; m->nflexshelldata = nflexshelldata; m->nflexevpair = nflexevpair; @@ -405,16 +406,16 @@ mjModel* mj_copyModel(mjModel* dest, const mjModel* src) { src->nbvhdynamic, src->noct, src->njnt, src->ntree, src->nM, src->nB, src->nC, src->nD, src->ngeom, src->nsite, src->ncam, src->nlight, src->nflex, src->nflexnode, src->nflexvert, src->nflexedge, src->nflexelem, src->nflexelemdata, src->nflexstiffness, - src->nflexelemedge, src->nflexshelldata, src->nflexevpair, src->nflextexcoord, src->nJfe, - src->nJfv, src->nmesh, src->nmeshvert, src->nmeshnormal, src->nmeshtexcoord, src->nmeshface, - src->nmeshgraph, src->nmeshpoly, src->nmeshpolyvert, src->nmeshpolymap, src->nskin, - src->nskinvert, src->nskintexvert, src->nskinface, src->nskinbone, src->nskinbonevert, - src->nhfield, src->nhfielddata, src->ntex, src->ntexdata, src->nmat, src->npair, - src->nexclude, src->neq, src->ntendon, src->nJten, src->nwrap, src->nsensor, src->nnumeric, - src->nnumericdata, src->ntext, src->ntextdata, src->ntuple, src->ntupledata, src->nkey, - src->nmocap, src->nplugin, src->npluginattr, src->nuser_body, src->nuser_jnt, - src->nuser_geom, src->nuser_site, src->nuser_cam, src->nuser_tendon, src->nuser_actuator, - src->nuser_sensor, src->nnames, src->npaths); + src->nflexbending, src->nflexelemedge, src->nflexshelldata, src->nflexevpair, + src->nflextexcoord, src->nJfe, src->nJfv, src->nmesh, src->nmeshvert, src->nmeshnormal, + src->nmeshtexcoord, src->nmeshface, src->nmeshgraph, src->nmeshpoly, src->nmeshpolyvert, + src->nmeshpolymap, src->nskin, src->nskinvert, src->nskintexvert, src->nskinface, + src->nskinbone, src->nskinbonevert, src->nhfield, src->nhfielddata, src->ntex, + src->ntexdata, src->nmat, src->npair, src->nexclude, src->neq, src->ntendon, src->nJten, + src->nwrap, src->nsensor, src->nnumeric, src->nnumericdata, src->ntext, src->ntextdata, + src->ntuple, src->ntupledata, src->nkey, src->nmocap, src->nplugin, src->npluginattr, + src->nuser_body, src->nuser_jnt, src->nuser_geom, src->nuser_site, src->nuser_cam, + src->nuser_tendon, src->nuser_actuator, src->nuser_sensor, src->nnames, src->npaths); } if (!dest) { mjERROR("failed to make mjModel. Invalid sizes."); @@ -597,7 +598,7 @@ mjModel* mj_loadModelBuffer(const void* buffer, int buffer_sz) { sizes[56], sizes[57], sizes[58], sizes[59], sizes[60], sizes[61], sizes[62], sizes[63], sizes[64], sizes[65], sizes[66], sizes[67], sizes[68], sizes[69], sizes[70], sizes[71], sizes[72], sizes[73], sizes[74], sizes[75], sizes[76], - sizes[77], sizes[78]); + sizes[77], sizes[78], sizes[79]); // mj_makeModel may fail if the input buffer has invalid sizes if (!m) { diff --git a/src/engine/engine_io.h b/src/engine/engine_io.h index 1aedaf86..dccd55a4 100644 --- a/src/engine/engine_io.h +++ b/src/engine/engine_io.h @@ -52,11 +52,11 @@ void mj_makeModel(mjModel** dest, mjtSize nbvhdynamic, mjtSize noct, mjtSize njnt, mjtSize ntree, mjtSize nM, mjtSize nB, mjtSize nC, mjtSize nD, mjtSize ngeom, mjtSize nsite, mjtSize ncam, mjtSize nlight, mjtSize nflex, mjtSize nflexnode, mjtSize nflexvert, mjtSize nflexedge, mjtSize nflexelem, - mjtSize nflexelemdata, mjtSize nflexstiffness, mjtSize nflexelemedge, mjtSize nflexshelldata, mjtSize nflexevpair, - mjtSize nflextexcoord, mjtSize nJfe, mjtSize nJfv, mjtSize nmesh, mjtSize nmeshvert, - mjtSize nmeshnormal, mjtSize nmeshtexcoord, mjtSize nmeshface, mjtSize nmeshgraph, - mjtSize nmeshpoly, mjtSize nmeshpolyvert, mjtSize nmeshpolymap, mjtSize nskin, - mjtSize nskinvert, mjtSize nskintexvert, mjtSize nskinface, mjtSize nskinbone, + mjtSize nflexelemdata, mjtSize nflexstiffness, mjtSize nflexbending, mjtSize nflexelemedge, + mjtSize nflexshelldata, mjtSize nflexevpair, mjtSize nflextexcoord, mjtSize nJfe, mjtSize nJfv, + mjtSize nmesh, mjtSize nmeshvert, mjtSize nmeshnormal, mjtSize nmeshtexcoord, mjtSize nmeshface, + mjtSize nmeshgraph, mjtSize nmeshpoly, mjtSize nmeshpolyvert, mjtSize nmeshpolymap, + mjtSize nskin, mjtSize nskinvert, mjtSize nskintexvert, mjtSize nskinface, mjtSize nskinbone, mjtSize nskinbonevert, mjtSize nhfield, mjtSize nhfielddata, mjtSize ntex, mjtSize ntexdata, mjtSize nmat, mjtSize npair, mjtSize nexclude, mjtSize neq, mjtSize ntendon, mjtSize nJten, mjtSize nwrap, mjtSize nsensor, mjtSize nnumeric, mjtSize nnumericdata, mjtSize ntext, diff --git a/src/user/user_model.cc b/src/user/user_model.cc index 6c33cdec..e85cbe64 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -1195,6 +1195,7 @@ void mjCModel::Clear() { nflexelem = 0; nflexelemdata = 0; nflexstiffness = 0; + nflexbending = 0; nflexelemedge = 0; nflexshelldata = 0; nflexevpair = 0; @@ -2105,6 +2106,21 @@ static size_t getpathslength(std::vector list) { return result; } +// compute extra stiffness/bending array size for an interpolated flex +static int flexInterpExtraSize(int order, const int cellcount[3], bool shell) { + int npe, nelem; + int cx = cellcount[0], cy = cellcount[1], cz = cellcount[2]; + if (shell) { + npe = (int)pow(order + 1, 2); + nelem = 2*(cy*cz + cx*cz + cx*cy); + } else { + npe = (int)pow(order + 1, 3); + nelem = cx * cy * cz; + } + int ndof_elem = 3 * npe; + return nelem * ndof_elem * ndof_elem; +} + // set array sizes void mjCModel::SetSizes() { // set from object list sizes @@ -2179,6 +2195,7 @@ void mjCModel::SetSizes() { nbvh = nbvhstatic + nbvhdynamic; int extra_stiffness_size = 0; + int extra_bending_size = 0; // flex counts for (int i=0; i < nflex; i++) { nflexnode += flexes_[i]->nnode; @@ -2191,20 +2208,11 @@ void mjCModel::SetSizes() { nflexevpair += (int)flexes_[i]->evpair.size()/2; nflextexcoord += (flexes_[i]->HasTexcoord() ? flexes_[i]->get_texcoord().size()/2 : 0); if (flexes_[i]->spec.order != 0) { - int cx = flexes_[i]->spec.cellcount[0]; - int cy = flexes_[i]->spec.cellcount[1]; - int cz = flexes_[i]->spec.cellcount[2]; - bool shell = (flexes_[i]->elastic2d != 0); - int npe, nelem; - if (shell) { - npe = (int)pow(flexes_[i]->spec.order + 1, 2); - nelem = 2*(cy*cz + cx*cz + cx*cy); - } else { - npe = (int)pow(flexes_[i]->spec.order + 1, 3); - nelem = cx * cy * cz; - } - int ndof_elem = 3 * npe; - extra_stiffness_size += nelem * ndof_elem * ndof_elem; + int extra_size = flexInterpExtraSize( + flexes_[i]->spec.order, flexes_[i]->spec.cellcount, + flexes_[i]->elastic2d != 0); + extra_stiffness_size += extra_size; + extra_bending_size += extra_size; } if (flexes_[i]->interpolated || flexes_[i]->rigid) { continue; @@ -2256,8 +2264,9 @@ void mjCModel::SetSizes() { } } // TODO: This can be compacted further when we update mjwarp to not rely on - // 21*elem_adr for non-interpolated flexes. + // 21*elem_adr for non-interpolated flexes and 17*edge_adr for bending. nflexstiffness = nflexelem * 21 + extra_stiffness_size; + nflexbending = nflexedge * 17 + extra_bending_size; // mesh counts for (int i=0; i < nmesh; i++) { @@ -3458,6 +3467,8 @@ void mjCModel::CopyObjects(mjModel* m) { texcoord_adr = 0; int standard_stiffness_size = 21 * m->nflexelem; int current_extra_stiffness_adr = standard_stiffness_size; + int standard_bending_size = 17 * m->nflexedge; + int current_extra_bending_adr = standard_bending_size; for (int i=0; i < nflex; i++) { // get pointer mjCFlex* pfl = flexes_[i]; @@ -3484,20 +3495,8 @@ void mjCModel::CopyObjects(mjModel* m) { m->flex_stiffnessadr[i] = 21 * elem_adr; } else { m->flex_stiffnessadr[i] = current_extra_stiffness_adr; - int pcx = pfl->spec.cellcount[0]; - int pcy = pfl->spec.cellcount[1]; - int pcz = pfl->spec.cellcount[2]; - bool shell = (pfl->elastic2d != 0); - int npe, nelem; - if (shell) { - npe = (int)pow(pfl->spec.order + 1, 2); - nelem = 2*(pcy*pcz + pcx*pcz + pcx*pcy); - } else { - npe = (int)pow(pfl->spec.order + 1, 3); - nelem = pcx * pcy * pcz; - } - int ndof_elem = 3 * npe; - current_extra_stiffness_adr += nelem * ndof_elem * ndof_elem; + current_extra_stiffness_adr += flexInterpExtraSize( + pfl->spec.order, pfl->spec.cellcount, pfl->elastic2d != 0); } if (!pfl->stiffness.empty()) { @@ -3508,27 +3507,30 @@ void mjCModel::CopyObjects(mjModel* m) { if (pfl->spec.order == 0) { stiff_size = 21 * pfl->nelem; } else { - int scx = pfl->spec.cellcount[0]; - int scy = pfl->spec.cellcount[1]; - int scz = pfl->spec.cellcount[2]; - bool shell = (pfl->elastic2d != 0); - int npe, sncells; - if (shell) { - npe = (int)pow(pfl->spec.order + 1, 2); - sncells = 2*(scy*scz + scx*scz + scx*scy); - } else { - npe = (int)pow(pfl->spec.order + 1, 3); - sncells = scx * scy * scz; - } - int ndof_elem = 3 * npe; - stiff_size = sncells * ndof_elem * ndof_elem; + stiff_size = flexInterpExtraSize( + pfl->spec.order, pfl->spec.cellcount, pfl->elastic2d != 0); } mjuu_zerovec(m->flex_stiffness + m->flex_stiffnessadr[i], stiff_size); } - if (!pfl->bending.empty()) { - mjuu_copyvec(m->flex_bending + 17 * edge_adr, pfl->bending.data(), pfl->bending.size()); + if (pfl->spec.order == 0) { + m->flex_bendingadr[i] = 17 * edge_adr; } else { - mjuu_zerovec(m->flex_bending + 17 * edge_adr, 17 * pfl->nedge); + m->flex_bendingadr[i] = current_extra_bending_adr; + current_extra_bending_adr += flexInterpExtraSize( + pfl->spec.order, pfl->spec.cellcount, pfl->elastic2d != 0); + } + + if (!pfl->bending.empty()) { + mjuu_copyvec(m->flex_bending + m->flex_bendingadr[i], pfl->bending.data(), pfl->bending.size()); + } else { + int bending_size; + if (pfl->spec.order == 0) { + bending_size = 17 * pfl->nedge; + } else { + bending_size = flexInterpExtraSize( + pfl->spec.order, pfl->spec.cellcount, pfl->elastic2d != 0); + } + mjuu_zerovec(m->flex_bending + m->flex_bendingadr[i], bending_size); } m->flex_damping[i] = (mjtNum)pfl->damping; @@ -3602,7 +3604,8 @@ void mjCModel::CopyObjects(mjModel* m) { } if (!pfl->rigid && m->flex_edgeequality[i] == 0 && - !pfl->edgestiffness && !pfl->edgedamping && !pfl->damping) { + !pfl->edgestiffness && !pfl->edgedamping && !pfl->damping && + pfl->bending.empty()) { mju_warning("flex '%s' is not rigid and has no equality constraints " "or passive forces", pfl->name.c_str()); } @@ -5209,13 +5212,13 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { mj_makeModel(&m, nq, nv, nu, na, nbody, nbvh, nbvhstatic, nbvhdynamic, noct, njnt, ntree, nM, nB, nC, nD, ngeom, nsite, ncam, nlight, nflex, nflexnode, nflexvert, nflexedge, nflexelem, - nflexelemdata, nflexstiffness, nflexelemedge, nflexshelldata, nflexevpair, - nflextexcoord, nJfe, nJfv, nmesh, nmeshvert, nmeshnormal, nmeshtexcoord, nmeshface, - nmeshgraph, nmeshpoly, nmeshpolyvert, nmeshpolymap, nskin, nskinvert, nskintexvert, - nskinface, nskinbone, nskinbonevert, nhfield, nhfielddata, ntex, ntexdata, nmat, - npair, nexclude, neq, ntendon, nJten, nwrap, nsensor, nnumeric, nnumericdata, ntext, - ntextdata, ntuple, ntupledata, nkey, nmocap, nplugin, npluginattr, - nuser_body, nuser_jnt, nuser_geom, nuser_site, nuser_cam, + nflexelemdata, nflexstiffness, nflexbending, nflexelemedge, nflexshelldata, + nflexevpair, nflextexcoord, nJfe, nJfv, nmesh, nmeshvert, nmeshnormal, nmeshtexcoord, + nmeshface, nmeshgraph, nmeshpoly, nmeshpolyvert, nmeshpolymap, nskin, nskinvert, + nskintexvert, nskinface, nskinbone, nskinbonevert, nhfield, nhfielddata, ntex, + ntexdata, nmat, npair, nexclude, neq, ntendon, nJten, nwrap, nsensor, nnumeric, + nnumericdata, ntext, ntextdata, ntuple, ntupledata, nkey, nmocap, nplugin, + npluginattr, nuser_body, nuser_jnt, nuser_geom, nuser_site, nuser_cam, nuser_tendon, nuser_actuator, nuser_sensor, nnames, npaths); if (!m) { throw mjCError(0, "could not create mjModel"); diff --git a/src/user/user_model.h b/src/user/user_model.h index 9513b27b..b22e0dcb 100644 --- a/src/user/user_model.h +++ b/src/user/user_model.h @@ -97,6 +97,7 @@ class mjCModel_ : public mjsElement { mjtSize nflexelem; // number of elements in all flexes mjtSize nflexelemdata; // number of element vertex ids in all flexes mjtSize nflexstiffness; // number of stiffness parameters in all flexes + mjtSize nflexbending; // number of bending parameters in all flexes mjtSize nflexelemedge; // number of element edges in all flexes mjtSize nflexshelldata; // number of shell fragment vertex ids in all flexes mjtSize nflexevpair; // number of element-vertex pairs in all flexes diff --git a/unity/Runtime/Bindings/MjBindings.cs b/unity/Runtime/Bindings/MjBindings.cs index 7f8d625d..211665e7 100644 --- a/unity/Runtime/Bindings/MjBindings.cs +++ b/unity/Runtime/Bindings/MjBindings.cs @@ -963,6 +963,7 @@ public unsafe struct mjModel_ { public UInt64 nflexelem; public UInt64 nflexelemdata; public UInt64 nflexstiffness; + public UInt64 nflexbending; public UInt64 nflexelemedge; public UInt64 nflexshelldata; public UInt64 nflexevpair; @@ -1213,6 +1214,7 @@ public unsafe struct mjModel_ { public int* flex_elemdataadr; public int* flex_stiffnessadr; public int* flex_elemedgeadr; + public int* flex_bendingadr; public int* flex_shellnum; public int* flex_shelldataadr; public int* flex_evpairadr; diff --git a/wasm/codegen/generated/bindings.cc b/wasm/codegen/generated/bindings.cc index ae618fd8..2dd89505 100644 --- a/wasm/codegen/generated/bindings.cc +++ b/wasm/codegen/generated/bindings.cc @@ -3752,6 +3752,12 @@ struct MjModel { void set_nflexstiffness(int value) { ptr_->nflexstiffness = static_cast(value); } + int nflexbending() const { + return static_cast(ptr_->nflexbending); + } + void set_nflexbending(int value) { + ptr_->nflexbending = static_cast(value); + } int nflexelemedge() const { return static_cast(ptr_->nflexelemedge); } @@ -4688,6 +4694,9 @@ struct MjModel { emscripten::val flex_elemedgeadr() const { return emscripten::val(emscripten::typed_memory_view(ptr_->nflex, ptr_->flex_elemedgeadr)); } + emscripten::val flex_bendingadr() const { + return emscripten::val(emscripten::typed_memory_view(ptr_->nflex, ptr_->flex_bendingadr)); + } emscripten::val flex_shellnum() const { return emscripten::val(emscripten::typed_memory_view(ptr_->nflex, ptr_->flex_shellnum)); } @@ -4773,7 +4782,7 @@ struct MjModel { return emscripten::val(emscripten::typed_memory_view(ptr_->nflexstiffness, ptr_->flex_stiffness)); } emscripten::val flex_bending() const { - return emscripten::val(emscripten::typed_memory_view(ptr_->nflexedge * 17, ptr_->flex_bending)); + return emscripten::val(emscripten::typed_memory_view(ptr_->nflexbending, ptr_->flex_bending)); } emscripten::val flex_damping() const { return emscripten::val(emscripten::typed_memory_view(ptr_->nflex, ptr_->flex_damping)); @@ -11824,6 +11833,7 @@ EMSCRIPTEN_BINDINGS(mujoco_bindings) { .property("flex_activelayers", &MjModel::flex_activelayers) .property("flex_bandwidth", &MjModel::flex_bandwidth) .property("flex_bending", &MjModel::flex_bending) + .property("flex_bendingadr", &MjModel::flex_bendingadr) .property("flex_bvhadr", &MjModel::flex_bvhadr) .property("flex_bvhnum", &MjModel::flex_bvhnum) .property("flex_cellnum", &MjModel::flex_cellnum) @@ -12069,6 +12079,7 @@ EMSCRIPTEN_BINDINGS(mujoco_bindings) { .property("neq", &MjModel::neq, &MjModel::set_neq, reference()) .property("nexclude", &MjModel::nexclude, &MjModel::set_nexclude, reference()) .property("nflex", &MjModel::nflex, &MjModel::set_nflex, reference()) + .property("nflexbending", &MjModel::nflexbending, &MjModel::set_nflexbending, reference()) .property("nflexedge", &MjModel::nflexedge, &MjModel::set_nflexedge, reference()) .property("nflexelem", &MjModel::nflexelem, &MjModel::set_nflexelem, reference()) .property("nflexelemdata", &MjModel::nflexelemdata, &MjModel::set_nflexelemdata, reference())