MuJoCo Web Viewer: add web client containing code that runs in the browser

PiperOrigin-RevId: 956698568
Change-Id: Ia4bebcb25b488d255994018da03e9115187b890c
This commit is contained in:
Matija Kecman
2026-07-30 13:16:41 -07:00
committed by Copybara-Service
parent 8b78378868
commit 4dd70d2367
11 changed files with 3043 additions and 9 deletions
@@ -46,6 +46,7 @@ void AppendStateBlock(std::vector<std::byte>& buffer, uint32_t tag,
}
// Serializes the render state (exactly kRenderStateSize bytes) into `ptr`.
// Must copy the same fields in the same order as ParseRenderState.
void SerializeRenderStateInto(std::byte* ptr, const mjvCamera& camera,
const mjvPerturb& perturb,
const mjvOption& vis_options, const mjOption& opt,
@@ -78,6 +79,32 @@ void SerializeRenderStateInto(std::byte* ptr, const mjvCamera& camera,
} // namespace
// Parses a render state block produced by SerializeStatePayload.
// Must copy the same fields in the same order as SerializeRenderStateInto.
void ParseRenderState(const std::byte* data, RenderStateView* out) {
const std::byte* ptr = data;
memcpy(&out->camera, ptr, sizeof(mjvCamera));
ptr += sizeof(mjvCamera);
memcpy(&out->perturb, ptr, sizeof(mjvPerturb));
ptr += sizeof(mjvPerturb);
memcpy(&out->vis_options, ptr, sizeof(mjvOption));
ptr += sizeof(mjvOption);
memcpy(&out->opt, ptr, sizeof(mjOption));
ptr += sizeof(mjOption);
memcpy(&out->vis, ptr, sizeof(mjVisual));
ptr += sizeof(mjVisual);
memcpy(&out->stat, ptr, sizeof(mjStatistic));
ptr += sizeof(mjStatistic);
memcpy(out->render_flags, ptr, mjNRNDFLAG);
}
size_t MaxStatePayloadSize(size_t physics_bytes) {
return sizeof(StatePayloadHeader) + 3 * sizeof(StateBlockHeader) +
(sizeof(int32_t) + physics_bytes) + kRenderStateSize +