Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
5edcefd
Resolve the step mode on the engine and make the worker thread-safe
jonathanembleyriches Aug 5, 2026
2a2fc2e
Decouple camera capture from the step loop
jonathanembleyriches Aug 5, 2026
36d9c96
Split the RPC dispatcher and give the bridge ownership and jobs
jonathanembleyriches Aug 5, 2026
1930e43
Carry state and frames over shared memory as well as ZMQ
jonathanembleyriches Aug 5, 2026
15bc7af
Unify state serialization behind one IR
jonathanembleyriches Aug 5, 2026
d5ba79a
Add ROS 2 as an optional module over the state IR
jonathanembleyriches Aug 5, 2026
ffe691b
Plan and execute for the Franka through MoveIt
jonathanembleyriches Aug 5, 2026
1a88912
Fix import and export across the element tree
jonathanembleyriches Aug 5, 2026
bb0e9f8
Follow the overhaul through the editor and its tests
jonathanembleyriches Aug 5, 2026
3dbd438
Document the camera, streaming and ROS protocols
jonathanembleyriches Aug 5, 2026
46d9133
Bump MuJoCo to upstream main (3.11.1)
jonathanembleyriches Aug 5, 2026
8c415a1
Add ProtoSpec: MJCF as an object model generated from MuJoCo's schema
jonathanembleyriches Aug 10, 2026
f447bbe
Make the components the model, and delete the XML compile path
jonathanembleyriches Aug 10, 2026
a750d38
Match stock on every menagerie robot, and support MuJoCo plugins
jonathanembleyriches Aug 11, 2026
3381d85
Format the tree and pin line endings to LF
jonathanembleyriches Aug 11, 2026
2ea768a
Skip the reformat commit in blame
jonathanembleyriches Aug 11, 2026
10d7573
Move convex decomposition onto the component tree, and finish its assets
jonathanembleyriches Aug 11, 2026
fdcf0c6
Keep the Blueprint spec root out of non-editor builds
jonathanembleyriches Aug 11, 2026
9c7e69f
Warn that the beta breaks existing MjArticulation assets
jonathanembleyriches Aug 11, 2026
06c4b67
Record the beta in the changelog and bump the version
jonathanembleyriches Aug 11, 2026
a9d0e39
Let an imported model's options reach the scene
jonathanembleyriches Aug 11, 2026
f9238b0
Carry control values as double end to end
jonathanembleyriches Aug 11, 2026
7aedd61
Name the control-owner field for what it owns
jonathanembleyriches Aug 11, 2026
5a2dfc6
Test the PD control law and run it in mjtNum
jonathanembleyriches Aug 11, 2026
999fcb5
Source convex decomposition from the geom's mesh element
jonathanembleyriches Aug 11, 2026
41e0f0c
Move the beta notice below the hero image
jonathanembleyriches Aug 11, 2026
59a8268
Let the engine see the articulation's element index
jonathanembleyriches Aug 11, 2026
4e456fd
Draw a mesh geom's authored rgba
jonathanembleyriches Aug 11, 2026
7aed76a
Give the model root one of every top-level section
jonathanembleyriches Aug 11, 2026
f6de5d9
Point the MuJoCo submodule at upstream
jonathanembleyriches Aug 11, 2026
ee3ba54
Cut Linux compile memory in the spec tree templates
jonathanembleyriches Aug 14, 2026
eeb1bda
Build Linux deps against the UE toolchain sysroot
jonathanembleyriches Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .clang-format
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,13 @@
# CoreUObject/Public/VerseVM/.clang-format), with ONE deliberate deviation:
#
# SortIncludes: false
# LineEnding: LF
#
# Epic's config leaves the line ending to whatever the file already has, which
# on Windows means clang-format preserves the CRLF that core.autocrlf wrote.
# Pinning it makes the formatter normalise, so a file formatted on Windows and
# one formatted on Linux are the same bytes. `.gitattributes` pins the same
# thing for the repository; this is the half that runs before a commit exists.
#
# Epic ships SortIncludes: true, but those engine subsystems have no
# reflection/generated headers. URLab's UPROPERTY modules require the
Expand DownExpand Up@@ -62,6 +69,7 @@ IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 4
Language: Cpp
LineEnding: LF
NamespaceIndentation: None
PackConstructorInitializers: CurrentLine
PointerAlignment: Left
Expand Down
3 changes: 3 additions & 0 deletions .git-blame-ignore-revs
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,3 +6,6 @@

# style: adopt Epic clang-format + codegen format-step + repo reformat
1a57be12debd08eb60a2db0a5503b0a64c8ad678

# style: reformat hand-written sources and pin line endings to LF
3381d8597bbb3106d826d6ffb369a82fce531ffb
35 changes: 35 additions & 0 deletions .gitattributes
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
# Line endings are LF in the repository and LF on checkout, on every platform.
#
# Without this, `core.autocrlf=true` (the Windows default) commits CRLF, and a
# file touched on Windows shows up as changed in its entirety on Linux and in
# review. Pinning it here rather than asking every contributor to configure
# their client is what keeps that out of the history.
* text=auto eol=lf

# Binary, and never to be sniffed for it. Content sniffing gets these right
# today; saying so outright means it cannot get them wrong after an edit that
# happens to remove every NUL byte from a header.
*.png binary
*.uasset binary
*.umap binary
*.stl binary
*.obj binary
*.mjb binary

# The emitted MuJoCo document profile.
#
# LF-pinned because the drift gate compares generated bytes: on Windows,
# core.autocrlf would rewrite these on checkout and the next `--check` would
# report a difference that is nothing but line endings. Marked generated so
# review tools collapse them and language statistics ignore them.
Source/URLab/Public/MuJoCo/Gen/** text eol=lf linguist-generated=true
Source/URLab/Private/MuJoCo/Gen/** text eol=lf linguist-generated=true
Source/URLabEditor/Private/Tests/MjGenCoverage.gen.cpp text eol=lf linguist-generated=true
Scripts/regen_ue_profile.ps1 text eol=lf
Scripts/regen_ue_profile.sh text eol=lf

# Recorded models. These are compared field for field after being loaded back,
# so any rewriting on checkout would surface as a corrupt golden rather than as
# the line-ending change it actually was. Pinned rather than left to content
# sniffing, because a golden is only worth what its bytes are.
Content/TestData/goldens/*.mjb binary
4 changes: 4 additions & 0 deletions .gitignore
Original file line numberDiff line numberDiff line change
Expand Up@@ -34,6 +34,7 @@ ThirdParty
*.lo
*.o
*.obj
!Content/TestData/**/*.obj

# Precompiled Headers
*.gch
Expand DownExpand Up@@ -119,6 +120,9 @@ third_party/install/
# submodule checkout itself is tracked via the submodule pointer; only the
# per-build scratch directories inside each submodule are ignored.
third_party/*/src/build/
# Per-dep build scratch dirs that sit beside src/ rather than inside it
# (e.g. third_party/MjShim/build/).
third_party/*/build/

# Python cache
__pycache__/
Expand Down
2 changes: 2 additions & 0 deletions .gitmodules
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
[submodule "third_party/MuJoCo/src"]
path = third_party/MuJoCo/src
# Upstream MuJoCo. The engine is built from it, and the ProtoSpec generator
# reads src/xml/mjcf.schema and doc/generate/mjcf_schema.py from it.
url = https://github.com/google-deepmind/mujoco
[submodule "third_party/CoACD/src"]
path = third_party/CoACD/src
Expand Down
Binary file modifiedContent/Materials/M_MuJoCo_Master.uasset
Binary file not shown.
19 changes: 19 additions & 0 deletions Content/TestData/boundary/plugins.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
<mujoco model="plugins">
<!-- a built-in engine plugin instance (cable elasticity) activated via extension and used by a composite -->
<extension>
<plugin plugin="mujoco.elasticity.cable">
<instance name="cable_inst">
<config key="twist" value="1e7"/>
<config key="bend" value="4e6"/>
</instance>
</plugin>
</extension>

<worldbody>
<composite type="cable" curve="s" count="5 1 1" size="0.5" offset="0 0 1" initial="none">
<plugin plugin="mujoco.elasticity.cable" instance="cable_inst"/>
<joint kind="main" damping="0.01"/>
<geom type="capsule" size="0.005"/>
</composite>
</worldbody>
</mujoco>
6 changes: 6 additions & 0 deletions Content/TestData/goldens/CAPTURE.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
{
"mujoco_version": "3.11.1",
"mujoco_submodule": "b6683ac13dd353c8d66788a3beea6e84b2eb2dc2",
"captured_commit": "8028138e0e5f68fafd2b9b53ff958ad29cb27195",
"captured_utc": "2026-08-09"
}
Binary file not shown.
33 changes: 33 additions & 0 deletions Content/TestData/goldens/actuators_all.roundtrip.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
<mujoco model="actuators_all">
<worldbody>
<site name="site_ref" pos="0 0 0"/>
<body name="link1" pos="0 0 1">
<joint name="j1" type="hinge" axis="0 0 1"/>
<geom name="geom_link1" type="capsule" size="0.05 0.25" pos="0.25 0 0" quat="0.7071067811865476 0 -0.7071067811865476 0"/>
<site name="site1" pos="0.5 0 0"/>
<body name="link2" pos="0.5 0 0">
<joint name="j2" type="hinge" axis="0 1 0"/>
<geom name="geom_link2" type="capsule" size="0.05 0.25" pos="0.25 0 0" quat="0.7071067811865476 0 -0.7071067811865476 0"/>
</body>
</body>
</worldbody>
<tendon>
<fixed name="ftendon">
<joint joint="j1" coef="1"/>
</fixed>
</tendon>
<actuator>
<general name="act_general" tendon="ftendon" gaintype="affine" biastype="affine" gainprm="2 0 0" biasprm="0 -10 -1"/>
<motor name="act_motor" joint="j1"/>
<position name="act_position" joint="j1" kp="10" dampratio="1"/>
<velocity name="act_velocity" joint="j1" kv="0.5"/>
<intvelocity name="act_intvelocity" actrange="-1 1" joint="j2" kp="10" kv="0.5"/>
<orientation name="act_orientation" site="site1" refsite="site_ref" kp="5" kv="0.5"/>
<pid name="act_pid" joint="j2" kp="10" kv="0.25" ki="0.5" imax="1"/>
<damper name="act_damper" ctrlrange="0 1" joint="j1" kv="0.5"/>
<cylinder name="act_cylinder" joint="j2" timeconst="0.5" area="0.04908738521234052" bias="0 -1 0"/>
<muscle name="act_muscle" lengthrange="0.2 0.6" joint="j1" timeconst="0.01 0.04" range="0.75 1.25" force="1"/>
<adhesion name="act_adhesion" ctrlrange="0 1" body="link2" gain="1"/>
<dcmotor name="act_dcmotor" joint="j2" motorconst="0.5 0.25" resistance="1"/>
</actuator>
</mujoco>
Binary file not shown.
13 changes: 13 additions & 0 deletions Content/TestData/goldens/angle_degrees.roundtrip.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
<mujoco model="angle_degrees">
<compiler angle="degree" eulerseq="zyx"/>
<worldbody>
<body name="body_euler" pos="0 0 1" quat="0.8223631719059994 0.3604234056503559 0.43967973954090955 0.022260026714733816">
<joint name="j_euler" type="hinge" axis="0 0 1" stiffness="1" range="-90 90" ref="15" springref="30"/>
<geom name="geom_euler" type="box" size="0.1 0.1 0.1"/>
<body name="body_axisangle" pos="0.5 0 0" quat="0.7071067811865476 0 0 0.7071067811865476">
<joint name="j_axisangle" type="hinge" axis="1 0 0" stiffness="1" range="-45 45" ref="10" springref="20"/>
<geom name="geom_axisangle" type="box" size="0.05 0.05 0.05"/>
</body>
</body>
</worldbody>
</mujoco>
Binary file not shown.
22 changes: 22 additions & 0 deletions Content/TestData/goldens/assets_meshes.roundtrip.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
<mujoco model="assets_meshes">
<asset>
<mesh name="mesh_a" file="meshA/base.obj"/>
<mesh name="mesh_b" file="meshB/base.obj"/>
<hfield name="hf_small" nrow="2" ncol="2" size="1 1 0.5 0.1" elevation="0 0.25 0.5 0.75"/>
<texture name="tex_checker" type="2d" file="checker.png"/>
<material name="mat_checker" texrepeat="1 1">
<layer texture="tex_checker" role="rgb"/>
</material>
</asset>
<worldbody>
<geom name="geom_hfield" type="hfield" pos="0 0 0" hfield="hf_small"/>
<body name="body_mesh_a" pos="2 0 0.5">
<freejoint name="jf_mesh_a"/>
<geom name="geom_mesh_a" type="mesh" material="mat_checker" mesh="mesh_a"/>
</body>
<body name="body_mesh_b" pos="4 0 0.5">
<freejoint name="jf_mesh_b"/>
<geom name="geom_mesh_b" type="mesh" material="mat_checker" mesh="mesh_b"/>
</body>
</worldbody>
</mujoco>
Binary file not shown.
Binary file not shown.
38 changes: 38 additions & 0 deletions Content/TestData/goldens/defaults_nested.roundtrip.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
<mujoco model="defaults_nested">
<default>
<default class="top">
<default class="mid">
<default class="leaf">
<joint damping="2"/>
<geom size="0.025 0.025 0.025" rgba="0.2 0.2 0.8 1"/>
<position kp="40"/>
</default>
<joint damping="1"/>
<geom size="0.05 0.05 0.05" rgba="0.2 0.8 0.2 1"/>
<position kp="20"/>
</default>
<joint type="hinge" damping="0.5"/>
<geom type="box" size="0.1 0.1 0.1" rgba="0.8 0.2 0.2 1"/>
<position kp="10"/>
</default>
</default>
<worldbody>
<body name="body_top" childclass="top" pos="0 0 1">
<geom name="geom_top"/>
<joint name="joint_top" axis="0 0 1"/>
<body name="body_mid" childclass="mid" pos="0.5 0 0">
<geom name="geom_mid"/>
<joint name="joint_mid" axis="0 1 0"/>
<body name="body_leaf" pos="0.25 0 0">
<geom name="geom_leaf" class="leaf"/>
<joint name="joint_leaf" class="leaf" axis="1 0 0"/>
</body>
</body>
</body>
</worldbody>
<actuator>
<position name="act_top" class="top" joint="joint_top"/>
<position name="act_mid" class="mid" joint="joint_mid"/>
<position name="act_leaf" class="leaf" joint="joint_leaf"/>
</actuator>
</mujoco>
Binary file not shown.
19 changes: 19 additions & 0 deletions Content/TestData/goldens/keyframes_options.roundtrip.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
<mujoco model="keyframes_options">
<option timestep="0.005" gravity="0 0 -4.905" integrator="RK4" cone="elliptic" iterations="50">
<flag contact="disable" gravity="enable" energy="enable"/>
</option>
<size memory="1048576"/>
<worldbody>
<body name="body1" pos="0 0 1">
<joint name="j1" type="hinge" axis="0 0 1"/>
<geom name="geom1" type="box" size="0.1 0.1 0.1"/>
</body>
</worldbody>
<actuator>
<motor name="act1" joint="j1"/>
</actuator>
<keyframe>
<key name="key_home" qpos="0" ctrl="0"/>
<key name="key_quarter" time="0.5" qpos="0.25" ctrl="0.5"/>
</keyframe>
</mujoco>
Binary file not shown.
16 changes: 16 additions & 0 deletions Content/TestData/goldens/macro_composite.roundtrip.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
<mujoco model="macro_composite">
<default>
<default class="cable_default">
<geom type="capsule" size="0.005" rgba="0.9 0.4 0.1 1"/>
</default>
</default>
<worldbody>
<body name="composite_root" childclass="cable_default" pos="0 0 1">
<geom name="composite_anchor" type="sphere" size="0.02"/>
<composite type="cable" count="8 1 1" initial="none" curve="s" size="0.5">
<joint kind="main" damping="0.015"/>
<geom type="capsule" size="0.005"/>
</composite>
</body>
</worldbody>
</mujoco>
Binary file not shown.
15 changes: 15 additions & 0 deletions Content/TestData/goldens/macro_flexcomp.roundtrip.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
<mujoco model="macro_flexcomp">
<default>
<default class="flex_default">
<geom rgba="0.2 0.6 0.9 1"/>
</default>
</default>
<worldbody>
<body name="flex_root" childclass="flex_default" pos="0 0 2">
<geom name="flex_anchor" type="sphere" size="0.02"/>
<flexcomp name="cloth" type="grid" dim="2" count="4 4 1" spacing="0.1 0.1 0.1" radius="0.01" mass="1">
<edge equality="true"/>
</flexcomp>
</body>
</worldbody>
</mujoco>
Binary file not shown.
20 changes: 20 additions & 0 deletions Content/TestData/goldens/macro_replicate.roundtrip.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
<mujoco model="macro_replicate">
<default>
<default class="rep_default">
<joint type="hinge" damping="0.1"/>
<geom type="capsule" size="0.02" rgba="0.1 0.7 0.3 1"/>
</default>
</default>
<worldbody>
<body name="anchor_body" pos="0 0 2">
<joint name="anchor_joint" type="hinge" axis="0 0 1"/>
<geom name="anchor_geom" type="capsule" size="0.02 0.1" pos="0.1 0 0" quat="0.7071067811865476 0 -0.7071067811865476 0"/>
</body>
<replicate count="3" offset="0.3 0 0" sep="_" childclass="rep_default">
<body name="rep_body" pos="0 0 1">
<joint name="rep_joint" axis="0 0 1"/>
<geom name="rep_geom" size="0.02 0.1" pos="0.1 0 0" quat="0.7071067811865476 0 -0.7071067811865476 0"/>
</body>
</replicate>
</worldbody>
</mujoco>
17 changes: 17 additions & 0 deletions Content/TestData/goldens/plugins.roundtrip.xml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
<mujoco model="plugins">
<extension>
<plugin plugin="mujoco.elasticity.cable">
<instance name="cable_inst">
<config key="twist" value="1e7"/>
<config key="bend" value="4e6"/>
</instance>
</plugin>
</extension>
<worldbody>
<composite type="cable" count="5 1 1" offset="0 0 1" initial="none" curve="s" size="0.5">
<joint kind="main" damping="0.01"/>
<geom type="capsule" size="0.005"/>
<plugin plugin="mujoco.elasticity.cable" instance="cable_inst"/>
</composite>
</worldbody>
</mujoco>
Binary file not shown.
Loading