Commit Graph

5339 Commits

Author SHA1 Message Date
chenlin 8ba83a8d0a refactor(web-platform): release V0.7.2 项目常规优化
web-platform-ci / TypeScript, lint, unit, build (push) Has been cancelled
web-platform-ci / Playwright E2E (push) Has been cancelled
2026-09-01 16:39:04 +08:00
chenlin 89d1c8cb57 feat(web-platform): release V0.7.1 数据模块
web-platform-ci / TypeScript, lint, unit, build (push) Has been cancelled
web-platform-ci / Playwright E2E (push) Has been cancelled
web-platform-ci / TypeScript, lint, unit, build (pull_request) Has been cancelled
web-platform-ci / Playwright E2E (pull_request) Has been cancelled
2026-09-01 15:57:03 +08:00
chenlin 3b4ced6437 feat(web-platform): release V0.7 地图模块
web-platform-ci / TypeScript, lint, unit, build (push) Has been cancelled
web-platform-ci / Playwright E2E (push) Has been cancelled
2026-09-01 14:23:49 +08:00
chenlin 60d3a6d68c chore(web-platform): release V0.6.1 工程质量优化
web-platform-ci / TypeScript, lint, unit, build (push) Has been cancelled
web-platform-ci / Playwright E2E (push) Has been cancelled
2026-08-28 15:38:10 +08:00
chenlin f4b415c54f refactor(web-platform): release V0.6 精简代码
web-platform-ci / TypeScript、Lint、Unit、Build (push) Has been cancelled
web-platform-ci / Playwright E2E (push) Has been cancelled
web-platform-ci / TypeScript、Lint、Unit、Build (pull_request) Has been cancelled
web-platform-ci / Playwright E2E (pull_request) Has been cancelled
2026-08-28 14:10:16 +08:00
chenlin 8e3d56d619 feat(web-platform): release V0.5.2 前端优化 2026-08-28 13:32:34 +08:00
chenlin ecfcd3c869 feat(web-platform): release V0.5.1 前端 RL 接入 2026-08-27 14:29:34 +08:00
chenlin 6ac255e859 feat(web-platform): release V0.4.2 RL Module 2026-08-26 13:36:30 +08:00
chenlin c0081d0808 feat(web-platform): release V0.4.1 完成基础控制
build / setup (compute matrix) (pull_request) Has been cancelled
build / macos-15-arm64-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-studio (pull_request) Has been cancelled
build / ubuntu-24.04-gcc-14-studio (pull_request) Has been cancelled
build / windows-2025-ninja-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-wasm (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-mjx (pull_request) Has been cancelled
lint / pre-commit (pull_request) Has been cancelled
build / ${{ matrix.label }} (pull_request) Has been cancelled
2026-08-24 17:12:17 +08:00
chenlin c12e52f843 feat(web-platform): release V0.4 balance control 2026-08-24 14:45:52 +08:00
chenlin dc494f7a2d feat(web-platform): release V0.3
添加驱动器与传感器
2026-08-24 11:47:34 +08:00
chenlin ba7ee9697c feat(web-platform): release V0.2.1 2026-08-21 18:09:03 +08:00
chenlin aa62ec0c93 feat(web-platform): release V0.2
build / setup (compute matrix) (pull_request) Has been cancelled
build / macos-15-arm64-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-studio (pull_request) Has been cancelled
build / ubuntu-24.04-gcc-14-studio (pull_request) Has been cancelled
build / windows-2025-ninja-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-wasm (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-mjx (pull_request) Has been cancelled
lint / pre-commit (pull_request) Has been cancelled
build / ${{ matrix.label }} (pull_request) Has been cancelled
2026-08-21 16:52:22 +08:00
chenlin e4849e1645 feat(web-platform): release V0.1 2026-08-20 16:36:19 +08:00
chenlin 1eb05132f1 feat: add browser-based MuJoCo simulation platform
build / setup (compute matrix) (pull_request) Has been cancelled
build / ${{ matrix.label }} (pull_request) Has been cancelled
build / macos-15-arm64-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-studio (pull_request) Has been cancelled
build / ubuntu-24.04-gcc-14-studio (pull_request) Has been cancelled
build / windows-2025-ninja-studio (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-wasm (pull_request) Has been cancelled
build / ubuntu-24.04-clang-18-mjx (pull_request) Has been cancelled
lint / pre-commit (pull_request) Has been cancelled
2026-08-20 15:12:08 +08:00
chenlin b45b15d153 add chinese
build / setup (compute matrix) (push) Has been cancelled
build / ${{ matrix.label }} (push) Has been cancelled
build / macos-15-arm64-studio (push) Has been cancelled
build / ubuntu-24.04-clang-18-studio (push) Has been cancelled
build / ubuntu-24.04-gcc-14-studio (push) Has been cancelled
build / windows-2025-ninja-studio (push) Has been cancelled
build / ubuntu-24.04-clang-18-wasm (push) Has been cancelled
build / ubuntu-24.04-clang-18-mjx (push) Has been cancelled
2026-08-19 17:14:37 +08:00
chenlin ac4f431ff5 Fix MuJoCo WASM loader imports
build / setup (compute matrix) (push) Has been cancelled
build / ${{ matrix.label }} (push) Has been cancelled
build / macos-15-arm64-studio (push) Has been cancelled
build / ubuntu-24.04-clang-18-studio (push) Has been cancelled
build / ubuntu-24.04-gcc-14-studio (push) Has been cancelled
build / windows-2025-ninja-studio (push) Has been cancelled
build / ubuntu-24.04-clang-18-wasm (push) Has been cancelled
build / ubuntu-24.04-clang-18-mjx (push) Has been cancelled
2026-08-19 17:04:30 +08:00
Yuval Tassa 3dd2bc3b52 Studio: Improve UI state saving and restoration
- Load settings prior to first frame so dockspace layout restores reliably.
- Save settings on exit in App::~App().
- Persist and restore open/closed state of collapsible sections.

PiperOrigin-RevId: 966657100
Change-Id: I64fb5d02912bb36d096d7ac26ce8e0de03e6617b
2026-08-18 10:03:13 -07:00
Google DeepMind a4f0afc012 Import Warp v1.16.0
PiperOrigin-RevId: 966641228
Change-Id: I3b55b6c607a4a09eb714304db27e62ed391c7f56
2026-08-18 09:36:06 -07:00
Michael Moss 021c804bf8 Update dependencies ahead of the 3.12.0 release.
PiperOrigin-RevId: 966530808
Change-Id: Idbab4c60a6aef063c02a0ec6de6176033f52fac1
2026-08-18 05:16:27 -07:00
Michael Moss 62f05c1e6f Cast mjx objtype_data lookup keys to int for pybind11 v1.18 compatibility.
PiperOrigin-RevId: 966503691
Change-Id: Ic1465aa8e13697d140a993a42294f661f1d1fb15
2026-08-18 04:01:55 -07:00
Hana Joo e3590b7449 Add pyrefly suppressions
PiperOrigin-RevId: 966501583
Change-Id: I942ec198b369fb4a2f430070ee1002e7ad2d0c9d
2026-08-18 03:55:35 -07:00
Michael Moss 06aa6c075f Cast mjx dict/set lookup enums to int for pybind11 v1.18 compatibility.
PiperOrigin-RevId: 966094569
Change-Id: I014226016df9d519f250d0fc25045064cd94cb1e
2026-08-17 11:47:46 -07:00
Taylor Howell 8847823721 update doc/mjwarp/update_types.py
PiperOrigin-RevId: 966037324
Change-Id: Iabc84fe3a871d6fdf8b6619ee048ac0273462d55
2026-08-17 10:09:11 -07:00
Haroon Qureshi 26aaeb035f Update FilamentRenderer to use mjrf primitives directly.
Removes the dependency on the SceneBridge.

PiperOrigin-RevId: 965964920
Change-Id: I7c9ff52c9f26b778fe1d017fbf12d5af38ce67c1
2026-08-17 07:45:29 -07:00
Kyle Bayes ec506dbde3 Add support to return variable distances in mjc_ccd. This is a no-op change.
PiperOrigin-RevId: 965949465
Change-Id: I099fe1b5dfd722958c339429ddffe33fb66759d2
2026-08-17 07:09:07 -07:00
Michael Moss 6c28e59d02 Remove float enum equality tests in preparation for pybind update.
PiperOrigin-RevId: 965938517
Change-Id: I57d395476358972b9005c7fd871ca89686320242
2026-08-17 06:42:04 -07:00
Yuval Tassa 3c823c5470 Fix inconsistent bullet indentation in changelog admonitions.
PiperOrigin-RevId: 965935062
Change-Id: I9f99ce00571d0062496383e345212beea914d52b
2026-08-17 06:33:18 -07:00
Yuval Tassa c232938233 Move the Simulation panel into the platform toolkit.
PiperOrigin-RevId: 965914672
Change-Id: Ib349b77055c57453780818dd4d8f48899b7024d5
2026-08-17 05:40:26 -07:00
Yuval Tassa 0fa066237a Zero out off-diagonal entries in Cholesky factorization when diagonal is below threshold.
PiperOrigin-RevId: 965909091
Change-Id: If13bf8089b16eb3e21bcc22f75d6ac1366407b36
2026-08-17 05:24:37 -07:00
Michael Moss bbdda5dda5 Update MuJoCo version to 3.12.0 in preparation for breaking changes release.
PiperOrigin-RevId: 965899864
Change-Id: I4fb90e357bed3d7f2f8d86e500aed53646c4b1ea
2026-08-17 05:01:33 -07:00
Copybara-Service 4c993fb238 Merge pull request #3432 from VihaanAgarwal:fix/convex-inertia-unreferenced-mesh
PiperOrigin-RevId: 965896711
Change-Id: I3254a621ef7689544130fd0ce43b86c0261f52b1
2026-08-17 04:52:41 -07:00
Yuval Tassa 90ac80707d Step the timestep and solver tolerances on a well-tempered log ladder
The timestep, the solver tolerances, and impratio span several orders of
magnitude, where a linear +/- step is useless. Add ImGui_LogStepper, whose
buttons walk a "well-tempered" logarithmic ladder of round numbers that
closes each decade on a power of ten (see WellTemperedStep). It lays out
like ImGui's own InputScalar stepper -- field, then the - / + buttons, then
the label.

Apply it to the timestep, Tolerance, the LS/Noslip/CCD/Sleep tolerances,
and Imp Ratio. Strictly-positive quantities for which zero is meaningful
(the tolerances) take a zero_below floor: the ladder's bottom rung is 0, so
stepping down snaps to zero and stepping up off zero returns to the floor.
The timestep and impratio, which never want zero, leave it unset.

PiperOrigin-RevId: 965888812
Change-Id: I823e60913ecb2be2cade96baa5bf7de9e2334d5a
2026-08-17 04:30:54 -07:00
Yuval Tassa ba3f8cf180 Improvements to object launcher.
PiperOrigin-RevId: 965834305
Change-Id: Ied8cea0e8eff8002d14f63b9ddea25f78a9a2985
2026-08-17 02:16:11 -07:00
Yuval Tassa 2f1843f4a7 Redesign the dcmotor controller: setpoint inputs, torque-space gains.
The dcmotor input block is any subset of the canonical list [pos, vel,
ff, voltage], selected with input="pos vel ff voltage" and recorded as
mjtCtrlInput bits in actuator_ctrlspec like pid. Tokens are required in
canonical order: the attribute denotes a set, the block always packs
canonically, and accepting permutations invites reading the string as a
layout choice. The mode flag in gainprm[8] is retired (reserved,
written 0).

Controller gains are now in torque space, as for pid: the controller
commands tau = kp*(q*-l) + kd*(v*-ldot) + ki*x_I + tau_ff over the
present inputs (absent setpoints frozen at zero) and converts to drive
voltage V = R/K * tau + K*ldot. The second term compensates back-EMF,
as the current loop of a real torque-mode driver does (torque commands
are current commands): commanded torque is delivered exactly until a
limit binds, and the torque-speed envelope emerges from the Vmax clamp.
The map uses the nameplate R: thermal resistance growth is not
compensated, so a hot motor under-delivers by R/R(T). A stateless
setpoint dcmotor now matches <pid> exactly, for any K and R; the old
back-EMF droop remains available as the physical behavior of the raw
voltage path. Voltage-space datasheet gains convert by K/R. Controller
inputs require a positive motor constant (the map divides by K), and
controller gains require a controller input.

ff and voltage are distinct inputs, different in kind: ff is a torque
feedforward added to the controller output, uniform with pid's ff
(feedforward in the actuator's output space), while voltage is the raw
terminal voltage of the physical device, injected downstream of the
controller and its Vmax clamp, unclamped (ctrlrange bounds it if
desired). input="voltage" is the default: the plain voltage-commanded
motor, whose behavior is unchanged by this commit. The integrator
always accumulates position error; the old velocity mode's integral
term, ki*(int(u)dt - theta), which tracked the integral of the velocity
command, is retired without replacement, keeping ki mode-independent --
commanded integrated velocity belongs to an integrator activation
state, not to controller gains. slewmax rate-limits the first controller
input -- position setpoint (rad/s), velocity setpoint (rad/s^2) or torque
feedforward (N*m/s), each a real driver feature (reference ramping,
ramped-velocity and ramped-torque input modes); the raw voltage input
is never rate-limited and slewmax requires a controller input.

input="none" selects the empty signature: the actuator owns no controls
at all (nu = 0 is now legal with actuators present) and is purely
passive -- LuGre friction, cogging and back-EMF braking as passive
joint forces. This exists because auxiliary dynamic states (the LuGre
bristle) attach to actuators, not joints. The terminal voltage is
identically zero, i.e. a shorted motor (dynamic braking); motorconst=0
decouples the electrical branch. mjINPUT_NONE is a distinct enum value
because ctrlspec = 0 means "unset, use the type default". History and
delay require an input; the controller voltage override and input read
in mj_fwdActuation are gated on a nonempty block.

The analytic velocity derivative of the controller becomes
dV/dw = -kd*R/K + K, whose second term cancels the back-EMF bias
exactly: the net damping of an unclipped torque-mode motor is -kd, and
of a voltage-mode or passive motor -K^2/R. Viewers label inputs via
mj_actuatorInputName: pos, vel, ff, voltage.

The dcmotor LaTeX design doc is updated accordingly: torque-space
units, the tau->V map and its saturation-generated envelope, the
input-block pipeline figure, and a Passive Operation section.

PiperOrigin-RevId: 965795351
Change-Id: Ibc308ca21bd6bad014e77f950ee08feaad449b73
2026-08-17 00:43:48 -07:00
Yuval Tassa 11fa4a5b45 Remove the redundant phong_2d reflection material
PiperOrigin-RevId: 965538926
Change-Id: I02a99016d5e69130e3827e898343b656f399ddfb
2026-08-16 07:56:51 -07:00
Yuval Tassa 68918d4f4d Fix textures over-tiling on meshes in Filament.
PiperOrigin-RevId: 965535047
Change-Id: I56177b7ac91591ba516bf96e317f57357539e776
2026-08-16 07:38:42 -07:00
Yuval Tassa 3178db50b9 Fix box-box SAT collider code for GCC's pedantic mode.
Also add a detailed architectural comment that might be useful in future.

PiperOrigin-RevId: 965500329
Change-Id: Ia6a2a9137f07f726838b0acb28039a394db0efa2
2026-08-16 04:58:30 -07:00
Yuval Tassa 86e9860106 Rewrite box-box collision: SAT + polygon clipping + true edge-edge contacts.
Replaces the box-box collider's manifold generation and post-filtering with a
single structured implementation, and deletes the accumulated repair logic it
obsoletes. Net 319 lines out of the engine.

Algorithm:
- The separating-axis test keeps the closed-form support evaluation and chooses
  the axis of maximum separation among the 15 candidates by plain argmax.
  Edge-cross axes whose cross product has norm below rounding are skipped: in
  the nearly-parallel regime their direction is cancellation noise, previously
  the source of arbitrary-normal contacts with box-scale spurious depth. A
  winning edge axis within eight degrees of the best face axis is replaced by
  that face unless it is better by five percent (ODE's classic fudge): resting
  stacks otherwise flip between the edge and face contact codes by rounding
  noise from step to step, thrashing the solver warm start until the stack
  explodes. The substitution runs after the search rather than filtering during
  it, so a worse non-aliasing edge cannot steal the contact the substitution
  meant to give to the face.
- Face contacts clip the incident face against the reference face's side planes
  (Sutherland-Hodgman). Depth is measured along the reference normal only,
  never as a Euclidean distance between unrelated points. Contact position is
  midway between the surfaces along the normal, so its distance to either box
  is bounded by half the contact depth. Every surviving vertex of the clipped
  polygon becomes a contact, so the manifold is the actual contact patch, at
  most eight points as before.
- Edge contacts use the closest-point pair between the two supporting edge
  segments. A near-zero axis component makes the support-corner sign ambiguous;
  both signs are enumerated and the closest witness pair wins.
- Margin is an acceptance band throughout: SAT early-out and clip acceptance.
- The rounding thresholds are stated per precision. The separation tests are
  the ones that cost correctness: comparing exactly against the margin reports
  a pair overlapping by less than the rounding error of its own support
  evaluation as separated, and the boxes pass through each other. Over 239k
  overlapping pairs that is eight misses under mjUSESINGLE and none in double;
  the collider this replaces misses the same eight. Slack proportional to the
  summed half-sizes leaves five, which overlap by 7e-9 to 3e-8 of their own
  scale, below single-precision epsilon, where the boxes are not distinguishable
  from touching. Erring toward contact is the safe direction: the driver already
  excludes a contact whose distance reaches the margin.

Deleted: the conditional acceptance cascade keyed on how many points earlier
generators emitted, the u/v clamping that fabricated contacts from out-of-range
projections, the outside-box removal filter and its missing-fallback hole,
exact-floating-point deduplication, and the edge-path depth clamp. The
structure makes those bug classes unrepresentable rather than filtered: depth
is a projection by construction. Every reported depth is the exact support
overlap along the contact's own normal, verified over 246k overlapping poses to
within two ulps; the face preference costs direction, not depth, deviating from
the minimum-translation axis by at most 8.1 degrees and 5.3% of its depth.

The previous implementation is preserved verbatim as mjc_BoxBoxLegacy in
test/engine/boxbox_legacy.c, a static library that only the box-box tests link,
so the claims above are measured rather than asserted. It needs no private
engine symbols. Three tests compare against it:

- NearAlignedManifoldIsExact sweeps the relative angle of a resting pair across
  the regime where the edge-cross axes degenerate into noise, pinning the full
  clipped polygon and a contact normal equal to the face normal exactly, where
  the previous collider drifts off it.
- AlignedTowerStands settles a twenty-box tower, which comes to rest four
  million times quieter than under the previous collider, which never settles
  and eventually topples.
- ShallowOverlapSurvivesRounding pins a pair overlapping by 7e-8 of its scale,
  reported as separated under mjUSESINGLE without slack on the separation tests.

On stacks of plates across aspect ratios from 4:1 to 25:1, five layouts each,
the collider settles into a tight band of 1e-4 to 3e-4 while the previous one
intermittently blows up to as much as 2.6e-2.

engine_collision_box_fuzz_test.cc cross-validates randomized poses against
GJK/EPA on identical box meshes and against a spherical-Fibonacci support
sweep, with hard gates per sample: no phantom penetration, no missed contact at
zero margin, no contact deeper than the true depth, contacts within half their
own depth of both boxes, and one normal per manifold. Both invocations run in
about a second.

EdgeContactAtDepthBound's tolerance widens to the five percent design band; the
three-orders-of-magnitude depth bug it pins is still caught, the deviation
being 0.13 percent of the depth.

The 100-box pile benchmark steps about 7% faster with 1.6% fewer contacts.

PiperOrigin-RevId: 965114952
Change-Id: Ie98cdcce8d1aed3ff2da938cb29703fd9c241258
2026-08-15 01:45:56 -07:00
Sam Haves cc7fb98cf4 Add texture coordinates to primitive shape types.
PiperOrigin-RevId: 964882123
Change-Id: I17723d21f29b3fe28e171de5c3d2bea1f55a94c2
2026-08-14 14:11:23 -07:00
Haroon Qureshi 4929f2cd99 Disable/revert recent refection changes.
PiperOrigin-RevId: 963586393
Change-Id: I65449cfcae4d50664f87296fa69d1660adf60c91
2026-08-12 12:08:00 -07:00
Matija Kecman fca913b4f5 Optimize and robustify asset prefetching and material loading.
- Parallelize asset prefetching (max 4 workers) with retry logic and on-screen error banner, replacing silent failures and cryptic WASM out-of-bounds crashes with explicit missing-file errors.
- Support binary Uint8Array/ArrayBuffer in C++ asset registry via typed_memory_view, preventing Embind string coercion from corrupting binary shader packages into ASCII text.
- Automatically glob .mat files in CMake instead of maintaining a manual list.
- Add missing reflection materials to prefetch arrays.
- Disable caching for index.html in web server so template/script updates apply on normal page reload without stale cache issues, the file is small so caching had a negligible upside.
- Add null resource and payload validation in ObjectManager::LoadMaterial before constructing Filament materials.

PiperOrigin-RevId: 963364509
Change-Id: I7de79df6a5cede4e54683415ee193f1c5a665286
2026-08-12 04:38:35 -07:00
Google DeepMind fb03be0e4f #usd Update third_party/mujoco and third_party/py/mujoco to USD v26
Update USD dependency module paths, includes, Python imports, and plugin registration configurations across third_party/mujoco and third_party/py/mujoco from USD v23 to USD v26.

PiperOrigin-RevId: 963260526
Change-Id: I3778608cb03c8903d0f545c76ae91effba3ec364
2026-08-12 00:26:53 -07:00
Sam Haves dbc10c743b Introduce Tracy profiling infrastructure and macros (internal)
Add public mjprofile.h header with MJ_PROFILE_* macros that get compiled out if Tracy is not enabled.
Integrate Tracy into engine macro timers and build configurations.

PiperOrigin-RevId: 962329763
Change-Id: Iac9d8f9ff0d909beea212a7aa8a6a3dcb512010f
2026-08-10 13:20:14 -07:00
Alessio Quaglino b924ac66bd Add continuous-collision infrastructure for deformables
The discrete collision pipeline generates contact points at a configuration;
this module prices gaps along trajectories: differentiable vertex-triangle,
edge-edge and vertex-geom distance kernels with closest-point barycentrics,
swept-volume candidate generation over the flex bounding-volume hierarchy,
per-pair gap evaluation with the gradient's vertex weights, and a conservative
advancement that bounds each contact pair's time of impact.

Engine-internal, with no consumer in this change: it is the groundwork for
continuous-contact (IPC-style) solvers for flex, which will arrive as callers.
The mjcPair type carries the geometric identity of a candidate pair only;
solver state (multipliers, ages) and cached linearizations belong to the
consumer. The two lengths the module needs -- the standoff cap and the
detection band -- are caller-supplied parameters, not constants.

Flex-flex pairs measure their gap at the midsurface rather than skin-to-skin:
where mesh geometry is tighter than the combined radii (a string threaded
through a hem) a skin gap is permanently negative and the pair would be
discarded as invalid, losing CCD coverage exactly where tunneling is likeliest.
The broad phase adds the radii back into its reach, so detection range is
unchanged.

Tests cover the distance kernels, the geom sharp features, the pair gap with
its gradient checked by central differences at every involved vertex, the
conservative advancement (the analytic cap on a crossing sweep, the
conservative closing-rate bound, the small-motion early-out), and candidate
generation on stacked cloths (pairs within reach found, distant ones not).

PiperOrigin-RevId: 962197295
Change-Id: I90e017f4580a288b2a7d341830077fc273c9acde
2026-08-10 09:27:23 -07:00
Matija Kecman f1c8d3a58f Renamed the notion of handler classes to plugin classes in the Studio Python API
This change refactors the Python API to use the term "plugins" instead of "handlers" for classes containing decorated handler methods. The term handler is still used for an annotated method of a plugin class that handles a specific message type. Also improved some documentation.

PiperOrigin-RevId: 962150099
Change-Id: I34a8cc410cd784b088605490cfa3baccea5c9e71
2026-08-10 07:50:36 -07:00
Kyle Bayes ab1af24911 Compute correct witness point info for multicontact.
PiperOrigin-RevId: 962132590
Change-Id: I6594dc02ad93b1ec63a32157535f1d95b54d1058
2026-08-10 07:09:20 -07:00
Kyle Bayes 0dac756d53 Initialize height field object in mjc_HFieldElem.
PiperOrigin-RevId: 962018078
Change-Id: Ibfdbb45110d3406b40b5ddc36da19606bdd4878a
2026-08-10 02:07:19 -07:00
Hana Joo 0aad65868d suppress pyrefly errors in mujoco
Startblock:
  * // Put other blockers before this line to avoid churning.
  * has lgtm
  * is approved
  * and then
  * all comments are resolved
  * and then
PiperOrigin-RevId: 961854282
Change-Id: I9d323a8ef9f36ffe69cc62d449849eac82dc6858
2026-08-09 15:45:36 -07:00
Yuval Tassa d6dc966c04 Support planar reflections on physically based materials.
PiperOrigin-RevId: 961670546
Change-Id: Ifa69b8251c5f3fae6a76427f13df9c688370c741
2026-08-09 02:03:28 -07:00