Files
Mujoco_WASM/src/experimental/usd/mjcPhysics/tokens.cpp
T
Sam Haves d816b38f4c mjcPhysics MjcTendon path now has an indices attribute to allow repeated sites in tendon path.
Since relationships in USD can only contain a single instance of a path, it was previously impossible to have a tendon path that visits the same wrap target more than once. This is a fairly common occurence when dealing with tendons that have pulleys.

With this change, if mjc:path:indices is not defined then the behaviour is as it was and the mjc:path is considered to be ordered. If it is authored then the parser will use the indices into mjc:path as the order. This mirrors other similar concepts in USD such as face vertex indices.

PiperOrigin-RevId: 856339887
Change-Id: I6b9503973de377acdb0689be168c16e4aa19b70b
2026-01-14 13:24:28 -08:00

383 lines
17 KiB
C++

// Copyright 2025 DeepMind Technologies Limited
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <mujoco/experimental/usd/mjcPhysics/tokens.h>
PXR_NAMESPACE_OPEN_SCOPE
MjcPhysicsTokensType::MjcPhysicsTokensType()
: affine("affine", TfToken::Immortal),
auto_("auto", TfToken::Immortal),
cg("cg", TfToken::Immortal),
convex("convex", TfToken::Immortal),
degree("degree", TfToken::Immortal),
dense("dense", TfToken::Immortal),
elliptic("elliptic", TfToken::Immortal),
euler("euler", TfToken::Immortal),
exact("exact", TfToken::Immortal),
false_("false", TfToken::Immortal),
filter("filter", TfToken::Immortal),
filterexact("filterexact", TfToken::Immortal),
fixed("fixed", TfToken::Immortal),
implicit("implicit", TfToken::Immortal),
implicitfast("implicitfast", TfToken::Immortal),
integrator("integrator", TfToken::Immortal),
legacy("legacy", TfToken::Immortal),
mjcAct("mjc:act", TfToken::Immortal),
mjcActDim("mjc:actDim", TfToken::Immortal),
mjcActEarly("mjc:actEarly", TfToken::Immortal),
mjcActLimited("mjc:actLimited", TfToken::Immortal),
mjcActRangeMax("mjc:actRange:max", TfToken::Immortal),
mjcActRangeMin("mjc:actRange:min", TfToken::Immortal),
mjcActuatorfrclimited("mjc:actuatorfrclimited", TfToken::Immortal),
mjcActuatorfrcrangeMax("mjc:actuatorfrcrange:max", TfToken::Immortal),
mjcActuatorfrcrangeMin("mjc:actuatorfrcrange:min", TfToken::Immortal),
mjcActuatorgravcomp("mjc:actuatorgravcomp", TfToken::Immortal),
mjcArmature("mjc:armature", TfToken::Immortal),
mjcBiasPrm("mjc:biasPrm", TfToken::Immortal),
mjcBiasType("mjc:biasType", TfToken::Immortal),
mjcCompilerAlignFree("mjc:compiler:alignFree", TfToken::Immortal),
mjcCompilerAngle("mjc:compiler:angle", TfToken::Immortal),
mjcCompilerAutoLimits("mjc:compiler:autoLimits", TfToken::Immortal),
mjcCompilerBalanceInertia("mjc:compiler:balanceInertia",
TfToken::Immortal),
mjcCompilerBoundInertia("mjc:compiler:boundInertia", TfToken::Immortal),
mjcCompilerBoundMass("mjc:compiler:boundMass", TfToken::Immortal),
mjcCompilerFitAABB("mjc:compiler:fitAABB", TfToken::Immortal),
mjcCompilerFuseStatic("mjc:compiler:fuseStatic", TfToken::Immortal),
mjcCompilerInertiaFromGeom("mjc:compiler:inertiaFromGeom",
TfToken::Immortal),
mjcCompilerInertiaGroupRangeMax("mjc:compiler:inertiaGroupRange:max",
TfToken::Immortal),
mjcCompilerInertiaGroupRangeMin("mjc:compiler:inertiaGroupRange:min",
TfToken::Immortal),
mjcCompilerSaveInertial("mjc:compiler:saveInertial", TfToken::Immortal),
mjcCompilerSetTotalMass("mjc:compiler:setTotalMass", TfToken::Immortal),
mjcCompilerUseThread("mjc:compiler:useThread", TfToken::Immortal),
mjcCondim("mjc:condim", TfToken::Immortal),
mjcCrankLength("mjc:crankLength", TfToken::Immortal),
mjcCtrl("mjc:ctrl", TfToken::Immortal),
mjcCtrlLimited("mjc:ctrlLimited", TfToken::Immortal),
mjcCtrlRangeMax("mjc:ctrlRange:max", TfToken::Immortal),
mjcCtrlRangeMin("mjc:ctrlRange:min", TfToken::Immortal),
mjcDamping("mjc:damping", TfToken::Immortal),
mjcDynPrm("mjc:dynPrm", TfToken::Immortal),
mjcDynType("mjc:dynType", TfToken::Immortal),
mjcFlagActuation("mjc:flag:actuation", TfToken::Immortal),
mjcFlagAutoreset("mjc:flag:autoreset", TfToken::Immortal),
mjcFlagClampctrl("mjc:flag:clampctrl", TfToken::Immortal),
mjcFlagConstraint("mjc:flag:constraint", TfToken::Immortal),
mjcFlagContact("mjc:flag:contact", TfToken::Immortal),
mjcFlagDamper("mjc:flag:damper", TfToken::Immortal),
mjcFlagEnergy("mjc:flag:energy", TfToken::Immortal),
mjcFlagEquality("mjc:flag:equality", TfToken::Immortal),
mjcFlagEulerdamp("mjc:flag:eulerdamp", TfToken::Immortal),
mjcFlagFilterparent("mjc:flag:filterparent", TfToken::Immortal),
mjcFlagFrictionloss("mjc:flag:frictionloss", TfToken::Immortal),
mjcFlagFwdinv("mjc:flag:fwdinv", TfToken::Immortal),
mjcFlagGravity("mjc:flag:gravity", TfToken::Immortal),
mjcFlagInvdiscrete("mjc:flag:invdiscrete", TfToken::Immortal),
mjcFlagIsland("mjc:flag:island", TfToken::Immortal),
mjcFlagLimit("mjc:flag:limit", TfToken::Immortal),
mjcFlagMidphase("mjc:flag:midphase", TfToken::Immortal),
mjcFlagMulticcd("mjc:flag:multiccd", TfToken::Immortal),
mjcFlagNativeccd("mjc:flag:nativeccd", TfToken::Immortal),
mjcFlagOverride("mjc:flag:override", TfToken::Immortal),
mjcFlagRefsafe("mjc:flag:refsafe", TfToken::Immortal),
mjcFlagSensor("mjc:flag:sensor", TfToken::Immortal),
mjcFlagSpring("mjc:flag:spring", TfToken::Immortal),
mjcFlagWarmstart("mjc:flag:warmstart", TfToken::Immortal),
mjcForceLimited("mjc:forceLimited", TfToken::Immortal),
mjcForceRangeMax("mjc:forceRange:max", TfToken::Immortal),
mjcForceRangeMin("mjc:forceRange:min", TfToken::Immortal),
mjcFrictionloss("mjc:frictionloss", TfToken::Immortal),
mjcGainPrm("mjc:gainPrm", TfToken::Immortal),
mjcGainType("mjc:gainType", TfToken::Immortal),
mjcGap("mjc:gap", TfToken::Immortal),
mjcGear("mjc:gear", TfToken::Immortal),
mjcGroup("mjc:group", TfToken::Immortal),
mjcInertia("mjc:inertia", TfToken::Immortal),
mjcInheritRange("mjc:inheritRange", TfToken::Immortal),
mjcJointInParent("mjc:jointInParent", TfToken::Immortal),
mjcLengthRangeMax("mjc:lengthRange:max", TfToken::Immortal),
mjcLengthRangeMin("mjc:lengthRange:min", TfToken::Immortal),
mjcLimited("mjc:limited", TfToken::Immortal),
mjcMargin("mjc:margin", TfToken::Immortal),
mjcMaxhullvert("mjc:maxhullvert", TfToken::Immortal),
mjcMpos("mjc:mpos", TfToken::Immortal),
mjcMquat("mjc:mquat", TfToken::Immortal),
mjcOptionActuatorgroupdisable("mjc:option:actuatorgroupdisable",
TfToken::Immortal),
mjcOptionCcd_iterations("mjc:option:ccd_iterations", TfToken::Immortal),
mjcOptionCcd_tolerance("mjc:option:ccd_tolerance", TfToken::Immortal),
mjcOptionCone("mjc:option:cone", TfToken::Immortal),
mjcOptionDensity("mjc:option:density", TfToken::Immortal),
mjcOptionImpratio("mjc:option:impratio", TfToken::Immortal),
mjcOptionIntegrator("mjc:option:integrator", TfToken::Immortal),
mjcOptionIterations("mjc:option:iterations", TfToken::Immortal),
mjcOptionJacobian("mjc:option:jacobian", TfToken::Immortal),
mjcOptionLs_iterations("mjc:option:ls_iterations", TfToken::Immortal),
mjcOptionLs_tolerance("mjc:option:ls_tolerance", TfToken::Immortal),
mjcOptionMagnetic("mjc:option:magnetic", TfToken::Immortal),
mjcOptionNoslip_iterations("mjc:option:noslip_iterations",
TfToken::Immortal),
mjcOptionNoslip_tolerance("mjc:option:noslip_tolerance",
TfToken::Immortal),
mjcOptionO_friction("mjc:option:o_friction", TfToken::Immortal),
mjcOptionO_margin("mjc:option:o_margin", TfToken::Immortal),
mjcOptionO_solimp("mjc:option:o_solimp", TfToken::Immortal),
mjcOptionO_solref("mjc:option:o_solref", TfToken::Immortal),
mjcOptionSdf_initpoints("mjc:option:sdf_initpoints", TfToken::Immortal),
mjcOptionSdf_iterations("mjc:option:sdf_iterations", TfToken::Immortal),
mjcOptionSolver("mjc:option:solver", TfToken::Immortal),
mjcOptionTimestep("mjc:option:timestep", TfToken::Immortal),
mjcOptionTolerance("mjc:option:tolerance", TfToken::Immortal),
mjcOptionViscosity("mjc:option:viscosity", TfToken::Immortal),
mjcOptionWind("mjc:option:wind", TfToken::Immortal),
mjcPath("mjc:path", TfToken::Immortal),
mjcPathCoef("mjc:path:coef", TfToken::Immortal),
mjcPathDivisors("mjc:path:divisors", TfToken::Immortal),
mjcPathIndices("mjc:path:indices", TfToken::Immortal),
mjcPathSegments("mjc:path:segments", TfToken::Immortal),
mjcPriority("mjc:priority", TfToken::Immortal),
mjcQpos("mjc:qpos", TfToken::Immortal),
mjcQvel("mjc:qvel", TfToken::Immortal),
mjcRangeMax("mjc:range:max", TfToken::Immortal),
mjcRangeMin("mjc:range:min", TfToken::Immortal),
mjcRef("mjc:ref", TfToken::Immortal),
mjcRefSite("mjc:refSite", TfToken::Immortal),
mjcRgba("mjc:rgba", TfToken::Immortal),
mjcRollingfriction("mjc:rollingfriction", TfToken::Immortal),
mjcShellinertia("mjc:shellinertia", TfToken::Immortal),
mjcSideSites("mjc:sideSites", TfToken::Immortal),
mjcSideSitesIndices("mjc:sideSites:indices", TfToken::Immortal),
mjcSliderSite("mjc:sliderSite", TfToken::Immortal),
mjcSolimp("mjc:solimp", TfToken::Immortal),
mjcSolimpfriction("mjc:solimpfriction", TfToken::Immortal),
mjcSolimplimit("mjc:solimplimit", TfToken::Immortal),
mjcSolmix("mjc:solmix", TfToken::Immortal),
mjcSolref("mjc:solref", TfToken::Immortal),
mjcSolreffriction("mjc:solreffriction", TfToken::Immortal),
mjcSolreflimit("mjc:solreflimit", TfToken::Immortal),
mjcSpringdamper("mjc:springdamper", TfToken::Immortal),
mjcSpringlength("mjc:springlength", TfToken::Immortal),
mjcSpringref("mjc:springref", TfToken::Immortal),
mjcStiffness("mjc:stiffness", TfToken::Immortal),
mjcTarget("mjc:target", TfToken::Immortal),
mjcTorsionalfriction("mjc:torsionalfriction", TfToken::Immortal),
mjcType("mjc:type", TfToken::Immortal),
mjcWidth("mjc:width", TfToken::Immortal),
muscle("muscle", TfToken::Immortal),
newton("newton", TfToken::Immortal),
none("none", TfToken::Immortal),
pgs("pgs", TfToken::Immortal),
pyramidal("pyramidal", TfToken::Immortal),
radian("radian", TfToken::Immortal),
rk4("rk4", TfToken::Immortal),
shell("shell", TfToken::Immortal),
sparse("sparse", TfToken::Immortal),
spatial("spatial", TfToken::Immortal),
true_("true", TfToken::Immortal),
user("user", TfToken::Immortal),
MjcActuator("MjcActuator", TfToken::Immortal),
MjcCollisionAPI("MjcCollisionAPI", TfToken::Immortal),
MjcImageableAPI("MjcImageableAPI", TfToken::Immortal),
MjcJointAPI("MjcJointAPI", TfToken::Immortal),
MjcKeyframe("MjcKeyframe", TfToken::Immortal),
MjcMaterialAPI("MjcMaterialAPI", TfToken::Immortal),
MjcMeshCollisionAPI("MjcMeshCollisionAPI", TfToken::Immortal),
MjcSceneAPI("MjcSceneAPI", TfToken::Immortal),
MjcSiteAPI("MjcSiteAPI", TfToken::Immortal),
MjcTendon("MjcTendon", TfToken::Immortal),
allTokens({affine,
auto_,
cg,
convex,
degree,
dense,
elliptic,
euler,
exact,
false_,
filter,
filterexact,
fixed,
implicit,
implicitfast,
integrator,
legacy,
mjcAct,
mjcActDim,
mjcActEarly,
mjcActLimited,
mjcActRangeMax,
mjcActRangeMin,
mjcActuatorfrclimited,
mjcActuatorfrcrangeMax,
mjcActuatorfrcrangeMin,
mjcActuatorgravcomp,
mjcArmature,
mjcBiasPrm,
mjcBiasType,
mjcCompilerAlignFree,
mjcCompilerAngle,
mjcCompilerAutoLimits,
mjcCompilerBalanceInertia,
mjcCompilerBoundInertia,
mjcCompilerBoundMass,
mjcCompilerFitAABB,
mjcCompilerFuseStatic,
mjcCompilerInertiaFromGeom,
mjcCompilerInertiaGroupRangeMax,
mjcCompilerInertiaGroupRangeMin,
mjcCompilerSaveInertial,
mjcCompilerSetTotalMass,
mjcCompilerUseThread,
mjcCondim,
mjcCrankLength,
mjcCtrl,
mjcCtrlLimited,
mjcCtrlRangeMax,
mjcCtrlRangeMin,
mjcDamping,
mjcDynPrm,
mjcDynType,
mjcFlagActuation,
mjcFlagAutoreset,
mjcFlagClampctrl,
mjcFlagConstraint,
mjcFlagContact,
mjcFlagDamper,
mjcFlagEnergy,
mjcFlagEquality,
mjcFlagEulerdamp,
mjcFlagFilterparent,
mjcFlagFrictionloss,
mjcFlagFwdinv,
mjcFlagGravity,
mjcFlagInvdiscrete,
mjcFlagIsland,
mjcFlagLimit,
mjcFlagMidphase,
mjcFlagMulticcd,
mjcFlagNativeccd,
mjcFlagOverride,
mjcFlagRefsafe,
mjcFlagSensor,
mjcFlagSpring,
mjcFlagWarmstart,
mjcForceLimited,
mjcForceRangeMax,
mjcForceRangeMin,
mjcFrictionloss,
mjcGainPrm,
mjcGainType,
mjcGap,
mjcGear,
mjcGroup,
mjcInertia,
mjcInheritRange,
mjcJointInParent,
mjcLengthRangeMax,
mjcLengthRangeMin,
mjcLimited,
mjcMargin,
mjcMaxhullvert,
mjcMpos,
mjcMquat,
mjcOptionActuatorgroupdisable,
mjcOptionCcd_iterations,
mjcOptionCcd_tolerance,
mjcOptionCone,
mjcOptionDensity,
mjcOptionImpratio,
mjcOptionIntegrator,
mjcOptionIterations,
mjcOptionJacobian,
mjcOptionLs_iterations,
mjcOptionLs_tolerance,
mjcOptionMagnetic,
mjcOptionNoslip_iterations,
mjcOptionNoslip_tolerance,
mjcOptionO_friction,
mjcOptionO_margin,
mjcOptionO_solimp,
mjcOptionO_solref,
mjcOptionSdf_initpoints,
mjcOptionSdf_iterations,
mjcOptionSolver,
mjcOptionTimestep,
mjcOptionTolerance,
mjcOptionViscosity,
mjcOptionWind,
mjcPath,
mjcPathCoef,
mjcPathDivisors,
mjcPathIndices,
mjcPathSegments,
mjcPriority,
mjcQpos,
mjcQvel,
mjcRangeMax,
mjcRangeMin,
mjcRef,
mjcRefSite,
mjcRgba,
mjcRollingfriction,
mjcShellinertia,
mjcSideSites,
mjcSideSitesIndices,
mjcSliderSite,
mjcSolimp,
mjcSolimpfriction,
mjcSolimplimit,
mjcSolmix,
mjcSolref,
mjcSolreffriction,
mjcSolreflimit,
mjcSpringdamper,
mjcSpringlength,
mjcSpringref,
mjcStiffness,
mjcTarget,
mjcTorsionalfriction,
mjcType,
mjcWidth,
muscle,
newton,
none,
pgs,
pyramidal,
radian,
rk4,
shell,
sparse,
spatial,
true_,
user,
MjcActuator,
MjcCollisionAPI,
MjcImageableAPI,
MjcJointAPI,
MjcKeyframe,
MjcMaterialAPI,
MjcMeshCollisionAPI,
MjcSceneAPI,
MjcSiteAPI,
MjcTendon}) {}
TfStaticData<MjcPhysicsTokensType> MjcPhysicsTokens;
PXR_NAMESPACE_CLOSE_SCOPE