mujoco-react 10.5.0 → 10.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -11
- package/dist/{chunk-KHZ5U36J.js → chunk-EN55TTGH.js} +2 -2
- package/dist/chunk-EN55TTGH.js.map +1 -0
- package/dist/index.d.ts +41 -5
- package/dist/index.js +122 -25
- package/dist/index.js.map +1 -1
- package/dist/onnx.d.ts +1 -1
- package/dist/spark.d.ts +1 -1
- package/dist/spark.js +1 -1
- package/dist/{types-CViUme8D.d.ts → types-Dvtm4I0o.d.ts} +14 -3
- package/package.json +1 -1
- package/src/core/GenericIK.ts +17 -10
- package/src/hooks/useControlGroup.ts +0 -0
- package/src/hooks/useIkController.ts +33 -5
- package/src/index.ts +3 -1
- package/src/types.ts +22 -3
- package/dist/chunk-KHZ5U36J.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/MujocoProvider.tsx","../src/rendering/CapsuleGeometry.ts","../src/core/SceneLoader.ts","../src/rendering/GeomBuilder.ts","../src/components/SceneRenderer.tsx","../src/components/CameraView.tsx","../src/hooks/useFrameCapture.ts","../src/rendering/cameraFrameSource.ts","../src/rendering/imageProjection.ts","../src/core/MujocoSimProvider.tsx","../src/core/MujocoCanvas.tsx","../src/core/MujocoPhysics.tsx","../src/core/ObservationBuilder.ts","../src/core/createController.tsx","../src/core/GenericIK.ts","../src/hooks/useIkController.ts","../src/components/Body.tsx","../src/components/IkGizmo.tsx","../src/components/ContactMarkers.tsx","../src/components/DragInteraction.tsx","../src/hooks/useSceneLights.ts","../src/components/SceneLights.tsx","../src/components/SplatCollisionProxyPreview.tsx","../src/hooks/useCameraStream.ts","../src/components/Debug.tsx","../src/components/TendonRenderer.tsx","../src/components/FlexRenderer.tsx","../src/components/InstancedGeomRenderer.tsx","../src/hooks/useContacts.ts","../src/components/ContactListener.tsx","../src/hooks/useTrajectoryPlayer.ts","../src/components/TrajectoryPlayer.tsx","../src/hooks/useActuators.ts","../src/hooks/useSitePosition.ts","../src/hooks/useGravityCompensation.ts","../src/hooks/useSensor.ts","../src/hooks/useJointState.ts","../src/hooks/useBodyState.ts","../src/hooks/usePose.ts","../src/hooks/useCtrl.ts","../src/hooks/useControlWriter.ts","../src/hooks/useControlGroup.ts","../src/hooks/useContactHistory.ts","../src/hooks/useKeyboardTeleop.ts","../src/hooks/useKeyboardIkTarget.ts","../src/hooks/usePolicy.ts","../src/hooks/useRemotePolicy.ts","../src/hooks/useObservation.ts","../src/policyObservation.ts","../src/hooks/useNamedObservation.ts","../src/hooks/useTrajectoryRecorder.ts","../src/hooks/useGamepad.ts","../src/hooks/useVideoRecorder.ts","../src/hooks/useCameraFrameCapture.ts","../src/policyCameraFrames.ts","../src/hooks/usePolicyCameraFrames.ts","../src/hooks/usePolicyCameraTensors.ts","../src/hooks/useCameraSequenceRecorder.ts","../src/hooks/useMountedCameraSequenceRecorder.ts","../src/policyControls.ts","../src/hooks/useCtrlNoise.ts","../src/hooks/useBodyMeshes.ts","../src/hooks/useSelectionHighlight.ts","../src/hooks/useCameraAnimation.ts"],"names":["THREE","THREE2","useRef","useEffect","THREE3","jsx","createContext","useFrame","useState","useCallback","value","useMemo","useContext","error","complete","status","THREE4","JOINT_TYPE_NAMES","THREE5","waitForNextAnimationFrame","useThree","api","getQpos","getCtrl","scene","projectImagePointTo3D","jsxs","MujocoCanvas","forwardRef","MujocoPhysics","s","tmp","THREE6","controlGroup","now","group","THREE7","THREE8","THREE9","_raycaster","THREE10","document","_quat","toVector3","target","THREE12","THREE13","GEOM_TYPE_NAMES","THREE14","_mat4","THREE15","SENSOR_TYPE_NAMES","THREE16","_matrix","THREE17","quaternionFromMujocoQuat","p","geomNameCacheByModel","THREE18","queuedActions","controller","THREE19","THREE20"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport loadMujoco from '@mujoco/mujoco';\nimport defaultMujocoWasmUrl from '@mujoco/mujoco/mujoco.wasm?url';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport type { MujocoModule, MujocoContextValue } from '../types';\n\nconst MujocoContext = createContext<MujocoContextValue>({\n mujoco: null,\n status: 'loading',\n error: null,\n});\n\n/**\n * Hook to access the MuJoCo WASM module.\n */\nexport function useMujocoWasm(): MujocoContextValue {\n return useContext(MujocoContext);\n}\n\nexport type MujocoWasmVariant = 'single' | 'threaded' | 'auto';\n\nexport interface MujocoLoaderOptions {\n locateFile?: (path: string) => string;\n printErr?: (text: string) => void;\n}\n\nexport type MujocoLoader = (options?: MujocoLoaderOptions) => Promise<unknown>;\n\nexport interface MujocoProviderProps {\n wasmUrl?: string;\n /** Optional URL for the multi-threaded WASM asset. */\n mtWasmUrl?: string;\n /**\n * Optional official multi-threaded loader, usually imported from\n * `@mujoco/mujoco/mt`. It is supplied by the app so the default package path\n * does not force every bundler to process the threaded Emscripten build.\n */\n threadedLoader?: MujocoLoader;\n /**\n * MuJoCo WASM build to load. `single` is the default and works everywhere.\n * `threaded` requires `threadedLoader` and cross-origin isolation. `auto`\n * uses threaded only when both conditions are satisfied.\n */\n wasmVariant?: MujocoWasmVariant;\n /** Timeout in ms for WASM module load. Default: 30000. */\n timeout?: number;\n children: React.ReactNode;\n onError?: (error: Error) => void;\n}\n\nfunction canUseThreadedWasm(): boolean {\n return typeof globalThis !== 'undefined' && globalThis.crossOriginIsolated === true;\n}\n\nfunction isMujocoModule(value: unknown): value is MujocoModule {\n return typeof value === 'object'\n && value !== null\n && 'FS' in value\n && 'MjModel' in value\n && 'MjData' in value\n && 'mj_step' in value;\n}\n\nfunction hasWasmUrl(value: string | undefined): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\nfunction resolveWasmVariant(\n variant: MujocoWasmVariant | undefined,\n threadedLoader: MujocoLoader | undefined,\n mtWasmUrl: string | undefined\n): 'single' | 'threaded' {\n if (variant === 'threaded') return 'threaded';\n if (variant === 'auto' && threadedLoader && mtWasmUrl && canUseThreadedWasm()) return 'threaded';\n return 'single';\n}\n\n/**\n * MujocoProvider — WASM / module lifecycle.\n * Loads the MuJoCo WASM module on mount and provides it to children via context.\n */\nexport function MujocoProvider({\n wasmUrl,\n mtWasmUrl,\n threadedLoader,\n wasmVariant = 'single',\n timeout = 30000,\n children,\n onError,\n}: MujocoProviderProps) {\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n const [error, setError] = useState<string | null>(null);\n const moduleRef = useRef<MujocoModule | null>(null);\n const isMounted = useRef(true);\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n isMounted.current = true;\n\n const variant = resolveWasmVariant(wasmVariant, threadedLoader, mtWasmUrl);\n if (variant === 'threaded' && !threadedLoader) {\n const err = new Error('MujocoProvider wasmVariant=\"threaded\" requires a threadedLoader from @mujoco/mujoco/mt');\n setError(err.message);\n setStatus('error');\n onErrorRef.current?.(err);\n return;\n }\n let selectedWasmUrl = wasmUrl ?? defaultMujocoWasmUrl;\n\n if (variant === 'threaded') {\n if (!hasWasmUrl(mtWasmUrl)) {\n const err = new Error('MujocoProvider wasmVariant=\"threaded\" requires mtWasmUrl from @mujoco/mujoco/mt/mujoco.wasm?url');\n setError(err.message);\n setStatus('error');\n onErrorRef.current?.(err);\n return;\n }\n selectedWasmUrl = mtWasmUrl;\n }\n\n const load: MujocoLoader = variant === 'threaded' && threadedLoader ? threadedLoader : loadMujoco;\n\n const wasmPromise = load({\n locateFile: (path: string) => path.endsWith('.wasm') ? selectedWasmUrl : path,\n printErr: (text: string) => {\n if (text.includes('Aborted') && isMounted.current) {\n setError('Simulation crashed. Reload page.');\n setStatus('error');\n }\n },\n });\n\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`WASM module load timed out after ${timeout}ms`)), timeout)\n );\n\n Promise.race([wasmPromise, timeoutPromise])\n .then((inst: unknown) => {\n if (isMounted.current) {\n if (!isMujocoModule(inst)) {\n throw new Error('MuJoCo WASM module initialized with an unexpected shape');\n }\n moduleRef.current = inst;\n setStatus('ready');\n }\n })\n .catch((err: Error) => {\n if (isMounted.current) {\n const msg = err.message || 'Failed to init spatial simulation';\n setError(msg);\n setStatus('error');\n onErrorRef.current?.(new Error(msg));\n }\n });\n\n return () => {\n isMounted.current = false;\n };\n }, [wasmUrl, mtWasmUrl, threadedLoader, wasmVariant, timeout]);\n\n return (\n <MujocoContext.Provider\n value={{ mujoco: moduleRef.current, status, error }}\n >\n {children}\n </MujocoContext.Provider>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\n\ninterface InternalBufferGeometry extends THREE.BufferGeometry {\n type: string;\n}\n\n/**\n * CapsuleGeometry\n * Custom geometry for capsule shape.\n */\nexport class CapsuleGeometry extends THREE.BufferGeometry {\n parameters: { radius: number; length: number; capSegments: number; radialSegments: number; };\n\n constructor(radius = 1, length = 1, capSegments = 4, radialSegments = 8) {\n super();\n (this as unknown as InternalBufferGeometry).type = 'CapsuleGeometry';\n this.parameters = { radius, length, capSegments, radialSegments };\n const path = new THREE.Path();\n path.absarc(0, -length / 2, radius, Math.PI * 1.5, 0, false);\n path.absarc(0, length / 2, radius, 0, Math.PI * 0.5, false);\n const latheGeometry = new THREE.LatheGeometry(path.getPoints(capSegments), radialSegments);\n \n const self = this as THREE.BufferGeometry;\n self.setIndex(latheGeometry.getIndex());\n self.setAttribute('position', latheGeometry.getAttribute('position'));\n self.setAttribute('normal', latheGeometry.getAttribute('normal'));\n self.setAttribute('uv', latheGeometry.getAttribute('uv'));\n }\n}","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n ActuatedJointInfo,\n ActuatorInfo,\n ControlGroupInfo,\n ControlGroupSelector,\n ControlJointInfo,\n JointInfo,\n LoadFromFilesOptions,\n LocalMujocoFile,\n MujocoData,\n MujocoModel,\n MujocoModule,\n ResourceSelector,\n} from '../types';\nimport { SceneConfig, SceneObject, XmlPatch } from '../types';\n\nconst JOINT_TYPE_NAMES: Record<number, string> = {\n 0: 'free',\n 1: 'ball',\n 2: 'slide',\n 3: 'hinge',\n};\n\n/**\n * Reads a null-terminated C string from MuJoCo's WASM memory.\n */\nexport function getName(mjModel: MujocoModel, address: number): string {\n let name = '';\n let idx = address;\n let safety = 0;\n while (mjModel.names[idx] !== 0 && safety < 100) {\n name += String.fromCharCode(mjModel.names[idx++]);\n safety++;\n }\n return name;\n}\n\n/**\n * Find a site by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSiteByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsite; i++) {\n if (getName(mjModel, mjModel.name_siteadr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find an actuator by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findActuatorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nu; i++) {\n if (getName(mjModel, mjModel.name_actuatoradr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find a keyframe by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findKeyframeByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nkey; i++) {\n if (getName(mjModel, mjModel.name_keyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a body by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findBodyByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nbody; i++) {\n if (getName(mjModel, mjModel.name_bodyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a joint by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findJointByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.njnt; i++) {\n if (getName(mjModel, mjModel.name_jntadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a geom by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findGeomByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.ngeom; i++) {\n if (getName(mjModel, mjModel.name_geomadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a sensor by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSensorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsensor; i++) {\n if (getName(mjModel, mjModel.name_sensoradr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a camera by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findCameraByName(mjModel: MujocoModel, name: string): number {\n const ncam = mjModel.ncam ?? 0;\n const addresses = mjModel.name_camadr;\n if (!addresses) return -1;\n for (let i = 0; i < ncam; i++) {\n if (getName(mjModel, addresses[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a tendon by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findTendonByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < (mjModel.ntendon ?? 0); i++) {\n if (getName(mjModel, mjModel.name_tendonadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Return qpos address for actuators that directly target a scalar joint.\n * Returns -1 for non-joint transmissions and multi-DOF joints.\n */\nexport function getActuatedScalarQposAdr(mjModel: MujocoModel, actuatorId: number): number {\n if (actuatorId < 0 || actuatorId >= mjModel.nu) return -1;\n\n // mjTRN_JOINT=0, mjTRN_JOINTINPARENT=1. Other transmission types don't map ctrl to a single qpos.\n const trnType = mjModel.actuator_trntype?.[actuatorId];\n if (trnType !== undefined && trnType !== 0 && trnType !== 1) return -1;\n\n const jointId = mjModel.actuator_trnid[2 * actuatorId];\n if (jointId < 0 || jointId >= mjModel.njnt) return -1;\n\n const jntType = mjModel.jnt_type[jointId];\n if (jntType !== 2 && jntType !== 3) return -1; // slide=2, hinge=3\n\n return mjModel.jnt_qposadr[jointId];\n}\n\nfunction getScalarJointDim(jointType: number): 0 | 1 {\n return jointType === 2 || jointType === 3 ? 1 : 0;\n}\n\nfunction unlimitedRange(): [number, number] {\n return [-Infinity, Infinity];\n}\n\nfunction isScalarJoint(mjModel: MujocoModel, jointId: number): boolean {\n return jointId >= 0 && jointId < mjModel.njnt && getScalarJointDim(mjModel.jnt_type[jointId]) === 1;\n}\n\nfunction getActuatorJointId(mjModel: MujocoModel, actuatorId: number): number {\n if (actuatorId < 0 || actuatorId >= mjModel.nu) return -1;\n const trnType = mjModel.actuator_trntype?.[actuatorId];\n if (trnType !== undefined && trnType !== 0 && trnType !== 1) return -1;\n const jointId = mjModel.actuator_trnid[2 * actuatorId];\n return isScalarJoint(mjModel, jointId) ? jointId : -1;\n}\n\nfunction getJointInfo(mjModel: MujocoModel, jointId: number): JointInfo {\n const type = mjModel.jnt_type[jointId];\n const range: [number, number] = [mjModel.jnt_range[2 * jointId], mjModel.jnt_range[2 * jointId + 1]];\n return {\n id: jointId,\n name: getName(mjModel, mjModel.name_jntadr[jointId]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range,\n limited: range[0] < range[1],\n bodyId: mjModel.jnt_bodyid[jointId],\n qposAdr: mjModel.jnt_qposadr[jointId],\n dofAdr: mjModel.jnt_dofadr[jointId],\n };\n}\n\nfunction getActuatorInfo(mjModel: MujocoModel, actuatorId: number): ActuatorInfo {\n const hasRange = mjModel.actuator_ctrlrange[2 * actuatorId] < mjModel.actuator_ctrlrange[2 * actuatorId + 1];\n return {\n id: actuatorId,\n name: getName(mjModel, mjModel.name_actuatoradr[actuatorId]),\n range: hasRange\n ? [mjModel.actuator_ctrlrange[2 * actuatorId], mjModel.actuator_ctrlrange[2 * actuatorId + 1]]\n : unlimitedRange(),\n };\n}\n\nfunction includesResourceName(names: readonly string[], name: string): boolean {\n return names.includes(name);\n}\n\nfunction matchesSelector<TInfo extends { name: string }, TName extends string>(\n info: TInfo,\n selector: ResourceSelector<TInfo, TName>\n): boolean {\n if (typeof selector === 'string') return info.name === selector;\n if (selector instanceof RegExp) return selector.test(info.name);\n if (Array.isArray(selector)) return includesResourceName(selector, info.name);\n if (typeof selector === 'function') return selector(info);\n return false;\n}\n\nfunction orderedJointIdsFromSelector(\n mjModel: MujocoModel,\n selector: ResourceSelector<JointInfo, string>\n): number[] {\n if (typeof selector === 'string') {\n const id = findJointByName(mjModel, selector);\n return id >= 0 && isScalarJoint(mjModel, id) ? [id] : [];\n }\n if (Array.isArray(selector)) {\n return selector\n .map((name) => findJointByName(mjModel, name))\n .filter((id) => id >= 0 && isScalarJoint(mjModel, id));\n }\n const ids: number[] = [];\n for (let i = 0; i < mjModel.njnt; i++) {\n if (!isScalarJoint(mjModel, i)) continue;\n const info = getJointInfo(mjModel, i);\n if (matchesSelector(info, selector)) ids.push(i);\n }\n return ids;\n}\n\nfunction orderedActuatorIdsFromSelector(\n mjModel: MujocoModel,\n selector: ResourceSelector<ActuatorInfo, string>\n): number[] {\n if (typeof selector === 'string') {\n const id = findActuatorByName(mjModel, selector);\n return id >= 0 && getActuatorJointId(mjModel, id) >= 0 ? [id] : [];\n }\n if (Array.isArray(selector)) {\n return selector\n .map((name) => findActuatorByName(mjModel, name))\n .filter((id) => id >= 0 && getActuatorJointId(mjModel, id) >= 0);\n }\n const ids: number[] = [];\n for (let i = 0; i < mjModel.nu; i++) {\n if (getActuatorJointId(mjModel, i) < 0) continue;\n const info = getActuatorInfo(mjModel, i);\n if (matchesSelector(info, selector)) ids.push(i);\n }\n return ids;\n}\n\nfunction inferScalarJointChain(mjModel: MujocoModel, bodyId: number): number[] {\n if (bodyId < 0 || bodyId >= mjModel.nbody) return [];\n const chainByBody: number[][] = [];\n let current = bodyId;\n const seen = new Set<number>();\n\n while (current >= 0 && current < mjModel.nbody && !seen.has(current)) {\n seen.add(current);\n const joints: number[] = [];\n const jointCount = mjModel.body_jntnum[current] ?? 0;\n const jointStart = mjModel.body_jntadr[current] ?? -1;\n for (let i = 0; i < jointCount; i++) {\n const jointId = jointStart + i;\n if (isScalarJoint(mjModel, jointId)) joints.push(jointId);\n }\n if (joints.length) chainByBody.push(joints);\n const parent = mjModel.body_parentid[current];\n if (parent === current) break;\n current = parent;\n }\n\n return chainByBody.reverse().flat();\n}\n\nfunction unique(values: number[]): number[] {\n const seen = new Set<number>();\n const result: number[] = [];\n for (const value of values) {\n if (seen.has(value)) continue;\n seen.add(value);\n result.push(value);\n }\n return result;\n}\n\nfunction findActuatorForJoint(mjModel: MujocoModel, jointId: number, preferredActuatorIds?: number[]): number {\n const search = preferredActuatorIds ?? Array.from({ length: mjModel.nu }, (_, i) => i);\n for (const actuatorId of search) {\n if (getActuatorJointId(mjModel, actuatorId) === jointId) return actuatorId;\n }\n return -1;\n}\n\nfunction buildControlGroup(\n mjModel: MujocoModel,\n jointIds: number[],\n preferredActuatorIds?: number[]\n): ControlGroupInfo | null {\n const ids = unique(jointIds).filter((id) => isScalarJoint(mjModel, id));\n if (!ids.length) return null;\n\n const joints: ControlJointInfo[] = [];\n const actuators: ActuatorInfo[] = [];\n const qposAdr: number[] = [];\n const dofAdr: number[] = [];\n const ctrlAdr: number[] = [];\n\n for (const jointId of ids) {\n const actuatorId = findActuatorForJoint(mjModel, jointId, preferredActuatorIds);\n const joint = getJointInfo(mjModel, jointId);\n qposAdr.push(joint.qposAdr);\n dofAdr.push(joint.dofAdr);\n\n if (actuatorId >= 0) {\n const actuator = getActuatorInfo(mjModel, actuatorId);\n actuators.push(actuator);\n ctrlAdr.push(actuatorId);\n joints.push({\n ...joint,\n actuatorId,\n actuatorName: actuator.name,\n ctrlAdr: actuatorId,\n ctrlRange: actuator.range,\n });\n } else {\n joints.push({\n ...joint,\n actuatorId: null,\n actuatorName: null,\n ctrlAdr: null,\n ctrlRange: null,\n });\n }\n }\n\n return {\n joints,\n actuators,\n qposAdr,\n dofAdr,\n ctrlAdr,\n readQpos(data: MujocoData) {\n return new Float64Array(qposAdr.map((adr) => data.qpos[adr] ?? 0));\n },\n readCtrl(data: MujocoData) {\n return new Float64Array(joints.map((joint) => joint.ctrlAdr === null ? 0 : data.ctrl[joint.ctrlAdr] ?? 0));\n },\n writeQpos(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, qposAdr.length); i++) {\n data.qpos[qposAdr[i]] = values[i];\n }\n },\n writeCtrl(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, joints.length); i++) {\n const adr = joints[i].ctrlAdr;\n if (adr !== null) data.ctrl[adr] = values[i];\n }\n },\n };\n}\n\nexport function getActuatedJoints(mjModel: MujocoModel): ActuatedJointInfo[] {\n const result: ActuatedJointInfo[] = [];\n for (let actuatorId = 0; actuatorId < mjModel.nu; actuatorId++) {\n const jointId = getActuatorJointId(mjModel, actuatorId);\n if (jointId < 0) continue;\n const actuator = getActuatorInfo(mjModel, actuatorId);\n result.push({\n ...getJointInfo(mjModel, jointId),\n actuatorId,\n actuatorName: actuator.name,\n ctrlAdr: actuatorId,\n ctrlRange: actuator.range,\n });\n }\n return result;\n}\n\nexport function getControlMap(mjModel: MujocoModel): ControlGroupInfo {\n const actuatorIds = Array.from({ length: mjModel.nu }, (_, i) => i)\n .filter((id) => getActuatorJointId(mjModel, id) >= 0);\n const jointIds = actuatorIds.map((id) => getActuatorJointId(mjModel, id));\n return buildControlGroup(mjModel, jointIds, actuatorIds) ?? createContiguousControlGroup(mjModel, 0);\n}\n\nexport function resolveControlGroup(\n mjModel: MujocoModel,\n selector: ControlGroupSelector\n): ControlGroupInfo | null {\n if (selector.actuators) {\n const actuatorIds = orderedActuatorIdsFromSelector(mjModel, selector.actuators);\n const jointIds = actuatorIds.map((id) => getActuatorJointId(mjModel, id));\n return buildControlGroup(mjModel, jointIds, actuatorIds);\n }\n\n if (selector.joints) {\n return buildControlGroup(mjModel, orderedJointIdsFromSelector(mjModel, selector.joints));\n }\n\n if (selector.siteName) {\n const siteId = findSiteByName(mjModel, selector.siteName);\n const bodyId = siteId >= 0 ? (mjModel.site_bodyid?.[siteId] ?? -1) : -1;\n return buildControlGroup(mjModel, inferScalarJointChain(mjModel, bodyId));\n }\n\n if (selector.bodyName) {\n return buildControlGroup(mjModel, inferScalarJointChain(mjModel, findBodyByName(mjModel, selector.bodyName)));\n }\n\n return getControlMap(mjModel);\n}\n\nexport function createContiguousControlGroup(mjModel: MujocoModel, count: number): ControlGroupInfo {\n const n = Math.max(0, Math.min(count, mjModel.nq, mjModel.nu));\n const joints: ControlJointInfo[] = [];\n const actuators: ActuatorInfo[] = [];\n const qposAdr: number[] = [];\n const dofAdr: number[] = [];\n const ctrlAdr: number[] = [];\n\n for (let i = 0; i < n; i++) {\n qposAdr.push(i);\n dofAdr.push(i);\n ctrlAdr.push(i);\n const jointId = Array.from({ length: mjModel.njnt }, (_, id) => id)\n .find((id) => mjModel.jnt_qposadr[id] === i);\n const actuator = getActuatorInfo(mjModel, i);\n actuators.push(actuator);\n joints.push({\n ...(jointId !== undefined ? getJointInfo(mjModel, jointId) : {\n id: i,\n name: `qpos${i}`,\n type: 3,\n typeName: 'hinge',\n range: unlimitedRange(),\n limited: false,\n bodyId: -1,\n qposAdr: i,\n dofAdr: i,\n }),\n actuatorId: i,\n actuatorName: actuator.name,\n ctrlAdr: i,\n ctrlRange: actuator.range,\n });\n }\n\n return {\n joints,\n actuators,\n qposAdr,\n dofAdr,\n ctrlAdr,\n readQpos(data: MujocoData) {\n return new Float64Array(qposAdr.map((adr) => data.qpos[adr] ?? 0));\n },\n readCtrl(data: MujocoData) {\n return new Float64Array(ctrlAdr.map((adr) => data.ctrl[adr] ?? 0));\n },\n writeQpos(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, qposAdr.length); i++) data.qpos[qposAdr[i]] = values[i];\n },\n writeCtrl(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, ctrlAdr.length); i++) data.ctrl[ctrlAdr[i]] = values[i];\n },\n };\n}\n\n/**\n * Convert a SceneObject config to MuJoCo XML.\n */\nfunction sceneObjectToXml(obj: SceneObject): string {\n const joint = obj.freejoint ? '<freejoint/>' : '';\n const geomName = obj.geomName ?? `${obj.name}_geom`;\n const pos = obj.position.map((v) => v.toFixed(3)).join(' ');\n const sizeValues = obj.type === 'sphere'\n ? obj.size.slice(0, 1)\n : obj.type === 'cylinder'\n ? obj.size.slice(0, 2)\n : obj.size;\n const size = sizeValues.map((v) => v.toFixed(3)).join(' ');\n const rgba = obj.rgba.join(' ');\n const mass = obj.mass ? ` mass=\"${obj.mass}\"` : '';\n const friction = obj.friction ? ` friction=\"${obj.friction}\"` : '';\n const solref = obj.solref ? ` solref=\"${obj.solref}\"` : '';\n const solimp = obj.solimp ? ` solimp=\"${obj.solimp}\"` : '';\n const condim = obj.condim ? ` condim=\"${obj.condim}\"` : '';\n const contype = obj.contype ?? 1;\n const conaffinity = obj.conaffinity ?? 1;\n const group = obj.group !== undefined ? ` group=\"${obj.group}\"` : '';\n return `<body name=\"${obj.name}\" pos=\"${pos}\">${joint}<geom name=\"${geomName}\" type=\"${obj.type}\" size=\"${size}\" rgba=\"${rgba}\" contype=\"${contype}\" conaffinity=\"${conaffinity}\"${mass}${friction}${solref}${solimp}${condim}${group}/></body>`;\n}\n\n/** Create virtual directory structure for a file path. */\nfunction ensureDir(mujoco: MujocoModule, fname: string) {\n const dirParts = fname.split('/');\n dirParts.pop();\n let currentPath = '/working';\n for (const part of dirParts) {\n currentPath += '/' + part;\n try { mujoco.FS.mkdir(currentPath); } catch { /* ignore */ }\n }\n}\n\ninterface LoadResult {\n mjModel: MujocoModel;\n mjData: MujocoData;\n}\n\nfunction loadModelFromPath(mujoco: MujocoModule, path: string): MujocoModel {\n if (mujoco.MjModel.from_xml_path) {\n return mujoco.MjModel.from_xml_path(path);\n }\n if (mujoco.MjModel.loadFromXML) {\n return mujoco.MjModel.loadFromXML(path);\n }\n throw new Error('MuJoCo WASM module does not expose an XML path loader');\n}\n\nfunction isModelTextFile(fname: string): boolean {\n const lower = fname.toLowerCase();\n return lower.endsWith('.xml') || lower.endsWith('.urdf') || lower.endsWith('.mjcf');\n}\n\nfunction normalizeVfsPath(path: string): string {\n const parts = path.replace(/\\\\/g, '/').split('/');\n const norm: string[] = [];\n for (const part of parts) {\n if (!part || part === '.') continue;\n if (part === '..') norm.pop();\n else norm.push(part);\n }\n return norm.join('/');\n}\n\nfunction localFilePath(file: LocalMujocoFile): string {\n return normalizeVfsPath(file.webkitRelativePath || file.name);\n}\n\nfunction dirname(path: string): string {\n const normalized = normalizeVfsPath(path);\n const idx = normalized.lastIndexOf('/');\n return idx === -1 ? '' : normalized.slice(0, idx + 1);\n}\n\nfunction relativeVfsPath(fromDir: string, targetPath: string): string {\n const from = normalizeVfsPath(fromDir).split('/').filter(Boolean);\n const target = normalizeVfsPath(targetPath).split('/').filter(Boolean);\n while (from.length && target.length && from[0] === target[0]) {\n from.shift();\n target.shift();\n }\n return [...from.map(() => '..'), ...target].join('/') || '.';\n}\n\nfunction inferSceneFile(files: readonly LocalMujocoFile[], options?: LoadFromFilesOptions): string {\n if (options?.sceneFile) return normalizeVfsPath(options.sceneFile);\n\n const paths = files.map(localFilePath);\n const preferred = ['scene.xml', 'model.xml', 'robot.xml', 'scene.urdf', 'model.urdf', 'robot.urdf'];\n for (const name of preferred) {\n const match = paths.find((path) => path.endsWith(name));\n if (match) return match;\n }\n\n const firstModel = paths.find(isModelTextFile);\n if (!firstModel) throw new Error('No MJCF XML or URDF file found in FileList');\n return firstModel;\n}\n\nexport function createSceneConfigFromFiles(\n files: FileList | readonly LocalMujocoFile[],\n options: LoadFromFilesOptions = {}\n): SceneConfig {\n const fileArray = Array.from(files) as LocalMujocoFile[];\n return {\n src: '',\n sceneFile: inferSceneFile(fileArray, options),\n files: fileArray,\n environmentFiles: options.environmentFiles?.map(normalizeVfsPath),\n homeJoints: options.homeJoints,\n xmlPatches: options.xmlPatches,\n sceneObjects: options.sceneObjects,\n onReset: options.onReset,\n };\n}\n\nconst ENVIRONMENT_MERGE_SECTIONS = [\n 'asset',\n 'worldbody',\n 'contact',\n 'equality',\n 'tendon',\n 'sensor',\n 'keyframe',\n 'custom',\n 'extension',\n] as const;\n\nfunction directChild(parent: Element, tagName: string): Element | null {\n const lower = tagName.toLowerCase();\n for (const child of Array.from(parent.children)) {\n if (child.tagName.toLowerCase() === lower) return child;\n }\n return null;\n}\n\nfunction ensureTopLevelSection(doc: XMLDocument, tagName: string): Element {\n const root = doc.documentElement;\n const existing = directChild(root, tagName);\n if (existing) return existing;\n\n const section = doc.createElement(tagName);\n if (tagName === 'asset') {\n const worldbody = directChild(root, 'worldbody');\n if (worldbody) root.insertBefore(section, worldbody);\n else root.appendChild(section);\n } else {\n root.appendChild(section);\n }\n return section;\n}\n\nfunction readCompilerDirs(doc: XMLDocument) {\n const compiler = directChild(doc.documentElement, 'compiler');\n const assetDir = compiler?.getAttribute('assetdir') || '';\n return {\n meshDir: compiler?.getAttribute('meshdir') || assetDir,\n textureDir: compiler?.getAttribute('texturedir') || assetDir,\n };\n}\n\nfunction isExternalPath(path: string): boolean {\n return /^[a-z]+:\\/\\//i.test(path) || path.startsWith('package://') || path.startsWith('/');\n}\n\nfunction fileReferencePrefix(el: Element, compilerDirs: ReturnType<typeof readCompilerDirs>): string {\n const tag = el.tagName.toLowerCase();\n if (tag === 'mesh') return compilerDirs.meshDir ? compilerDirs.meshDir + '/' : '';\n if (tag === 'texture' || tag === 'hfield') return compilerDirs.textureDir ? compilerDirs.textureDir + '/' : '';\n return '';\n}\n\nfunction rewriteFileReferencesForMerge(node: Element, sourceFile: string, targetFile: string, sourceDoc: XMLDocument) {\n const sourceDir = dirname(sourceFile);\n const targetDir = dirname(targetFile);\n const compilerDirs = readCompilerDirs(sourceDoc);\n node.querySelectorAll('[file], [filename]').forEach((el) => {\n const attr = el.hasAttribute('file') ? 'file' : 'filename';\n const value = el.getAttribute(attr);\n if (!value || isExternalPath(value)) return;\n\n const sourceRelativePath = normalizeVfsPath(fileReferencePrefix(el, compilerDirs) + value);\n const resolvedPath = normalizeVfsPath(sourceDir + sourceRelativePath);\n el.setAttribute(attr, relativeVfsPath(targetDir, resolvedPath));\n });\n}\n\nfunction hasParseError(doc: XMLDocument): boolean {\n return doc.getElementsByTagName('parsererror').length > 0;\n}\n\nfunction composeEnvironmentXml(\n sceneXml: string,\n config: SceneConfig,\n parser: DOMParser,\n environmentXmlByPath: Map<string, string>\n): string {\n const environmentFiles = config.environmentFiles?.map(normalizeVfsPath) ?? [];\n if (!environmentFiles.length) return sceneXml;\n\n const sceneDoc = parser.parseFromString(sceneXml, 'text/xml');\n if (hasParseError(sceneDoc)) {\n console.warn(`Could not compose environments: failed to parse ${config.sceneFile}`);\n return sceneXml;\n }\n\n for (const environmentFile of environmentFiles) {\n const environmentXml = environmentXmlByPath.get(environmentFile);\n if (!environmentXml) {\n console.warn(`Environment XML not found: ${environmentFile}`);\n continue;\n }\n\n const environmentDoc = parser.parseFromString(environmentXml, 'text/xml');\n if (hasParseError(environmentDoc)) {\n console.warn(`Skipping environment XML with parse errors: ${environmentFile}`);\n continue;\n }\n\n for (const sectionName of ENVIRONMENT_MERGE_SECTIONS) {\n const environmentSection = directChild(environmentDoc.documentElement, sectionName);\n if (!environmentSection?.children.length) continue;\n\n const targetSection = ensureTopLevelSection(sceneDoc, sectionName);\n for (const child of Array.from(environmentSection.children)) {\n const imported = sceneDoc.importNode(child, true) as Element;\n rewriteFileReferencesForMerge(imported, environmentFile, config.sceneFile, environmentDoc);\n targetSection.appendChild(imported);\n }\n }\n }\n\n return new XMLSerializer().serializeToString(sceneDoc);\n}\n\nfunction findTextByConfiguredPath(textByPath: Map<string, string>, configuredPath: string): string | undefined {\n const normalized = normalizeVfsPath(configuredPath);\n const direct = textByPath.get(normalized);\n if (direct) return direct;\n\n const suffix = '/' + normalized;\n for (const [path, text] of textByPath) {\n if (path.endsWith(suffix) || path === normalized.split('/').pop()) return text;\n }\n return undefined;\n}\n\nfunction applyXmlPatches(text: string, fname: string, config: SceneConfig): string {\n let result = text;\n for (const patch of config.xmlPatches ?? []) {\n if (fname.endsWith(patch.target) || fname === patch.target) {\n if (patch.replace) {\n const [from, to] = patch.replace;\n if (result.includes(from)) {\n result = result.replace(from, to);\n } else {\n const preview = from.length > 80 ? `${from.slice(0, 80)}...` : from;\n console.warn(`XML patch replace pattern not found in ${fname}: \"${preview}\"`);\n }\n }\n if (patch.inject && patch.injectAfter) {\n const idx = result.indexOf(patch.injectAfter);\n if (idx !== -1) {\n const tagEnd = result.indexOf('>', idx + patch.injectAfter.length);\n if (tagEnd !== -1) {\n result = result.slice(0, tagEnd + 1) + patch.inject + result.slice(tagEnd + 1);\n } else {\n console.warn(`XML patch inject failed in ${fname}: could not find tag end after \"${patch.injectAfter}\"`);\n }\n } else {\n const preview = patch.injectAfter.length > 80\n ? `${patch.injectAfter.slice(0, 80)}...`\n : patch.injectAfter;\n console.warn(`XML patch inject anchor not found in ${fname}: \"${preview}\"`);\n }\n }\n }\n }\n\n if (fname === config.sceneFile && config.sceneObjects?.length && result.includes('</worldbody>')) {\n const xml = config.sceneObjects.map((obj) => sceneObjectToXml(obj)).join('');\n result = result.replace('</worldbody>', xml + '</worldbody>');\n }\n\n return result;\n}\n\nasync function loadSceneFromFiles(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n const files = config.files ?? [];\n if (!files.length) throw new Error('loadFromFiles requires at least one File');\n\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const parser = new DOMParser();\n const byPath = new Map<string, LocalMujocoFile>();\n const byBasename = new Map<string, LocalMujocoFile>();\n const written = new Set<string>();\n const textByPath = new Map<string, string>();\n\n for (const file of files) {\n const path = localFilePath(file);\n byPath.set(path, file);\n byBasename.set(path.split('/').pop() ?? path, file);\n }\n\n for (const [path, file] of byPath) {\n onProgress?.(`Reading ${path}...`);\n ensureDir(mujoco, path);\n if (isModelTextFile(path)) {\n const text = applyXmlPatches(await file.text(), path, config);\n textByPath.set(path, text);\n } else {\n mujoco.FS.writeFile(`/working/${path}`, new Uint8Array(await file.arrayBuffer()));\n written.add(path);\n }\n }\n\n const environmentXmlByPath = new Map<string, string>();\n for (const environmentFile of config.environmentFiles?.map(normalizeVfsPath) ?? []) {\n const environmentXml = findTextByConfiguredPath(textByPath, environmentFile);\n if (environmentXml) environmentXmlByPath.set(environmentFile, environmentXml);\n }\n\n for (const [path, text] of textByPath) {\n const composedText = path === config.sceneFile\n ? composeEnvironmentXml(text, config, parser, environmentXmlByPath)\n : text;\n textByPath.set(path, composedText);\n ensureDir(mujoco, path);\n mujoco.FS.writeFile(`/working/${path}`, composedText);\n written.add(path);\n }\n\n for (const [path, text] of textByPath) {\n const deps = collectDependencyPaths(text, path, parser);\n for (const dep of deps) {\n if (written.has(dep)) continue;\n const file = byPath.get(dep) ?? byBasename.get(dep.split('/').pop() ?? dep);\n if (!file) continue;\n ensureDir(mujoco, dep);\n if (isModelTextFile(dep)) {\n mujoco.FS.writeFile(`/working/${dep}`, applyXmlPatches(await file.text(), dep, config));\n } else {\n mujoco.FS.writeFile(`/working/${dep}`, new Uint8Array(await file.arrayBuffer()));\n }\n written.add(dep);\n }\n }\n\n onProgress?.('Loading model...');\n const mjModel = loadModelFromPath(mujoco, `/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n applyInitialPose(mjModel, mjData, config);\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData };\n}\n\nfunction applyInitialPose(mjModel: MujocoModel, mjData: MujocoData, config: SceneConfig) {\n if (!config.homeJoints) return;\n const homeCount = Math.min(config.homeJoints.length, Math.max(mjModel.nu, mjModel.nq));\n for (let i = 0; i < homeCount; i++) {\n if (i < mjModel.nu) mjData.ctrl[i] = config.homeJoints[i];\n if (i < mjModel.nq) {\n const qposAdr = i < mjModel.nu ? getActuatedScalarQposAdr(mjModel, i) : -1;\n mjData.qpos[qposAdr !== -1 ? qposAdr : i] = config.homeJoints[i];\n }\n }\n}\n\n/**\n * Config-driven scene loader — replaces the old single-model patching approach.\n */\nexport async function loadScene(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n if (config.files?.length) {\n return loadSceneFromFiles(mujoco, config, onProgress);\n }\n\n // 1. Clean up virtual filesystem\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const baseUrl = config.src.endsWith('/') ? config.src : config.src + '/';\n\n const environmentXmlByPath = new Map<string, string>();\n const environmentFiles = config.environmentFiles?.map(normalizeVfsPath) ?? [];\n for (const environmentFile of environmentFiles) {\n onProgress?.(`Downloading ${environmentFile}...`);\n const res = await fetch(baseUrl + environmentFile);\n if (!res.ok) {\n console.warn(`Failed to fetch environment XML ${environmentFile}: ${res.status} ${res.statusText}`);\n continue;\n }\n environmentXmlByPath.set(environmentFile, applyXmlPatches(await res.text(), environmentFile, config));\n }\n\n const downloaded = new Set<string>();\n const xmlQueue: string[] = [config.sceneFile];\n const assetFiles: string[] = [];\n const parser = new DOMParser();\n\n // 2a. Download XML files sequentially (to discover dependencies)\n while (xmlQueue.length > 0) {\n const fname = xmlQueue.shift()!;\n if (downloaded.has(fname)) continue;\n downloaded.add(fname);\n\n if (!isModelTextFile(fname)) {\n // Non-XML discovered during XML scan — collect for parallel download\n assetFiles.push(fname);\n continue;\n }\n\n onProgress?.(`Downloading ${fname}...`);\n\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n continue;\n }\n\n const patchedText = applyXmlPatches(await res.text(), fname, config);\n const text = fname === config.sceneFile\n ? composeEnvironmentXml(patchedText, config, parser, environmentXmlByPath)\n : patchedText;\n\n ensureDir(mujoco, fname);\n mujoco.FS.writeFile(`/working/${fname}`, text);\n scanDependencies(text, fname, parser, downloaded, xmlQueue);\n }\n\n // 2b. Download all binary assets (meshes, textures) in parallel\n if (assetFiles.length > 0) {\n onProgress?.(`Downloading ${assetFiles.length} assets...`);\n\n const results = await Promise.all(\n assetFiles.map(async (fname) => {\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n return null;\n }\n return { fname, buffer: new Uint8Array(await res.arrayBuffer()) };\n })\n );\n\n for (const result of results) {\n if (!result) continue;\n ensureDir(mujoco, result.fname);\n mujoco.FS.writeFile(`/working/${result.fname}`, result.buffer);\n }\n }\n\n // 5. Load model\n onProgress?.('Loading model...');\n const mjModel = loadModelFromPath(mujoco, `/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n\n // 6. Set initial pose — set both ctrl and qpos so robot starts at home.\n // If homeJoints is not provided, keep raw MuJoCo defaults.\n applyInitialPose(mjModel, mjData, config);\n\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData };\n}\n\n/**\n * Scan XML for file dependencies (meshes, textures, includes).\n */\nfunction scanDependencies(\n xmlString: string,\n currentFile: string,\n parser: DOMParser,\n downloaded: Set<string>,\n queue: string[]\n) {\n for (const fullPath of collectDependencyPaths(xmlString, currentFile, parser)) {\n if (!downloaded.has(fullPath)) queue.push(fullPath);\n }\n}\n\nfunction collectDependencyPaths(\n xmlString: string,\n currentFile: string,\n parser: DOMParser\n): string[] {\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\n\n const compiler = xmlDoc.querySelector('compiler');\n const assetDir = compiler?.getAttribute('assetdir') || '';\n const meshDir = compiler?.getAttribute('meshdir') || assetDir;\n const textureDir = compiler?.getAttribute('texturedir') || assetDir;\n const currentDir = currentFile.includes('/')\n ? currentFile.substring(0, currentFile.lastIndexOf('/') + 1)\n : '';\n\n const paths: string[] = [];\n xmlDoc.querySelectorAll('[file], [filename]').forEach((el) => {\n const fileAttr = el.getAttribute('file') ?? el.getAttribute('filename');\n if (!fileAttr) return;\n if (/^[a-z]+:\\/\\//i.test(fileAttr) || fileAttr.startsWith('package://')) return;\n\n let prefix = '';\n if (el.tagName.toLowerCase() === 'mesh') {\n prefix = meshDir ? meshDir + '/' : '';\n } else if (['texture', 'hfield'].includes(el.tagName.toLowerCase())) {\n prefix = textureDir ? textureDir + '/' : '';\n }\n\n const fullPath = normalizeVfsPath(currentDir + prefix + fileAttr);\n\n paths.push(fullPath);\n });\n return paths;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\nimport { mergeVertices } from 'three/examples/jsm/utils/BufferGeometryUtils.js';\nimport { CapsuleGeometry } from './CapsuleGeometry';\nimport { getName } from '../core/SceneLoader';\nimport { MujocoModel, MujocoModule, MujocoRenderOptions } from '../types';\n\nconst DEFAULT_MESH_NORMAL_SMOOTHING_TOLERANCE = 1e-4;\n\n/**\n * GeomBuilder\n * RESPONSIBILITY: Manufacturing visual objects.\n * \n * This class knows how to read a single MuJoCo 'geom' (collision shape) definition\n * and build the corresponding Three.js Mesh for it.\n * It handles all the different shape types (Box, Sphere, Cylinder, generic Mesh, etc.).\n */\nexport class GeomBuilder {\n private mujoco: MujocoModule; \n private textureCache = new Map<number, THREE.Texture>();\n private renderOptions?: MujocoRenderOptions;\n\n constructor(mujoco: MujocoModule, renderOptions?: MujocoRenderOptions) {\n this.mujoco = mujoco;\n this.renderOptions = renderOptions;\n }\n\n private getMeshNormalSmoothingTolerance(): number | null {\n const smoothing = this.renderOptions?.meshNormalSmoothing;\n if (!smoothing) return null;\n if (smoothing === true) return DEFAULT_MESH_NORMAL_SMOOTHING_TOLERANCE;\n return smoothing.tolerance ?? DEFAULT_MESH_NORMAL_SMOOTHING_TOLERANCE;\n }\n\n private getMaterialTexture(mjModel: MujocoModel, matId: number): THREE.Texture | null {\n if (matId < 0 || !mjModel.mat_texid || !mjModel.tex_data) return null;\n\n const materialCount = Math.max(1, Math.floor(mjModel.mat_rgba.length / 4));\n const textureRoles = Math.max(1, Math.floor(mjModel.mat_texid.length / materialCount));\n let texId = -1;\n for (let role = 0; role < textureRoles; role += 1) {\n const candidate = mjModel.mat_texid[matId * textureRoles + role];\n if (candidate >= 0) {\n texId = candidate;\n break;\n }\n }\n if (texId < 0) return null;\n\n const cached = this.textureCache.get(texId);\n if (cached) return cached;\n\n const width = Number(mjModel.tex_width[texId]);\n const height = Number(mjModel.tex_height[texId]);\n const channels = Number(mjModel.tex_nchannel[texId]);\n const offset = Number(mjModel.tex_adr[texId]);\n if (width <= 0 || height <= 0 || channels <= 0 || offset < 0) return null;\n\n const source = mjModel.tex_data.subarray(offset, offset + width * height * channels);\n const rgba = new Uint8Array(width * height * 4);\n for (let i = 0, j = 0; i < width * height; i += 1, j += channels) {\n const r = source[j] ?? 255;\n const g = channels > 1 ? source[j + 1] : r;\n const b = channels > 2 ? source[j + 2] : r;\n const a = channels > 3 ? source[j + 3] : 255;\n const out = i * 4;\n rgba[out] = r;\n rgba[out + 1] = g;\n rgba[out + 2] = b;\n rgba[out + 3] = a;\n }\n\n const texture = new THREE.DataTexture(rgba, width, height, THREE.RGBAFormat);\n texture.colorSpace = THREE.LinearSRGBColorSpace;\n texture.wrapS = THREE.RepeatWrapping;\n texture.wrapT = THREE.RepeatWrapping;\n texture.flipY = true;\n const repeatOffset = matId * 2;\n const repeatS = mjModel.mat_texrepeat?.[repeatOffset] ?? 1;\n const repeatT = mjModel.mat_texrepeat?.[repeatOffset + 1] ?? 1;\n texture.repeat.set(repeatS || 1, repeatT || 1);\n texture.needsUpdate = true;\n this.textureCache.set(texId, texture);\n return texture;\n }\n\n /**\n * Creates a Three.js Object3D (usually a Mesh) for a specific geometry in the MuJoCo model.\n * Returns null if the geometry shouldn't be rendered (e.g., invisible collision triggers).\n */\n create(mjModel: MujocoModel, g: number): THREE.Object3D | null {\n // 1. Check if this geom is meant to be visible\n // Group 3 in MuJoCo is conventionally used for invisible 'helper' geoms.\n if (mjModel.geom_group[g] === 3) return null;\n\n // 2. Read raw data from MuJoCo's WASM memory arrays\n const type = mjModel.geom_type[g];\n const size = mjModel.geom_size.subarray(g * 3, g * 3 + 3); // [x, y, z] size parameters\n const pos = mjModel.geom_pos.subarray(g * 3, g * 3 + 3); // [x, y, z] local position\n const quat = mjModel.geom_quat.subarray(g * 4, g * 4 + 4); // [w, x, y, z] local rotation\n\n // 3. Determine material color\n // Sometimes color is on the geom itself, sometimes it uses a shared material definition.\n const matId = mjModel.geom_matid[g];\n const color = new THREE.Color(0xffffff);\n const map = this.getMaterialTexture(mjModel, matId);\n let opacity = 1.0;\n\n if (matId >= 0) {\n // Use shared material\n const rgba = mjModel.mat_rgba.subarray(matId * 4, matId * 4 + 4);\n color.setRGB(rgba[0], rgba[1], rgba[2]);\n opacity = rgba[3];\n } else {\n // Use geom-specific color\n const rgba = mjModel.geom_rgba.subarray(g * 4, g * 4 + 4);\n color.setRGB(rgba[0], rgba[1], rgba[2]);\n opacity = rgba[3];\n }\n\n // 4. Build the Geometry based on type\n const MG = this.mujoco.mjtGeom; // Short alias for MuJoCo Geometry Types enum\n let geo: THREE.BufferGeometry | null = null;\n\n // The '.value ?? MG.XYZ' pattern handles slightly different MuJoCo WASM binding versions.\n const getVal = (v: unknown) => (v as { value: number })?.value ?? v;\n\n if (type === getVal(MG.mjGEOM_PLANE)) {\n // Planes are infinite in MuJoCo, but Three needs finite UVs for textured captures.\n geo = new THREE.PlaneGeometry(size[0] * 2 || 5, size[1] * 2 || 5);\n } else if (type === getVal(MG.mjGEOM_SPHERE)) {\n geo = new THREE.SphereGeometry(size[0], 24, 24);\n } else if (type === getVal(MG.mjGEOM_CAPSULE)) {\n // Capsules in MuJoCo are Z-axis aligned by default.\n // Our custom CapsuleGeometry might need rotation to match.\n geo = new CapsuleGeometry(size[0], size[1] * 2, 24, 12);\n geo.rotateX(Math.PI / 2); \n } else if (type === getVal(MG.mjGEOM_BOX)) {\n // MuJoCo defines box size as \"half-extents\" (center to edge). Three.js uses full width.\n geo = new THREE.BoxGeometry(size[0] * 2, size[1] * 2, size[2] * 2);\n } else if (type === getVal(MG.mjGEOM_CYLINDER)) {\n geo = new THREE.CylinderGeometry(size[0], size[0], size[1] * 2, 24);\n geo.rotateX(Math.PI / 2);\n } else if (type === getVal(MG.mjGEOM_MESH)) {\n // Arbitrary 3D meshes (like the robot parts).\n // We must read the vertex and face data directly from MuJoCo's buffers.\n const mId = mjModel.geom_dataid[g];\n const vAdr = mjModel.mesh_vertadr[mId];\n const vNum = mjModel.mesh_vertnum[mId];\n const fAdr = mjModel.mesh_faceadr[mId];\n const fNum = mjModel.mesh_facenum[mId];\n\n geo = new THREE.BufferGeometry();\n // 'position' attribute = vertices\n geo.setAttribute('position', new THREE.Float32BufferAttribute(mjModel.mesh_vert.subarray(vAdr * 3, (vAdr + vNum) * 3), 3));\n // 'index' = faces (triangles connecting vertices)\n geo.setIndex(Array.from(mjModel.mesh_face.subarray(fAdr * 3, (fAdr + fNum) * 3)));\n const smoothingTolerance = this.getMeshNormalSmoothingTolerance();\n if (smoothingTolerance !== null) {\n geo = mergeVertices(geo, smoothingTolerance);\n }\n geo.computeVertexNormals(); // Auto-calculate smooth lighting normals\n }\n\n // 5. Construct the final Mesh\n if (geo) {\n const isPlane = type === getVal(MG.mjGEOM_PLANE);\n const materialMap = isPlane && map ? map.clone() : map;\n if (isPlane && materialMap) {\n materialMap.repeat.multiplyScalar(2.5);\n materialMap.needsUpdate = true;\n }\n const mesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({\n color,\n map: materialMap,\n transparent: opacity < 1,\n opacity,\n roughness: 0.6,\n metalness: 0\n }));\n mesh.castShadow = type !== getVal(MG.mjGEOM_PLANE);\n mesh.receiveShadow = true;\n\n // Apply the local position offset and rotation specified in the MJCF XML\n mesh.position.set(pos[0], pos[1], pos[2]);\n // MuJoCo quaternions are [w, x, y, z], Three.js are [x, y, z, w]\n mesh.quaternion.set(quat[1], quat[2], quat[3], quat[0]);\n\n // Tag the mesh with its MuJoCo body and geom IDs for interaction (picking/dragging)\n mesh.userData.bodyID = mjModel.geom_bodyid[g];\n mesh.userData.geomID = g;\n mesh.userData.geomGroup = mjModel.geom_group[g];\n mesh.userData.geomName = getName(mjModel, mjModel.name_geomadr[g]);\n\n return mesh;\n }\n\n return null;\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport { GeomBuilder } from '../rendering/GeomBuilder';\nimport { CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY } from '../rendering/cameraFrameCapture';\nimport { MujocoModel, MujocoRenderOptions } from '../types';\nimport { getName } from '../core/SceneLoader';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\n/**\n * SceneRenderer — creates and syncs MuJoCo body meshes every frame.\n * Accepts standard R3F group props (position, rotation, scale, visible, etc.).\n */\nexport interface SceneRendererProps extends Omit<ThreeElements['group'], 'ref'> {\n renderOptions?: MujocoRenderOptions;\n}\n\nfunction getRenderOptionsKey(renderOptions: MujocoRenderOptions | undefined) {\n const smoothing = renderOptions?.meshNormalSmoothing;\n if (!smoothing) return 'default';\n if (smoothing === true) return 'meshNormalSmoothing:true';\n return `meshNormalSmoothing:${smoothing.tolerance ?? 'default'}`;\n}\n\nexport function SceneRenderer({ renderOptions, ...props }: SceneRendererProps) {\n const {\n mjModelRef,\n mjDataRef,\n mujocoRef,\n onSelectionRef,\n hiddenBodiesRef,\n interpolateRef,\n interpolationStateRef,\n status,\n } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const bodyRefs = useRef<(THREE.Group | null)[]>([]);\n const prevModelRef = useRef<MujocoModel | null>(null);\n const prevRenderOptionsKeyRef = useRef<string | null>(null);\n const renderOptionsKey = getRenderOptionsKey(renderOptions);\n\n const geomBuilder = useMemo(() => {\n if (status !== 'ready') return null;\n return new GeomBuilder(mujocoRef.current, renderOptions);\n }, [status, mujocoRef, renderOptionsKey]);\n\n // Build body groups when model loads\n useEffect(() => {\n if (status !== 'ready' || !geomBuilder) return;\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group) return;\n\n // Skip if model hasn't changed\n if (\n prevModelRef.current === model &&\n prevRenderOptionsKeyRef.current === renderOptionsKey\n ) {\n return;\n }\n prevModelRef.current = model;\n prevRenderOptionsKeyRef.current = renderOptionsKey;\n\n // Clear previous bodies\n while (group.children.length > 0) {\n group.remove(group.children[0]);\n }\n\n // Create body groups with geometry\n const refs: (THREE.Group | null)[] = [];\n for (let i = 0; i < model.nbody; i++) {\n const bodyGroup = new THREE.Group();\n bodyGroup.userData.bodyID = i;\n const bodyName = getName(model, model.name_bodyadr[i]);\n\n if (!hiddenBodiesRef.current.has(bodyName)) {\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === i) {\n const mesh = geomBuilder.create(model, g);\n if (mesh) bodyGroup.add(mesh);\n }\n }\n }\n\n group.add(bodyGroup);\n refs.push(bodyGroup);\n }\n bodyRefs.current = refs;\n }, [status, geomBuilder, mjModelRef, renderOptionsKey]);\n\n const syncBodiesToData = useCallback(() => {\n const data = mjDataRef.current;\n if (!data) return;\n const bodies = bodyRefs.current;\n const interpolation = interpolationStateRef.current;\n const useInterpolation = interpolateRef.current && interpolation.valid;\n\n for (let i = 0; i < bodies.length; i++) {\n const ref = bodies[i];\n if (!ref) continue;\n if (useInterpolation) {\n const alpha = interpolation.alpha;\n const i3 = i * 3;\n ref.position.set(\n THREE.MathUtils.lerp(interpolation.previousXpos[i3], interpolation.currentXpos[i3], alpha),\n THREE.MathUtils.lerp(interpolation.previousXpos[i3 + 1], interpolation.currentXpos[i3 + 1], alpha),\n THREE.MathUtils.lerp(interpolation.previousXpos[i3 + 2], interpolation.currentXpos[i3 + 2], alpha)\n );\n const i4 = i * 4;\n _previousQuat.set(\n interpolation.previousXquat[i4 + 1],\n interpolation.previousXquat[i4 + 2],\n interpolation.previousXquat[i4 + 3],\n interpolation.previousXquat[i4]\n );\n _currentQuat.set(\n interpolation.currentXquat[i4 + 1],\n interpolation.currentXquat[i4 + 2],\n interpolation.currentXquat[i4 + 3],\n interpolation.currentXquat[i4]\n );\n ref.quaternion.copy(_previousQuat).slerp(_currentQuat, alpha);\n } else {\n ref.position.set(\n data.xpos[i * 3],\n data.xpos[i * 3 + 1],\n data.xpos[i * 3 + 2]\n );\n ref.quaternion.set(\n data.xquat[i * 4 + 1],\n data.xquat[i * 4 + 2],\n data.xquat[i * 4 + 3],\n data.xquat[i * 4]\n );\n }\n }\n }, [interpolateRef, interpolationStateRef, mjDataRef]);\n\n // Sync body positions from mjData every frame\n useFrame(syncBodiesToData);\n\n return (\n <group\n {...props}\n ref={groupRef}\n userData={{\n ...props.userData,\n [CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY]: syncBodiesToData,\n }}\n onDoubleClick={(e) => {\n if (typeof props.onDoubleClick === 'function') props.onDoubleClick(e);\n e.stopPropagation();\n let obj: THREE.Object3D | null = e.object;\n while (obj && obj.userData.bodyID === undefined && obj.parent) {\n obj = obj.parent;\n }\n const bodyID = obj?.userData.bodyID;\n if (typeof bodyID === 'number' && bodyID > 0) {\n const model = mjModelRef.current;\n if (model && bodyID < model.nbody && onSelectionRef.current) {\n const name = getName(model, model.name_bodyadr[bodyID]);\n onSelectionRef.current({ bodyId: bodyID, name });\n }\n }\n }}\n />\n );\n}\n\nconst _previousQuat = new THREE.Quaternion();\nconst _currentQuat = new THREE.Quaternion();\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Live on-screen camera viewports for MuJoCo scenes. Each view renders the\n * shared scene from a named MuJoCo camera/site/body into a `gl.scissor` region\n * tracking a DOM element — no GPU readback, no PNG encoding.\n *\n * While at least one viewport is mounted the canvas switches from R3F's\n * automatic render to a managed render loop (main scene full-frame, then each\n * viewport). This is incompatible with `EffectComposer`/postprocessing or other\n * custom render loops; use the offscreen capture APIs in those setups instead.\n */\n\nimport {\n createContext,\n type CSSProperties,\n type MutableRefObject,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type * as THREE from 'three';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport {\n createCaptureCamera,\n prepareCaptureCamera,\n} from '../rendering/cameraFrameCapture';\nimport type {\n Bodies,\n Cameras,\n CameraFrameCaptureOptions,\n Sites,\n} from '../types';\n\n/** Camera selection + pose options for a live viewport. */\nexport type CameraViewportOptions = Pick<\n CameraFrameCaptureOptions,\n | 'camera'\n | 'cameraName'\n | 'siteName'\n | 'bodyName'\n | 'position'\n | 'quaternion'\n | 'lookAt'\n | 'up'\n | 'positionOffset'\n | 'quaternionOffset'\n | 'fov'\n | 'near'\n | 'far'\n | 'projectionMatrix'\n | 'mujocoCameraCompatibility'\n>;\n\ninterface CameraViewportDescriptor {\n getElement: () => HTMLElement | null;\n getOptions: () => CameraViewportOptions;\n camera: THREE.Camera | null;\n}\n\ninterface CameraViewportRegistry {\n register: (descriptor: CameraViewportDescriptor) => () => void;\n}\n\nconst CameraViewportRegistryContext = createContext<CameraViewportRegistry | null>(null);\n\nlet nextViewportId = 0;\n\nconst VIEWPORT_RENDER_PRIORITY = 1;\n\nfunction CameraViewportRenderer({\n viewportsRef,\n}: {\n viewportsRef: MutableRefObject<Map<number, CameraViewportDescriptor>>;\n}) {\n const gl = useThree((state) => state.gl);\n const scene = useThree((state) => state.scene);\n const mainCamera = useThree((state) => state.camera);\n const mujoco = useMujoco();\n\n useFrame(() => {\n const drawWidth = gl.domElement.width;\n const drawHeight = gl.domElement.height;\n\n // We own the render now: draw the main scene full-frame first.\n gl.setScissorTest(false);\n gl.setViewport(0, 0, drawWidth, drawHeight);\n gl.render(scene, mainCamera);\n\n const api = mujoco.api;\n if (!api || viewportsRef.current.size === 0) return;\n\n const dpr = gl.getPixelRatio();\n const canvasRect = gl.domElement.getBoundingClientRect();\n\n for (const descriptor of viewportsRef.current.values()) {\n const element = descriptor.getElement();\n if (!element) continue;\n\n const rect = element.getBoundingClientRect();\n const isOffscreen =\n rect.bottom < canvasRect.top ||\n rect.top > canvasRect.bottom ||\n rect.right < canvasRect.left ||\n rect.left > canvasRect.right;\n if (isOffscreen) continue;\n\n const width = Math.floor(rect.width * dpr);\n const height = Math.floor(rect.height * dpr);\n if (width <= 0 || height <= 0) continue;\n\n const left = Math.floor((rect.left - canvasRect.left) * dpr);\n const bottom = Math.floor((canvasRect.bottom - rect.bottom) * dpr);\n\n let resolved: CameraFrameCaptureOptions;\n try {\n resolved = api.resolveCameraCaptureOptions(descriptor.getOptions());\n } catch {\n continue;\n }\n\n if (!descriptor.camera) {\n descriptor.camera = createCaptureCamera(resolved, mainCamera, width, height);\n } else {\n prepareCaptureCamera(descriptor.camera, resolved, mainCamera, width, height);\n }\n\n gl.setViewport(left, bottom, width, height);\n gl.setScissor(left, bottom, width, height);\n gl.setScissorTest(true);\n gl.render(scene, descriptor.camera);\n }\n\n gl.setScissorTest(false);\n gl.setViewport(0, 0, drawWidth, drawHeight);\n }, VIEWPORT_RENDER_PRIORITY);\n\n return null;\n}\n\n/**\n * Provides the live-viewport registry and mounts the managed render loop only\n * while at least one viewport is active. Mounted internally by the MuJoCo\n * provider; you do not need to add it yourself.\n */\nexport function CameraViewportProvider({ children }: { children?: ReactNode }) {\n const viewportsRef = useRef<Map<number, CameraViewportDescriptor>>(new Map());\n const [count, setCount] = useState(0);\n\n const register = useCallback((descriptor: CameraViewportDescriptor) => {\n const id = nextViewportId++;\n viewportsRef.current.set(id, descriptor);\n setCount((value) => value + 1);\n return () => {\n viewportsRef.current.delete(id);\n setCount((value) => value - 1);\n };\n }, []);\n\n const value = useMemo<CameraViewportRegistry>(() => ({ register }), [register]);\n\n return (\n <CameraViewportRegistryContext.Provider value={value}>\n {children}\n {count > 0 && <CameraViewportRenderer viewportsRef={viewportsRef} />}\n </CameraViewportRegistryContext.Provider>\n );\n}\n\n/**\n * Render the live MuJoCo scene from a named camera into the region covered by\n * `elementRef`'s DOM element. Call this inside `<MujocoCanvas>` with a ref to a\n * DOM element you position anywhere (it does not need to be in the R3F tree).\n */\nexport function useCameraViewport<T extends HTMLElement = HTMLElement>(\n elementRef: RefObject<T | null>,\n options: CameraViewportOptions\n) {\n const registry = useContext(CameraViewportRegistryContext);\n if (!registry) {\n throw new Error('useCameraViewport must be used inside <MujocoCanvas>.');\n }\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n const descriptor: CameraViewportDescriptor = {\n getElement: () => elementRef.current,\n getOptions: () => optionsRef.current,\n camera: null,\n };\n return registry.register(descriptor);\n }, [registry, elementRef]);\n}\n\nexport interface CameraViewProps extends CameraViewportOptions {\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Drop-in live camera pane. Renders an absolutely-positioned overlay `<div>`\n * over the canvas showing the selected MuJoCo camera. Position it with\n * `style`/`className` (the canvas's parent should be positioned).\n */\nexport function CameraView({ className, style, ...options }: CameraViewProps) {\n const gl = useThree((state) => state.gl);\n const elementRef = useRef<HTMLDivElement | null>(null);\n if (!elementRef.current && typeof document !== 'undefined') {\n elementRef.current = document.createElement('div');\n }\n\n useEffect(() => {\n const element = elementRef.current;\n const parent = gl.domElement.parentElement;\n if (!element || !parent) return;\n element.style.position = 'absolute';\n element.style.overflow = 'hidden';\n parent.appendChild(element);\n return () => {\n parent.removeChild(element);\n };\n }, [gl]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n element.className = className ?? '';\n if (style) Object.assign(element.style, style);\n }, [className, style]);\n\n useCameraViewport(elementRef, options);\n\n return null;\n}\n\nexport type { Bodies, Cameras, Sites };\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useFrameCapture — still-frame capture for canvas-backed MuJoCo/R3F scenes.\n */\n\nimport { useCallback, useState } from 'react';\nimport type {\n FrameCaptureAPI,\n FrameCaptureBlobResult,\n FrameCaptureOptions,\n FrameCaptureResult,\n FrameCaptureStatus,\n FrameCaptureTargetRef,\n} from '../types';\n\nfunction isTargetRef(\n target: FrameCaptureOptions['target']\n): target is FrameCaptureTargetRef {\n return Boolean(target && typeof target === 'object' && 'current' in target);\n}\n\nfunction resolveCanvasTarget(\n target: FrameCaptureOptions['target']\n): HTMLCanvasElement {\n const resolvedTarget = isTargetRef(target) ? target.current : target;\n\n if (!resolvedTarget) {\n throw new Error('No frame capture target is available.');\n }\n\n if (resolvedTarget instanceof HTMLCanvasElement) {\n return resolvedTarget;\n }\n\n const canvas = resolvedTarget.querySelector('canvas');\n if (!canvas) {\n throw new Error('Frame capture target does not contain a canvas.');\n }\n return canvas;\n}\n\nfunction waitForNextAnimationFrame() {\n return new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n}\n\n/**\n * Capture the current canvas frame as a data URL.\n *\n * For WebGL scenes, create the renderer with `preserveDrawingBuffer: true`\n * when you need deterministic captures after the frame has presented.\n */\nexport async function captureFrame(\n options: FrameCaptureOptions\n): Promise<FrameCaptureResult> {\n const type = options.type ?? 'image/png';\n const canvas = resolveCanvasTarget(options.target);\n\n if (options.waitForAnimationFrame ?? true) {\n await waitForNextAnimationFrame();\n }\n\n return {\n canvas,\n dataUrl: canvas.toDataURL(type, options.quality),\n type,\n };\n}\n\n/**\n * Capture the current canvas frame as a Blob.\n */\nexport async function captureFrameBlob(\n options: FrameCaptureOptions\n): Promise<FrameCaptureBlobResult> {\n const type = options.type ?? 'image/png';\n const canvas = resolveCanvasTarget(options.target);\n\n if (options.waitForAnimationFrame ?? true) {\n await waitForNextAnimationFrame();\n }\n\n const blob = await new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (nextBlob) => {\n if (nextBlob) {\n resolve(nextBlob);\n } else {\n reject(new Error('Canvas frame capture did not produce a Blob.'));\n }\n },\n type,\n options.quality\n );\n });\n\n return { canvas, blob, type };\n}\n\n/**\n * React state wrapper around `captureFrame` and `captureFrameBlob`.\n */\nexport function useFrameCapture(\n defaultOptions: FrameCaptureOptions = {}\n): FrameCaptureAPI {\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback(\n async (options: FrameCaptureOptions = {}) => {\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await captureFrame({ ...defaultOptions, ...options });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture the current canvas frame.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions]\n );\n\n const captureBlob = useCallback(\n async (options: FrameCaptureOptions = {}) => {\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await captureFrameBlob({\n ...defaultOptions,\n ...options,\n });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture the current canvas frame.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions]\n );\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n captureBlob,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Helpers for resolving dataset camera streams to mounted MuJoCo resources.\n */\n\nimport type {\n Bodies,\n CameraFrameCaptureOptions,\n CameraFrameCaptureSource,\n CameraFrameSequenceCamera,\n CameraFrameSequenceOptions,\n CameraFrameSequenceResult,\n Cameras,\n MujocoSimAPI,\n Sites,\n} from '../types';\n\nexport type MountedCameraFrameCaptureSource = Extract<\n CameraFrameCaptureSource,\n | { kind: 'mujoco-camera' }\n | { kind: 'mujoco-site' }\n | { kind: 'mujoco-body' }\n>;\n\nexport type CameraFrameMountSelector =\n | { cameraName: Cameras; siteName?: never; bodyName?: never }\n | { siteName: Sites; cameraName?: never; bodyName?: never }\n | { bodyName: Bodies; cameraName?: never; siteName?: never };\n\nexport interface NamedCameraFrameResource {\n name: string | null | undefined;\n}\n\nexport interface ResolveMountedCameraFrameSourceOptions {\n cameras?: readonly (Cameras | NamedCameraFrameResource | null | undefined)[];\n sites?: readonly (Sites | NamedCameraFrameResource | null | undefined)[];\n bodies?: readonly (Bodies | NamedCameraFrameResource | null | undefined)[];\n aliases?: Record<\n string,\n CameraFrameMountSelector | readonly CameraFrameMountSelector[]\n >;\n /**\n * Accept the first valid alias selector even when the current resource\n * inventory cannot verify it. This is useful when aliases come from a\n * previously validated model inventory and the actual provider will validate\n * again during capture.\n */\n allowAliasFallback?: boolean;\n}\n\nexport interface ResolvedMountedCameraFrameSource {\n key: string;\n selector: CameraFrameMountSelector;\n source: MountedCameraFrameCaptureSource;\n}\n\nexport const MountedCameraFrameSourceSuggestionMatch = {\n Direct: 'direct',\n Alias: 'alias',\n Normalized: 'normalized',\n Prefix: 'prefix',\n Suffix: 'suffix',\n Contains: 'contains',\n} as const;\n\nexport type MountedCameraFrameSourceSuggestionMatch =\n (typeof MountedCameraFrameSourceSuggestionMatch)[keyof typeof MountedCameraFrameSourceSuggestionMatch];\n\nexport interface MountedCameraFrameSourceSuggestion {\n key: string;\n selector: CameraFrameMountSelector;\n source: MountedCameraFrameCaptureSource;\n resourceName: string;\n resourceKind: MountedCameraFrameCaptureSource['kind'];\n match: MountedCameraFrameSourceSuggestionMatch;\n}\n\nexport type MountedCameraFrameSequenceDefaults = Omit<\n CameraFrameSequenceCamera,\n 'key' | 'cameraName' | 'siteName' | 'bodyName' | 'source'\n>;\n\nexport type MountedCameraFrameSequenceCameraOptions = Partial<\n MountedCameraFrameSequenceDefaults\n>;\n\nexport interface CreateMountedCameraFrameSequencePlanOptions\n extends ResolveMountedCameraFrameSourceOptions {\n defaults?: MountedCameraFrameSequenceDefaults;\n cameraOptions?: Record<string, MountedCameraFrameSequenceCameraOptions>;\n requireAll?: boolean;\n}\n\nexport interface MountedCameraFrameSequencePlan {\n cameraKeys: string[];\n cameras: CameraFrameSequenceCamera[];\n resolved: Record<string, ResolvedMountedCameraFrameSource>;\n missingKeys: string[];\n}\n\nexport const MountedCameraFrameSequenceReadinessStatus = {\n Ready: 'ready',\n Partial: 'partial',\n Missing: 'missing',\n} as const;\n\nexport type MountedCameraFrameSequenceReadinessStatus =\n (typeof MountedCameraFrameSequenceReadinessStatus)[keyof typeof MountedCameraFrameSequenceReadinessStatus];\n\nexport interface MountedCameraFrameSequenceSourceReadiness {\n key: string;\n ready: boolean;\n selector?: CameraFrameMountSelector;\n source?: MountedCameraFrameCaptureSource;\n message: string;\n}\n\nexport interface MountedCameraFrameSequenceReadiness {\n ready: boolean;\n status: MountedCameraFrameSequenceReadinessStatus;\n cameraKeys: string[];\n resolvedKeys: string[];\n missingKeys: string[];\n cameras: Record<string, MountedCameraFrameSequenceSourceReadiness>;\n message: string;\n}\n\nexport type MountedCameraFrameSequencePlanOptions = Omit<\n CreateMountedCameraFrameSequencePlanOptions,\n 'cameras' | 'sites' | 'bodies'\n>;\n\nexport interface MountedCameraFrameSequenceRecordOptions\n extends Omit<CameraFrameSequenceOptions, 'cameras'>,\n MountedCameraFrameSequencePlanOptions {\n cameraKeys: readonly string[];\n}\n\nexport interface MountedCameraFrameSequenceRecordResult\n extends CameraFrameSequenceResult {\n plan: MountedCameraFrameSequencePlan;\n readiness: MountedCameraFrameSequenceReadiness;\n}\n\nexport const MountedCameraFrameSequenceManifestStatus = {\n Complete: 'complete',\n Partial: 'partial',\n Missing: 'missing',\n} as const;\n\nexport type MountedCameraFrameSequenceManifestStatus =\n (typeof MountedCameraFrameSequenceManifestStatus)[keyof typeof MountedCameraFrameSequenceManifestStatus];\n\nexport interface MountedCameraFrameSequenceStreamSummary {\n key: string;\n ready: boolean;\n complete: boolean;\n status: MountedCameraFrameSequenceManifestStatus;\n source?: CameraFrameCaptureSource;\n selector?: CameraFrameMountSelector;\n target?: string;\n width?: number;\n height?: number;\n expectedFrameCount: number;\n recordedFrameCount: number;\n missingFrameCount: number;\n firstFrameIndex: number | null;\n lastFrameIndex: number | null;\n firstTimestamp: number | null;\n lastTimestamp: number | null;\n message: string;\n}\n\nexport interface CreateMountedCameraFrameSequenceManifestOptions {\n expectedFrameCount?: number;\n cameraKeys?: readonly string[];\n}\n\nexport interface MountedCameraFrameSequenceManifest {\n schema: 'mujoco-react/mounted-camera-frame-sequence-manifest@1';\n ready: boolean;\n complete: boolean;\n status: MountedCameraFrameSequenceManifestStatus;\n cameraKeys: string[];\n resolvedKeys: string[];\n missingKeys: string[];\n expectedFrameCount: number;\n recordedFrameCount: number;\n missingFrameCount: number;\n streamSummaries: Record<string, MountedCameraFrameSequenceStreamSummary>;\n streams: MountedCameraFrameSequenceStreamSummary[];\n readiness: MountedCameraFrameSequenceReadiness;\n message: string;\n}\n\nexport type MountedCameraFrameSequenceRecorderTarget = Pick<\n MujocoSimAPI,\n 'getCameras' | 'getSites' | 'getBodies' | 'recordCameraSequence'\n>;\n\nfunction getResourceName(\n resource: string | NamedCameraFrameResource | null | undefined\n) {\n if (!resource) return null;\n return typeof resource === 'string' ? resource : resource.name ?? null;\n}\n\nfunction createNameSet(\n resources:\n | readonly (string | NamedCameraFrameResource | null | undefined)[]\n | undefined\n) {\n return new Set(\n (resources ?? [])\n .map((resource) => getResourceName(resource))\n .filter((name): name is string => Boolean(name))\n );\n}\n\nfunction createResourceNames(\n resources:\n | readonly (string | NamedCameraFrameResource | null | undefined)[]\n | undefined\n) {\n return (resources ?? [])\n .map((resource) => getResourceName(resource))\n .filter((name): name is string => Boolean(name));\n}\n\nfunction normalizeAliasCandidates(\n value: CameraFrameMountSelector | readonly CameraFrameMountSelector[] | undefined\n) {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction countMountedSelectors(selector: CameraFrameMountSelector) {\n return Number(Boolean(selector.cameraName)) +\n Number(Boolean(selector.siteName)) +\n Number(Boolean(selector.bodyName));\n}\n\nfunction normalizeCameraSourceName(value: string) {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '');\n}\n\nfunction createCameraSourceKeyVariants(key: string) {\n const candidates = [\n key,\n key.startsWith('observation.images.')\n ? key.slice('observation.images.'.length)\n : '',\n key.includes('.') ? key.split('.').at(-1) ?? '' : '',\n key.includes('/') ? key.split('/').at(-1) ?? '' : '',\n ];\n return candidates\n .map((candidate) => candidate.trim())\n .filter((candidate, index, items) => candidate && items.indexOf(candidate) === index);\n}\n\nfunction getSelectorKey(selector: CameraFrameMountSelector) {\n if (selector.cameraName) return `camera:${selector.cameraName}`;\n if (selector.siteName) return `site:${selector.siteName}`;\n if (selector.bodyName) return `body:${selector.bodyName}`;\n return null;\n}\n\nexport function getMountedCameraFrameCaptureSource(\n selector: CameraFrameMountSelector\n): MountedCameraFrameCaptureSource | null {\n if (countMountedSelectors(selector) !== 1) return null;\n if (selector.cameraName) {\n return { kind: 'mujoco-camera', cameraName: selector.cameraName };\n }\n if (selector.siteName) {\n return { kind: 'mujoco-site', siteName: selector.siteName };\n }\n if (selector.bodyName) {\n return { kind: 'mujoco-body', bodyName: selector.bodyName };\n }\n return null;\n}\n\nexport function isMountedCameraFrameCaptureSource(\n source: CameraFrameCaptureSource\n): source is MountedCameraFrameCaptureSource {\n return (\n source.kind === 'mujoco-camera' ||\n source.kind === 'mujoco-site' ||\n source.kind === 'mujoco-body'\n );\n}\n\nexport function getCameraFrameCaptureSourceTarget(\n source: CameraFrameCaptureSource\n) {\n if (source.kind === 'mujoco-camera') return source.cameraName;\n if (source.kind === 'mujoco-site') return source.siteName;\n if (source.kind === 'mujoco-body') return source.bodyName;\n if (source.kind === 'custom-camera') return 'custom camera';\n if (source.kind === 'explicit-pose') return 'explicit pose';\n return 'fallback camera';\n}\n\nfunction createMountedCameraFrameSourceSuggestion(\n key: string,\n selector: CameraFrameMountSelector,\n resourceName: string,\n match: MountedCameraFrameSourceSuggestionMatch\n): MountedCameraFrameSourceSuggestion | null {\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) return null;\n return {\n key,\n selector,\n source,\n resourceName,\n resourceKind: source.kind,\n match,\n };\n}\n\nfunction addMountedCameraFrameSourceSuggestion(\n suggestions: MountedCameraFrameSourceSuggestion[],\n seen: Set<string>,\n suggestion: MountedCameraFrameSourceSuggestion | null\n) {\n if (!suggestion) return;\n const selectorKey = getSelectorKey(suggestion.selector);\n if (!selectorKey || seen.has(selectorKey)) return;\n seen.add(selectorKey);\n suggestions.push(suggestion);\n}\n\nfunction getCameraFrameResourceMatch(\n key: string,\n resourceName: string\n): MountedCameraFrameSourceSuggestionMatch | null {\n if (resourceName === key) return MountedCameraFrameSourceSuggestionMatch.Direct;\n\n const normalizedResource = normalizeCameraSourceName(resourceName);\n if (!normalizedResource) return null;\n\n for (const variant of createCameraSourceKeyVariants(key)) {\n if (resourceName === variant) return MountedCameraFrameSourceSuggestionMatch.Direct;\n\n const normalizedKey = normalizeCameraSourceName(variant);\n if (!normalizedKey) continue;\n if (normalizedResource === normalizedKey) {\n return MountedCameraFrameSourceSuggestionMatch.Normalized;\n }\n if (normalizedResource.startsWith(`${normalizedKey}_`)) {\n return MountedCameraFrameSourceSuggestionMatch.Prefix;\n }\n if (normalizedResource.endsWith(`_${normalizedKey}`)) {\n return MountedCameraFrameSourceSuggestionMatch.Suffix;\n }\n if (normalizedResource.includes(`_${normalizedKey}_`)) {\n return MountedCameraFrameSourceSuggestionMatch.Contains;\n }\n }\n return null;\n}\n\nfunction isSelectorMounted(\n selector: CameraFrameMountSelector,\n cameraNames: Set<string>,\n siteNames: Set<string>,\n bodyNames: Set<string>\n) {\n if (countMountedSelectors(selector) !== 1) return false;\n return (\n (selector.cameraName ? cameraNames.has(selector.cameraName) : false) ||\n (selector.siteName ? siteNames.has(selector.siteName) : false) ||\n (selector.bodyName ? bodyNames.has(selector.bodyName) : false)\n );\n}\n\nexport function createMountedCameraFrameSourceSuggestions(\n key: string,\n options: ResolveMountedCameraFrameSourceOptions\n): MountedCameraFrameSourceSuggestion[] {\n const cameraNames = createNameSet(options.cameras);\n const siteNames = createNameSet(options.sites);\n const bodyNames = createNameSet(options.bodies);\n const suggestions: MountedCameraFrameSourceSuggestion[] = [];\n const seen = new Set<string>();\n\n for (const selector of normalizeAliasCandidates(options.aliases?.[key])) {\n if (!isSelectorMounted(selector, cameraNames, siteNames, bodyNames)) {\n continue;\n }\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) continue;\n addMountedCameraFrameSourceSuggestion(\n suggestions,\n seen,\n createMountedCameraFrameSourceSuggestion(\n key,\n selector,\n getCameraFrameCaptureSourceTarget(source),\n MountedCameraFrameSourceSuggestionMatch.Alias\n )\n );\n }\n\n for (const cameraName of createResourceNames(options.cameras)) {\n const match = getCameraFrameResourceMatch(key, cameraName);\n if (!match) continue;\n addMountedCameraFrameSourceSuggestion(\n suggestions,\n seen,\n createMountedCameraFrameSourceSuggestion(\n key,\n { cameraName },\n cameraName,\n match\n )\n );\n }\n\n for (const siteName of createResourceNames(options.sites)) {\n const match = getCameraFrameResourceMatch(key, siteName);\n if (!match) continue;\n addMountedCameraFrameSourceSuggestion(\n suggestions,\n seen,\n createMountedCameraFrameSourceSuggestion(\n key,\n { siteName },\n siteName,\n match\n )\n );\n }\n\n for (const bodyName of createResourceNames(options.bodies)) {\n const match = getCameraFrameResourceMatch(key, bodyName);\n if (!match) continue;\n addMountedCameraFrameSourceSuggestion(\n suggestions,\n seen,\n createMountedCameraFrameSourceSuggestion(\n key,\n { bodyName },\n bodyName,\n match\n )\n );\n }\n\n return suggestions;\n}\n\nexport function resolveMountedCameraFrameSource(\n key: string,\n options: ResolveMountedCameraFrameSourceOptions\n): ResolvedMountedCameraFrameSource | null {\n const cameraNames = createNameSet(options.cameras);\n const siteNames = createNameSet(options.sites);\n const bodyNames = createNameSet(options.bodies);\n const directCandidates: CameraFrameMountSelector[] = [\n { cameraName: key },\n { siteName: key },\n { bodyName: key },\n ];\n const aliasCandidates = normalizeAliasCandidates(options.aliases?.[key]);\n\n for (const selector of aliasCandidates) {\n if (!isSelectorMounted(selector, cameraNames, siteNames, bodyNames)) {\n continue;\n }\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) continue;\n return { key, selector, source };\n }\n\n const [suggestion] = createMountedCameraFrameSourceSuggestions(key, options);\n if (suggestion) {\n return {\n key,\n selector: suggestion.selector,\n source: suggestion.source,\n };\n }\n\n if (options.allowAliasFallback) {\n for (const selector of aliasCandidates) {\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) continue;\n return { key, selector, source };\n }\n }\n\n for (const selector of directCandidates) {\n if (!isSelectorMounted(selector, cameraNames, siteNames, bodyNames)) {\n continue;\n }\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) continue;\n return { key, selector, source };\n }\n\n return null;\n}\n\nexport function createMountedCameraFrameSequencePlan(\n cameraKeys: readonly string[],\n options: CreateMountedCameraFrameSequencePlanOptions\n): MountedCameraFrameSequencePlan {\n const cameras: CameraFrameSequenceCamera[] = [];\n const resolved: Record<string, ResolvedMountedCameraFrameSource> = {};\n const missingKeys: string[] = [];\n\n for (const key of cameraKeys) {\n const mountedSource = resolveMountedCameraFrameSource(key, options);\n if (!mountedSource) {\n missingKeys.push(key);\n continue;\n }\n\n resolved[key] = mountedSource;\n cameras.push({\n key,\n ...options.defaults,\n ...options.cameraOptions?.[key],\n ...mountedSource.selector,\n source: mountedSource.source,\n });\n }\n\n if (options.requireAll && missingKeys.length > 0) {\n throw new Error(\n `Unable to resolve mounted MuJoCo camera source${\n missingKeys.length === 1 ? '' : 's'\n } for ${missingKeys.join(', ')}.`\n );\n }\n\n return {\n cameraKeys: [...cameraKeys],\n cameras,\n resolved,\n missingKeys,\n };\n}\n\nexport function createMountedCameraFrameSequenceReadiness(\n plan: MountedCameraFrameSequencePlan\n): MountedCameraFrameSequenceReadiness {\n const cameras: Record<string, MountedCameraFrameSequenceSourceReadiness> = {};\n const resolvedKeys = plan.cameraKeys.filter((key) => Boolean(plan.resolved[key]));\n\n for (const key of plan.cameraKeys) {\n const resolved = plan.resolved[key];\n cameras[key] = resolved\n ? {\n key,\n ready: true,\n selector: resolved.selector,\n source: resolved.source,\n message: `Camera stream \"${key}\" resolves to ${resolved.source.kind}:${getCameraFrameCaptureSourceTarget(resolved.source)}.`,\n }\n : {\n key,\n ready: false,\n message: `Camera stream \"${key}\" does not resolve to a mounted MuJoCo camera, site, or body.`,\n };\n }\n\n const missingKeys = [...plan.missingKeys];\n const ready = missingKeys.length === 0;\n const status: MountedCameraFrameSequenceReadinessStatus = ready\n ? MountedCameraFrameSequenceReadinessStatus.Ready\n : resolvedKeys.length > 0\n ? MountedCameraFrameSequenceReadinessStatus.Partial\n : MountedCameraFrameSequenceReadinessStatus.Missing;\n\n return {\n ready,\n status,\n cameraKeys: [...plan.cameraKeys],\n resolvedKeys,\n missingKeys,\n cameras,\n message: ready\n ? `All ${plan.cameraKeys.length} requested camera stream${\n plan.cameraKeys.length === 1 ? '' : 's'\n } resolve to mounted MuJoCo sources.`\n : `Missing mounted MuJoCo source${\n missingKeys.length === 1 ? '' : 's'\n } for ${missingKeys.join(', ')}.`,\n };\n}\n\nfunction normalizeFrameCount(frameCount: number | undefined) {\n return Number.isFinite(frameCount) && frameCount !== undefined\n ? Math.max(0, Math.floor(frameCount))\n : 0;\n}\n\nexport function createMountedCameraFrameSequenceManifest(\n result: MountedCameraFrameSequenceRecordResult,\n options: CreateMountedCameraFrameSequenceManifestOptions = {}\n): MountedCameraFrameSequenceManifest {\n const cameraKeys = [\n ...(options.cameraKeys ??\n result.readiness.cameraKeys ??\n result.plan.cameraKeys ??\n result.cameraKeys),\n ];\n const expectedFrameCount = normalizeFrameCount(\n options.expectedFrameCount ?? result.frameCount\n );\n const recordedFrameCount = normalizeFrameCount(result.frameCount);\n const streamSummaries: Record<string, MountedCameraFrameSequenceStreamSummary> =\n {};\n const streams: MountedCameraFrameSequenceStreamSummary[] = [];\n let missingFrameCount = 0;\n let completeStreamCount = 0;\n let resolvedOrRecordedStreamCount = 0;\n\n for (const key of cameraKeys) {\n const summary = result.cameraSummaries[key];\n const readiness = result.readiness.cameras[key];\n const source = summary?.source ?? readiness?.source;\n const ready = readiness?.ready ?? Boolean(summary);\n const recorded = normalizeFrameCount(summary?.frameCount);\n const missing = Math.max(expectedFrameCount - recorded, 0);\n const complete = ready && missing === 0;\n const status = complete\n ? MountedCameraFrameSequenceManifestStatus.Complete\n : ready || recorded > 0\n ? MountedCameraFrameSequenceManifestStatus.Partial\n : MountedCameraFrameSequenceManifestStatus.Missing;\n const target = source\n ? getCameraFrameCaptureSourceTarget(source)\n : readiness?.message\n ? undefined\n : 'missing MuJoCo camera';\n const message = complete\n ? `Camera stream \"${key}\" recorded ${recorded} of ${expectedFrameCount} frame${\n expectedFrameCount === 1 ? '' : 's'\n }.`\n : ready || recorded > 0\n ? `Camera stream \"${key}\" recorded ${recorded} of ${expectedFrameCount} frame${\n expectedFrameCount === 1 ? '' : 's'\n }.`\n : readiness?.message ??\n `Camera stream \"${key}\" did not record any frames.`;\n const stream = {\n key,\n ready,\n complete,\n status,\n source,\n selector: readiness?.selector,\n target,\n width: summary?.width,\n height: summary?.height,\n expectedFrameCount,\n recordedFrameCount: recorded,\n missingFrameCount: missing,\n firstFrameIndex: summary?.firstFrameIndex ?? null,\n lastFrameIndex: summary?.lastFrameIndex ?? null,\n firstTimestamp: summary?.firstTimestamp ?? null,\n lastTimestamp: summary?.lastTimestamp ?? null,\n message,\n };\n\n streamSummaries[key] = stream;\n streams.push(stream);\n missingFrameCount += missing;\n if (complete) completeStreamCount += 1;\n if (ready || recorded > 0) resolvedOrRecordedStreamCount += 1;\n }\n\n const complete =\n result.readiness.ready &&\n streams.length === completeStreamCount &&\n missingFrameCount === 0;\n const status = complete\n ? MountedCameraFrameSequenceManifestStatus.Complete\n : resolvedOrRecordedStreamCount > 0\n ? MountedCameraFrameSequenceManifestStatus.Partial\n : MountedCameraFrameSequenceManifestStatus.Missing;\n\n return {\n schema: 'mujoco-react/mounted-camera-frame-sequence-manifest@1',\n ready: result.readiness.ready,\n complete,\n status,\n cameraKeys,\n resolvedKeys: [...result.readiness.resolvedKeys],\n missingKeys: [...result.readiness.missingKeys],\n expectedFrameCount,\n recordedFrameCount,\n missingFrameCount,\n streamSummaries,\n streams,\n readiness: result.readiness,\n message: complete\n ? `All ${cameraKeys.length} camera stream${\n cameraKeys.length === 1 ? '' : 's'\n } recorded ${expectedFrameCount} frame${\n expectedFrameCount === 1 ? '' : 's'\n }.`\n : `Mounted camera sequence coverage is ${status}.`,\n };\n}\n\nexport function createMountedCameraFrameSequencePlanFromApi(\n api: MountedCameraFrameSequenceRecorderTarget,\n cameraKeys: readonly string[],\n options: MountedCameraFrameSequencePlanOptions = {}\n): MountedCameraFrameSequencePlan {\n return createMountedCameraFrameSequencePlan(cameraKeys, {\n ...options,\n cameras: api.getCameras(),\n sites: api.getSites(),\n bodies: api.getBodies(),\n });\n}\n\nexport async function recordMountedCameraFrameSequence(\n api: MountedCameraFrameSequenceRecorderTarget,\n options: MountedCameraFrameSequenceRecordOptions\n): Promise<MountedCameraFrameSequenceRecordResult> {\n const { cameraKeys, ...restOptions } = options;\n const requireAll =\n restOptions.requireAll ?? restOptions.requireMountedSources ?? true;\n const plan = createMountedCameraFrameSequencePlanFromApi(\n api,\n cameraKeys,\n { ...restOptions, requireAll }\n );\n const readiness = createMountedCameraFrameSequenceReadiness(plan);\n const result = await api.recordCameraSequence({\n ...restOptions,\n cameras: plan.cameras,\n requireMountedSources: restOptions.requireMountedSources ?? true,\n });\n\n return {\n ...result,\n plan,\n readiness,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Project detector/image coordinates from a camera view into the rendered MuJoCo scene.\n */\n\nimport * as THREE from 'three';\nimport type {\n CameraFrameCaptureOptions,\n CameraFrameCaptureSource,\n ImagePointCoordinateSpace,\n ImagePointProjectionOptions,\n ImagePointProjectionResult,\n} from '../types';\nimport { CAPTURE_EXCLUDE_KEY } from './cameraFrameCapture';\n\nconst _raycaster = new THREE.Raycaster();\nconst _ndc = new THREE.Vector2();\n\nfunction toVector3(\n value: CameraFrameCaptureOptions['position'] | undefined,\n fallback: THREE.Vector3\n) {\n if (!value) return fallback.clone();\n return value instanceof THREE.Vector3\n ? value.clone()\n : new THREE.Vector3(value[0], value[1], value[2]);\n}\n\nfunction applyCameraPose(\n camera: THREE.Camera,\n options: CameraFrameCaptureOptions,\n fallbackCamera: THREE.Camera\n) {\n camera.position.copy(toVector3(options.position, fallbackCamera.position));\n camera.up.copy(toVector3(options.up, fallbackCamera.up));\n\n if (options.quaternion) {\n if (options.quaternion instanceof THREE.Quaternion) {\n camera.quaternion.copy(options.quaternion);\n } else {\n camera.quaternion.set(\n options.quaternion[0],\n options.quaternion[1],\n options.quaternion[2],\n options.quaternion[3]\n );\n }\n } else if (options.lookAt) {\n camera.lookAt(toVector3(options.lookAt, new THREE.Vector3()));\n } else {\n camera.quaternion.copy(fallbackCamera.quaternion);\n }\n\n camera.updateMatrixWorld();\n}\n\nfunction createProjectionCamera(\n fallbackCamera: THREE.Camera,\n options: CameraFrameCaptureOptions,\n width: number,\n height: number\n) {\n const camera = options.camera\n ? options.camera.clone()\n : fallbackCamera instanceof THREE.PerspectiveCamera\n ? fallbackCamera.clone()\n : new THREE.PerspectiveCamera(45, width / height, 0.01, 100);\n\n if (camera instanceof THREE.PerspectiveCamera) {\n camera.aspect = width / height;\n camera.fov = options.fov ?? camera.fov;\n camera.near = options.near ?? camera.near;\n camera.far = options.far ?? camera.far;\n camera.updateProjectionMatrix();\n }\n\n applyCameraPose(camera, options, fallbackCamera);\n return camera;\n}\n\nfunction getProjectionSource(options: CameraFrameCaptureOptions): CameraFrameCaptureSource {\n if (options.source) return options.source;\n if (options.cameraName) return { kind: 'mujoco-camera', cameraName: options.cameraName };\n if (options.siteName) return { kind: 'mujoco-site', siteName: options.siteName };\n if (options.bodyName) return { kind: 'mujoco-body', bodyName: options.bodyName };\n if (options.camera) return { kind: 'custom-camera' };\n if (options.position || options.lookAt || options.quaternion) return { kind: 'explicit-pose' };\n return { kind: 'fallback-camera' };\n}\n\nfunction imageSize(\n renderer: THREE.WebGLRenderer,\n options: ImagePointProjectionOptions\n): [number, number] {\n return [\n Math.max(1, Math.floor(options.imageWidth ?? options.width ?? renderer.domElement.width)),\n Math.max(1, Math.floor(options.imageHeight ?? options.height ?? renderer.domElement.height)),\n ];\n}\n\nexport function imagePointToNdc(\n x: number,\n y: number,\n coordinateSpace: ImagePointCoordinateSpace = 'normalized',\n width = 1,\n height = 1\n): [number, number] {\n if (coordinateSpace === 'ndc') return [x, y];\n if (coordinateSpace === 'normalized-1000') {\n return [(x / 1000) * 2 - 1, 1 - (y / 1000) * 2];\n }\n if (coordinateSpace === 'pixel') {\n return [(x / width) * 2 - 1, 1 - (y / height) * 2];\n }\n return [x * 2 - 1, 1 - y * 2];\n}\n\nfunction isProjectionCandidate(object: THREE.Object3D, options: ImagePointProjectionOptions) {\n if (!object.visible) return false;\n if (object.userData[CAPTURE_EXCLUDE_KEY]) return false;\n\n const geomGroup = object.userData.geomGroup;\n const geomName = object.userData.geomName;\n if (options.hiddenGeomNames && typeof geomName === 'string' && options.hiddenGeomNames.includes(geomName)) {\n return false;\n }\n if (options.hiddenGeomGroups && typeof geomGroup === 'number' && options.hiddenGeomGroups.includes(geomGroup)) {\n return false;\n }\n if (options.visibleGeomGroups && typeof geomGroup === 'number' && !options.visibleGeomGroups.includes(geomGroup)) {\n return false;\n }\n return true;\n}\n\nfunction findBodyId(object: THREE.Object3D) {\n let current: THREE.Object3D | null = object;\n while (current && current.userData.bodyID === undefined && current.parent) {\n current = current.parent;\n }\n return typeof current?.userData.bodyID === 'number' ? current.userData.bodyID : -1;\n}\n\nexport function projectImagePointTo3D(\n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n fallbackCamera: THREE.Camera,\n options: ImagePointProjectionOptions\n): ImagePointProjectionResult | null {\n const [width, height] = imageSize(renderer, options);\n const [ndcX, ndcY] = imagePointToNdc(\n options.x,\n options.y,\n options.coordinateSpace,\n width,\n height\n );\n const projectionCamera = createProjectionCamera(fallbackCamera, options, width, height);\n\n scene.updateMatrixWorld(true);\n _ndc.set(ndcX, ndcY);\n _raycaster.setFromCamera(_ndc, projectionCamera);\n _raycaster.far = options.maxDistance ?? Infinity;\n\n const objects: THREE.Object3D[] = [];\n scene.traverse((object) => {\n if ((object as THREE.Mesh).isMesh && isProjectionCandidate(object, options)) {\n objects.push(object);\n }\n });\n\n const [hit] = _raycaster.intersectObjects(objects, true);\n if (!hit) return null;\n\n return {\n point: hit.point.clone(),\n bodyId: findBodyId(hit.object),\n geomId: typeof hit.object.userData.geomID === 'number' ? hit.object.userData.geomID : -1,\n distance: hit.distance,\n ndc: [ndcX, ndcY],\n imageSize: [width, height],\n source: getProjectionSource(options),\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, useThree } from '@react-three/fiber';\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport * as THREE from 'three';\nimport { MujocoData, MujocoModel, MujocoModule, getContact, withContacts } from '../types';\nimport { SceneRenderer } from '../components/SceneRenderer';\nimport { CameraViewportProvider } from '../components/CameraView';\nimport {\n ActuatedJointInfo,\n ActuatorInfo,\n BodyInfo,\n CameraFrameCaptureOptions,\n CameraFrameCaptureResult,\n CameraFrameCaptureSource,\n CameraFrameSequenceFrame,\n CameraFrameSequenceOptions,\n CameraFrameSequenceResult,\n CameraInfo,\n ControlGroupInfo,\n ControlGroupSelector,\n ContactInfo,\n GeomInfo,\n ImagePointProjectionOptions,\n ImagePointProjectionResult,\n JointInfo,\n LoadFromFilesOptions,\n LocalMujocoFile,\n ModelOptions,\n MujocoRenderOptions,\n MujocoSimAPI,\n PhysicsStepCallback,\n RayHit,\n ReadyCallbackInput,\n SceneConfig,\n SceneObject,\n SelectionCallbackInput,\n SensorInfo,\n SiteInfo,\n StateSnapshot,\n StepCallbackInput,\n XmlPatch,\n} from '../types';\nimport {\n captureFrame as captureCanvasFrame,\n captureFrameBlob as captureCanvasFrameBlob,\n} from '../hooks/useFrameCapture';\nimport {\n captureCameraFrame,\n captureCameraFrameBlob,\n createCameraFrameCaptureSession,\n type CameraFrameCaptureTensorOptions,\n} from '../rendering/cameraFrameCapture';\nimport {\n getCameraFrameCaptureSourceTarget,\n isMountedCameraFrameCaptureSource,\n} from '../rendering/cameraFrameSource';\nimport { projectImagePointTo3D as projectImagePointTo3DFromScene } from '../rendering/imageProjection';\nimport {\n loadScene,\n createSceneConfigFromFiles,\n findKeyframeByName,\n findBodyByName,\n findSiteByName,\n findGeomByName,\n findSensorByName,\n findActuatorByName,\n findCameraByName,\n getActuatedScalarQposAdr,\n getActuatedJoints as getActuatedJointsFromModel,\n getControlMap as getControlMapFromModel,\n getName,\n resolveControlGroup as resolveControlGroupFromModel,\n} from './SceneLoader';\n\n// ---- Joint type names ----\nconst JOINT_TYPE_NAMES = ['free', 'ball', 'slide', 'hinge'];\n// ---- Geom type names ----\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\n// ---- Sensor type names (subset — MuJoCo has many) ----\nconst SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'camprojection', 9: 'jointpos', 10: 'jointvel', 11: 'tendonpos',\n 12: 'tendonvel', 13: 'actuatorpos', 14: 'actuatorvel', 15: 'actuatorfrc',\n 16: 'jointactfrc', 17: 'tendonactfrc', 18: 'ballquat', 19: 'ballangvel',\n 20: 'jointlimitpos', 21: 'jointlimitvel', 22: 'jointlimitfrc',\n 23: 'tendonlimitpos', 24: 'tendonlimitvel', 25: 'tendonlimitfrc',\n 26: 'framepos', 27: 'framequat', 28: 'framexaxis', 29: 'frameyaxis',\n 30: 'framezaxis', 31: 'framelinvel', 32: 'frameangvel',\n 33: 'framelinacc', 34: 'frameangacc', 35: 'subtreecom',\n 36: 'subtreelinvel', 37: 'subtreeangmom', 38: 'insidesite',\n 39: 'geomdist', 40: 'geomnormal', 41: 'geomfromto',\n 42: 'contact', 43: 'e_potential', 44: 'e_kinetic',\n 45: 'clock', 46: 'tactile', 47: 'plugin', 48: 'user',\n};\n\nconst EMPTY_CONTROL_GROUP: ControlGroupInfo = {\n joints: [],\n actuators: [],\n qposAdr: [],\n dofAdr: [],\n ctrlAdr: [],\n readQpos: () => new Float64Array(0),\n readCtrl: () => new Float64Array(0),\n writeQpos: () => {},\n writeCtrl: () => {},\n};\n\nfunction isMutableApiRef(\n ref: React.ForwardedRef<MujocoSimAPI>\n): ref is React.MutableRefObject<MujocoSimAPI | null> {\n return typeof ref === 'object' && ref !== null && 'current' in ref;\n}\n\n// Preallocated force/torque temps for applyForce/applyTorque\nconst _applyForce = new Float64Array(3);\nconst _applyTorque = new Float64Array(3);\nconst _applyPoint = new Float64Array(3);\nconst _rayPnt = new Float64Array(3);\nconst _rayVec = new Float64Array(3);\nconst _rayGeomId = new Int32Array(1);\nconst _projRaycaster = new THREE.Raycaster();\nconst _projNdc = new THREE.Vector2();\n\nfunction waitForNextAnimationFrame() {\n return new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n}\n\nfunction throwIfCameraSequenceAborted(signal: AbortSignal | undefined) {\n if (!signal?.aborted) return;\n\n if (typeof signal.reason === 'object' && signal.reason instanceof Error) {\n throw signal.reason;\n }\n\n throw new DOMException('Camera sequence recording was aborted.', 'AbortError');\n}\n\nfunction vector3FromArray(values: ArrayLike<number>, offset: number): [number, number, number] {\n return [values[offset], values[offset + 1], values[offset + 2]];\n}\n\nfunction quaternionFromMujocoQuat(values: ArrayLike<number>, offset: number): [number, number, number, number] {\n return [\n values[offset + 1],\n values[offset + 2],\n values[offset + 3],\n values[offset],\n ];\n}\n\nfunction quaternionFromXmat(values: ArrayLike<number>, offset: number): [number, number, number, number] {\n const matrix = new THREE.Matrix4();\n matrix.set(\n values[offset],\n values[offset + 1],\n values[offset + 2],\n 0,\n values[offset + 3],\n values[offset + 4],\n values[offset + 5],\n 0,\n values[offset + 6],\n values[offset + 7],\n values[offset + 8],\n 0,\n 0,\n 0,\n 0,\n 1\n );\n const quaternion = new THREE.Quaternion().setFromRotationMatrix(matrix);\n return [quaternion.x, quaternion.y, quaternion.z, quaternion.w];\n}\n\nfunction omitResolvedCameraSelectors(\n options: CameraFrameCaptureOptions\n): CameraFrameCaptureOptions {\n const { cameraName, siteName, bodyName, ...rest } = options;\n return rest;\n}\n\nfunction vector3FromCaptureValue(value: NonNullable<CameraFrameCaptureOptions['positionOffset']>) {\n return value instanceof THREE.Vector3\n ? value.clone()\n : new THREE.Vector3(value[0], value[1], value[2]);\n}\n\nfunction quaternionFromCaptureValue(value: NonNullable<CameraFrameCaptureOptions['quaternionOffset']>) {\n return value instanceof THREE.Quaternion\n ? value.clone()\n : new THREE.Quaternion(value[0], value[1], value[2], value[3]);\n}\n\nfunction applyMountedCameraPoseOffsets(\n options: CameraFrameCaptureOptions,\n position: [number, number, number],\n quaternion: [number, number, number, number]\n) {\n const resolvedPosition = new THREE.Vector3(position[0], position[1], position[2]);\n const resolvedQuaternion = new THREE.Quaternion(\n quaternion[0],\n quaternion[1],\n quaternion[2],\n quaternion[3]\n );\n\n if (options.positionOffset) {\n resolvedPosition.add(\n vector3FromCaptureValue(options.positionOffset).applyQuaternion(resolvedQuaternion)\n );\n }\n\n if (options.quaternionOffset) {\n resolvedQuaternion.multiply(quaternionFromCaptureValue(options.quaternionOffset)).normalize();\n }\n\n return {\n position: [\n resolvedPosition.x,\n resolvedPosition.y,\n resolvedPosition.z,\n ] as [number, number, number],\n quaternion: [\n resolvedQuaternion.x,\n resolvedQuaternion.y,\n resolvedQuaternion.z,\n resolvedQuaternion.w,\n ] as [number, number, number, number],\n };\n}\n\nfunction resolveMujocoCameraCompatibilityOptions(\n options: CameraFrameCaptureOptions\n) {\n const compatibility = options.mujocoCameraCompatibility;\n if (!compatibility) return null;\n if (compatibility === true) {\n return {\n useResolution: true,\n useIntrinsics: true,\n useClipping: true,\n preserveAspect: true,\n preferResolution: false,\n };\n }\n return {\n useResolution: compatibility.useResolution ?? true,\n useIntrinsics: compatibility.useIntrinsics ?? true,\n useClipping: compatibility.useClipping ?? true,\n preserveAspect: compatibility.preserveAspect ?? true,\n preferResolution: compatibility.preferResolution ?? false,\n };\n}\n\nfunction mujocoVisualClip(model: MujocoModel) {\n const map = (model as unknown as {\n vis?: { map?: { znear?: number; zfar?: number } };\n }).vis?.map;\n const near = typeof map?.znear === 'number' && map.znear > 0\n ? map.znear\n : undefined;\n const far = typeof map?.zfar === 'number' && map.zfar > 0\n ? map.zfar\n : undefined;\n return { near, far };\n}\n\nfunction mujocoCameraResolution(\n model: MujocoModel,\n cameraId: number\n): { width?: number; height?: number } {\n const resolution = model.cam_resolution;\n if (!resolution) return {};\n const width = Number(resolution[cameraId * 2]);\n const height = Number(resolution[cameraId * 2 + 1]);\n return {\n width: Number.isFinite(width) && width > 0 ? width : undefined,\n height: Number.isFinite(height) && height > 0 ? height : undefined,\n };\n}\n\nfunction mujocoCameraProjectionMatrix(\n model: MujocoModel,\n cameraId: number,\n width: number | undefined,\n height: number | undefined,\n near: number | undefined,\n far: number | undefined\n): THREE.Matrix4 | undefined {\n const intrinsic = model.cam_intrinsic;\n const sensorSize = model.cam_sensorsize;\n if (!intrinsic || !sensorSize || !width || !height) return undefined;\n\n const intrinsicOffset = cameraId * 4;\n const sensorOffset = cameraId * 2;\n const focalX = Number(intrinsic[intrinsicOffset]);\n const focalY = Number(intrinsic[intrinsicOffset + 1]);\n const principalX = Number(intrinsic[intrinsicOffset + 2]);\n const principalY = Number(intrinsic[intrinsicOffset + 3]);\n const sensorWidth = Number(sensorSize[sensorOffset]);\n const sensorHeight = Number(sensorSize[sensorOffset + 1]);\n if (\n !Number.isFinite(focalX) ||\n !Number.isFinite(focalY) ||\n !Number.isFinite(principalX) ||\n !Number.isFinite(principalY) ||\n !Number.isFinite(sensorWidth) ||\n !Number.isFinite(sensorHeight) ||\n focalX <= 0 ||\n focalY <= 0 ||\n sensorWidth <= 0 ||\n sensorHeight <= 0\n ) {\n return undefined;\n }\n\n const fx = focalX / sensorWidth * width;\n const fy = focalY / sensorHeight * height;\n const cx = width * (0.5 + principalX / sensorWidth);\n const cy = height * (0.5 + principalY / sensorHeight);\n const znear = near ?? 0.01;\n const zfar = far ?? 100;\n\n return new THREE.Matrix4().set(\n 2 * fx / width, 0, 1 - 2 * cx / width, 0,\n 0, 2 * fy / height, 2 * cy / height - 1, 0,\n 0, 0, -(zfar + znear) / (zfar - znear), -2 * zfar * znear / (zfar - znear),\n 0, 0, -1, 0\n );\n}\n\nfunction resolveMujocoCameraCaptureDimensions(\n requested: CameraFrameCaptureOptions,\n cameraResolution: { width?: number; height?: number },\n compatibility: NonNullable<ReturnType<typeof resolveMujocoCameraCompatibilityOptions>>\n) {\n if (!compatibility.useResolution) {\n return {\n width: requested.width,\n height: requested.height,\n };\n }\n\n if (compatibility.preferResolution) {\n return {\n width: cameraResolution.width ?? requested.width,\n height: cameraResolution.height ?? requested.height,\n };\n }\n\n let width = requested.width ?? cameraResolution.width;\n let height = requested.height ?? cameraResolution.height;\n\n if (\n compatibility.preserveAspect &&\n cameraResolution.width &&\n cameraResolution.height\n ) {\n if (requested.width !== undefined && requested.height === undefined) {\n height = requested.width * cameraResolution.height / cameraResolution.width;\n } else if (requested.height !== undefined && requested.width === undefined) {\n width = requested.height * cameraResolution.width / cameraResolution.height;\n }\n }\n\n return { width, height };\n}\n\nfunction countMountedCameraSelectors(options: CameraFrameCaptureOptions) {\n return Number(Boolean(options.cameraName)) +\n Number(Boolean(options.siteName)) +\n Number(Boolean(options.bodyName));\n}\n\nfunction assertMatchingMountedCameraSource(\n key: string,\n requested: CameraFrameCaptureOptions,\n source: CameraFrameCaptureSource\n) {\n const selectorCount = countMountedCameraSelectors(requested);\n if (selectorCount !== 1) {\n throw new Error(\n `Camera sequence stream \"${key}\" must provide exactly one mounted MuJoCo cameraName, siteName, or bodyName selector.`\n );\n }\n\n if (!isMountedCameraFrameCaptureSource(source)) {\n throw new Error(\n `Camera sequence stream \"${key}\" resolved to ${source.kind}; use a MuJoCo-mounted camera, site, or body selector for sequence recording.`\n );\n }\n\n if (\n (requested.cameraName &&\n (source.kind !== 'mujoco-camera' || source.cameraName !== requested.cameraName)) ||\n (requested.siteName &&\n (source.kind !== 'mujoco-site' || source.siteName !== requested.siteName)) ||\n (requested.bodyName &&\n (source.kind !== 'mujoco-body' || source.bodyName !== requested.bodyName))\n ) {\n throw new Error(\n `Camera sequence stream \"${key}\" resolved to ${source.kind}:${getCameraFrameCaptureSourceTarget(source)} instead of the requested mounted selector.`\n );\n }\n}\n\n// ---- Internal context types ----\n\nexport interface MujocoSimContextValue {\n api: MujocoSimAPI;\n mjModelRef: React.RefObject<MujocoModel | null>;\n mjDataRef: React.RefObject<MujocoData | null>;\n mujocoRef: React.RefObject<MujocoModule>;\n configRef: React.RefObject<SceneConfig>;\n pausedRef: React.RefObject<boolean>;\n speedRef: React.RefObject<number>;\n substepsRef: React.RefObject<number>;\n interpolateRef: React.RefObject<boolean>;\n interpolationStateRef: React.RefObject<BodyInterpolationState>;\n onSelectionRef: React.RefObject<\n ((input: SelectionCallbackInput) => void) | undefined\n >;\n beforeStepCallbacks: React.RefObject<Set<PhysicsStepCallback>>;\n afterStepCallbacks: React.RefObject<Set<PhysicsStepCallback>>;\n resetCallbacks: React.RefObject<Set<() => void>>;\n errorRef: React.RefObject<string | null>;\n bodyRegistryRef: React.RefObject<Map<string, { definition: SceneObject; hasCustomChildren: boolean }>>;\n hiddenBodiesRef: React.RefObject<Set<string>>;\n requestBodyReload: () => void;\n status: 'loading' | 'ready' | 'error';\n}\n\nexport interface BodyInterpolationState {\n alpha: number;\n previousXpos: Float64Array;\n previousXquat: Float64Array;\n currentXpos: Float64Array;\n currentXquat: Float64Array;\n valid: boolean;\n}\n\nconst MujocoSimContext = createContext<MujocoSimContextValue | null>(null);\n\nexport type UseMujocoResult =\n | { status: 'loading'; isPending: true; isReady: false; isError: false; error: null; api: null; mjModelRef: null; mjDataRef: null }\n | { status: 'error'; isPending: false; isReady: false; isError: true; error: string; api: null; mjModelRef: null; mjDataRef: null }\n | { status: 'ready'; isPending: false; isReady: true; isError: false; error: null;\n api: MujocoSimAPI; mjModelRef: React.RefObject<MujocoModel | null>; mjDataRef: React.RefObject<MujocoData | null> };\n\nexport function useMujocoContext(): MujocoSimContextValue {\n const ctx = useContext(MujocoSimContext);\n if (!ctx)\n throw new Error('useMujoco must be used inside <MujocoSimProvider>');\n return ctx;\n}\n\nexport function useMujoco(): UseMujocoResult {\n const ctx = useMujocoContext();\n if (ctx.status === 'ready') {\n return {\n status: 'ready',\n isPending: false,\n isReady: true,\n isError: false,\n error: null,\n api: ctx.api,\n mjModelRef: ctx.mjModelRef,\n mjDataRef: ctx.mjDataRef,\n };\n }\n if (ctx.status === 'error') {\n return {\n status: 'error',\n isPending: false,\n isReady: false,\n isError: true,\n error: ctx.errorRef.current ?? 'Unknown error',\n api: null,\n mjModelRef: null,\n mjDataRef: null,\n };\n }\n return {\n status: 'loading',\n isPending: true,\n isReady: false,\n isError: false,\n error: null,\n api: null,\n mjModelRef: null,\n mjDataRef: null,\n };\n}\n\nexport function useBeforePhysicsStep(callback: PhysicsStepCallback) {\n const { beforeStepCallbacks } = useMujocoContext();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (input) => callbackRef.current(input);\n beforeStepCallbacks.current.add(wrapped);\n return () => { beforeStepCallbacks.current.delete(wrapped); };\n }, [beforeStepCallbacks]);\n}\n\nexport function useAfterPhysicsStep(callback: PhysicsStepCallback) {\n const { afterStepCallbacks } = useMujocoContext();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (input) => callbackRef.current(input);\n afterStepCallbacks.current.add(wrapped);\n return () => { afterStepCallbacks.current.delete(wrapped); };\n }, [afterStepCallbacks]);\n}\n\ninterface MujocoSimProviderProps {\n mujoco: MujocoModule;\n config: SceneConfig;\n apiRef?: React.ForwardedRef<MujocoSimAPI>;\n onReady?: (input: ReadyCallbackInput) => void;\n onError?: (error: Error) => void;\n onStep?: (input: StepCallbackInput) => void;\n onSelection?: (input: SelectionCallbackInput) => void;\n // Declarative physics config props\n gravity?: [number, number, number];\n timestep?: number;\n substeps?: number;\n paused?: boolean;\n speed?: number;\n interpolate?: boolean;\n renderOptions?: MujocoRenderOptions;\n children: React.ReactNode;\n}\n\nexport function MujocoSimProvider({\n mujoco,\n config,\n apiRef: externalApiRef,\n onReady,\n onError,\n onStep,\n onSelection,\n gravity,\n timestep,\n substeps,\n paused,\n speed,\n interpolate,\n renderOptions,\n children,\n}: MujocoSimProviderProps) {\n const { gl, camera, scene } = useThree();\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n\n // --- Refs ---\n const mjModelRef = useRef<MujocoModel | null>(null);\n const mjDataRef = useRef<MujocoData | null>(null);\n const mujocoRef = useRef<MujocoModule>(mujoco);\n const configRef = useRef<SceneConfig>(config);\n const pausedRef = useRef(paused ?? false);\n const speedRef = useRef(speed ?? 1);\n const substepsRef = useRef(substeps ?? 1);\n const interpolateRef = useRef(interpolate ?? false);\n const interpolationStateRef = useRef<BodyInterpolationState>({\n alpha: 1,\n previousXpos: new Float64Array(0),\n previousXquat: new Float64Array(0),\n currentXpos: new Float64Array(0),\n currentXquat: new Float64Array(0),\n valid: false,\n });\n const physicsAccumulatorRef = useRef(0);\n const stepsToRunRef = useRef(0);\n const loadGenRef = useRef(0);\n\n const onSelectionRef = useRef(onSelection);\n onSelectionRef.current = onSelection;\n const onStepRef = useRef(onStep);\n onStepRef.current = onStep;\n\n const beforeStepCallbacks = useRef(new Set<PhysicsStepCallback>());\n const afterStepCallbacks = useRef(new Set<PhysicsStepCallback>());\n const resetCallbacks = useRef(new Set<() => void>());\n const errorRef = useRef<string | null>(null);\n const bodyRegistryRef = useRef(new Map<string, { definition: SceneObject; hasCustomChildren: boolean }>());\n const hiddenBodiesRef = useRef(new Set<string>());\n const bodyReloadTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n configRef.current = config;\n mujocoRef.current = mujoco;\n pausedRef.current = paused ?? false;\n speedRef.current = speed ?? 1;\n substepsRef.current = substeps ?? 1;\n interpolateRef.current = interpolate ?? false;\n\n // Sync gravity prop\n useEffect(() => {\n if (!gravity) return;\n const model = mjModelRef.current;\n if (!model?.opt?.gravity) return;\n model.opt.gravity[0] = gravity[0];\n model.opt.gravity[1] = gravity[1];\n model.opt.gravity[2] = gravity[2];\n }, [gravity]);\n\n // Sync timestep prop\n useEffect(() => {\n if (timestep === undefined) return;\n const model = mjModelRef.current;\n if (!model?.opt) return;\n model.opt.timestep = timestep;\n }, [timestep]);\n\n // --- Build merged config (base + body registry) ---\n function buildMergedConfig(baseConfig: SceneConfig): SceneConfig {\n if (bodyRegistryRef.current.size === 0) return baseConfig;\n const registeredNames = new Set(bodyRegistryRef.current.keys());\n const baseObjects = (baseConfig.sceneObjects ?? []).filter(o => !registeredNames.has(o.name));\n const registeredBodies = Array.from(bodyRegistryRef.current.values()).map(e => e.definition);\n hiddenBodiesRef.current.clear();\n for (const [name, entry] of bodyRegistryRef.current) {\n if (entry.hasCustomChildren) hiddenBodiesRef.current.add(name);\n }\n return { ...baseConfig, sceneObjects: [...baseObjects, ...registeredBodies] };\n }\n\n // --- Load scene on mount ---\n useEffect(() => {\n let disposed = false;\n\n (async () => {\n try {\n const result = await loadScene(mujoco, buildMergedConfig(config));\n if (disposed) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mujocoRef.current = mujoco;\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n\n // Apply declarative physics props after load\n if (gravity && result.mjModel.opt?.gravity) {\n result.mjModel.opt.gravity[0] = gravity[0];\n result.mjModel.opt.gravity[1] = gravity[1];\n result.mjModel.opt.gravity[2] = gravity[2];\n }\n if (timestep !== undefined && result.mjModel.opt) {\n result.mjModel.opt.timestep = timestep;\n }\n\n setStatus('ready');\n } catch (e: unknown) {\n if (!disposed) {\n const err = e instanceof Error ? e : new Error(String(e));\n errorRef.current = err.message;\n setStatus('error');\n onError?.(err);\n }\n }\n })();\n\n return () => {\n disposed = true;\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n };\n }, [mujoco, config]);\n\n // Fire onReady and assign external ref when status changes to ready\n useEffect(() => {\n if (status === 'ready') {\n const api = apiRef.current;\n if (onReady) onReady({ api });\n // Assign the forwarded ref\n if (externalApiRef) {\n if (typeof externalApiRef === 'function') {\n externalApiRef(api);\n } else if (isMutableApiRef(externalApiRef)) {\n externalApiRef.current = api;\n }\n }\n }\n }, [status]);\n\n // --- Physics step (priority -1) ---\n useFrame((_state, delta) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n // Check single-step mode\n const shouldStep = !pausedRef.current || stepsToRunRef.current > 0;\n if (!shouldStep) return;\n\n // Zero generalized applied forces\n for (let i = 0; i < model.nv; i++) {\n data.qfrc_applied[i] = 0;\n }\n\n // Before-step callbacks\n for (const cb of beforeStepCallbacks.current) {\n cb({ model, data });\n }\n\n const numSubsteps = substepsRef.current;\n if (!interpolateRef.current) {\n // Step physics with substeps\n if (stepsToRunRef.current > 0) {\n for (let s = 0; s < stepsToRunRef.current; s++) {\n mujocoRef.current.mj_step(model, data);\n }\n stepsToRunRef.current = 0;\n } else {\n const startSimTime = data.time;\n const clampedDelta = Math.min(delta, 1 / 15); // cap to avoid spiral of death\n const frameTime = clampedDelta * speedRef.current;\n while (data.time - startSimTime < frameTime) {\n for (let s = 0; s < numSubsteps; s++) {\n mujocoRef.current.mj_step(model, data);\n }\n }\n }\n } else if (stepsToRunRef.current > 0) {\n ensureInterpolationBuffers(model);\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n for (let s = 0; s < stepsToRunRef.current; s++) {\n mujocoRef.current.mj_step(model, data);\n }\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n interpolationStateRef.current.alpha = 1;\n interpolationStateRef.current.valid = true;\n stepsToRunRef.current = 0;\n } else {\n ensureInterpolationBuffers(model);\n const clampedDelta = Math.min(delta, 1 / 15); // cap to avoid spiral of death\n physicsAccumulatorRef.current += clampedDelta * speedRef.current;\n const stepDt = Math.max((model.opt?.timestep ?? 0.002) * Math.max(1, numSubsteps), 1e-6);\n let stepped = false;\n\n while (physicsAccumulatorRef.current >= stepDt) {\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n for (let s = 0; s < numSubsteps; s++) {\n mujocoRef.current.mj_step(model, data);\n }\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n physicsAccumulatorRef.current -= stepDt;\n stepped = true;\n }\n\n if (!interpolationStateRef.current.valid) {\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n }\n\n interpolationStateRef.current.alpha = Math.min(Math.max(physicsAccumulatorRef.current / stepDt, 0), 1);\n interpolationStateRef.current.valid = true;\n\n if (!stepped) {\n onStepRef.current?.({ time: data.time, model, data });\n return;\n }\n }\n\n // After-step callbacks\n for (const cb of afterStepCallbacks.current) {\n cb({ model, data });\n }\n\n onStepRef.current?.({ time: data.time, model, data });\n }, -1);\n\n function ensureInterpolationBuffers(model: MujocoModel) {\n const state = interpolationStateRef.current;\n const xposLength = model.nbody * 3;\n const xquatLength = model.nbody * 4;\n if (state.previousXpos.length !== xposLength) state.previousXpos = new Float64Array(xposLength);\n if (state.currentXpos.length !== xposLength) state.currentXpos = new Float64Array(xposLength);\n if (state.previousXquat.length !== xquatLength) state.previousXquat = new Float64Array(xquatLength);\n if (state.currentXquat.length !== xquatLength) state.currentXquat = new Float64Array(xquatLength);\n }\n\n function copyBodyPose(data: MujocoData, xpos: Float64Array, xquat: Float64Array) {\n xpos.set(data.xpos.subarray(0, xpos.length));\n xquat.set(data.xquat.subarray(0, xquat.length));\n }\n\n // --- API Methods ---\n\n const reset = useCallback(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n mujocoRef.current.mj_resetData(model, data);\n\n const homeJoints = configRef.current.homeJoints;\n if (homeJoints) {\n const homeCount = Math.min(homeJoints.length, model.nu);\n for (let i = 0; i < homeCount; i++) {\n data.ctrl[i] = homeJoints[i];\n const qposAdr = getActuatedScalarQposAdr(model, i);\n if (qposAdr !== -1) {\n data.qpos[qposAdr] = homeJoints[i];\n }\n }\n }\n\n configRef.current.onReset?.({ model, data });\n mujocoRef.current.mj_forward(model, data);\n\n // Notify composable plugins (e.g. IkController)\n for (const cb of resetCallbacks.current) {\n cb();\n }\n }, [mujoco]);\n\n const setSpeed = useCallback((multiplier: number) => {\n speedRef.current = multiplier;\n }, []);\n\n const togglePause = useCallback((): boolean => {\n pausedRef.current = !pausedRef.current;\n return pausedRef.current;\n }, []);\n\n const setPaused = useCallback((p: boolean) => {\n pausedRef.current = p;\n }, []);\n\n const step = useCallback((n = 1) => {\n stepsToRunRef.current = n;\n }, []);\n\n const stepImmediately = useCallback((steps = 1) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return false;\n\n for (let stepIndex = 0; stepIndex < steps; stepIndex += 1) {\n for (let i = 0; i < model.nv; i += 1) {\n data.qfrc_applied[i] = 0;\n }\n for (const cb of beforeStepCallbacks.current) {\n cb({ model, data });\n }\n mujocoRef.current.mj_step(model, data);\n for (const cb of afterStepCallbacks.current) {\n cb({ model, data });\n }\n onStepRef.current?.({ time: data.time, model, data });\n }\n\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n return true;\n }, [mujoco]);\n\n const getTime = useCallback((): number => {\n return mjDataRef.current?.time ?? 0;\n }, []);\n\n const getTimestep = useCallback((): number => {\n return mjModelRef.current?.opt?.timestep ?? 0.002;\n }, []);\n\n const saveState = useCallback((): StateSnapshot => {\n const data = mjDataRef.current;\n if (!data) return { time: 0, qpos: new Float64Array(0), qvel: new Float64Array(0), ctrl: new Float64Array(0), act: new Float64Array(0), qfrc_applied: new Float64Array(0) };\n return {\n time: data.time,\n qpos: new Float64Array(data.qpos),\n qvel: new Float64Array(data.qvel),\n ctrl: new Float64Array(data.ctrl),\n act: new Float64Array(data.act),\n qfrc_applied: new Float64Array(data.qfrc_applied),\n };\n }, []);\n\n const restoreState = useCallback((snapshot: StateSnapshot) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n data.time = snapshot.time;\n data.qpos.set(snapshot.qpos);\n data.qvel.set(snapshot.qvel);\n data.ctrl.set(snapshot.ctrl);\n if (snapshot.act.length > 0) data.act.set(snapshot.act);\n data.qfrc_applied.set(snapshot.qfrc_applied);\n mujocoRef.current.mj_forward(model, data);\n }, [mujoco]);\n\n const setQpos = useCallback((values: Float64Array | number[]) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n const arr = values instanceof Float64Array ? values : new Float64Array(values);\n data.qpos.set(arr.subarray(0, Math.min(arr.length, model.nq)));\n mujocoRef.current.mj_forward(model, data);\n }, [mujoco]);\n\n const setQvel = useCallback((values: Float64Array | number[]) => {\n const data = mjDataRef.current;\n if (!data) return;\n const arr = values instanceof Float64Array ? values : new Float64Array(values);\n data.qvel.set(arr.subarray(0, Math.min(arr.length, mjModelRef.current?.nv ?? 0)));\n }, []);\n\n const getQpos = useCallback((): Float64Array => {\n return mjDataRef.current ? new Float64Array(mjDataRef.current.qpos) : new Float64Array(0);\n }, []);\n\n const getQvel = useCallback((): Float64Array => {\n return mjDataRef.current ? new Float64Array(mjDataRef.current.qvel) : new Float64Array(0);\n }, []);\n\n const setCtrl = useCallback((nameOrValues: string | Record<string, number>, value?: number) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n if (typeof nameOrValues === 'string') {\n const id = findActuatorByName(model, nameOrValues);\n if (id >= 0 && value !== undefined) data.ctrl[id] = value;\n } else {\n for (const [name, val] of Object.entries(nameOrValues)) {\n const id = findActuatorByName(model, name);\n if (id >= 0) data.ctrl[id] = val;\n }\n }\n }, []);\n\n const getCtrl = useCallback((): Float64Array => {\n return mjDataRef.current ? new Float64Array(mjDataRef.current.ctrl) : new Float64Array(0);\n }, []);\n\n const applyForce = useCallback((bodyName: string, force: THREE.Vector3, point?: THREE.Vector3) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n const bodyId = findBodyByName(model, bodyName);\n if (bodyId < 0) return;\n\n _applyForce[0] = force.x; _applyForce[1] = force.y; _applyForce[2] = force.z;\n _applyTorque[0] = 0; _applyTorque[1] = 0; _applyTorque[2] = 0;\n if (point) {\n _applyPoint[0] = point.x; _applyPoint[1] = point.y; _applyPoint[2] = point.z;\n } else {\n const i3 = bodyId * 3;\n _applyPoint[0] = data.xpos[i3]; _applyPoint[1] = data.xpos[i3 + 1]; _applyPoint[2] = data.xpos[i3 + 2];\n }\n mujoco.mj_applyFT(model, data, _applyForce, _applyTorque, _applyPoint, bodyId, data.qfrc_applied);\n }, [mujoco]);\n\n const applyTorqueApi = useCallback((bodyName: string, torque: THREE.Vector3) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n const bodyId = findBodyByName(model, bodyName);\n if (bodyId < 0) return;\n\n _applyForce[0] = 0; _applyForce[1] = 0; _applyForce[2] = 0;\n _applyTorque[0] = torque.x; _applyTorque[1] = torque.y; _applyTorque[2] = torque.z;\n const i3 = bodyId * 3;\n _applyPoint[0] = data.xpos[i3]; _applyPoint[1] = data.xpos[i3 + 1]; _applyPoint[2] = data.xpos[i3 + 2];\n mujoco.mj_applyFT(model, data, _applyForce, _applyTorque, _applyPoint, bodyId, data.qfrc_applied);\n }, [mujoco]);\n\n const setExternalForce = useCallback((bodyName: string, force: THREE.Vector3, torque: THREE.Vector3) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n const bodyId = findBodyByName(model, bodyName);\n if (bodyId < 0) return;\n const i6 = bodyId * 6;\n data.xfrc_applied[i6] = torque.x; data.xfrc_applied[i6 + 1] = torque.y; data.xfrc_applied[i6 + 2] = torque.z;\n data.xfrc_applied[i6 + 3] = force.x; data.xfrc_applied[i6 + 4] = force.y; data.xfrc_applied[i6 + 5] = force.z;\n }, []);\n\n const applyGeneralizedForce = useCallback((values: Float64Array | number[]) => {\n const data = mjDataRef.current;\n if (!data) return;\n const nv = mjModelRef.current?.nv ?? 0;\n for (let i = 0; i < Math.min(values.length, nv); i++) {\n data.qfrc_applied[i] += values[i];\n }\n }, []);\n\n const getSensorData = useCallback((name: string): Float64Array | null => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return null;\n const id = findSensorByName(model, name);\n if (id < 0) return null;\n const adr = model.sensor_adr[id];\n const dim = model.sensor_dim[id];\n return new Float64Array(data.sensordata.subarray(adr, adr + dim));\n }, []);\n\n const getContacts = useCallback((): ContactInfo[] => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return [];\n const contacts: ContactInfo[] = [];\n const ncon = data.ncon;\n withContacts(data, (contactArray) => {\n for (let i = 0; i < ncon; i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n contacts.push({\n geom1: c.geom1,\n geom1Name: getName(model, model.name_geomadr[c.geom1]),\n geom2: c.geom2,\n geom2Name: getName(model, model.name_geomadr[c.geom2]),\n pos: [c.pos[0], c.pos[1], c.pos[2]],\n depth: c.dist,\n });\n }\n });\n return contacts;\n }, []);\n\n const getBodies = useCallback((): BodyInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: BodyInfo[] = [];\n for (let i = 0; i < model.nbody; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_bodyadr[i]),\n mass: model.body_mass[i],\n parentId: model.body_parentid[i],\n });\n }\n return result;\n }, []);\n\n const getJoints = useCallback((): JointInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: JointInfo[] = [];\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const range: [number, number] = [model.jnt_range[2 * i], model.jnt_range[2 * i + 1]];\n result.push({\n id: i,\n name: getName(model, model.name_jntadr[i]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range,\n limited: range[0] < range[1],\n bodyId: model.jnt_bodyid[i],\n qposAdr: model.jnt_qposadr[i],\n dofAdr: model.jnt_dofadr[i],\n });\n }\n return result;\n }, []);\n\n const getGeoms = useCallback((): GeomInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: GeomInfo[] = [];\n for (let i = 0; i < model.ngeom; i++) {\n const type = model.geom_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_geomadr[i]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `unknown(${type})`,\n size: [model.geom_size[3 * i], model.geom_size[3 * i + 1], model.geom_size[3 * i + 2]],\n bodyId: model.geom_bodyid[i],\n });\n }\n return result;\n }, []);\n\n const getSites = useCallback((): SiteInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SiteInfo[] = [];\n for (let i = 0; i < model.nsite; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_siteadr[i]),\n bodyId: model.site_bodyid ? model.site_bodyid[i] : -1,\n });\n }\n return result;\n }, []);\n\n const getActuatorsApi = useCallback((): ActuatorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const hasRange = model.actuator_ctrlrange[2 * i] < model.actuator_ctrlrange[2 * i + 1];\n result.push({\n id: i,\n name: getName(model, model.name_actuatoradr[i]),\n range: hasRange\n ? [model.actuator_ctrlrange[2 * i], model.actuator_ctrlrange[2 * i + 1]]\n : [-Infinity, Infinity],\n });\n }\n return result;\n }, []);\n\n const getControlMapApi = useCallback((): ControlGroupInfo => {\n const model = mjModelRef.current;\n return model ? getControlMapFromModel(model) : EMPTY_CONTROL_GROUP;\n }, []);\n\n const getActuatedJointsApi = useCallback((): ActuatedJointInfo[] => {\n const model = mjModelRef.current;\n return model ? getActuatedJointsFromModel(model) : [];\n }, []);\n\n const resolveControlGroupApi = useCallback((selector: ControlGroupSelector): ControlGroupInfo | null => {\n const model = mjModelRef.current;\n return model ? resolveControlGroupFromModel(model, selector) : null;\n }, []);\n\n const getSensors = useCallback((): SensorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, []);\n\n const getCameras = useCallback((): CameraInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const ncam = model.ncam ?? 0;\n const nameAddresses = model.name_camadr;\n if (!ncam || !nameAddresses) return [];\n\n const result: CameraInfo[] = [];\n for (let i = 0; i < ncam; i += 1) {\n const posOffset = i * 3;\n const quatOffset = i * 4;\n const intrinsicOffset = i * 4;\n const resolutionOffset = i * 2;\n result.push({\n id: i,\n name: getName(model, nameAddresses[i]),\n bodyId: model.cam_bodyid?.[i] ?? -1,\n fov: model.cam_fovy?.[i] ?? null,\n resolution: model.cam_resolution\n ? [\n model.cam_resolution[resolutionOffset],\n model.cam_resolution[resolutionOffset + 1],\n ]\n : null,\n sensorSize: model.cam_sensorsize\n ? [\n model.cam_sensorsize[resolutionOffset],\n model.cam_sensorsize[resolutionOffset + 1],\n ]\n : null,\n intrinsic: model.cam_intrinsic\n ? [\n model.cam_intrinsic[intrinsicOffset],\n model.cam_intrinsic[intrinsicOffset + 1],\n model.cam_intrinsic[intrinsicOffset + 2],\n model.cam_intrinsic[intrinsicOffset + 3],\n ]\n : null,\n position: model.cam_pos\n ? vector3FromArray(model.cam_pos, posOffset)\n : null,\n quaternion: model.cam_quat\n ? quaternionFromMujocoQuat(model.cam_quat, quatOffset)\n : null,\n });\n }\n return result;\n }, []);\n\n const resolveCameraCaptureOptions = useCallback(\n (options: CameraFrameCaptureOptions = {}): CameraFrameCaptureOptions => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) {\n return options;\n }\n\n const baseOptions = omitResolvedCameraSelectors(options);\n\n if (options.cameraName) {\n const cameraId = findCameraByName(model, options.cameraName);\n if (cameraId < 0) {\n throw new Error(`MuJoCo camera \"${options.cameraName}\" was not found.`);\n }\n\n const position = data.cam_xpos\n ? vector3FromArray(data.cam_xpos, cameraId * 3)\n : model.cam_pos\n ? vector3FromArray(model.cam_pos, cameraId * 3)\n : undefined;\n const quaternion = data.cam_xmat\n ? quaternionFromXmat(data.cam_xmat, cameraId * 9)\n : model.cam_quat\n ? quaternionFromMujocoQuat(model.cam_quat, cameraId * 4)\n : undefined;\n\n if (!position || !quaternion) {\n throw new Error(\n `MuJoCo camera \"${options.cameraName}\" does not expose a capture pose.`\n );\n }\n\n const pose = applyMountedCameraPoseOffsets(options, position, quaternion);\n const compatibility = resolveMujocoCameraCompatibilityOptions(options);\n const cameraResolution = compatibility?.useResolution\n ? mujocoCameraResolution(model, cameraId)\n : { width: undefined, height: undefined };\n const clip = compatibility?.useClipping\n ? mujocoVisualClip(model)\n : { near: undefined, far: undefined };\n const { width, height } = compatibility\n ? resolveMujocoCameraCaptureDimensions(options, cameraResolution, compatibility)\n : { width: options.width, height: options.height };\n const near = options.near ?? clip.near;\n const far = options.far ?? clip.far;\n const projectionMatrix = compatibility?.useIntrinsics\n ? mujocoCameraProjectionMatrix(model, cameraId, width, height, near, far)\n : undefined;\n\n return {\n ...baseOptions,\n width,\n height,\n ...pose,\n fov: options.fov ?? model.cam_fovy?.[cameraId],\n near,\n far,\n projectionMatrix: options.projectionMatrix ?? projectionMatrix,\n source: { kind: 'mujoco-camera', cameraName: options.cameraName },\n };\n }\n\n if (options.siteName) {\n const siteId = findSiteByName(model, options.siteName);\n if (siteId < 0) {\n throw new Error(`MuJoCo site \"${options.siteName}\" was not found.`);\n }\n\n const pose = applyMountedCameraPoseOffsets(\n options,\n vector3FromArray(data.site_xpos, siteId * 3),\n quaternionFromXmat(data.site_xmat, siteId * 9)\n );\n\n return {\n ...baseOptions,\n ...pose,\n source: { kind: 'mujoco-site', siteName: options.siteName },\n };\n }\n\n if (options.bodyName) {\n const bodyId = findBodyByName(model, options.bodyName);\n if (bodyId < 0) {\n throw new Error(`MuJoCo body \"${options.bodyName}\" was not found.`);\n }\n if (!data.xmat) {\n throw new Error(\n `MuJoCo body \"${options.bodyName}\" does not expose world orientation data.`\n );\n }\n\n const pose = applyMountedCameraPoseOffsets(\n options,\n vector3FromArray(data.xpos, bodyId * 3),\n quaternionFromXmat(data.xmat, bodyId * 9)\n );\n\n return {\n ...baseOptions,\n ...pose,\n source: { kind: 'mujoco-body', bodyName: options.bodyName },\n };\n }\n\n return options;\n },\n []\n );\n\n const getModelOption = useCallback((): ModelOptions => {\n const model = mjModelRef.current;\n if (!model?.opt) return { timestep: 0.002, gravity: [0, 0, -9.81], integrator: 0 };\n return {\n timestep: model.opt.timestep,\n gravity: [model.opt.gravity[0], model.opt.gravity[1], model.opt.gravity[2]],\n integrator: model.opt.integrator,\n };\n }, []);\n\n const setGravity = useCallback((g: [number, number, number]) => {\n const model = mjModelRef.current;\n if (!model?.opt?.gravity) return;\n model.opt.gravity[0] = g[0];\n model.opt.gravity[1] = g[1];\n model.opt.gravity[2] = g[2];\n }, []);\n\n const setTimestepApi = useCallback((dt: number) => {\n const model = mjModelRef.current;\n if (!model?.opt) return;\n model.opt.timestep = dt;\n }, []);\n\n const raycast = useCallback((origin: THREE.Vector3, direction: THREE.Vector3, maxDist = 100): RayHit | null => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return null;\n\n _rayPnt[0] = origin.x; _rayPnt[1] = origin.y; _rayPnt[2] = origin.z;\n const dir = direction.clone().normalize();\n _rayVec[0] = dir.x; _rayVec[1] = dir.y; _rayVec[2] = dir.z;\n _rayGeomId[0] = -1;\n\n try {\n const dist = mujoco.mj_ray(model, data, _rayPnt, _rayVec, null, 1, -1, _rayGeomId);\n if (dist < 0 || dist > maxDist) return null;\n const geomId = _rayGeomId[0];\n const bodyId = geomId >= 0 ? model.geom_bodyid[geomId] : -1;\n return {\n point: new THREE.Vector3(\n origin.x + dir.x * dist,\n origin.y + dir.y * dist,\n origin.z + dir.z * dist,\n ),\n bodyId,\n geomId,\n distance: dist,\n };\n } catch {\n return null;\n }\n }, [mujoco]);\n\n const applyKeyframe = useCallback((nameOrIndex: string | number) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n let keyId: number;\n if (typeof nameOrIndex === 'number') {\n keyId = nameOrIndex;\n } else {\n keyId = findKeyframeByName(model, nameOrIndex);\n }\n if (keyId < 0 || keyId >= model.nkey) {\n console.warn(`applyKeyframe: keyframe \"${nameOrIndex}\" not found`);\n return;\n }\n\n const nq = model.nq;\n const nu = model.nu;\n const qposOffset = keyId * nq;\n for (let i = 0; i < nq; i++) data.qpos[i] = model.key_qpos[qposOffset + i];\n const ctrlOffset = keyId * nu;\n for (let i = 0; i < nu; i++) data.ctrl[i] = model.key_ctrl[ctrlOffset + i];\n\n if (model.key_qvel) {\n const qvelOffset = keyId * model.nv;\n for (let i = 0; i < model.nv; i++) data.qvel[i] = model.key_qvel[qvelOffset + i];\n }\n\n mujocoRef.current.mj_forward(model, data);\n\n // Notify composable plugins\n for (const cb of resetCallbacks.current) {\n cb();\n }\n }, [mujoco]);\n\n const getKeyframeNames = useCallback((): string[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const names: string[] = [];\n for (let i = 0; i < model.nkey; i++) {\n names.push(getName(model, model.name_keyadr[i]));\n }\n return names;\n }, []);\n\n const getKeyframeCount = useCallback((): number => {\n return mjModelRef.current?.nkey ?? 0;\n }, []);\n\n const loadSceneApi = useCallback(async (newConfig: SceneConfig): Promise<void> => {\n const gen = ++loadGenRef.current;\n try {\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n setStatus('loading');\n\n const result = await loadScene(mujoco, buildMergedConfig(newConfig));\n\n if (gen !== loadGenRef.current) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n configRef.current = newConfig;\n\n setStatus('ready');\n } catch (e) {\n if (gen !== loadGenRef.current) return;\n errorRef.current = e instanceof Error ? e.message : String(e);\n setStatus('error');\n throw e;\n }\n }, [mujoco]);\n\n const requestBodyReload = useCallback(() => {\n if (bodyReloadTimerRef.current) clearTimeout(bodyReloadTimerRef.current);\n bodyReloadTimerRef.current = setTimeout(() => {\n bodyReloadTimerRef.current = null;\n loadSceneApi(configRef.current);\n }, 0);\n }, [loadSceneApi]);\n\n const loadFromFilesApi = useCallback(\n async (files: FileList | readonly LocalMujocoFile[], options?: LoadFromFilesOptions): Promise<void> => {\n await loadSceneApi(createSceneConfigFromFiles(files, options));\n },\n [loadSceneApi]\n );\n\n const addBodyApi = useCallback(async (body: SceneObject): Promise<void> => {\n const current = configRef.current;\n const sceneObjects = [\n ...(current.sceneObjects ?? []).filter((obj) => obj.name !== body.name),\n body,\n ];\n await loadSceneApi({ ...current, sceneObjects });\n }, [loadSceneApi]);\n\n const removeBodyApi = useCallback(async (name: string): Promise<void> => {\n const current = configRef.current;\n bodyRegistryRef.current.delete(name);\n const sceneObjects = (current.sceneObjects ?? []).filter((obj) => obj.name !== name);\n await loadSceneApi({ ...current, sceneObjects });\n }, [loadSceneApi]);\n\n const recompileApi = useCallback(async (patches: XmlPatch[] = []): Promise<void> => {\n const current = configRef.current;\n await loadSceneApi({\n ...current,\n xmlPatches: patches.length ? [...(current.xmlPatches ?? []), ...patches] : current.xmlPatches,\n });\n }, [loadSceneApi]);\n\n const getCanvasSnapshot = useCallback(\n (width?: number, height?: number, mimeType = 'image/jpeg'): string => {\n if (width && height) {\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = width;\n tempCanvas.height = height;\n const ctx = tempCanvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(gl.domElement, 0, 0, width, height);\n return tempCanvas.toDataURL(mimeType, mimeType === 'image/jpeg' ? 0.8 : undefined);\n }\n }\n return gl.domElement.toDataURL(mimeType, mimeType === 'image/jpeg' ? 0.8 : undefined);\n },\n [gl]\n );\n\n const getCanvas = useCallback((): HTMLCanvasElement | null => {\n return gl.domElement ?? null;\n }, [gl]);\n\n const captureFrameApi = useCallback(\n (options = {}) => {\n return captureCanvasFrame({ ...options, target: gl.domElement });\n },\n [gl]\n );\n\n const captureFrameBlobApi = useCallback(\n (options = {}) => {\n return captureCanvasFrameBlob({ ...options, target: gl.domElement });\n },\n [gl]\n );\n\n const captureCameraFrameApi = useCallback(\n (options = {}) => {\n return captureCameraFrame(\n gl,\n scene,\n camera,\n resolveCameraCaptureOptions(options)\n );\n },\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n const captureCameraFrameBlobApi = useCallback(\n (options = {}) => {\n return captureCameraFrameBlob(\n gl,\n scene,\n camera,\n resolveCameraCaptureOptions(options)\n );\n },\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n const createCameraFrameCaptureSessionApi = useCallback(\n (options: CameraFrameCaptureOptions = {}) =>\n createCameraFrameCaptureSession(\n gl,\n scene,\n camera,\n resolveCameraCaptureOptions(options)\n ),\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n const captureCameraFrameTensorApi = useCallback(\n (options: CameraFrameCaptureTensorOptions = {}) => {\n const resolved: CameraFrameCaptureTensorOptions = {\n ...resolveCameraCaptureOptions(options),\n channels: options.channels,\n layout: options.layout,\n range: options.range,\n };\n const session = createCameraFrameCaptureSession(gl, scene, camera, resolved);\n try {\n return session.captureTensor(resolved);\n } finally {\n session.dispose();\n }\n },\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n const recordCameraSequenceApi = useCallback(\n async (\n options: CameraFrameSequenceOptions\n ): Promise<CameraFrameSequenceResult> => {\n const frameCount = Math.max(0, Math.floor(options.frames));\n const stepsPerFrame = Math.max(0, Math.floor(options.stepsPerFrame ?? 1));\n const cameras = options.cameras;\n const frames: CameraFrameSequenceFrame[] = [];\n const cameraSummaries: CameraFrameSequenceResult['cameraSummaries'] = {};\n const wasPaused = pausedRef.current;\n const retainFrames = options.retainFrames ?? true;\n const requireMountedSources = options.requireMountedSources ?? true;\n let recordedFrameCount = 0;\n\n async function stepCameraSequence(frameIndex: number, steps: number) {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) {\n throw new Error('MuJoCo scene is not ready for camera sequence stepping.');\n }\n\n for (let stepIndex = 0; stepIndex < steps; stepIndex += 1) {\n for (let i = 0; i < model.nv; i += 1) {\n data.qfrc_applied[i] = 0;\n }\n await options.onBeforeStep?.({\n frameIndex,\n stepIndex,\n time: data.time,\n model,\n data,\n });\n for (const cb of beforeStepCallbacks.current) {\n cb({ model, data });\n }\n mujocoRef.current.mj_step(model, data);\n for (const cb of afterStepCallbacks.current) {\n cb({ model, data });\n }\n onStepRef.current?.({ time: data.time, model, data });\n await options.onAfterStep?.({\n frameIndex,\n stepIndex,\n time: data.time,\n model,\n data,\n });\n }\n\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n }\n\n if (frameCount === 0 || cameras.length === 0) {\n return {\n frames,\n cameraKeys: cameras.map((sequenceCamera) => sequenceCamera.key),\n cameraSummaries,\n frameCount: 0,\n };\n }\n\n throwIfCameraSequenceAborted(options.signal);\n\n for (let attempt = 0; attempt < 30; attempt += 1) {\n if (mjModelRef.current && mjDataRef.current) break;\n await waitForNextAnimationFrame();\n throwIfCameraSequenceAborted(options.signal);\n }\n if (!mjModelRef.current || !mjDataRef.current) {\n throw new Error('MuJoCo scene is not ready for camera sequence recording.');\n }\n\n const captureSessions = cameras.map((sequenceCamera) => {\n const { key, ...captureOptions } = sequenceCamera;\n const initialCaptureOptions = resolveCameraCaptureOptions(captureOptions);\n const mountedSource = initialCaptureOptions.source;\n if (requireMountedSources) {\n assertMatchingMountedCameraSource(\n key,\n captureOptions,\n mountedSource ?? { kind: 'fallback-camera' }\n );\n }\n return {\n key,\n captureOptions,\n mountedSource,\n session: createCameraFrameCaptureSession(\n gl,\n scene,\n camera,\n initialCaptureOptions\n ),\n };\n });\n\n try {\n pausedRef.current = true;\n stepsToRunRef.current = 0;\n if (options.reset) reset();\n\n for (let frameIndex = 0; frameIndex < frameCount; frameIndex += 1) {\n throwIfCameraSequenceAborted(options.signal);\n if (\n stepsPerFrame > 0 &&\n (frameIndex > 0 || options.captureInitialFrame === false)\n ) {\n await stepCameraSequence(frameIndex, stepsPerFrame);\n }\n await waitForNextAnimationFrame();\n throwIfCameraSequenceAborted(options.signal);\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) {\n throw new Error('MuJoCo scene is not ready for camera sequence sampling.');\n }\n await options.onSample?.({\n frameIndex,\n time: data.time,\n model,\n data,\n });\n\n const cameraFrames: Record<string, CameraFrameCaptureResult> = {};\n for (const { key, captureOptions, mountedSource, session } of captureSessions) {\n const resolvedCaptureOptions = resolveCameraCaptureOptions(captureOptions);\n const cameraFrame = await session.captureDataUrlAsync({\n ...resolvedCaptureOptions,\n source: mountedSource ?? resolvedCaptureOptions.source,\n });\n if (requireMountedSources) {\n assertMatchingMountedCameraSource(\n key,\n captureOptions,\n cameraFrame.source\n );\n }\n cameraSummaries[key] = {\n key,\n width: cameraFrame.width,\n height: cameraFrame.height,\n source: cameraFrame.source,\n frameCount: (cameraSummaries[key]?.frameCount ?? 0) + 1,\n firstFrameIndex:\n cameraSummaries[key]?.firstFrameIndex ?? frameIndex,\n lastFrameIndex: frameIndex,\n firstTimestamp:\n cameraSummaries[key]?.firstTimestamp ?? data.time,\n lastTimestamp: data.time,\n };\n cameraFrames[key] = cameraFrame;\n }\n\n const frame = {\n frameIndex,\n time: data.time,\n cameras: cameraFrames,\n };\n if (retainFrames) {\n frames.push(frame);\n }\n recordedFrameCount += 1;\n await options.onFrame?.(frame);\n }\n } finally {\n for (const { session } of captureSessions) {\n session.dispose();\n }\n pausedRef.current = wasPaused;\n }\n\n return {\n frames,\n cameraKeys: cameras.map((sequenceCamera) => sequenceCamera.key),\n cameraSummaries,\n frameCount: recordedFrameCount,\n };\n },\n [camera, getTime, gl, mujoco, reset, resolveCameraCaptureOptions, scene]\n );\n\n const project2DTo3D = useCallback(\n (x: number, y: number, cameraPos: THREE.Vector3, lookAt: THREE.Vector3): { point: THREE.Vector3; bodyId: number; geomId: number } | null => {\n const virtCam = (camera as THREE.PerspectiveCamera).clone();\n virtCam.position.copy(cameraPos);\n virtCam.lookAt(lookAt);\n virtCam.updateMatrixWorld();\n virtCam.updateProjectionMatrix();\n _projNdc.set(x * 2 - 1, -(y * 2 - 1));\n _projRaycaster.setFromCamera(_projNdc, virtCam);\n const objects: THREE.Object3D[] = [];\n const scene = (camera as THREE.PerspectiveCamera).parent;\n if (scene) {\n scene.traverse((c) => {\n if ((c as THREE.Mesh).isMesh) objects.push(c);\n });\n }\n const hits = _projRaycaster.intersectObjects(objects);\n if (hits.length > 0) {\n const hitObj = hits[0].object;\n const geomId = hitObj.userData.geomID !== undefined ? hitObj.userData.geomID : -1;\n let obj = hitObj;\n while (obj && obj.userData.bodyID === undefined && obj.parent) {\n obj = obj.parent;\n }\n const bodyId = obj && obj.userData.bodyID !== undefined ? obj.userData.bodyID : -1;\n return { point: hits[0].point, bodyId, geomId };\n }\n return null;\n },\n [camera, gl]\n );\n\n const projectImagePointTo3D = useCallback(\n (options: ImagePointProjectionOptions): ImagePointProjectionResult | null => {\n const {\n x,\n y,\n coordinateSpace,\n imageWidth,\n imageHeight,\n maxDistance,\n ...captureOptions\n } = options;\n const resolvedCaptureOptions = resolveCameraCaptureOptions(captureOptions);\n return projectImagePointTo3DFromScene(gl, scene, camera, {\n ...resolvedCaptureOptions,\n x,\n y,\n coordinateSpace,\n imageWidth,\n imageHeight,\n maxDistance,\n });\n },\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n // --- Domain randomization ---\n\n const setBodyMass = useCallback((name: string, mass: number): void => {\n const model = mjModelRef.current;\n if (!model) return;\n const id = findBodyByName(model, name);\n if (id < 0) return;\n model.body_mass[id] = mass;\n }, []);\n\n const setGeomFriction = useCallback((name: string, friction: [number, number, number]): void => {\n const model = mjModelRef.current;\n if (!model) return;\n const id = findGeomByName(model, name);\n if (id < 0) return;\n model.geom_friction[id * 3] = friction[0];\n model.geom_friction[id * 3 + 1] = friction[1];\n model.geom_friction[id * 3 + 2] = friction[2];\n }, []);\n\n const setGeomSize = useCallback((name: string, size: [number, number, number]): void => {\n const model = mjModelRef.current;\n if (!model) return;\n const id = findGeomByName(model, name);\n if (id < 0) return;\n model.geom_size[id * 3] = size[0];\n model.geom_size[id * 3 + 1] = size[1];\n model.geom_size[id * 3 + 2] = size[2];\n }, []);\n\n // --- Assemble API ---\n const api = useMemo<MujocoSimAPI>(\n () => ({\n get status() { return status; },\n get config() { return configRef.current; },\n reset,\n setSpeed,\n togglePause,\n setPaused,\n step,\n getTime,\n getTimestep,\n applyKeyframe,\n saveState,\n restoreState,\n setQpos,\n setQvel,\n getQpos,\n getQvel,\n setCtrl,\n getCtrl,\n getControlMap: getControlMapApi,\n getActuatedJoints: getActuatedJointsApi,\n resolveControlGroup: resolveControlGroupApi,\n applyForce,\n applyTorque: applyTorqueApi,\n setExternalForce,\n applyGeneralizedForce,\n getSensorData,\n getContacts,\n getBodies,\n getJoints,\n getGeoms,\n getSites,\n getActuators: getActuatorsApi,\n getSensors,\n getCameras,\n getModelOption,\n setGravity,\n setTimestep: setTimestepApi,\n raycast,\n getKeyframeNames,\n getKeyframeCount,\n loadScene: loadSceneApi,\n loadFromFiles: loadFromFilesApi,\n addBody: addBodyApi,\n removeBody: removeBodyApi,\n recompile: recompileApi,\n getCanvas,\n getCanvasSnapshot,\n captureFrame: captureFrameApi,\n captureFrameBlob: captureFrameBlobApi,\n captureCameraFrame: captureCameraFrameApi,\n captureCameraFrameBlob: captureCameraFrameBlobApi,\n captureCameraFrameTensor: captureCameraFrameTensorApi,\n createCameraFrameCaptureSession: createCameraFrameCaptureSessionApi,\n resolveCameraCaptureOptions,\n recordCameraSequence: recordCameraSequenceApi,\n project2DTo3D,\n projectImagePointTo3D,\n setBodyMass,\n setGeomFriction,\n setGeomSize,\n mjModelRef,\n mjDataRef,\n }),\n [\n status, reset, setSpeed, togglePause, setPaused, step,\n getTime, getTimestep, applyKeyframe, saveState, restoreState,\n setQpos, setQvel, getQpos, getQvel, setCtrl, getCtrl,\n getControlMapApi, getActuatedJointsApi, resolveControlGroupApi,\n applyForce, applyTorqueApi, setExternalForce, applyGeneralizedForce,\n getSensorData, getContacts, getBodies, getJoints, getGeoms, getSites,\n getActuatorsApi, getSensors, getCameras, getModelOption, setGravity, setTimestepApi,\n raycast, getKeyframeNames, getKeyframeCount, loadSceneApi,\n loadFromFilesApi, addBodyApi, removeBodyApi, recompileApi,\n getCanvas, getCanvasSnapshot, captureFrameApi, captureFrameBlobApi,\n captureCameraFrameApi, captureCameraFrameBlobApi,\n captureCameraFrameTensorApi, createCameraFrameCaptureSessionApi,\n resolveCameraCaptureOptions,\n recordCameraSequenceApi,\n project2DTo3D,\n projectImagePointTo3D,\n setBodyMass, setGeomFriction, setGeomSize,\n ]\n );\n const apiRef = useRef(api);\n apiRef.current = api;\n\n const contextValue = useMemo<MujocoSimContextValue>(\n () => ({\n api,\n mjModelRef,\n mjDataRef,\n mujocoRef,\n configRef,\n pausedRef,\n speedRef,\n substepsRef,\n interpolateRef,\n interpolationStateRef,\n onSelectionRef,\n beforeStepCallbacks,\n afterStepCallbacks,\n resetCallbacks,\n errorRef,\n bodyRegistryRef,\n hiddenBodiesRef,\n requestBodyReload,\n status,\n }),\n [api, status, requestBodyReload]\n );\n\n return (\n <MujocoSimContext.Provider value={contextValue}>\n <SceneRenderer renderOptions={renderOptions} />\n <CameraViewportProvider>{children}</CameraViewportProvider>\n </MujocoSimContext.Provider>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Canvas } from '@react-three/fiber';\nimport { forwardRef, useEffect, useRef } from 'react';\nimport { useMujocoWasm } from './MujocoProvider';\nimport { MujocoSimProvider } from './MujocoSimProvider';\nimport { MujocoCanvasProps, MujocoSimAPI } from '../types';\n\n/**\n * MujocoCanvas — thin R3F Canvas wrapper for MuJoCo scenes.\n * Accepts all R3F Canvas props and forwards them through.\n * Supports declarative physics config props (spec 1.1).\n *\n * Forward ref exposes MujocoSimAPI (not the canvas element).\n */\nexport const MujocoCanvas = forwardRef<MujocoSimAPI, MujocoCanvasProps>(\n function MujocoCanvas(\n {\n config,\n onReady,\n onError,\n onStep,\n onSelection,\n // Declarative physics config\n gravity,\n timestep,\n substeps,\n paused,\n speed,\n interpolate,\n renderOptions,\n loadingFallback,\n children,\n ...canvasProps\n },\n ref\n ) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujocoWasm();\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (wasmStatus === 'error') {\n onErrorRef.current?.(new Error(wasmError ?? 'WASM load failed'));\n }\n }, [wasmStatus, wasmError]);\n\n if (wasmStatus === 'loading' || !mujoco) {\n return loadingFallback ? (\n <Canvas {...canvasProps}>{loadingFallback}</Canvas>\n ) : null;\n }\n\n if (wasmStatus === 'error') {\n return null;\n }\n\n return (\n <Canvas {...canvasProps}>\n <MujocoSimProvider\n mujoco={mujoco}\n config={config}\n apiRef={ref}\n onReady={onReady}\n onError={onError}\n onStep={onStep}\n onSelection={onSelection}\n gravity={gravity}\n timestep={timestep}\n substeps={substeps}\n paused={paused}\n speed={speed}\n interpolate={interpolate}\n renderOptions={renderOptions}\n >\n {children}\n </MujocoSimProvider>\n </Canvas>\n );\n }\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { forwardRef, useEffect, useRef } from 'react';\nimport { useMujocoWasm } from './MujocoProvider';\nimport { MujocoSimProvider } from './MujocoSimProvider';\nimport type {\n MujocoSimAPI,\n ReadyCallbackInput,\n SceneConfig,\n SelectionCallbackInput,\n StepCallbackInput,\n} from '../types';\n\nexport interface MujocoPhysicsProps {\n /** Scene/robot configuration. */\n config: SceneConfig;\n /** Fires when model is loaded and API is ready. */\n onReady?: (input: ReadyCallbackInput) => void;\n /** Fires on scene load failure. */\n onError?: (error: Error) => void;\n /** Called each physics step. */\n onStep?: (input: StepCallbackInput) => void;\n /** Called on body double-click selection. */\n onSelection?: (input: SelectionCallbackInput) => void;\n /** Override model gravity. */\n gravity?: [number, number, number];\n /** Override model.opt.timestep. */\n timestep?: number;\n /** mj_step calls per frame. */\n substeps?: number;\n /** Declarative pause. */\n paused?: boolean;\n /** Simulation speed multiplier. */\n speed?: number;\n /** Interpolate rendered body poses between fixed physics steps. */\n interpolate?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * MujocoPhysics — physics provider for use inside a user-owned R3F Canvas.\n *\n * This is the R3F-idiomatic alternative to MujocoCanvas. Instead of wrapping\n * the Canvas, place this inside your own <Canvas>:\n *\n * ```tsx\n * <MujocoProvider>\n * <Canvas shadows camera={...}>\n * <MujocoPhysics config={config} paused={paused}>\n * <SceneRenderer />\n * <OrbitControls />\n * </MujocoPhysics>\n * </Canvas>\n * </MujocoProvider>\n * ```\n *\n * Forward ref exposes MujocoSimAPI.\n */\nexport const MujocoPhysics = forwardRef<MujocoSimAPI, MujocoPhysicsProps>(\n function MujocoPhysics({ onError, children, ...props }, ref) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujocoWasm();\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (wasmStatus === 'error') {\n onErrorRef.current?.(new Error(wasmError ?? 'WASM load failed'));\n }\n }, [wasmStatus, wasmError]);\n\n if (wasmStatus === 'error' || wasmStatus === 'loading' || !mujoco) {\n return null;\n }\n\n return (\n <MujocoSimProvider\n mujoco={mujoco}\n apiRef={ref}\n onError={onError}\n {...props}\n >\n {children}\n </MujocoSimProvider>\n );\n }\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n Bodies,\n MujocoData,\n MujocoModel,\n ObservationConfig,\n ObservationLayoutItem,\n ObservationResult,\n} from '../types';\nimport { findBodyByName, findSensorByName, findSiteByName } from './SceneLoader';\n\nfunction append(\n values: number[],\n layout: ObservationLayoutItem[],\n name: string,\n chunk: ArrayLike<number>\n) {\n const start = values.length;\n for (let i = 0; i < chunk.length; i++) values.push(chunk[i] ?? 0);\n layout.push({ name, start, size: chunk.length });\n}\n\nfunction appendScalar(\n values: number[],\n layout: ObservationLayoutItem[],\n name: string,\n value: number\n) {\n const start = values.length;\n values.push(value);\n layout.push({ name, start, size: 1 });\n}\n\nfunction namedBodyList(names: Bodies | readonly Bodies[] | undefined): readonly Bodies[] {\n if (!names) return [];\n return typeof names === 'string' ? [names] : names;\n}\n\nfunction normalizedGravity(model: MujocoModel): [number, number, number] {\n const gx = model.opt.gravity[0] ?? 0;\n const gy = model.opt.gravity[1] ?? 0;\n const gz = model.opt.gravity[2] ?? -9.81;\n const length = Math.hypot(gx, gy, gz);\n if (length === 0) return [0, 0, 0];\n return [gx / length, gy / length, gz / length];\n}\n\nfunction rotateWorldVectorToBody(data: MujocoData, bodyId: number, world: readonly [number, number, number]): [number, number, number] {\n const adr = bodyId * 4;\n const w = data.xquat[adr] ?? 1;\n const x = -(data.xquat[adr + 1] ?? 0);\n const y = -(data.xquat[adr + 2] ?? 0);\n const z = -(data.xquat[adr + 3] ?? 0);\n const vx = world[0];\n const vy = world[1];\n const vz = world[2];\n\n const tx = 2 * (y * vz - z * vy);\n const ty = 2 * (z * vx - x * vz);\n const tz = 2 * (x * vy - y * vx);\n\n return [\n vx + w * tx + y * tz - z * ty,\n vy + w * ty + z * tx - x * tz,\n vz + w * tz + x * ty - y * tx,\n ];\n}\n\n/**\n * Build a flat observation vector plus a layout map from live MuJoCo state.\n *\n * Missing named resources are skipped. The returned layout is the source of\n * truth for the vector produced from the current model.\n */\nexport function buildObservation(\n model: MujocoModel,\n data: MujocoData,\n config: ObservationConfig\n): ObservationResult {\n const values: number[] = [];\n const layout: ObservationLayoutItem[] = [];\n\n if (config.time) appendScalar(values, layout, 'time', data.time);\n if (config.qpos) append(values, layout, 'qpos', data.qpos);\n if (config.qvel) append(values, layout, 'qvel', data.qvel);\n if (config.ctrl) append(values, layout, 'ctrl', data.ctrl);\n if (config.act) append(values, layout, 'act', data.act);\n if (config.sensordata) append(values, layout, 'sensordata', data.sensordata);\n\n for (const name of config.sensors ?? []) {\n const sensorId = findSensorByName(model, name);\n if (sensorId < 0) continue;\n const start = model.sensor_adr[sensorId] ?? 0;\n const dim = model.sensor_dim[sensorId] ?? 0;\n append(values, layout, `sensor:${name}`, data.sensordata.subarray(start, start + dim));\n }\n\n for (const name of config.sites ?? []) {\n const siteId = findSiteByName(model, name);\n if (siteId < 0) continue;\n const start = siteId * 3;\n append(values, layout, `site:${name}:xpos`, data.site_xpos.subarray(start, start + 3));\n }\n\n const gravity = normalizedGravity(model);\n for (const name of namedBodyList(config.projectedGravity)) {\n const bodyId = findBodyByName(model, name);\n if (bodyId < 0) continue;\n append(values, layout, `projectedGravity:${name}`, rotateWorldVectorToBody(data, bodyId, gravity));\n }\n\n return {\n values: config.output === 'float64' ? new Float64Array(values) : new Float32Array(values),\n layout,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo, useRef } from 'react';\n\n/** Shallow-compare two plain objects by own enumerable keys. */\nfunction shallowEqual(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n}\n\nexport interface ControllerOptions<TConfig> {\n /** Unique name for this controller (used as displayName). */\n name: string;\n /** Default values merged under user-supplied config. */\n defaultConfig?: Partial<TConfig>;\n}\n\nexport type ControllerComponent<TConfig> = React.FC<{\n config?: Partial<TConfig>;\n children?: React.ReactNode;\n}> & {\n controllerName: string;\n defaultConfig: Partial<TConfig>;\n};\n\n/**\n * Factory that produces a typed controller component.\n *\n * Controllers are React components that plug into the MuJoCo simulation tree.\n * Inside `Impl`, use any hooks (`useMujoco`, `useBeforePhysicsStep`, etc.)\n * to interact with the physics engine.\n *\n * @example\n * ```tsx\n * const MyController = createController<{ speed: number }>(\n * { name: 'my-controller', defaultConfig: { speed: 1.0 } },\n * function MyControllerImpl({ config }) {\n * const wheel = useCtrl(ModelActuators.mobile.leftWheel);\n *\n * useBeforePhysicsStep(({ data }) => {\n * wheel.write(config.speed);\n * });\n * return null;\n * },\n * );\n *\n * // Usage:\n * <MyController config={{ speed: 2.0 }} />\n * ```\n */\nexport function createController<TConfig>(\n options: ControllerOptions<TConfig>,\n Impl: React.FC<{ config: TConfig; children?: React.ReactNode }>,\n): ControllerComponent<TConfig> {\n function Controller({\n config,\n children,\n }: {\n config?: Partial<TConfig>;\n children?: React.ReactNode;\n }) {\n // Stabilise config reference: inline objects get a new identity each render,\n // but the actual values rarely change. Shallow-compare to keep the same ref.\n const configObj = (config ?? {}) as Record<string, unknown>;\n const stableRef = useRef(configObj);\n if (!shallowEqual(stableRef.current, configObj)) {\n stableRef.current = configObj;\n }\n const stableConfig = stableRef.current as Partial<TConfig>;\n\n const mergedConfig = useMemo(\n () => ({ ...options.defaultConfig, ...stableConfig }) as TConfig,\n [stableConfig],\n );\n return <Impl config={mergedConfig}>{children}</Impl>;\n }\n\n Controller.displayName = options.name;\n Controller.controllerName = options.name;\n Controller.defaultConfig = options.defaultConfig ?? ({} as Partial<TConfig>);\n\n return Controller as ControllerComponent<TConfig>;\n}\n\n/**\n * Factory that produces a typed controller hook.\n *\n * Same config stabilization and default merging as `createController`,\n * but returns a hook instead of a component. Pass `null` to disable.\n *\n * @example\n * ```tsx\n * const useMyController = createControllerHook<MyConfig, MyValue>(\n * { name: 'useMyController', defaultConfig: { gain: 1.0 } },\n * function useMyControllerImpl(config) {\n * // config is MyConfig | null — hooks must be called unconditionally\n * const joint = useCtrl(config?.actuator ?? ModelActuators.franka.actuator1);\n *\n * useBeforePhysicsStep(({ data }) => {\n * if (!config) return;\n * joint.write(config.gain * Math.sin(data.time));\n * });\n * if (!config) return null;\n * return { /* value *\\/ };\n * },\n * );\n *\n * // Usage:\n * const value = useMyController({ gain: 2.0 });\n * const disabled = useMyController(null); // returns null\n * ```\n */\nexport function createControllerHook<TConfig, TValue>(\n options: ControllerOptions<TConfig>,\n useImpl: (config: TConfig | null) => TValue | null,\n): (config: TConfig | null) => TValue | null {\n const useController = (config: TConfig | null): TValue | null => {\n const configObj = config as Record<string, unknown> | null;\n const stableRef = useRef(configObj);\n if (configObj && stableRef.current) {\n if (!shallowEqual(stableRef.current, configObj)) {\n stableRef.current = configObj;\n }\n } else {\n stableRef.current = configObj;\n }\n\n const mergedConfig = useMemo(\n () => stableRef.current\n ? ({ ...options.defaultConfig, ...stableRef.current } as TConfig)\n : null,\n [stableRef.current],\n );\n\n return useImpl(mergedConfig);\n };\n\n return useController;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as THREE from 'three';\nimport { MujocoModule, MujocoModel, MujocoData } from '../types';\n\nexport interface GenericIKOptions {\n maxIterations: number;\n damping: number;\n tolerance: number;\n epsilon: number;\n posWeight: number;\n rotWeight: number;\n jointLimits?: ReadonlyArray<readonly [number, number] | null | undefined>;\n}\n\ntype ResolvedGenericIKOptions = Required<Omit<GenericIKOptions, 'jointLimits'>> &\n Pick<GenericIKOptions, 'jointLimits'>;\n\nconst DEFAULTS: Required<Omit<GenericIKOptions, 'jointLimits'>> = {\n maxIterations: 50,\n damping: 0.01,\n tolerance: 1e-3,\n epsilon: 1e-6,\n posWeight: 1.0,\n rotWeight: 0.3,\n};\n\nfunction resolveOptions(opts?: Partial<GenericIKOptions>): ResolvedGenericIKOptions {\n return {\n maxIterations: opts?.maxIterations ?? DEFAULTS.maxIterations,\n damping: opts?.damping ?? DEFAULTS.damping,\n tolerance: opts?.tolerance ?? DEFAULTS.tolerance,\n epsilon: opts?.epsilon ?? DEFAULTS.epsilon,\n posWeight: opts?.posWeight ?? DEFAULTS.posWeight,\n rotWeight: opts?.rotWeight ?? DEFAULTS.rotWeight,\n jointLimits: opts?.jointLimits,\n };\n}\n\nfunction clampJoint(value: number, limit: readonly [number, number] | null | undefined) {\n if (!limit) return value;\n const [min, max] = limit;\n if (!Number.isFinite(min) || !Number.isFinite(max) || min >= max) return value;\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Generic Damped Least-Squares IK solver.\n * Uses finite-difference Jacobian via MuJoCo's mj_forward.\n * Works for any MuJoCo model — no robot-specific parameters.\n */\nexport class GenericIK {\n private mujoco: MujocoModule;\n\n constructor(mujoco: MujocoModule) {\n this.mujoco = mujoco;\n }\n\n /**\n * Solve IK for a target 6-DOF pose.\n * @param model MuJoCo model\n * @param data MuJoCo data (qpos will be temporarily modified, then restored)\n * @param siteId Index of the end-effector site to control\n * @param qposAdr qpos addresses for scalar joints in solve order\n * @param targetPos Target position in world frame\n * @param targetQuat Target orientation in world frame\n * @param currentQ Current joint angles matching qposAdr order\n * @param opts Optional solver parameters\n * @returns Joint angles array, or null if solver diverged\n */\n solve(\n model: MujocoModel,\n data: MujocoData,\n siteId: number,\n qposAdr: ArrayLike<number>,\n targetPos: THREE.Vector3,\n targetQuat: THREE.Quaternion,\n currentQ: ArrayLike<number>,\n opts?: Partial<GenericIKOptions>\n ): number[] | null {\n const o = resolveOptions(opts);\n const n = qposAdr.length;\n\n // Save full qpos so we can restore after solving\n const savedQpos = new Float64Array(data.qpos.length);\n savedQpos.set(data.qpos);\n\n // Build target rotation matrix (3x3 row-major)\n const R_target = quatToMat3(targetQuat);\n\n // Working joint angles — start from current configuration\n const q = new Float64Array(n);\n for (let i = 0; i < n; i++) q[i] = clampJoint(currentQ[i], o.jointLimits?.[i]);\n\n // Pre-allocate work arrays\n const J = new Float64Array(6 * n); // 6×n Jacobian (row-major)\n const JJt = new Float64Array(36); // 6×6\n const rhs = new Float64Array(6); // right-hand side\n const x = new Float64Array(6); // solve result\n const dq = new Float64Array(n); // joint update\n const baseSitePos = new Float64Array(3);\n const baseSiteMat = new Float64Array(9);\n const pertSitePos = new Float64Array(3);\n const pertSiteMat = new Float64Array(9);\n\n let bestQ: number[] | null = null;\n let bestErr = Infinity;\n\n if (n === 0) return null;\n\n for (let iter = 0; iter < o.maxIterations; iter++) {\n // Set joints and run FK\n for (let i = 0; i < n; i++) data.qpos[qposAdr[i]] = q[i];\n this.mujoco.mj_forward(model, data);\n\n // Read current site pose\n const sp = data.site_xpos;\n const sm = data.site_xmat;\n const off3 = siteId * 3;\n const off9 = siteId * 9;\n for (let i = 0; i < 3; i++) baseSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) baseSiteMat[i] = sm[off9 + i];\n\n // Compute 6D error\n const posErr0 = targetPos.x - baseSitePos[0];\n const posErr1 = targetPos.y - baseSitePos[1];\n const posErr2 = targetPos.z - baseSitePos[2];\n const rotErr = orientationError(baseSiteMat, R_target);\n\n const error = [\n posErr0 * o.posWeight,\n posErr1 * o.posWeight,\n posErr2 * o.posWeight,\n rotErr[0] * o.rotWeight,\n rotErr[1] * o.rotWeight,\n rotErr[2] * o.rotWeight,\n ];\n\n const errNorm = Math.sqrt(\n error[0] * error[0] + error[1] * error[1] + error[2] * error[2] +\n error[3] * error[3] + error[4] * error[4] + error[5] * error[5]\n );\n\n // Track best solution\n if (errNorm < bestErr) {\n bestErr = errNorm;\n bestQ = Array.from(q);\n }\n\n // Converged\n if (errNorm < o.tolerance) break;\n\n // Compute Jacobian via finite differences\n for (let j = 0; j < n; j++) {\n const adr = qposAdr[j];\n const saved = data.qpos[adr];\n data.qpos[adr] = q[j] + o.epsilon;\n this.mujoco.mj_forward(model, data);\n\n for (let i = 0; i < 3; i++) pertSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) pertSiteMat[i] = sm[off9 + i];\n\n // Position Jacobian columns (rows 0-2)\n J[0 * n + j] = ((pertSitePos[0] - baseSitePos[0]) / o.epsilon) * o.posWeight;\n J[1 * n + j] = ((pertSitePos[1] - baseSitePos[1]) / o.epsilon) * o.posWeight;\n J[2 * n + j] = ((pertSitePos[2] - baseSitePos[2]) / o.epsilon) * o.posWeight;\n\n // Orientation Jacobian columns (rows 3-5)\n // δR = R_perturbed * R_base^T, then extract angular velocity\n const dRot = angularDelta(baseSiteMat, pertSiteMat);\n J[3 * n + j] = (dRot[0] / o.epsilon) * o.rotWeight;\n J[4 * n + j] = (dRot[1] / o.epsilon) * o.rotWeight;\n J[5 * n + j] = (dRot[2] / o.epsilon) * o.rotWeight;\n\n // Restore joint\n data.qpos[adr] = saved;\n }\n\n // Restore base FK state for next iteration\n for (let i = 0; i < n; i++) data.qpos[qposAdr[i]] = q[i];\n\n // Damped least squares: Δq = Jᵀ (J Jᵀ + λI)⁻¹ error\n // 1. Compute JJᵀ (6×6)\n for (let r = 0; r < 6; r++) {\n for (let c = 0; c < 6; c++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += J[r * n + k] * J[c * n + k];\n }\n JJt[r * 6 + c] = sum + (r === c ? o.damping : 0);\n }\n }\n\n // 2. Solve (JJᵀ + λI) x = error\n for (let i = 0; i < 6; i++) rhs[i] = error[i];\n solve6x6(JJt, rhs, x);\n\n // 3. Δq = Jᵀ x\n for (let j = 0; j < n; j++) {\n let sum = 0;\n for (let r = 0; r < 6; r++) {\n sum += J[r * n + j] * x[r];\n }\n dq[j] = sum;\n }\n\n // Update joints\n for (let i = 0; i < n; i++) q[i] = clampJoint(q[i] + dq[i], o.jointLimits?.[i]);\n }\n\n // Restore original qpos\n data.qpos.set(savedQpos);\n this.mujoco.mj_forward(model, data);\n\n return bestQ;\n }\n}\n\n// --- Math utilities ---\n\n/** Convert THREE.Quaternion to 3x3 rotation matrix (row-major Float64Array) */\nfunction quatToMat3(q: THREE.Quaternion): Float64Array {\n const m = new Float64Array(9);\n const x = q.x, y = q.y, z = q.z, w = q.w;\n const xx = x * x, yy = y * y, zz = z * z;\n const xy = x * y, xz = x * z, yz = y * z;\n const wx = w * x, wy = w * y, wz = w * z;\n m[0] = 1 - 2 * (yy + zz); m[1] = 2 * (xy - wz); m[2] = 2 * (xz + wy);\n m[3] = 2 * (xy + wz); m[4] = 1 - 2 * (xx + zz); m[5] = 2 * (yz - wx);\n m[6] = 2 * (xz - wy); m[7] = 2 * (yz + wx); m[8] = 1 - 2 * (xx + yy);\n return m;\n}\n\n/**\n * Compute orientation error between current and target rotation matrices.\n * Returns the axis-angle vector (log map of R_target * R_current^T).\n * Uses the small-angle approximation: error ≈ 0.5 * [R32-R23, R13-R31, R21-R12]\n * where R = R_target * R_current^T.\n */\nfunction orientationError(R_cur: Float64Array, R_tgt: Float64Array): [number, number, number] {\n // R_err = R_tgt * R_cur^T (both row-major 3x3)\n // R_err[i][j] = sum_k R_tgt[i][k] * R_cur[j][k] (note: transposing R_cur)\n const Re = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_tgt[i * 3 + k] * R_cur[j * 3 + k];\n }\n Re[i * 3 + j] = s;\n }\n }\n\n // Extract axis-angle from rotation matrix\n // For better accuracy than small-angle approx, use full log map\n const trace = Re[0] + Re[4] + Re[8];\n const cosAngle = Math.max(-1, Math.min(1, (trace - 1) * 0.5));\n const angle = Math.acos(cosAngle);\n\n // Near zero rotation — use small-angle approximation\n if (angle < 1e-6) {\n return [0, 0, 0];\n }\n\n // Near π — degenerate, use small-angle approx of the skew-symmetric part\n if (angle > Math.PI - 1e-6) {\n return [\n 0.5 * (Re[7] - Re[5]),\n 0.5 * (Re[2] - Re[6]),\n 0.5 * (Re[3] - Re[1]),\n ];\n }\n\n // General case: axis = skew(R_err) / (2 sin(angle)), scaled by angle\n const s = angle / (2 * Math.sin(angle));\n return [\n s * (Re[7] - Re[5]),\n s * (Re[2] - Re[6]),\n s * (Re[3] - Re[1]),\n ];\n}\n\n/**\n * Compute angular velocity vector from R_base to R_perturbed.\n * Returns the axis-angle of R_perturbed * R_base^T.\n * (Small angle: the rotation caused by the perturbation.)\n */\nfunction angularDelta(R_base: Float64Array, R_pert: Float64Array): [number, number, number] {\n // δR = R_pert * R_base^T\n // Small angle approx: ω ≈ 0.5 * [δR[7]-δR[5], δR[2]-δR[6], δR[3]-δR[1]]\n // This is fine because the perturbation epsilon is tiny.\n const dR = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_pert[i * 3 + k] * R_base[j * 3 + k];\n }\n dR[i * 3 + j] = s;\n }\n }\n return [\n 0.5 * (dR[7] - dR[5]),\n 0.5 * (dR[2] - dR[6]),\n 0.5 * (dR[3] - dR[1]),\n ];\n}\n\n/**\n * Solve 6×6 linear system Ax = b via Gaussian elimination with partial pivoting.\n * Modifies A and b in place. Result written to x.\n */\nfunction solve6x6(A: Float64Array, b: Float64Array, x: Float64Array): void {\n const N = 6;\n // Work on copies to avoid destroying originals needed elsewhere\n const a = new Float64Array(A);\n const r = new Float64Array(b);\n\n // Forward elimination with partial pivoting\n for (let col = 0; col < N; col++) {\n // Find pivot\n let maxVal = Math.abs(a[col * N + col]);\n let maxRow = col;\n for (let row = col + 1; row < N; row++) {\n const val = Math.abs(a[row * N + col]);\n if (val > maxVal) { maxVal = val; maxRow = row; }\n }\n\n // Swap rows\n if (maxRow !== col) {\n for (let k = 0; k < N; k++) {\n const tmp = a[col * N + k]; a[col * N + k] = a[maxRow * N + k]; a[maxRow * N + k] = tmp;\n }\n const tmp = r[col]; r[col] = r[maxRow]; r[maxRow] = tmp;\n }\n\n const pivot = a[col * N + col];\n if (Math.abs(pivot) < 1e-12) {\n // Singular — return zeros\n x.fill(0);\n return;\n }\n\n // Eliminate below\n for (let row = col + 1; row < N; row++) {\n const factor = a[row * N + col] / pivot;\n for (let k = col; k < N; k++) {\n a[row * N + k] -= factor * a[col * N + k];\n }\n r[row] -= factor * r[col];\n }\n }\n\n // Back substitution\n for (let row = N - 1; row >= 0; row--) {\n let sum = r[row];\n for (let k = row + 1; k < N; k++) {\n sum -= a[row * N + k] * x[k];\n }\n x[row] = sum / a[row * N + row];\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { createControllerHook } from '../core/createController';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { GenericIK } from '../core/GenericIK';\nimport { createContiguousControlGroup, findSiteByName, resolveControlGroup } from '../core/SceneLoader';\nimport type { ControlGroupInfo, IkConfig, IkContextValue, IKSolveFn, IkSolveInput, MujocoData } from '../types';\n\n// Preallocated temp for syncGizmoToSite\nconst _syncMat4 = new THREE.Matrix4();\n\nfunction syncGizmoToSite(data: MujocoData, siteId: number, target: THREE.Group) {\n if (siteId === -1) return;\n const sitePos = data.site_xpos.subarray(siteId * 3, siteId * 3 + 3);\n const siteMat = data.site_xmat.subarray(siteId * 9, siteId * 9 + 9);\n target.position.set(sitePos[0], sitePos[1], sitePos[2]);\n _syncMat4.set(\n siteMat[0], siteMat[1], siteMat[2], 0,\n siteMat[3], siteMat[4], siteMat[5], 0,\n siteMat[6], siteMat[7], siteMat[8], 0,\n 0, 0, 0, 1,\n );\n target.quaternion.setFromRotationMatrix(_syncMat4);\n}\n\nexport const useIkController = createControllerHook<IkConfig, IkContextValue>(\n { name: 'useIkController', defaultConfig: { damping: 0.01, maxIterations: 50 } },\n function useIkControllerImpl(config) {\n const { mjModelRef, mjDataRef, mujocoRef, resetCallbacks, status } =\n useMujocoContext();\n\n // All IK state lives here\n const ikEnabledRef = useRef(false);\n const ikCalculatingRef = useRef(false);\n const ikTargetRef = useRef<THREE.Group>(new THREE.Group());\n const siteIdRef = useRef(-1);\n const controlGroupRef = useRef<ControlGroupInfo | null>(null);\n const genericIkRef = useRef<GenericIK>(new GenericIK(mujocoRef.current));\n const firstIkEnableRef = useRef(true);\n const needsInitialSync = useRef(true);\n\n const gizmoAnimRef = useRef({\n active: false,\n startPos: new THREE.Vector3(),\n endPos: new THREE.Vector3(),\n startRot: new THREE.Quaternion(),\n endRot: new THREE.Quaternion(),\n startTime: 0,\n duration: 1000,\n });\n\n // Resolve site ID and model-aware control group when model loads or config changes.\n useEffect(() => {\n if (!config) {\n siteIdRef.current = -1;\n controlGroupRef.current = null;\n return;\n }\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n controlGroupRef.current = null;\n return;\n }\n siteIdRef.current = findSiteByName(model, config.siteName);\n controlGroupRef.current = config.numJoints !== undefined\n ? createContiguousControlGroup(model, config.numJoints)\n : resolveControlGroup(model, {\n siteName: config.siteName,\n joints: config.joints,\n actuators: config.actuators,\n });\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n }, [config?.siteName, config?.numJoints, config?.joints, config?.actuators, status, mjModelRef, mjDataRef, config]);\n\n // IK solve function\n const ikSolveFn = useCallback(\n ({ position, quaternion, currentQ, context }: IkSolveInput): number[] | null => {\n if (!config) return null;\n if (config.ikSolveFn) return config.ikSolveFn({ position, quaternion, currentQ, context });\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const controlGroup = controlGroupRef.current;\n if (!model || !data || !controlGroup || siteIdRef.current === -1) return null;\n return genericIkRef.current.solve(\n model, data, siteIdRef.current, controlGroup.qposAdr,\n position, quaternion, currentQ,\n {\n damping: config.damping,\n epsilon: config.epsilon,\n jointLimits: config.jointLimits ?? controlGroup.joints.map((joint) => (\n joint.limited ? joint.range : joint.ctrlRange\n )),\n maxIterations: config.maxIterations,\n posWeight: config.posWeight,\n rotWeight: config.rotWeight,\n tolerance: config.tolerance,\n },\n );\n },\n [config, mjModelRef, mjDataRef],\n );\n const ikSolveFnRef = useRef<IKSolveFn>(ikSolveFn);\n ikSolveFnRef.current = ikSolveFn;\n\n // Gizmo animation + one-time initial sync\n useFrame(() => {\n if (!config) return;\n\n if (needsInitialSync.current && siteIdRef.current !== -1) {\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n needsInitialSync.current = false;\n }\n }\n\n const ga = gizmoAnimRef.current;\n const target = ikTargetRef.current;\n if (!ga.active || !target) return;\n\n const now = performance.now();\n const elapsed = now - ga.startTime;\n const t = Math.min(elapsed / ga.duration, 1.0);\n const ease = 1 - Math.pow(1 - t, 3);\n target.position.lerpVectors(ga.startPos, ga.endPos, ease);\n target.quaternion.slerpQuaternions(ga.startRot, ga.endRot, ease);\n if (t >= 1.0) ga.active = false;\n });\n\n // IK solve in physics loop\n useBeforePhysicsStep(({ model, data }) => {\n if (!config || !ikEnabledRef.current) {\n ikCalculatingRef.current = false;\n return;\n }\n const target = ikTargetRef.current;\n if (!target) return;\n\n ikCalculatingRef.current = true;\n const controlGroup = controlGroupRef.current;\n if (!controlGroup) return;\n\n const currentQ = Array.from(controlGroup.readQpos(data));\n const solution = config.ikSolveFn\n ? config.ikSolveFn({\n position: target.position,\n quaternion: target.quaternion,\n currentQ,\n context: {\n model,\n data,\n siteId: siteIdRef.current,\n controlGroup,\n },\n })\n : ikSolveFnRef.current({\n position: target.position,\n quaternion: target.quaternion,\n currentQ,\n });\n if (solution) {\n controlGroup.writeCtrl(data, solution);\n }\n });\n\n // Reset callback\n useEffect(() => {\n if (!config) return;\n const cb = () => {\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n gizmoAnimRef.current.active = false;\n firstIkEnableRef.current = true;\n ikEnabledRef.current = false;\n needsInitialSync.current = true;\n };\n resetCallbacks.current.add(cb);\n return () => { resetCallbacks.current.delete(cb); };\n }, [resetCallbacks, mjDataRef, config]);\n\n // --- API methods ---\n\n const setIkEnabled = useCallback(\n (enabled: boolean) => {\n ikEnabledRef.current = enabled;\n const data = mjDataRef.current;\n if (enabled && data && !gizmoAnimRef.current.active && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n firstIkEnableRef.current = false;\n }\n },\n [mjDataRef],\n );\n\n const syncTargetToSiteApi = useCallback(() => {\n const data = mjDataRef.current;\n const target = ikTargetRef.current;\n if (data && target) syncGizmoToSite(data, siteIdRef.current, target);\n }, [mjDataRef]);\n\n const solveIK = useCallback(\n (input: IkSolveInput): number[] | null => {\n return ikSolveFnRef.current(input);\n },\n [],\n );\n\n const moveTarget = useCallback(\n (pos: THREE.Vector3, duration = 0) => {\n if (!ikEnabledRef.current) setIkEnabled(true);\n const target = ikTargetRef.current;\n if (!target) return;\n\n const targetPos = pos.clone();\n const targetRot = new THREE.Quaternion().setFromEuler(\n new THREE.Euler(Math.PI, 0, 0),\n );\n\n if (duration > 0) {\n const ga = gizmoAnimRef.current;\n ga.active = true;\n ga.startPos.copy(target.position);\n ga.endPos.copy(targetPos);\n ga.startRot.copy(target.quaternion);\n ga.endRot.copy(targetRot);\n ga.startTime = performance.now();\n ga.duration = duration;\n } else {\n gizmoAnimRef.current.active = false;\n target.position.copy(targetPos);\n target.quaternion.copy(targetRot);\n }\n },\n [setIkEnabled],\n );\n\n const getGizmoStats = useCallback(\n (): { pos: THREE.Vector3; rot: THREE.Euler } | null => {\n const target = ikTargetRef.current;\n if (!ikCalculatingRef.current || !target) return null;\n return {\n pos: target.position.clone(),\n rot: new THREE.Euler().setFromQuaternion(target.quaternion),\n };\n },\n [],\n );\n\n const contextValue = useMemo<IkContextValue>(\n () => ({\n ikEnabledRef,\n ikCalculatingRef,\n ikTargetRef,\n siteIdRef,\n setIkEnabled,\n moveTarget,\n syncTargetToSite: syncTargetToSiteApi,\n solveIK,\n getGizmoStats,\n }),\n [setIkEnabled, moveTarget, syncTargetToSiteApi, solveIK, getGizmoStats],\n );\n\n if (!config) return null;\n\n return contextValue;\n },\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport { useEffect, useLayoutEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { BodyProps, SceneObject } from '../types';\n\n/**\n * Declarative physics body component. Registers a body definition in the\n * provider-level registry so it gets injected into the MJCF XML at load time.\n *\n * Bodies present at initial mount cause zero extra reloads (useLayoutEffect\n * runs before the provider's loadScene useEffect). Bodies added/removed after\n * the initial load trigger a debounced scene reload.\n */\nexport function Body({\n name,\n type,\n size,\n position = [0, 0, 0],\n rgba = [0.5, 0.5, 0.5, 1],\n mass,\n freejoint,\n friction,\n solref,\n solimp,\n condim,\n group,\n children,\n}: BodyProps) {\n const { bodyRegistryRef, hiddenBodiesRef, requestBodyReload, mjDataRef, mjModelRef, status } =\n useMujocoContext();\n const bodyIdRef = useRef(-1);\n const groupRef = useRef<THREE.Group>(null);\n const initialLoadRef = useRef(true);\n const hasChildren = children != null;\n\n // Register in body registry BEFORE the provider's loadScene useEffect fires.\n useLayoutEffect(() => {\n const definition: SceneObject = {\n name,\n type,\n size,\n position,\n rgba,\n mass,\n freejoint,\n friction,\n solref,\n solimp,\n condim,\n group,\n };\n bodyRegistryRef.current.set(name, { definition, hasCustomChildren: hasChildren });\n if (hasChildren) {\n hiddenBodiesRef.current.add(name);\n }\n\n return () => {\n bodyRegistryRef.current.delete(name);\n hiddenBodiesRef.current.delete(name);\n if (!initialLoadRef.current) {\n requestBodyReload();\n }\n };\n }, [name, type, size, position, rgba, mass, freejoint, friction, solref, solimp, condim, group, hasChildren, bodyRegistryRef, hiddenBodiesRef, requestBodyReload]);\n\n // Resolve body ID once the scene is ready\n useEffect(() => {\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, name);\n initialLoadRef.current = false;\n }, [status, name, mjModelRef]);\n\n // Sync group transform to body pose each frame (only when children are provided)\n useFrame(() => {\n if (!hasChildren) return;\n const data = mjDataRef.current;\n const id = bodyIdRef.current;\n const group = groupRef.current;\n if (!data || id < 0 || !group) return;\n\n const i3 = id * 3;\n const i4 = id * 4;\n group.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n group.quaternion.set(\n data.xquat[i4 + 1],\n data.xquat[i4 + 2],\n data.xquat[i4 + 3],\n data.xquat[i4],\n );\n });\n\n if (!hasChildren) return null;\n\n return <group ref={groupRef}>{children}</group>;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { PivotControls } from '@react-three/drei';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport { CAPTURE_EXCLUDE_KEY } from '../rendering/cameraFrameCapture';\nimport type { IkGizmoProps } from '../types';\n\n// Preallocated temps to avoid GC pressure in useFrame\nconst _mat4 = new THREE.Matrix4();\nconst _pos = new THREE.Vector3();\nconst _quat = new THREE.Quaternion();\nconst _scale = new THREE.Vector3(1, 1, 1);\n\n/**\n * IkGizmo — drei PivotControls that tracks a MuJoCo site.\n *\n * Requires a `controller` from `useIkController()`.\n *\n * Props:\n * - `controller` — IkContextValue from `useIkController()`.\n * - `siteName` — MuJoCo site to track. Defaults to the controller's configured site.\n * - `scale` — Gizmo handle scale. Default: 0.18.\n * - `onDrag` — Custom drag callback `({ position, quaternion }) => void`.\n * When omitted, dragging enables IK and writes to the IK target.\n * When provided, the consumer handles what happens during drag.\n */\nexport function IkGizmo({ controller, siteName, scale = 0.18, onDrag }: IkGizmoProps) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const { ikTargetRef, siteIdRef, ikEnabledRef, setIkEnabled } = controller;\n\n const wrapperRef = useRef<THREE.Group>(null);\n const pivotRef = useRef<THREE.Group>(null);\n const draggingRef = useRef(false);\n const localSiteIdRef = useRef(-1);\n const { controls } = useThree();\n\n // Resolve the site ID from siteName (only when an explicit siteName override is given)\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready' || !siteName) {\n localSiteIdRef.current = -1;\n return;\n }\n localSiteIdRef.current = findSiteByName(model, siteName);\n }, [siteName, status, mjModelRef]);\n\n // Every frame: sync the visual wrapper to the tracked site (when not dragging)\n useFrame(() => {\n const data = mjDataRef.current;\n const sid = siteName ? localSiteIdRef.current : siteIdRef.current;\n if (!data || sid < 0 || !wrapperRef.current) return;\n\n if (!draggingRef.current) {\n const p = data.site_xpos;\n const m = data.site_xmat;\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n // Position wrapper at the site\n wrapperRef.current.position.set(p[i3], p[i3 + 1], p[i3 + 2]);\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n wrapperRef.current.quaternion.setFromRotationMatrix(_mat4);\n\n // Reset any accumulated drag delta so handles stay at wrapper origin\n if (pivotRef.current) {\n pivotRef.current.matrix.identity();\n }\n }\n });\n\n // Don't render until the model is loaded (avoids gizmo at origin)\n if (status !== 'ready') return null;\n\n return (\n <group\n ref={wrapperRef}\n userData={{ [CAPTURE_EXCLUDE_KEY]: true }}\n >\n <PivotControls\n ref={pivotRef}\n autoTransform\n scale={scale}\n fixed={false}\n depthTest={false}\n disableScaling\n onDragStart={() => {\n draggingRef.current = true;\n if (!onDrag) {\n // Default: enable IK so the robot follows\n if (!ikEnabledRef.current) setIkEnabled(true);\n }\n if (controls) (controls as unknown as { enabled: boolean }).enabled = false;\n }}\n onDragEnd={() => {\n draggingRef.current = false;\n // Reset PivotControls so it doesn't accumulate across drags\n if (pivotRef.current) {\n pivotRef.current.matrix.identity();\n pivotRef.current.matrixWorldNeedsUpdate = true;\n }\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n }}\n onDrag={(_l, _dl, world) => {\n world.decompose(_pos, _quat, _scale);\n if (onDrag) {\n // Custom: consumer handles the drag\n onDrag({ position: _pos.clone(), quaternion: _quat.clone() });\n } else {\n // Default: write to IK target\n const target = ikTargetRef.current;\n if (target) {\n target.position.copy(_pos);\n target.quaternion.copy(_quat);\n }\n }\n }}\n >\n {/* Invisible zero-size child: gives PivotControls a valid child\n without creating bounding-box anchor offset */}\n <mesh visible={false}>\n <sphereGeometry args={[0.001]} />\n </mesh>\n </PivotControls>\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * ContactMarkers — instanced sphere visualization of MuJoCo contacts (spec 6.2)\n *\n * Fixed from original: reads data.ncon first, accesses contact via .get(i),\n * limits to maxContacts to avoid WASM heap OOM.\n */\n\nimport { useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { CAPTURE_EXCLUDE_KEY } from '../rendering/cameraFrameCapture';\nimport { getContact, withContacts } from '../types';\n\nconst _dummy = new THREE.Object3D();\n\ninterface ContactMarkersProps {\n /** Maximum contacts to render. Default: 100. */\n maxContacts?: number;\n /** Sphere radius. Default: 0.008. */\n radius?: number;\n /** Color. Default: '#22d3ee'. */\n color?: string;\n /** Show markers. Default: true. */\n visible?: boolean;\n}\n\nexport function ContactMarkers({\n maxContacts = 100,\n radius = 0.008,\n color = '#22d3ee',\n visible = true,\n ...groupProps\n}: ContactMarkersProps & Omit<ThreeElements['group'], 'ref' | 'visible'> = {}) {\n const { mjDataRef, status } = useMujocoContext();\n const meshRef = useRef<THREE.InstancedMesh>(null);\n\n useFrame(() => {\n const mesh = meshRef.current;\n const data = mjDataRef.current;\n if (!mesh || !data || !visible) {\n if (mesh) mesh.count = 0;\n return;\n }\n\n const ncon = data.ncon;\n const count = Math.min(ncon, maxContacts);\n\n let resolvedCount = count;\n withContacts(data, (contactArray) => {\n for (let i = 0; i < count; i++) {\n const c = getContact(contactArray, i);\n if (!c) {\n resolvedCount = i;\n return;\n }\n _dummy.position.set(c.pos[0], c.pos[1], c.pos[2]);\n _dummy.updateMatrix();\n mesh.setMatrixAt(i, _dummy.matrix);\n }\n });\n\n mesh.count = resolvedCount;\n mesh.instanceMatrix.needsUpdate = true;\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group\n {...groupProps}\n userData={{\n ...groupProps.userData,\n [CAPTURE_EXCLUDE_KEY]: true,\n }}\n >\n <instancedMesh ref={meshRef} args={[undefined, undefined, maxContacts]} frustumCulled={false} renderOrder={999}>\n <sphereGeometry args={[radius, 8, 8]} />\n <meshBasicMaterial color={color} depthTest={false} />\n </instancedMesh>\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { CAPTURE_EXCLUDE_KEY } from '../rendering/cameraFrameCapture';\nimport type { DragInteractionProps } from '../types';\n\n// Preallocated temps to avoid GC pressure\nconst _force = new Float64Array(3);\nconst _torque = new Float64Array(3); // always [0,0,0]\nconst _point = new Float64Array(3);\nconst _bodyPos = new THREE.Vector3();\nconst _bodyQuat = new THREE.Quaternion();\nconst _worldHit = new THREE.Vector3();\nconst _raycaster = new THREE.Raycaster();\nconst _mouse = new THREE.Vector2();\n\n/**\n * DragInteraction — Ctrl/Cmd+click-drag to apply spring forces to MuJoCo bodies.\n *\n * Raycasts against scene meshes to identify bodies, then applies a spring\n * force pulling the grabbed point toward the cursor each physics frame.\n * Requires Ctrl (or Cmd on macOS) to avoid conflicting with OrbitControls.\n *\n * - `stiffness` — Spring constant * body mass. Default: 250.\n * - `showArrow` — Show arrow from grab point toward cursor. Default: true.\n *\n * Forces compose with useGravityCompensation — the provider zeros\n * qfrc_applied each frame, then all consumers add to it.\n */\nexport function DragInteraction({\n stiffness = 250,\n showArrow = true,\n ...groupProps\n}: DragInteractionProps & Omit<ThreeElements['group'], 'ref'>) {\n const { mjDataRef, mujocoRef, mjModelRef, status } = useMujocoContext();\n const { gl, camera, scene, controls } = useThree();\n\n const draggingRef = useRef(false);\n const bodyIdRef = useRef(-1);\n const grabDistanceRef = useRef(0);\n const localHitRef = useRef(new THREE.Vector3());\n const grabWorldRef = useRef(new THREE.Vector3());\n const mouseWorldRef = useRef(new THREE.Vector3());\n\n // Arrow helper for visual feedback (managed imperatively)\n const arrowRef = useRef<THREE.ArrowHelper | null>(null);\n const groupRef = useRef<THREE.Group>(null);\n\n useEffect(() => {\n if (!showArrow || !groupRef.current) return;\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 1, 0),\n new THREE.Vector3(),\n 0.1,\n 0xff4444,\n );\n arrow.userData[CAPTURE_EXCLUDE_KEY] = true;\n arrow.visible = false;\n // Make arrow semi-transparent\n (arrow.line.material as THREE.LineBasicMaterial).transparent = true;\n (arrow.line.material as THREE.LineBasicMaterial).opacity = 0.6;\n (arrow.cone.material as THREE.MeshBasicMaterial).transparent = true;\n (arrow.cone.material as THREE.MeshBasicMaterial).opacity = 0.6;\n groupRef.current.add(arrow);\n arrowRef.current = arrow;\n return () => {\n if (groupRef.current) groupRef.current.remove(arrow);\n arrow.dispose();\n arrowRef.current = null;\n };\n }, [showArrow]);\n\n // Pointer events on the canvas\n useEffect(() => {\n const canvas = gl.domElement;\n\n const onPointerDown = (evt: PointerEvent) => {\n if (evt.button !== 0) return; // left click only\n if (!evt.ctrlKey && !evt.metaKey) return; // require Ctrl/Cmd+click\n const rect = canvas.getBoundingClientRect();\n _mouse.set(\n ((evt.clientX - rect.left) / rect.width) * 2 - 1,\n -((evt.clientY - rect.top) / rect.height) * 2 + 1,\n );\n _raycaster.setFromCamera(_mouse, camera);\n\n const hits = _raycaster.intersectObjects(scene.children, true);\n for (const hit of hits) {\n let obj: THREE.Object3D | null = hit.object;\n while (obj && obj.userData.bodyID === undefined && obj.parent) {\n obj = obj.parent;\n }\n const bid = obj?.userData.bodyID;\n if (bid !== undefined && bid > 0) {\n bodyIdRef.current = bid;\n draggingRef.current = true;\n grabDistanceRef.current = hit.distance;\n\n // Store hit point in body-local coords\n const data = mjDataRef.current;\n if (data) {\n const i3 = bid * 3;\n const i4 = bid * 4;\n _bodyPos.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n // MuJoCo xquat is [w,x,y,z]; THREE wants (x,y,z,w)\n _bodyQuat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n // World hit → body-local: inverse(bodyRot) * (hitWorld - bodyPos)\n localHitRef.current.copy(hit.point).sub(_bodyPos);\n localHitRef.current.applyQuaternion(_bodyQuat.clone().invert());\n }\n\n mouseWorldRef.current.copy(hit.point);\n grabWorldRef.current.copy(hit.point);\n\n // Disable orbit controls during drag\n if (controls) (controls as unknown as { enabled: boolean }).enabled = false;\n break;\n }\n }\n };\n\n const onPointerMove = (evt: PointerEvent) => {\n if (!draggingRef.current) return;\n // Safety: if no buttons are pressed, the pointerup was missed\n if (evt.buttons === 0) {\n draggingRef.current = false;\n bodyIdRef.current = -1;\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n return;\n }\n const rect = canvas.getBoundingClientRect();\n _mouse.set(\n ((evt.clientX - rect.left) / rect.width) * 2 - 1,\n -((evt.clientY - rect.top) / rect.height) * 2 + 1,\n );\n _raycaster.setFromCamera(_mouse, camera);\n // Project mouse ray to the same grab distance\n mouseWorldRef.current.copy(_raycaster.ray.origin)\n .addScaledVector(_raycaster.ray.direction, grabDistanceRef.current);\n };\n\n const onPointerUp = () => {\n if (!draggingRef.current) return;\n draggingRef.current = false;\n bodyIdRef.current = -1;\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n };\n\n canvas.addEventListener('pointerdown', onPointerDown);\n canvas.addEventListener('pointermove', onPointerMove);\n // Listen on window so we catch releases even if pointer leaves the canvas\n window.addEventListener('pointerup', onPointerUp);\n window.addEventListener('pointercancel', onPointerUp);\n return () => {\n canvas.removeEventListener('pointerdown', onPointerDown);\n canvas.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onPointerUp);\n window.removeEventListener('pointercancel', onPointerUp);\n };\n }, [gl, camera, scene, controls, mjDataRef]);\n\n // Apply spring force each physics frame\n useBeforePhysicsStep(({ model, data }) => {\n if (!draggingRef.current || bodyIdRef.current <= 0) return;\n\n const bid = bodyIdRef.current;\n const mujoco = mujocoRef.current;\n\n // Reconstruct grab point world position from body's current pose\n const i3 = bid * 3;\n const i4 = bid * 4;\n _bodyPos.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n _bodyQuat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n _worldHit.copy(localHitRef.current);\n _worldHit.applyQuaternion(_bodyQuat);\n _worldHit.add(_bodyPos);\n grabWorldRef.current.copy(_worldHit);\n\n // Compute spring force: F = (mouseWorld - grabWorld) * body_mass * stiffness\n const mass = model.body_mass[bid];\n const s = stiffness * mass;\n _force[0] = (mouseWorldRef.current.x - _worldHit.x) * s;\n _force[1] = (mouseWorldRef.current.y - _worldHit.y) * s;\n _force[2] = (mouseWorldRef.current.z - _worldHit.z) * s;\n\n _point[0] = _worldHit.x;\n _point[1] = _worldHit.y;\n _point[2] = _worldHit.z;\n\n _torque[0] = 0; _torque[1] = 0; _torque[2] = 0;\n\n mujoco.mj_applyFT(model, data, _force, _torque, _point, bid, data.qfrc_applied);\n });\n\n // Update arrow visual\n useFrame(() => {\n const arrow = arrowRef.current;\n if (!arrow) return;\n\n if (draggingRef.current && bodyIdRef.current > 0) {\n arrow.visible = true;\n const dir = _bodyPos.copy(mouseWorldRef.current).sub(grabWorldRef.current);\n const len = dir.length();\n if (len > 0.001) {\n dir.normalize();\n arrow.position.copy(grabWorldRef.current);\n arrow.setDirection(dir);\n arrow.setLength(len, Math.min(len * 0.2, 0.05), Math.min(len * 0.1, 0.03));\n }\n } else {\n arrow.visible = false;\n }\n });\n\n if (status !== 'ready') return null;\n\n return <group {...groupProps} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSceneLights — hook form of SceneLights (spec 6.3)\n *\n * Auto-creates Three.js lights from MJCF <light> elements.\n */\n\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\nexport function useSceneLights(intensity = 1.0) {\n const { mjModelRef, status } = useMujocoContext();\n const { scene } = useThree();\n const lightsRef = useRef<THREE.Light[]>([]);\n const targetsRef = useRef<THREE.Object3D[]>([]);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n\n // Clean up previous lights\n for (const light of lightsRef.current) {\n scene.remove(light);\n light.dispose();\n }\n for (const t of targetsRef.current) scene.remove(t);\n lightsRef.current = [];\n targetsRef.current = [];\n\n const nlight = model.nlight ?? 0;\n if (nlight === 0) return;\n\n const lightActive = getModelArray(model, 'light_active');\n const lightTypeArray = getModelArray(model, 'light_type');\n const lightCastShadow = getModelArray(model, 'light_castshadow');\n const lightIntensity = getModelArray(model, 'light_intensity');\n const lightDiffuse = getModelArray(model, 'light_diffuse');\n const lightPos = getModelArray(model, 'light_pos');\n const lightDir = getModelArray(model, 'light_dir');\n const lightCutoff = getModelArray(model, 'light_cutoff');\n const lightExponent = getModelArray(model, 'light_exponent');\n const lightAttenuation = getModelArray(model, 'light_attenuation');\n\n if (!lightPos || !lightDir) return;\n\n for (let i = 0; i < nlight; i++) {\n const active = lightActive ? lightActive[i] : 1;\n if (!active) continue;\n\n const lightType = lightTypeArray ? lightTypeArray[i] : 0;\n const isDirectional = lightType === 0;\n const castShadow = lightCastShadow ? lightCastShadow[i] !== 0 : false;\n\n const mjIntensity = lightIntensity ? lightIntensity[i] : 1.0;\n const finalIntensity = intensity * mjIntensity;\n\n const dr = lightDiffuse ? lightDiffuse[3 * i] : 1;\n const dg = lightDiffuse ? lightDiffuse[3 * i + 1] : 1;\n const db = lightDiffuse ? lightDiffuse[3 * i + 2] : 1;\n const color = new THREE.Color(dr, dg, db);\n\n const px = lightPos[3 * i];\n const py = lightPos[3 * i + 1];\n const pz = lightPos[3 * i + 2];\n const dx = lightDir[3 * i];\n const dy = lightDir[3 * i + 1];\n const dz = lightDir[3 * i + 2];\n\n if (isDirectional) {\n const light = new THREE.DirectionalLight(color, finalIntensity);\n light.position.set(px, py, pz);\n light.target.position.set(px + dx, py + dy, pz + dz);\n light.castShadow = castShadow;\n if (castShadow) {\n light.shadow.mapSize.width = 1024;\n light.shadow.mapSize.height = 1024;\n light.shadow.camera.near = 0.1;\n light.shadow.camera.far = 50;\n const d = 5;\n light.shadow.camera.left = -d;\n light.shadow.camera.right = d;\n light.shadow.camera.top = d;\n light.shadow.camera.bottom = -d;\n }\n scene.add(light);\n scene.add(light.target);\n lightsRef.current.push(light);\n targetsRef.current.push(light.target);\n } else {\n const cutoff = lightCutoff ? lightCutoff[i] : 45;\n const exponent = lightExponent ? lightExponent[i] : 10;\n const angle = (cutoff * Math.PI) / 180;\n const light = new THREE.SpotLight(color, finalIntensity, 0, angle, exponent / 128);\n light.position.set(px, py, pz);\n light.target.position.set(px + dx, py + dy, pz + dz);\n light.castShadow = castShadow;\n\n if (lightAttenuation) {\n const att1 = lightAttenuation[3 * i + 1];\n const att2 = lightAttenuation[3 * i + 2];\n light.decay = att2 > 0 ? 2 : (att1 > 0 ? 1 : 0);\n light.distance = att1 > 0 ? 1 / att1 : 0;\n }\n\n if (castShadow) {\n light.shadow.mapSize.width = 512;\n light.shadow.mapSize.height = 512;\n }\n scene.add(light);\n scene.add(light.target);\n lightsRef.current.push(light);\n targetsRef.current.push(light.target);\n }\n }\n\n return () => {\n for (const light of lightsRef.current) {\n scene.remove(light);\n light.dispose();\n }\n for (const t of targetsRef.current) scene.remove(t);\n lightsRef.current = [];\n targetsRef.current = [];\n };\n }, [status, mjModelRef, scene, intensity]);\n}\n\nfunction getModelArray(model: unknown, key: string): ArrayLike<number> | undefined {\n try {\n const value = (model as Record<string, unknown>)[key];\n return isArrayLikeNumber(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isArrayLikeNumber(value: unknown): value is ArrayLike<number> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'length' in value &&\n typeof (value as ArrayLike<number>).length === 'number'\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * SceneLights — auto-create Three.js lights from MJCF <light> elements (spec 6.3)\n *\n * WASM fields used: model.nlight, light_pos, light_dir, light_diffuse,\n * light_specular, light_active, light_type, light_castshadow,\n * light_attenuation, light_cutoff, light_exponent, light_intensity\n *\n * light_type: 0 = directional, 1 = spot (maps to mjLIGHT_DIRECTIONAL/mjLIGHT_SPOT)\n * Note: light_directional does NOT exist in WASM — use light_type instead.\n */\n\nimport { useSceneLights } from '../hooks/useSceneLights';\nimport type { SceneLightsProps } from '../types';\n\nexport function SceneLights({ intensity = 1.0 }: SceneLightsProps) {\n useSceneLights(intensity);\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { SplatCollisionProxyConfig } from '../types';\n\nexport type SplatCollisionProxyPreviewVector3 = [number, number, number];\n\nexport interface SplatCollisionProxyGeomPreview {\n id: string;\n type: 'box' | 'plane' | 'sphere' | 'capsule' | 'mesh';\n position: SplatCollisionProxyPreviewVector3;\n size: number[];\n}\n\nexport interface SplatCollisionProxyPreviewProps\n extends Omit<ThreeElements['group'], 'ref'> {\n collisionProxy?: SplatCollisionProxyConfig | null;\n xmlText?: string;\n fetchXml?: (xmlPath: string) => Promise<string>;\n color?: string;\n opacity?: number;\n planeColor?: string;\n planeOpacity?: number;\n}\n\nexport type SplatCollisionProxyPreviewStatus =\n | 'idle'\n | 'loading'\n | 'ready'\n | 'error';\n\nexport interface UseSplatCollisionProxyGeomsOptions {\n collisionProxy?: SplatCollisionProxyConfig | null;\n xmlText?: string;\n fetchXml?: (xmlPath: string) => Promise<string>;\n enabled?: boolean;\n}\n\nexport interface SplatCollisionProxyGeomsState {\n geoms: SplatCollisionProxyGeomPreview[];\n status: SplatCollisionProxyPreviewStatus;\n error: Error | null;\n xmlPath?: string;\n}\n\nexport function SplatCollisionProxyPreview({\n collisionProxy,\n xmlText,\n fetchXml = fetchSplatCollisionProxyXml,\n color = '#60a5fa',\n opacity = 0.12,\n planeColor = '#94a3b8',\n planeOpacity = 0.08,\n children,\n ...groupProps\n}: SplatCollisionProxyPreviewProps) {\n const { geoms } = useSplatCollisionProxyGeoms({\n collisionProxy,\n xmlText,\n fetchXml,\n });\n\n if (geoms.length === 0 && !children) return null;\n\n return (\n <group\n {...groupProps}\n userData={{\n kind: 'splat-collision-proxy-preview',\n ...groupProps.userData,\n }}\n >\n {geoms.map((geom) => (\n <SplatCollisionProxyGeom\n key={geom.id}\n geom={geom}\n color={color}\n opacity={opacity}\n planeColor={planeColor}\n planeOpacity={planeOpacity}\n />\n ))}\n {children}\n </group>\n );\n}\n\nexport function useSplatCollisionProxyGeoms({\n collisionProxy,\n xmlText,\n fetchXml = fetchSplatCollisionProxyXml,\n enabled = true,\n}: UseSplatCollisionProxyGeomsOptions): SplatCollisionProxyGeomsState {\n const [loadedXmlText, setLoadedXmlText] = useState<string | null>(null);\n const [status, setStatus] =\n useState<SplatCollisionProxyPreviewStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const xmlPath = collisionProxy?.xmlPath;\n\n useEffect(() => {\n let cancelled = false;\n\n if (!enabled) {\n setLoadedXmlText(null);\n setStatus('idle');\n setError(null);\n return undefined;\n }\n\n if (xmlText) {\n setLoadedXmlText(xmlText);\n setStatus('ready');\n setError(null);\n return undefined;\n }\n\n if (!xmlPath || !canFetchSplatCollisionProxyXml(xmlPath)) {\n setLoadedXmlText(null);\n setStatus('idle');\n setError(null);\n return undefined;\n }\n const fetchPath = xmlPath;\n\n async function loadProxyXml() {\n setStatus('loading');\n setError(null);\n\n try {\n const nextXmlText = await fetchXml(fetchPath);\n if (!cancelled) {\n setLoadedXmlText(nextXmlText);\n setStatus('ready');\n }\n } catch (nextError) {\n if (!cancelled) {\n setLoadedXmlText(null);\n setStatus('error');\n setError(\n nextError instanceof Error\n ? nextError\n : new Error('Unable to load collision proxy XML.')\n );\n }\n }\n }\n\n void loadProxyXml();\n\n return () => {\n cancelled = true;\n };\n }, [enabled, fetchXml, xmlPath, xmlText]);\n\n const geoms = useMemo(\n () => (loadedXmlText ? parseSplatCollisionProxyGeoms(loadedXmlText) : []),\n [loadedXmlText]\n );\n\n return useMemo(\n () => ({\n geoms,\n status,\n error,\n xmlPath,\n }),\n [error, geoms, status, xmlPath]\n );\n}\n\nexport async function fetchSplatCollisionProxyXml(xmlPath: string) {\n const response = await fetch(xmlPath);\n if (!response.ok) {\n throw new Error(`Unable to load collision proxy XML (${response.status}).`);\n }\n return response.text();\n}\n\nexport function canFetchSplatCollisionProxyXml(xmlPath: string) {\n return (\n xmlPath.startsWith('/') ||\n xmlPath.startsWith('http://') ||\n xmlPath.startsWith('https://')\n );\n}\n\nexport function parseSplatCollisionProxyGeoms(\n xmlText: string\n): SplatCollisionProxyGeomPreview[] {\n const parser = typeof DOMParser === 'undefined' ? null : new DOMParser();\n if (!parser) return [];\n\n const document = parser.parseFromString(xmlText, 'application/xml');\n if (document.querySelector('parsererror')) return [];\n\n const bodyPositions = new Map<Element, SplatCollisionProxyPreviewVector3>();\n\n for (const body of Array.from(document.querySelectorAll('body'))) {\n const parentBody = body.parentElement?.closest('body');\n const parentPosition: SplatCollisionProxyPreviewVector3 = parentBody\n ? bodyPositions.get(parentBody) ?? [0, 0, 0]\n : [0, 0, 0];\n bodyPositions.set(\n body,\n addProxyVectors(parentPosition, parseProxyVector(body.getAttribute('pos')))\n );\n }\n\n return Array.from(document.querySelectorAll('geom'))\n .map((geom, index): SplatCollisionProxyGeomPreview | null => {\n const type = getCollisionProxyGeomType(geom);\n if (!type) return null;\n const parentBody = geom.closest('body');\n const bodyPosition: SplatCollisionProxyPreviewVector3 = parentBody\n ? bodyPositions.get(parentBody) ?? [0, 0, 0]\n : [0, 0, 0];\n const position = addProxyVectors(\n bodyPosition,\n parseProxyVector(geom.getAttribute('pos'))\n );\n const size = parseNumberList(geom.getAttribute('size'));\n return {\n id: geom.getAttribute('name') ?? `${type}-${index}`,\n type,\n position,\n size,\n };\n })\n .filter((geom): geom is SplatCollisionProxyGeomPreview => Boolean(geom));\n}\n\nfunction SplatCollisionProxyGeom({\n geom,\n color,\n opacity,\n planeColor,\n planeOpacity,\n}: {\n geom: SplatCollisionProxyGeomPreview;\n color: string;\n opacity: number;\n planeColor: string;\n planeOpacity: number;\n}) {\n if (geom.type === 'sphere') {\n return (\n <mesh position={geom.position}>\n <sphereGeometry args={[geom.size[0] ?? 0.1, 16, 8]} />\n <SplatCollisionProxyMaterial color={color} opacity={opacity} />\n </mesh>\n );\n }\n\n if (geom.type === 'plane') {\n const width = geom.size[0] && geom.size[0] > 0 ? geom.size[0] * 2 : 4;\n const height = geom.size[1] && geom.size[1] > 0 ? geom.size[1] * 2 : 4;\n return (\n <mesh position={geom.position}>\n <boxGeometry args={[width, height, 0.02]} />\n <SplatCollisionProxyMaterial color={planeColor} opacity={planeOpacity} />\n </mesh>\n );\n }\n\n const size = getCollisionProxyBoxSize(geom);\n return (\n <mesh position={geom.position}>\n <boxGeometry args={size} />\n <SplatCollisionProxyMaterial color={color} opacity={opacity} />\n </mesh>\n );\n}\n\nfunction SplatCollisionProxyMaterial({\n color,\n opacity,\n}: {\n color: string;\n opacity: number;\n}) {\n return (\n <meshBasicMaterial\n color={color}\n transparent\n opacity={opacity}\n wireframe\n />\n );\n}\n\nfunction getCollisionProxyGeomType(\n geom: Element\n): SplatCollisionProxyGeomPreview['type'] | null {\n const type = geom.getAttribute('type') ?? 'sphere';\n if (\n type === 'box' ||\n type === 'plane' ||\n type === 'sphere' ||\n type === 'capsule' ||\n type === 'mesh'\n ) {\n return type;\n }\n return null;\n}\n\nfunction getCollisionProxyBoxSize(\n geom: SplatCollisionProxyGeomPreview\n): SplatCollisionProxyPreviewVector3 {\n if (geom.type === 'capsule') {\n const radius = geom.size[0] ?? 0.05;\n const halfLength = geom.size[1] ?? radius;\n return [radius * 2, radius * 2, Math.max(radius * 2, halfLength * 2)];\n }\n\n if (geom.type === 'mesh') return [0.2, 0.2, 0.2];\n\n return [\n (geom.size[0] ?? 0.1) * 2,\n (geom.size[1] ?? geom.size[0] ?? 0.1) * 2,\n (geom.size[2] ?? geom.size[0] ?? 0.1) * 2,\n ];\n}\n\nfunction parseProxyVector(\n value: string | null\n): SplatCollisionProxyPreviewVector3 {\n const values = parseNumberList(value);\n return [values[0] ?? 0, values[1] ?? 0, values[2] ?? 0];\n}\n\nfunction parseNumberList(value: string | null) {\n if (!value) return [];\n return value\n .trim()\n .split(/\\s+/)\n .map((part) => Number(part))\n .filter((part) => Number.isFinite(part));\n}\n\nfunction addProxyVectors(\n a: SplatCollisionProxyPreviewVector3,\n b: SplatCollisionProxyPreviewVector3\n): SplatCollisionProxyPreviewVector3 {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Stream a live MuJoCo camera into a DOM `<canvas>`. Each frame the scene is\n * rendered offscreen from the selected camera and blitted into the canvas, so\n * it composites normally in the DOM (works inside opaque panels) and does NOT\n * take over the render loop. Prefer this over `useCameraViewport` for camera\n * tiles embedded in HTML UI; use `useCameraViewport` for transparent overlays\n * on a full-bleed canvas.\n *\n * Uses the async capture path so Gaussian-splat environments render through\n * their dedicated capture renderer — streaming a splat scene at full rate does\n * not disturb the main view's splat sort.\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport type { CameraFrameCaptureSession } from '../rendering/cameraFrameCapture';\nimport type { CameraFrameCaptureOptions } from '../types';\n\nexport interface CameraStreamOptions extends CameraFrameCaptureOptions {\n /**\n * Optional cap on updates per second. Omit to stream as fast as captures\n * complete (one capture is in flight at a time regardless).\n */\n fps?: number;\n /** Pause updates without unmounting. */\n paused?: boolean;\n}\n\nfunction streamSignature(options: CameraStreamOptions): string {\n return JSON.stringify({\n cameraName: options.cameraName,\n siteName: options.siteName,\n bodyName: options.bodyName,\n width: options.width,\n height: options.height,\n renderIsolation: options.renderIsolation ?? false,\n });\n}\n\n/**\n * Render the live scene from a MuJoCo camera/site/body into `canvasRef`'s\n * `<canvas>` every frame (throttled to `fps`). Call inside `<MujocoCanvas>`;\n * the canvas itself can live anywhere in the DOM.\n */\nexport function useCameraStream(\n canvasRef: RefObject<HTMLCanvasElement | null>,\n options: CameraStreamOptions\n) {\n const mujoco = useMujoco();\n const sessionRef = useRef<CameraFrameCaptureSession | null>(null);\n const signatureRef = useRef<string>('');\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const elapsedRef = useRef(0);\n const inFlightRef = useRef(false);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n sessionRef.current?.dispose();\n sessionRef.current = null;\n signatureRef.current = '';\n };\n }, []);\n\n useFrame((_state, delta) => {\n const api = mujoco.api;\n if (!api || !canvasRef.current) return;\n\n const opts = optionsRef.current;\n if (opts.paused) return;\n\n if (opts.fps && opts.fps > 0) {\n elapsedRef.current += delta;\n if (elapsedRef.current < 1 / opts.fps) return;\n }\n // One capture in flight at a time — naturally rate-limits to capture speed.\n if (inFlightRef.current) return;\n elapsedRef.current = 0;\n\n const signature = streamSignature(opts);\n if (!sessionRef.current || signatureRef.current !== signature) {\n sessionRef.current?.dispose();\n sessionRef.current = api.createCameraFrameCaptureSession(opts);\n signatureRef.current = signature;\n }\n const session = sessionRef.current;\n\n inFlightRef.current = true;\n session\n .captureAsync(api.resolveCameraCaptureOptions(opts))\n .then((frame) => {\n const canvas = canvasRef.current;\n if (!mountedRef.current || !canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n if (canvas.width !== frame.width || canvas.height !== frame.height) {\n canvas.width = frame.width;\n canvas.height = frame.height;\n }\n ctx.drawImage(frame.canvas, 0, 0);\n })\n .catch(() => {})\n .finally(() => {\n inFlightRef.current = false;\n });\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Debug — visualization overlay for MuJoCo scene elements (spec 6.1)\n */\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { CAPTURE_EXCLUDE_KEY } from '../rendering/cameraFrameCapture';\nimport { getContact, withContacts } from '../types';\nimport type { CameraFrameCaptureVector3, DebugProps, DebugVirtualCamera } from '../types';\n\nconst JOINT_COLORS: Record<number, number> = {\n 0: 0xff0000, // free - red\n 1: 0x00ff00, // ball - green\n 2: 0x0000ff, // slide - blue\n 3: 0xffff00, // hinge - yellow\n};\n\n// Preallocated temps to avoid per-frame GC pressure\nconst _v3a = new THREE.Vector3();\nconst _v3b = new THREE.Vector3();\nconst _quat = new THREE.Quaternion();\nconst _cameraMatrix = new THREE.Matrix4();\nconst _contactPos = new THREE.Vector3();\nconst _contactNormal = new THREE.Vector3();\nconst MAX_CONTACT_ARROWS = 50;\nconst CAMERA_DEBUG_LENGTH = 0.12;\nconst CAMERA_DEBUG_FRUSTUM_DEPTH = 0.08;\n\ntype CameraDebugObject = THREE.Group & {\n userData: {\n cameraId: number;\n frustum: THREE.LineSegments;\n label?: THREE.Sprite;\n };\n};\n\nfunction toVector3(\n value: CameraFrameCaptureVector3 | undefined,\n fallback: THREE.Vector3\n) {\n if (!value) return fallback.clone();\n return value instanceof THREE.Vector3\n ? value.clone()\n : new THREE.Vector3(value[0], value[1], value[2]);\n}\n\nfunction createCameraLabel(text: string, color: THREE.ColorRepresentation) {\n const canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 64;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = new THREE.Color(color).getStyle();\n ctx.font = 'bold 32px monospace';\n ctx.textAlign = 'center';\n ctx.fillText(text, 128, 42);\n const texture = new THREE.CanvasTexture(canvas);\n const sprite = new THREE.Sprite(\n new THREE.SpriteMaterial({\n map: texture,\n depthTest: false,\n transparent: true,\n })\n );\n sprite.position.set(0, 0.014, 0.01);\n sprite.scale.set(0.05, 0.012, 1);\n sprite.renderOrder = 999;\n return sprite;\n}\n\nfunction createVirtualCameraDebugObject(\n camera: DebugVirtualCamera,\n index: number\n) {\n const color = camera.color ?? '#ff3d71';\n const aimColor = camera.aimColor ?? '#38bdf8';\n const markerScale = camera.markerScale ?? 1;\n const cameraPosition = toVector3(camera.position, new THREE.Vector3());\n const configuredUp = toVector3(camera.up, new THREE.Vector3(0, 0, 1)).normalize();\n const cameraQuaternion = new THREE.Quaternion();\n const forward = new THREE.Vector3();\n\n if (camera.quaternion) {\n if (camera.quaternion instanceof THREE.Quaternion) {\n cameraQuaternion.copy(camera.quaternion);\n } else {\n cameraQuaternion.set(\n camera.quaternion[0],\n camera.quaternion[1],\n camera.quaternion[2],\n camera.quaternion[3]\n );\n }\n forward.set(0, 0, -1).applyQuaternion(cameraQuaternion).normalize();\n } else {\n const target = toVector3(\n camera.lookAt,\n cameraPosition.clone().add(new THREE.Vector3(0, 0, -1))\n );\n forward.copy(target).sub(cameraPosition);\n if (forward.lengthSq() < 1e-8) forward.set(0, 0, -1);\n forward.normalize();\n cameraQuaternion.setFromRotationMatrix(\n new THREE.Matrix4().lookAt(cameraPosition, target, configuredUp)\n );\n }\n\n const target = camera.lookAt\n ? toVector3(camera.lookAt, cameraPosition.clone().add(forward))\n : cameraPosition.clone().addScaledVector(forward, 0.4);\n const distanceToTarget = Math.max(target.distanceTo(cameraPosition), 0.001);\n const depth = camera.frustumDepth ?? Math.min(Math.max(distanceToTarget * 0.42, 0.16), 0.45);\n const fov = camera.fov ?? 50;\n const aspect = (camera.width ?? 640) / (camera.height ?? 480);\n\n const right = forward.clone().cross(configuredUp);\n if (right.lengthSq() < 1e-8) right.set(1, 0, 0);\n right.normalize();\n const orthogonalUp = right.clone().cross(forward).normalize();\n const frustumHeight = 2 * Math.tan(THREE.MathUtils.degToRad(fov) / 2) * depth;\n const frustumWidth = frustumHeight * aspect;\n const center = cameraPosition.clone().addScaledVector(forward, depth);\n const halfRight = right.clone().multiplyScalar(frustumWidth / 2);\n const halfUp = orthogonalUp.clone().multiplyScalar(frustumHeight / 2);\n\n const topLeft = center.clone().sub(halfRight).add(halfUp);\n const topRight = center.clone().add(halfRight).add(halfUp);\n const bottomRight = center.clone().add(halfRight).sub(halfUp);\n const bottomLeft = center.clone().sub(halfRight).sub(halfUp);\n const frustumPoints = [\n cameraPosition, topLeft,\n cameraPosition, topRight,\n cameraPosition, bottomRight,\n cameraPosition, bottomLeft,\n topLeft, topRight,\n topRight, bottomRight,\n bottomRight, bottomLeft,\n bottomLeft, topLeft,\n ];\n\n const group = new THREE.Group();\n group.name = camera.name ?? `virtual-camera-${index}`;\n group.renderOrder = 999;\n group.frustumCulled = false;\n\n const frustum = new THREE.LineSegments(\n new THREE.BufferGeometry().setFromPoints(frustumPoints),\n new THREE.LineBasicMaterial({\n color,\n transparent: true,\n opacity: 0.9,\n depthTest: false,\n })\n );\n frustum.renderOrder = 999;\n frustum.frustumCulled = false;\n group.add(frustum);\n\n const aim = new THREE.LineSegments(\n new THREE.BufferGeometry().setFromPoints([cameraPosition, target]),\n new THREE.LineBasicMaterial({\n color: aimColor,\n transparent: true,\n opacity: 0.95,\n depthTest: false,\n })\n );\n aim.renderOrder = 999;\n aim.frustumCulled = false;\n group.add(aim);\n\n const markerGroup = new THREE.Group();\n markerGroup.position.copy(cameraPosition);\n markerGroup.quaternion.copy(cameraQuaternion);\n markerGroup.renderOrder = 999;\n markerGroup.frustumCulled = false;\n markerGroup.add(new THREE.Mesh(\n new THREE.BoxGeometry(0.045 * markerScale, 0.028 * markerScale, 0.022 * markerScale),\n new THREE.MeshBasicMaterial({ color, depthTest: false })\n ));\n const lens = new THREE.Mesh(\n new THREE.BoxGeometry(0.025 * markerScale, 0.018 * markerScale, 0.014 * markerScale),\n new THREE.MeshBasicMaterial({ color: aimColor, depthTest: false })\n );\n lens.position.set(0, 0, -0.021 * markerScale);\n markerGroup.add(lens);\n if (camera.name) markerGroup.add(createCameraLabel(camera.name, color));\n group.add(markerGroup);\n\n const targetMarker = new THREE.Mesh(\n new THREE.SphereGeometry(0.018 * markerScale, 16, 10),\n new THREE.MeshBasicMaterial({ color: aimColor, depthTest: false })\n );\n targetMarker.position.copy(target);\n targetMarker.renderOrder = 999;\n targetMarker.frustumCulled = false;\n group.add(targetMarker);\n\n return group;\n}\n\n/**\n * Declarative debug visualization component.\n * Renders wireframe geoms, site markers, joint axes, contact forces, COM markers, etc.\n */\nexport function Debug({\n showGeoms = false,\n showSites = false,\n showJoints = false,\n showCameras = false,\n virtualCameras = [],\n showContacts = false,\n showCOM = false,\n showInertia = false,\n showTendons = false,\n ...groupProps\n}: DebugProps & Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const { scene } = useThree();\n const groupRef = useRef<THREE.Group>(null);\n\n // Build static debug geometry when model loads\n const debugGeometry = useMemo(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return null;\n\n const geoms: THREE.Object3D[] = [];\n const sites: THREE.Object3D[] = [];\n const joints: THREE.Object3D[] = [];\n const cameras: CameraDebugObject[] = [];\n const virtualCameraObjects: THREE.Object3D[] = [];\n const comMarkers: THREE.Object3D[] = [];\n\n // Wireframe geoms\n if (showGeoms) {\n for (let i = 0; i < model.ngeom; i++) {\n const type = model.geom_type[i];\n const s = model.geom_size;\n let geometry: THREE.BufferGeometry | null = null;\n\n switch (type) {\n case 2: // sphere\n geometry = new THREE.SphereGeometry(s[3 * i], 12, 8);\n break;\n case 3: // capsule\n geometry = new THREE.CapsuleGeometry(s[3 * i], s[3 * i + 1] * 2, 6, 8);\n break;\n case 5: // cylinder\n geometry = new THREE.CylinderGeometry(s[3 * i], s[3 * i], s[3 * i + 1] * 2, 12);\n break;\n case 6: // box\n geometry = new THREE.BoxGeometry(s[3 * i] * 2, s[3 * i + 1] * 2, s[3 * i + 2] * 2);\n break;\n }\n\n if (geometry) {\n const mat = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true, transparent: true, opacity: 0.3 });\n const mesh = new THREE.Mesh(geometry, mat);\n mesh.userData.geomId = i;\n mesh.userData.bodyId = model.geom_bodyid[i];\n geoms.push(mesh);\n }\n }\n }\n\n // Site markers — scale based on site_size if available, else use geom_size of parent body\n if (showSites) {\n const siteSize = (model as Record<string, unknown>).site_size as Float64Array | undefined;\n for (let i = 0; i < model.nsite; i++) {\n // Determine marker radius: use site_size[3*i] if available, else estimate from parent body's geoms\n let radius = 0.008;\n if (siteSize) {\n radius = Math.max(siteSize[3 * i] * 0.5, 0.004);\n } else {\n // Estimate from parent body's geom sizes\n const bodyId = model.site_bodyid[i];\n let maxGeomSize = 0;\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === bodyId) {\n maxGeomSize = Math.max(maxGeomSize, model.geom_size[3 * g]);\n }\n }\n if (maxGeomSize > 0) radius = maxGeomSize * 0.15;\n }\n\n const geometry = new THREE.OctahedronGeometry(radius);\n const mat = new THREE.MeshBasicMaterial({ color: 0xff00ff, depthTest: false });\n const mesh = new THREE.Mesh(geometry, mat);\n mesh.renderOrder = 999;\n mesh.frustumCulled = false;\n mesh.userData.siteId = i;\n\n // Label\n const canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 64;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = '#ff00ff';\n ctx.font = 'bold 36px monospace';\n ctx.textAlign = 'center';\n ctx.fillText(getName(model, model.name_siteadr[i]), 128, 42);\n const tex = new THREE.CanvasTexture(canvas);\n const spriteMat = new THREE.SpriteMaterial({ map: tex, depthTest: false, transparent: true });\n const sprite = new THREE.Sprite(spriteMat);\n const labelScale = radius * 15;\n sprite.scale.set(labelScale, labelScale * 0.25, 1);\n sprite.position.y = radius * 2;\n sprite.renderOrder = 999;\n mesh.add(sprite);\n\n sites.push(mesh);\n }\n }\n\n // Joint axes — scale arrow length based on parent body's geom sizes\n if (showJoints) {\n // Safely check for jnt_pos/jnt_axis on the WASM model\n const jntPos = (model as Record<string, unknown>).jnt_pos as Float64Array | undefined;\n const jntAxis = (model as Record<string, unknown>).jnt_axis as Float64Array | undefined;\n\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const color = JOINT_COLORS[type] ?? 0xffffff;\n\n // Scale based on parent body geom size\n const bodyId = model.jnt_bodyid[i];\n let maxGeomSize = 0;\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === bodyId) {\n maxGeomSize = Math.max(maxGeomSize, model.geom_size[3 * g]);\n }\n }\n const arrowLen = Math.max(maxGeomSize * 0.8, 0.05);\n\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 0, 1), new THREE.Vector3(),\n arrowLen, color, arrowLen * 0.25, arrowLen * 0.12\n );\n // Render on top so arrows show through geometry\n arrow.renderOrder = 999;\n arrow.frustumCulled = false;\n arrow.line.material = new THREE.LineBasicMaterial({ color, depthTest: false });\n (arrow.cone.material as THREE.MeshBasicMaterial).depthTest = false;\n arrow.line.renderOrder = 999;\n arrow.line.frustumCulled = false;\n arrow.cone.renderOrder = 999;\n arrow.cone.frustumCulled = false;\n arrow.userData.jointId = i;\n arrow.userData.bodyId = bodyId;\n arrow.userData.hasJntPos = !!jntPos;\n arrow.userData.hasJntAxis = !!jntAxis;\n joints.push(arrow);\n }\n }\n\n if (showCameras && model.ncam && model.name_camadr) {\n for (let i = 0; i < model.ncam; i++) {\n const group = new THREE.Group() as CameraDebugObject;\n group.userData.cameraId = i;\n group.renderOrder = 999;\n group.frustumCulled = false;\n\n const marker = new THREE.Mesh(\n new THREE.BoxGeometry(0.014, 0.009, 0.006),\n new THREE.MeshBasicMaterial({ color: 0x38bdf8, depthTest: false })\n );\n marker.renderOrder = 999;\n marker.frustumCulled = false;\n group.add(marker);\n\n const forward = new THREE.ArrowHelper(\n new THREE.Vector3(0, 0, -1),\n new THREE.Vector3(),\n CAMERA_DEBUG_LENGTH,\n 0x38bdf8,\n CAMERA_DEBUG_LENGTH * 0.24,\n CAMERA_DEBUG_LENGTH * 0.11\n );\n forward.renderOrder = 999;\n forward.frustumCulled = false;\n forward.line.material = new THREE.LineBasicMaterial({\n color: 0x38bdf8,\n depthTest: false,\n });\n (forward.cone.material as THREE.MeshBasicMaterial).depthTest = false;\n group.add(forward);\n\n const frustumGeometry = new THREE.BufferGeometry();\n frustumGeometry.setAttribute(\n 'position',\n new THREE.Float32BufferAttribute(new Float32Array(8 * 2 * 3), 3)\n );\n const frustum = new THREE.LineSegments(\n frustumGeometry,\n new THREE.LineBasicMaterial({\n color: 0x38bdf8,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n })\n );\n frustum.renderOrder = 999;\n frustum.frustumCulled = false;\n group.userData.frustum = frustum;\n group.add(frustum);\n\n const canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 64;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = '#38bdf8';\n ctx.font = 'bold 32px monospace';\n ctx.textAlign = 'center';\n ctx.fillText(getName(model, model.name_camadr[i]), 128, 42);\n const texture = new THREE.CanvasTexture(canvas);\n const sprite = new THREE.Sprite(\n new THREE.SpriteMaterial({\n map: texture,\n depthTest: false,\n transparent: true,\n })\n );\n sprite.position.set(0, 0.014, 0.01);\n sprite.scale.set(0.04, 0.01, 1);\n sprite.renderOrder = 999;\n group.userData.label = sprite;\n group.add(sprite);\n\n cameras.push(group);\n }\n }\n\n for (let i = 0; i < virtualCameras.length; i += 1) {\n virtualCameraObjects.push(createVirtualCameraDebugObject(virtualCameras[i], i));\n }\n\n // COM markers\n if (showCOM) {\n for (let i = 1; i < model.nbody; i++) {\n const geometry = new THREE.SphereGeometry(0.005, 6, 6);\n const mat = new THREE.MeshBasicMaterial({ color: 0xff0000 });\n const mesh = new THREE.Mesh(geometry, mat);\n mesh.userData.bodyId = i;\n comMarkers.push(mesh);\n }\n }\n\n return { geoms, sites, joints, cameras, virtualCameraObjects, comMarkers };\n }, [status, mjModelRef, showGeoms, showSites, showJoints, showCameras, virtualCameras, showCOM]);\n\n // Add/remove debug objects from scene\n useEffect(() => {\n const group = groupRef.current;\n if (!group || !debugGeometry) return;\n\n const allObjects = [\n ...debugGeometry.geoms,\n ...debugGeometry.sites,\n ...debugGeometry.joints,\n ...debugGeometry.cameras,\n ...debugGeometry.virtualCameraObjects,\n ...debugGeometry.comMarkers,\n ];\n for (const obj of allObjects) group.add(obj);\n\n return () => {\n for (const obj of allObjects) {\n group.remove(obj);\n if ((obj as THREE.Mesh).geometry) (obj as THREE.Mesh).geometry.dispose();\n }\n };\n }, [debugGeometry]);\n\n // Update positions every frame\n useFrame(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || !debugGeometry) return;\n\n // Safely grab optional arrays once\n const jntPos = (model as Record<string, unknown>).jnt_pos as Float64Array | undefined;\n const jntAxis = (model as Record<string, unknown>).jnt_axis as Float64Array | undefined;\n\n // Update geom wireframes\n for (const mesh of debugGeometry.geoms) {\n const bid = mesh.userData.bodyId;\n const i3 = bid * 3;\n const i4 = bid * 4;\n mesh.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n mesh.quaternion.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n // Apply local geom offset\n const gid = mesh.userData.geomId;\n const gp = model.geom_pos;\n _v3a.set(gp[3 * gid], gp[3 * gid + 1], gp[3 * gid + 2])\n .applyQuaternion(mesh.quaternion);\n mesh.position.add(_v3a);\n }\n\n // Update site markers\n for (const mesh of debugGeometry.sites) {\n const sid = mesh.userData.siteId;\n mesh.position.set(\n data.site_xpos[3 * sid],\n data.site_xpos[3 * sid + 1],\n data.site_xpos[3 * sid + 2],\n );\n }\n\n // Update joint axes\n for (const obj of debugGeometry.joints) {\n const arrow = obj as THREE.ArrowHelper;\n const jid = arrow.userData.jointId;\n const bid = arrow.userData.bodyId;\n const i3 = bid * 3;\n const i4 = bid * 4;\n\n _quat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n\n // Position: body origin + local joint anchor (if available)\n arrow.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n if (jntPos) {\n _v3a.set(jntPos[3 * jid], jntPos[3 * jid + 1], jntPos[3 * jid + 2])\n .applyQuaternion(_quat);\n arrow.position.add(_v3a);\n }\n\n // Orient along joint axis in world frame (if available)\n if (jntAxis) {\n _v3a.set(jntAxis[3 * jid], jntAxis[3 * jid + 1], jntAxis[3 * jid + 2])\n .applyQuaternion(_quat).normalize();\n arrow.setDirection(_v3a);\n }\n }\n\n const camXpos = data.cam_xpos;\n const camXmat = data.cam_xmat;\n if (camXpos && camXmat) {\n for (const group of debugGeometry.cameras) {\n const cameraId = group.userData.cameraId;\n const i3 = cameraId * 3;\n const i9 = cameraId * 9;\n group.position.set(\n camXpos[i3],\n camXpos[i3 + 1],\n camXpos[i3 + 2]\n );\n _cameraMatrix.set(\n camXmat[i9], camXmat[i9 + 1], camXmat[i9 + 2], 0,\n camXmat[i9 + 3], camXmat[i9 + 4], camXmat[i9 + 5], 0,\n camXmat[i9 + 6], camXmat[i9 + 7], camXmat[i9 + 8], 0,\n 0, 0, 0, 1\n );\n group.quaternion.setFromRotationMatrix(_cameraMatrix);\n\n const fovy = model.cam_fovy?.[cameraId] ?? 45;\n const halfHeight = Math.tan(THREE.MathUtils.degToRad(fovy) / 2) *\n CAMERA_DEBUG_FRUSTUM_DEPTH;\n const halfWidth = halfHeight * 4 / 3;\n const positions = group.userData.frustum.geometry.attributes.position;\n const array = positions.array as Float32Array;\n const points = [\n [0, 0, 0],\n [-halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [0, 0, 0],\n [halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [0, 0, 0],\n [halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [0, 0, 0],\n [-halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [-halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [-halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [-halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [-halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n ];\n for (let i = 0; i < points.length; i += 1) {\n array[i * 3] = points[i][0];\n array[i * 3 + 1] = points[i][1];\n array[i * 3 + 2] = points[i][2];\n }\n positions.needsUpdate = true;\n }\n }\n\n // Update COM markers\n for (const mesh of debugGeometry.comMarkers) {\n const bid = mesh.userData.bodyId;\n const i3 = bid * 3;\n mesh.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n }\n });\n\n // Contact force vectors — pre-created pool to avoid per-frame allocation\n const contactGroupRef = useRef<THREE.Group>(null);\n const contactPoolRef = useRef<THREE.ArrowHelper[]>([]);\n const contactPoolInitRef = useRef(false);\n\n // Initialize arrow pool once\n useEffect(() => {\n const group = contactGroupRef.current;\n if (!group || contactPoolInitRef.current) return;\n contactPoolInitRef.current = true;\n\n const pool: THREE.ArrowHelper[] = [];\n for (let i = 0; i < MAX_CONTACT_ARROWS; i++) {\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 1, 0), new THREE.Vector3(), 0.1, 0xff4444, 0.03, 0.015\n );\n arrow.visible = false;\n group.add(arrow);\n pool.push(arrow);\n }\n contactPoolRef.current = pool;\n\n return () => {\n for (const arrow of pool) {\n group.remove(arrow);\n arrow.dispose();\n }\n contactPoolRef.current = [];\n contactPoolInitRef.current = false;\n };\n }, [showContacts]);\n\n useFrame(() => {\n if (!showContacts) return;\n const data = mjDataRef.current;\n const pool = contactPoolRef.current;\n if (!data || pool.length === 0) return;\n\n const ncon = data.ncon;\n let arrowIdx = 0;\n\n withContacts(data, (contactArray) => {\n for (let i = 0; i < Math.min(ncon, MAX_CONTACT_ARROWS); i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n _contactPos.set(c.pos[0], c.pos[1], c.pos[2]);\n _contactNormal.set(c.frame[0], c.frame[1], c.frame[2]);\n const force = Math.abs(c.dist) * 100;\n const length = Math.min(force * 0.01, 0.1);\n if (length > 0.001 && arrowIdx < pool.length) {\n const arrow = pool[arrowIdx];\n arrow.position.copy(_contactPos);\n arrow.setDirection(_contactNormal);\n arrow.setLength(length, length * 0.3, length * 0.15);\n arrow.visible = true;\n arrowIdx++;\n }\n }\n });\n\n // Hide unused arrows\n for (let i = arrowIdx; i < pool.length; i++) {\n pool[i].visible = false;\n }\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group\n {...groupProps}\n userData={{\n ...groupProps.userData,\n [CAPTURE_EXCLUDE_KEY]: true,\n }}\n >\n <group ref={groupRef} />\n {showContacts && <group ref={contactGroupRef} />}\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TendonRenderer — render tendons as tube geometries (spec 6.4)\n *\n * WASM fields used: model.ntendon, model.ten_wrapadr, model.ten_wrapnum\n * data.wrap_xpos, data.ten_wrapadr (runtime)\n *\n * Note: ten_rgba and ten_width may not be available in all MuJoCo WASM builds.\n * Tendons use a default color and width.\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\nconst DEFAULT_TENDON_COLOR = new THREE.Color(0.3, 0.3, 0.8);\nconst DEFAULT_TENDON_WIDTH = 0.002;\n\n// Preallocated temp vector to avoid per-frame allocations\nconst _tmpVec = new THREE.Vector3();\n\nexport function TendonRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n const curvesRef = useRef<THREE.CatmullRomCurve3[]>([]);\n const materialRef = useRef<THREE.MeshStandardMaterial | null>(null);\n\n // Build tendon meshes once when model loads\n useEffect(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const group = groupRef.current;\n if (!model || !data || !group) return;\n\n const ntendon = model.ntendon ?? 0;\n if (ntendon === 0) return;\n\n // Shared material for all tendons\n const material = new THREE.MeshStandardMaterial({\n color: DEFAULT_TENDON_COLOR,\n roughness: 0.6,\n metalness: 0.1,\n });\n materialRef.current = material;\n\n const meshes: THREE.Mesh[] = [];\n const curves: THREE.CatmullRomCurve3[] = [];\n\n for (let t = 0; t < ntendon; t++) {\n const wrapNum = model.ten_wrapnum[t];\n if (wrapNum < 2) {\n meshes.push(null!);\n curves.push(null!);\n continue;\n }\n\n // Initial dummy points — will be overwritten in useFrame\n const points = Array.from({ length: wrapNum }, () => new THREE.Vector3());\n const curve = new THREE.CatmullRomCurve3(points, false);\n const segments = Math.max(wrapNum * 2, 4);\n const geometry = new THREE.TubeGeometry(curve, segments, DEFAULT_TENDON_WIDTH, 6, false);\n const mesh = new THREE.Mesh(geometry, material);\n mesh.frustumCulled = false;\n group.add(mesh);\n meshes.push(mesh);\n curves.push(curve);\n }\n\n meshesRef.current = meshes;\n curvesRef.current = curves;\n\n return () => {\n for (const mesh of meshes) {\n if (!mesh) continue;\n group.remove(mesh);\n mesh.geometry.dispose();\n }\n material.dispose();\n meshesRef.current = [];\n curvesRef.current = [];\n materialRef.current = null;\n };\n }, [status, mjModelRef, mjDataRef]);\n\n // Update curve control points and rebuild geometry each frame\n useFrame(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const ntendon = model.ntendon ?? 0;\n const meshes = meshesRef.current;\n const curves = curvesRef.current;\n\n for (let t = 0; t < ntendon; t++) {\n const mesh = meshes[t];\n const curve = curves[t];\n if (!mesh || !curve) continue;\n\n const wrapAdr = model.ten_wrapadr[t];\n const wrapNum = model.ten_wrapnum[t];\n\n // Update existing control points in-place\n let validCount = 0;\n for (let w = 0; w < wrapNum; w++) {\n const idx = (wrapAdr + w) * 3;\n if (data.wrap_xpos && idx + 2 < data.wrap_xpos.length) {\n const x = data.wrap_xpos[idx];\n const y = data.wrap_xpos[idx + 1];\n const z = data.wrap_xpos[idx + 2];\n if (x !== 0 || y !== 0 || z !== 0) {\n if (validCount < curve.points.length) {\n curve.points[validCount].set(x, y, z);\n }\n validCount++;\n }\n }\n }\n\n if (validCount < 2) {\n mesh.visible = false;\n continue;\n }\n\n // Trim or pad points array to match valid count\n if (curve.points.length !== validCount) {\n curve.points.length = validCount;\n while (curve.points.length < validCount) {\n curve.points.push(new THREE.Vector3());\n }\n }\n\n // Rebuild geometry from updated curve\n mesh.geometry.dispose();\n mesh.geometry = new THREE.TubeGeometry(\n curve, Math.max(validCount * 2, 4), DEFAULT_TENDON_WIDTH, 6, false\n );\n mesh.visible = true;\n }\n });\n\n if (status !== 'ready') return null;\n return <group {...props} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * FlexRenderer — render deformable flex bodies (spec 6.4)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\n/**\n * Renders MuJoCo flex (deformable) bodies as dynamic meshes.\n * Vertices are updated every frame from flexvert_xpos.\n */\nexport function FlexRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n\n // Build flex meshes once when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group || status !== 'ready') return;\n\n const nflex = model.nflex ?? 0;\n if (nflex === 0) return;\n\n for (let f = 0; f < nflex; f++) {\n const vertAdr = model.flex_vertadr[f];\n const vertNum = model.flex_vertnum[f];\n\n if (vertNum === 0) continue;\n\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(vertNum * 3);\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n // Note: flex_faceadr/flex_facenum/flex_face may not be available in all MuJoCo WASM builds.\n // Without face data we render as a point cloud. If future WASM versions expose\n // face arrays, index-based triangle rendering can be added here.\n\n geometry.computeVertexNormals();\n\n let color = new THREE.Color(0.5, 0.5, 0.5);\n if (model.flex_rgba) {\n color = new THREE.Color(\n model.flex_rgba[4 * f],\n model.flex_rgba[4 * f + 1],\n model.flex_rgba[4 * f + 2],\n );\n }\n\n const material = new THREE.MeshStandardMaterial({\n color,\n roughness: 0.7,\n side: THREE.DoubleSide,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.userData.flexId = f;\n mesh.userData.vertAdr = vertAdr;\n mesh.userData.vertNum = vertNum;\n group.add(mesh);\n meshesRef.current.push(mesh);\n }\n\n return () => {\n for (const mesh of meshesRef.current) {\n group.remove(mesh);\n mesh.geometry.dispose();\n (mesh.material as THREE.Material).dispose();\n }\n meshesRef.current = [];\n };\n }, [status, mjModelRef]);\n\n // Update vertex positions every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !data.flexvert_xpos) return;\n\n for (const mesh of meshesRef.current) {\n const vertAdr = mesh.userData.vertAdr;\n const vertNum = mesh.userData.vertNum;\n const posAttr = mesh.geometry.getAttribute('position') as THREE.BufferAttribute;\n if (!posAttr) continue;\n\n for (let v = 0; v < vertNum; v++) {\n const srcIdx = (vertAdr + v) * 3;\n posAttr.setXYZ(v, data.flexvert_xpos[srcIdx], data.flexvert_xpos[srcIdx + 1], data.flexvert_xpos[srcIdx + 2]);\n }\n posAttr.needsUpdate = true;\n mesh.geometry.computeVertexNormals();\n }\n });\n\n if (status !== 'ready') return null;\n return <group {...props} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { GeomBuilder } from '../rendering/GeomBuilder';\nimport type { GeomInfo, MujocoModel } from '../types';\n\nexport interface InstancedGeomRendererProps extends Omit<ThreeElements['group'], 'ref'> {\n /** Only render geoms from this MuJoCo geom group. */\n geomGroup?: number;\n /** Predicate for selecting geoms. */\n filter?: (geom: GeomInfo) => boolean;\n /** Optional material override for every instanced batch. */\n material?: THREE.Material;\n /** Hide or show the instanced batches. */\n visible?: boolean;\n castShadow?: boolean;\n receiveShadow?: boolean;\n}\n\ninterface GeomBatch {\n key: string;\n geomIds: number[];\n geometry: THREE.BufferGeometry;\n material: THREE.Material;\n}\n\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\nconst _matrix = new THREE.Matrix4();\n\nfunction getGeomInfo(model: MujocoModel, geomId: number): GeomInfo {\n const size = model.geom_size.subarray(geomId * 3, geomId * 3 + 3);\n const type = model.geom_type[geomId];\n return {\n id: geomId,\n name: getName(model, model.name_geomadr[geomId]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `type-${type}`,\n size: [size[0], size[1], size[2]],\n bodyId: model.geom_bodyid[geomId],\n };\n}\n\nfunction geomSignature(model: MujocoModel, geomId: number): string {\n const type = model.geom_type[geomId];\n const size = Array.from(model.geom_size.subarray(geomId * 3, geomId * 3 + 3)).join(',');\n const mat = model.geom_matid[geomId];\n const data = model.geom_dataid[geomId];\n const rgba = Array.from(model.geom_rgba.subarray(geomId * 4, geomId * 4 + 4)).join(',');\n return [type, size, mat, data, rgba].join('|');\n}\n\nfunction firstMesh(object: THREE.Object3D): THREE.Mesh | null {\n if (object instanceof THREE.Mesh) return object;\n let mesh: THREE.Mesh | null = null;\n object.traverse((child) => {\n if (!mesh && child instanceof THREE.Mesh) mesh = child;\n });\n return mesh;\n}\n\nexport function InstancedGeomRenderer({\n geomGroup,\n filter,\n material,\n visible = true,\n castShadow = true,\n receiveShadow = true,\n ...groupProps\n}: InstancedGeomRendererProps = {}) {\n const { mjModelRef, mjDataRef, mujocoRef, status } = useMujocoContext();\n const meshRefs = useRef<(THREE.InstancedMesh | null)[]>([]);\n\n const batches = useMemo<GeomBatch[]>(() => {\n if (status !== 'ready') return [];\n const model = mjModelRef.current;\n if (!model) return [];\n\n const builder = new GeomBuilder(mujocoRef.current);\n const grouped = new Map<string, number[]>();\n\n for (let geomId = 0; geomId < model.ngeom; geomId++) {\n if (model.geom_group[geomId] === 3) continue;\n if (geomGroup !== undefined && model.geom_group[geomId] !== geomGroup) continue;\n const info = getGeomInfo(model, geomId);\n if (filter && !filter(info)) continue;\n const key = geomSignature(model, geomId);\n const ids = grouped.get(key);\n if (ids) ids.push(geomId);\n else grouped.set(key, [geomId]);\n }\n\n const next: GeomBatch[] = [];\n for (const [key, geomIds] of grouped) {\n if (geomIds.length < 2) continue;\n const object = builder.create(model, geomIds[0]);\n if (!object) continue;\n const mesh = firstMesh(object);\n if (!mesh) continue;\n const sourceMaterial = Array.isArray(mesh.material) ? mesh.material[0] : mesh.material;\n next.push({\n key,\n geomIds,\n geometry: mesh.geometry.clone(),\n material: material ?? sourceMaterial.clone(),\n });\n }\n\n return next;\n }, [filter, geomGroup, material, mjModelRef, mujocoRef, status]);\n\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !visible) return;\n\n batches.forEach((batch, batchIndex) => {\n const mesh = meshRefs.current[batchIndex];\n if (!mesh) return;\n batch.geomIds.forEach((geomId, instanceId) => {\n const p = geomId * 3;\n const r = geomId * 9;\n _matrix.set(\n data.geom_xmat[r], data.geom_xmat[r + 1], data.geom_xmat[r + 2], data.geom_xpos[p],\n data.geom_xmat[r + 3], data.geom_xmat[r + 4], data.geom_xmat[r + 5], data.geom_xpos[p + 1],\n data.geom_xmat[r + 6], data.geom_xmat[r + 7], data.geom_xmat[r + 8], data.geom_xpos[p + 2],\n 0, 0, 0, 1\n );\n mesh.setMatrixAt(instanceId, _matrix);\n });\n mesh.count = batch.geomIds.length;\n mesh.instanceMatrix.needsUpdate = true;\n });\n });\n\n if (status !== 'ready' || batches.length === 0) return null;\n\n return (\n <group {...groupProps} visible={visible}>\n {batches.map((batch, index) => (\n <instancedMesh\n key={batch.key}\n ref={(mesh) => { meshRefs.current[index] = mesh; }}\n args={[batch.geometry, batch.material, batch.geomIds.length]}\n castShadow={castShadow}\n receiveShadow={receiveShadow}\n frustumCulled={false}\n />\n ))}\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useContacts — structured contact query hook (spec 2.4)\n * useContactEvents — contact enter/exit events (spec 2.5)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName, getName } from '../core/SceneLoader';\nimport { getContact, withContacts } from '../types';\nimport type { Bodies, ContactInfo, MujocoModel } from '../types';\n\n// Cache geom names per model to avoid cross-model id collisions.\nconst geomNameCacheByModel = new WeakMap<MujocoModel, Map<number, string>>();\n\nfunction getGeomNameCached(model: MujocoModel, geomId: number): string {\n let perModel = geomNameCacheByModel.get(model);\n if (!perModel) {\n perModel = new Map<number, string>();\n geomNameCacheByModel.set(model, perModel);\n }\n\n let name = perModel.get(geomId);\n if (name === undefined) {\n name = getName(model, model.name_geomadr[geomId]);\n perModel.set(geomId, name);\n }\n return name;\n}\n\n/**\n * Track contacts for a specific body (or all contacts if no body specified).\n * Calls the callback every physics frame with current contact list.\n * Reads `data.ncon` first to avoid allocating for zero contacts.\n */\nexport function useContacts(\n bodyName?: Bodies,\n callback?: (contacts: ContactInfo[]) => void,\n): React.RefObject<ContactInfo[]> {\n const { mjModelRef, status } = useMujocoContext();\n const contactsRef = useRef<ContactInfo[]>([]);\n const bodyIdRef = useRef(-1);\n const bodyResolvedRef = useRef(false);\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n if (!bodyName) {\n bodyIdRef.current = -1;\n bodyResolvedRef.current = true;\n return;\n }\n bodyResolvedRef.current = false;\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, bodyName);\n bodyResolvedRef.current = true;\n }, [bodyName, status, mjModelRef]);\n\n useAfterPhysicsStep(({ model, data }) => {\n // Resolve body id lazily once model exists, to avoid missing the first ready frame.\n if (bodyName && !bodyResolvedRef.current) {\n bodyIdRef.current = findBodyByName(model, bodyName);\n bodyResolvedRef.current = true;\n }\n\n const ncon = data.ncon;\n if (ncon === 0) {\n if (contactsRef.current.length > 0) contactsRef.current = [];\n callbackRef.current?.([]);\n return;\n }\n\n const contacts: ContactInfo[] = [];\n const filterBody = bodyIdRef.current;\n\n withContacts(data, (contactArray) => {\n for (let i = 0; i < ncon; i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n // Filter by body if specified\n if (filterBody >= 0) {\n const b1 = model.geom_bodyid[c.geom1];\n const b2 = model.geom_bodyid[c.geom2];\n if (b1 !== filterBody && b2 !== filterBody) continue;\n }\n contacts.push({\n geom1: c.geom1,\n geom1Name: getGeomNameCached(model, c.geom1),\n geom2: c.geom2,\n geom2Name: getGeomNameCached(model, c.geom2),\n pos: [c.pos[0], c.pos[1], c.pos[2]],\n depth: c.dist,\n });\n }\n });\n contactsRef.current = contacts;\n callbackRef.current?.(contacts);\n });\n\n return contactsRef;\n}\n\n/**\n * Contact enter/exit events for a specific body (spec 2.5).\n * Tracks which geom pairs are in contact frame-to-frame and fires\n * onEnter/onExit callbacks on transitions.\n */\nexport function useContactEvents(\n bodyName: Bodies,\n handlers: {\n onEnter?: (info: ContactInfo) => void;\n onExit?: (info: ContactInfo) => void;\n },\n) {\n const prevPairsRef = useRef(new Set<string>());\n const onEnterRef = useRef(handlers.onEnter);\n const onExitRef = useRef(handlers.onExit);\n onEnterRef.current = handlers.onEnter;\n onExitRef.current = handlers.onExit;\n\n const prevContactMapRef = useRef(new Map<string, ContactInfo>());\n\n const onContacts = useCallback((contacts: ContactInfo[]) => {\n const currentPairs = new Set<string>();\n const currentMap = new Map<string, ContactInfo>();\n\n for (const c of contacts) {\n const key = `${Math.min(c.geom1, c.geom2)}_${Math.max(c.geom1, c.geom2)}`;\n currentPairs.add(key);\n currentMap.set(key, c);\n }\n\n // New contacts (enter)\n for (const key of currentPairs) {\n if (!prevPairsRef.current.has(key)) {\n onEnterRef.current?.(currentMap.get(key)!);\n }\n }\n\n // Lost contacts (exit)\n for (const key of prevPairsRef.current) {\n if (!currentPairs.has(key)) {\n const prev = prevContactMapRef.current.get(key);\n if (prev) onExitRef.current?.(prev);\n }\n }\n\n prevPairsRef.current = currentPairs;\n prevContactMapRef.current = currentMap;\n }, []);\n\n useContacts(bodyName, onContacts);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * ContactListener — component form of contact events (spec 2.5)\n */\n\nimport { useContactEvents } from '../hooks/useContacts';\nimport type { ContactListenerProps } from '../types';\n\n/**\n * Component form of useContactEvents.\n * Fires onContactEnter/onContactExit callbacks when contacts change.\n */\nexport function ContactListener({\n body,\n onContactEnter,\n onContactExit,\n}: ContactListenerProps) {\n useContactEvents(body, {\n onEnter: onContactEnter,\n onExit: onContactExit,\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryPlayer — trajectory playback/scrubbing (spec 13.2)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport type { PlaybackState, TrajectoryStateChangeInput, TrajectoryFrame, TrajectoryInput } from '../types';\n\nexport interface TrajectoryPlayerOptions {\n fps?: number;\n speed?: number;\n loop?: boolean;\n mode?: 'kinematic' | 'physics';\n onComplete?: () => void;\n onStateChange?: (input: TrajectoryStateChangeInput) => void;\n}\n\n/** Check if input is TrajectoryFrame[] (vs number[][]) */\nfunction isTrajectoryFrames(input: TrajectoryInput): input is TrajectoryFrame[] {\n return input.length > 0 && typeof (input[0] as TrajectoryFrame).time === 'number'\n && 'qpos' in (input[0] as TrajectoryFrame);\n}\n\n/** Extract qpos as plain number array from a frame */\nfunction getQpos(input: TrajectoryInput, idx: number): ArrayLike<number> | null {\n const item = input[idx];\n if (!item) return null;\n if (Array.isArray(item)) return item;\n return (item as TrajectoryFrame).qpos;\n}\n\n/** Extract ctrl values from a TrajectoryFrame, if available */\nfunction getCtrl(input: TrajectoryInput, idx: number): ArrayLike<number> | null {\n const item = input[idx];\n if (!item || Array.isArray(item)) return null;\n return (item as TrajectoryFrame).ctrl ?? null;\n}\n\n/**\n * Play back a trajectory, overriding simulation state.\n *\n * Accepts either `TrajectoryFrame[]` (from useTrajectoryRecorder) or\n * `number[][]` (raw qpos arrays).\n *\n * In `kinematic` mode (default), the simulation is paused and qpos is\n * set directly each frame with mj_forward for rendering.\n *\n * In `physics` mode, the simulation keeps running and ctrl values from\n * the trajectory are applied each physics step via useBeforePhysicsStep.\n */\nexport function useTrajectoryPlayer(\n trajectory: TrajectoryInput,\n options: TrajectoryPlayerOptions = {},\n) {\n const { mjModelRef, mjDataRef, mujocoRef, pausedRef } = useMujocoContext();\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const stateRef = useRef<PlaybackState>('idle');\n const frameRef = useRef(0);\n const lastFrameTimeRef = useRef(0);\n const speedRef = useRef(options.speed ?? 1.0);\n const wasPausedRef = useRef(false);\n\n // Stable ref to trajectory to avoid stale closures in useBeforePhysicsStep\n const trajectoryRef = useRef(trajectory);\n trajectoryRef.current = trajectory;\n\n const setState = useCallback((next: PlaybackState) => {\n if (stateRef.current === next) return;\n stateRef.current = next;\n optionsRef.current.onStateChange?.({ state: next });\n }, []);\n\n const play = useCallback(() => {\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n const mode = optionsRef.current.mode ?? 'kinematic';\n\n if (stateRef.current === 'completed') {\n frameRef.current = 0;\n }\n\n if (mode === 'kinematic') {\n wasPausedRef.current = pausedRef.current;\n pausedRef.current = true;\n }\n\n lastFrameTimeRef.current = performance.now();\n setState('playing');\n }, [pausedRef, setState]);\n\n const pause = useCallback(() => {\n if (stateRef.current !== 'playing') return;\n setState('paused');\n }, [setState]);\n\n const seek = useCallback((frameIdx: number) => {\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n frameRef.current = Math.max(0, Math.min(frameIdx, traj.length - 1));\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = getQpos(traj, frameRef.current);\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n }, [mjModelRef, mjDataRef, mujocoRef]);\n\n const reset = useCallback(() => {\n const mode = optionsRef.current.mode ?? 'kinematic';\n if (mode === 'kinematic' && stateRef.current !== 'idle') {\n pausedRef.current = wasPausedRef.current;\n }\n frameRef.current = 0;\n setState('idle');\n }, [pausedRef, setState]);\n\n const setSpeed = useCallback((s: number) => {\n speedRef.current = s;\n }, []);\n\n const complete = useCallback(() => {\n const mode = optionsRef.current.mode ?? 'kinematic';\n if (mode === 'kinematic') {\n pausedRef.current = wasPausedRef.current;\n }\n setState('completed');\n optionsRef.current.onComplete?.();\n }, [pausedRef, setState]);\n\n // --- Kinematic mode: drive qpos directly from useFrame ---\n useFrame(() => {\n if (stateRef.current !== 'playing') return;\n if ((optionsRef.current.mode ?? 'kinematic') !== 'kinematic') return;\n\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n const now = performance.now();\n const fps = optionsRef.current.fps ?? 30;\n const frameInterval = 1000 / (fps * speedRef.current);\n const elapsed = now - lastFrameTimeRef.current;\n\n if (elapsed < frameInterval) return;\n lastFrameTimeRef.current = now;\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = getQpos(traj, frameRef.current);\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n\n frameRef.current++;\n if (frameRef.current >= traj.length) {\n if (optionsRef.current.loop) {\n frameRef.current = 0;\n } else {\n complete();\n }\n }\n });\n\n // --- Physics mode: set ctrl values each physics step ---\n useBeforePhysicsStep(({ model, data }) => {\n if (stateRef.current !== 'playing') return;\n if ((optionsRef.current.mode ?? 'kinematic') !== 'physics') return;\n\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n // Advance frame based on sim time vs trajectory time\n const fps = optionsRef.current.fps ?? 30;\n const targetFrame = Math.floor(data.time * fps * speedRef.current);\n frameRef.current = Math.min(targetFrame, traj.length - 1);\n\n // Apply ctrl from trajectory\n const ctrl = getCtrl(traj, frameRef.current);\n if (ctrl) {\n for (let i = 0; i < Math.min(ctrl.length, model.nu); i++) {\n data.ctrl[i] = ctrl[i];\n }\n }\n\n // Check completion\n if (frameRef.current >= traj.length - 1) {\n if (optionsRef.current.loop) {\n // Reset sim time to restart\n data.time = 0;\n frameRef.current = 0;\n } else {\n complete();\n }\n }\n });\n\n return {\n play,\n pause,\n seek,\n reset,\n setSpeed,\n get state() { return stateRef.current; },\n get frame() { return frameRef.current; },\n get playing() { return stateRef.current === 'playing'; },\n get totalFrames() { return trajectory.length; },\n get progress() { return trajectory.length > 1 ? frameRef.current / (trajectory.length - 1) : 0; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TrajectoryPlayer — component form of trajectory playback (spec 13.2)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useTrajectoryPlayer } from '../hooks/useTrajectoryPlayer';\nimport type { TrajectoryPlayerProps } from '../types';\n\n/**\n * Component wrapper for useTrajectoryPlayer.\n * Provides declarative trajectory playback controlled via props.\n */\nexport function TrajectoryPlayer({\n trajectory,\n fps = 30,\n speed = 1.0,\n loop = false,\n playing = false,\n mode = 'kinematic',\n onFrame,\n onComplete,\n onStateChange,\n}: TrajectoryPlayerProps) {\n const player = useTrajectoryPlayer(trajectory, {\n fps,\n speed,\n loop,\n mode,\n onComplete,\n onStateChange,\n });\n const onFrameRef = useRef(onFrame);\n onFrameRef.current = onFrame;\n const lastReportedFrameRef = useRef(-1);\n\n useEffect(() => {\n player.setSpeed(speed);\n }, [speed, player]);\n\n useEffect(() => {\n if (playing) {\n player.play();\n } else {\n player.pause();\n }\n }, [playing, player]);\n\n useFrame(() => {\n if (!onFrameRef.current) return;\n const currentFrame = player.frame;\n if (currentFrame !== lastReportedFrameRef.current && player.playing) {\n lastReportedFrameRef.current = currentFrame;\n onFrameRef.current({\n frameIndex: currentFrame,\n frame: trajectory[currentFrame],\n });\n }\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { ActuatorInfo } from '../types';\n\n/**\n * Returns a stable array of actuator metadata for building control UIs.\n * Computed once when the model loads. Consumer reads/writes data.ctrl[id] directly.\n */\nexport function useActuators(): ActuatorInfo[] {\n const { mjModelRef, status } = useMujocoContext();\n\n return useMemo(() => {\n if (status !== 'ready') return [];\n const model = mjModelRef.current;\n if (!model) return [];\n\n const actuators: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const name = getName(model, model.name_actuatoradr[i]);\n const lo = model.actuator_ctrlrange[i * 2];\n const hi = model.actuator_ctrlrange[i * 2 + 1];\n const hasRange = lo < hi;\n const range: [number, number] = hasRange\n ? [lo, hi]\n : [-Infinity, Infinity];\n actuators.push({ id: i, name, range });\n }\n return actuators;\n }, [status, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { Sites, SitePositionResult } from '../types';\n\n// Preallocated temp for rotation matrix extraction\nconst _mat4 = new THREE.Matrix4();\n\n/**\n * Returns reactive refs for a MuJoCo site's world position and orientation.\n * Refs are updated every frame without triggering React re-renders.\n */\nexport function useSitePosition(siteName: Sites): SitePositionResult {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const siteIdRef = useRef(-1);\n const positionRef = useRef(new THREE.Vector3());\n const quaternionRef = useRef(new THREE.Quaternion());\n\n // Resolve site ID when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n return;\n }\n siteIdRef.current = findSiteByName(model, siteName);\n }, [siteName, status, mjModelRef]);\n\n // Update refs every frame\n useFrame(() => {\n const data = mjDataRef.current;\n const sid = siteIdRef.current;\n if (!data || sid < 0) return;\n\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n positionRef.current.set(\n data.site_xpos[i3],\n data.site_xpos[i3 + 1],\n data.site_xpos[i3 + 2]\n );\n\n const m = data.site_xmat;\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n quaternionRef.current.setFromRotationMatrix(_mat4);\n });\n\n return { position: positionRef, quaternion: quaternionRef };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useBeforePhysicsStep } from '../core/MujocoSimProvider';\n\n/**\n * Applies gravity compensation each physics frame by adding qfrc_bias\n * (gravity + Coriolis forces) to qfrc_applied for each DOF.\n *\n * The provider zeros qfrc_applied at the start of each frame, so this\n * hook (and DragInteraction) compose correctly — both add to a clean slate.\n */\nexport function useGravityCompensation(enabled = true): void {\n useBeforePhysicsStep(({ model, data }) => {\n if (!enabled) return;\n for (let i = 0; i < model.nv; i++) {\n data.qfrc_applied[i] += data.qfrc_bias[i];\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSensor / useSensors — MuJoCo sensor access hooks (spec 2.1)\n */\n\nimport { useEffect, useRef, useMemo } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { Sensors, SensorHandle, SensorInfo } from '../types';\n\n/**\n * Access a single MuJoCo sensor by name. Returns a `SensorHandle` with\n * `read()`, `dim`, and `name`. The backing array is updated every physics\n * frame without causing React re-renders.\n */\nexport function useSensor(name: Sensors): SensorHandle {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const sensorIdRef = useRef(-1);\n const sensorAdrRef = useRef(0);\n const sensorDimRef = useRef(0);\n const valueRef = useRef<Float64Array>(new Float64Array(0));\n\n // Resolve sensor ID once model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n for (let i = 0; i < model.nsensor; i++) {\n if (getName(model, model.name_sensoradr[i]) === name) {\n sensorIdRef.current = i;\n sensorAdrRef.current = model.sensor_adr[i];\n sensorDimRef.current = model.sensor_dim[i];\n valueRef.current = new Float64Array(model.sensor_dim[i]);\n return;\n }\n }\n sensorIdRef.current = -1;\n }, [name, status, mjModelRef]);\n\n // Update every frame after physics step\n useAfterPhysicsStep(({ data }) => {\n if (sensorIdRef.current < 0) return;\n const adr = sensorAdrRef.current;\n const dim = sensorDimRef.current;\n for (let i = 0; i < dim; i++) {\n valueRef.current[i] = data.sensordata[adr + i];\n }\n });\n\n return useMemo<SensorHandle>(() => ({\n read() {\n return valueRef.current;\n },\n get dim() {\n return sensorDimRef.current;\n },\n name,\n }), [name]);\n}\n\n/**\n * Enumerate all sensors in the loaded MuJoCo model.\n * Returns a stable array recomputed only when the model changes.\n */\nexport function useSensors(): SensorInfo[] {\n const { mjModelRef, status } = useMujocoContext();\n\n return useMemo(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return [];\n const SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'jointpos', 9: 'jointvel', 10: 'tendonpos', 11: 'tendonvel',\n 12: 'actuatorpos', 13: 'actuatorvel', 14: 'actuatorfrc',\n };\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, [mjModelRef, status]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useJointState — per-joint position/velocity access (spec 2.3)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type {\n ArrayJointStateResult,\n Joints,\n JointStateOptions,\n JointStateResult,\n ScalarJointStateResult,\n} from '../types';\n\n/**\n * Track a MuJoCo joint's position and velocity by name.\n * Values are updated every physics frame via refs (no re-renders).\n *\n * For hinge/slide joints, position/velocity are scalar numbers.\n * For ball joints, position is quat (4), velocity is angular vel (3).\n * For free joints, position is pos+quat (7), velocity is lin+ang vel (6).\n */\nexport function useJointState(name: Joints, options: { kind: 'scalar' }): ScalarJointStateResult;\nexport function useJointState(name: Joints, options: { kind: 'array' }): ArrayJointStateResult;\nexport function useJointState(name: Joints, options?: JointStateOptions): JointStateResult;\nexport function useJointState(name: Joints, options: JointStateOptions = {}): JointStateResult {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const jointIdRef = useRef(-1);\n const qposAdrRef = useRef(0);\n const dofAdrRef = useRef(0);\n const qposDimRef = useRef(1);\n const dofDimRef = useRef(1);\n const kindRef = useRef(options.kind ?? 'auto');\n kindRef.current = options.kind ?? 'auto';\n const positionRef = useRef<number | Float64Array>(0);\n const velocityRef = useRef<number | Float64Array>(0);\n // Preallocated typed arrays for multi-DOF joints\n const posBufferRef = useRef<Float64Array | null>(null);\n const velBufferRef = useRef<Float64Array | null>(null);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n for (let i = 0; i < model.njnt; i++) {\n if (getName(model, model.name_jntadr[i]) === name) {\n jointIdRef.current = i;\n qposAdrRef.current = model.jnt_qposadr[i];\n dofAdrRef.current = model.jnt_dofadr[i];\n const type = model.jnt_type[i];\n // Type 0=free (7 qpos, 6 dof), 1=ball (4 qpos, 3 dof), 2=slide (1,1), 3=hinge (1,1)\n if (type === 0) { qposDimRef.current = 7; dofDimRef.current = 6; }\n else if (type === 1) { qposDimRef.current = 4; dofDimRef.current = 3; }\n else { qposDimRef.current = 1; dofDimRef.current = 1; }\n\n // Preallocate buffers when callers request array output, or for multi-DOF joints.\n if (kindRef.current === 'array' || qposDimRef.current > 1) {\n posBufferRef.current = new Float64Array(qposDimRef.current);\n velBufferRef.current = new Float64Array(dofDimRef.current);\n } else {\n posBufferRef.current = null;\n velBufferRef.current = null;\n }\n return;\n }\n }\n jointIdRef.current = -1;\n }, [name, options.kind, status, mjModelRef]);\n\n useAfterPhysicsStep(({ data }) => {\n if (jointIdRef.current < 0) return;\n const qa = qposAdrRef.current;\n const da = dofAdrRef.current;\n if (kindRef.current === 'scalar' || (kindRef.current === 'auto' && qposDimRef.current === 1)) {\n positionRef.current = data.qpos[qa];\n velocityRef.current = data.qvel[da];\n } else {\n const posBuf = posBufferRef.current!;\n const velBuf = velBufferRef.current!;\n posBuf.set(data.qpos.subarray(qa, qa + qposDimRef.current));\n velBuf.set(data.qvel.subarray(da, da + dofDimRef.current));\n positionRef.current = posBuf;\n velocityRef.current = velBuf;\n }\n });\n\n return { position: positionRef, velocity: velocityRef };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useBodyState — per-body position/velocity tracking (spec 2.2)\n */\n\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { Bodies, BodyStateResult } from '../types';\n\n/**\n * Track a MuJoCo body's world position, quaternion, and velocities.\n * All values are ref-based — updated every physics frame without re-renders.\n */\nexport function useBodyState(name: Bodies): BodyStateResult {\n const { mjModelRef, status } = useMujocoContext();\n const bodyIdRef = useRef(-1);\n const position = useRef(new THREE.Vector3());\n const quaternion = useRef(new THREE.Quaternion());\n const linearVelocity = useRef(new THREE.Vector3());\n const angularVelocity = useRef(new THREE.Vector3());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n bodyIdRef.current = findBodyByName(model, name);\n }, [name, status, mjModelRef]);\n\n useAfterPhysicsStep(({ data }) => {\n const bid = bodyIdRef.current;\n if (bid < 0) return;\n\n // Position from xpos (3 per body)\n const i3 = bid * 3;\n position.current.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n\n // Quaternion from xquat (4 per body, MuJoCo order: w,x,y,z)\n const i4 = bid * 4;\n quaternion.current.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n\n // Velocity from cvel (6 per body: [angular(3), linear(3)])\n if (data.cvel) {\n const i6 = bid * 6;\n angularVelocity.current.set(data.cvel[i6], data.cvel[i6 + 1], data.cvel[i6 + 2]);\n linearVelocity.current.set(data.cvel[i6 + 3], data.cvel[i6 + 4], data.cvel[i6 + 5]);\n }\n });\n\n return { position, quaternion, linearVelocity, angularVelocity };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Ref-based world pose hooks for named MuJoCo bodies, geoms, and sites.\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport * as THREE from 'three';\nimport { useAfterPhysicsStep, useMujocoContext } from '../core/MujocoSimProvider';\nimport { findBodyByName, findGeomByName, findSiteByName } from '../core/SceneLoader';\nimport type { Bodies, Geoms, Sites } from '../types';\n\nexport type PoseResourceKind = 'body' | 'geom' | 'site';\n\nexport interface PoseReadout {\n id: RefObject<number>;\n found: RefObject<boolean>;\n position: RefObject<THREE.Vector3>;\n quaternion: RefObject<THREE.Quaternion>;\n}\n\nconst _matrix = new THREE.Matrix4();\n\nfunction quaternionFromMatrixArray(\n target: THREE.Quaternion,\n values: ArrayLike<number>,\n offset: number\n) {\n _matrix.set(\n values[offset], values[offset + 1], values[offset + 2], 0,\n values[offset + 3], values[offset + 4], values[offset + 5], 0,\n values[offset + 6], values[offset + 7], values[offset + 8], 0,\n 0, 0, 0, 1\n );\n target.setFromRotationMatrix(_matrix);\n}\n\nfunction quaternionFromMujocoQuat(\n target: THREE.Quaternion,\n values: ArrayLike<number>,\n offset: number\n) {\n target.set(\n values[offset + 1] ?? 0,\n values[offset + 2] ?? 0,\n values[offset + 3] ?? 0,\n values[offset] ?? 1\n );\n}\n\nfunction useNamedPose(kind: PoseResourceKind, name: string): PoseReadout {\n const { mjModelRef, status } = useMujocoContext();\n const idRef = useRef(-1);\n const foundRef = useRef(false);\n const positionRef = useRef(new THREE.Vector3());\n const quaternionRef = useRef(new THREE.Quaternion());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n idRef.current = -1;\n foundRef.current = false;\n return;\n }\n\n if (kind === 'body') idRef.current = findBodyByName(model, name);\n else if (kind === 'geom') idRef.current = findGeomByName(model, name);\n else idRef.current = findSiteByName(model, name);\n foundRef.current = idRef.current >= 0;\n }, [kind, name, status, mjModelRef]);\n\n useAfterPhysicsStep(({ data }) => {\n const id = idRef.current;\n if (id < 0) return;\n\n if (kind === 'body') {\n const p = id * 3;\n positionRef.current.set(data.xpos[p], data.xpos[p + 1], data.xpos[p + 2]);\n if (data.xmat) {\n quaternionFromMatrixArray(quaternionRef.current, data.xmat, id * 9);\n } else {\n quaternionFromMujocoQuat(quaternionRef.current, data.xquat, id * 4);\n }\n return;\n }\n\n if (kind === 'geom') {\n const p = id * 3;\n positionRef.current.set(data.geom_xpos[p], data.geom_xpos[p + 1], data.geom_xpos[p + 2]);\n quaternionFromMatrixArray(quaternionRef.current, data.geom_xmat, id * 9);\n return;\n }\n\n const p = id * 3;\n positionRef.current.set(data.site_xpos[p], data.site_xpos[p + 1], data.site_xpos[p + 2]);\n quaternionFromMatrixArray(quaternionRef.current, data.site_xmat, id * 9);\n });\n\n return {\n id: idRef,\n found: foundRef,\n position: positionRef,\n quaternion: quaternionRef,\n };\n}\n\nexport function useBodyPose(name: Bodies): PoseReadout {\n return useNamedPose('body', name);\n}\n\nexport function useGeomPose(name: Geoms): PoseReadout {\n return useNamedPose('geom', name);\n}\n\nexport function useSitePose(name: Sites): PoseReadout {\n return useNamedPose('site', name);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useCtrl — handle-based read/write access to a named actuator's ctrl value (spec 3.1)\n */\n\nimport { useEffect, useRef, useMemo } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport type { Actuators, CtrlHandle } from '../types';\n\n/**\n * Access a single actuator's control value by name.\n *\n * Returns a `CtrlHandle` with `read()` and `write()` methods that\n * operate directly on `data.ctrl` without causing React re-renders.\n */\nexport function useCtrl(name: Actuators): CtrlHandle {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const actuatorIdRef = useRef(-1);\n const rangeRef = useRef<[number, number]>([0, 0]);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n const id = findActuatorByName(model, name);\n actuatorIdRef.current = id;\n if (id >= 0) {\n rangeRef.current = [\n model.actuator_ctrlrange[id * 2],\n model.actuator_ctrlrange[id * 2 + 1],\n ];\n }\n }, [name, status, mjModelRef]);\n\n return useMemo<CtrlHandle>(() => ({\n read() {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return 0;\n return data.ctrl[actuatorIdRef.current];\n },\n write(value: number) {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return;\n data.ctrl[actuatorIdRef.current] = value;\n },\n name,\n get range(): [number, number] {\n return rangeRef.current;\n },\n }), [name, mjDataRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Cooperative actuator/control ownership for policies, IK, teleop, and replay.\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport type { ControlGroupInfo, ControlGroupSelector, MujocoData, MujocoModel } from '../types';\n\nexport interface ControlWriterConflict {\n actuatorIndex: number;\n owner: string;\n requestedBy: string;\n}\n\nexport interface ControlWriterOptions {\n owner: string;\n selector?: ControlGroupSelector;\n enabled?: boolean;\n warnOnConflict?: boolean;\n allowSameOwner?: boolean;\n onConflict?: (conflicts: ControlWriterConflict[]) => void;\n}\n\nexport interface ControlWriterWriteOptions {\n force?: boolean;\n}\n\nexport interface ControlWriterHandle {\n owner: string;\n group: RefObject<ControlGroupInfo | null>;\n conflicts: RefObject<ControlWriterConflict[]>;\n canWrite: () => boolean;\n read: () => Float64Array;\n write: (values: ArrayLike<number>, options?: ControlWriterWriteOptions) => boolean;\n release: () => void;\n}\n\ninterface ControlWriterClaim {\n owner: string;\n token: symbol;\n}\n\nconst claimsByModel = new WeakMap<MujocoModel, Map<number, ControlWriterClaim>>();\n\nfunction getClaims(model: MujocoModel) {\n let claims = claimsByModel.get(model);\n if (!claims) {\n claims = new Map();\n claimsByModel.set(model, claims);\n }\n return claims;\n}\n\nfunction releaseClaims(model: MujocoModel | null, token: symbol) {\n if (!model) return;\n const claims = claimsByModel.get(model);\n if (!claims) return;\n for (const [actuatorIndex, claim] of claims) {\n if (claim.token === token) claims.delete(actuatorIndex);\n }\n}\n\nexport function useControlWriter(options: ControlWriterOptions): ControlWriterHandle {\n const {\n owner,\n selector,\n enabled = true,\n warnOnConflict = true,\n allowSameOwner = true,\n onConflict,\n } = options;\n const { api, mjModelRef, mjDataRef, status } = useMujocoContext();\n const tokenRef = useRef(Symbol(owner));\n const claimedModelRef = useRef<MujocoModel | null>(null);\n const groupRef = useRef<ControlGroupInfo | null>(null);\n const conflictsRef = useRef<ControlWriterConflict[]>([]);\n const onConflictRef = useRef(onConflict);\n onConflictRef.current = onConflict;\n\n const release = useCallback(() => {\n releaseClaims(claimedModelRef.current, tokenRef.current);\n claimedModelRef.current = null;\n conflictsRef.current = [];\n }, []);\n\n useEffect(() => {\n release();\n if (!enabled || status !== 'ready') {\n groupRef.current = null;\n return;\n }\n\n const model = mjModelRef.current;\n if (!model) {\n groupRef.current = null;\n return;\n }\n\n const group = selector ? api.resolveControlGroup(selector) : api.getControlMap();\n groupRef.current = group;\n if (!group) return;\n\n const claims = getClaims(model);\n const conflicts: ControlWriterConflict[] = [];\n for (const actuatorIndex of group.ctrlAdr) {\n const existing = claims.get(actuatorIndex);\n if (\n existing &&\n existing.token !== tokenRef.current &&\n (!allowSameOwner || existing.owner !== owner)\n ) {\n conflicts.push({\n actuatorIndex,\n owner: existing.owner,\n requestedBy: owner,\n });\n }\n }\n\n conflictsRef.current = conflicts;\n if (conflicts.length > 0) {\n onConflictRef.current?.(conflicts);\n if (warnOnConflict) {\n console.warn(\n `[mujoco-react] Control writer \"${owner}\" conflicts with existing writer(s): ${conflicts\n .map((conflict) => `${conflict.actuatorIndex}:${conflict.owner}`)\n .join(', ')}`\n );\n }\n return;\n }\n\n for (const actuatorIndex of group.ctrlAdr) {\n claims.set(actuatorIndex, { owner, token: tokenRef.current });\n }\n claimedModelRef.current = model;\n\n return release;\n }, [allowSameOwner, api, enabled, mjModelRef, owner, release, selector, status, warnOnConflict]);\n\n const canWrite = useCallback(() => (\n enabled &&\n groupRef.current !== null &&\n conflictsRef.current.length === 0\n ), [enabled]);\n\n const read = useCallback(() => {\n const data = mjDataRef.current;\n const group = groupRef.current;\n if (!data || !group) return new Float64Array(0);\n return group.readCtrl(data);\n }, [mjDataRef]);\n\n const write = useCallback((values: ArrayLike<number>, writeOptions: ControlWriterWriteOptions = {}) => {\n const data: MujocoData | null = mjDataRef.current;\n const group = groupRef.current;\n if (!data || !group) return false;\n if (!writeOptions.force && !canWrite()) return false;\n group.writeCtrl(data, values);\n return true;\n }, [canWrite, mjDataRef]);\n\n return useMemo(() => ({\n owner,\n group: groupRef,\n conflicts: conflictsRef,\n canWrite,\n read,\n write,\n release,\n }), [canWrite, owner, read, release, write]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Typed, named control groups. Define the group once (like a zod schema or a\n * tanstack route), then read/set actuators by name with inferred keys — no\n * positional arrays, no `as const`, no owner bookkeeping.\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef } from 'react';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { useControlWriter, type ControlWriterOptions } from './useControlWriter';\nimport type { Actuators } from '../types';\n\n/**\n * A typed description of a set of actuators, keyed by name. Create it once with\n * {@link controlGroup} and reuse it across controllers and scripts; the key\n * union flows through to {@link useControlGroup}.\n */\nexport interface ControlGroup<K extends Actuators = Actuators> {\n readonly keys: readonly K[];\n}\n\n/**\n * Declare a named control group. With the Vite plugin / codegen active, names\n * are constrained to the model's registered actuators (a wrong or stale name is\n * a compile error). Without it, the literal names you pass are still inferred —\n * no `as const` required (the `const` type parameter captures them).\n */\nexport function controlGroup<const T extends readonly Actuators[]>(\n names: T\n): ControlGroup<T[number]> {\n return { keys: names };\n}\n\nexport interface ControlGroupSetOptions {\n /** Write even when another control writer owns one of these actuators. */\n force?: boolean;\n}\n\nexport interface ControlGroupHandle<K extends string> {\n /** The cooperative-ownership identity used for conflict detection. */\n owner: string;\n /** Set one or more actuators by name. Returns false if blocked by a conflict. */\n set(values: Partial<Record<K, number>>, options?: ControlGroupSetOptions): boolean;\n /** Read the current control value of every actuator in the group, by name. */\n read(): Record<K, number>;\n /** Whether this group can currently write (no unresolved conflicts). */\n canWrite(): boolean;\n /** Release this group's actuator ownership. */\n release(): void;\n}\n\nexport type UseControlGroupOptions = Omit<ControlWriterOptions, 'owner' | 'selector'> & {\n /** Override the auto-generated owner id (useful for readable conflict logs). */\n owner?: string;\n};\n\nexport function useControlGroup<K extends Actuators>(\n group: ControlGroup<K>,\n options: UseControlGroupOptions = {}\n): ControlGroupHandle<K> {\n const generatedOwner = useId();\n const owner = options.owner ?? `control-group:${generatedOwner}`;\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n\n const names = group.keys;\n const namesRef = useRef(names);\n namesRef.current = names;\n const namesKey = names.join('\u0000');\n\n // Cooperative ownership / conflict detection via the existing writer.\n const selector = useMemo(\n () => ({ actuators: [...names] as Actuators[] }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [namesKey]\n );\n const { canWrite, release } = useControlWriter({ ...options, owner, selector });\n\n // Direct name -> actuator index map: absolute and joint-topology independent,\n // so coupled actuators (e.g. a tendon gripper) still resolve by name.\n const indicesRef = useRef<number[]>([]);\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n indicesRef.current = [];\n return;\n }\n indicesRef.current = namesRef.current.map((name) => {\n const id = findActuatorByName(model, name);\n if (id < 0) {\n console.warn(`[mujoco-react] useControlGroup: actuator \"${name}\" was not found.`);\n }\n return id;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mjModelRef, status, namesKey]);\n\n const set = useCallback(\n (values: Partial<Record<K, number>>, setOptions: ControlGroupSetOptions = {}) => {\n const data = mjDataRef.current;\n if (!data) return false;\n if (!setOptions.force && !canWrite()) return false;\n const groupNames = namesRef.current;\n const indices = indicesRef.current;\n for (let i = 0; i < groupNames.length; i += 1) {\n const value = values[groupNames[i]];\n if (value === undefined) continue;\n const adr = indices[i];\n if (adr >= 0) data.ctrl[adr] = value;\n }\n return true;\n },\n [canWrite, mjDataRef]\n );\n\n const read = useCallback((): Record<K, number> => {\n const data = mjDataRef.current;\n const groupNames = namesRef.current;\n const indices = indicesRef.current;\n const result = {} as Record<K, number>;\n for (let i = 0; i < groupNames.length; i += 1) {\n const adr = indices[i];\n result[groupNames[i]] = data && adr >= 0 ? data.ctrl[adr] ?? 0 : 0;\n }\n return result;\n }, [mjDataRef]);\n\n return useMemo(\n () => ({ owner, set, read, canWrite, release }),\n [owner, set, read, canWrite, release]\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Bounded contact history for rollout verification and debugging.\n */\n\nimport { useCallback, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport { useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { getContact, withContacts } from '../types';\nimport type { ContactInfo, MujocoModel } from '../types';\n\nexport interface ContactHistoryEntry extends ContactInfo {\n time: number;\n body1: number;\n body1Name: string;\n body2: number;\n body2Name: string;\n}\n\nexport interface ContactHistoryOptions {\n maxLength?: number;\n bodyNames?: readonly string[];\n geomNames?: readonly string[];\n includeWorldBody?: boolean;\n}\n\nexport interface ContactHistoryHandle {\n entries: RefObject<ContactHistoryEntry[]>;\n clear: () => void;\n countPair: (nameA: string, nameB: string) => number;\n}\n\nconst geomNameCacheByModel = new WeakMap<MujocoModel, Map<number, string>>();\nconst bodyNameCacheByModel = new WeakMap<MujocoModel, Map<number, string>>();\n\nfunction getCachedName(\n cacheByModel: WeakMap<MujocoModel, Map<number, string>>,\n model: MujocoModel,\n id: number,\n address: number\n) {\n if (id < 0) return '';\n let cache = cacheByModel.get(model);\n if (!cache) {\n cache = new Map();\n cacheByModel.set(model, cache);\n }\n let name = cache.get(id);\n if (name === undefined) {\n name = getName(model, address);\n cache.set(id, name);\n }\n return name;\n}\n\nfunction matchesFilter(\n entry: ContactHistoryEntry,\n bodyNames: readonly string[] | undefined,\n geomNames: readonly string[] | undefined,\n includeWorldBody: boolean\n) {\n if (!includeWorldBody && (entry.body1 === 0 || entry.body2 === 0)) return false;\n if (\n bodyNames &&\n !bodyNames.includes(entry.body1Name) &&\n !bodyNames.includes(entry.body2Name)\n ) {\n return false;\n }\n if (\n geomNames &&\n !geomNames.includes(entry.geom1Name) &&\n !geomNames.includes(entry.geom2Name)\n ) {\n return false;\n }\n return true;\n}\n\nexport function useContactHistory(options: ContactHistoryOptions = {}): ContactHistoryHandle {\n const entriesRef = useRef<ContactHistoryEntry[]>([]);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const clear = useCallback(() => {\n entriesRef.current = [];\n }, []);\n\n const countPair = useCallback((nameA: string, nameB: string) => {\n let count = 0;\n for (const entry of entriesRef.current) {\n const matchesBodies =\n (entry.body1Name === nameA && entry.body2Name === nameB) ||\n (entry.body1Name === nameB && entry.body2Name === nameA);\n const matchesGeoms =\n (entry.geom1Name === nameA && entry.geom2Name === nameB) ||\n (entry.geom1Name === nameB && entry.geom2Name === nameA);\n if (matchesBodies || matchesGeoms) count += 1;\n }\n return count;\n }, []);\n\n useAfterPhysicsStep(({ model, data }) => {\n if ((data.ncon ?? 0) <= 0) return;\n\n const {\n maxLength = 2000,\n bodyNames,\n geomNames,\n includeWorldBody = false,\n } = optionsRef.current;\n if (maxLength <= 0) return;\n\n const nextEntries: ContactHistoryEntry[] = [];\n withContacts(data, (contacts) => {\n for (let index = 0; index < data.ncon; index += 1) {\n const contact = getContact(contacts, index);\n if (!contact) break;\n const body1 = model.geom_bodyid[contact.geom1] ?? -1;\n const body2 = model.geom_bodyid[contact.geom2] ?? -1;\n const entry: ContactHistoryEntry = {\n geom1: contact.geom1,\n geom2: contact.geom2,\n geom1Name: getCachedName(geomNameCacheByModel, model, contact.geom1, model.name_geomadr[contact.geom1]),\n geom2Name: getCachedName(geomNameCacheByModel, model, contact.geom2, model.name_geomadr[contact.geom2]),\n body1,\n body2,\n body1Name: body1 >= 0 ? getCachedName(bodyNameCacheByModel, model, body1, model.name_bodyadr[body1]) : '',\n body2Name: body2 >= 0 ? getCachedName(bodyNameCacheByModel, model, body2, model.name_bodyadr[body2]) : '',\n pos: [contact.pos[0], contact.pos[1], contact.pos[2]],\n depth: contact.dist,\n time: data.time,\n };\n if (matchesFilter(entry, bodyNames, geomNames, includeWorldBody)) {\n nextEntries.push(entry);\n }\n }\n });\n\n if (nextEntries.length === 0) return;\n entriesRef.current.push(...nextEntries);\n if (entriesRef.current.length > maxLength) {\n entriesRef.current.splice(0, entriesRef.current.length - maxLength);\n }\n });\n\n return {\n entries: entriesRef,\n clear,\n countPair,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useKeyboardTeleop — keyboard teleoperation hook (spec 12.1)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport type { KeyboardTeleopConfig } from '../types';\n\n/**\n * Map keyboard keys to actuator commands.\n *\n * Supports three binding modes:\n * - `delta`: Add delta to actuator value while key is held\n * - `toggle`: Toggle between two values on key press\n * - `set`: Set actuator to a fixed value while key is held\n */\nexport function useKeyboardTeleop(config: KeyboardTeleopConfig) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const pressedRef = useRef(new Set<string>());\n const toggleStateRef = useRef(new Map<string, boolean>());\n const enabledRef = useRef(config.enabled ?? true);\n enabledRef.current = config.enabled ?? true;\n\n // Resolve actuator IDs\n const bindingsRef = useRef(config.bindings);\n bindingsRef.current = config.bindings;\n\n // Actuator ID cache\n const actuatorCacheRef = useRef(new Map<string, number>());\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n const cache = new Map<string, number>();\n for (const binding of Object.values(config.bindings)) {\n if (!cache.has(binding.actuator)) {\n cache.set(binding.actuator, findActuatorByName(model, binding.actuator));\n }\n }\n actuatorCacheRef.current = cache;\n }, [config.bindings, status, mjModelRef]);\n\n // Key event listeners\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (!enabledRef.current) return;\n const key = e.key.toLowerCase();\n if (bindingsRef.current[key]) {\n pressedRef.current.add(key);\n // Handle toggle on keydown\n const binding = bindingsRef.current[key];\n if (binding.toggle) {\n const current = toggleStateRef.current.get(key) ?? false;\n toggleStateRef.current.set(key, !current);\n }\n }\n };\n const onKeyUp = (e: KeyboardEvent) => {\n pressedRef.current.delete(e.key.toLowerCase());\n };\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('keyup', onKeyUp);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('keyup', onKeyUp);\n };\n }, []);\n\n // Apply bindings each physics frame\n useBeforePhysicsStep(({ data }) => {\n if (!enabledRef.current) return;\n const bindings = bindingsRef.current;\n const cache = actuatorCacheRef.current;\n\n for (const [key, binding] of Object.entries(bindings)) {\n const actId = cache.get(binding.actuator);\n if (actId === undefined || actId < 0) continue;\n\n if (binding.toggle) {\n // Toggle mode: set value based on toggle state\n const state = toggleStateRef.current.get(key) ?? false;\n data.ctrl[actId] = state ? binding.toggle[1] : binding.toggle[0];\n } else if (pressedRef.current.has(key)) {\n if (binding.delta !== undefined) {\n // Delta mode: add delta while held\n data.ctrl[actId] += binding.delta;\n } else if (binding.set !== undefined) {\n // Set mode: set fixed value while held\n data.ctrl[actId] = binding.set;\n }\n }\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport { useEffect, useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport type { KeyboardIkTargetAction, KeyboardIkTargetBinding, KeyboardIkTargetConfig } from '../types';\n\nconst DEFAULT_TRANSLATE_SPEED = 0.25;\nconst DEFAULT_ROTATE_SPEED = 1.0;\n\nconst _translation = new THREE.Vector3();\nconst _axis = new THREE.Vector3();\nconst _quat = new THREE.Quaternion();\n\nfunction actionSign(action: KeyboardIkTargetAction): 1 | -1 {\n return action.endsWith('+') ? 1 : -1;\n}\n\nfunction actionBase(action: KeyboardIkTargetAction) {\n return action.slice(0, -1);\n}\n\nfunction applyRotation(\n target: THREE.Object3D,\n action: KeyboardIkTargetAction,\n amount: number,\n frame: 'world' | 'target',\n) {\n const base = actionBase(action);\n if (base === 'pitch') {\n _axis.set(1, 0, 0);\n } else if (base === 'yaw') {\n _axis.set(0, 1, 0);\n } else if (base === 'roll') {\n _axis.set(0, 0, 1);\n } else {\n return;\n }\n\n _quat.setFromAxisAngle(_axis, amount);\n if (frame === 'target') {\n target.quaternion.multiply(_quat);\n } else {\n target.quaternion.premultiply(_quat);\n }\n}\n\nfunction addTranslation(action: KeyboardIkTargetAction, amount: number) {\n switch (action) {\n case 'x+':\n _translation.x += amount;\n break;\n case 'x-':\n _translation.x -= amount;\n break;\n case 'y+':\n _translation.y += amount;\n break;\n case 'y-':\n _translation.y -= amount;\n break;\n case 'z+':\n _translation.z += amount;\n break;\n case 'z-':\n _translation.z -= amount;\n break;\n }\n}\n\n/**\n * Moves an existing IK target from keyboard input.\n *\n * This hook is intentionally robot-agnostic: it only edits the target owned by\n * `useIkController`, then lets the normal IK solver write robot controls.\n */\nexport function useKeyboardIkTarget(config: KeyboardIkTargetConfig | null) {\n const pressedRef = useRef(new Set<string>());\n const wasActiveRef = useRef(false);\n const configRef = useRef(config);\n configRef.current = config;\n\n const boundCodes = useMemo(() => {\n return new Set((config?.bindings ?? []).map((binding) => binding.code));\n }, [config?.bindings]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n const current = configRef.current;\n if (!current || current.enabled === false || !boundCodes.has(event.code)) return;\n if (current.preventDefault !== false) event.preventDefault();\n pressedRef.current.add(event.code);\n };\n const onKeyUp = (event: KeyboardEvent) => {\n const current = configRef.current;\n if (boundCodes.has(event.code) && current?.preventDefault !== false) {\n event.preventDefault();\n }\n pressedRef.current.delete(event.code);\n };\n const onBlur = () => {\n pressedRef.current.clear();\n wasActiveRef.current = false;\n };\n\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('keyup', onKeyUp);\n window.addEventListener('blur', onBlur);\n\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('keyup', onKeyUp);\n window.removeEventListener('blur', onBlur);\n };\n }, [boundCodes]);\n\n useFrame((_state, delta) => {\n const current = configRef.current;\n const controller = current?.controller;\n if (!current || current.enabled === false || !controller) {\n wasActiveRef.current = false;\n return;\n }\n\n const activeBindings: KeyboardIkTargetBinding[] = [];\n for (const binding of current.bindings) {\n if (pressedRef.current.has(binding.code)) activeBindings.push(binding);\n }\n\n if (activeBindings.length === 0) {\n wasActiveRef.current = false;\n return;\n }\n\n if (!wasActiveRef.current) {\n if (current.syncOnStart !== false) controller.syncTargetToSite();\n if (current.autoEnableIk !== false && !controller.ikEnabledRef.current) {\n controller.setIkEnabled(true);\n }\n }\n wasActiveRef.current = true;\n\n const target = controller.ikTargetRef.current;\n if (!target) return;\n\n const frame = current.frame ?? 'world';\n _translation.set(0, 0, 0);\n\n for (const binding of activeBindings) {\n const translateSpeed = binding.translateSpeed ?? current.translateSpeed ?? DEFAULT_TRANSLATE_SPEED;\n const rotateSpeed = binding.rotateSpeed ?? current.rotateSpeed ?? DEFAULT_ROTATE_SPEED;\n const amount = actionSign(binding.action) * delta;\n const base = actionBase(binding.action);\n\n if (base === 'x' || base === 'y' || base === 'z') {\n addTranslation(binding.action, translateSpeed * delta);\n } else {\n applyRotation(target, binding.action, rotateSpeed * amount, frame);\n }\n }\n\n if (_translation.lengthSq() > 0) {\n if (frame === 'target') _translation.applyQuaternion(target.quaternion);\n target.position.add(_translation);\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * usePolicy — policy decimation loop hook (spec 10.1)\n */\n\nimport { useCallback, useMemo, useRef } from 'react';\nimport { useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport type { PolicyAPI, PolicyConfig, PolicyInferenceOutput, PolicyVector } from '../types';\n\ntype PendingPolicyAction = {\n action: PolicyVector;\n observation: PolicyVector;\n};\n\nfunction isPromiseLike(value: unknown): value is Promise<PolicyInferenceOutput> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n\nfunction isPolicyActionChunk(value: PolicyInferenceOutput): value is readonly PolicyVector[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n (Array.isArray(value[0]) || ArrayBuffer.isView(value[0]))\n );\n}\n\nfunction toPolicyActions(output: PolicyInferenceOutput): PolicyVector[] {\n return isPolicyActionChunk(output) ? [...output] : [output];\n}\n\nfunction enqueuePolicyActions(\n queue: PendingPolicyAction[],\n actions: PolicyVector[],\n observation: PolicyVector,\n strategy: PolicyConfig['queueStrategy']\n) {\n if (strategy === 'replace') {\n queue.splice(0, queue.length);\n }\n queue.push(...actions.map((action) => ({ action, observation })));\n}\n\n/**\n * Framework-agnostic policy execution hook.\n *\n * Manages a decimation loop: calls `onObservation` to build observations\n * at the specified frequency, then calls `onAction` to apply the policy output.\n * The actual inference (ONNX, TF.js, custom) is the consumer's responsibility.\n *\n * @param config Policy configuration\n * @returns { step, isRunning } control handles\n */\nexport function usePolicy(config: PolicyConfig): PolicyAPI {\n const lastActionTimeRef = useRef(0);\n const lastObservationRef = useRef<ReturnType<PolicyConfig['onObservation']> | null>(null);\n const lastActionRef = useRef<Float32Array | Float64Array | number[] | null>(null);\n const actionQueueRef = useRef<PendingPolicyAction[]>([]);\n const inFlightRef = useRef(false);\n const lastErrorRef = useRef<unknown>(null);\n const epochRef = useRef(0);\n const isRunningRef = useRef(config.enabled ?? true);\n const configRef = useRef(config);\n configRef.current = config;\n isRunningRef.current = config.enabled ?? isRunningRef.current;\n\n const clearQueue = useCallback(() => {\n epochRef.current += 1;\n actionQueueRef.current.splice(0, actionQueueRef.current.length);\n inFlightRef.current = false;\n lastErrorRef.current = null;\n }, []);\n\n const reset = useCallback(() => {\n clearQueue();\n lastActionTimeRef.current = 0;\n lastObservationRef.current = null;\n lastActionRef.current = null;\n }, [clearQueue]);\n\n useBeforePhysicsStep(({ model, data }) => {\n if (!isRunningRef.current) return;\n\n const cfg = configRef.current;\n const dt = model.opt?.timestep ?? 0.002;\n const interval = 1.0 / cfg.frequency;\n\n // Check if it's time for a new action\n if (data.time - lastActionTimeRef.current >= interval) {\n const queuedAction = actionQueueRef.current.shift();\n if (queuedAction) {\n cfg.onAction({\n action: queuedAction.action,\n observation: queuedAction.observation,\n model,\n data,\n });\n lastActionTimeRef.current = data.time;\n lastActionRef.current = queuedAction.action;\n }\n\n const prefetchThreshold = cfg.prefetchThreshold ?? 0;\n const shouldInfer = !inFlightRef.current && (!queuedAction || actionQueueRef.current.length <= prefetchThreshold);\n if (!shouldInfer) return;\n\n // Build observation\n const observation = cfg.onObservation({ model, data });\n const queuedActions = actionQueueRef.current.length;\n const result = cfg.infer\n ? cfg.infer({ observation, model, data, queuedActions })\n : observation;\n\n if (isPromiseLike(result)) {\n const epoch = epochRef.current;\n inFlightRef.current = true;\n result\n .then((output) => {\n if (epoch !== epochRef.current) return;\n enqueuePolicyActions(\n actionQueueRef.current,\n toPolicyActions(output),\n observation,\n cfg.queueStrategy ?? 'append'\n );\n lastErrorRef.current = null;\n })\n .catch((error: unknown) => {\n if (epoch !== epochRef.current) return;\n lastErrorRef.current = error;\n cfg.onError?.(error);\n })\n .finally(() => {\n if (epoch !== epochRef.current) return;\n inFlightRef.current = false;\n });\n } else {\n const actions = toPolicyActions(result);\n if (queuedAction) {\n enqueuePolicyActions(\n actionQueueRef.current,\n actions,\n observation,\n cfg.queueStrategy ?? 'append'\n );\n } else {\n const [action, ...queuedActions] = actions;\n if (!action) return;\n enqueuePolicyActions(\n actionQueueRef.current,\n queuedActions,\n observation,\n cfg.queueStrategy ?? 'append'\n );\n // Apply action. If `infer` is omitted, this preserves the legacy inline-controller path.\n cfg.onAction({ action, observation, model, data });\n lastActionRef.current = action;\n }\n }\n\n lastActionTimeRef.current = data.time;\n lastObservationRef.current = observation;\n }\n });\n\n return useMemo(() => ({\n get isRunning() { return isRunningRef.current; },\n start: () => { isRunningRef.current = true; },\n stop: () => {\n isRunningRef.current = false;\n if (configRef.current.clearQueueOnStop) reset();\n },\n clearQueue,\n reset,\n get inFlight() { return inFlightRef.current; },\n get queuedActions() { return actionQueueRef.current.length; },\n get lastObservation() { return lastObservationRef.current; },\n get lastAction() { return lastActionRef.current; },\n get lastError() { return lastErrorRef.current; },\n }), [clearQueue, reset]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useRemotePolicy — HTTP JSON inference wrapper around usePolicy.\n */\n\nimport { useMemo, useRef } from 'react';\nimport { usePolicy } from './usePolicy';\nimport type {\n PolicyInferenceOutput,\n PolicyVector,\n RemotePolicyAPI,\n RemotePolicyConfig,\n RemotePolicyRequestInput,\n RemotePolicyResponseInfo,\n RemotePolicyStatus,\n} from '../types';\n\nfunction now() {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n\nfunction isAbortError(error: unknown) {\n return (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException && error.name === 'AbortError'\n ) || (\n error instanceof Error && error.name === 'AbortError'\n );\n}\n\nfunction createAbortError(message: string) {\n if (typeof DOMException !== 'undefined') {\n return new DOMException(message, 'AbortError');\n }\n const error = new Error(message);\n error.name = 'AbortError';\n return error;\n}\n\nfunction abortController(controller: AbortController | null, reason?: unknown) {\n if (!controller || controller.signal.aborted) return;\n if (reason !== undefined) {\n controller.abort(reason);\n } else {\n controller.abort();\n }\n}\n\nfunction createMergedAbortSignal(\n localSignal: AbortSignal,\n externalSignal: AbortSignal | undefined\n) {\n if (!externalSignal) return localSignal;\n if (externalSignal.aborted) {\n const controller = new AbortController();\n abortController(controller, externalSignal.reason);\n return controller.signal;\n }\n if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.any === 'function') {\n return AbortSignal.any([localSignal, externalSignal]);\n }\n\n const controller = new AbortController();\n const abortFromLocal = () => abortController(controller, localSignal.reason);\n const abortFromExternal = () => abortController(controller, externalSignal.reason);\n localSignal.addEventListener('abort', abortFromLocal, { once: true });\n externalSignal.addEventListener('abort', abortFromExternal, { once: true });\n return controller.signal;\n}\n\nfunction vectorToArray(vector: PolicyVector) {\n return Array.from(vector, (value) => Number(value));\n}\n\nfunction isPolicyVectorArray(value: unknown): value is PolicyVector[] {\n return (\n Array.isArray(value) &&\n value.every((entry) => Array.isArray(entry) || ArrayBuffer.isView(entry))\n );\n}\n\nfunction isPolicyVector(value: unknown): value is PolicyVector {\n return Array.isArray(value) || ArrayBuffer.isView(value);\n}\n\nfunction defaultBuildRemotePolicyRequest(input: RemotePolicyRequestInput) {\n const observation = vectorToArray(input.observation);\n return {\n observation,\n state: observation,\n time: input.data.time,\n reset: input.reset,\n };\n}\n\nasync function defaultReadRemotePolicyResponse(response: Response) {\n const text = await response.text();\n if (text.length === 0) return null;\n return JSON.parse(text);\n}\n\nfunction defaultParseRemotePolicyResponse(responseBody: unknown): PolicyInferenceOutput {\n if (responseBody && typeof responseBody === 'object') {\n const body = responseBody as {\n action?: unknown;\n actions?: unknown;\n error?: unknown;\n };\n\n if (typeof body.error === 'string' && body.error.length > 0) {\n throw new Error(body.error);\n }\n\n if (isPolicyVectorArray(body.actions) && body.actions.length > 0) {\n return body.actions;\n }\n\n if (isPolicyVector(body.action)) {\n return body.action;\n }\n }\n\n if (isPolicyVectorArray(responseBody) && responseBody.length > 0) {\n return responseBody;\n }\n\n if (isPolicyVector(responseBody)) {\n return responseBody;\n }\n\n throw new Error('Remote policy response must include `action` or `actions`.');\n}\n\nfunction createHttpError(response: Response, responseBody: unknown) {\n const suffix =\n responseBody && typeof responseBody === 'object' && 'error' in responseBody\n ? `: ${String((responseBody as { error?: unknown }).error)}`\n : '';\n return new Error(`Remote policy request failed with HTTP ${response.status}${suffix}`);\n}\n\n/**\n * Run a policy whose inference step lives behind an HTTP JSON endpoint.\n *\n * The hook keeps `usePolicy` responsible for timing, queueing, and pause/reset\n * behavior. This wrapper only builds requests, parses responses, and exposes\n * request metadata for HUDs and debugging.\n */\nexport function useRemotePolicy(config: RemotePolicyConfig): RemotePolicyAPI {\n const configRef = useRef(config);\n configRef.current = config;\n const requestCountRef = useRef(0);\n const responseCountRef = useRef(0);\n const remoteStatusRef = useRef<RemotePolicyStatus>('idle');\n const lastRequestBodyRef = useRef<unknown>(null);\n const lastResponseBodyRef = useRef<unknown>(null);\n const lastHttpStatusRef = useRef<number | null>(null);\n const lastRequestMsRef = useRef<number | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const remoteEpochRef = useRef(0);\n\n const policy = usePolicy({\n ...config,\n infer: async ({ observation, model, data, queuedActions }) => {\n const cfg = configRef.current;\n abortController(abortControllerRef.current, createAbortError('Remote policy request was superseded.'));\n const controller = new AbortController();\n abortControllerRef.current = controller;\n const signal = createMergedAbortSignal(controller.signal, cfg.signal);\n const remoteEpoch = remoteEpochRef.current;\n const requestIndex = requestCountRef.current;\n const requestInput: RemotePolicyRequestInput = {\n observation,\n model,\n data,\n queuedActions,\n reset: requestIndex === 0,\n requestIndex,\n signal,\n };\n requestCountRef.current += 1;\n\n const requestStartedAt = now();\n const body = await (\n cfg.buildRequest?.(requestInput) ?? defaultBuildRemotePolicyRequest(requestInput)\n );\n signal.throwIfAborted();\n if (remoteEpoch !== remoteEpochRef.current) {\n throw createAbortError('Remote policy request was reset.');\n }\n lastRequestBodyRef.current = body;\n remoteStatusRef.current = 'requesting';\n cfg.onRequest?.({\n ...requestInput,\n body,\n requestStartedAt,\n });\n\n let response: Response | null = null;\n let responseBody: unknown = null;\n try {\n const headers = new Headers(cfg.headers);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n const fetcher = cfg.fetcher ?? fetch;\n response = await fetcher(String(cfg.endpoint), {\n ...cfg.requestInit,\n method: cfg.method ?? 'POST',\n credentials: cfg.credentials,\n headers,\n signal,\n body: typeof body === 'string' ? body : JSON.stringify(body),\n });\n if (remoteEpoch === remoteEpochRef.current) {\n lastHttpStatusRef.current = response.status;\n }\n responseBody = await (\n cfg.readResponse?.(response) ?? defaultReadRemotePolicyResponse(response)\n );\n signal.throwIfAborted();\n if (remoteEpoch !== remoteEpochRef.current) {\n throw createAbortError('Remote policy request was reset.');\n }\n lastResponseBodyRef.current = responseBody;\n\n if (!response.ok) {\n throw createHttpError(response, responseBody);\n }\n\n const responseFinishedAt = now();\n const info: RemotePolicyResponseInfo = {\n ...requestInput,\n body,\n requestStartedAt,\n response,\n responseBody,\n responseFinishedAt,\n requestMs: responseFinishedAt - requestStartedAt,\n };\n if (remoteEpoch === remoteEpochRef.current) {\n lastRequestMsRef.current = info.requestMs;\n responseCountRef.current += 1;\n }\n cfg.onResponse?.(info);\n const output = await (\n cfg.parseResponse?.(responseBody, info) ??\n defaultParseRemotePolicyResponse(responseBody)\n );\n if (remoteEpoch === remoteEpochRef.current) {\n remoteStatusRef.current = 'ready';\n }\n return output;\n } catch (error) {\n if (response && remoteEpoch === remoteEpochRef.current) {\n lastHttpStatusRef.current = response.status;\n }\n if (isAbortError(error) || signal.aborted) {\n if (remoteEpoch === remoteEpochRef.current) {\n remoteStatusRef.current = 'aborted';\n }\n throw error;\n }\n if (remoteEpoch === remoteEpochRef.current) {\n remoteStatusRef.current = 'error';\n }\n throw error;\n } finally {\n if (abortControllerRef.current === controller) {\n abortControllerRef.current = null;\n }\n }\n },\n });\n\n return useMemo(() => {\n const abort = (reason?: unknown) => {\n abortController(abortControllerRef.current, reason);\n if (abortControllerRef.current) {\n remoteStatusRef.current = 'aborted';\n }\n };\n const resetRemoteState = () => {\n remoteEpochRef.current += 1;\n abort(createAbortError('Remote policy request was reset.'));\n requestCountRef.current = 0;\n responseCountRef.current = 0;\n remoteStatusRef.current = 'idle';\n lastRequestBodyRef.current = null;\n lastResponseBodyRef.current = null;\n lastHttpStatusRef.current = null;\n lastRequestMsRef.current = null;\n };\n\n return {\n get isRunning() { return policy.isRunning; },\n start: policy.start,\n stop: () => {\n if (configRef.current.abortOnStop ?? true) {\n abort(createAbortError('Remote policy request was stopped.'));\n }\n policy.stop();\n if (configRef.current.clearQueueOnStop) {\n resetRemoteState();\n }\n },\n clearQueue: policy.clearQueue,\n abort,\n reset: () => {\n resetRemoteState();\n policy.reset();\n },\n get inFlight() { return policy.inFlight; },\n get queuedActions() { return policy.queuedActions; },\n get lastObservation() { return policy.lastObservation; },\n get lastAction() { return policy.lastAction; },\n get lastError() { return policy.lastError; },\n get remoteStatus() { return remoteStatusRef.current; },\n get requestCount() { return requestCountRef.current; },\n get responseCount() { return responseCountRef.current; },\n get lastRequestBody() { return lastRequestBodyRef.current; },\n get lastResponseBody() { return lastResponseBodyRef.current; },\n get lastHttpStatus() { return lastHttpStatusRef.current; },\n get lastRequestMs() { return lastRequestMsRef.current; },\n };\n }, [policy]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo, useRef } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { buildObservation } from '../core/ObservationBuilder';\nimport type { ObservationConfig, ObservationHandle, ObservationResult } from '../types';\n\nconst EMPTY_OBSERVATION: ObservationResult = {\n values: new Float32Array(0),\n layout: [],\n};\n\n/**\n * Live observation reader for policy loops and telemetry.\n *\n * The handle is stable; call `read()` inside callbacks to sample the latest\n * MuJoCo model/data state without forcing React renders.\n */\nexport function useObservation(config: ObservationConfig): ObservationHandle {\n const { mjModelRef, mjDataRef } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n\n return useMemo(() => ({\n read() {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return EMPTY_OBSERVATION;\n return buildObservation(model, data, configRef.current);\n },\n readValues() {\n return this.read().values;\n },\n }), [mjDataRef, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Named policy observation builders with layout and units metadata.\n */\n\nimport type {\n Bodies,\n Geoms,\n MujocoData,\n MujocoModel,\n ObservationOutput,\n Sites,\n} from './types';\nimport { findBodyByName, findGeomByName, findSiteByName } from './core/SceneLoader';\n\nexport type NamedObservationMissing = 'skip' | 'zeros' | 'throw';\n\nexport interface NamedObservationInput {\n model: MujocoModel;\n data: MujocoData;\n}\n\nexport interface NamedObservationField {\n name: string;\n size: number;\n units?: string;\n read: (input: NamedObservationInput) => ArrayLike<number> | number | null | undefined;\n}\n\nexport interface NamedObservationLayoutItem {\n name: string;\n start: number;\n size: number;\n units?: string;\n}\n\nexport interface NamedObservationOptions {\n fields: readonly NamedObservationField[];\n output?: ObservationOutput;\n missing?: NamedObservationMissing;\n}\n\nexport interface NamedObservationResult {\n values: Float32Array | Float64Array;\n layout: NamedObservationLayoutItem[];\n}\n\nfunction pushValues(target: number[], value: ArrayLike<number> | number, size: number) {\n if (typeof value === 'number') {\n target.push(value);\n for (let index = 1; index < size; index += 1) target.push(0);\n return;\n }\n\n for (let index = 0; index < size; index += 1) {\n target.push(Number(value[index] ?? 0));\n }\n}\n\nexport function readNamedObservation(\n model: MujocoModel,\n data: MujocoData,\n options: NamedObservationOptions\n): NamedObservationResult {\n const values: number[] = [];\n const layout: NamedObservationLayoutItem[] = [];\n const missing = options.missing ?? 'skip';\n\n for (const field of options.fields) {\n const start = values.length;\n const value = field.read({ model, data });\n if (value === null || value === undefined) {\n if (missing === 'skip') continue;\n if (missing === 'throw') {\n throw new Error(`Unable to read named observation field \"${field.name}\".`);\n }\n for (let index = 0; index < field.size; index += 1) values.push(0);\n } else {\n pushValues(values, value, field.size);\n }\n layout.push({\n name: field.name,\n start,\n size: field.size,\n units: field.units,\n });\n }\n\n return {\n values: options.output === 'float64'\n ? new Float64Array(values)\n : new Float32Array(values),\n layout,\n };\n}\n\nexport function createNamedObservationBuilder(options: NamedObservationOptions) {\n return (model: MujocoModel, data: MujocoData) => (\n readNamedObservation(model, data, options)\n );\n}\n\nexport function qposField(name: string, index: number, units = 'qpos'): NamedObservationField {\n return {\n name,\n size: 1,\n units,\n read: ({ data }) => data.qpos[index],\n };\n}\n\nexport function qvelField(name: string, index: number, units = 'qvel'): NamedObservationField {\n return {\n name,\n size: 1,\n units,\n read: ({ data }) => data.qvel[index],\n };\n}\n\nexport function ctrlField(name: string, index: number, units = 'ctrl'): NamedObservationField {\n return {\n name,\n size: 1,\n units,\n read: ({ data }) => data.ctrl[index],\n };\n}\n\nexport function bodyPositionField(name: Bodies, units = 'world_position'): NamedObservationField {\n return {\n name: `body:${name}:xpos`,\n size: 3,\n units,\n read: ({ model, data }) => {\n const bodyId = findBodyByName(model, name);\n if (bodyId < 0) return null;\n const offset = bodyId * 3;\n return data.xpos.subarray(offset, offset + 3);\n },\n };\n}\n\nexport function geomPositionField(name: Geoms, units = 'world_position'): NamedObservationField {\n return {\n name: `geom:${name}:xpos`,\n size: 3,\n units,\n read: ({ model, data }) => {\n const geomId = findGeomByName(model, name);\n if (geomId < 0) return null;\n const offset = geomId * 3;\n return data.geom_xpos.subarray(offset, offset + 3);\n },\n };\n}\n\nexport function sitePositionField(name: Sites, units = 'world_position'): NamedObservationField {\n return {\n name: `site:${name}:xpos`,\n size: 3,\n units,\n read: ({ model, data }) => {\n const siteId = findSiteByName(model, name);\n if (siteId < 0) return null;\n const offset = siteId * 3;\n return data.site_xpos.subarray(offset, offset + 3);\n },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Stable React handle for named policy observations.\n */\n\nimport { useMemo, useRef } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { readNamedObservation } from '../policyObservation';\nimport type {\n NamedObservationOptions,\n NamedObservationResult,\n} from '../policyObservation';\n\nconst EMPTY_NAMED_OBSERVATION: NamedObservationResult = {\n values: new Float32Array(0),\n layout: [],\n};\n\nexport interface NamedObservationHandle {\n read: () => NamedObservationResult;\n readValues: () => Float32Array | Float64Array;\n}\n\nexport function useNamedObservation(options: NamedObservationOptions): NamedObservationHandle {\n const { mjModelRef, mjDataRef } = useMujocoContext();\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n return useMemo(() => ({\n read() {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return EMPTY_NAMED_OBSERVATION;\n return readNamedObservation(model, data, optionsRef.current);\n },\n readValues() {\n return this.read().values;\n },\n }), [mjDataRef, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryRecorder — trajectory recording hook (spec 13.1)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport type { TrajectoryFrame } from '../types';\n\ninterface RecorderOptions {\n fields?: ('qpos' | 'qvel' | 'ctrl' | 'sensordata')[];\n}\n\n/**\n * Record simulation trajectories for analysis, replay, or training data.\n */\nexport function useTrajectoryRecorder(options: RecorderOptions = {}) {\n const { mjModelRef } = useMujocoContext();\n const recordingRef = useRef(false);\n const framesRef = useRef<TrajectoryFrame[]>([]);\n const fields = options.fields ?? ['qpos'];\n\n useAfterPhysicsStep(({ data }) => {\n if (!recordingRef.current) return;\n\n const frame: TrajectoryFrame = {\n time: data.time,\n qpos: new Float64Array(data.qpos),\n };\n\n if (fields.includes('qvel')) frame.qvel = new Float64Array(data.qvel);\n if (fields.includes('ctrl')) frame.ctrl = new Float64Array(data.ctrl);\n if (fields.includes('sensordata') && data.sensordata) {\n frame.sensordata = new Float64Array(data.sensordata);\n }\n\n framesRef.current.push(frame);\n });\n\n const start = useCallback(() => {\n framesRef.current = [];\n recordingRef.current = true;\n }, []);\n\n const stop = useCallback(() => {\n recordingRef.current = false;\n return framesRef.current;\n }, []);\n\n const downloadJSON = useCallback(() => {\n const frames = framesRef.current;\n const data = frames.map(f => ({\n time: f.time,\n qpos: Array.from(f.qpos),\n ...(f.qvel ? { qvel: Array.from(f.qvel) } : {}),\n ...(f.ctrl ? { ctrl: Array.from(f.ctrl) } : {}),\n ...(f.sensordata ? { sensordata: Array.from(f.sensordata) } : {}),\n }));\n const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'trajectory.json';\n a.click();\n URL.revokeObjectURL(url);\n }, []);\n\n const downloadCSV = useCallback(() => {\n const frames = framesRef.current;\n if (frames.length === 0) return;\n const nq = frames[0].qpos.length;\n const headers = ['time', ...Array.from({ length: nq }, (_, i) => `qpos_${i}`)];\n const rows = frames.map(f =>\n [f.time, ...Array.from(f.qpos)].join(',')\n );\n const csv = [headers.join(','), ...rows].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'trajectory.csv';\n a.click();\n URL.revokeObjectURL(url);\n }, []);\n\n return {\n start,\n stop,\n downloadJSON,\n downloadCSV,\n get recording() { return recordingRef.current; },\n get frameCount() { return framesRef.current.length; },\n get frames() { return framesRef.current; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useGamepad — gamepad teleoperation hook (spec 12.2)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\n\ninterface GamepadConfig {\n /** Map gamepad axis index to actuator name. */\n axes?: Record<number, string>;\n /** Map gamepad button index to actuator name. */\n buttons?: Record<number, string>;\n /** Axis deadzone. Default: 0.1. */\n deadzone?: number;\n /** Scale factor for axis values. Default: 1.0. */\n scale?: number;\n /** Gamepad index. Default: 0 (first connected). */\n gamepadIndex?: number;\n enabled?: boolean;\n}\n\n/**\n * Map gamepad axes and buttons to actuator controls.\n * Axes map their -1..1 value (scaled) to the actuator.\n * Buttons map their 0..1 pressed value to the actuator.\n */\nexport function useGamepad(config: GamepadConfig) {\n const { mjModelRef, status } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n\n // Cache actuator IDs\n const axisCacheRef = useRef(new Map<number, number>());\n const buttonCacheRef = useRef(new Map<number, number>());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n axisCacheRef.current.clear();\n buttonCacheRef.current.clear();\n for (const [idx, name] of Object.entries(config.axes ?? {})) {\n axisCacheRef.current.set(Number(idx), findActuatorByName(model, name));\n }\n for (const [idx, name] of Object.entries(config.buttons ?? {})) {\n buttonCacheRef.current.set(Number(idx), findActuatorByName(model, name));\n }\n }, [config.axes, config.buttons, status, mjModelRef]);\n\n useBeforePhysicsStep(({ data }) => {\n const cfg = configRef.current;\n if (cfg.enabled === false) return;\n\n const gamepads = navigator.getGamepads?.();\n if (!gamepads) return;\n const gp = gamepads[cfg.gamepadIndex ?? 0];\n if (!gp) return;\n\n const deadzone = cfg.deadzone ?? 0.1;\n const scale = cfg.scale ?? 1.0;\n\n for (const [axisIdx, actId] of axisCacheRef.current) {\n if (actId < 0 || axisIdx >= gp.axes.length) continue;\n let val = gp.axes[axisIdx];\n if (Math.abs(val) < deadzone) val = 0;\n data.ctrl[actId] = val * scale;\n }\n\n for (const [btnIdx, actId] of buttonCacheRef.current) {\n if (actId < 0 || btnIdx >= gp.buttons.length) continue;\n data.ctrl[actId] = gp.buttons[btnIdx].value;\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useVideoRecorder — canvas video recording hook (spec 13.3)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useThree } from '@react-three/fiber';\n\ninterface VideoRecorderOptions {\n fps?: number;\n mimeType?: string;\n}\n\n/**\n * Record the R3F canvas to a video file using MediaRecorder.\n */\nexport function useVideoRecorder(options: VideoRecorderOptions = {}) {\n const { gl } = useThree();\n const recorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const recordingRef = useRef(false);\n\n const start = useCallback(() => {\n const canvas = gl.domElement;\n const fps = options.fps ?? 30;\n const mimeType = options.mimeType ?? 'video/webm';\n\n const stream = canvas.captureStream(fps);\n const recorder = new MediaRecorder(stream, {\n mimeType: MediaRecorder.isTypeSupported(mimeType) ? mimeType : 'video/webm',\n });\n\n chunksRef.current = [];\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunksRef.current.push(e.data);\n };\n\n recorder.start();\n recorderRef.current = recorder;\n recordingRef.current = true;\n }, [gl, options.fps, options.mimeType]);\n\n const stop = useCallback((): Promise<Blob> => {\n return new Promise((resolve) => {\n const recorder = recorderRef.current;\n if (!recorder || recorder.state === 'inactive') {\n resolve(new Blob([]));\n return;\n }\n\n recorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: recorder.mimeType });\n chunksRef.current = [];\n recordingRef.current = false;\n recorderRef.current = null;\n resolve(blob);\n };\n\n recorder.stop();\n });\n }, []);\n\n const download = useCallback(async (filename = 'recording.webm') => {\n const blob = await stop();\n if (blob.size === 0) return;\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }, [stop]);\n\n return {\n start,\n stop,\n download,\n get recording() { return recordingRef.current; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * React state wrapper around MuJoCo/R3F offscreen camera-frame capture.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport type {\n CameraFrameCaptureAPI,\n CameraFrameCaptureOptions,\n FrameCaptureStatus,\n} from '../types';\n\nexport function useCameraFrameCapture(\n defaultOptions: CameraFrameCaptureOptions = {}\n): CameraFrameCaptureAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback(\n async (options: CameraFrameCaptureOptions = {}) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for camera frame capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await mujoco.api.captureCameraFrame({\n ...defaultOptions,\n ...options,\n });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture the requested camera frame.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n const captureBlob = useCallback(\n async (options: CameraFrameCaptureOptions = {}) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for camera frame capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await mujoco.api.captureCameraFrameBlob({\n ...defaultOptions,\n ...options,\n });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture the requested camera frame.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n captureBlob,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Helpers for turning Three/MuJoCo camera captures into policy image payloads.\n */\n\nimport type {\n CameraFrameCaptureResult,\n MujocoSimAPI,\n PolicyCameraFrameCaptureOptions,\n PolicyCameraFrameCaptureResult,\n PolicyCameraFrameStream,\n} from './types';\nimport {\n createMountedCameraFrameSequencePlan,\n type MountedCameraFrameSequenceCameraOptions,\n type MountedCameraFrameSequenceDefaults,\n type MountedCameraFrameSequencePlan,\n type ResolveMountedCameraFrameSourceOptions,\n} from './rendering/cameraFrameSource';\n\nexport type PolicyCameraFrameCaptureTarget = Pick<MujocoSimAPI, 'captureCameraFrame'>;\nexport type PolicyCameraFramePlanTarget = Pick<MujocoSimAPI, 'getCameras' | 'getSites' | 'getBodies'>;\n\nexport type PolicyCameraFrameStreamOptions =\n Partial<Omit<PolicyCameraFrameStream, 'key'>> &\n MountedCameraFrameSequenceCameraOptions & {\n /** Additional policy payload keys that should receive this stream's data URL. */\n aliases?: readonly string[];\n};\n\nexport interface CreatePolicyCameraFrameCapturePlanOptions\n extends Omit<\n ResolveMountedCameraFrameSourceOptions,\n 'cameras' | 'sites' | 'bodies'\n > {\n cameraKeys: readonly string[];\n cameras?: ResolveMountedCameraFrameSourceOptions['cameras'];\n sites?: ResolveMountedCameraFrameSourceOptions['sites'];\n bodies?: ResolveMountedCameraFrameSourceOptions['bodies'];\n defaults?: MountedCameraFrameSequenceDefaults;\n streamOptions?: Record<string, PolicyCameraFrameStreamOptions>;\n includeObservationImageAliases?: boolean;\n requireAll?: boolean;\n}\n\nexport interface PolicyCameraFrameCapturePlan\n extends PolicyCameraFrameCaptureOptions {\n cameraKeys: string[];\n streams: PolicyCameraFrameStream[];\n mountedPlan: MountedCameraFrameSequencePlan;\n missingKeys: string[];\n}\n\nfunction addPolicyImageAliases(\n images: Record<string, string>,\n stream: PolicyCameraFrameStream,\n frame: CameraFrameCaptureResult,\n includeObservationImageAliases: boolean\n) {\n const keys = new Set<string>();\n keys.add(stream.key);\n for (const alias of stream.aliases ?? []) keys.add(alias);\n if (includeObservationImageAliases) {\n keys.add(`observation.images.${stream.key}`);\n for (const alias of stream.aliases ?? []) {\n keys.add(`observation.images.${alias}`);\n }\n }\n for (const key of keys) {\n images[key] = frame.dataUrl;\n }\n}\n\nfunction describeFrameSource(key: string, frame: CameraFrameCaptureResult) {\n return `${key}:${frame.source.kind}`;\n}\n\nfunction hasExplicitPolicyCameraSource(\n options: PolicyCameraFrameStreamOptions | undefined\n) {\n return Boolean(\n options?.camera ||\n options?.position ||\n options?.quaternion ||\n options?.source\n );\n}\n\nexport function createPolicyCameraFrameCapturePlan(\n options: CreatePolicyCameraFrameCapturePlanOptions\n): PolicyCameraFrameCapturePlan {\n const {\n cameraKeys,\n defaults,\n streamOptions,\n includeObservationImageAliases,\n requireAll,\n ...sourceOptions\n } = options;\n const mountedPlan = createMountedCameraFrameSequencePlan(cameraKeys, {\n ...sourceOptions,\n defaults,\n cameraOptions: streamOptions as\n | Record<string, MountedCameraFrameSequenceCameraOptions>\n | undefined,\n });\n const streams: PolicyCameraFrameStream[] = [];\n const missingKeys = new Set(mountedPlan.missingKeys);\n\n for (const key of cameraKeys) {\n const perStreamOptions = streamOptions?.[key];\n if (hasExplicitPolicyCameraSource(perStreamOptions)) {\n missingKeys.delete(key);\n streams.push({\n ...defaults,\n ...perStreamOptions,\n key,\n aliases: perStreamOptions?.aliases,\n });\n continue;\n }\n\n const mountedCamera = mountedPlan.cameras.find((camera) => camera.key === key);\n if (!mountedCamera) continue;\n const { key: _mountedKey, ...captureOptions } = mountedCamera;\n streams.push({\n ...captureOptions,\n key,\n aliases: perStreamOptions?.aliases,\n });\n }\n\n const result: PolicyCameraFrameCapturePlan = {\n cameraKeys: [...cameraKeys],\n streams,\n includeObservationImageAliases,\n mountedPlan,\n missingKeys: [...missingKeys],\n };\n\n if (requireAll && result.missingKeys.length > 0) {\n throw new Error(\n `Unable to resolve policy camera stream${\n result.missingKeys.length === 1 ? '' : 's'\n } for ${result.missingKeys.join(', ')}.`\n );\n }\n\n return result;\n}\n\nexport function createPolicyCameraFrameCapturePlanFromApi(\n api: PolicyCameraFramePlanTarget,\n options: Omit<CreatePolicyCameraFrameCapturePlanOptions, 'cameras' | 'sites' | 'bodies'>\n): PolicyCameraFrameCapturePlan {\n return createPolicyCameraFrameCapturePlan({\n ...options,\n cameras: api.getCameras(),\n sites: api.getSites(),\n bodies: api.getBodies(),\n });\n}\n\nexport async function capturePolicyCameraFrames(\n target: PolicyCameraFrameCaptureTarget,\n options: PolicyCameraFrameCaptureOptions\n): Promise<PolicyCameraFrameCaptureResult> {\n const includeObservationImageAliases =\n options.includeObservationImageAliases ?? true;\n\n const entries = await Promise.all(\n options.streams.map(async ({ key, aliases, ...captureOptions }) => {\n const frame = await target.captureCameraFrame(captureOptions);\n return [key, { frame, aliases }] as const;\n })\n );\n\n const frames: Record<string, CameraFrameCaptureResult> = {};\n const images: Record<string, string> = {};\n const sourceParts: string[] = [];\n\n for (const [key, { frame, aliases }] of entries) {\n const stream = { key, aliases };\n frames[key] = frame;\n addPolicyImageAliases(\n images,\n stream,\n frame,\n includeObservationImageAliases\n );\n sourceParts.push(describeFrameSource(key, frame));\n }\n\n return {\n frames,\n images,\n sourceSummary: sourceParts.length > 0\n ? sourceParts.join(' + ')\n : 'not used by policy',\n capturedAt: Date.now(),\n };\n}\n\nexport async function capturePolicyCameraFramesFromMountedStreams(\n target: PolicyCameraFrameCaptureTarget & PolicyCameraFramePlanTarget,\n options: Omit<CreatePolicyCameraFrameCapturePlanOptions, 'cameras' | 'sites' | 'bodies'>\n): Promise<PolicyCameraFrameCaptureResult & { plan: PolicyCameraFrameCapturePlan }> {\n const plan = createPolicyCameraFrameCapturePlanFromApi(target, options);\n const result = await capturePolicyCameraFrames(target, plan);\n return { ...result, plan };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * React wrapper for capturing policy image payloads from Three/MuJoCo cameras.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport {\n capturePolicyCameraFrames,\n capturePolicyCameraFramesFromMountedStreams,\n} from '../policyCameraFrames';\nimport type {\n CreatePolicyCameraFrameCapturePlanOptions,\n PolicyCameraFrameCapturePlan,\n} from '../policyCameraFrames';\nimport type {\n FrameCaptureStatus,\n PolicyCameraFrameCaptureAPI,\n PolicyCameraFrameCaptureOptions,\n PolicyCameraFrameCaptureResult,\n} from '../types';\n\nexport type MountedPolicyCameraFrameCaptureOptions = Omit<\n CreatePolicyCameraFrameCapturePlanOptions,\n 'cameras' | 'sites' | 'bodies'\n>;\n\nexport interface MountedPolicyCameraFrameCaptureAPI {\n status: FrameCaptureStatus;\n error: Error | null;\n isCapturing: boolean;\n capture: (\n options?: Partial<MountedPolicyCameraFrameCaptureOptions>\n ) => Promise<PolicyCameraFrameCaptureResult & { plan: PolicyCameraFrameCapturePlan }>;\n reset: () => void;\n}\n\nfunction mergePolicyCameraFrameCaptureOptions(\n defaultOptions: MountedPolicyCameraFrameCaptureOptions,\n options: Partial<MountedPolicyCameraFrameCaptureOptions>\n): MountedPolicyCameraFrameCaptureOptions {\n return {\n ...defaultOptions,\n ...options,\n cameraKeys: options.cameraKeys ?? defaultOptions.cameraKeys,\n aliases: {\n ...defaultOptions.aliases,\n ...options.aliases,\n },\n defaults: {\n ...defaultOptions.defaults,\n ...options.defaults,\n },\n streamOptions: {\n ...defaultOptions.streamOptions,\n ...options.streamOptions,\n },\n };\n}\n\nexport function usePolicyCameraFrames(\n defaultOptions: PolicyCameraFrameCaptureOptions\n): PolicyCameraFrameCaptureAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback(\n async (options: Partial<PolicyCameraFrameCaptureOptions> = {}) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for policy camera capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await capturePolicyCameraFrames(mujoco.api, {\n ...defaultOptions,\n ...options,\n streams: options.streams ?? defaultOptions.streams,\n });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture policy camera frames.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n reset,\n };\n}\n\nexport function usePolicyCameraFramesFromMountedStreams(\n defaultOptions: MountedPolicyCameraFrameCaptureOptions\n): MountedPolicyCameraFrameCaptureAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback(\n async (options: Partial<MountedPolicyCameraFrameCaptureOptions> = {}) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for mounted policy camera capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await capturePolicyCameraFramesFromMountedStreams(\n mujoco.api,\n mergePolicyCameraFrameCaptureOptions(defaultOptions, options)\n );\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture mounted policy camera frames.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Capture policy observation tensors directly from Three/MuJoCo cameras,\n * skipping the data-URL/PNG round-trip. Sessions are created once per camera\n * and reused every step, so live inference and dataset recording read straight\n * from the GPU into Float32 tensors.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport { createPolicyCameraFrameCapturePlanFromApi } from '../policyCameraFrames';\nimport type { MountedPolicyCameraFrameCaptureOptions } from './usePolicyCameraFrames';\nimport type {\n CameraFrameCaptureSession,\n CameraFrameCaptureTensorOptions,\n CameraFrameTensorResult,\n} from '../rendering/cameraFrameCapture';\nimport type { FrameCaptureStatus } from '../types';\n\nexport interface PolicyCameraTensorStream extends CameraFrameCaptureTensorOptions {\n /** Payload key this stream's tensor is stored under. */\n key: string;\n /** Additional payload keys that should reference the same tensor. */\n aliases?: readonly string[];\n}\n\nexport interface PolicyCameraTensorsOptions {\n streams: PolicyCameraTensorStream[];\n /** Also expose tensors under `observation.images.<key>` aliases. Defaults to `false`. */\n includeObservationImageAliases?: boolean;\n}\n\nexport interface PolicyCameraTensorsResult {\n tensors: Record<string, CameraFrameTensorResult>;\n sourceSummary: string;\n capturedAt: number;\n}\n\nexport interface PolicyCameraTensorsAPI {\n status: FrameCaptureStatus;\n error: Error | null;\n isCapturing: boolean;\n /** Synchronously render and convert every stream into a policy image tensor. */\n capture: () => PolicyCameraTensorsResult;\n reset: () => void;\n}\n\nexport type MountedPolicyCameraTensorOptions = MountedPolicyCameraFrameCaptureOptions & {\n tensor?: Pick<\n CameraFrameCaptureTensorOptions,\n 'width' | 'height' | 'channels' | 'layout' | 'range'\n >;\n};\n\ntype SessionEntry = {\n session: CameraFrameCaptureSession;\n signature: string;\n};\n\nfunction sessionSignature(stream: PolicyCameraTensorStream): string {\n return JSON.stringify({\n width: stream.width,\n height: stream.height,\n channels: stream.channels,\n renderIsolation: stream.renderIsolation ?? false,\n cameraName: stream.cameraName,\n siteName: stream.siteName,\n bodyName: stream.bodyName,\n });\n}\n\nfunction addTensorAliases(\n tensors: Record<string, CameraFrameTensorResult>,\n stream: PolicyCameraTensorStream,\n tensor: CameraFrameTensorResult,\n includeObservationImageAliases: boolean\n) {\n const keys = new Set<string>([stream.key, ...(stream.aliases ?? [])]);\n if (includeObservationImageAliases) {\n for (const base of [stream.key, ...(stream.aliases ?? [])]) {\n keys.add(`observation.images.${base}`);\n }\n }\n for (const key of keys) tensors[key] = tensor;\n}\n\nexport function usePolicyCameraTensors(\n options: PolicyCameraTensorsOptions\n): PolicyCameraTensorsAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const sessionsRef = useRef<Map<string, SessionEntry>>(new Map());\n\n const disposeSessions = useCallback(() => {\n for (const { session } of sessionsRef.current.values()) session.dispose();\n sessionsRef.current.clear();\n }, []);\n\n useEffect(() => disposeSessions, [disposeSessions]);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback((): PolicyCameraTensorsResult => {\n const api = mujoco.api;\n if (!api) {\n throw new Error('MuJoCo scene is not ready for policy camera tensor capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const sessions = sessionsRef.current;\n const seen = new Set<string>();\n const tensors: Record<string, CameraFrameTensorResult> = {};\n const sourceParts: string[] = [];\n\n for (const stream of options.streams) {\n seen.add(stream.key);\n const resolved: CameraFrameCaptureTensorOptions = {\n ...api.resolveCameraCaptureOptions(stream),\n channels: stream.channels,\n layout: stream.layout,\n range: stream.range,\n };\n\n const signature = sessionSignature(stream);\n let entry = sessions.get(stream.key);\n if (!entry || entry.signature !== signature) {\n entry?.session.dispose();\n entry = {\n session: api.createCameraFrameCaptureSession(resolved),\n signature,\n };\n sessions.set(stream.key, entry);\n }\n\n const tensor = entry.session.captureTensor(resolved);\n addTensorAliases(\n tensors,\n stream,\n tensor,\n options.includeObservationImageAliases ?? false\n );\n sourceParts.push(`${stream.key}:${tensor.source.kind}`);\n }\n\n // Drop sessions for streams that are no longer requested.\n for (const key of [...sessions.keys()]) {\n if (!seen.has(key)) {\n sessions.get(key)?.session.dispose();\n sessions.delete(key);\n }\n }\n\n setStatus('captured');\n return {\n tensors,\n sourceSummary: sourceParts.join(' + ') || 'not used by policy',\n capturedAt: Date.now(),\n };\n } catch (nextError) {\n const captureError =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture policy camera tensors.');\n setError(captureError);\n setStatus('error');\n throw captureError;\n }\n }, [mujoco.api, options.includeObservationImageAliases, options.streams]);\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n reset,\n };\n}\n\nexport function usePolicyCameraTensorsFromMountedStreams(\n options: MountedPolicyCameraTensorOptions\n): PolicyCameraTensorsAPI {\n const mujoco = useMujoco();\n const tensorOptions = options.tensor;\n const mountedOptions = useMemo<PolicyCameraTensorsOptions>(() => {\n const api = mujoco.api;\n if (!api) {\n return {\n streams: [],\n includeObservationImageAliases: options.includeObservationImageAliases ?? false,\n };\n }\n\n const plan = createPolicyCameraFrameCapturePlanFromApi(api, options);\n return {\n streams: plan.streams.map(({ key, aliases, ...stream }) => ({\n ...stream,\n ...tensorOptions,\n key,\n aliases,\n })),\n includeObservationImageAliases: plan.includeObservationImageAliases ?? false,\n };\n }, [mujoco.api, options, tensorOptions]);\n\n return usePolicyCameraTensors(mountedOptions);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * React state wrapper around fixed-camera simulation sequence recording.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport type {\n CameraFrameSequenceOptions,\n CameraFrameSequenceRecorderAPI,\n FrameCaptureStatus,\n} from '../types';\n\nexport function useCameraSequenceRecorder(): CameraFrameSequenceRecorderAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const record = useCallback(\n async (options: CameraFrameSequenceOptions) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for camera sequence recording.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await mujoco.api.recordCameraSequence(options);\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to record the requested camera sequence.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [mujoco.api]\n );\n\n return {\n status,\n error,\n isRecording: status === 'capturing',\n record,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * React state wrapper for named MuJoCo camera/site/body sequence recording.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport {\n createMountedCameraFrameSequenceReadiness,\n createMountedCameraFrameSequencePlanFromApi,\n recordMountedCameraFrameSequence,\n type MountedCameraFrameSequencePlan,\n type MountedCameraFrameSequencePlanOptions,\n type MountedCameraFrameSequenceReadiness,\n type MountedCameraFrameSequenceRecordOptions,\n type MountedCameraFrameSequenceRecordResult,\n} from '../rendering/cameraFrameSource';\nimport type {\n CameraFrameSequenceRecorderAPI,\n FrameCaptureStatus,\n} from '../types';\n\nexport type MountedCameraSequencePlanOptions =\n MountedCameraFrameSequencePlanOptions;\nexport type MountedCameraSequenceRecordOptions =\n MountedCameraFrameSequenceRecordOptions;\nexport type MountedCameraSequenceRecordResult =\n MountedCameraFrameSequenceRecordResult;\nexport type MountedCameraSequenceReadiness =\n MountedCameraFrameSequenceReadiness;\n\nexport interface MountedCameraSequenceRecorderAPI\n extends Omit<CameraFrameSequenceRecorderAPI, 'record'> {\n plan: MountedCameraFrameSequencePlan | null;\n readiness: MountedCameraSequenceReadiness | null;\n result: MountedCameraSequenceRecordResult | null;\n createPlan: (\n cameraKeys: readonly string[],\n options?: MountedCameraSequencePlanOptions\n ) => MountedCameraFrameSequencePlan;\n checkReadiness: (\n cameraKeys: readonly string[],\n options?: MountedCameraSequencePlanOptions\n ) => MountedCameraSequenceReadiness;\n record: (\n options: MountedCameraSequenceRecordOptions\n ) => Promise<MountedCameraSequenceRecordResult>;\n}\n\nexport function useMountedCameraSequenceRecorder(\n defaultOptions: MountedCameraSequencePlanOptions = {}\n): MountedCameraSequenceRecorderAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [plan, setPlan] = useState<MountedCameraFrameSequencePlan | null>(null);\n const [readiness, setReadiness] =\n useState<MountedCameraSequenceReadiness | null>(null);\n const [result, setResult] = useState<MountedCameraSequenceRecordResult | null>(\n null\n );\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setPlan(null);\n setReadiness(null);\n setResult(null);\n }, []);\n\n const createPlan = useCallback(\n (\n cameraKeys: readonly string[],\n options: MountedCameraSequencePlanOptions = {}\n ) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for mounted camera sequence planning.');\n }\n\n const nextPlan = createMountedCameraFrameSequencePlanFromApi(\n mujoco.api,\n cameraKeys,\n {\n ...defaultOptions,\n ...options,\n }\n );\n setPlan(nextPlan);\n setReadiness(null);\n return nextPlan;\n },\n [defaultOptions, mujoco.api]\n );\n\n const checkReadiness = useCallback(\n (\n cameraKeys: readonly string[],\n options: MountedCameraSequencePlanOptions = {}\n ) => {\n const nextPlan = createPlan(cameraKeys, options);\n const nextReadiness = createMountedCameraFrameSequenceReadiness(nextPlan);\n setReadiness(nextReadiness);\n return nextReadiness;\n },\n [createPlan]\n );\n\n const record = useCallback(\n async (options: MountedCameraSequenceRecordOptions) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for mounted camera sequence recording.');\n }\n\n setStatus('capturing');\n setError(null);\n setResult(null);\n\n try {\n const nextResult = await recordMountedCameraFrameSequence(mujoco.api, {\n ...defaultOptions,\n ...options,\n });\n setPlan(nextResult.plan);\n setReadiness(nextResult.readiness);\n setResult(nextResult);\n setStatus('captured');\n return nextResult;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to record the requested mounted camera sequence.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n return {\n status,\n error,\n plan,\n readiness,\n result,\n isRecording: status === 'capturing',\n createPlan,\n checkReadiness,\n record,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Helpers for applying policy action vectors to MuJoCo controls.\n */\n\nimport type { MujocoData, MujocoModel, PolicyVector } from './types';\n\nexport interface ApplyPolicyActionToControlsOptions {\n /**\n * First actuator/control index to write. Defaults to 0.\n */\n actuatorOffset?: number;\n /**\n * Maximum number of controls to write. Defaults to the action length.\n */\n actionSize?: number;\n /**\n * Clamp each action value to `model.actuator_ctrlrange` before writing.\n * Defaults to true because most learned policies should not exceed actuator limits.\n */\n clamp?: boolean;\n /**\n * Leave the current control unchanged when an action entry is not finite.\n * Defaults to true so a bad policy response cannot write NaN into the simulation.\n */\n skipInvalid?: boolean;\n}\n\nexport interface ApplyPolicyActionToControlsResult {\n /**\n * Values actually written to `data.ctrl`, after offset, truncation, and clamping.\n */\n applied: number[];\n /**\n * Actuator indices that were not written because the corresponding action value\n * was not finite and `skipInvalid` was enabled.\n */\n skipped: number[];\n actuatorOffset: number;\n}\n\nexport function clampPolicyActionValue(\n model: MujocoModel,\n actuatorIndex: number,\n value: number\n) {\n const ranges = model.actuator_ctrlrange;\n const min = ranges?.[actuatorIndex * 2] ?? -Infinity;\n const max = ranges?.[actuatorIndex * 2 + 1] ?? Infinity;\n return Math.max(min, Math.min(max, value));\n}\n\nexport function applyPolicyActionToControls(\n model: MujocoModel,\n data: MujocoData,\n action: PolicyVector,\n options: ApplyPolicyActionToControlsOptions = {}\n): ApplyPolicyActionToControlsResult {\n const actuatorOffset = options.actuatorOffset ?? 0;\n const actionSize = options.actionSize ?? action.length;\n const shouldClamp = options.clamp ?? true;\n const shouldSkipInvalid = options.skipInvalid ?? true;\n const count = Math.max(\n 0,\n Math.min(actionSize, action.length, data.ctrl.length - actuatorOffset, model.nu - actuatorOffset)\n );\n const applied: number[] = [];\n const skipped: number[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const actuatorIndex = actuatorOffset + index;\n const value = Number(action[index]);\n if (shouldSkipInvalid && !Number.isFinite(value)) {\n skipped.push(actuatorIndex);\n continue;\n }\n const nextValue = shouldClamp\n ? clampPolicyActionValue(model, actuatorIndex, value)\n : value;\n data.ctrl[actuatorIndex] = nextValue;\n applied.push(nextValue);\n }\n\n return { applied, skipped, actuatorOffset };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useCtrlNoise — control noise / perturbation hook (spec 3.2)\n */\n\nimport { useRef } from 'react';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\n\ninterface CtrlNoiseConfig {\n /** Exponential filter rate (0-1). Higher = faster noise changes. Default: 0.01. */\n rate?: number;\n /** Standard deviation of Gaussian noise. Default: 0.05. */\n std?: number;\n /** Enable/disable. Default: true. */\n enabled?: boolean;\n}\n\n/**\n * Apply Gaussian noise with exponential filtering to all ctrl values.\n * Useful for robustness testing and domain randomization.\n *\n * noise[i] = (1 - rate) * noise[i] + rate * N(0, std)\n * data.ctrl[i] += noise[i]\n */\nexport function useCtrlNoise(config: CtrlNoiseConfig = {}) {\n const { mjModelRef } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n const noiseRef = useRef<Float64Array | null>(null);\n\n useBeforePhysicsStep(({ data }) => {\n const cfg = configRef.current;\n if (cfg.enabled === false) return;\n\n const rate = cfg.rate ?? 0.01;\n const std = cfg.std ?? 0.05;\n const nu = mjModelRef.current?.nu ?? 0;\n if (nu === 0) return;\n\n // Initialize noise buffer\n if (!noiseRef.current || noiseRef.current.length !== nu) {\n noiseRef.current = new Float64Array(nu);\n }\n\n const noise = noiseRef.current;\n for (let i = 0; i < nu; i++) {\n // Box-Muller transform for Gaussian noise\n const u1 = Math.random();\n const u2 = Math.random();\n const gaussian = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n\n // Exponential filter\n noise[i] = (1 - rate) * noise[i] + rate * gaussian * std;\n data.ctrl[i] += noise[i];\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useBodyMeshes — returns Three.js meshes belonging to a MuJoCo body.\n *\n * Low-level primitive for custom selection visuals, outlines,\n * postprocessing effects, or any per-body mesh manipulation.\n */\n\nimport { useMemo } from 'react';\nimport { useThree } from '@react-three/fiber';\nimport * as THREE from 'three';\n\n/**\n * Returns all Three.js meshes belonging to the given MuJoCo body ID.\n *\n * @example\n * ```tsx\n * const meshes = useBodyMeshes(selectedBodyId);\n *\n * // Use with drei Outline\n * <Outline selection={meshes} />\n *\n * // Or manipulate directly\n * useFrame(() => {\n * meshes.forEach(m => { m.scale.setScalar(1.05); });\n * });\n * ```\n */\nexport function useBodyMeshes(bodyId: number | null): THREE.Mesh[] {\n const { scene } = useThree();\n\n return useMemo(() => {\n if (bodyId === null || bodyId < 0) return [];\n\n const meshes: THREE.Mesh[] = [];\n scene.traverse((obj) => {\n if (obj.userData.bodyID === bodyId && (obj as THREE.Mesh).isMesh) {\n meshes.push(obj as THREE.Mesh);\n }\n });\n return meshes;\n }, [bodyId, scene]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSelectionHighlight — convenience hook for emissive body highlights.\n *\n * Built on useBodyMeshes. For custom visuals, use useBodyMeshes directly.\n */\n\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useBodyMeshes } from './useBodyMeshes';\n\nexport function useSelectionHighlight(\n bodyId: number | null,\n options: { color?: string; emissiveIntensity?: number } = {},\n) {\n const { color = '#ff4444', emissiveIntensity = 0.3 } = options;\n const meshes = useBodyMeshes(bodyId);\n const prevRef = useRef<{ mesh: THREE.Mesh; originalEmissive: THREE.Color; originalIntensity: number }[]>([]);\n\n useEffect(() => {\n // Restore previous\n for (const entry of prevRef.current) {\n const mat = entry.mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n mat.emissive.copy(entry.originalEmissive);\n mat.emissiveIntensity = entry.originalIntensity;\n }\n }\n prevRef.current = [];\n\n // Apply new\n const highlightColor = new THREE.Color(color);\n for (const mesh of meshes) {\n const mat = mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n prevRef.current.push({\n mesh,\n originalEmissive: mat.emissive.clone(),\n originalIntensity: mat.emissiveIntensity ?? 0,\n });\n mat.emissive.copy(highlightColor);\n mat.emissiveIntensity = emissiveIntensity;\n }\n }\n\n return () => {\n for (const entry of prevRef.current) {\n const mat = entry.mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n mat.emissive.copy(entry.originalEmissive);\n mat.emissiveIntensity = entry.originalIntensity;\n }\n }\n prevRef.current = [];\n };\n }, [meshes, color, emissiveIntensity]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useCameraAnimation — composable camera animation hook.\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport * as THREE from 'three';\n\nexport interface CameraAnimationAPI {\n getCameraState(): { position: THREE.Vector3; target: THREE.Vector3 };\n moveCameraTo(position: THREE.Vector3, target: THREE.Vector3, durationMs: number): Promise<void>;\n}\n\n/**\n * Standalone hook for animated camera transitions.\n *\n * Manages its own `useFrame` callback — drop it into any component inside `<Canvas>`.\n */\nexport function useCameraAnimation(): CameraAnimationAPI {\n const { camera } = useThree();\n\n const orbitTargetRef = useRef(new THREE.Vector3(0, 0, 0));\n\n const cameraAnimRef = useRef({\n active: false,\n startPos: new THREE.Vector3(),\n endPos: new THREE.Vector3(),\n startRot: new THREE.Quaternion(),\n endRot: new THREE.Quaternion(),\n startTarget: new THREE.Vector3(),\n endTarget: new THREE.Vector3(),\n startTime: 0,\n duration: 0,\n resolve: null as (() => void) | null,\n });\n\n useFrame((state) => {\n const ca = cameraAnimRef.current;\n if (!ca.active) return;\n\n const now = performance.now();\n const progress = Math.min((now - ca.startTime) / ca.duration, 1.0);\n const ease =\n progress < 0.5\n ? 4 * progress * progress * progress\n : 1 - Math.pow(-2 * progress + 2, 3) / 2;\n\n camera.position.lerpVectors(ca.startPos, ca.endPos, ease);\n camera.quaternion.slerpQuaternions(ca.startRot, ca.endRot, ease);\n orbitTargetRef.current.lerpVectors(ca.startTarget, ca.endTarget, ease);\n\n const orbitControls = state.controls as { target?: THREE.Vector3 };\n if (orbitControls?.target) {\n orbitControls.target.copy(orbitTargetRef.current);\n }\n\n if (progress >= 1.0) {\n ca.active = false;\n camera.position.copy(ca.endPos);\n camera.quaternion.copy(ca.endRot);\n orbitTargetRef.current.copy(ca.endTarget);\n ca.resolve?.();\n ca.resolve = null;\n }\n });\n\n const getCameraState = useCallback(\n (): { position: THREE.Vector3; target: THREE.Vector3 } => ({\n position: camera.position.clone(),\n target: orbitTargetRef.current.clone(),\n }),\n [camera],\n );\n\n const moveCameraTo = useCallback(\n (position: THREE.Vector3, target: THREE.Vector3, durationMs: number): Promise<void> => {\n return new Promise((resolve) => {\n const ca = cameraAnimRef.current;\n ca.active = true;\n ca.startTime = performance.now();\n ca.duration = durationMs;\n ca.startPos.copy(camera.position);\n ca.startRot.copy(camera.quaternion);\n ca.startTarget.copy(orbitTargetRef.current);\n ca.endPos.copy(position);\n ca.endTarget.copy(target);\n const dummyCam = (camera as THREE.PerspectiveCamera).clone();\n dummyCam.position.copy(position);\n dummyCam.lookAt(target);\n ca.endRot.copy(dummyCam.quaternion);\n ca.resolve = resolve;\n setTimeout(resolve, durationMs + 100);\n });\n },\n [camera],\n );\n\n return { getCameraState, moveCameraTo };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/MujocoProvider.tsx","../src/rendering/CapsuleGeometry.ts","../src/core/SceneLoader.ts","../src/rendering/GeomBuilder.ts","../src/components/SceneRenderer.tsx","../src/components/CameraView.tsx","../src/hooks/useFrameCapture.ts","../src/rendering/cameraFrameSource.ts","../src/rendering/imageProjection.ts","../src/core/MujocoSimProvider.tsx","../src/core/MujocoCanvas.tsx","../src/core/MujocoPhysics.tsx","../src/core/ObservationBuilder.ts","../src/core/createController.tsx","../src/core/GenericIK.ts","../src/hooks/useIkController.ts","../src/components/Body.tsx","../src/components/IkGizmo.tsx","../src/components/ContactMarkers.tsx","../src/components/DragInteraction.tsx","../src/hooks/useSceneLights.ts","../src/components/SceneLights.tsx","../src/components/SplatCollisionProxyPreview.tsx","../src/hooks/useCameraStream.ts","../src/components/Debug.tsx","../src/components/TendonRenderer.tsx","../src/components/FlexRenderer.tsx","../src/components/InstancedGeomRenderer.tsx","../src/hooks/useContacts.ts","../src/components/ContactListener.tsx","../src/hooks/useTrajectoryPlayer.ts","../src/components/TrajectoryPlayer.tsx","../src/hooks/useActuators.ts","../src/hooks/useSitePosition.ts","../src/hooks/useGravityCompensation.ts","../src/hooks/useSensor.ts","../src/hooks/useJointState.ts","../src/hooks/useBodyState.ts","../src/hooks/usePose.ts","../src/hooks/useCtrl.ts","../src/hooks/useControlWriter.ts","../src/hooks/useControlGroup.ts","../src/hooks/useContactHistory.ts","../src/hooks/useKeyboardTeleop.ts","../src/hooks/useKeyboardIkTarget.ts","../src/hooks/usePolicy.ts","../src/hooks/useRemotePolicy.ts","../src/hooks/useObservation.ts","../src/policyObservation.ts","../src/hooks/useNamedObservation.ts","../src/hooks/useTrajectoryRecorder.ts","../src/hooks/useGamepad.ts","../src/hooks/useVideoRecorder.ts","../src/hooks/useCameraFrameCapture.ts","../src/policyCameraFrames.ts","../src/hooks/usePolicyCameraFrames.ts","../src/hooks/usePolicyCameraTensors.ts","../src/hooks/useCameraSequenceRecorder.ts","../src/hooks/useMountedCameraSequenceRecorder.ts","../src/policyControls.ts","../src/hooks/useCtrlNoise.ts","../src/hooks/useBodyMeshes.ts","../src/hooks/useSelectionHighlight.ts","../src/hooks/useCameraAnimation.ts"],"names":["THREE","THREE2","useRef","useEffect","THREE3","jsx","createContext","useFrame","useState","useCallback","value","useMemo","useContext","error","complete","status","THREE4","JOINT_TYPE_NAMES","THREE5","waitForNextAnimationFrame","useThree","api","getQpos","getCtrl","scene","projectImagePointTo3D","jsxs","MujocoCanvas","forwardRef","MujocoPhysics","s","tmp","THREE6","controlGroup","now","group","THREE7","THREE8","THREE9","_raycaster","THREE10","document","_quat","toVector3","target","THREE12","THREE13","GEOM_TYPE_NAMES","THREE14","_mat4","THREE15","SENSOR_TYPE_NAMES","THREE16","_matrix","THREE17","quaternionFromMujocoQuat","p","geomNameCacheByModel","THREE18","queuedActions","controller","THREE19","THREE20"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport loadMujoco from '@mujoco/mujoco';\nimport defaultMujocoWasmUrl from '@mujoco/mujoco/mujoco.wasm?url';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport type { MujocoModule, MujocoContextValue } from '../types';\n\nconst MujocoContext = createContext<MujocoContextValue>({\n mujoco: null,\n status: 'loading',\n error: null,\n});\n\n/**\n * Hook to access the MuJoCo WASM module.\n */\nexport function useMujocoWasm(): MujocoContextValue {\n return useContext(MujocoContext);\n}\n\nexport type MujocoWasmVariant = 'single' | 'threaded' | 'auto';\n\nexport interface MujocoLoaderOptions {\n locateFile?: (path: string) => string;\n printErr?: (text: string) => void;\n}\n\nexport type MujocoLoader = (options?: MujocoLoaderOptions) => Promise<unknown>;\n\nexport interface MujocoProviderProps {\n wasmUrl?: string;\n /** Optional URL for the multi-threaded WASM asset. */\n mtWasmUrl?: string;\n /**\n * Optional official multi-threaded loader, usually imported from\n * `@mujoco/mujoco/mt`. It is supplied by the app so the default package path\n * does not force every bundler to process the threaded Emscripten build.\n */\n threadedLoader?: MujocoLoader;\n /**\n * MuJoCo WASM build to load. `single` is the default and works everywhere.\n * `threaded` requires `threadedLoader` and cross-origin isolation. `auto`\n * uses threaded only when both conditions are satisfied.\n */\n wasmVariant?: MujocoWasmVariant;\n /** Timeout in ms for WASM module load. Default: 30000. */\n timeout?: number;\n children: React.ReactNode;\n onError?: (error: Error) => void;\n}\n\nfunction canUseThreadedWasm(): boolean {\n return typeof globalThis !== 'undefined' && globalThis.crossOriginIsolated === true;\n}\n\nfunction isMujocoModule(value: unknown): value is MujocoModule {\n return typeof value === 'object'\n && value !== null\n && 'FS' in value\n && 'MjModel' in value\n && 'MjData' in value\n && 'mj_step' in value;\n}\n\nfunction hasWasmUrl(value: string | undefined): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\nfunction resolveWasmVariant(\n variant: MujocoWasmVariant | undefined,\n threadedLoader: MujocoLoader | undefined,\n mtWasmUrl: string | undefined\n): 'single' | 'threaded' {\n if (variant === 'threaded') return 'threaded';\n if (variant === 'auto' && threadedLoader && mtWasmUrl && canUseThreadedWasm()) return 'threaded';\n return 'single';\n}\n\n/**\n * MujocoProvider — WASM / module lifecycle.\n * Loads the MuJoCo WASM module on mount and provides it to children via context.\n */\nexport function MujocoProvider({\n wasmUrl,\n mtWasmUrl,\n threadedLoader,\n wasmVariant = 'single',\n timeout = 30000,\n children,\n onError,\n}: MujocoProviderProps) {\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n const [error, setError] = useState<string | null>(null);\n const moduleRef = useRef<MujocoModule | null>(null);\n const isMounted = useRef(true);\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n isMounted.current = true;\n\n const variant = resolveWasmVariant(wasmVariant, threadedLoader, mtWasmUrl);\n if (variant === 'threaded' && !threadedLoader) {\n const err = new Error('MujocoProvider wasmVariant=\"threaded\" requires a threadedLoader from @mujoco/mujoco/mt');\n setError(err.message);\n setStatus('error');\n onErrorRef.current?.(err);\n return;\n }\n let selectedWasmUrl = wasmUrl ?? defaultMujocoWasmUrl;\n\n if (variant === 'threaded') {\n if (!hasWasmUrl(mtWasmUrl)) {\n const err = new Error('MujocoProvider wasmVariant=\"threaded\" requires mtWasmUrl from @mujoco/mujoco/mt/mujoco.wasm?url');\n setError(err.message);\n setStatus('error');\n onErrorRef.current?.(err);\n return;\n }\n selectedWasmUrl = mtWasmUrl;\n }\n\n const load: MujocoLoader = variant === 'threaded' && threadedLoader ? threadedLoader : loadMujoco;\n\n const wasmPromise = load({\n locateFile: (path: string) => path.endsWith('.wasm') ? selectedWasmUrl : path,\n printErr: (text: string) => {\n if (text.includes('Aborted') && isMounted.current) {\n setError('Simulation crashed. Reload page.');\n setStatus('error');\n }\n },\n });\n\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`WASM module load timed out after ${timeout}ms`)), timeout)\n );\n\n Promise.race([wasmPromise, timeoutPromise])\n .then((inst: unknown) => {\n if (isMounted.current) {\n if (!isMujocoModule(inst)) {\n throw new Error('MuJoCo WASM module initialized with an unexpected shape');\n }\n moduleRef.current = inst;\n setStatus('ready');\n }\n })\n .catch((err: Error) => {\n if (isMounted.current) {\n const msg = err.message || 'Failed to init spatial simulation';\n setError(msg);\n setStatus('error');\n onErrorRef.current?.(new Error(msg));\n }\n });\n\n return () => {\n isMounted.current = false;\n };\n }, [wasmUrl, mtWasmUrl, threadedLoader, wasmVariant, timeout]);\n\n return (\n <MujocoContext.Provider\n value={{ mujoco: moduleRef.current, status, error }}\n >\n {children}\n </MujocoContext.Provider>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\n\ninterface InternalBufferGeometry extends THREE.BufferGeometry {\n type: string;\n}\n\n/**\n * CapsuleGeometry\n * Custom geometry for capsule shape.\n */\nexport class CapsuleGeometry extends THREE.BufferGeometry {\n parameters: { radius: number; length: number; capSegments: number; radialSegments: number; };\n\n constructor(radius = 1, length = 1, capSegments = 4, radialSegments = 8) {\n super();\n (this as unknown as InternalBufferGeometry).type = 'CapsuleGeometry';\n this.parameters = { radius, length, capSegments, radialSegments };\n const path = new THREE.Path();\n path.absarc(0, -length / 2, radius, Math.PI * 1.5, 0, false);\n path.absarc(0, length / 2, radius, 0, Math.PI * 0.5, false);\n const latheGeometry = new THREE.LatheGeometry(path.getPoints(capSegments), radialSegments);\n \n const self = this as THREE.BufferGeometry;\n self.setIndex(latheGeometry.getIndex());\n self.setAttribute('position', latheGeometry.getAttribute('position'));\n self.setAttribute('normal', latheGeometry.getAttribute('normal'));\n self.setAttribute('uv', latheGeometry.getAttribute('uv'));\n }\n}","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n ActuatedJointInfo,\n ActuatorInfo,\n ControlGroupInfo,\n ControlGroupSelector,\n ControlJointInfo,\n JointInfo,\n LoadFromFilesOptions,\n LocalMujocoFile,\n MujocoData,\n MujocoModel,\n MujocoModule,\n ResourceSelector,\n} from '../types';\nimport { SceneConfig, SceneObject, XmlPatch } from '../types';\n\nconst JOINT_TYPE_NAMES: Record<number, string> = {\n 0: 'free',\n 1: 'ball',\n 2: 'slide',\n 3: 'hinge',\n};\n\n/**\n * Reads a null-terminated C string from MuJoCo's WASM memory.\n */\nexport function getName(mjModel: MujocoModel, address: number): string {\n let name = '';\n let idx = address;\n let safety = 0;\n while (mjModel.names[idx] !== 0 && safety < 100) {\n name += String.fromCharCode(mjModel.names[idx++]);\n safety++;\n }\n return name;\n}\n\n/**\n * Find a site by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSiteByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsite; i++) {\n if (getName(mjModel, mjModel.name_siteadr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find an actuator by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findActuatorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nu; i++) {\n if (getName(mjModel, mjModel.name_actuatoradr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find a keyframe by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findKeyframeByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nkey; i++) {\n if (getName(mjModel, mjModel.name_keyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a body by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findBodyByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nbody; i++) {\n if (getName(mjModel, mjModel.name_bodyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a joint by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findJointByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.njnt; i++) {\n if (getName(mjModel, mjModel.name_jntadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a geom by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findGeomByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.ngeom; i++) {\n if (getName(mjModel, mjModel.name_geomadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a sensor by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSensorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsensor; i++) {\n if (getName(mjModel, mjModel.name_sensoradr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a camera by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findCameraByName(mjModel: MujocoModel, name: string): number {\n const ncam = mjModel.ncam ?? 0;\n const addresses = mjModel.name_camadr;\n if (!addresses) return -1;\n for (let i = 0; i < ncam; i++) {\n if (getName(mjModel, addresses[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a tendon by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findTendonByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < (mjModel.ntendon ?? 0); i++) {\n if (getName(mjModel, mjModel.name_tendonadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Return qpos address for actuators that directly target a scalar joint.\n * Returns -1 for non-joint transmissions and multi-DOF joints.\n */\nexport function getActuatedScalarQposAdr(mjModel: MujocoModel, actuatorId: number): number {\n if (actuatorId < 0 || actuatorId >= mjModel.nu) return -1;\n\n // mjTRN_JOINT=0, mjTRN_JOINTINPARENT=1. Other transmission types don't map ctrl to a single qpos.\n const trnType = mjModel.actuator_trntype?.[actuatorId];\n if (trnType !== undefined && trnType !== 0 && trnType !== 1) return -1;\n\n const jointId = mjModel.actuator_trnid[2 * actuatorId];\n if (jointId < 0 || jointId >= mjModel.njnt) return -1;\n\n const jntType = mjModel.jnt_type[jointId];\n if (jntType !== 2 && jntType !== 3) return -1; // slide=2, hinge=3\n\n return mjModel.jnt_qposadr[jointId];\n}\n\nfunction getScalarJointDim(jointType: number): 0 | 1 {\n return jointType === 2 || jointType === 3 ? 1 : 0;\n}\n\nfunction unlimitedRange(): [number, number] {\n return [-Infinity, Infinity];\n}\n\nfunction isScalarJoint(mjModel: MujocoModel, jointId: number): boolean {\n return jointId >= 0 && jointId < mjModel.njnt && getScalarJointDim(mjModel.jnt_type[jointId]) === 1;\n}\n\nfunction getActuatorJointId(mjModel: MujocoModel, actuatorId: number): number {\n if (actuatorId < 0 || actuatorId >= mjModel.nu) return -1;\n const trnType = mjModel.actuator_trntype?.[actuatorId];\n if (trnType !== undefined && trnType !== 0 && trnType !== 1) return -1;\n const jointId = mjModel.actuator_trnid[2 * actuatorId];\n return isScalarJoint(mjModel, jointId) ? jointId : -1;\n}\n\nfunction getJointInfo(mjModel: MujocoModel, jointId: number): JointInfo {\n const type = mjModel.jnt_type[jointId];\n const range: [number, number] = [mjModel.jnt_range[2 * jointId], mjModel.jnt_range[2 * jointId + 1]];\n return {\n id: jointId,\n name: getName(mjModel, mjModel.name_jntadr[jointId]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range,\n limited: range[0] < range[1],\n bodyId: mjModel.jnt_bodyid[jointId],\n qposAdr: mjModel.jnt_qposadr[jointId],\n dofAdr: mjModel.jnt_dofadr[jointId],\n };\n}\n\nfunction getActuatorInfo(mjModel: MujocoModel, actuatorId: number): ActuatorInfo {\n const hasRange = mjModel.actuator_ctrlrange[2 * actuatorId] < mjModel.actuator_ctrlrange[2 * actuatorId + 1];\n return {\n id: actuatorId,\n name: getName(mjModel, mjModel.name_actuatoradr[actuatorId]),\n range: hasRange\n ? [mjModel.actuator_ctrlrange[2 * actuatorId], mjModel.actuator_ctrlrange[2 * actuatorId + 1]]\n : unlimitedRange(),\n };\n}\n\nfunction includesResourceName(names: readonly string[], name: string): boolean {\n return names.includes(name);\n}\n\nfunction matchesSelector<TInfo extends { name: string }, TName extends string>(\n info: TInfo,\n selector: ResourceSelector<TInfo, TName>\n): boolean {\n if (typeof selector === 'string') return info.name === selector;\n if (selector instanceof RegExp) return selector.test(info.name);\n if (Array.isArray(selector)) return includesResourceName(selector, info.name);\n if (typeof selector === 'function') return selector(info);\n return false;\n}\n\nfunction orderedJointIdsFromSelector(\n mjModel: MujocoModel,\n selector: ResourceSelector<JointInfo, string>\n): number[] {\n if (typeof selector === 'string') {\n const id = findJointByName(mjModel, selector);\n return id >= 0 && isScalarJoint(mjModel, id) ? [id] : [];\n }\n if (Array.isArray(selector)) {\n return selector\n .map((name) => findJointByName(mjModel, name))\n .filter((id) => id >= 0 && isScalarJoint(mjModel, id));\n }\n const ids: number[] = [];\n for (let i = 0; i < mjModel.njnt; i++) {\n if (!isScalarJoint(mjModel, i)) continue;\n const info = getJointInfo(mjModel, i);\n if (matchesSelector(info, selector)) ids.push(i);\n }\n return ids;\n}\n\nfunction orderedActuatorIdsFromSelector(\n mjModel: MujocoModel,\n selector: ResourceSelector<ActuatorInfo, string>\n): number[] {\n if (typeof selector === 'string') {\n const id = findActuatorByName(mjModel, selector);\n return id >= 0 && getActuatorJointId(mjModel, id) >= 0 ? [id] : [];\n }\n if (Array.isArray(selector)) {\n return selector\n .map((name) => findActuatorByName(mjModel, name))\n .filter((id) => id >= 0 && getActuatorJointId(mjModel, id) >= 0);\n }\n const ids: number[] = [];\n for (let i = 0; i < mjModel.nu; i++) {\n if (getActuatorJointId(mjModel, i) < 0) continue;\n const info = getActuatorInfo(mjModel, i);\n if (matchesSelector(info, selector)) ids.push(i);\n }\n return ids;\n}\n\nfunction inferScalarJointChain(mjModel: MujocoModel, bodyId: number): number[] {\n if (bodyId < 0 || bodyId >= mjModel.nbody) return [];\n const chainByBody: number[][] = [];\n let current = bodyId;\n const seen = new Set<number>();\n\n while (current >= 0 && current < mjModel.nbody && !seen.has(current)) {\n seen.add(current);\n const joints: number[] = [];\n const jointCount = mjModel.body_jntnum[current] ?? 0;\n const jointStart = mjModel.body_jntadr[current] ?? -1;\n for (let i = 0; i < jointCount; i++) {\n const jointId = jointStart + i;\n if (isScalarJoint(mjModel, jointId)) joints.push(jointId);\n }\n if (joints.length) chainByBody.push(joints);\n const parent = mjModel.body_parentid[current];\n if (parent === current) break;\n current = parent;\n }\n\n return chainByBody.reverse().flat();\n}\n\nfunction unique(values: number[]): number[] {\n const seen = new Set<number>();\n const result: number[] = [];\n for (const value of values) {\n if (seen.has(value)) continue;\n seen.add(value);\n result.push(value);\n }\n return result;\n}\n\nfunction findActuatorForJoint(mjModel: MujocoModel, jointId: number, preferredActuatorIds?: number[]): number {\n const search = preferredActuatorIds ?? Array.from({ length: mjModel.nu }, (_, i) => i);\n for (const actuatorId of search) {\n if (getActuatorJointId(mjModel, actuatorId) === jointId) return actuatorId;\n }\n return -1;\n}\n\nfunction buildControlGroup(\n mjModel: MujocoModel,\n jointIds: number[],\n preferredActuatorIds?: number[]\n): ControlGroupInfo | null {\n const ids = unique(jointIds).filter((id) => isScalarJoint(mjModel, id));\n if (!ids.length) return null;\n\n const joints: ControlJointInfo[] = [];\n const actuators: ActuatorInfo[] = [];\n const qposAdr: number[] = [];\n const dofAdr: number[] = [];\n const ctrlAdr: number[] = [];\n\n for (const jointId of ids) {\n const actuatorId = findActuatorForJoint(mjModel, jointId, preferredActuatorIds);\n const joint = getJointInfo(mjModel, jointId);\n qposAdr.push(joint.qposAdr);\n dofAdr.push(joint.dofAdr);\n\n if (actuatorId >= 0) {\n const actuator = getActuatorInfo(mjModel, actuatorId);\n actuators.push(actuator);\n ctrlAdr.push(actuatorId);\n joints.push({\n ...joint,\n actuatorId,\n actuatorName: actuator.name,\n ctrlAdr: actuatorId,\n ctrlRange: actuator.range,\n });\n } else {\n joints.push({\n ...joint,\n actuatorId: null,\n actuatorName: null,\n ctrlAdr: null,\n ctrlRange: null,\n });\n }\n }\n\n return {\n joints,\n actuators,\n qposAdr,\n dofAdr,\n ctrlAdr,\n readQpos(data: MujocoData) {\n return new Float64Array(qposAdr.map((adr) => data.qpos[adr] ?? 0));\n },\n readCtrl(data: MujocoData) {\n return new Float64Array(joints.map((joint) => joint.ctrlAdr === null ? 0 : data.ctrl[joint.ctrlAdr] ?? 0));\n },\n writeQpos(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, qposAdr.length); i++) {\n data.qpos[qposAdr[i]] = values[i];\n }\n },\n writeCtrl(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, joints.length); i++) {\n const adr = joints[i].ctrlAdr;\n if (adr !== null) data.ctrl[adr] = values[i];\n }\n },\n };\n}\n\nexport function getActuatedJoints(mjModel: MujocoModel): ActuatedJointInfo[] {\n const result: ActuatedJointInfo[] = [];\n for (let actuatorId = 0; actuatorId < mjModel.nu; actuatorId++) {\n const jointId = getActuatorJointId(mjModel, actuatorId);\n if (jointId < 0) continue;\n const actuator = getActuatorInfo(mjModel, actuatorId);\n result.push({\n ...getJointInfo(mjModel, jointId),\n actuatorId,\n actuatorName: actuator.name,\n ctrlAdr: actuatorId,\n ctrlRange: actuator.range,\n });\n }\n return result;\n}\n\nexport function getControlMap(mjModel: MujocoModel): ControlGroupInfo {\n const actuatorIds = Array.from({ length: mjModel.nu }, (_, i) => i)\n .filter((id) => getActuatorJointId(mjModel, id) >= 0);\n const jointIds = actuatorIds.map((id) => getActuatorJointId(mjModel, id));\n return buildControlGroup(mjModel, jointIds, actuatorIds) ?? createContiguousControlGroup(mjModel, 0);\n}\n\nexport function resolveControlGroup(\n mjModel: MujocoModel,\n selector: ControlGroupSelector\n): ControlGroupInfo | null {\n if (selector.actuators) {\n const actuatorIds = orderedActuatorIdsFromSelector(mjModel, selector.actuators);\n const jointIds = actuatorIds.map((id) => getActuatorJointId(mjModel, id));\n return buildControlGroup(mjModel, jointIds, actuatorIds);\n }\n\n if (selector.joints) {\n return buildControlGroup(mjModel, orderedJointIdsFromSelector(mjModel, selector.joints));\n }\n\n if (selector.siteName) {\n const siteId = findSiteByName(mjModel, selector.siteName);\n const bodyId = siteId >= 0 ? (mjModel.site_bodyid?.[siteId] ?? -1) : -1;\n return buildControlGroup(mjModel, inferScalarJointChain(mjModel, bodyId));\n }\n\n if (selector.bodyName) {\n return buildControlGroup(mjModel, inferScalarJointChain(mjModel, findBodyByName(mjModel, selector.bodyName)));\n }\n\n return getControlMap(mjModel);\n}\n\nexport function createContiguousControlGroup(mjModel: MujocoModel, count: number): ControlGroupInfo {\n const n = Math.max(0, Math.min(count, mjModel.nq, mjModel.nu));\n const joints: ControlJointInfo[] = [];\n const actuators: ActuatorInfo[] = [];\n const qposAdr: number[] = [];\n const dofAdr: number[] = [];\n const ctrlAdr: number[] = [];\n\n for (let i = 0; i < n; i++) {\n qposAdr.push(i);\n dofAdr.push(i);\n ctrlAdr.push(i);\n const jointId = Array.from({ length: mjModel.njnt }, (_, id) => id)\n .find((id) => mjModel.jnt_qposadr[id] === i);\n const actuator = getActuatorInfo(mjModel, i);\n actuators.push(actuator);\n joints.push({\n ...(jointId !== undefined ? getJointInfo(mjModel, jointId) : {\n id: i,\n name: `qpos${i}`,\n type: 3,\n typeName: 'hinge',\n range: unlimitedRange(),\n limited: false,\n bodyId: -1,\n qposAdr: i,\n dofAdr: i,\n }),\n actuatorId: i,\n actuatorName: actuator.name,\n ctrlAdr: i,\n ctrlRange: actuator.range,\n });\n }\n\n return {\n joints,\n actuators,\n qposAdr,\n dofAdr,\n ctrlAdr,\n readQpos(data: MujocoData) {\n return new Float64Array(qposAdr.map((adr) => data.qpos[adr] ?? 0));\n },\n readCtrl(data: MujocoData) {\n return new Float64Array(ctrlAdr.map((adr) => data.ctrl[adr] ?? 0));\n },\n writeQpos(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, qposAdr.length); i++) data.qpos[qposAdr[i]] = values[i];\n },\n writeCtrl(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, ctrlAdr.length); i++) data.ctrl[ctrlAdr[i]] = values[i];\n },\n };\n}\n\n/**\n * Convert a SceneObject config to MuJoCo XML.\n */\nfunction sceneObjectToXml(obj: SceneObject): string {\n const joint = obj.freejoint ? '<freejoint/>' : '';\n const geomName = obj.geomName ?? `${obj.name}_geom`;\n const pos = obj.position.map((v) => v.toFixed(3)).join(' ');\n const sizeValues = obj.type === 'sphere'\n ? obj.size.slice(0, 1)\n : obj.type === 'cylinder'\n ? obj.size.slice(0, 2)\n : obj.size;\n const size = sizeValues.map((v) => v.toFixed(3)).join(' ');\n const rgba = obj.rgba.join(' ');\n const mass = obj.mass ? ` mass=\"${obj.mass}\"` : '';\n const friction = obj.friction ? ` friction=\"${obj.friction}\"` : '';\n const solref = obj.solref ? ` solref=\"${obj.solref}\"` : '';\n const solimp = obj.solimp ? ` solimp=\"${obj.solimp}\"` : '';\n const condim = obj.condim ? ` condim=\"${obj.condim}\"` : '';\n const contype = obj.contype ?? 1;\n const conaffinity = obj.conaffinity ?? 1;\n const group = obj.group !== undefined ? ` group=\"${obj.group}\"` : '';\n return `<body name=\"${obj.name}\" pos=\"${pos}\">${joint}<geom name=\"${geomName}\" type=\"${obj.type}\" size=\"${size}\" rgba=\"${rgba}\" contype=\"${contype}\" conaffinity=\"${conaffinity}\"${mass}${friction}${solref}${solimp}${condim}${group}/></body>`;\n}\n\n/** Create virtual directory structure for a file path. */\nfunction ensureDir(mujoco: MujocoModule, fname: string) {\n const dirParts = fname.split('/');\n dirParts.pop();\n let currentPath = '/working';\n for (const part of dirParts) {\n currentPath += '/' + part;\n try { mujoco.FS.mkdir(currentPath); } catch { /* ignore */ }\n }\n}\n\ninterface LoadResult {\n mjModel: MujocoModel;\n mjData: MujocoData;\n}\n\nfunction loadModelFromPath(mujoco: MujocoModule, path: string): MujocoModel {\n if (mujoco.MjModel.from_xml_path) {\n return mujoco.MjModel.from_xml_path(path);\n }\n if (mujoco.MjModel.loadFromXML) {\n return mujoco.MjModel.loadFromXML(path);\n }\n throw new Error('MuJoCo WASM module does not expose an XML path loader');\n}\n\nfunction isModelTextFile(fname: string): boolean {\n const lower = fname.toLowerCase();\n return lower.endsWith('.xml') || lower.endsWith('.urdf') || lower.endsWith('.mjcf');\n}\n\nfunction normalizeVfsPath(path: string): string {\n const parts = path.replace(/\\\\/g, '/').split('/');\n const norm: string[] = [];\n for (const part of parts) {\n if (!part || part === '.') continue;\n if (part === '..') norm.pop();\n else norm.push(part);\n }\n return norm.join('/');\n}\n\nfunction localFilePath(file: LocalMujocoFile): string {\n return normalizeVfsPath(file.webkitRelativePath || file.name);\n}\n\nfunction dirname(path: string): string {\n const normalized = normalizeVfsPath(path);\n const idx = normalized.lastIndexOf('/');\n return idx === -1 ? '' : normalized.slice(0, idx + 1);\n}\n\nfunction relativeVfsPath(fromDir: string, targetPath: string): string {\n const from = normalizeVfsPath(fromDir).split('/').filter(Boolean);\n const target = normalizeVfsPath(targetPath).split('/').filter(Boolean);\n while (from.length && target.length && from[0] === target[0]) {\n from.shift();\n target.shift();\n }\n return [...from.map(() => '..'), ...target].join('/') || '.';\n}\n\nfunction inferSceneFile(files: readonly LocalMujocoFile[], options?: LoadFromFilesOptions): string {\n if (options?.sceneFile) return normalizeVfsPath(options.sceneFile);\n\n const paths = files.map(localFilePath);\n const preferred = ['scene.xml', 'model.xml', 'robot.xml', 'scene.urdf', 'model.urdf', 'robot.urdf'];\n for (const name of preferred) {\n const match = paths.find((path) => path.endsWith(name));\n if (match) return match;\n }\n\n const firstModel = paths.find(isModelTextFile);\n if (!firstModel) throw new Error('No MJCF XML or URDF file found in FileList');\n return firstModel;\n}\n\nexport function createSceneConfigFromFiles(\n files: FileList | readonly LocalMujocoFile[],\n options: LoadFromFilesOptions = {}\n): SceneConfig {\n const fileArray = Array.from(files) as LocalMujocoFile[];\n return {\n src: '',\n sceneFile: inferSceneFile(fileArray, options),\n files: fileArray,\n environmentFiles: options.environmentFiles?.map(normalizeVfsPath),\n homeJoints: options.homeJoints,\n xmlPatches: options.xmlPatches,\n sceneObjects: options.sceneObjects,\n onReset: options.onReset,\n };\n}\n\nconst ENVIRONMENT_MERGE_SECTIONS = [\n 'asset',\n 'worldbody',\n 'contact',\n 'equality',\n 'tendon',\n 'sensor',\n 'keyframe',\n 'custom',\n 'extension',\n] as const;\n\nfunction directChild(parent: Element, tagName: string): Element | null {\n const lower = tagName.toLowerCase();\n for (const child of Array.from(parent.children)) {\n if (child.tagName.toLowerCase() === lower) return child;\n }\n return null;\n}\n\nfunction ensureTopLevelSection(doc: XMLDocument, tagName: string): Element {\n const root = doc.documentElement;\n const existing = directChild(root, tagName);\n if (existing) return existing;\n\n const section = doc.createElement(tagName);\n if (tagName === 'asset') {\n const worldbody = directChild(root, 'worldbody');\n if (worldbody) root.insertBefore(section, worldbody);\n else root.appendChild(section);\n } else {\n root.appendChild(section);\n }\n return section;\n}\n\nfunction readCompilerDirs(doc: XMLDocument) {\n const compiler = directChild(doc.documentElement, 'compiler');\n const assetDir = compiler?.getAttribute('assetdir') || '';\n return {\n meshDir: compiler?.getAttribute('meshdir') || assetDir,\n textureDir: compiler?.getAttribute('texturedir') || assetDir,\n };\n}\n\nfunction isExternalPath(path: string): boolean {\n return /^[a-z]+:\\/\\//i.test(path) || path.startsWith('package://') || path.startsWith('/');\n}\n\nfunction fileReferencePrefix(el: Element, compilerDirs: ReturnType<typeof readCompilerDirs>): string {\n const tag = el.tagName.toLowerCase();\n if (tag === 'mesh') return compilerDirs.meshDir ? compilerDirs.meshDir + '/' : '';\n if (tag === 'texture' || tag === 'hfield') return compilerDirs.textureDir ? compilerDirs.textureDir + '/' : '';\n return '';\n}\n\nfunction rewriteFileReferencesForMerge(node: Element, sourceFile: string, targetFile: string, sourceDoc: XMLDocument) {\n const sourceDir = dirname(sourceFile);\n const targetDir = dirname(targetFile);\n const compilerDirs = readCompilerDirs(sourceDoc);\n node.querySelectorAll('[file], [filename]').forEach((el) => {\n const attr = el.hasAttribute('file') ? 'file' : 'filename';\n const value = el.getAttribute(attr);\n if (!value || isExternalPath(value)) return;\n\n const sourceRelativePath = normalizeVfsPath(fileReferencePrefix(el, compilerDirs) + value);\n const resolvedPath = normalizeVfsPath(sourceDir + sourceRelativePath);\n el.setAttribute(attr, relativeVfsPath(targetDir, resolvedPath));\n });\n}\n\nfunction hasParseError(doc: XMLDocument): boolean {\n return doc.getElementsByTagName('parsererror').length > 0;\n}\n\nfunction composeEnvironmentXml(\n sceneXml: string,\n config: SceneConfig,\n parser: DOMParser,\n environmentXmlByPath: Map<string, string>\n): string {\n const environmentFiles = config.environmentFiles?.map(normalizeVfsPath) ?? [];\n if (!environmentFiles.length) return sceneXml;\n\n const sceneDoc = parser.parseFromString(sceneXml, 'text/xml');\n if (hasParseError(sceneDoc)) {\n console.warn(`Could not compose environments: failed to parse ${config.sceneFile}`);\n return sceneXml;\n }\n\n for (const environmentFile of environmentFiles) {\n const environmentXml = environmentXmlByPath.get(environmentFile);\n if (!environmentXml) {\n console.warn(`Environment XML not found: ${environmentFile}`);\n continue;\n }\n\n const environmentDoc = parser.parseFromString(environmentXml, 'text/xml');\n if (hasParseError(environmentDoc)) {\n console.warn(`Skipping environment XML with parse errors: ${environmentFile}`);\n continue;\n }\n\n for (const sectionName of ENVIRONMENT_MERGE_SECTIONS) {\n const environmentSection = directChild(environmentDoc.documentElement, sectionName);\n if (!environmentSection?.children.length) continue;\n\n const targetSection = ensureTopLevelSection(sceneDoc, sectionName);\n for (const child of Array.from(environmentSection.children)) {\n const imported = sceneDoc.importNode(child, true) as Element;\n rewriteFileReferencesForMerge(imported, environmentFile, config.sceneFile, environmentDoc);\n targetSection.appendChild(imported);\n }\n }\n }\n\n return new XMLSerializer().serializeToString(sceneDoc);\n}\n\nfunction findTextByConfiguredPath(textByPath: Map<string, string>, configuredPath: string): string | undefined {\n const normalized = normalizeVfsPath(configuredPath);\n const direct = textByPath.get(normalized);\n if (direct) return direct;\n\n const suffix = '/' + normalized;\n for (const [path, text] of textByPath) {\n if (path.endsWith(suffix) || path === normalized.split('/').pop()) return text;\n }\n return undefined;\n}\n\nfunction applyXmlPatches(text: string, fname: string, config: SceneConfig): string {\n let result = text;\n for (const patch of config.xmlPatches ?? []) {\n if (fname.endsWith(patch.target) || fname === patch.target) {\n if (patch.replace) {\n const [from, to] = patch.replace;\n if (result.includes(from)) {\n result = result.replace(from, to);\n } else {\n const preview = from.length > 80 ? `${from.slice(0, 80)}...` : from;\n console.warn(`XML patch replace pattern not found in ${fname}: \"${preview}\"`);\n }\n }\n if (patch.inject && patch.injectAfter) {\n const idx = result.indexOf(patch.injectAfter);\n if (idx !== -1) {\n const tagEnd = result.indexOf('>', idx + patch.injectAfter.length);\n if (tagEnd !== -1) {\n result = result.slice(0, tagEnd + 1) + patch.inject + result.slice(tagEnd + 1);\n } else {\n console.warn(`XML patch inject failed in ${fname}: could not find tag end after \"${patch.injectAfter}\"`);\n }\n } else {\n const preview = patch.injectAfter.length > 80\n ? `${patch.injectAfter.slice(0, 80)}...`\n : patch.injectAfter;\n console.warn(`XML patch inject anchor not found in ${fname}: \"${preview}\"`);\n }\n }\n }\n }\n\n if (fname === config.sceneFile && config.sceneObjects?.length && result.includes('</worldbody>')) {\n const xml = config.sceneObjects.map((obj) => sceneObjectToXml(obj)).join('');\n result = result.replace('</worldbody>', xml + '</worldbody>');\n }\n\n return result;\n}\n\nasync function loadSceneFromFiles(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n const files = config.files ?? [];\n if (!files.length) throw new Error('loadFromFiles requires at least one File');\n\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const parser = new DOMParser();\n const byPath = new Map<string, LocalMujocoFile>();\n const byBasename = new Map<string, LocalMujocoFile>();\n const written = new Set<string>();\n const textByPath = new Map<string, string>();\n\n for (const file of files) {\n const path = localFilePath(file);\n byPath.set(path, file);\n byBasename.set(path.split('/').pop() ?? path, file);\n }\n\n for (const [path, file] of byPath) {\n onProgress?.(`Reading ${path}...`);\n ensureDir(mujoco, path);\n if (isModelTextFile(path)) {\n const text = applyXmlPatches(await file.text(), path, config);\n textByPath.set(path, text);\n } else {\n mujoco.FS.writeFile(`/working/${path}`, new Uint8Array(await file.arrayBuffer()));\n written.add(path);\n }\n }\n\n const environmentXmlByPath = new Map<string, string>();\n for (const environmentFile of config.environmentFiles?.map(normalizeVfsPath) ?? []) {\n const environmentXml = findTextByConfiguredPath(textByPath, environmentFile);\n if (environmentXml) environmentXmlByPath.set(environmentFile, environmentXml);\n }\n\n for (const [path, text] of textByPath) {\n const composedText = path === config.sceneFile\n ? composeEnvironmentXml(text, config, parser, environmentXmlByPath)\n : text;\n textByPath.set(path, composedText);\n ensureDir(mujoco, path);\n mujoco.FS.writeFile(`/working/${path}`, composedText);\n written.add(path);\n }\n\n for (const [path, text] of textByPath) {\n const deps = collectDependencyPaths(text, path, parser);\n for (const dep of deps) {\n if (written.has(dep)) continue;\n const file = byPath.get(dep) ?? byBasename.get(dep.split('/').pop() ?? dep);\n if (!file) continue;\n ensureDir(mujoco, dep);\n if (isModelTextFile(dep)) {\n mujoco.FS.writeFile(`/working/${dep}`, applyXmlPatches(await file.text(), dep, config));\n } else {\n mujoco.FS.writeFile(`/working/${dep}`, new Uint8Array(await file.arrayBuffer()));\n }\n written.add(dep);\n }\n }\n\n onProgress?.('Loading model...');\n const mjModel = loadModelFromPath(mujoco, `/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n applyInitialPose(mjModel, mjData, config);\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData };\n}\n\nfunction applyInitialPose(mjModel: MujocoModel, mjData: MujocoData, config: SceneConfig) {\n if (!config.homeJoints) return;\n const homeCount = Math.min(config.homeJoints.length, Math.max(mjModel.nu, mjModel.nq));\n for (let i = 0; i < homeCount; i++) {\n if (i < mjModel.nu) mjData.ctrl[i] = config.homeJoints[i];\n if (i < mjModel.nq) {\n const qposAdr = i < mjModel.nu ? getActuatedScalarQposAdr(mjModel, i) : -1;\n mjData.qpos[qposAdr !== -1 ? qposAdr : i] = config.homeJoints[i];\n }\n }\n}\n\n/**\n * Config-driven scene loader — replaces the old single-model patching approach.\n */\nexport async function loadScene(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n if (config.files?.length) {\n return loadSceneFromFiles(mujoco, config, onProgress);\n }\n\n // 1. Clean up virtual filesystem\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const baseUrl = config.src.endsWith('/') ? config.src : config.src + '/';\n\n const environmentXmlByPath = new Map<string, string>();\n const environmentFiles = config.environmentFiles?.map(normalizeVfsPath) ?? [];\n for (const environmentFile of environmentFiles) {\n onProgress?.(`Downloading ${environmentFile}...`);\n const res = await fetch(baseUrl + environmentFile);\n if (!res.ok) {\n console.warn(`Failed to fetch environment XML ${environmentFile}: ${res.status} ${res.statusText}`);\n continue;\n }\n environmentXmlByPath.set(environmentFile, applyXmlPatches(await res.text(), environmentFile, config));\n }\n\n const downloaded = new Set<string>();\n const xmlQueue: string[] = [config.sceneFile];\n const assetFiles: string[] = [];\n const parser = new DOMParser();\n\n // 2a. Download XML files sequentially (to discover dependencies)\n while (xmlQueue.length > 0) {\n const fname = xmlQueue.shift()!;\n if (downloaded.has(fname)) continue;\n downloaded.add(fname);\n\n if (!isModelTextFile(fname)) {\n // Non-XML discovered during XML scan — collect for parallel download\n assetFiles.push(fname);\n continue;\n }\n\n onProgress?.(`Downloading ${fname}...`);\n\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n continue;\n }\n\n const patchedText = applyXmlPatches(await res.text(), fname, config);\n const text = fname === config.sceneFile\n ? composeEnvironmentXml(patchedText, config, parser, environmentXmlByPath)\n : patchedText;\n\n ensureDir(mujoco, fname);\n mujoco.FS.writeFile(`/working/${fname}`, text);\n scanDependencies(text, fname, parser, downloaded, xmlQueue);\n }\n\n // 2b. Download all binary assets (meshes, textures) in parallel\n if (assetFiles.length > 0) {\n onProgress?.(`Downloading ${assetFiles.length} assets...`);\n\n const results = await Promise.all(\n assetFiles.map(async (fname) => {\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n return null;\n }\n return { fname, buffer: new Uint8Array(await res.arrayBuffer()) };\n })\n );\n\n for (const result of results) {\n if (!result) continue;\n ensureDir(mujoco, result.fname);\n mujoco.FS.writeFile(`/working/${result.fname}`, result.buffer);\n }\n }\n\n // 5. Load model\n onProgress?.('Loading model...');\n const mjModel = loadModelFromPath(mujoco, `/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n\n // 6. Set initial pose — set both ctrl and qpos so robot starts at home.\n // If homeJoints is not provided, keep raw MuJoCo defaults.\n applyInitialPose(mjModel, mjData, config);\n\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData };\n}\n\n/**\n * Scan XML for file dependencies (meshes, textures, includes).\n */\nfunction scanDependencies(\n xmlString: string,\n currentFile: string,\n parser: DOMParser,\n downloaded: Set<string>,\n queue: string[]\n) {\n for (const fullPath of collectDependencyPaths(xmlString, currentFile, parser)) {\n if (!downloaded.has(fullPath)) queue.push(fullPath);\n }\n}\n\nfunction collectDependencyPaths(\n xmlString: string,\n currentFile: string,\n parser: DOMParser\n): string[] {\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\n\n const compiler = xmlDoc.querySelector('compiler');\n const assetDir = compiler?.getAttribute('assetdir') || '';\n const meshDir = compiler?.getAttribute('meshdir') || assetDir;\n const textureDir = compiler?.getAttribute('texturedir') || assetDir;\n const currentDir = currentFile.includes('/')\n ? currentFile.substring(0, currentFile.lastIndexOf('/') + 1)\n : '';\n\n const paths: string[] = [];\n xmlDoc.querySelectorAll('[file], [filename]').forEach((el) => {\n const fileAttr = el.getAttribute('file') ?? el.getAttribute('filename');\n if (!fileAttr) return;\n if (/^[a-z]+:\\/\\//i.test(fileAttr) || fileAttr.startsWith('package://')) return;\n\n let prefix = '';\n if (el.tagName.toLowerCase() === 'mesh') {\n prefix = meshDir ? meshDir + '/' : '';\n } else if (['texture', 'hfield'].includes(el.tagName.toLowerCase())) {\n prefix = textureDir ? textureDir + '/' : '';\n }\n\n const fullPath = normalizeVfsPath(currentDir + prefix + fileAttr);\n\n paths.push(fullPath);\n });\n return paths;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\nimport { mergeVertices } from 'three/examples/jsm/utils/BufferGeometryUtils.js';\nimport { CapsuleGeometry } from './CapsuleGeometry';\nimport { getName } from '../core/SceneLoader';\nimport { MujocoModel, MujocoModule, MujocoRenderOptions } from '../types';\n\nconst DEFAULT_MESH_NORMAL_SMOOTHING_TOLERANCE = 1e-4;\n\n/**\n * GeomBuilder\n * RESPONSIBILITY: Manufacturing visual objects.\n * \n * This class knows how to read a single MuJoCo 'geom' (collision shape) definition\n * and build the corresponding Three.js Mesh for it.\n * It handles all the different shape types (Box, Sphere, Cylinder, generic Mesh, etc.).\n */\nexport class GeomBuilder {\n private mujoco: MujocoModule; \n private textureCache = new Map<number, THREE.Texture>();\n private renderOptions?: MujocoRenderOptions;\n\n constructor(mujoco: MujocoModule, renderOptions?: MujocoRenderOptions) {\n this.mujoco = mujoco;\n this.renderOptions = renderOptions;\n }\n\n private getMeshNormalSmoothingTolerance(): number | null {\n const smoothing = this.renderOptions?.meshNormalSmoothing;\n if (!smoothing) return null;\n if (smoothing === true) return DEFAULT_MESH_NORMAL_SMOOTHING_TOLERANCE;\n return smoothing.tolerance ?? DEFAULT_MESH_NORMAL_SMOOTHING_TOLERANCE;\n }\n\n private getMaterialTexture(mjModel: MujocoModel, matId: number): THREE.Texture | null {\n if (matId < 0 || !mjModel.mat_texid || !mjModel.tex_data) return null;\n\n const materialCount = Math.max(1, Math.floor(mjModel.mat_rgba.length / 4));\n const textureRoles = Math.max(1, Math.floor(mjModel.mat_texid.length / materialCount));\n let texId = -1;\n for (let role = 0; role < textureRoles; role += 1) {\n const candidate = mjModel.mat_texid[matId * textureRoles + role];\n if (candidate >= 0) {\n texId = candidate;\n break;\n }\n }\n if (texId < 0) return null;\n\n const cached = this.textureCache.get(texId);\n if (cached) return cached;\n\n const width = Number(mjModel.tex_width[texId]);\n const height = Number(mjModel.tex_height[texId]);\n const channels = Number(mjModel.tex_nchannel[texId]);\n const offset = Number(mjModel.tex_adr[texId]);\n if (width <= 0 || height <= 0 || channels <= 0 || offset < 0) return null;\n\n const source = mjModel.tex_data.subarray(offset, offset + width * height * channels);\n const rgba = new Uint8Array(width * height * 4);\n for (let i = 0, j = 0; i < width * height; i += 1, j += channels) {\n const r = source[j] ?? 255;\n const g = channels > 1 ? source[j + 1] : r;\n const b = channels > 2 ? source[j + 2] : r;\n const a = channels > 3 ? source[j + 3] : 255;\n const out = i * 4;\n rgba[out] = r;\n rgba[out + 1] = g;\n rgba[out + 2] = b;\n rgba[out + 3] = a;\n }\n\n const texture = new THREE.DataTexture(rgba, width, height, THREE.RGBAFormat);\n texture.colorSpace = THREE.LinearSRGBColorSpace;\n texture.wrapS = THREE.RepeatWrapping;\n texture.wrapT = THREE.RepeatWrapping;\n texture.flipY = true;\n const repeatOffset = matId * 2;\n const repeatS = mjModel.mat_texrepeat?.[repeatOffset] ?? 1;\n const repeatT = mjModel.mat_texrepeat?.[repeatOffset + 1] ?? 1;\n texture.repeat.set(repeatS || 1, repeatT || 1);\n texture.needsUpdate = true;\n this.textureCache.set(texId, texture);\n return texture;\n }\n\n /**\n * Creates a Three.js Object3D (usually a Mesh) for a specific geometry in the MuJoCo model.\n * Returns null if the geometry shouldn't be rendered (e.g., invisible collision triggers).\n */\n create(mjModel: MujocoModel, g: number): THREE.Object3D | null {\n // 1. Check if this geom is meant to be visible\n // Group 3 in MuJoCo is conventionally used for invisible 'helper' geoms.\n if (mjModel.geom_group[g] === 3) return null;\n\n // 2. Read raw data from MuJoCo's WASM memory arrays\n const type = mjModel.geom_type[g];\n const size = mjModel.geom_size.subarray(g * 3, g * 3 + 3); // [x, y, z] size parameters\n const pos = mjModel.geom_pos.subarray(g * 3, g * 3 + 3); // [x, y, z] local position\n const quat = mjModel.geom_quat.subarray(g * 4, g * 4 + 4); // [w, x, y, z] local rotation\n\n // 3. Determine material color\n // Sometimes color is on the geom itself, sometimes it uses a shared material definition.\n const matId = mjModel.geom_matid[g];\n const color = new THREE.Color(0xffffff);\n const map = this.getMaterialTexture(mjModel, matId);\n let opacity = 1.0;\n\n if (matId >= 0) {\n // Use shared material\n const rgba = mjModel.mat_rgba.subarray(matId * 4, matId * 4 + 4);\n color.setRGB(rgba[0], rgba[1], rgba[2]);\n opacity = rgba[3];\n } else {\n // Use geom-specific color\n const rgba = mjModel.geom_rgba.subarray(g * 4, g * 4 + 4);\n color.setRGB(rgba[0], rgba[1], rgba[2]);\n opacity = rgba[3];\n }\n\n // 4. Build the Geometry based on type\n const MG = this.mujoco.mjtGeom; // Short alias for MuJoCo Geometry Types enum\n let geo: THREE.BufferGeometry | null = null;\n\n // The '.value ?? MG.XYZ' pattern handles slightly different MuJoCo WASM binding versions.\n const getVal = (v: unknown) => (v as { value: number })?.value ?? v;\n\n if (type === getVal(MG.mjGEOM_PLANE)) {\n // Planes are infinite in MuJoCo, but Three needs finite UVs for textured captures.\n geo = new THREE.PlaneGeometry(size[0] * 2 || 5, size[1] * 2 || 5);\n } else if (type === getVal(MG.mjGEOM_SPHERE)) {\n geo = new THREE.SphereGeometry(size[0], 24, 24);\n } else if (type === getVal(MG.mjGEOM_CAPSULE)) {\n // Capsules in MuJoCo are Z-axis aligned by default.\n // Our custom CapsuleGeometry might need rotation to match.\n geo = new CapsuleGeometry(size[0], size[1] * 2, 24, 12);\n geo.rotateX(Math.PI / 2); \n } else if (type === getVal(MG.mjGEOM_BOX)) {\n // MuJoCo defines box size as \"half-extents\" (center to edge). Three.js uses full width.\n geo = new THREE.BoxGeometry(size[0] * 2, size[1] * 2, size[2] * 2);\n } else if (type === getVal(MG.mjGEOM_CYLINDER)) {\n geo = new THREE.CylinderGeometry(size[0], size[0], size[1] * 2, 24);\n geo.rotateX(Math.PI / 2);\n } else if (type === getVal(MG.mjGEOM_MESH)) {\n // Arbitrary 3D meshes (like the robot parts).\n // We must read the vertex and face data directly from MuJoCo's buffers.\n const mId = mjModel.geom_dataid[g];\n const vAdr = mjModel.mesh_vertadr[mId];\n const vNum = mjModel.mesh_vertnum[mId];\n const fAdr = mjModel.mesh_faceadr[mId];\n const fNum = mjModel.mesh_facenum[mId];\n\n geo = new THREE.BufferGeometry();\n // 'position' attribute = vertices\n geo.setAttribute('position', new THREE.Float32BufferAttribute(mjModel.mesh_vert.subarray(vAdr * 3, (vAdr + vNum) * 3), 3));\n // 'index' = faces (triangles connecting vertices)\n geo.setIndex(Array.from(mjModel.mesh_face.subarray(fAdr * 3, (fAdr + fNum) * 3)));\n const smoothingTolerance = this.getMeshNormalSmoothingTolerance();\n if (smoothingTolerance !== null) {\n geo = mergeVertices(geo, smoothingTolerance);\n }\n geo.computeVertexNormals(); // Auto-calculate smooth lighting normals\n }\n\n // 5. Construct the final Mesh\n if (geo) {\n const isPlane = type === getVal(MG.mjGEOM_PLANE);\n const materialMap = isPlane && map ? map.clone() : map;\n if (isPlane && materialMap) {\n materialMap.repeat.multiplyScalar(2.5);\n materialMap.needsUpdate = true;\n }\n const mesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({\n color,\n map: materialMap,\n transparent: opacity < 1,\n opacity,\n roughness: 0.6,\n metalness: 0\n }));\n mesh.castShadow = type !== getVal(MG.mjGEOM_PLANE);\n mesh.receiveShadow = true;\n\n // Apply the local position offset and rotation specified in the MJCF XML\n mesh.position.set(pos[0], pos[1], pos[2]);\n // MuJoCo quaternions are [w, x, y, z], Three.js are [x, y, z, w]\n mesh.quaternion.set(quat[1], quat[2], quat[3], quat[0]);\n\n // Tag the mesh with its MuJoCo body and geom IDs for interaction (picking/dragging)\n mesh.userData.bodyID = mjModel.geom_bodyid[g];\n mesh.userData.geomID = g;\n mesh.userData.geomGroup = mjModel.geom_group[g];\n mesh.userData.geomName = getName(mjModel, mjModel.name_geomadr[g]);\n\n return mesh;\n }\n\n return null;\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport { GeomBuilder } from '../rendering/GeomBuilder';\nimport { CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY } from '../rendering/cameraFrameCapture';\nimport { MujocoModel, MujocoRenderOptions } from '../types';\nimport { getName } from '../core/SceneLoader';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\n/**\n * SceneRenderer — creates and syncs MuJoCo body meshes every frame.\n * Accepts standard R3F group props (position, rotation, scale, visible, etc.).\n */\nexport interface SceneRendererProps extends Omit<ThreeElements['group'], 'ref'> {\n renderOptions?: MujocoRenderOptions;\n}\n\nfunction getRenderOptionsKey(renderOptions: MujocoRenderOptions | undefined) {\n const smoothing = renderOptions?.meshNormalSmoothing;\n if (!smoothing) return 'default';\n if (smoothing === true) return 'meshNormalSmoothing:true';\n return `meshNormalSmoothing:${smoothing.tolerance ?? 'default'}`;\n}\n\nexport function SceneRenderer({ renderOptions, ...props }: SceneRendererProps) {\n const {\n mjModelRef,\n mjDataRef,\n mujocoRef,\n onSelectionRef,\n hiddenBodiesRef,\n interpolateRef,\n interpolationStateRef,\n status,\n } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const bodyRefs = useRef<(THREE.Group | null)[]>([]);\n const prevModelRef = useRef<MujocoModel | null>(null);\n const prevRenderOptionsKeyRef = useRef<string | null>(null);\n const renderOptionsKey = getRenderOptionsKey(renderOptions);\n\n const geomBuilder = useMemo(() => {\n if (status !== 'ready') return null;\n return new GeomBuilder(mujocoRef.current, renderOptions);\n }, [status, mujocoRef, renderOptionsKey]);\n\n // Build body groups when model loads\n useEffect(() => {\n if (status !== 'ready' || !geomBuilder) return;\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group) return;\n\n // Skip if model hasn't changed\n if (\n prevModelRef.current === model &&\n prevRenderOptionsKeyRef.current === renderOptionsKey\n ) {\n return;\n }\n prevModelRef.current = model;\n prevRenderOptionsKeyRef.current = renderOptionsKey;\n\n // Clear previous bodies\n while (group.children.length > 0) {\n group.remove(group.children[0]);\n }\n\n // Create body groups with geometry\n const refs: (THREE.Group | null)[] = [];\n for (let i = 0; i < model.nbody; i++) {\n const bodyGroup = new THREE.Group();\n bodyGroup.userData.bodyID = i;\n const bodyName = getName(model, model.name_bodyadr[i]);\n\n if (!hiddenBodiesRef.current.has(bodyName)) {\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === i) {\n const mesh = geomBuilder.create(model, g);\n if (mesh) bodyGroup.add(mesh);\n }\n }\n }\n\n group.add(bodyGroup);\n refs.push(bodyGroup);\n }\n bodyRefs.current = refs;\n }, [status, geomBuilder, mjModelRef, renderOptionsKey]);\n\n const syncBodiesToData = useCallback(() => {\n const data = mjDataRef.current;\n if (!data) return;\n const bodies = bodyRefs.current;\n const interpolation = interpolationStateRef.current;\n const useInterpolation = interpolateRef.current && interpolation.valid;\n\n for (let i = 0; i < bodies.length; i++) {\n const ref = bodies[i];\n if (!ref) continue;\n if (useInterpolation) {\n const alpha = interpolation.alpha;\n const i3 = i * 3;\n ref.position.set(\n THREE.MathUtils.lerp(interpolation.previousXpos[i3], interpolation.currentXpos[i3], alpha),\n THREE.MathUtils.lerp(interpolation.previousXpos[i3 + 1], interpolation.currentXpos[i3 + 1], alpha),\n THREE.MathUtils.lerp(interpolation.previousXpos[i3 + 2], interpolation.currentXpos[i3 + 2], alpha)\n );\n const i4 = i * 4;\n _previousQuat.set(\n interpolation.previousXquat[i4 + 1],\n interpolation.previousXquat[i4 + 2],\n interpolation.previousXquat[i4 + 3],\n interpolation.previousXquat[i4]\n );\n _currentQuat.set(\n interpolation.currentXquat[i4 + 1],\n interpolation.currentXquat[i4 + 2],\n interpolation.currentXquat[i4 + 3],\n interpolation.currentXquat[i4]\n );\n ref.quaternion.copy(_previousQuat).slerp(_currentQuat, alpha);\n } else {\n ref.position.set(\n data.xpos[i * 3],\n data.xpos[i * 3 + 1],\n data.xpos[i * 3 + 2]\n );\n ref.quaternion.set(\n data.xquat[i * 4 + 1],\n data.xquat[i * 4 + 2],\n data.xquat[i * 4 + 3],\n data.xquat[i * 4]\n );\n }\n }\n }, [interpolateRef, interpolationStateRef, mjDataRef]);\n\n // Sync body positions from mjData every frame\n useFrame(syncBodiesToData);\n\n return (\n <group\n {...props}\n ref={groupRef}\n userData={{\n ...props.userData,\n [CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY]: syncBodiesToData,\n }}\n onDoubleClick={(e) => {\n if (typeof props.onDoubleClick === 'function') props.onDoubleClick(e);\n e.stopPropagation();\n let obj: THREE.Object3D | null = e.object;\n while (obj && obj.userData.bodyID === undefined && obj.parent) {\n obj = obj.parent;\n }\n const bodyID = obj?.userData.bodyID;\n if (typeof bodyID === 'number' && bodyID > 0) {\n const model = mjModelRef.current;\n if (model && bodyID < model.nbody && onSelectionRef.current) {\n const name = getName(model, model.name_bodyadr[bodyID]);\n onSelectionRef.current({ bodyId: bodyID, name });\n }\n }\n }}\n />\n );\n}\n\nconst _previousQuat = new THREE.Quaternion();\nconst _currentQuat = new THREE.Quaternion();\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Live on-screen camera viewports for MuJoCo scenes. Each view renders the\n * shared scene from a named MuJoCo camera/site/body into a `gl.scissor` region\n * tracking a DOM element — no GPU readback, no PNG encoding.\n *\n * While at least one viewport is mounted the canvas switches from R3F's\n * automatic render to a managed render loop (main scene full-frame, then each\n * viewport). This is incompatible with `EffectComposer`/postprocessing or other\n * custom render loops; use the offscreen capture APIs in those setups instead.\n */\n\nimport {\n createContext,\n type CSSProperties,\n type MutableRefObject,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type * as THREE from 'three';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport {\n createCaptureCamera,\n prepareCaptureCamera,\n} from '../rendering/cameraFrameCapture';\nimport type {\n Bodies,\n Cameras,\n CameraFrameCaptureOptions,\n Sites,\n} from '../types';\n\n/** Camera selection + pose options for a live viewport. */\nexport type CameraViewportOptions = Pick<\n CameraFrameCaptureOptions,\n | 'camera'\n | 'cameraName'\n | 'siteName'\n | 'bodyName'\n | 'position'\n | 'quaternion'\n | 'lookAt'\n | 'up'\n | 'positionOffset'\n | 'quaternionOffset'\n | 'fov'\n | 'near'\n | 'far'\n | 'projectionMatrix'\n | 'mujocoCameraCompatibility'\n>;\n\ninterface CameraViewportDescriptor {\n getElement: () => HTMLElement | null;\n getOptions: () => CameraViewportOptions;\n camera: THREE.Camera | null;\n}\n\ninterface CameraViewportRegistry {\n register: (descriptor: CameraViewportDescriptor) => () => void;\n}\n\nconst CameraViewportRegistryContext = createContext<CameraViewportRegistry | null>(null);\n\nlet nextViewportId = 0;\n\nconst VIEWPORT_RENDER_PRIORITY = 1;\n\nfunction CameraViewportRenderer({\n viewportsRef,\n}: {\n viewportsRef: MutableRefObject<Map<number, CameraViewportDescriptor>>;\n}) {\n const gl = useThree((state) => state.gl);\n const scene = useThree((state) => state.scene);\n const mainCamera = useThree((state) => state.camera);\n const mujoco = useMujoco();\n\n useFrame(() => {\n const drawWidth = gl.domElement.width;\n const drawHeight = gl.domElement.height;\n\n // We own the render now: draw the main scene full-frame first.\n gl.setScissorTest(false);\n gl.setViewport(0, 0, drawWidth, drawHeight);\n gl.render(scene, mainCamera);\n\n const api = mujoco.api;\n if (!api || viewportsRef.current.size === 0) return;\n\n const dpr = gl.getPixelRatio();\n const canvasRect = gl.domElement.getBoundingClientRect();\n\n for (const descriptor of viewportsRef.current.values()) {\n const element = descriptor.getElement();\n if (!element) continue;\n\n const rect = element.getBoundingClientRect();\n const isOffscreen =\n rect.bottom < canvasRect.top ||\n rect.top > canvasRect.bottom ||\n rect.right < canvasRect.left ||\n rect.left > canvasRect.right;\n if (isOffscreen) continue;\n\n const width = Math.floor(rect.width * dpr);\n const height = Math.floor(rect.height * dpr);\n if (width <= 0 || height <= 0) continue;\n\n const left = Math.floor((rect.left - canvasRect.left) * dpr);\n const bottom = Math.floor((canvasRect.bottom - rect.bottom) * dpr);\n\n let resolved: CameraFrameCaptureOptions;\n try {\n resolved = api.resolveCameraCaptureOptions(descriptor.getOptions());\n } catch {\n continue;\n }\n\n if (!descriptor.camera) {\n descriptor.camera = createCaptureCamera(resolved, mainCamera, width, height);\n } else {\n prepareCaptureCamera(descriptor.camera, resolved, mainCamera, width, height);\n }\n\n gl.setViewport(left, bottom, width, height);\n gl.setScissor(left, bottom, width, height);\n gl.setScissorTest(true);\n gl.render(scene, descriptor.camera);\n }\n\n gl.setScissorTest(false);\n gl.setViewport(0, 0, drawWidth, drawHeight);\n }, VIEWPORT_RENDER_PRIORITY);\n\n return null;\n}\n\n/**\n * Provides the live-viewport registry and mounts the managed render loop only\n * while at least one viewport is active. Mounted internally by the MuJoCo\n * provider; you do not need to add it yourself.\n */\nexport function CameraViewportProvider({ children }: { children?: ReactNode }) {\n const viewportsRef = useRef<Map<number, CameraViewportDescriptor>>(new Map());\n const [count, setCount] = useState(0);\n\n const register = useCallback((descriptor: CameraViewportDescriptor) => {\n const id = nextViewportId++;\n viewportsRef.current.set(id, descriptor);\n setCount((value) => value + 1);\n return () => {\n viewportsRef.current.delete(id);\n setCount((value) => value - 1);\n };\n }, []);\n\n const value = useMemo<CameraViewportRegistry>(() => ({ register }), [register]);\n\n return (\n <CameraViewportRegistryContext.Provider value={value}>\n {children}\n {count > 0 && <CameraViewportRenderer viewportsRef={viewportsRef} />}\n </CameraViewportRegistryContext.Provider>\n );\n}\n\n/**\n * Render the live MuJoCo scene from a named camera into the region covered by\n * `elementRef`'s DOM element. Call this inside `<MujocoCanvas>` with a ref to a\n * DOM element you position anywhere (it does not need to be in the R3F tree).\n */\nexport function useCameraViewport<T extends HTMLElement = HTMLElement>(\n elementRef: RefObject<T | null>,\n options: CameraViewportOptions\n) {\n const registry = useContext(CameraViewportRegistryContext);\n if (!registry) {\n throw new Error('useCameraViewport must be used inside <MujocoCanvas>.');\n }\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n const descriptor: CameraViewportDescriptor = {\n getElement: () => elementRef.current,\n getOptions: () => optionsRef.current,\n camera: null,\n };\n return registry.register(descriptor);\n }, [registry, elementRef]);\n}\n\nexport interface CameraViewProps extends CameraViewportOptions {\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Drop-in live camera pane. Renders an absolutely-positioned overlay `<div>`\n * over the canvas showing the selected MuJoCo camera. Position it with\n * `style`/`className` (the canvas's parent should be positioned).\n */\nexport function CameraView({ className, style, ...options }: CameraViewProps) {\n const gl = useThree((state) => state.gl);\n const elementRef = useRef<HTMLDivElement | null>(null);\n if (!elementRef.current && typeof document !== 'undefined') {\n elementRef.current = document.createElement('div');\n }\n\n useEffect(() => {\n const element = elementRef.current;\n const parent = gl.domElement.parentElement;\n if (!element || !parent) return;\n element.style.position = 'absolute';\n element.style.overflow = 'hidden';\n parent.appendChild(element);\n return () => {\n parent.removeChild(element);\n };\n }, [gl]);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n element.className = className ?? '';\n if (style) Object.assign(element.style, style);\n }, [className, style]);\n\n useCameraViewport(elementRef, options);\n\n return null;\n}\n\nexport type { Bodies, Cameras, Sites };\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useFrameCapture — still-frame capture for canvas-backed MuJoCo/R3F scenes.\n */\n\nimport { useCallback, useState } from 'react';\nimport type {\n FrameCaptureAPI,\n FrameCaptureBlobResult,\n FrameCaptureOptions,\n FrameCaptureResult,\n FrameCaptureStatus,\n FrameCaptureTargetRef,\n} from '../types';\n\nfunction isTargetRef(\n target: FrameCaptureOptions['target']\n): target is FrameCaptureTargetRef {\n return Boolean(target && typeof target === 'object' && 'current' in target);\n}\n\nfunction resolveCanvasTarget(\n target: FrameCaptureOptions['target']\n): HTMLCanvasElement {\n const resolvedTarget = isTargetRef(target) ? target.current : target;\n\n if (!resolvedTarget) {\n throw new Error('No frame capture target is available.');\n }\n\n if (resolvedTarget instanceof HTMLCanvasElement) {\n return resolvedTarget;\n }\n\n const canvas = resolvedTarget.querySelector('canvas');\n if (!canvas) {\n throw new Error('Frame capture target does not contain a canvas.');\n }\n return canvas;\n}\n\nfunction waitForNextAnimationFrame() {\n return new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n}\n\n/**\n * Capture the current canvas frame as a data URL.\n *\n * For WebGL scenes, create the renderer with `preserveDrawingBuffer: true`\n * when you need deterministic captures after the frame has presented.\n */\nexport async function captureFrame(\n options: FrameCaptureOptions\n): Promise<FrameCaptureResult> {\n const type = options.type ?? 'image/png';\n const canvas = resolveCanvasTarget(options.target);\n\n if (options.waitForAnimationFrame ?? true) {\n await waitForNextAnimationFrame();\n }\n\n return {\n canvas,\n dataUrl: canvas.toDataURL(type, options.quality),\n type,\n };\n}\n\n/**\n * Capture the current canvas frame as a Blob.\n */\nexport async function captureFrameBlob(\n options: FrameCaptureOptions\n): Promise<FrameCaptureBlobResult> {\n const type = options.type ?? 'image/png';\n const canvas = resolveCanvasTarget(options.target);\n\n if (options.waitForAnimationFrame ?? true) {\n await waitForNextAnimationFrame();\n }\n\n const blob = await new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (nextBlob) => {\n if (nextBlob) {\n resolve(nextBlob);\n } else {\n reject(new Error('Canvas frame capture did not produce a Blob.'));\n }\n },\n type,\n options.quality\n );\n });\n\n return { canvas, blob, type };\n}\n\n/**\n * React state wrapper around `captureFrame` and `captureFrameBlob`.\n */\nexport function useFrameCapture(\n defaultOptions: FrameCaptureOptions = {}\n): FrameCaptureAPI {\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback(\n async (options: FrameCaptureOptions = {}) => {\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await captureFrame({ ...defaultOptions, ...options });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture the current canvas frame.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions]\n );\n\n const captureBlob = useCallback(\n async (options: FrameCaptureOptions = {}) => {\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await captureFrameBlob({\n ...defaultOptions,\n ...options,\n });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture the current canvas frame.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions]\n );\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n captureBlob,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Helpers for resolving dataset camera streams to mounted MuJoCo resources.\n */\n\nimport type {\n Bodies,\n CameraFrameCaptureOptions,\n CameraFrameCaptureSource,\n CameraFrameSequenceCamera,\n CameraFrameSequenceOptions,\n CameraFrameSequenceResult,\n Cameras,\n MujocoSimAPI,\n Sites,\n} from '../types';\n\nexport type MountedCameraFrameCaptureSource = Extract<\n CameraFrameCaptureSource,\n | { kind: 'mujoco-camera' }\n | { kind: 'mujoco-site' }\n | { kind: 'mujoco-body' }\n>;\n\nexport type CameraFrameMountSelector =\n | { cameraName: Cameras; siteName?: never; bodyName?: never }\n | { siteName: Sites; cameraName?: never; bodyName?: never }\n | { bodyName: Bodies; cameraName?: never; siteName?: never };\n\nexport interface NamedCameraFrameResource {\n name: string | null | undefined;\n}\n\nexport interface ResolveMountedCameraFrameSourceOptions {\n cameras?: readonly (Cameras | NamedCameraFrameResource | null | undefined)[];\n sites?: readonly (Sites | NamedCameraFrameResource | null | undefined)[];\n bodies?: readonly (Bodies | NamedCameraFrameResource | null | undefined)[];\n aliases?: Record<\n string,\n CameraFrameMountSelector | readonly CameraFrameMountSelector[]\n >;\n /**\n * Accept the first valid alias selector even when the current resource\n * inventory cannot verify it. This is useful when aliases come from a\n * previously validated model inventory and the actual provider will validate\n * again during capture.\n */\n allowAliasFallback?: boolean;\n}\n\nexport interface ResolvedMountedCameraFrameSource {\n key: string;\n selector: CameraFrameMountSelector;\n source: MountedCameraFrameCaptureSource;\n}\n\nexport const MountedCameraFrameSourceSuggestionMatch = {\n Direct: 'direct',\n Alias: 'alias',\n Normalized: 'normalized',\n Prefix: 'prefix',\n Suffix: 'suffix',\n Contains: 'contains',\n} as const;\n\nexport type MountedCameraFrameSourceSuggestionMatch =\n (typeof MountedCameraFrameSourceSuggestionMatch)[keyof typeof MountedCameraFrameSourceSuggestionMatch];\n\nexport interface MountedCameraFrameSourceSuggestion {\n key: string;\n selector: CameraFrameMountSelector;\n source: MountedCameraFrameCaptureSource;\n resourceName: string;\n resourceKind: MountedCameraFrameCaptureSource['kind'];\n match: MountedCameraFrameSourceSuggestionMatch;\n}\n\nexport type MountedCameraFrameSequenceDefaults = Omit<\n CameraFrameSequenceCamera,\n 'key' | 'cameraName' | 'siteName' | 'bodyName' | 'source'\n>;\n\nexport type MountedCameraFrameSequenceCameraOptions = Partial<\n MountedCameraFrameSequenceDefaults\n>;\n\nexport interface CreateMountedCameraFrameSequencePlanOptions\n extends ResolveMountedCameraFrameSourceOptions {\n defaults?: MountedCameraFrameSequenceDefaults;\n cameraOptions?: Record<string, MountedCameraFrameSequenceCameraOptions>;\n requireAll?: boolean;\n}\n\nexport interface MountedCameraFrameSequencePlan {\n cameraKeys: string[];\n cameras: CameraFrameSequenceCamera[];\n resolved: Record<string, ResolvedMountedCameraFrameSource>;\n missingKeys: string[];\n}\n\nexport const MountedCameraFrameSequenceReadinessStatus = {\n Ready: 'ready',\n Partial: 'partial',\n Missing: 'missing',\n} as const;\n\nexport type MountedCameraFrameSequenceReadinessStatus =\n (typeof MountedCameraFrameSequenceReadinessStatus)[keyof typeof MountedCameraFrameSequenceReadinessStatus];\n\nexport interface MountedCameraFrameSequenceSourceReadiness {\n key: string;\n ready: boolean;\n selector?: CameraFrameMountSelector;\n source?: MountedCameraFrameCaptureSource;\n message: string;\n}\n\nexport interface MountedCameraFrameSequenceReadiness {\n ready: boolean;\n status: MountedCameraFrameSequenceReadinessStatus;\n cameraKeys: string[];\n resolvedKeys: string[];\n missingKeys: string[];\n cameras: Record<string, MountedCameraFrameSequenceSourceReadiness>;\n message: string;\n}\n\nexport type MountedCameraFrameSequencePlanOptions = Omit<\n CreateMountedCameraFrameSequencePlanOptions,\n 'cameras' | 'sites' | 'bodies'\n>;\n\nexport interface MountedCameraFrameSequenceRecordOptions\n extends Omit<CameraFrameSequenceOptions, 'cameras'>,\n MountedCameraFrameSequencePlanOptions {\n cameraKeys: readonly string[];\n}\n\nexport interface MountedCameraFrameSequenceRecordResult\n extends CameraFrameSequenceResult {\n plan: MountedCameraFrameSequencePlan;\n readiness: MountedCameraFrameSequenceReadiness;\n}\n\nexport const MountedCameraFrameSequenceManifestStatus = {\n Complete: 'complete',\n Partial: 'partial',\n Missing: 'missing',\n} as const;\n\nexport type MountedCameraFrameSequenceManifestStatus =\n (typeof MountedCameraFrameSequenceManifestStatus)[keyof typeof MountedCameraFrameSequenceManifestStatus];\n\nexport interface MountedCameraFrameSequenceStreamSummary {\n key: string;\n ready: boolean;\n complete: boolean;\n status: MountedCameraFrameSequenceManifestStatus;\n source?: CameraFrameCaptureSource;\n selector?: CameraFrameMountSelector;\n target?: string;\n width?: number;\n height?: number;\n expectedFrameCount: number;\n recordedFrameCount: number;\n missingFrameCount: number;\n firstFrameIndex: number | null;\n lastFrameIndex: number | null;\n firstTimestamp: number | null;\n lastTimestamp: number | null;\n message: string;\n}\n\nexport interface CreateMountedCameraFrameSequenceManifestOptions {\n expectedFrameCount?: number;\n cameraKeys?: readonly string[];\n}\n\nexport interface MountedCameraFrameSequenceManifest {\n schema: 'mujoco-react/mounted-camera-frame-sequence-manifest@1';\n ready: boolean;\n complete: boolean;\n status: MountedCameraFrameSequenceManifestStatus;\n cameraKeys: string[];\n resolvedKeys: string[];\n missingKeys: string[];\n expectedFrameCount: number;\n recordedFrameCount: number;\n missingFrameCount: number;\n streamSummaries: Record<string, MountedCameraFrameSequenceStreamSummary>;\n streams: MountedCameraFrameSequenceStreamSummary[];\n readiness: MountedCameraFrameSequenceReadiness;\n message: string;\n}\n\nexport type MountedCameraFrameSequenceRecorderTarget = Pick<\n MujocoSimAPI,\n 'getCameras' | 'getSites' | 'getBodies' | 'recordCameraSequence'\n>;\n\nfunction getResourceName(\n resource: string | NamedCameraFrameResource | null | undefined\n) {\n if (!resource) return null;\n return typeof resource === 'string' ? resource : resource.name ?? null;\n}\n\nfunction createNameSet(\n resources:\n | readonly (string | NamedCameraFrameResource | null | undefined)[]\n | undefined\n) {\n return new Set(\n (resources ?? [])\n .map((resource) => getResourceName(resource))\n .filter((name): name is string => Boolean(name))\n );\n}\n\nfunction createResourceNames(\n resources:\n | readonly (string | NamedCameraFrameResource | null | undefined)[]\n | undefined\n) {\n return (resources ?? [])\n .map((resource) => getResourceName(resource))\n .filter((name): name is string => Boolean(name));\n}\n\nfunction normalizeAliasCandidates(\n value: CameraFrameMountSelector | readonly CameraFrameMountSelector[] | undefined\n) {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction countMountedSelectors(selector: CameraFrameMountSelector) {\n return Number(Boolean(selector.cameraName)) +\n Number(Boolean(selector.siteName)) +\n Number(Boolean(selector.bodyName));\n}\n\nfunction normalizeCameraSourceName(value: string) {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '');\n}\n\nfunction createCameraSourceKeyVariants(key: string) {\n const candidates = [\n key,\n key.startsWith('observation.images.')\n ? key.slice('observation.images.'.length)\n : '',\n key.includes('.') ? key.split('.').at(-1) ?? '' : '',\n key.includes('/') ? key.split('/').at(-1) ?? '' : '',\n ];\n return candidates\n .map((candidate) => candidate.trim())\n .filter((candidate, index, items) => candidate && items.indexOf(candidate) === index);\n}\n\nfunction getSelectorKey(selector: CameraFrameMountSelector) {\n if (selector.cameraName) return `camera:${selector.cameraName}`;\n if (selector.siteName) return `site:${selector.siteName}`;\n if (selector.bodyName) return `body:${selector.bodyName}`;\n return null;\n}\n\nexport function getMountedCameraFrameCaptureSource(\n selector: CameraFrameMountSelector\n): MountedCameraFrameCaptureSource | null {\n if (countMountedSelectors(selector) !== 1) return null;\n if (selector.cameraName) {\n return { kind: 'mujoco-camera', cameraName: selector.cameraName };\n }\n if (selector.siteName) {\n return { kind: 'mujoco-site', siteName: selector.siteName };\n }\n if (selector.bodyName) {\n return { kind: 'mujoco-body', bodyName: selector.bodyName };\n }\n return null;\n}\n\nexport function isMountedCameraFrameCaptureSource(\n source: CameraFrameCaptureSource\n): source is MountedCameraFrameCaptureSource {\n return (\n source.kind === 'mujoco-camera' ||\n source.kind === 'mujoco-site' ||\n source.kind === 'mujoco-body'\n );\n}\n\nexport function getCameraFrameCaptureSourceTarget(\n source: CameraFrameCaptureSource\n) {\n if (source.kind === 'mujoco-camera') return source.cameraName;\n if (source.kind === 'mujoco-site') return source.siteName;\n if (source.kind === 'mujoco-body') return source.bodyName;\n if (source.kind === 'custom-camera') return 'custom camera';\n if (source.kind === 'explicit-pose') return 'explicit pose';\n return 'fallback camera';\n}\n\nfunction createMountedCameraFrameSourceSuggestion(\n key: string,\n selector: CameraFrameMountSelector,\n resourceName: string,\n match: MountedCameraFrameSourceSuggestionMatch\n): MountedCameraFrameSourceSuggestion | null {\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) return null;\n return {\n key,\n selector,\n source,\n resourceName,\n resourceKind: source.kind,\n match,\n };\n}\n\nfunction addMountedCameraFrameSourceSuggestion(\n suggestions: MountedCameraFrameSourceSuggestion[],\n seen: Set<string>,\n suggestion: MountedCameraFrameSourceSuggestion | null\n) {\n if (!suggestion) return;\n const selectorKey = getSelectorKey(suggestion.selector);\n if (!selectorKey || seen.has(selectorKey)) return;\n seen.add(selectorKey);\n suggestions.push(suggestion);\n}\n\nfunction getCameraFrameResourceMatch(\n key: string,\n resourceName: string\n): MountedCameraFrameSourceSuggestionMatch | null {\n if (resourceName === key) return MountedCameraFrameSourceSuggestionMatch.Direct;\n\n const normalizedResource = normalizeCameraSourceName(resourceName);\n if (!normalizedResource) return null;\n\n for (const variant of createCameraSourceKeyVariants(key)) {\n if (resourceName === variant) return MountedCameraFrameSourceSuggestionMatch.Direct;\n\n const normalizedKey = normalizeCameraSourceName(variant);\n if (!normalizedKey) continue;\n if (normalizedResource === normalizedKey) {\n return MountedCameraFrameSourceSuggestionMatch.Normalized;\n }\n if (normalizedResource.startsWith(`${normalizedKey}_`)) {\n return MountedCameraFrameSourceSuggestionMatch.Prefix;\n }\n if (normalizedResource.endsWith(`_${normalizedKey}`)) {\n return MountedCameraFrameSourceSuggestionMatch.Suffix;\n }\n if (normalizedResource.includes(`_${normalizedKey}_`)) {\n return MountedCameraFrameSourceSuggestionMatch.Contains;\n }\n }\n return null;\n}\n\nfunction isSelectorMounted(\n selector: CameraFrameMountSelector,\n cameraNames: Set<string>,\n siteNames: Set<string>,\n bodyNames: Set<string>\n) {\n if (countMountedSelectors(selector) !== 1) return false;\n return (\n (selector.cameraName ? cameraNames.has(selector.cameraName) : false) ||\n (selector.siteName ? siteNames.has(selector.siteName) : false) ||\n (selector.bodyName ? bodyNames.has(selector.bodyName) : false)\n );\n}\n\nexport function createMountedCameraFrameSourceSuggestions(\n key: string,\n options: ResolveMountedCameraFrameSourceOptions\n): MountedCameraFrameSourceSuggestion[] {\n const cameraNames = createNameSet(options.cameras);\n const siteNames = createNameSet(options.sites);\n const bodyNames = createNameSet(options.bodies);\n const suggestions: MountedCameraFrameSourceSuggestion[] = [];\n const seen = new Set<string>();\n\n for (const selector of normalizeAliasCandidates(options.aliases?.[key])) {\n if (!isSelectorMounted(selector, cameraNames, siteNames, bodyNames)) {\n continue;\n }\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) continue;\n addMountedCameraFrameSourceSuggestion(\n suggestions,\n seen,\n createMountedCameraFrameSourceSuggestion(\n key,\n selector,\n getCameraFrameCaptureSourceTarget(source),\n MountedCameraFrameSourceSuggestionMatch.Alias\n )\n );\n }\n\n for (const cameraName of createResourceNames(options.cameras)) {\n const match = getCameraFrameResourceMatch(key, cameraName);\n if (!match) continue;\n addMountedCameraFrameSourceSuggestion(\n suggestions,\n seen,\n createMountedCameraFrameSourceSuggestion(\n key,\n { cameraName },\n cameraName,\n match\n )\n );\n }\n\n for (const siteName of createResourceNames(options.sites)) {\n const match = getCameraFrameResourceMatch(key, siteName);\n if (!match) continue;\n addMountedCameraFrameSourceSuggestion(\n suggestions,\n seen,\n createMountedCameraFrameSourceSuggestion(\n key,\n { siteName },\n siteName,\n match\n )\n );\n }\n\n for (const bodyName of createResourceNames(options.bodies)) {\n const match = getCameraFrameResourceMatch(key, bodyName);\n if (!match) continue;\n addMountedCameraFrameSourceSuggestion(\n suggestions,\n seen,\n createMountedCameraFrameSourceSuggestion(\n key,\n { bodyName },\n bodyName,\n match\n )\n );\n }\n\n return suggestions;\n}\n\nexport function resolveMountedCameraFrameSource(\n key: string,\n options: ResolveMountedCameraFrameSourceOptions\n): ResolvedMountedCameraFrameSource | null {\n const cameraNames = createNameSet(options.cameras);\n const siteNames = createNameSet(options.sites);\n const bodyNames = createNameSet(options.bodies);\n const directCandidates: CameraFrameMountSelector[] = [\n { cameraName: key },\n { siteName: key },\n { bodyName: key },\n ];\n const aliasCandidates = normalizeAliasCandidates(options.aliases?.[key]);\n\n for (const selector of aliasCandidates) {\n if (!isSelectorMounted(selector, cameraNames, siteNames, bodyNames)) {\n continue;\n }\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) continue;\n return { key, selector, source };\n }\n\n const [suggestion] = createMountedCameraFrameSourceSuggestions(key, options);\n if (suggestion) {\n return {\n key,\n selector: suggestion.selector,\n source: suggestion.source,\n };\n }\n\n if (options.allowAliasFallback) {\n for (const selector of aliasCandidates) {\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) continue;\n return { key, selector, source };\n }\n }\n\n for (const selector of directCandidates) {\n if (!isSelectorMounted(selector, cameraNames, siteNames, bodyNames)) {\n continue;\n }\n const source = getMountedCameraFrameCaptureSource(selector);\n if (!source) continue;\n return { key, selector, source };\n }\n\n return null;\n}\n\nexport function createMountedCameraFrameSequencePlan(\n cameraKeys: readonly string[],\n options: CreateMountedCameraFrameSequencePlanOptions\n): MountedCameraFrameSequencePlan {\n const cameras: CameraFrameSequenceCamera[] = [];\n const resolved: Record<string, ResolvedMountedCameraFrameSource> = {};\n const missingKeys: string[] = [];\n\n for (const key of cameraKeys) {\n const mountedSource = resolveMountedCameraFrameSource(key, options);\n if (!mountedSource) {\n missingKeys.push(key);\n continue;\n }\n\n resolved[key] = mountedSource;\n cameras.push({\n key,\n ...options.defaults,\n ...options.cameraOptions?.[key],\n ...mountedSource.selector,\n source: mountedSource.source,\n });\n }\n\n if (options.requireAll && missingKeys.length > 0) {\n throw new Error(\n `Unable to resolve mounted MuJoCo camera source${\n missingKeys.length === 1 ? '' : 's'\n } for ${missingKeys.join(', ')}.`\n );\n }\n\n return {\n cameraKeys: [...cameraKeys],\n cameras,\n resolved,\n missingKeys,\n };\n}\n\nexport function createMountedCameraFrameSequenceReadiness(\n plan: MountedCameraFrameSequencePlan\n): MountedCameraFrameSequenceReadiness {\n const cameras: Record<string, MountedCameraFrameSequenceSourceReadiness> = {};\n const resolvedKeys = plan.cameraKeys.filter((key) => Boolean(plan.resolved[key]));\n\n for (const key of plan.cameraKeys) {\n const resolved = plan.resolved[key];\n cameras[key] = resolved\n ? {\n key,\n ready: true,\n selector: resolved.selector,\n source: resolved.source,\n message: `Camera stream \"${key}\" resolves to ${resolved.source.kind}:${getCameraFrameCaptureSourceTarget(resolved.source)}.`,\n }\n : {\n key,\n ready: false,\n message: `Camera stream \"${key}\" does not resolve to a mounted MuJoCo camera, site, or body.`,\n };\n }\n\n const missingKeys = [...plan.missingKeys];\n const ready = missingKeys.length === 0;\n const status: MountedCameraFrameSequenceReadinessStatus = ready\n ? MountedCameraFrameSequenceReadinessStatus.Ready\n : resolvedKeys.length > 0\n ? MountedCameraFrameSequenceReadinessStatus.Partial\n : MountedCameraFrameSequenceReadinessStatus.Missing;\n\n return {\n ready,\n status,\n cameraKeys: [...plan.cameraKeys],\n resolvedKeys,\n missingKeys,\n cameras,\n message: ready\n ? `All ${plan.cameraKeys.length} requested camera stream${\n plan.cameraKeys.length === 1 ? '' : 's'\n } resolve to mounted MuJoCo sources.`\n : `Missing mounted MuJoCo source${\n missingKeys.length === 1 ? '' : 's'\n } for ${missingKeys.join(', ')}.`,\n };\n}\n\nfunction normalizeFrameCount(frameCount: number | undefined) {\n return Number.isFinite(frameCount) && frameCount !== undefined\n ? Math.max(0, Math.floor(frameCount))\n : 0;\n}\n\nexport function createMountedCameraFrameSequenceManifest(\n result: MountedCameraFrameSequenceRecordResult,\n options: CreateMountedCameraFrameSequenceManifestOptions = {}\n): MountedCameraFrameSequenceManifest {\n const cameraKeys = [\n ...(options.cameraKeys ??\n result.readiness.cameraKeys ??\n result.plan.cameraKeys ??\n result.cameraKeys),\n ];\n const expectedFrameCount = normalizeFrameCount(\n options.expectedFrameCount ?? result.frameCount\n );\n const recordedFrameCount = normalizeFrameCount(result.frameCount);\n const streamSummaries: Record<string, MountedCameraFrameSequenceStreamSummary> =\n {};\n const streams: MountedCameraFrameSequenceStreamSummary[] = [];\n let missingFrameCount = 0;\n let completeStreamCount = 0;\n let resolvedOrRecordedStreamCount = 0;\n\n for (const key of cameraKeys) {\n const summary = result.cameraSummaries[key];\n const readiness = result.readiness.cameras[key];\n const source = summary?.source ?? readiness?.source;\n const ready = readiness?.ready ?? Boolean(summary);\n const recorded = normalizeFrameCount(summary?.frameCount);\n const missing = Math.max(expectedFrameCount - recorded, 0);\n const complete = ready && missing === 0;\n const status = complete\n ? MountedCameraFrameSequenceManifestStatus.Complete\n : ready || recorded > 0\n ? MountedCameraFrameSequenceManifestStatus.Partial\n : MountedCameraFrameSequenceManifestStatus.Missing;\n const target = source\n ? getCameraFrameCaptureSourceTarget(source)\n : readiness?.message\n ? undefined\n : 'missing MuJoCo camera';\n const message = complete\n ? `Camera stream \"${key}\" recorded ${recorded} of ${expectedFrameCount} frame${\n expectedFrameCount === 1 ? '' : 's'\n }.`\n : ready || recorded > 0\n ? `Camera stream \"${key}\" recorded ${recorded} of ${expectedFrameCount} frame${\n expectedFrameCount === 1 ? '' : 's'\n }.`\n : readiness?.message ??\n `Camera stream \"${key}\" did not record any frames.`;\n const stream = {\n key,\n ready,\n complete,\n status,\n source,\n selector: readiness?.selector,\n target,\n width: summary?.width,\n height: summary?.height,\n expectedFrameCount,\n recordedFrameCount: recorded,\n missingFrameCount: missing,\n firstFrameIndex: summary?.firstFrameIndex ?? null,\n lastFrameIndex: summary?.lastFrameIndex ?? null,\n firstTimestamp: summary?.firstTimestamp ?? null,\n lastTimestamp: summary?.lastTimestamp ?? null,\n message,\n };\n\n streamSummaries[key] = stream;\n streams.push(stream);\n missingFrameCount += missing;\n if (complete) completeStreamCount += 1;\n if (ready || recorded > 0) resolvedOrRecordedStreamCount += 1;\n }\n\n const complete =\n result.readiness.ready &&\n streams.length === completeStreamCount &&\n missingFrameCount === 0;\n const status = complete\n ? MountedCameraFrameSequenceManifestStatus.Complete\n : resolvedOrRecordedStreamCount > 0\n ? MountedCameraFrameSequenceManifestStatus.Partial\n : MountedCameraFrameSequenceManifestStatus.Missing;\n\n return {\n schema: 'mujoco-react/mounted-camera-frame-sequence-manifest@1',\n ready: result.readiness.ready,\n complete,\n status,\n cameraKeys,\n resolvedKeys: [...result.readiness.resolvedKeys],\n missingKeys: [...result.readiness.missingKeys],\n expectedFrameCount,\n recordedFrameCount,\n missingFrameCount,\n streamSummaries,\n streams,\n readiness: result.readiness,\n message: complete\n ? `All ${cameraKeys.length} camera stream${\n cameraKeys.length === 1 ? '' : 's'\n } recorded ${expectedFrameCount} frame${\n expectedFrameCount === 1 ? '' : 's'\n }.`\n : `Mounted camera sequence coverage is ${status}.`,\n };\n}\n\nexport function createMountedCameraFrameSequencePlanFromApi(\n api: MountedCameraFrameSequenceRecorderTarget,\n cameraKeys: readonly string[],\n options: MountedCameraFrameSequencePlanOptions = {}\n): MountedCameraFrameSequencePlan {\n return createMountedCameraFrameSequencePlan(cameraKeys, {\n ...options,\n cameras: api.getCameras(),\n sites: api.getSites(),\n bodies: api.getBodies(),\n });\n}\n\nexport async function recordMountedCameraFrameSequence(\n api: MountedCameraFrameSequenceRecorderTarget,\n options: MountedCameraFrameSequenceRecordOptions\n): Promise<MountedCameraFrameSequenceRecordResult> {\n const { cameraKeys, ...restOptions } = options;\n const requireAll =\n restOptions.requireAll ?? restOptions.requireMountedSources ?? true;\n const plan = createMountedCameraFrameSequencePlanFromApi(\n api,\n cameraKeys,\n { ...restOptions, requireAll }\n );\n const readiness = createMountedCameraFrameSequenceReadiness(plan);\n const result = await api.recordCameraSequence({\n ...restOptions,\n cameras: plan.cameras,\n requireMountedSources: restOptions.requireMountedSources ?? true,\n });\n\n return {\n ...result,\n plan,\n readiness,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Project detector/image coordinates from a camera view into the rendered MuJoCo scene.\n */\n\nimport * as THREE from 'three';\nimport type {\n CameraFrameCaptureOptions,\n CameraFrameCaptureSource,\n ImagePointCoordinateSpace,\n ImagePointProjectionOptions,\n ImagePointProjectionResult,\n} from '../types';\nimport { CAPTURE_EXCLUDE_KEY } from './cameraFrameCapture';\n\nconst _raycaster = new THREE.Raycaster();\nconst _ndc = new THREE.Vector2();\n\nfunction toVector3(\n value: CameraFrameCaptureOptions['position'] | undefined,\n fallback: THREE.Vector3\n) {\n if (!value) return fallback.clone();\n return value instanceof THREE.Vector3\n ? value.clone()\n : new THREE.Vector3(value[0], value[1], value[2]);\n}\n\nfunction applyCameraPose(\n camera: THREE.Camera,\n options: CameraFrameCaptureOptions,\n fallbackCamera: THREE.Camera\n) {\n camera.position.copy(toVector3(options.position, fallbackCamera.position));\n camera.up.copy(toVector3(options.up, fallbackCamera.up));\n\n if (options.quaternion) {\n if (options.quaternion instanceof THREE.Quaternion) {\n camera.quaternion.copy(options.quaternion);\n } else {\n camera.quaternion.set(\n options.quaternion[0],\n options.quaternion[1],\n options.quaternion[2],\n options.quaternion[3]\n );\n }\n } else if (options.lookAt) {\n camera.lookAt(toVector3(options.lookAt, new THREE.Vector3()));\n } else {\n camera.quaternion.copy(fallbackCamera.quaternion);\n }\n\n camera.updateMatrixWorld();\n}\n\nfunction createProjectionCamera(\n fallbackCamera: THREE.Camera,\n options: CameraFrameCaptureOptions,\n width: number,\n height: number\n) {\n const camera = options.camera\n ? options.camera.clone()\n : fallbackCamera instanceof THREE.PerspectiveCamera\n ? fallbackCamera.clone()\n : new THREE.PerspectiveCamera(45, width / height, 0.01, 100);\n\n if (camera instanceof THREE.PerspectiveCamera) {\n camera.aspect = width / height;\n camera.fov = options.fov ?? camera.fov;\n camera.near = options.near ?? camera.near;\n camera.far = options.far ?? camera.far;\n camera.updateProjectionMatrix();\n }\n\n applyCameraPose(camera, options, fallbackCamera);\n return camera;\n}\n\nfunction getProjectionSource(options: CameraFrameCaptureOptions): CameraFrameCaptureSource {\n if (options.source) return options.source;\n if (options.cameraName) return { kind: 'mujoco-camera', cameraName: options.cameraName };\n if (options.siteName) return { kind: 'mujoco-site', siteName: options.siteName };\n if (options.bodyName) return { kind: 'mujoco-body', bodyName: options.bodyName };\n if (options.camera) return { kind: 'custom-camera' };\n if (options.position || options.lookAt || options.quaternion) return { kind: 'explicit-pose' };\n return { kind: 'fallback-camera' };\n}\n\nfunction imageSize(\n renderer: THREE.WebGLRenderer,\n options: ImagePointProjectionOptions\n): [number, number] {\n return [\n Math.max(1, Math.floor(options.imageWidth ?? options.width ?? renderer.domElement.width)),\n Math.max(1, Math.floor(options.imageHeight ?? options.height ?? renderer.domElement.height)),\n ];\n}\n\nexport function imagePointToNdc(\n x: number,\n y: number,\n coordinateSpace: ImagePointCoordinateSpace = 'normalized',\n width = 1,\n height = 1\n): [number, number] {\n if (coordinateSpace === 'ndc') return [x, y];\n if (coordinateSpace === 'normalized-1000') {\n return [(x / 1000) * 2 - 1, 1 - (y / 1000) * 2];\n }\n if (coordinateSpace === 'pixel') {\n return [(x / width) * 2 - 1, 1 - (y / height) * 2];\n }\n return [x * 2 - 1, 1 - y * 2];\n}\n\nfunction isProjectionCandidate(object: THREE.Object3D, options: ImagePointProjectionOptions) {\n if (!object.visible) return false;\n if (object.userData[CAPTURE_EXCLUDE_KEY]) return false;\n\n const geomGroup = object.userData.geomGroup;\n const geomName = object.userData.geomName;\n if (options.hiddenGeomNames && typeof geomName === 'string' && options.hiddenGeomNames.includes(geomName)) {\n return false;\n }\n if (options.hiddenGeomGroups && typeof geomGroup === 'number' && options.hiddenGeomGroups.includes(geomGroup)) {\n return false;\n }\n if (options.visibleGeomGroups && typeof geomGroup === 'number' && !options.visibleGeomGroups.includes(geomGroup)) {\n return false;\n }\n return true;\n}\n\nfunction findBodyId(object: THREE.Object3D) {\n let current: THREE.Object3D | null = object;\n while (current && current.userData.bodyID === undefined && current.parent) {\n current = current.parent;\n }\n return typeof current?.userData.bodyID === 'number' ? current.userData.bodyID : -1;\n}\n\nexport function projectImagePointTo3D(\n renderer: THREE.WebGLRenderer,\n scene: THREE.Scene,\n fallbackCamera: THREE.Camera,\n options: ImagePointProjectionOptions\n): ImagePointProjectionResult | null {\n const [width, height] = imageSize(renderer, options);\n const [ndcX, ndcY] = imagePointToNdc(\n options.x,\n options.y,\n options.coordinateSpace,\n width,\n height\n );\n const projectionCamera = createProjectionCamera(fallbackCamera, options, width, height);\n\n scene.updateMatrixWorld(true);\n _ndc.set(ndcX, ndcY);\n _raycaster.setFromCamera(_ndc, projectionCamera);\n _raycaster.far = options.maxDistance ?? Infinity;\n\n const objects: THREE.Object3D[] = [];\n scene.traverse((object) => {\n if ((object as THREE.Mesh).isMesh && isProjectionCandidate(object, options)) {\n objects.push(object);\n }\n });\n\n const [hit] = _raycaster.intersectObjects(objects, true);\n if (!hit) return null;\n\n return {\n point: hit.point.clone(),\n bodyId: findBodyId(hit.object),\n geomId: typeof hit.object.userData.geomID === 'number' ? hit.object.userData.geomID : -1,\n distance: hit.distance,\n ndc: [ndcX, ndcY],\n imageSize: [width, height],\n source: getProjectionSource(options),\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, useThree } from '@react-three/fiber';\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport * as THREE from 'three';\nimport { MujocoData, MujocoModel, MujocoModule, getContact, withContacts } from '../types';\nimport { SceneRenderer } from '../components/SceneRenderer';\nimport { CameraViewportProvider } from '../components/CameraView';\nimport {\n ActuatedJointInfo,\n ActuatorInfo,\n BodyInfo,\n CameraFrameCaptureOptions,\n CameraFrameCaptureResult,\n CameraFrameCaptureSource,\n CameraFrameSequenceFrame,\n CameraFrameSequenceOptions,\n CameraFrameSequenceResult,\n CameraInfo,\n ControlGroupInfo,\n ControlGroupSelector,\n ContactInfo,\n GeomInfo,\n ImagePointProjectionOptions,\n ImagePointProjectionResult,\n JointInfo,\n LoadFromFilesOptions,\n LocalMujocoFile,\n ModelOptions,\n MujocoRenderOptions,\n MujocoSimAPI,\n PhysicsStepCallback,\n RayHit,\n ReadyCallbackInput,\n SceneConfig,\n SceneObject,\n SelectionCallbackInput,\n SensorInfo,\n SiteInfo,\n StateSnapshot,\n StepCallbackInput,\n XmlPatch,\n} from '../types';\nimport {\n captureFrame as captureCanvasFrame,\n captureFrameBlob as captureCanvasFrameBlob,\n} from '../hooks/useFrameCapture';\nimport {\n captureCameraFrame,\n captureCameraFrameBlob,\n createCameraFrameCaptureSession,\n type CameraFrameCaptureTensorOptions,\n} from '../rendering/cameraFrameCapture';\nimport {\n getCameraFrameCaptureSourceTarget,\n isMountedCameraFrameCaptureSource,\n} from '../rendering/cameraFrameSource';\nimport { projectImagePointTo3D as projectImagePointTo3DFromScene } from '../rendering/imageProjection';\nimport {\n loadScene,\n createSceneConfigFromFiles,\n findKeyframeByName,\n findBodyByName,\n findSiteByName,\n findGeomByName,\n findSensorByName,\n findActuatorByName,\n findCameraByName,\n getActuatedScalarQposAdr,\n getActuatedJoints as getActuatedJointsFromModel,\n getControlMap as getControlMapFromModel,\n getName,\n resolveControlGroup as resolveControlGroupFromModel,\n} from './SceneLoader';\n\n// ---- Joint type names ----\nconst JOINT_TYPE_NAMES = ['free', 'ball', 'slide', 'hinge'];\n// ---- Geom type names ----\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\n// ---- Sensor type names (subset — MuJoCo has many) ----\nconst SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'camprojection', 9: 'jointpos', 10: 'jointvel', 11: 'tendonpos',\n 12: 'tendonvel', 13: 'actuatorpos', 14: 'actuatorvel', 15: 'actuatorfrc',\n 16: 'jointactfrc', 17: 'tendonactfrc', 18: 'ballquat', 19: 'ballangvel',\n 20: 'jointlimitpos', 21: 'jointlimitvel', 22: 'jointlimitfrc',\n 23: 'tendonlimitpos', 24: 'tendonlimitvel', 25: 'tendonlimitfrc',\n 26: 'framepos', 27: 'framequat', 28: 'framexaxis', 29: 'frameyaxis',\n 30: 'framezaxis', 31: 'framelinvel', 32: 'frameangvel',\n 33: 'framelinacc', 34: 'frameangacc', 35: 'subtreecom',\n 36: 'subtreelinvel', 37: 'subtreeangmom', 38: 'insidesite',\n 39: 'geomdist', 40: 'geomnormal', 41: 'geomfromto',\n 42: 'contact', 43: 'e_potential', 44: 'e_kinetic',\n 45: 'clock', 46: 'tactile', 47: 'plugin', 48: 'user',\n};\n\nconst EMPTY_CONTROL_GROUP: ControlGroupInfo = {\n joints: [],\n actuators: [],\n qposAdr: [],\n dofAdr: [],\n ctrlAdr: [],\n readQpos: () => new Float64Array(0),\n readCtrl: () => new Float64Array(0),\n writeQpos: () => {},\n writeCtrl: () => {},\n};\n\nfunction isMutableApiRef(\n ref: React.ForwardedRef<MujocoSimAPI>\n): ref is React.MutableRefObject<MujocoSimAPI | null> {\n return typeof ref === 'object' && ref !== null && 'current' in ref;\n}\n\n// Preallocated force/torque temps for applyForce/applyTorque\nconst _applyForce = new Float64Array(3);\nconst _applyTorque = new Float64Array(3);\nconst _applyPoint = new Float64Array(3);\nconst _rayPnt = new Float64Array(3);\nconst _rayVec = new Float64Array(3);\nconst _rayGeomId = new Int32Array(1);\nconst _projRaycaster = new THREE.Raycaster();\nconst _projNdc = new THREE.Vector2();\n\nfunction waitForNextAnimationFrame() {\n return new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n}\n\nfunction throwIfCameraSequenceAborted(signal: AbortSignal | undefined) {\n if (!signal?.aborted) return;\n\n if (typeof signal.reason === 'object' && signal.reason instanceof Error) {\n throw signal.reason;\n }\n\n throw new DOMException('Camera sequence recording was aborted.', 'AbortError');\n}\n\nfunction vector3FromArray(values: ArrayLike<number>, offset: number): [number, number, number] {\n return [values[offset], values[offset + 1], values[offset + 2]];\n}\n\nfunction quaternionFromMujocoQuat(values: ArrayLike<number>, offset: number): [number, number, number, number] {\n return [\n values[offset + 1],\n values[offset + 2],\n values[offset + 3],\n values[offset],\n ];\n}\n\nfunction quaternionFromXmat(values: ArrayLike<number>, offset: number): [number, number, number, number] {\n const matrix = new THREE.Matrix4();\n matrix.set(\n values[offset],\n values[offset + 1],\n values[offset + 2],\n 0,\n values[offset + 3],\n values[offset + 4],\n values[offset + 5],\n 0,\n values[offset + 6],\n values[offset + 7],\n values[offset + 8],\n 0,\n 0,\n 0,\n 0,\n 1\n );\n const quaternion = new THREE.Quaternion().setFromRotationMatrix(matrix);\n return [quaternion.x, quaternion.y, quaternion.z, quaternion.w];\n}\n\nfunction omitResolvedCameraSelectors(\n options: CameraFrameCaptureOptions\n): CameraFrameCaptureOptions {\n const { cameraName, siteName, bodyName, ...rest } = options;\n return rest;\n}\n\nfunction vector3FromCaptureValue(value: NonNullable<CameraFrameCaptureOptions['positionOffset']>) {\n return value instanceof THREE.Vector3\n ? value.clone()\n : new THREE.Vector3(value[0], value[1], value[2]);\n}\n\nfunction quaternionFromCaptureValue(value: NonNullable<CameraFrameCaptureOptions['quaternionOffset']>) {\n return value instanceof THREE.Quaternion\n ? value.clone()\n : new THREE.Quaternion(value[0], value[1], value[2], value[3]);\n}\n\nfunction applyMountedCameraPoseOffsets(\n options: CameraFrameCaptureOptions,\n position: [number, number, number],\n quaternion: [number, number, number, number]\n) {\n const resolvedPosition = new THREE.Vector3(position[0], position[1], position[2]);\n const resolvedQuaternion = new THREE.Quaternion(\n quaternion[0],\n quaternion[1],\n quaternion[2],\n quaternion[3]\n );\n\n if (options.positionOffset) {\n resolvedPosition.add(\n vector3FromCaptureValue(options.positionOffset).applyQuaternion(resolvedQuaternion)\n );\n }\n\n if (options.quaternionOffset) {\n resolvedQuaternion.multiply(quaternionFromCaptureValue(options.quaternionOffset)).normalize();\n }\n\n return {\n position: [\n resolvedPosition.x,\n resolvedPosition.y,\n resolvedPosition.z,\n ] as [number, number, number],\n quaternion: [\n resolvedQuaternion.x,\n resolvedQuaternion.y,\n resolvedQuaternion.z,\n resolvedQuaternion.w,\n ] as [number, number, number, number],\n };\n}\n\nfunction resolveMujocoCameraCompatibilityOptions(\n options: CameraFrameCaptureOptions\n) {\n const compatibility = options.mujocoCameraCompatibility;\n if (!compatibility) return null;\n if (compatibility === true) {\n return {\n useResolution: true,\n useIntrinsics: true,\n useClipping: true,\n preserveAspect: true,\n preferResolution: false,\n };\n }\n return {\n useResolution: compatibility.useResolution ?? true,\n useIntrinsics: compatibility.useIntrinsics ?? true,\n useClipping: compatibility.useClipping ?? true,\n preserveAspect: compatibility.preserveAspect ?? true,\n preferResolution: compatibility.preferResolution ?? false,\n };\n}\n\nfunction mujocoVisualClip(model: MujocoModel) {\n const map = (model as unknown as {\n vis?: { map?: { znear?: number; zfar?: number } };\n }).vis?.map;\n const near = typeof map?.znear === 'number' && map.znear > 0\n ? map.znear\n : undefined;\n const far = typeof map?.zfar === 'number' && map.zfar > 0\n ? map.zfar\n : undefined;\n return { near, far };\n}\n\nfunction mujocoCameraResolution(\n model: MujocoModel,\n cameraId: number\n): { width?: number; height?: number } {\n const resolution = model.cam_resolution;\n if (!resolution) return {};\n const width = Number(resolution[cameraId * 2]);\n const height = Number(resolution[cameraId * 2 + 1]);\n return {\n width: Number.isFinite(width) && width > 0 ? width : undefined,\n height: Number.isFinite(height) && height > 0 ? height : undefined,\n };\n}\n\nfunction mujocoCameraProjectionMatrix(\n model: MujocoModel,\n cameraId: number,\n width: number | undefined,\n height: number | undefined,\n near: number | undefined,\n far: number | undefined\n): THREE.Matrix4 | undefined {\n const intrinsic = model.cam_intrinsic;\n const sensorSize = model.cam_sensorsize;\n if (!intrinsic || !sensorSize || !width || !height) return undefined;\n\n const intrinsicOffset = cameraId * 4;\n const sensorOffset = cameraId * 2;\n const focalX = Number(intrinsic[intrinsicOffset]);\n const focalY = Number(intrinsic[intrinsicOffset + 1]);\n const principalX = Number(intrinsic[intrinsicOffset + 2]);\n const principalY = Number(intrinsic[intrinsicOffset + 3]);\n const sensorWidth = Number(sensorSize[sensorOffset]);\n const sensorHeight = Number(sensorSize[sensorOffset + 1]);\n if (\n !Number.isFinite(focalX) ||\n !Number.isFinite(focalY) ||\n !Number.isFinite(principalX) ||\n !Number.isFinite(principalY) ||\n !Number.isFinite(sensorWidth) ||\n !Number.isFinite(sensorHeight) ||\n focalX <= 0 ||\n focalY <= 0 ||\n sensorWidth <= 0 ||\n sensorHeight <= 0\n ) {\n return undefined;\n }\n\n const fx = focalX / sensorWidth * width;\n const fy = focalY / sensorHeight * height;\n const cx = width * (0.5 + principalX / sensorWidth);\n const cy = height * (0.5 + principalY / sensorHeight);\n const znear = near ?? 0.01;\n const zfar = far ?? 100;\n\n return new THREE.Matrix4().set(\n 2 * fx / width, 0, 1 - 2 * cx / width, 0,\n 0, 2 * fy / height, 2 * cy / height - 1, 0,\n 0, 0, -(zfar + znear) / (zfar - znear), -2 * zfar * znear / (zfar - znear),\n 0, 0, -1, 0\n );\n}\n\nfunction resolveMujocoCameraCaptureDimensions(\n requested: CameraFrameCaptureOptions,\n cameraResolution: { width?: number; height?: number },\n compatibility: NonNullable<ReturnType<typeof resolveMujocoCameraCompatibilityOptions>>\n) {\n if (!compatibility.useResolution) {\n return {\n width: requested.width,\n height: requested.height,\n };\n }\n\n if (compatibility.preferResolution) {\n return {\n width: cameraResolution.width ?? requested.width,\n height: cameraResolution.height ?? requested.height,\n };\n }\n\n let width = requested.width ?? cameraResolution.width;\n let height = requested.height ?? cameraResolution.height;\n\n if (\n compatibility.preserveAspect &&\n cameraResolution.width &&\n cameraResolution.height\n ) {\n if (requested.width !== undefined && requested.height === undefined) {\n height = requested.width * cameraResolution.height / cameraResolution.width;\n } else if (requested.height !== undefined && requested.width === undefined) {\n width = requested.height * cameraResolution.width / cameraResolution.height;\n }\n }\n\n return { width, height };\n}\n\nfunction countMountedCameraSelectors(options: CameraFrameCaptureOptions) {\n return Number(Boolean(options.cameraName)) +\n Number(Boolean(options.siteName)) +\n Number(Boolean(options.bodyName));\n}\n\nfunction assertMatchingMountedCameraSource(\n key: string,\n requested: CameraFrameCaptureOptions,\n source: CameraFrameCaptureSource\n) {\n const selectorCount = countMountedCameraSelectors(requested);\n if (selectorCount !== 1) {\n throw new Error(\n `Camera sequence stream \"${key}\" must provide exactly one mounted MuJoCo cameraName, siteName, or bodyName selector.`\n );\n }\n\n if (!isMountedCameraFrameCaptureSource(source)) {\n throw new Error(\n `Camera sequence stream \"${key}\" resolved to ${source.kind}; use a MuJoCo-mounted camera, site, or body selector for sequence recording.`\n );\n }\n\n if (\n (requested.cameraName &&\n (source.kind !== 'mujoco-camera' || source.cameraName !== requested.cameraName)) ||\n (requested.siteName &&\n (source.kind !== 'mujoco-site' || source.siteName !== requested.siteName)) ||\n (requested.bodyName &&\n (source.kind !== 'mujoco-body' || source.bodyName !== requested.bodyName))\n ) {\n throw new Error(\n `Camera sequence stream \"${key}\" resolved to ${source.kind}:${getCameraFrameCaptureSourceTarget(source)} instead of the requested mounted selector.`\n );\n }\n}\n\n// ---- Internal context types ----\n\nexport interface MujocoSimContextValue {\n api: MujocoSimAPI;\n mjModelRef: React.RefObject<MujocoModel | null>;\n mjDataRef: React.RefObject<MujocoData | null>;\n mujocoRef: React.RefObject<MujocoModule>;\n configRef: React.RefObject<SceneConfig>;\n pausedRef: React.RefObject<boolean>;\n speedRef: React.RefObject<number>;\n substepsRef: React.RefObject<number>;\n interpolateRef: React.RefObject<boolean>;\n interpolationStateRef: React.RefObject<BodyInterpolationState>;\n onSelectionRef: React.RefObject<\n ((input: SelectionCallbackInput) => void) | undefined\n >;\n beforeStepCallbacks: React.RefObject<Set<PhysicsStepCallback>>;\n afterStepCallbacks: React.RefObject<Set<PhysicsStepCallback>>;\n resetCallbacks: React.RefObject<Set<() => void>>;\n errorRef: React.RefObject<string | null>;\n bodyRegistryRef: React.RefObject<Map<string, { definition: SceneObject; hasCustomChildren: boolean }>>;\n hiddenBodiesRef: React.RefObject<Set<string>>;\n requestBodyReload: () => void;\n status: 'loading' | 'ready' | 'error';\n}\n\nexport interface BodyInterpolationState {\n alpha: number;\n previousXpos: Float64Array;\n previousXquat: Float64Array;\n currentXpos: Float64Array;\n currentXquat: Float64Array;\n valid: boolean;\n}\n\nconst MujocoSimContext = createContext<MujocoSimContextValue | null>(null);\n\nexport type UseMujocoResult =\n | { status: 'loading'; isPending: true; isReady: false; isError: false; error: null; api: null; mjModelRef: null; mjDataRef: null }\n | { status: 'error'; isPending: false; isReady: false; isError: true; error: string; api: null; mjModelRef: null; mjDataRef: null }\n | { status: 'ready'; isPending: false; isReady: true; isError: false; error: null;\n api: MujocoSimAPI; mjModelRef: React.RefObject<MujocoModel | null>; mjDataRef: React.RefObject<MujocoData | null> };\n\nexport function useMujocoContext(): MujocoSimContextValue {\n const ctx = useContext(MujocoSimContext);\n if (!ctx)\n throw new Error('useMujoco must be used inside <MujocoSimProvider>');\n return ctx;\n}\n\nexport function useMujoco(): UseMujocoResult {\n const ctx = useMujocoContext();\n if (ctx.status === 'ready') {\n return {\n status: 'ready',\n isPending: false,\n isReady: true,\n isError: false,\n error: null,\n api: ctx.api,\n mjModelRef: ctx.mjModelRef,\n mjDataRef: ctx.mjDataRef,\n };\n }\n if (ctx.status === 'error') {\n return {\n status: 'error',\n isPending: false,\n isReady: false,\n isError: true,\n error: ctx.errorRef.current ?? 'Unknown error',\n api: null,\n mjModelRef: null,\n mjDataRef: null,\n };\n }\n return {\n status: 'loading',\n isPending: true,\n isReady: false,\n isError: false,\n error: null,\n api: null,\n mjModelRef: null,\n mjDataRef: null,\n };\n}\n\nexport function useBeforePhysicsStep(callback: PhysicsStepCallback) {\n const { beforeStepCallbacks } = useMujocoContext();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (input) => callbackRef.current(input);\n beforeStepCallbacks.current.add(wrapped);\n return () => { beforeStepCallbacks.current.delete(wrapped); };\n }, [beforeStepCallbacks]);\n}\n\nexport function useAfterPhysicsStep(callback: PhysicsStepCallback) {\n const { afterStepCallbacks } = useMujocoContext();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (input) => callbackRef.current(input);\n afterStepCallbacks.current.add(wrapped);\n return () => { afterStepCallbacks.current.delete(wrapped); };\n }, [afterStepCallbacks]);\n}\n\ninterface MujocoSimProviderProps {\n mujoco: MujocoModule;\n config: SceneConfig;\n apiRef?: React.ForwardedRef<MujocoSimAPI>;\n onReady?: (input: ReadyCallbackInput) => void;\n onError?: (error: Error) => void;\n onStep?: (input: StepCallbackInput) => void;\n onSelection?: (input: SelectionCallbackInput) => void;\n // Declarative physics config props\n gravity?: [number, number, number];\n timestep?: number;\n substeps?: number;\n paused?: boolean;\n speed?: number;\n interpolate?: boolean;\n renderOptions?: MujocoRenderOptions;\n children: React.ReactNode;\n}\n\nexport function MujocoSimProvider({\n mujoco,\n config,\n apiRef: externalApiRef,\n onReady,\n onError,\n onStep,\n onSelection,\n gravity,\n timestep,\n substeps,\n paused,\n speed,\n interpolate,\n renderOptions,\n children,\n}: MujocoSimProviderProps) {\n const { gl, camera, scene } = useThree();\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n\n // --- Refs ---\n const mjModelRef = useRef<MujocoModel | null>(null);\n const mjDataRef = useRef<MujocoData | null>(null);\n const mujocoRef = useRef<MujocoModule>(mujoco);\n const configRef = useRef<SceneConfig>(config);\n const pausedRef = useRef(paused ?? false);\n const speedRef = useRef(speed ?? 1);\n const substepsRef = useRef(substeps ?? 1);\n const interpolateRef = useRef(interpolate ?? false);\n const interpolationStateRef = useRef<BodyInterpolationState>({\n alpha: 1,\n previousXpos: new Float64Array(0),\n previousXquat: new Float64Array(0),\n currentXpos: new Float64Array(0),\n currentXquat: new Float64Array(0),\n valid: false,\n });\n const physicsAccumulatorRef = useRef(0);\n const stepsToRunRef = useRef(0);\n const loadGenRef = useRef(0);\n\n const onSelectionRef = useRef(onSelection);\n onSelectionRef.current = onSelection;\n const onStepRef = useRef(onStep);\n onStepRef.current = onStep;\n\n const beforeStepCallbacks = useRef(new Set<PhysicsStepCallback>());\n const afterStepCallbacks = useRef(new Set<PhysicsStepCallback>());\n const resetCallbacks = useRef(new Set<() => void>());\n const errorRef = useRef<string | null>(null);\n const bodyRegistryRef = useRef(new Map<string, { definition: SceneObject; hasCustomChildren: boolean }>());\n const hiddenBodiesRef = useRef(new Set<string>());\n const bodyReloadTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n configRef.current = config;\n mujocoRef.current = mujoco;\n pausedRef.current = paused ?? false;\n speedRef.current = speed ?? 1;\n substepsRef.current = substeps ?? 1;\n interpolateRef.current = interpolate ?? false;\n\n // Sync gravity prop\n useEffect(() => {\n if (!gravity) return;\n const model = mjModelRef.current;\n if (!model?.opt?.gravity) return;\n model.opt.gravity[0] = gravity[0];\n model.opt.gravity[1] = gravity[1];\n model.opt.gravity[2] = gravity[2];\n }, [gravity]);\n\n // Sync timestep prop\n useEffect(() => {\n if (timestep === undefined) return;\n const model = mjModelRef.current;\n if (!model?.opt) return;\n model.opt.timestep = timestep;\n }, [timestep]);\n\n // --- Build merged config (base + body registry) ---\n function buildMergedConfig(baseConfig: SceneConfig): SceneConfig {\n if (bodyRegistryRef.current.size === 0) return baseConfig;\n const registeredNames = new Set(bodyRegistryRef.current.keys());\n const baseObjects = (baseConfig.sceneObjects ?? []).filter(o => !registeredNames.has(o.name));\n const registeredBodies = Array.from(bodyRegistryRef.current.values()).map(e => e.definition);\n hiddenBodiesRef.current.clear();\n for (const [name, entry] of bodyRegistryRef.current) {\n if (entry.hasCustomChildren) hiddenBodiesRef.current.add(name);\n }\n return { ...baseConfig, sceneObjects: [...baseObjects, ...registeredBodies] };\n }\n\n // --- Load scene on mount ---\n useEffect(() => {\n let disposed = false;\n\n (async () => {\n try {\n const result = await loadScene(mujoco, buildMergedConfig(config));\n if (disposed) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mujocoRef.current = mujoco;\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n\n // Apply declarative physics props after load\n if (gravity && result.mjModel.opt?.gravity) {\n result.mjModel.opt.gravity[0] = gravity[0];\n result.mjModel.opt.gravity[1] = gravity[1];\n result.mjModel.opt.gravity[2] = gravity[2];\n }\n if (timestep !== undefined && result.mjModel.opt) {\n result.mjModel.opt.timestep = timestep;\n }\n\n setStatus('ready');\n } catch (e: unknown) {\n if (!disposed) {\n const err = e instanceof Error ? e : new Error(String(e));\n errorRef.current = err.message;\n setStatus('error');\n onError?.(err);\n }\n }\n })();\n\n return () => {\n disposed = true;\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n };\n }, [mujoco, config]);\n\n // Fire onReady and assign external ref when status changes to ready\n useEffect(() => {\n if (status === 'ready') {\n const api = apiRef.current;\n if (onReady) onReady({ api });\n // Assign the forwarded ref\n if (externalApiRef) {\n if (typeof externalApiRef === 'function') {\n externalApiRef(api);\n } else if (isMutableApiRef(externalApiRef)) {\n externalApiRef.current = api;\n }\n }\n }\n }, [status]);\n\n // --- Physics step (priority -1) ---\n useFrame((_state, delta) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n // Check single-step mode\n const shouldStep = !pausedRef.current || stepsToRunRef.current > 0;\n if (!shouldStep) return;\n\n // Zero generalized applied forces\n for (let i = 0; i < model.nv; i++) {\n data.qfrc_applied[i] = 0;\n }\n\n // Before-step callbacks\n for (const cb of beforeStepCallbacks.current) {\n cb({ model, data });\n }\n\n const numSubsteps = substepsRef.current;\n if (!interpolateRef.current) {\n // Step physics with substeps\n if (stepsToRunRef.current > 0) {\n for (let s = 0; s < stepsToRunRef.current; s++) {\n mujocoRef.current.mj_step(model, data);\n }\n stepsToRunRef.current = 0;\n } else {\n const startSimTime = data.time;\n const clampedDelta = Math.min(delta, 1 / 15); // cap to avoid spiral of death\n const frameTime = clampedDelta * speedRef.current;\n while (data.time - startSimTime < frameTime) {\n for (let s = 0; s < numSubsteps; s++) {\n mujocoRef.current.mj_step(model, data);\n }\n }\n }\n } else if (stepsToRunRef.current > 0) {\n ensureInterpolationBuffers(model);\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n for (let s = 0; s < stepsToRunRef.current; s++) {\n mujocoRef.current.mj_step(model, data);\n }\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n interpolationStateRef.current.alpha = 1;\n interpolationStateRef.current.valid = true;\n stepsToRunRef.current = 0;\n } else {\n ensureInterpolationBuffers(model);\n const clampedDelta = Math.min(delta, 1 / 15); // cap to avoid spiral of death\n physicsAccumulatorRef.current += clampedDelta * speedRef.current;\n const stepDt = Math.max((model.opt?.timestep ?? 0.002) * Math.max(1, numSubsteps), 1e-6);\n let stepped = false;\n\n while (physicsAccumulatorRef.current >= stepDt) {\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n for (let s = 0; s < numSubsteps; s++) {\n mujocoRef.current.mj_step(model, data);\n }\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n physicsAccumulatorRef.current -= stepDt;\n stepped = true;\n }\n\n if (!interpolationStateRef.current.valid) {\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n }\n\n interpolationStateRef.current.alpha = Math.min(Math.max(physicsAccumulatorRef.current / stepDt, 0), 1);\n interpolationStateRef.current.valid = true;\n\n if (!stepped) {\n onStepRef.current?.({ time: data.time, model, data });\n return;\n }\n }\n\n // After-step callbacks\n for (const cb of afterStepCallbacks.current) {\n cb({ model, data });\n }\n\n onStepRef.current?.({ time: data.time, model, data });\n }, -1);\n\n function ensureInterpolationBuffers(model: MujocoModel) {\n const state = interpolationStateRef.current;\n const xposLength = model.nbody * 3;\n const xquatLength = model.nbody * 4;\n if (state.previousXpos.length !== xposLength) state.previousXpos = new Float64Array(xposLength);\n if (state.currentXpos.length !== xposLength) state.currentXpos = new Float64Array(xposLength);\n if (state.previousXquat.length !== xquatLength) state.previousXquat = new Float64Array(xquatLength);\n if (state.currentXquat.length !== xquatLength) state.currentXquat = new Float64Array(xquatLength);\n }\n\n function copyBodyPose(data: MujocoData, xpos: Float64Array, xquat: Float64Array) {\n xpos.set(data.xpos.subarray(0, xpos.length));\n xquat.set(data.xquat.subarray(0, xquat.length));\n }\n\n // --- API Methods ---\n\n const reset = useCallback(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n mujocoRef.current.mj_resetData(model, data);\n\n const homeJoints = configRef.current.homeJoints;\n if (homeJoints) {\n const homeCount = Math.min(homeJoints.length, model.nu);\n for (let i = 0; i < homeCount; i++) {\n data.ctrl[i] = homeJoints[i];\n const qposAdr = getActuatedScalarQposAdr(model, i);\n if (qposAdr !== -1) {\n data.qpos[qposAdr] = homeJoints[i];\n }\n }\n }\n\n configRef.current.onReset?.({ model, data });\n mujocoRef.current.mj_forward(model, data);\n\n // Notify composable plugins (e.g. IkController)\n for (const cb of resetCallbacks.current) {\n cb();\n }\n }, [mujoco]);\n\n const setSpeed = useCallback((multiplier: number) => {\n speedRef.current = multiplier;\n }, []);\n\n const togglePause = useCallback((): boolean => {\n pausedRef.current = !pausedRef.current;\n return pausedRef.current;\n }, []);\n\n const setPaused = useCallback((p: boolean) => {\n pausedRef.current = p;\n }, []);\n\n const step = useCallback((n = 1) => {\n stepsToRunRef.current = n;\n }, []);\n\n const stepImmediately = useCallback((steps = 1) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return false;\n\n for (let stepIndex = 0; stepIndex < steps; stepIndex += 1) {\n for (let i = 0; i < model.nv; i += 1) {\n data.qfrc_applied[i] = 0;\n }\n for (const cb of beforeStepCallbacks.current) {\n cb({ model, data });\n }\n mujocoRef.current.mj_step(model, data);\n for (const cb of afterStepCallbacks.current) {\n cb({ model, data });\n }\n onStepRef.current?.({ time: data.time, model, data });\n }\n\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n return true;\n }, [mujoco]);\n\n const getTime = useCallback((): number => {\n return mjDataRef.current?.time ?? 0;\n }, []);\n\n const getTimestep = useCallback((): number => {\n return mjModelRef.current?.opt?.timestep ?? 0.002;\n }, []);\n\n const saveState = useCallback((): StateSnapshot => {\n const data = mjDataRef.current;\n if (!data) return { time: 0, qpos: new Float64Array(0), qvel: new Float64Array(0), ctrl: new Float64Array(0), act: new Float64Array(0), qfrc_applied: new Float64Array(0) };\n return {\n time: data.time,\n qpos: new Float64Array(data.qpos),\n qvel: new Float64Array(data.qvel),\n ctrl: new Float64Array(data.ctrl),\n act: new Float64Array(data.act),\n qfrc_applied: new Float64Array(data.qfrc_applied),\n };\n }, []);\n\n const restoreState = useCallback((snapshot: StateSnapshot) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n data.time = snapshot.time;\n data.qpos.set(snapshot.qpos);\n data.qvel.set(snapshot.qvel);\n data.ctrl.set(snapshot.ctrl);\n if (snapshot.act.length > 0) data.act.set(snapshot.act);\n data.qfrc_applied.set(snapshot.qfrc_applied);\n mujocoRef.current.mj_forward(model, data);\n }, [mujoco]);\n\n const setQpos = useCallback((values: Float64Array | number[]) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n const arr = values instanceof Float64Array ? values : new Float64Array(values);\n data.qpos.set(arr.subarray(0, Math.min(arr.length, model.nq)));\n mujocoRef.current.mj_forward(model, data);\n }, [mujoco]);\n\n const setQvel = useCallback((values: Float64Array | number[]) => {\n const data = mjDataRef.current;\n if (!data) return;\n const arr = values instanceof Float64Array ? values : new Float64Array(values);\n data.qvel.set(arr.subarray(0, Math.min(arr.length, mjModelRef.current?.nv ?? 0)));\n }, []);\n\n const getQpos = useCallback((): Float64Array => {\n return mjDataRef.current ? new Float64Array(mjDataRef.current.qpos) : new Float64Array(0);\n }, []);\n\n const getQvel = useCallback((): Float64Array => {\n return mjDataRef.current ? new Float64Array(mjDataRef.current.qvel) : new Float64Array(0);\n }, []);\n\n const setCtrl = useCallback((nameOrValues: string | Record<string, number>, value?: number) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n if (typeof nameOrValues === 'string') {\n const id = findActuatorByName(model, nameOrValues);\n if (id >= 0 && value !== undefined) data.ctrl[id] = value;\n } else {\n for (const [name, val] of Object.entries(nameOrValues)) {\n const id = findActuatorByName(model, name);\n if (id >= 0) data.ctrl[id] = val;\n }\n }\n }, []);\n\n const getCtrl = useCallback((): Float64Array => {\n return mjDataRef.current ? new Float64Array(mjDataRef.current.ctrl) : new Float64Array(0);\n }, []);\n\n const applyForce = useCallback((bodyName: string, force: THREE.Vector3, point?: THREE.Vector3) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n const bodyId = findBodyByName(model, bodyName);\n if (bodyId < 0) return;\n\n _applyForce[0] = force.x; _applyForce[1] = force.y; _applyForce[2] = force.z;\n _applyTorque[0] = 0; _applyTorque[1] = 0; _applyTorque[2] = 0;\n if (point) {\n _applyPoint[0] = point.x; _applyPoint[1] = point.y; _applyPoint[2] = point.z;\n } else {\n const i3 = bodyId * 3;\n _applyPoint[0] = data.xpos[i3]; _applyPoint[1] = data.xpos[i3 + 1]; _applyPoint[2] = data.xpos[i3 + 2];\n }\n mujoco.mj_applyFT(model, data, _applyForce, _applyTorque, _applyPoint, bodyId, data.qfrc_applied);\n }, [mujoco]);\n\n const applyTorqueApi = useCallback((bodyName: string, torque: THREE.Vector3) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n const bodyId = findBodyByName(model, bodyName);\n if (bodyId < 0) return;\n\n _applyForce[0] = 0; _applyForce[1] = 0; _applyForce[2] = 0;\n _applyTorque[0] = torque.x; _applyTorque[1] = torque.y; _applyTorque[2] = torque.z;\n const i3 = bodyId * 3;\n _applyPoint[0] = data.xpos[i3]; _applyPoint[1] = data.xpos[i3 + 1]; _applyPoint[2] = data.xpos[i3 + 2];\n mujoco.mj_applyFT(model, data, _applyForce, _applyTorque, _applyPoint, bodyId, data.qfrc_applied);\n }, [mujoco]);\n\n const setExternalForce = useCallback((bodyName: string, force: THREE.Vector3, torque: THREE.Vector3) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n const bodyId = findBodyByName(model, bodyName);\n if (bodyId < 0) return;\n const i6 = bodyId * 6;\n data.xfrc_applied[i6] = torque.x; data.xfrc_applied[i6 + 1] = torque.y; data.xfrc_applied[i6 + 2] = torque.z;\n data.xfrc_applied[i6 + 3] = force.x; data.xfrc_applied[i6 + 4] = force.y; data.xfrc_applied[i6 + 5] = force.z;\n }, []);\n\n const applyGeneralizedForce = useCallback((values: Float64Array | number[]) => {\n const data = mjDataRef.current;\n if (!data) return;\n const nv = mjModelRef.current?.nv ?? 0;\n for (let i = 0; i < Math.min(values.length, nv); i++) {\n data.qfrc_applied[i] += values[i];\n }\n }, []);\n\n const getSensorData = useCallback((name: string): Float64Array | null => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return null;\n const id = findSensorByName(model, name);\n if (id < 0) return null;\n const adr = model.sensor_adr[id];\n const dim = model.sensor_dim[id];\n return new Float64Array(data.sensordata.subarray(adr, adr + dim));\n }, []);\n\n const getContacts = useCallback((): ContactInfo[] => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return [];\n const contacts: ContactInfo[] = [];\n const ncon = data.ncon;\n withContacts(data, (contactArray) => {\n for (let i = 0; i < ncon; i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n contacts.push({\n geom1: c.geom1,\n geom1Name: getName(model, model.name_geomadr[c.geom1]),\n geom2: c.geom2,\n geom2Name: getName(model, model.name_geomadr[c.geom2]),\n pos: [c.pos[0], c.pos[1], c.pos[2]],\n depth: c.dist,\n });\n }\n });\n return contacts;\n }, []);\n\n const getBodies = useCallback((): BodyInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: BodyInfo[] = [];\n for (let i = 0; i < model.nbody; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_bodyadr[i]),\n mass: model.body_mass[i],\n parentId: model.body_parentid[i],\n });\n }\n return result;\n }, []);\n\n const getJoints = useCallback((): JointInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: JointInfo[] = [];\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const range: [number, number] = [model.jnt_range[2 * i], model.jnt_range[2 * i + 1]];\n result.push({\n id: i,\n name: getName(model, model.name_jntadr[i]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range,\n limited: range[0] < range[1],\n bodyId: model.jnt_bodyid[i],\n qposAdr: model.jnt_qposadr[i],\n dofAdr: model.jnt_dofadr[i],\n });\n }\n return result;\n }, []);\n\n const getGeoms = useCallback((): GeomInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: GeomInfo[] = [];\n for (let i = 0; i < model.ngeom; i++) {\n const type = model.geom_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_geomadr[i]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `unknown(${type})`,\n size: [model.geom_size[3 * i], model.geom_size[3 * i + 1], model.geom_size[3 * i + 2]],\n bodyId: model.geom_bodyid[i],\n });\n }\n return result;\n }, []);\n\n const getSites = useCallback((): SiteInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SiteInfo[] = [];\n for (let i = 0; i < model.nsite; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_siteadr[i]),\n bodyId: model.site_bodyid ? model.site_bodyid[i] : -1,\n });\n }\n return result;\n }, []);\n\n const getActuatorsApi = useCallback((): ActuatorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const hasRange = model.actuator_ctrlrange[2 * i] < model.actuator_ctrlrange[2 * i + 1];\n result.push({\n id: i,\n name: getName(model, model.name_actuatoradr[i]),\n range: hasRange\n ? [model.actuator_ctrlrange[2 * i], model.actuator_ctrlrange[2 * i + 1]]\n : [-Infinity, Infinity],\n });\n }\n return result;\n }, []);\n\n const getControlMapApi = useCallback((): ControlGroupInfo => {\n const model = mjModelRef.current;\n return model ? getControlMapFromModel(model) : EMPTY_CONTROL_GROUP;\n }, []);\n\n const getActuatedJointsApi = useCallback((): ActuatedJointInfo[] => {\n const model = mjModelRef.current;\n return model ? getActuatedJointsFromModel(model) : [];\n }, []);\n\n const resolveControlGroupApi = useCallback((selector: ControlGroupSelector): ControlGroupInfo | null => {\n const model = mjModelRef.current;\n return model ? resolveControlGroupFromModel(model, selector) : null;\n }, []);\n\n const getSensors = useCallback((): SensorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, []);\n\n const getCameras = useCallback((): CameraInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const ncam = model.ncam ?? 0;\n const nameAddresses = model.name_camadr;\n if (!ncam || !nameAddresses) return [];\n\n const result: CameraInfo[] = [];\n for (let i = 0; i < ncam; i += 1) {\n const posOffset = i * 3;\n const quatOffset = i * 4;\n const intrinsicOffset = i * 4;\n const resolutionOffset = i * 2;\n result.push({\n id: i,\n name: getName(model, nameAddresses[i]),\n bodyId: model.cam_bodyid?.[i] ?? -1,\n fov: model.cam_fovy?.[i] ?? null,\n resolution: model.cam_resolution\n ? [\n model.cam_resolution[resolutionOffset],\n model.cam_resolution[resolutionOffset + 1],\n ]\n : null,\n sensorSize: model.cam_sensorsize\n ? [\n model.cam_sensorsize[resolutionOffset],\n model.cam_sensorsize[resolutionOffset + 1],\n ]\n : null,\n intrinsic: model.cam_intrinsic\n ? [\n model.cam_intrinsic[intrinsicOffset],\n model.cam_intrinsic[intrinsicOffset + 1],\n model.cam_intrinsic[intrinsicOffset + 2],\n model.cam_intrinsic[intrinsicOffset + 3],\n ]\n : null,\n position: model.cam_pos\n ? vector3FromArray(model.cam_pos, posOffset)\n : null,\n quaternion: model.cam_quat\n ? quaternionFromMujocoQuat(model.cam_quat, quatOffset)\n : null,\n });\n }\n return result;\n }, []);\n\n const resolveCameraCaptureOptions = useCallback(\n (options: CameraFrameCaptureOptions = {}): CameraFrameCaptureOptions => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) {\n return options;\n }\n\n const baseOptions = omitResolvedCameraSelectors(options);\n\n if (options.cameraName) {\n const cameraId = findCameraByName(model, options.cameraName);\n if (cameraId < 0) {\n throw new Error(`MuJoCo camera \"${options.cameraName}\" was not found.`);\n }\n\n const position = data.cam_xpos\n ? vector3FromArray(data.cam_xpos, cameraId * 3)\n : model.cam_pos\n ? vector3FromArray(model.cam_pos, cameraId * 3)\n : undefined;\n const quaternion = data.cam_xmat\n ? quaternionFromXmat(data.cam_xmat, cameraId * 9)\n : model.cam_quat\n ? quaternionFromMujocoQuat(model.cam_quat, cameraId * 4)\n : undefined;\n\n if (!position || !quaternion) {\n throw new Error(\n `MuJoCo camera \"${options.cameraName}\" does not expose a capture pose.`\n );\n }\n\n const pose = applyMountedCameraPoseOffsets(options, position, quaternion);\n const compatibility = resolveMujocoCameraCompatibilityOptions(options);\n const cameraResolution = compatibility?.useResolution\n ? mujocoCameraResolution(model, cameraId)\n : { width: undefined, height: undefined };\n const clip = compatibility?.useClipping\n ? mujocoVisualClip(model)\n : { near: undefined, far: undefined };\n const { width, height } = compatibility\n ? resolveMujocoCameraCaptureDimensions(options, cameraResolution, compatibility)\n : { width: options.width, height: options.height };\n const near = options.near ?? clip.near;\n const far = options.far ?? clip.far;\n const projectionMatrix = compatibility?.useIntrinsics\n ? mujocoCameraProjectionMatrix(model, cameraId, width, height, near, far)\n : undefined;\n\n return {\n ...baseOptions,\n width,\n height,\n ...pose,\n fov: options.fov ?? model.cam_fovy?.[cameraId],\n near,\n far,\n projectionMatrix: options.projectionMatrix ?? projectionMatrix,\n source: { kind: 'mujoco-camera', cameraName: options.cameraName },\n };\n }\n\n if (options.siteName) {\n const siteId = findSiteByName(model, options.siteName);\n if (siteId < 0) {\n throw new Error(`MuJoCo site \"${options.siteName}\" was not found.`);\n }\n\n const pose = applyMountedCameraPoseOffsets(\n options,\n vector3FromArray(data.site_xpos, siteId * 3),\n quaternionFromXmat(data.site_xmat, siteId * 9)\n );\n\n return {\n ...baseOptions,\n ...pose,\n source: { kind: 'mujoco-site', siteName: options.siteName },\n };\n }\n\n if (options.bodyName) {\n const bodyId = findBodyByName(model, options.bodyName);\n if (bodyId < 0) {\n throw new Error(`MuJoCo body \"${options.bodyName}\" was not found.`);\n }\n if (!data.xmat) {\n throw new Error(\n `MuJoCo body \"${options.bodyName}\" does not expose world orientation data.`\n );\n }\n\n const pose = applyMountedCameraPoseOffsets(\n options,\n vector3FromArray(data.xpos, bodyId * 3),\n quaternionFromXmat(data.xmat, bodyId * 9)\n );\n\n return {\n ...baseOptions,\n ...pose,\n source: { kind: 'mujoco-body', bodyName: options.bodyName },\n };\n }\n\n return options;\n },\n []\n );\n\n const getModelOption = useCallback((): ModelOptions => {\n const model = mjModelRef.current;\n if (!model?.opt) return { timestep: 0.002, gravity: [0, 0, -9.81], integrator: 0 };\n return {\n timestep: model.opt.timestep,\n gravity: [model.opt.gravity[0], model.opt.gravity[1], model.opt.gravity[2]],\n integrator: model.opt.integrator,\n };\n }, []);\n\n const setGravity = useCallback((g: [number, number, number]) => {\n const model = mjModelRef.current;\n if (!model?.opt?.gravity) return;\n model.opt.gravity[0] = g[0];\n model.opt.gravity[1] = g[1];\n model.opt.gravity[2] = g[2];\n }, []);\n\n const setTimestepApi = useCallback((dt: number) => {\n const model = mjModelRef.current;\n if (!model?.opt) return;\n model.opt.timestep = dt;\n }, []);\n\n const raycast = useCallback((origin: THREE.Vector3, direction: THREE.Vector3, maxDist = 100): RayHit | null => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return null;\n\n _rayPnt[0] = origin.x; _rayPnt[1] = origin.y; _rayPnt[2] = origin.z;\n const dir = direction.clone().normalize();\n _rayVec[0] = dir.x; _rayVec[1] = dir.y; _rayVec[2] = dir.z;\n _rayGeomId[0] = -1;\n\n try {\n const dist = mujoco.mj_ray(model, data, _rayPnt, _rayVec, null, 1, -1, _rayGeomId);\n if (dist < 0 || dist > maxDist) return null;\n const geomId = _rayGeomId[0];\n const bodyId = geomId >= 0 ? model.geom_bodyid[geomId] : -1;\n return {\n point: new THREE.Vector3(\n origin.x + dir.x * dist,\n origin.y + dir.y * dist,\n origin.z + dir.z * dist,\n ),\n bodyId,\n geomId,\n distance: dist,\n };\n } catch {\n return null;\n }\n }, [mujoco]);\n\n const applyKeyframe = useCallback((nameOrIndex: string | number) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n let keyId: number;\n if (typeof nameOrIndex === 'number') {\n keyId = nameOrIndex;\n } else {\n keyId = findKeyframeByName(model, nameOrIndex);\n }\n if (keyId < 0 || keyId >= model.nkey) {\n console.warn(`applyKeyframe: keyframe \"${nameOrIndex}\" not found`);\n return;\n }\n\n const nq = model.nq;\n const nu = model.nu;\n const qposOffset = keyId * nq;\n for (let i = 0; i < nq; i++) data.qpos[i] = model.key_qpos[qposOffset + i];\n const ctrlOffset = keyId * nu;\n for (let i = 0; i < nu; i++) data.ctrl[i] = model.key_ctrl[ctrlOffset + i];\n\n if (model.key_qvel) {\n const qvelOffset = keyId * model.nv;\n for (let i = 0; i < model.nv; i++) data.qvel[i] = model.key_qvel[qvelOffset + i];\n }\n\n mujocoRef.current.mj_forward(model, data);\n\n // Notify composable plugins\n for (const cb of resetCallbacks.current) {\n cb();\n }\n }, [mujoco]);\n\n const getKeyframeNames = useCallback((): string[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const names: string[] = [];\n for (let i = 0; i < model.nkey; i++) {\n names.push(getName(model, model.name_keyadr[i]));\n }\n return names;\n }, []);\n\n const getKeyframeCount = useCallback((): number => {\n return mjModelRef.current?.nkey ?? 0;\n }, []);\n\n const loadSceneApi = useCallback(async (newConfig: SceneConfig): Promise<void> => {\n const gen = ++loadGenRef.current;\n try {\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n setStatus('loading');\n\n const result = await loadScene(mujoco, buildMergedConfig(newConfig));\n\n if (gen !== loadGenRef.current) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n configRef.current = newConfig;\n\n setStatus('ready');\n } catch (e) {\n if (gen !== loadGenRef.current) return;\n errorRef.current = e instanceof Error ? e.message : String(e);\n setStatus('error');\n throw e;\n }\n }, [mujoco]);\n\n const requestBodyReload = useCallback(() => {\n if (bodyReloadTimerRef.current) clearTimeout(bodyReloadTimerRef.current);\n bodyReloadTimerRef.current = setTimeout(() => {\n bodyReloadTimerRef.current = null;\n loadSceneApi(configRef.current);\n }, 0);\n }, [loadSceneApi]);\n\n const loadFromFilesApi = useCallback(\n async (files: FileList | readonly LocalMujocoFile[], options?: LoadFromFilesOptions): Promise<void> => {\n await loadSceneApi(createSceneConfigFromFiles(files, options));\n },\n [loadSceneApi]\n );\n\n const addBodyApi = useCallback(async (body: SceneObject): Promise<void> => {\n const current = configRef.current;\n const sceneObjects = [\n ...(current.sceneObjects ?? []).filter((obj) => obj.name !== body.name),\n body,\n ];\n await loadSceneApi({ ...current, sceneObjects });\n }, [loadSceneApi]);\n\n const removeBodyApi = useCallback(async (name: string): Promise<void> => {\n const current = configRef.current;\n bodyRegistryRef.current.delete(name);\n const sceneObjects = (current.sceneObjects ?? []).filter((obj) => obj.name !== name);\n await loadSceneApi({ ...current, sceneObjects });\n }, [loadSceneApi]);\n\n const recompileApi = useCallback(async (patches: XmlPatch[] = []): Promise<void> => {\n const current = configRef.current;\n await loadSceneApi({\n ...current,\n xmlPatches: patches.length ? [...(current.xmlPatches ?? []), ...patches] : current.xmlPatches,\n });\n }, [loadSceneApi]);\n\n const getCanvasSnapshot = useCallback(\n (width?: number, height?: number, mimeType = 'image/jpeg'): string => {\n if (width && height) {\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = width;\n tempCanvas.height = height;\n const ctx = tempCanvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(gl.domElement, 0, 0, width, height);\n return tempCanvas.toDataURL(mimeType, mimeType === 'image/jpeg' ? 0.8 : undefined);\n }\n }\n return gl.domElement.toDataURL(mimeType, mimeType === 'image/jpeg' ? 0.8 : undefined);\n },\n [gl]\n );\n\n const getCanvas = useCallback((): HTMLCanvasElement | null => {\n return gl.domElement ?? null;\n }, [gl]);\n\n const captureFrameApi = useCallback(\n (options = {}) => {\n return captureCanvasFrame({ ...options, target: gl.domElement });\n },\n [gl]\n );\n\n const captureFrameBlobApi = useCallback(\n (options = {}) => {\n return captureCanvasFrameBlob({ ...options, target: gl.domElement });\n },\n [gl]\n );\n\n const captureCameraFrameApi = useCallback(\n (options = {}) => {\n return captureCameraFrame(\n gl,\n scene,\n camera,\n resolveCameraCaptureOptions(options)\n );\n },\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n const captureCameraFrameBlobApi = useCallback(\n (options = {}) => {\n return captureCameraFrameBlob(\n gl,\n scene,\n camera,\n resolveCameraCaptureOptions(options)\n );\n },\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n const createCameraFrameCaptureSessionApi = useCallback(\n (options: CameraFrameCaptureOptions = {}) =>\n createCameraFrameCaptureSession(\n gl,\n scene,\n camera,\n resolveCameraCaptureOptions(options)\n ),\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n const captureCameraFrameTensorApi = useCallback(\n (options: CameraFrameCaptureTensorOptions = {}) => {\n const resolved: CameraFrameCaptureTensorOptions = {\n ...resolveCameraCaptureOptions(options),\n channels: options.channels,\n layout: options.layout,\n range: options.range,\n };\n const session = createCameraFrameCaptureSession(gl, scene, camera, resolved);\n try {\n return session.captureTensor(resolved);\n } finally {\n session.dispose();\n }\n },\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n const recordCameraSequenceApi = useCallback(\n async (\n options: CameraFrameSequenceOptions\n ): Promise<CameraFrameSequenceResult> => {\n const frameCount = Math.max(0, Math.floor(options.frames));\n const stepsPerFrame = Math.max(0, Math.floor(options.stepsPerFrame ?? 1));\n const cameras = options.cameras;\n const frames: CameraFrameSequenceFrame[] = [];\n const cameraSummaries: CameraFrameSequenceResult['cameraSummaries'] = {};\n const wasPaused = pausedRef.current;\n const retainFrames = options.retainFrames ?? true;\n const requireMountedSources = options.requireMountedSources ?? true;\n let recordedFrameCount = 0;\n\n async function stepCameraSequence(frameIndex: number, steps: number) {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) {\n throw new Error('MuJoCo scene is not ready for camera sequence stepping.');\n }\n\n for (let stepIndex = 0; stepIndex < steps; stepIndex += 1) {\n for (let i = 0; i < model.nv; i += 1) {\n data.qfrc_applied[i] = 0;\n }\n await options.onBeforeStep?.({\n frameIndex,\n stepIndex,\n time: data.time,\n model,\n data,\n });\n for (const cb of beforeStepCallbacks.current) {\n cb({ model, data });\n }\n mujocoRef.current.mj_step(model, data);\n for (const cb of afterStepCallbacks.current) {\n cb({ model, data });\n }\n onStepRef.current?.({ time: data.time, model, data });\n await options.onAfterStep?.({\n frameIndex,\n stepIndex,\n time: data.time,\n model,\n data,\n });\n }\n\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n }\n\n if (frameCount === 0 || cameras.length === 0) {\n return {\n frames,\n cameraKeys: cameras.map((sequenceCamera) => sequenceCamera.key),\n cameraSummaries,\n frameCount: 0,\n };\n }\n\n throwIfCameraSequenceAborted(options.signal);\n\n for (let attempt = 0; attempt < 30; attempt += 1) {\n if (mjModelRef.current && mjDataRef.current) break;\n await waitForNextAnimationFrame();\n throwIfCameraSequenceAborted(options.signal);\n }\n if (!mjModelRef.current || !mjDataRef.current) {\n throw new Error('MuJoCo scene is not ready for camera sequence recording.');\n }\n\n const captureSessions = cameras.map((sequenceCamera) => {\n const { key, ...captureOptions } = sequenceCamera;\n const initialCaptureOptions = resolveCameraCaptureOptions(captureOptions);\n const mountedSource = initialCaptureOptions.source;\n if (requireMountedSources) {\n assertMatchingMountedCameraSource(\n key,\n captureOptions,\n mountedSource ?? { kind: 'fallback-camera' }\n );\n }\n return {\n key,\n captureOptions,\n mountedSource,\n session: createCameraFrameCaptureSession(\n gl,\n scene,\n camera,\n initialCaptureOptions\n ),\n };\n });\n\n try {\n pausedRef.current = true;\n stepsToRunRef.current = 0;\n if (options.reset) reset();\n\n for (let frameIndex = 0; frameIndex < frameCount; frameIndex += 1) {\n throwIfCameraSequenceAborted(options.signal);\n if (\n stepsPerFrame > 0 &&\n (frameIndex > 0 || options.captureInitialFrame === false)\n ) {\n await stepCameraSequence(frameIndex, stepsPerFrame);\n }\n await waitForNextAnimationFrame();\n throwIfCameraSequenceAborted(options.signal);\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) {\n throw new Error('MuJoCo scene is not ready for camera sequence sampling.');\n }\n await options.onSample?.({\n frameIndex,\n time: data.time,\n model,\n data,\n });\n\n const cameraFrames: Record<string, CameraFrameCaptureResult> = {};\n for (const { key, captureOptions, mountedSource, session } of captureSessions) {\n const resolvedCaptureOptions = resolveCameraCaptureOptions(captureOptions);\n const cameraFrame = await session.captureDataUrlAsync({\n ...resolvedCaptureOptions,\n source: mountedSource ?? resolvedCaptureOptions.source,\n });\n if (requireMountedSources) {\n assertMatchingMountedCameraSource(\n key,\n captureOptions,\n cameraFrame.source\n );\n }\n cameraSummaries[key] = {\n key,\n width: cameraFrame.width,\n height: cameraFrame.height,\n source: cameraFrame.source,\n frameCount: (cameraSummaries[key]?.frameCount ?? 0) + 1,\n firstFrameIndex:\n cameraSummaries[key]?.firstFrameIndex ?? frameIndex,\n lastFrameIndex: frameIndex,\n firstTimestamp:\n cameraSummaries[key]?.firstTimestamp ?? data.time,\n lastTimestamp: data.time,\n };\n cameraFrames[key] = cameraFrame;\n }\n\n const frame = {\n frameIndex,\n time: data.time,\n cameras: cameraFrames,\n };\n if (retainFrames) {\n frames.push(frame);\n }\n recordedFrameCount += 1;\n await options.onFrame?.(frame);\n }\n } finally {\n for (const { session } of captureSessions) {\n session.dispose();\n }\n pausedRef.current = wasPaused;\n }\n\n return {\n frames,\n cameraKeys: cameras.map((sequenceCamera) => sequenceCamera.key),\n cameraSummaries,\n frameCount: recordedFrameCount,\n };\n },\n [camera, getTime, gl, mujoco, reset, resolveCameraCaptureOptions, scene]\n );\n\n const project2DTo3D = useCallback(\n (x: number, y: number, cameraPos: THREE.Vector3, lookAt: THREE.Vector3): { point: THREE.Vector3; bodyId: number; geomId: number } | null => {\n const virtCam = (camera as THREE.PerspectiveCamera).clone();\n virtCam.position.copy(cameraPos);\n virtCam.lookAt(lookAt);\n virtCam.updateMatrixWorld();\n virtCam.updateProjectionMatrix();\n _projNdc.set(x * 2 - 1, -(y * 2 - 1));\n _projRaycaster.setFromCamera(_projNdc, virtCam);\n const objects: THREE.Object3D[] = [];\n const scene = (camera as THREE.PerspectiveCamera).parent;\n if (scene) {\n scene.traverse((c) => {\n if ((c as THREE.Mesh).isMesh) objects.push(c);\n });\n }\n const hits = _projRaycaster.intersectObjects(objects);\n if (hits.length > 0) {\n const hitObj = hits[0].object;\n const geomId = hitObj.userData.geomID !== undefined ? hitObj.userData.geomID : -1;\n let obj = hitObj;\n while (obj && obj.userData.bodyID === undefined && obj.parent) {\n obj = obj.parent;\n }\n const bodyId = obj && obj.userData.bodyID !== undefined ? obj.userData.bodyID : -1;\n return { point: hits[0].point, bodyId, geomId };\n }\n return null;\n },\n [camera, gl]\n );\n\n const projectImagePointTo3D = useCallback(\n (options: ImagePointProjectionOptions): ImagePointProjectionResult | null => {\n const {\n x,\n y,\n coordinateSpace,\n imageWidth,\n imageHeight,\n maxDistance,\n ...captureOptions\n } = options;\n const resolvedCaptureOptions = resolveCameraCaptureOptions(captureOptions);\n return projectImagePointTo3DFromScene(gl, scene, camera, {\n ...resolvedCaptureOptions,\n x,\n y,\n coordinateSpace,\n imageWidth,\n imageHeight,\n maxDistance,\n });\n },\n [camera, gl, resolveCameraCaptureOptions, scene]\n );\n\n // --- Domain randomization ---\n\n const setBodyMass = useCallback((name: string, mass: number): void => {\n const model = mjModelRef.current;\n if (!model) return;\n const id = findBodyByName(model, name);\n if (id < 0) return;\n model.body_mass[id] = mass;\n }, []);\n\n const setGeomFriction = useCallback((name: string, friction: [number, number, number]): void => {\n const model = mjModelRef.current;\n if (!model) return;\n const id = findGeomByName(model, name);\n if (id < 0) return;\n model.geom_friction[id * 3] = friction[0];\n model.geom_friction[id * 3 + 1] = friction[1];\n model.geom_friction[id * 3 + 2] = friction[2];\n }, []);\n\n const setGeomSize = useCallback((name: string, size: [number, number, number]): void => {\n const model = mjModelRef.current;\n if (!model) return;\n const id = findGeomByName(model, name);\n if (id < 0) return;\n model.geom_size[id * 3] = size[0];\n model.geom_size[id * 3 + 1] = size[1];\n model.geom_size[id * 3 + 2] = size[2];\n }, []);\n\n // --- Assemble API ---\n const api = useMemo<MujocoSimAPI>(\n () => ({\n get status() { return status; },\n get config() { return configRef.current; },\n reset,\n setSpeed,\n togglePause,\n setPaused,\n step,\n getTime,\n getTimestep,\n applyKeyframe,\n saveState,\n restoreState,\n setQpos,\n setQvel,\n getQpos,\n getQvel,\n setCtrl,\n getCtrl,\n getControlMap: getControlMapApi,\n getActuatedJoints: getActuatedJointsApi,\n resolveControlGroup: resolveControlGroupApi,\n applyForce,\n applyTorque: applyTorqueApi,\n setExternalForce,\n applyGeneralizedForce,\n getSensorData,\n getContacts,\n getBodies,\n getJoints,\n getGeoms,\n getSites,\n getActuators: getActuatorsApi,\n getSensors,\n getCameras,\n getModelOption,\n setGravity,\n setTimestep: setTimestepApi,\n raycast,\n getKeyframeNames,\n getKeyframeCount,\n loadScene: loadSceneApi,\n loadFromFiles: loadFromFilesApi,\n addBody: addBodyApi,\n removeBody: removeBodyApi,\n recompile: recompileApi,\n getCanvas,\n getCanvasSnapshot,\n captureFrame: captureFrameApi,\n captureFrameBlob: captureFrameBlobApi,\n captureCameraFrame: captureCameraFrameApi,\n captureCameraFrameBlob: captureCameraFrameBlobApi,\n captureCameraFrameTensor: captureCameraFrameTensorApi,\n createCameraFrameCaptureSession: createCameraFrameCaptureSessionApi,\n resolveCameraCaptureOptions,\n recordCameraSequence: recordCameraSequenceApi,\n project2DTo3D,\n projectImagePointTo3D,\n setBodyMass,\n setGeomFriction,\n setGeomSize,\n mjModelRef,\n mjDataRef,\n }),\n [\n status, reset, setSpeed, togglePause, setPaused, step,\n getTime, getTimestep, applyKeyframe, saveState, restoreState,\n setQpos, setQvel, getQpos, getQvel, setCtrl, getCtrl,\n getControlMapApi, getActuatedJointsApi, resolveControlGroupApi,\n applyForce, applyTorqueApi, setExternalForce, applyGeneralizedForce,\n getSensorData, getContacts, getBodies, getJoints, getGeoms, getSites,\n getActuatorsApi, getSensors, getCameras, getModelOption, setGravity, setTimestepApi,\n raycast, getKeyframeNames, getKeyframeCount, loadSceneApi,\n loadFromFilesApi, addBodyApi, removeBodyApi, recompileApi,\n getCanvas, getCanvasSnapshot, captureFrameApi, captureFrameBlobApi,\n captureCameraFrameApi, captureCameraFrameBlobApi,\n captureCameraFrameTensorApi, createCameraFrameCaptureSessionApi,\n resolveCameraCaptureOptions,\n recordCameraSequenceApi,\n project2DTo3D,\n projectImagePointTo3D,\n setBodyMass, setGeomFriction, setGeomSize,\n ]\n );\n const apiRef = useRef(api);\n apiRef.current = api;\n\n const contextValue = useMemo<MujocoSimContextValue>(\n () => ({\n api,\n mjModelRef,\n mjDataRef,\n mujocoRef,\n configRef,\n pausedRef,\n speedRef,\n substepsRef,\n interpolateRef,\n interpolationStateRef,\n onSelectionRef,\n beforeStepCallbacks,\n afterStepCallbacks,\n resetCallbacks,\n errorRef,\n bodyRegistryRef,\n hiddenBodiesRef,\n requestBodyReload,\n status,\n }),\n [api, status, requestBodyReload]\n );\n\n return (\n <MujocoSimContext.Provider value={contextValue}>\n <SceneRenderer renderOptions={renderOptions} />\n <CameraViewportProvider>{children}</CameraViewportProvider>\n </MujocoSimContext.Provider>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Canvas } from '@react-three/fiber';\nimport { forwardRef, useEffect, useRef } from 'react';\nimport { useMujocoWasm } from './MujocoProvider';\nimport { MujocoSimProvider } from './MujocoSimProvider';\nimport { MujocoCanvasProps, MujocoSimAPI } from '../types';\n\n/**\n * MujocoCanvas — thin R3F Canvas wrapper for MuJoCo scenes.\n * Accepts all R3F Canvas props and forwards them through.\n * Supports declarative physics config props (spec 1.1).\n *\n * Forward ref exposes MujocoSimAPI (not the canvas element).\n */\nexport const MujocoCanvas = forwardRef<MujocoSimAPI, MujocoCanvasProps>(\n function MujocoCanvas(\n {\n config,\n onReady,\n onError,\n onStep,\n onSelection,\n // Declarative physics config\n gravity,\n timestep,\n substeps,\n paused,\n speed,\n interpolate,\n renderOptions,\n loadingFallback,\n children,\n ...canvasProps\n },\n ref\n ) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujocoWasm();\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (wasmStatus === 'error') {\n onErrorRef.current?.(new Error(wasmError ?? 'WASM load failed'));\n }\n }, [wasmStatus, wasmError]);\n\n if (wasmStatus === 'loading' || !mujoco) {\n return loadingFallback ? (\n <Canvas {...canvasProps}>{loadingFallback}</Canvas>\n ) : null;\n }\n\n if (wasmStatus === 'error') {\n return null;\n }\n\n return (\n <Canvas {...canvasProps}>\n <MujocoSimProvider\n mujoco={mujoco}\n config={config}\n apiRef={ref}\n onReady={onReady}\n onError={onError}\n onStep={onStep}\n onSelection={onSelection}\n gravity={gravity}\n timestep={timestep}\n substeps={substeps}\n paused={paused}\n speed={speed}\n interpolate={interpolate}\n renderOptions={renderOptions}\n >\n {children}\n </MujocoSimProvider>\n </Canvas>\n );\n }\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { forwardRef, useEffect, useRef } from 'react';\nimport { useMujocoWasm } from './MujocoProvider';\nimport { MujocoSimProvider } from './MujocoSimProvider';\nimport type {\n MujocoSimAPI,\n ReadyCallbackInput,\n SceneConfig,\n SelectionCallbackInput,\n StepCallbackInput,\n} from '../types';\n\nexport interface MujocoPhysicsProps {\n /** Scene/robot configuration. */\n config: SceneConfig;\n /** Fires when model is loaded and API is ready. */\n onReady?: (input: ReadyCallbackInput) => void;\n /** Fires on scene load failure. */\n onError?: (error: Error) => void;\n /** Called each physics step. */\n onStep?: (input: StepCallbackInput) => void;\n /** Called on body double-click selection. */\n onSelection?: (input: SelectionCallbackInput) => void;\n /** Override model gravity. */\n gravity?: [number, number, number];\n /** Override model.opt.timestep. */\n timestep?: number;\n /** mj_step calls per frame. */\n substeps?: number;\n /** Declarative pause. */\n paused?: boolean;\n /** Simulation speed multiplier. */\n speed?: number;\n /** Interpolate rendered body poses between fixed physics steps. */\n interpolate?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * MujocoPhysics — physics provider for use inside a user-owned R3F Canvas.\n *\n * This is the R3F-idiomatic alternative to MujocoCanvas. Instead of wrapping\n * the Canvas, place this inside your own <Canvas>:\n *\n * ```tsx\n * <MujocoProvider>\n * <Canvas shadows camera={...}>\n * <MujocoPhysics config={config} paused={paused}>\n * <SceneRenderer />\n * <OrbitControls />\n * </MujocoPhysics>\n * </Canvas>\n * </MujocoProvider>\n * ```\n *\n * Forward ref exposes MujocoSimAPI.\n */\nexport const MujocoPhysics = forwardRef<MujocoSimAPI, MujocoPhysicsProps>(\n function MujocoPhysics({ onError, children, ...props }, ref) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujocoWasm();\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (wasmStatus === 'error') {\n onErrorRef.current?.(new Error(wasmError ?? 'WASM load failed'));\n }\n }, [wasmStatus, wasmError]);\n\n if (wasmStatus === 'error' || wasmStatus === 'loading' || !mujoco) {\n return null;\n }\n\n return (\n <MujocoSimProvider\n mujoco={mujoco}\n apiRef={ref}\n onError={onError}\n {...props}\n >\n {children}\n </MujocoSimProvider>\n );\n }\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n Bodies,\n MujocoData,\n MujocoModel,\n ObservationConfig,\n ObservationLayoutItem,\n ObservationResult,\n} from '../types';\nimport { findBodyByName, findSensorByName, findSiteByName } from './SceneLoader';\n\nfunction append(\n values: number[],\n layout: ObservationLayoutItem[],\n name: string,\n chunk: ArrayLike<number>\n) {\n const start = values.length;\n for (let i = 0; i < chunk.length; i++) values.push(chunk[i] ?? 0);\n layout.push({ name, start, size: chunk.length });\n}\n\nfunction appendScalar(\n values: number[],\n layout: ObservationLayoutItem[],\n name: string,\n value: number\n) {\n const start = values.length;\n values.push(value);\n layout.push({ name, start, size: 1 });\n}\n\nfunction namedBodyList(names: Bodies | readonly Bodies[] | undefined): readonly Bodies[] {\n if (!names) return [];\n return typeof names === 'string' ? [names] : names;\n}\n\nfunction normalizedGravity(model: MujocoModel): [number, number, number] {\n const gx = model.opt.gravity[0] ?? 0;\n const gy = model.opt.gravity[1] ?? 0;\n const gz = model.opt.gravity[2] ?? -9.81;\n const length = Math.hypot(gx, gy, gz);\n if (length === 0) return [0, 0, 0];\n return [gx / length, gy / length, gz / length];\n}\n\nfunction rotateWorldVectorToBody(data: MujocoData, bodyId: number, world: readonly [number, number, number]): [number, number, number] {\n const adr = bodyId * 4;\n const w = data.xquat[adr] ?? 1;\n const x = -(data.xquat[adr + 1] ?? 0);\n const y = -(data.xquat[adr + 2] ?? 0);\n const z = -(data.xquat[adr + 3] ?? 0);\n const vx = world[0];\n const vy = world[1];\n const vz = world[2];\n\n const tx = 2 * (y * vz - z * vy);\n const ty = 2 * (z * vx - x * vz);\n const tz = 2 * (x * vy - y * vx);\n\n return [\n vx + w * tx + y * tz - z * ty,\n vy + w * ty + z * tx - x * tz,\n vz + w * tz + x * ty - y * tx,\n ];\n}\n\n/**\n * Build a flat observation vector plus a layout map from live MuJoCo state.\n *\n * Missing named resources are skipped. The returned layout is the source of\n * truth for the vector produced from the current model.\n */\nexport function buildObservation(\n model: MujocoModel,\n data: MujocoData,\n config: ObservationConfig\n): ObservationResult {\n const values: number[] = [];\n const layout: ObservationLayoutItem[] = [];\n\n if (config.time) appendScalar(values, layout, 'time', data.time);\n if (config.qpos) append(values, layout, 'qpos', data.qpos);\n if (config.qvel) append(values, layout, 'qvel', data.qvel);\n if (config.ctrl) append(values, layout, 'ctrl', data.ctrl);\n if (config.act) append(values, layout, 'act', data.act);\n if (config.sensordata) append(values, layout, 'sensordata', data.sensordata);\n\n for (const name of config.sensors ?? []) {\n const sensorId = findSensorByName(model, name);\n if (sensorId < 0) continue;\n const start = model.sensor_adr[sensorId] ?? 0;\n const dim = model.sensor_dim[sensorId] ?? 0;\n append(values, layout, `sensor:${name}`, data.sensordata.subarray(start, start + dim));\n }\n\n for (const name of config.sites ?? []) {\n const siteId = findSiteByName(model, name);\n if (siteId < 0) continue;\n const start = siteId * 3;\n append(values, layout, `site:${name}:xpos`, data.site_xpos.subarray(start, start + 3));\n }\n\n const gravity = normalizedGravity(model);\n for (const name of namedBodyList(config.projectedGravity)) {\n const bodyId = findBodyByName(model, name);\n if (bodyId < 0) continue;\n append(values, layout, `projectedGravity:${name}`, rotateWorldVectorToBody(data, bodyId, gravity));\n }\n\n return {\n values: config.output === 'float64' ? new Float64Array(values) : new Float32Array(values),\n layout,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo, useRef } from 'react';\n\n/** Shallow-compare two plain objects by own enumerable keys. */\nfunction shallowEqual(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n}\n\nexport interface ControllerOptions<TConfig> {\n /** Unique name for this controller (used as displayName). */\n name: string;\n /** Default values merged under user-supplied config. */\n defaultConfig?: Partial<TConfig>;\n}\n\nexport type ControllerComponent<TConfig> = React.FC<{\n config?: Partial<TConfig>;\n children?: React.ReactNode;\n}> & {\n controllerName: string;\n defaultConfig: Partial<TConfig>;\n};\n\n/**\n * Factory that produces a typed controller component.\n *\n * Controllers are React components that plug into the MuJoCo simulation tree.\n * Inside `Impl`, use any hooks (`useMujoco`, `useBeforePhysicsStep`, etc.)\n * to interact with the physics engine.\n *\n * @example\n * ```tsx\n * const MyController = createController<{ speed: number }>(\n * { name: 'my-controller', defaultConfig: { speed: 1.0 } },\n * function MyControllerImpl({ config }) {\n * const wheel = useCtrl(ModelActuators.mobile.leftWheel);\n *\n * useBeforePhysicsStep(({ data }) => {\n * wheel.write(config.speed);\n * });\n * return null;\n * },\n * );\n *\n * // Usage:\n * <MyController config={{ speed: 2.0 }} />\n * ```\n */\nexport function createController<TConfig>(\n options: ControllerOptions<TConfig>,\n Impl: React.FC<{ config: TConfig; children?: React.ReactNode }>,\n): ControllerComponent<TConfig> {\n function Controller({\n config,\n children,\n }: {\n config?: Partial<TConfig>;\n children?: React.ReactNode;\n }) {\n // Stabilise config reference: inline objects get a new identity each render,\n // but the actual values rarely change. Shallow-compare to keep the same ref.\n const configObj = (config ?? {}) as Record<string, unknown>;\n const stableRef = useRef(configObj);\n if (!shallowEqual(stableRef.current, configObj)) {\n stableRef.current = configObj;\n }\n const stableConfig = stableRef.current as Partial<TConfig>;\n\n const mergedConfig = useMemo(\n () => ({ ...options.defaultConfig, ...stableConfig }) as TConfig,\n [stableConfig],\n );\n return <Impl config={mergedConfig}>{children}</Impl>;\n }\n\n Controller.displayName = options.name;\n Controller.controllerName = options.name;\n Controller.defaultConfig = options.defaultConfig ?? ({} as Partial<TConfig>);\n\n return Controller as ControllerComponent<TConfig>;\n}\n\n/**\n * Factory that produces a typed controller hook.\n *\n * Same config stabilization and default merging as `createController`,\n * but returns a hook instead of a component. Pass `null` to disable.\n *\n * @example\n * ```tsx\n * const useMyController = createControllerHook<MyConfig, MyValue>(\n * { name: 'useMyController', defaultConfig: { gain: 1.0 } },\n * function useMyControllerImpl(config) {\n * // config is MyConfig | null — hooks must be called unconditionally\n * const joint = useCtrl(config?.actuator ?? ModelActuators.franka.actuator1);\n *\n * useBeforePhysicsStep(({ data }) => {\n * if (!config) return;\n * joint.write(config.gain * Math.sin(data.time));\n * });\n * if (!config) return null;\n * return { /* value *\\/ };\n * },\n * );\n *\n * // Usage:\n * const value = useMyController({ gain: 2.0 });\n * const disabled = useMyController(null); // returns null\n * ```\n */\nexport function createControllerHook<TConfig, TValue>(\n options: ControllerOptions<TConfig>,\n useImpl: (config: TConfig | null) => TValue | null,\n): (config: TConfig | null) => TValue | null {\n const useController = (config: TConfig | null): TValue | null => {\n const configObj = config as Record<string, unknown> | null;\n const stableRef = useRef(configObj);\n if (configObj && stableRef.current) {\n if (!shallowEqual(stableRef.current, configObj)) {\n stableRef.current = configObj;\n }\n } else {\n stableRef.current = configObj;\n }\n\n const mergedConfig = useMemo(\n () => stableRef.current\n ? ({ ...options.defaultConfig, ...stableRef.current } as TConfig)\n : null,\n [stableRef.current],\n );\n\n return useImpl(mergedConfig);\n };\n\n return useController;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as THREE from 'three';\nimport { MujocoModule, MujocoModel, MujocoData } from '../types';\n\nexport interface GenericIKOptions {\n maxIterations: number;\n damping: number;\n tolerance: number;\n epsilon: number;\n posWeight: number;\n rotWeight: number;\n jointLimits?: ReadonlyArray<readonly [number, number] | null | undefined>;\n}\n\ntype ResolvedGenericIKOptions = Required<Omit<GenericIKOptions, 'jointLimits'>> &\n Pick<GenericIKOptions, 'jointLimits'>;\n\nconst DEFAULTS: Required<Omit<GenericIKOptions, 'jointLimits'>> = {\n maxIterations: 50,\n damping: 0.01,\n tolerance: 1e-3,\n epsilon: 1e-6,\n posWeight: 1.0,\n rotWeight: 0.3,\n};\n\nfunction resolveOptions(opts?: Partial<GenericIKOptions>): ResolvedGenericIKOptions {\n return {\n maxIterations: opts?.maxIterations ?? DEFAULTS.maxIterations,\n damping: opts?.damping ?? DEFAULTS.damping,\n tolerance: opts?.tolerance ?? DEFAULTS.tolerance,\n epsilon: opts?.epsilon ?? DEFAULTS.epsilon,\n posWeight: opts?.posWeight ?? DEFAULTS.posWeight,\n rotWeight: opts?.rotWeight ?? DEFAULTS.rotWeight,\n jointLimits: opts?.jointLimits,\n };\n}\n\n/**\n * Generic Damped Least-Squares IK solver.\n * Uses finite-difference Jacobian via MuJoCo's mj_forward.\n * Works for any MuJoCo model — no robot-specific parameters.\n */\nexport class GenericIK {\n private mujoco: MujocoModule;\n\n constructor(mujoco: MujocoModule) {\n this.mujoco = mujoco;\n }\n\n /**\n * Solve IK for a target 6-DOF pose.\n * @param model MuJoCo model\n * @param data MuJoCo data (qpos will be temporarily modified, then restored)\n * @param siteId Index of the end-effector site to control\n * @param qposAdr qpos addresses for scalar joints in solve order\n * @param targetPos Target position in world frame\n * @param targetQuat Target orientation in world frame\n * @param currentQ Current joint angles matching qposAdr order\n * @param opts Optional solver parameters\n * @returns Joint angles array, or null if solver diverged\n */\n solve(\n model: MujocoModel,\n data: MujocoData,\n siteId: number,\n qposAdr: ArrayLike<number>,\n targetPos: THREE.Vector3,\n targetQuat: THREE.Quaternion,\n currentQ: ArrayLike<number>,\n opts?: Partial<GenericIKOptions>\n ): number[] | null {\n const o = resolveOptions(opts);\n const n = qposAdr.length;\n\n // Save full qpos so we can restore after solving\n const savedQpos = new Float64Array(data.qpos.length);\n savedQpos.set(data.qpos);\n\n // Build target rotation matrix (3x3 row-major)\n const R_target = quatToMat3(targetQuat);\n\n // Working joint angles — start from current configuration\n const q = new Float64Array(n);\n for (let i = 0; i < n; i++) q[i] = currentQ[i];\n\n // Pre-allocate work arrays\n const J = new Float64Array(6 * n); // 6×n Jacobian (row-major)\n const JJt = new Float64Array(36); // 6×6\n const rhs = new Float64Array(6); // right-hand side\n const x = new Float64Array(6); // solve result\n const dq = new Float64Array(n); // joint update\n const baseSitePos = new Float64Array(3);\n const baseSiteMat = new Float64Array(9);\n const pertSitePos = new Float64Array(3);\n const pertSiteMat = new Float64Array(9);\n\n let bestQ: number[] | null = null;\n let bestErr = Infinity;\n // Stop early once the error stops improving. The solver always returns the\n // best configuration it has seen, so when it stalls or diverges (an\n // unreachable target, e.g. a near-singular wrist orientation) further\n // iterations can't beat bestQ — they only burn (1 + n) mj_forward calls\n // each and feed jitter into ctrl. This is what bounds the cost of dragging\n // the target into an unreachable region.\n const patience = 4;\n let noImprove = 0;\n\n if (n === 0) return null;\n\n for (let iter = 0; iter < o.maxIterations; iter++) {\n // Set joints and run FK\n for (let i = 0; i < n; i++) data.qpos[qposAdr[i]] = q[i];\n this.mujoco.mj_forward(model, data);\n\n // Read current site pose\n const sp = data.site_xpos;\n const sm = data.site_xmat;\n const off3 = siteId * 3;\n const off9 = siteId * 9;\n for (let i = 0; i < 3; i++) baseSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) baseSiteMat[i] = sm[off9 + i];\n\n // Compute 6D error\n const posErr0 = targetPos.x - baseSitePos[0];\n const posErr1 = targetPos.y - baseSitePos[1];\n const posErr2 = targetPos.z - baseSitePos[2];\n const rotErr = orientationError(baseSiteMat, R_target);\n\n const error = [\n posErr0 * o.posWeight,\n posErr1 * o.posWeight,\n posErr2 * o.posWeight,\n rotErr[0] * o.rotWeight,\n rotErr[1] * o.rotWeight,\n rotErr[2] * o.rotWeight,\n ];\n\n const errNorm = Math.sqrt(\n error[0] * error[0] + error[1] * error[1] + error[2] * error[2] +\n error[3] * error[3] + error[4] * error[4] + error[5] * error[5]\n );\n\n // Track best solution\n if (errNorm < bestErr - 1e-9) {\n bestErr = errNorm;\n bestQ = Array.from(q);\n noImprove = 0;\n } else {\n noImprove++;\n }\n\n // Converged\n if (errNorm < o.tolerance) break;\n\n // Stalled or diverging — bestQ can no longer improve, so stop.\n if (noImprove >= patience) break;\n\n // Compute Jacobian via finite differences\n for (let j = 0; j < n; j++) {\n const adr = qposAdr[j];\n const saved = data.qpos[adr];\n data.qpos[adr] = q[j] + o.epsilon;\n this.mujoco.mj_forward(model, data);\n\n for (let i = 0; i < 3; i++) pertSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) pertSiteMat[i] = sm[off9 + i];\n\n // Position Jacobian columns (rows 0-2)\n J[0 * n + j] = ((pertSitePos[0] - baseSitePos[0]) / o.epsilon) * o.posWeight;\n J[1 * n + j] = ((pertSitePos[1] - baseSitePos[1]) / o.epsilon) * o.posWeight;\n J[2 * n + j] = ((pertSitePos[2] - baseSitePos[2]) / o.epsilon) * o.posWeight;\n\n // Orientation Jacobian columns (rows 3-5)\n // δR = R_perturbed * R_base^T, then extract angular velocity\n const dRot = angularDelta(baseSiteMat, pertSiteMat);\n J[3 * n + j] = (dRot[0] / o.epsilon) * o.rotWeight;\n J[4 * n + j] = (dRot[1] / o.epsilon) * o.rotWeight;\n J[5 * n + j] = (dRot[2] / o.epsilon) * o.rotWeight;\n\n // Restore joint\n data.qpos[adr] = saved;\n }\n\n // Restore base FK state for next iteration\n for (let i = 0; i < n; i++) data.qpos[qposAdr[i]] = q[i];\n\n // Damped least squares: Δq = Jᵀ (J Jᵀ + λI)⁻¹ error\n // 1. Compute JJᵀ (6×6)\n for (let r = 0; r < 6; r++) {\n for (let c = 0; c < 6; c++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += J[r * n + k] * J[c * n + k];\n }\n JJt[r * 6 + c] = sum + (r === c ? o.damping : 0);\n }\n }\n\n // 2. Solve (JJᵀ + λI) x = error\n for (let i = 0; i < 6; i++) rhs[i] = error[i];\n solve6x6(JJt, rhs, x);\n\n // 3. Δq = Jᵀ x\n for (let j = 0; j < n; j++) {\n let sum = 0;\n for (let r = 0; r < 6; r++) {\n sum += J[r * n + j] * x[r];\n }\n dq[j] = sum;\n }\n\n // Update joints\n for (let i = 0; i < n; i++) q[i] += dq[i];\n }\n\n // Restore original qpos\n data.qpos.set(savedQpos);\n this.mujoco.mj_forward(model, data);\n\n return bestQ;\n }\n}\n\n// --- Math utilities ---\n\n/** Convert THREE.Quaternion to 3x3 rotation matrix (row-major Float64Array) */\nfunction quatToMat3(q: THREE.Quaternion): Float64Array {\n const m = new Float64Array(9);\n const x = q.x, y = q.y, z = q.z, w = q.w;\n const xx = x * x, yy = y * y, zz = z * z;\n const xy = x * y, xz = x * z, yz = y * z;\n const wx = w * x, wy = w * y, wz = w * z;\n m[0] = 1 - 2 * (yy + zz); m[1] = 2 * (xy - wz); m[2] = 2 * (xz + wy);\n m[3] = 2 * (xy + wz); m[4] = 1 - 2 * (xx + zz); m[5] = 2 * (yz - wx);\n m[6] = 2 * (xz - wy); m[7] = 2 * (yz + wx); m[8] = 1 - 2 * (xx + yy);\n return m;\n}\n\n/**\n * Compute orientation error between current and target rotation matrices.\n * Returns the axis-angle vector (log map of R_target * R_current^T).\n * Uses the small-angle approximation: error ≈ 0.5 * [R32-R23, R13-R31, R21-R12]\n * where R = R_target * R_current^T.\n */\nfunction orientationError(R_cur: Float64Array, R_tgt: Float64Array): [number, number, number] {\n // R_err = R_tgt * R_cur^T (both row-major 3x3)\n // R_err[i][j] = sum_k R_tgt[i][k] * R_cur[j][k] (note: transposing R_cur)\n const Re = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_tgt[i * 3 + k] * R_cur[j * 3 + k];\n }\n Re[i * 3 + j] = s;\n }\n }\n\n // Extract axis-angle from rotation matrix\n // For better accuracy than small-angle approx, use full log map\n const trace = Re[0] + Re[4] + Re[8];\n const cosAngle = Math.max(-1, Math.min(1, (trace - 1) * 0.5));\n const angle = Math.acos(cosAngle);\n\n // Near zero rotation — use small-angle approximation\n if (angle < 1e-6) {\n return [0, 0, 0];\n }\n\n // Near π — degenerate, use small-angle approx of the skew-symmetric part\n if (angle > Math.PI - 1e-6) {\n return [\n 0.5 * (Re[7] - Re[5]),\n 0.5 * (Re[2] - Re[6]),\n 0.5 * (Re[3] - Re[1]),\n ];\n }\n\n // General case: axis = skew(R_err) / (2 sin(angle)), scaled by angle\n const s = angle / (2 * Math.sin(angle));\n return [\n s * (Re[7] - Re[5]),\n s * (Re[2] - Re[6]),\n s * (Re[3] - Re[1]),\n ];\n}\n\n/**\n * Compute angular velocity vector from R_base to R_perturbed.\n * Returns the axis-angle of R_perturbed * R_base^T.\n * (Small angle: the rotation caused by the perturbation.)\n */\nfunction angularDelta(R_base: Float64Array, R_pert: Float64Array): [number, number, number] {\n // δR = R_pert * R_base^T\n // Small angle approx: ω ≈ 0.5 * [δR[7]-δR[5], δR[2]-δR[6], δR[3]-δR[1]]\n // This is fine because the perturbation epsilon is tiny.\n const dR = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_pert[i * 3 + k] * R_base[j * 3 + k];\n }\n dR[i * 3 + j] = s;\n }\n }\n return [\n 0.5 * (dR[7] - dR[5]),\n 0.5 * (dR[2] - dR[6]),\n 0.5 * (dR[3] - dR[1]),\n ];\n}\n\n/**\n * Solve 6×6 linear system Ax = b via Gaussian elimination with partial pivoting.\n * Modifies A and b in place. Result written to x.\n */\nfunction solve6x6(A: Float64Array, b: Float64Array, x: Float64Array): void {\n const N = 6;\n // Work on copies to avoid destroying originals needed elsewhere\n const a = new Float64Array(A);\n const r = new Float64Array(b);\n\n // Forward elimination with partial pivoting\n for (let col = 0; col < N; col++) {\n // Find pivot\n let maxVal = Math.abs(a[col * N + col]);\n let maxRow = col;\n for (let row = col + 1; row < N; row++) {\n const val = Math.abs(a[row * N + col]);\n if (val > maxVal) { maxVal = val; maxRow = row; }\n }\n\n // Swap rows\n if (maxRow !== col) {\n for (let k = 0; k < N; k++) {\n const tmp = a[col * N + k]; a[col * N + k] = a[maxRow * N + k]; a[maxRow * N + k] = tmp;\n }\n const tmp = r[col]; r[col] = r[maxRow]; r[maxRow] = tmp;\n }\n\n const pivot = a[col * N + col];\n if (Math.abs(pivot) < 1e-12) {\n // Singular — return zeros\n x.fill(0);\n return;\n }\n\n // Eliminate below\n for (let row = col + 1; row < N; row++) {\n const factor = a[row * N + col] / pivot;\n for (let k = col; k < N; k++) {\n a[row * N + k] -= factor * a[col * N + k];\n }\n r[row] -= factor * r[col];\n }\n }\n\n // Back substitution\n for (let row = N - 1; row >= 0; row--) {\n let sum = r[row];\n for (let k = row + 1; k < N; k++) {\n sum -= a[row * N + k] * x[k];\n }\n x[row] = sum / a[row * N + row];\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { createControllerHook } from '../core/createController';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { GenericIK } from '../core/GenericIK';\nimport { createContiguousControlGroup, findSiteByName, resolveControlGroup } from '../core/SceneLoader';\nimport type {\n ControlGroupInfo,\n IkConfig,\n IkContextValue,\n IKSolveFn,\n IkSolveInput,\n IkTargetPosition,\n MujocoData,\n} from '../types';\n\n// Preallocated temp for syncGizmoToSite\nconst _syncMat4 = new THREE.Matrix4();\n\nfunction toIkVector3(value: IkSolveInput['position']): THREE.Vector3 {\n return 'x' in value\n ? new THREE.Vector3(value.x, value.y, value.z)\n : new THREE.Vector3(value[0], value[1], value[2]);\n}\n\nfunction toIkQuaternion(value: IkSolveInput['quaternion']): THREE.Quaternion {\n return 'x' in value\n ? new THREE.Quaternion(value.x, value.y, value.z, value.w)\n : new THREE.Quaternion(value[0], value[1], value[2], value[3]);\n}\n\nfunction syncGizmoToSite(data: MujocoData, siteId: number, target: THREE.Group) {\n if (siteId === -1) return;\n const sitePos = data.site_xpos.subarray(siteId * 3, siteId * 3 + 3);\n const siteMat = data.site_xmat.subarray(siteId * 9, siteId * 9 + 9);\n target.position.set(sitePos[0], sitePos[1], sitePos[2]);\n _syncMat4.set(\n siteMat[0], siteMat[1], siteMat[2], 0,\n siteMat[3], siteMat[4], siteMat[5], 0,\n siteMat[6], siteMat[7], siteMat[8], 0,\n 0, 0, 0, 1,\n );\n target.quaternion.setFromRotationMatrix(_syncMat4);\n}\n\nexport const useIkController = createControllerHook<IkConfig, IkContextValue>(\n { name: 'useIkController', defaultConfig: { damping: 0.01, maxIterations: 50 } },\n function useIkControllerImpl(config) {\n const { mjModelRef, mjDataRef, mujocoRef, resetCallbacks, status } =\n useMujocoContext();\n\n // All IK state lives here\n const ikEnabledRef = useRef(false);\n const ikCalculatingRef = useRef(false);\n const ikTargetRef = useRef<THREE.Group>(new THREE.Group());\n const siteIdRef = useRef(-1);\n const controlGroupRef = useRef<ControlGroupInfo | null>(null);\n const genericIkRef = useRef<GenericIK>(new GenericIK(mujocoRef.current));\n const firstIkEnableRef = useRef(true);\n const needsInitialSync = useRef(true);\n\n const gizmoAnimRef = useRef({\n active: false,\n startPos: new THREE.Vector3(),\n endPos: new THREE.Vector3(),\n startRot: new THREE.Quaternion(),\n endRot: new THREE.Quaternion(),\n startTime: 0,\n duration: 1000,\n });\n\n // Resolve site ID and model-aware control group when model loads or config changes.\n useEffect(() => {\n if (!config) {\n siteIdRef.current = -1;\n controlGroupRef.current = null;\n return;\n }\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n controlGroupRef.current = null;\n return;\n }\n siteIdRef.current = findSiteByName(model, config.siteName);\n controlGroupRef.current = config.numJoints !== undefined\n ? createContiguousControlGroup(model, config.numJoints)\n : resolveControlGroup(model, {\n siteName: config.siteName,\n joints: config.joints,\n actuators: config.actuators,\n });\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n }, [config?.siteName, config?.numJoints, config?.joints, config?.actuators, status, mjModelRef, mjDataRef, config]);\n\n // IK solve function\n const ikSolveFn = useCallback(\n ({ position, quaternion, currentQ, context }: IkSolveInput): number[] | null => {\n if (!config) return null;\n const targetPosition = toIkVector3(position);\n const targetQuaternion = toIkQuaternion(quaternion);\n const normalizedInput: IkSolveInput = {\n position: targetPosition,\n quaternion: targetQuaternion,\n currentQ,\n context,\n };\n if (config.ikSolveFn) return config.ikSolveFn(normalizedInput);\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const controlGroup = controlGroupRef.current;\n if (!model || !data || !controlGroup || siteIdRef.current === -1) return null;\n return genericIkRef.current.solve(\n model, data, siteIdRef.current, controlGroup.qposAdr,\n targetPosition, targetQuaternion, currentQ,\n {\n damping: config.damping,\n epsilon: config.epsilon,\n jointLimits: config.jointLimits ?? controlGroup.joints.map((joint) => (\n joint.limited ? joint.range : joint.ctrlRange\n )),\n maxIterations: config.maxIterations,\n posWeight: config.posWeight,\n rotWeight: config.rotWeight,\n tolerance: config.tolerance,\n },\n );\n },\n [config, mjModelRef, mjDataRef],\n );\n const ikSolveFnRef = useRef<IKSolveFn>(ikSolveFn);\n ikSolveFnRef.current = ikSolveFn;\n\n // Gizmo animation + one-time initial sync\n useFrame(() => {\n if (!config) return;\n\n if (needsInitialSync.current && siteIdRef.current !== -1) {\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n needsInitialSync.current = false;\n }\n }\n\n const ga = gizmoAnimRef.current;\n const target = ikTargetRef.current;\n if (!ga.active || !target) return;\n\n const now = performance.now();\n const elapsed = now - ga.startTime;\n const t = Math.min(elapsed / ga.duration, 1.0);\n const ease = 1 - Math.pow(1 - t, 3);\n target.position.lerpVectors(ga.startPos, ga.endPos, ease);\n target.quaternion.slerpQuaternions(ga.startRot, ga.endRot, ease);\n if (t >= 1.0) ga.active = false;\n });\n\n // IK solve in physics loop\n useBeforePhysicsStep(({ model, data }) => {\n if (!config || !ikEnabledRef.current) {\n ikCalculatingRef.current = false;\n return;\n }\n const target = ikTargetRef.current;\n if (!target) return;\n\n ikCalculatingRef.current = true;\n const controlGroup = controlGroupRef.current;\n if (!controlGroup) return;\n\n const currentQ = Array.from(controlGroup.readQpos(data));\n const solution = config.ikSolveFn\n ? config.ikSolveFn({\n position: target.position,\n quaternion: target.quaternion,\n currentQ,\n context: {\n model,\n data,\n siteId: siteIdRef.current,\n controlGroup,\n },\n })\n : ikSolveFnRef.current({\n position: target.position,\n quaternion: target.quaternion,\n currentQ,\n });\n if (solution) {\n controlGroup.writeCtrl(data, solution);\n }\n });\n\n // Reset callback\n useEffect(() => {\n if (!config) return;\n const cb = () => {\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n gizmoAnimRef.current.active = false;\n firstIkEnableRef.current = true;\n ikEnabledRef.current = false;\n needsInitialSync.current = true;\n };\n resetCallbacks.current.add(cb);\n return () => { resetCallbacks.current.delete(cb); };\n }, [resetCallbacks, mjDataRef, config]);\n\n // --- API methods ---\n\n const setIkEnabled = useCallback(\n (enabled: boolean) => {\n ikEnabledRef.current = enabled;\n const data = mjDataRef.current;\n if (enabled && data && !gizmoAnimRef.current.active && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n firstIkEnableRef.current = false;\n }\n },\n [mjDataRef],\n );\n\n const syncTargetToSiteApi = useCallback(() => {\n const data = mjDataRef.current;\n const target = ikTargetRef.current;\n if (data && target) syncGizmoToSite(data, siteIdRef.current, target);\n }, [mjDataRef]);\n\n const solveIK = useCallback(\n (input: IkSolveInput): number[] | null => {\n return ikSolveFnRef.current(input);\n },\n [],\n );\n\n const moveTarget = useCallback(\n (pos: IkTargetPosition, duration = 0) => {\n if (!ikEnabledRef.current) setIkEnabled(true);\n const target = ikTargetRef.current;\n if (!target) return;\n\n const targetPos = toIkVector3(pos);\n const targetRot = new THREE.Quaternion().setFromEuler(\n new THREE.Euler(Math.PI, 0, 0),\n );\n\n if (duration > 0) {\n const ga = gizmoAnimRef.current;\n ga.active = true;\n ga.startPos.copy(target.position);\n ga.endPos.copy(targetPos);\n ga.startRot.copy(target.quaternion);\n ga.endRot.copy(targetRot);\n ga.startTime = performance.now();\n ga.duration = duration;\n } else {\n gizmoAnimRef.current.active = false;\n target.position.copy(targetPos);\n target.quaternion.copy(targetRot);\n }\n },\n [setIkEnabled],\n );\n\n const getGizmoStats = useCallback(\n (): { pos: THREE.Vector3; rot: THREE.Euler } | null => {\n const target = ikTargetRef.current;\n if (!ikCalculatingRef.current || !target) return null;\n return {\n pos: target.position.clone(),\n rot: new THREE.Euler().setFromQuaternion(target.quaternion),\n };\n },\n [],\n );\n\n const contextValue = useMemo<IkContextValue>(\n () => ({\n ikEnabledRef,\n ikCalculatingRef,\n ikTargetRef,\n siteIdRef,\n setIkEnabled,\n moveTarget,\n syncTargetToSite: syncTargetToSiteApi,\n solveIK,\n getGizmoStats,\n }),\n [setIkEnabled, moveTarget, syncTargetToSiteApi, solveIK, getGizmoStats],\n );\n\n if (!config) return null;\n\n return contextValue;\n },\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport { useEffect, useLayoutEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { BodyProps, SceneObject } from '../types';\n\n/**\n * Declarative physics body component. Registers a body definition in the\n * provider-level registry so it gets injected into the MJCF XML at load time.\n *\n * Bodies present at initial mount cause zero extra reloads (useLayoutEffect\n * runs before the provider's loadScene useEffect). Bodies added/removed after\n * the initial load trigger a debounced scene reload.\n */\nexport function Body({\n name,\n type,\n size,\n position = [0, 0, 0],\n rgba = [0.5, 0.5, 0.5, 1],\n mass,\n freejoint,\n friction,\n solref,\n solimp,\n condim,\n group,\n children,\n}: BodyProps) {\n const { bodyRegistryRef, hiddenBodiesRef, requestBodyReload, mjDataRef, mjModelRef, status } =\n useMujocoContext();\n const bodyIdRef = useRef(-1);\n const groupRef = useRef<THREE.Group>(null);\n const initialLoadRef = useRef(true);\n const hasChildren = children != null;\n\n // Register in body registry BEFORE the provider's loadScene useEffect fires.\n useLayoutEffect(() => {\n const definition: SceneObject = {\n name,\n type,\n size,\n position,\n rgba,\n mass,\n freejoint,\n friction,\n solref,\n solimp,\n condim,\n group,\n };\n bodyRegistryRef.current.set(name, { definition, hasCustomChildren: hasChildren });\n if (hasChildren) {\n hiddenBodiesRef.current.add(name);\n }\n\n return () => {\n bodyRegistryRef.current.delete(name);\n hiddenBodiesRef.current.delete(name);\n if (!initialLoadRef.current) {\n requestBodyReload();\n }\n };\n }, [name, type, size, position, rgba, mass, freejoint, friction, solref, solimp, condim, group, hasChildren, bodyRegistryRef, hiddenBodiesRef, requestBodyReload]);\n\n // Resolve body ID once the scene is ready\n useEffect(() => {\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, name);\n initialLoadRef.current = false;\n }, [status, name, mjModelRef]);\n\n // Sync group transform to body pose each frame (only when children are provided)\n useFrame(() => {\n if (!hasChildren) return;\n const data = mjDataRef.current;\n const id = bodyIdRef.current;\n const group = groupRef.current;\n if (!data || id < 0 || !group) return;\n\n const i3 = id * 3;\n const i4 = id * 4;\n group.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n group.quaternion.set(\n data.xquat[i4 + 1],\n data.xquat[i4 + 2],\n data.xquat[i4 + 3],\n data.xquat[i4],\n );\n });\n\n if (!hasChildren) return null;\n\n return <group ref={groupRef}>{children}</group>;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { PivotControls } from '@react-three/drei';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport { CAPTURE_EXCLUDE_KEY } from '../rendering/cameraFrameCapture';\nimport type { IkGizmoProps } from '../types';\n\n// Preallocated temps to avoid GC pressure in useFrame\nconst _mat4 = new THREE.Matrix4();\nconst _pos = new THREE.Vector3();\nconst _quat = new THREE.Quaternion();\nconst _scale = new THREE.Vector3(1, 1, 1);\n\n/**\n * IkGizmo — drei PivotControls that tracks a MuJoCo site.\n *\n * Requires a `controller` from `useIkController()`.\n *\n * Props:\n * - `controller` — IkContextValue from `useIkController()`.\n * - `siteName` — MuJoCo site to track. Defaults to the controller's configured site.\n * - `scale` — Gizmo handle scale. Default: 0.18.\n * - `onDrag` — Custom drag callback `({ position, quaternion }) => void`.\n * When omitted, dragging enables IK and writes to the IK target.\n * When provided, the consumer handles what happens during drag.\n */\nexport function IkGizmo({ controller, siteName, scale = 0.18, onDrag }: IkGizmoProps) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const { ikTargetRef, siteIdRef, ikEnabledRef, setIkEnabled } = controller;\n\n const wrapperRef = useRef<THREE.Group>(null);\n const pivotRef = useRef<THREE.Group>(null);\n const draggingRef = useRef(false);\n const localSiteIdRef = useRef(-1);\n const { controls } = useThree();\n\n // Resolve the site ID from siteName (only when an explicit siteName override is given)\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready' || !siteName) {\n localSiteIdRef.current = -1;\n return;\n }\n localSiteIdRef.current = findSiteByName(model, siteName);\n }, [siteName, status, mjModelRef]);\n\n // Every frame: sync the visual wrapper to the tracked site (when not dragging)\n useFrame(() => {\n const data = mjDataRef.current;\n const sid = siteName ? localSiteIdRef.current : siteIdRef.current;\n if (!data || sid < 0 || !wrapperRef.current) return;\n\n if (!draggingRef.current) {\n const p = data.site_xpos;\n const m = data.site_xmat;\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n // Position wrapper at the site\n wrapperRef.current.position.set(p[i3], p[i3 + 1], p[i3 + 2]);\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n wrapperRef.current.quaternion.setFromRotationMatrix(_mat4);\n\n // Reset any accumulated drag delta so handles stay at wrapper origin\n if (pivotRef.current) {\n pivotRef.current.matrix.identity();\n }\n }\n });\n\n // Don't render until the model is loaded (avoids gizmo at origin)\n if (status !== 'ready') return null;\n\n return (\n <group\n ref={wrapperRef}\n userData={{ [CAPTURE_EXCLUDE_KEY]: true }}\n >\n <PivotControls\n ref={pivotRef}\n autoTransform\n scale={scale}\n fixed={false}\n depthTest={false}\n disableScaling\n onDragStart={() => {\n draggingRef.current = true;\n if (!onDrag) {\n // Default: enable IK so the robot follows\n if (!ikEnabledRef.current) setIkEnabled(true);\n }\n if (controls) (controls as unknown as { enabled: boolean }).enabled = false;\n }}\n onDragEnd={() => {\n draggingRef.current = false;\n // Reset PivotControls so it doesn't accumulate across drags\n if (pivotRef.current) {\n pivotRef.current.matrix.identity();\n pivotRef.current.matrixWorldNeedsUpdate = true;\n }\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n }}\n onDrag={(_l, _dl, world) => {\n world.decompose(_pos, _quat, _scale);\n if (onDrag) {\n // Custom: consumer handles the drag\n onDrag({ position: _pos.clone(), quaternion: _quat.clone() });\n } else {\n // Default: write to IK target\n const target = ikTargetRef.current;\n if (target) {\n target.position.copy(_pos);\n target.quaternion.copy(_quat);\n }\n }\n }}\n >\n {/* Invisible zero-size child: gives PivotControls a valid child\n without creating bounding-box anchor offset */}\n <mesh visible={false}>\n <sphereGeometry args={[0.001]} />\n </mesh>\n </PivotControls>\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * ContactMarkers — instanced sphere visualization of MuJoCo contacts (spec 6.2)\n *\n * Fixed from original: reads data.ncon first, accesses contact via .get(i),\n * limits to maxContacts to avoid WASM heap OOM.\n */\n\nimport { useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { CAPTURE_EXCLUDE_KEY } from '../rendering/cameraFrameCapture';\nimport { getContact, withContacts } from '../types';\n\nconst _dummy = new THREE.Object3D();\n\ninterface ContactMarkersProps {\n /** Maximum contacts to render. Default: 100. */\n maxContacts?: number;\n /** Sphere radius. Default: 0.008. */\n radius?: number;\n /** Color. Default: '#22d3ee'. */\n color?: string;\n /** Show markers. Default: true. */\n visible?: boolean;\n}\n\nexport function ContactMarkers({\n maxContacts = 100,\n radius = 0.008,\n color = '#22d3ee',\n visible = true,\n ...groupProps\n}: ContactMarkersProps & Omit<ThreeElements['group'], 'ref' | 'visible'> = {}) {\n const { mjDataRef, status } = useMujocoContext();\n const meshRef = useRef<THREE.InstancedMesh>(null);\n\n useFrame(() => {\n const mesh = meshRef.current;\n const data = mjDataRef.current;\n if (!mesh || !data || !visible) {\n if (mesh) mesh.count = 0;\n return;\n }\n\n const ncon = data.ncon;\n const count = Math.min(ncon, maxContacts);\n\n let resolvedCount = count;\n withContacts(data, (contactArray) => {\n for (let i = 0; i < count; i++) {\n const c = getContact(contactArray, i);\n if (!c) {\n resolvedCount = i;\n return;\n }\n _dummy.position.set(c.pos[0], c.pos[1], c.pos[2]);\n _dummy.updateMatrix();\n mesh.setMatrixAt(i, _dummy.matrix);\n }\n });\n\n mesh.count = resolvedCount;\n mesh.instanceMatrix.needsUpdate = true;\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group\n {...groupProps}\n userData={{\n ...groupProps.userData,\n [CAPTURE_EXCLUDE_KEY]: true,\n }}\n >\n <instancedMesh ref={meshRef} args={[undefined, undefined, maxContacts]} frustumCulled={false} renderOrder={999}>\n <sphereGeometry args={[radius, 8, 8]} />\n <meshBasicMaterial color={color} depthTest={false} />\n </instancedMesh>\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { CAPTURE_EXCLUDE_KEY } from '../rendering/cameraFrameCapture';\nimport type { DragInteractionProps } from '../types';\n\n// Preallocated temps to avoid GC pressure\nconst _force = new Float64Array(3);\nconst _torque = new Float64Array(3); // always [0,0,0]\nconst _point = new Float64Array(3);\nconst _bodyPos = new THREE.Vector3();\nconst _bodyQuat = new THREE.Quaternion();\nconst _worldHit = new THREE.Vector3();\nconst _raycaster = new THREE.Raycaster();\nconst _mouse = new THREE.Vector2();\n\n/**\n * DragInteraction — Ctrl/Cmd+click-drag to apply spring forces to MuJoCo bodies.\n *\n * Raycasts against scene meshes to identify bodies, then applies a spring\n * force pulling the grabbed point toward the cursor each physics frame.\n * Requires Ctrl (or Cmd on macOS) to avoid conflicting with OrbitControls.\n *\n * - `stiffness` — Spring constant * body mass. Default: 250.\n * - `showArrow` — Show arrow from grab point toward cursor. Default: true.\n *\n * Forces compose with useGravityCompensation — the provider zeros\n * qfrc_applied each frame, then all consumers add to it.\n */\nexport function DragInteraction({\n stiffness = 250,\n showArrow = true,\n ...groupProps\n}: DragInteractionProps & Omit<ThreeElements['group'], 'ref'>) {\n const { mjDataRef, mujocoRef, mjModelRef, status } = useMujocoContext();\n const { gl, camera, scene, controls } = useThree();\n\n const draggingRef = useRef(false);\n const bodyIdRef = useRef(-1);\n const grabDistanceRef = useRef(0);\n const localHitRef = useRef(new THREE.Vector3());\n const grabWorldRef = useRef(new THREE.Vector3());\n const mouseWorldRef = useRef(new THREE.Vector3());\n\n // Arrow helper for visual feedback (managed imperatively)\n const arrowRef = useRef<THREE.ArrowHelper | null>(null);\n const groupRef = useRef<THREE.Group>(null);\n\n useEffect(() => {\n if (!showArrow || !groupRef.current) return;\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 1, 0),\n new THREE.Vector3(),\n 0.1,\n 0xff4444,\n );\n arrow.userData[CAPTURE_EXCLUDE_KEY] = true;\n arrow.visible = false;\n // Make arrow semi-transparent\n (arrow.line.material as THREE.LineBasicMaterial).transparent = true;\n (arrow.line.material as THREE.LineBasicMaterial).opacity = 0.6;\n (arrow.cone.material as THREE.MeshBasicMaterial).transparent = true;\n (arrow.cone.material as THREE.MeshBasicMaterial).opacity = 0.6;\n groupRef.current.add(arrow);\n arrowRef.current = arrow;\n return () => {\n if (groupRef.current) groupRef.current.remove(arrow);\n arrow.dispose();\n arrowRef.current = null;\n };\n }, [showArrow]);\n\n // Pointer events on the canvas\n useEffect(() => {\n const canvas = gl.domElement;\n\n const onPointerDown = (evt: PointerEvent) => {\n if (evt.button !== 0) return; // left click only\n if (!evt.ctrlKey && !evt.metaKey) return; // require Ctrl/Cmd+click\n const rect = canvas.getBoundingClientRect();\n _mouse.set(\n ((evt.clientX - rect.left) / rect.width) * 2 - 1,\n -((evt.clientY - rect.top) / rect.height) * 2 + 1,\n );\n _raycaster.setFromCamera(_mouse, camera);\n\n const hits = _raycaster.intersectObjects(scene.children, true);\n for (const hit of hits) {\n let obj: THREE.Object3D | null = hit.object;\n while (obj && obj.userData.bodyID === undefined && obj.parent) {\n obj = obj.parent;\n }\n const bid = obj?.userData.bodyID;\n if (bid !== undefined && bid > 0) {\n bodyIdRef.current = bid;\n draggingRef.current = true;\n grabDistanceRef.current = hit.distance;\n\n // Store hit point in body-local coords\n const data = mjDataRef.current;\n if (data) {\n const i3 = bid * 3;\n const i4 = bid * 4;\n _bodyPos.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n // MuJoCo xquat is [w,x,y,z]; THREE wants (x,y,z,w)\n _bodyQuat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n // World hit → body-local: inverse(bodyRot) * (hitWorld - bodyPos)\n localHitRef.current.copy(hit.point).sub(_bodyPos);\n localHitRef.current.applyQuaternion(_bodyQuat.clone().invert());\n }\n\n mouseWorldRef.current.copy(hit.point);\n grabWorldRef.current.copy(hit.point);\n\n // Disable orbit controls during drag\n if (controls) (controls as unknown as { enabled: boolean }).enabled = false;\n break;\n }\n }\n };\n\n const onPointerMove = (evt: PointerEvent) => {\n if (!draggingRef.current) return;\n // Safety: if no buttons are pressed, the pointerup was missed\n if (evt.buttons === 0) {\n draggingRef.current = false;\n bodyIdRef.current = -1;\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n return;\n }\n const rect = canvas.getBoundingClientRect();\n _mouse.set(\n ((evt.clientX - rect.left) / rect.width) * 2 - 1,\n -((evt.clientY - rect.top) / rect.height) * 2 + 1,\n );\n _raycaster.setFromCamera(_mouse, camera);\n // Project mouse ray to the same grab distance\n mouseWorldRef.current.copy(_raycaster.ray.origin)\n .addScaledVector(_raycaster.ray.direction, grabDistanceRef.current);\n };\n\n const onPointerUp = () => {\n if (!draggingRef.current) return;\n draggingRef.current = false;\n bodyIdRef.current = -1;\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n };\n\n canvas.addEventListener('pointerdown', onPointerDown);\n canvas.addEventListener('pointermove', onPointerMove);\n // Listen on window so we catch releases even if pointer leaves the canvas\n window.addEventListener('pointerup', onPointerUp);\n window.addEventListener('pointercancel', onPointerUp);\n return () => {\n canvas.removeEventListener('pointerdown', onPointerDown);\n canvas.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onPointerUp);\n window.removeEventListener('pointercancel', onPointerUp);\n };\n }, [gl, camera, scene, controls, mjDataRef]);\n\n // Apply spring force each physics frame\n useBeforePhysicsStep(({ model, data }) => {\n if (!draggingRef.current || bodyIdRef.current <= 0) return;\n\n const bid = bodyIdRef.current;\n const mujoco = mujocoRef.current;\n\n // Reconstruct grab point world position from body's current pose\n const i3 = bid * 3;\n const i4 = bid * 4;\n _bodyPos.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n _bodyQuat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n _worldHit.copy(localHitRef.current);\n _worldHit.applyQuaternion(_bodyQuat);\n _worldHit.add(_bodyPos);\n grabWorldRef.current.copy(_worldHit);\n\n // Compute spring force: F = (mouseWorld - grabWorld) * body_mass * stiffness\n const mass = model.body_mass[bid];\n const s = stiffness * mass;\n _force[0] = (mouseWorldRef.current.x - _worldHit.x) * s;\n _force[1] = (mouseWorldRef.current.y - _worldHit.y) * s;\n _force[2] = (mouseWorldRef.current.z - _worldHit.z) * s;\n\n _point[0] = _worldHit.x;\n _point[1] = _worldHit.y;\n _point[2] = _worldHit.z;\n\n _torque[0] = 0; _torque[1] = 0; _torque[2] = 0;\n\n mujoco.mj_applyFT(model, data, _force, _torque, _point, bid, data.qfrc_applied);\n });\n\n // Update arrow visual\n useFrame(() => {\n const arrow = arrowRef.current;\n if (!arrow) return;\n\n if (draggingRef.current && bodyIdRef.current > 0) {\n arrow.visible = true;\n const dir = _bodyPos.copy(mouseWorldRef.current).sub(grabWorldRef.current);\n const len = dir.length();\n if (len > 0.001) {\n dir.normalize();\n arrow.position.copy(grabWorldRef.current);\n arrow.setDirection(dir);\n arrow.setLength(len, Math.min(len * 0.2, 0.05), Math.min(len * 0.1, 0.03));\n }\n } else {\n arrow.visible = false;\n }\n });\n\n if (status !== 'ready') return null;\n\n return <group {...groupProps} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSceneLights — hook form of SceneLights (spec 6.3)\n *\n * Auto-creates Three.js lights from MJCF <light> elements.\n */\n\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\nexport function useSceneLights(intensity = 1.0) {\n const { mjModelRef, status } = useMujocoContext();\n const { scene } = useThree();\n const lightsRef = useRef<THREE.Light[]>([]);\n const targetsRef = useRef<THREE.Object3D[]>([]);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n\n // Clean up previous lights\n for (const light of lightsRef.current) {\n scene.remove(light);\n light.dispose();\n }\n for (const t of targetsRef.current) scene.remove(t);\n lightsRef.current = [];\n targetsRef.current = [];\n\n const nlight = model.nlight ?? 0;\n if (nlight === 0) return;\n\n const lightActive = getModelArray(model, 'light_active');\n const lightTypeArray = getModelArray(model, 'light_type');\n const lightCastShadow = getModelArray(model, 'light_castshadow');\n const lightIntensity = getModelArray(model, 'light_intensity');\n const lightDiffuse = getModelArray(model, 'light_diffuse');\n const lightPos = getModelArray(model, 'light_pos');\n const lightDir = getModelArray(model, 'light_dir');\n const lightCutoff = getModelArray(model, 'light_cutoff');\n const lightExponent = getModelArray(model, 'light_exponent');\n const lightAttenuation = getModelArray(model, 'light_attenuation');\n\n if (!lightPos || !lightDir) return;\n\n for (let i = 0; i < nlight; i++) {\n const active = lightActive ? lightActive[i] : 1;\n if (!active) continue;\n\n const lightType = lightTypeArray ? lightTypeArray[i] : 0;\n const isDirectional = lightType === 0;\n const castShadow = lightCastShadow ? lightCastShadow[i] !== 0 : false;\n\n const mjIntensity = lightIntensity ? lightIntensity[i] : 1.0;\n const finalIntensity = intensity * mjIntensity;\n\n const dr = lightDiffuse ? lightDiffuse[3 * i] : 1;\n const dg = lightDiffuse ? lightDiffuse[3 * i + 1] : 1;\n const db = lightDiffuse ? lightDiffuse[3 * i + 2] : 1;\n const color = new THREE.Color(dr, dg, db);\n\n const px = lightPos[3 * i];\n const py = lightPos[3 * i + 1];\n const pz = lightPos[3 * i + 2];\n const dx = lightDir[3 * i];\n const dy = lightDir[3 * i + 1];\n const dz = lightDir[3 * i + 2];\n\n if (isDirectional) {\n const light = new THREE.DirectionalLight(color, finalIntensity);\n light.position.set(px, py, pz);\n light.target.position.set(px + dx, py + dy, pz + dz);\n light.castShadow = castShadow;\n if (castShadow) {\n light.shadow.mapSize.width = 1024;\n light.shadow.mapSize.height = 1024;\n light.shadow.camera.near = 0.1;\n light.shadow.camera.far = 50;\n const d = 5;\n light.shadow.camera.left = -d;\n light.shadow.camera.right = d;\n light.shadow.camera.top = d;\n light.shadow.camera.bottom = -d;\n }\n scene.add(light);\n scene.add(light.target);\n lightsRef.current.push(light);\n targetsRef.current.push(light.target);\n } else {\n const cutoff = lightCutoff ? lightCutoff[i] : 45;\n const exponent = lightExponent ? lightExponent[i] : 10;\n const angle = (cutoff * Math.PI) / 180;\n const light = new THREE.SpotLight(color, finalIntensity, 0, angle, exponent / 128);\n light.position.set(px, py, pz);\n light.target.position.set(px + dx, py + dy, pz + dz);\n light.castShadow = castShadow;\n\n if (lightAttenuation) {\n const att1 = lightAttenuation[3 * i + 1];\n const att2 = lightAttenuation[3 * i + 2];\n light.decay = att2 > 0 ? 2 : (att1 > 0 ? 1 : 0);\n light.distance = att1 > 0 ? 1 / att1 : 0;\n }\n\n if (castShadow) {\n light.shadow.mapSize.width = 512;\n light.shadow.mapSize.height = 512;\n }\n scene.add(light);\n scene.add(light.target);\n lightsRef.current.push(light);\n targetsRef.current.push(light.target);\n }\n }\n\n return () => {\n for (const light of lightsRef.current) {\n scene.remove(light);\n light.dispose();\n }\n for (const t of targetsRef.current) scene.remove(t);\n lightsRef.current = [];\n targetsRef.current = [];\n };\n }, [status, mjModelRef, scene, intensity]);\n}\n\nfunction getModelArray(model: unknown, key: string): ArrayLike<number> | undefined {\n try {\n const value = (model as Record<string, unknown>)[key];\n return isArrayLikeNumber(value) ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isArrayLikeNumber(value: unknown): value is ArrayLike<number> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'length' in value &&\n typeof (value as ArrayLike<number>).length === 'number'\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * SceneLights — auto-create Three.js lights from MJCF <light> elements (spec 6.3)\n *\n * WASM fields used: model.nlight, light_pos, light_dir, light_diffuse,\n * light_specular, light_active, light_type, light_castshadow,\n * light_attenuation, light_cutoff, light_exponent, light_intensity\n *\n * light_type: 0 = directional, 1 = spot (maps to mjLIGHT_DIRECTIONAL/mjLIGHT_SPOT)\n * Note: light_directional does NOT exist in WASM — use light_type instead.\n */\n\nimport { useSceneLights } from '../hooks/useSceneLights';\nimport type { SceneLightsProps } from '../types';\n\nexport function SceneLights({ intensity = 1.0 }: SceneLightsProps) {\n useSceneLights(intensity);\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { SplatCollisionProxyConfig } from '../types';\n\nexport type SplatCollisionProxyPreviewVector3 = [number, number, number];\n\nexport interface SplatCollisionProxyGeomPreview {\n id: string;\n type: 'box' | 'plane' | 'sphere' | 'capsule' | 'mesh';\n position: SplatCollisionProxyPreviewVector3;\n size: number[];\n}\n\nexport interface SplatCollisionProxyPreviewProps\n extends Omit<ThreeElements['group'], 'ref'> {\n collisionProxy?: SplatCollisionProxyConfig | null;\n xmlText?: string;\n fetchXml?: (xmlPath: string) => Promise<string>;\n color?: string;\n opacity?: number;\n planeColor?: string;\n planeOpacity?: number;\n}\n\nexport type SplatCollisionProxyPreviewStatus =\n | 'idle'\n | 'loading'\n | 'ready'\n | 'error';\n\nexport interface UseSplatCollisionProxyGeomsOptions {\n collisionProxy?: SplatCollisionProxyConfig | null;\n xmlText?: string;\n fetchXml?: (xmlPath: string) => Promise<string>;\n enabled?: boolean;\n}\n\nexport interface SplatCollisionProxyGeomsState {\n geoms: SplatCollisionProxyGeomPreview[];\n status: SplatCollisionProxyPreviewStatus;\n error: Error | null;\n xmlPath?: string;\n}\n\nexport function SplatCollisionProxyPreview({\n collisionProxy,\n xmlText,\n fetchXml = fetchSplatCollisionProxyXml,\n color = '#60a5fa',\n opacity = 0.12,\n planeColor = '#94a3b8',\n planeOpacity = 0.08,\n children,\n ...groupProps\n}: SplatCollisionProxyPreviewProps) {\n const { geoms } = useSplatCollisionProxyGeoms({\n collisionProxy,\n xmlText,\n fetchXml,\n });\n\n if (geoms.length === 0 && !children) return null;\n\n return (\n <group\n {...groupProps}\n userData={{\n kind: 'splat-collision-proxy-preview',\n ...groupProps.userData,\n }}\n >\n {geoms.map((geom) => (\n <SplatCollisionProxyGeom\n key={geom.id}\n geom={geom}\n color={color}\n opacity={opacity}\n planeColor={planeColor}\n planeOpacity={planeOpacity}\n />\n ))}\n {children}\n </group>\n );\n}\n\nexport function useSplatCollisionProxyGeoms({\n collisionProxy,\n xmlText,\n fetchXml = fetchSplatCollisionProxyXml,\n enabled = true,\n}: UseSplatCollisionProxyGeomsOptions): SplatCollisionProxyGeomsState {\n const [loadedXmlText, setLoadedXmlText] = useState<string | null>(null);\n const [status, setStatus] =\n useState<SplatCollisionProxyPreviewStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const xmlPath = collisionProxy?.xmlPath;\n\n useEffect(() => {\n let cancelled = false;\n\n if (!enabled) {\n setLoadedXmlText(null);\n setStatus('idle');\n setError(null);\n return undefined;\n }\n\n if (xmlText) {\n setLoadedXmlText(xmlText);\n setStatus('ready');\n setError(null);\n return undefined;\n }\n\n if (!xmlPath || !canFetchSplatCollisionProxyXml(xmlPath)) {\n setLoadedXmlText(null);\n setStatus('idle');\n setError(null);\n return undefined;\n }\n const fetchPath = xmlPath;\n\n async function loadProxyXml() {\n setStatus('loading');\n setError(null);\n\n try {\n const nextXmlText = await fetchXml(fetchPath);\n if (!cancelled) {\n setLoadedXmlText(nextXmlText);\n setStatus('ready');\n }\n } catch (nextError) {\n if (!cancelled) {\n setLoadedXmlText(null);\n setStatus('error');\n setError(\n nextError instanceof Error\n ? nextError\n : new Error('Unable to load collision proxy XML.')\n );\n }\n }\n }\n\n void loadProxyXml();\n\n return () => {\n cancelled = true;\n };\n }, [enabled, fetchXml, xmlPath, xmlText]);\n\n const geoms = useMemo(\n () => (loadedXmlText ? parseSplatCollisionProxyGeoms(loadedXmlText) : []),\n [loadedXmlText]\n );\n\n return useMemo(\n () => ({\n geoms,\n status,\n error,\n xmlPath,\n }),\n [error, geoms, status, xmlPath]\n );\n}\n\nexport async function fetchSplatCollisionProxyXml(xmlPath: string) {\n const response = await fetch(xmlPath);\n if (!response.ok) {\n throw new Error(`Unable to load collision proxy XML (${response.status}).`);\n }\n return response.text();\n}\n\nexport function canFetchSplatCollisionProxyXml(xmlPath: string) {\n return (\n xmlPath.startsWith('/') ||\n xmlPath.startsWith('http://') ||\n xmlPath.startsWith('https://')\n );\n}\n\nexport function parseSplatCollisionProxyGeoms(\n xmlText: string\n): SplatCollisionProxyGeomPreview[] {\n const parser = typeof DOMParser === 'undefined' ? null : new DOMParser();\n if (!parser) return [];\n\n const document = parser.parseFromString(xmlText, 'application/xml');\n if (document.querySelector('parsererror')) return [];\n\n const bodyPositions = new Map<Element, SplatCollisionProxyPreviewVector3>();\n\n for (const body of Array.from(document.querySelectorAll('body'))) {\n const parentBody = body.parentElement?.closest('body');\n const parentPosition: SplatCollisionProxyPreviewVector3 = parentBody\n ? bodyPositions.get(parentBody) ?? [0, 0, 0]\n : [0, 0, 0];\n bodyPositions.set(\n body,\n addProxyVectors(parentPosition, parseProxyVector(body.getAttribute('pos')))\n );\n }\n\n return Array.from(document.querySelectorAll('geom'))\n .map((geom, index): SplatCollisionProxyGeomPreview | null => {\n const type = getCollisionProxyGeomType(geom);\n if (!type) return null;\n const parentBody = geom.closest('body');\n const bodyPosition: SplatCollisionProxyPreviewVector3 = parentBody\n ? bodyPositions.get(parentBody) ?? [0, 0, 0]\n : [0, 0, 0];\n const position = addProxyVectors(\n bodyPosition,\n parseProxyVector(geom.getAttribute('pos'))\n );\n const size = parseNumberList(geom.getAttribute('size'));\n return {\n id: geom.getAttribute('name') ?? `${type}-${index}`,\n type,\n position,\n size,\n };\n })\n .filter((geom): geom is SplatCollisionProxyGeomPreview => Boolean(geom));\n}\n\nfunction SplatCollisionProxyGeom({\n geom,\n color,\n opacity,\n planeColor,\n planeOpacity,\n}: {\n geom: SplatCollisionProxyGeomPreview;\n color: string;\n opacity: number;\n planeColor: string;\n planeOpacity: number;\n}) {\n if (geom.type === 'sphere') {\n return (\n <mesh position={geom.position}>\n <sphereGeometry args={[geom.size[0] ?? 0.1, 16, 8]} />\n <SplatCollisionProxyMaterial color={color} opacity={opacity} />\n </mesh>\n );\n }\n\n if (geom.type === 'plane') {\n const width = geom.size[0] && geom.size[0] > 0 ? geom.size[0] * 2 : 4;\n const height = geom.size[1] && geom.size[1] > 0 ? geom.size[1] * 2 : 4;\n return (\n <mesh position={geom.position}>\n <boxGeometry args={[width, height, 0.02]} />\n <SplatCollisionProxyMaterial color={planeColor} opacity={planeOpacity} />\n </mesh>\n );\n }\n\n const size = getCollisionProxyBoxSize(geom);\n return (\n <mesh position={geom.position}>\n <boxGeometry args={size} />\n <SplatCollisionProxyMaterial color={color} opacity={opacity} />\n </mesh>\n );\n}\n\nfunction SplatCollisionProxyMaterial({\n color,\n opacity,\n}: {\n color: string;\n opacity: number;\n}) {\n return (\n <meshBasicMaterial\n color={color}\n transparent\n opacity={opacity}\n wireframe\n />\n );\n}\n\nfunction getCollisionProxyGeomType(\n geom: Element\n): SplatCollisionProxyGeomPreview['type'] | null {\n const type = geom.getAttribute('type') ?? 'sphere';\n if (\n type === 'box' ||\n type === 'plane' ||\n type === 'sphere' ||\n type === 'capsule' ||\n type === 'mesh'\n ) {\n return type;\n }\n return null;\n}\n\nfunction getCollisionProxyBoxSize(\n geom: SplatCollisionProxyGeomPreview\n): SplatCollisionProxyPreviewVector3 {\n if (geom.type === 'capsule') {\n const radius = geom.size[0] ?? 0.05;\n const halfLength = geom.size[1] ?? radius;\n return [radius * 2, radius * 2, Math.max(radius * 2, halfLength * 2)];\n }\n\n if (geom.type === 'mesh') return [0.2, 0.2, 0.2];\n\n return [\n (geom.size[0] ?? 0.1) * 2,\n (geom.size[1] ?? geom.size[0] ?? 0.1) * 2,\n (geom.size[2] ?? geom.size[0] ?? 0.1) * 2,\n ];\n}\n\nfunction parseProxyVector(\n value: string | null\n): SplatCollisionProxyPreviewVector3 {\n const values = parseNumberList(value);\n return [values[0] ?? 0, values[1] ?? 0, values[2] ?? 0];\n}\n\nfunction parseNumberList(value: string | null) {\n if (!value) return [];\n return value\n .trim()\n .split(/\\s+/)\n .map((part) => Number(part))\n .filter((part) => Number.isFinite(part));\n}\n\nfunction addProxyVectors(\n a: SplatCollisionProxyPreviewVector3,\n b: SplatCollisionProxyPreviewVector3\n): SplatCollisionProxyPreviewVector3 {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Stream a live MuJoCo camera into a DOM `<canvas>`. Each frame the scene is\n * rendered offscreen from the selected camera and blitted into the canvas, so\n * it composites normally in the DOM (works inside opaque panels) and does NOT\n * take over the render loop. Prefer this over `useCameraViewport` for camera\n * tiles embedded in HTML UI; use `useCameraViewport` for transparent overlays\n * on a full-bleed canvas.\n *\n * Uses the async capture path so Gaussian-splat environments render through\n * their dedicated capture renderer — streaming a splat scene at full rate does\n * not disturb the main view's splat sort.\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport type { CameraFrameCaptureSession } from '../rendering/cameraFrameCapture';\nimport type { CameraFrameCaptureOptions } from '../types';\n\nexport interface CameraStreamOptions extends CameraFrameCaptureOptions {\n /**\n * Optional cap on updates per second. Omit to stream as fast as captures\n * complete (one capture is in flight at a time regardless).\n */\n fps?: number;\n /** Pause updates without unmounting. */\n paused?: boolean;\n}\n\nfunction streamSignature(options: CameraStreamOptions): string {\n return JSON.stringify({\n cameraName: options.cameraName,\n siteName: options.siteName,\n bodyName: options.bodyName,\n width: options.width,\n height: options.height,\n renderIsolation: options.renderIsolation ?? false,\n });\n}\n\n/**\n * Render the live scene from a MuJoCo camera/site/body into `canvasRef`'s\n * `<canvas>` every frame (throttled to `fps`). Call inside `<MujocoCanvas>`;\n * the canvas itself can live anywhere in the DOM.\n */\nexport function useCameraStream(\n canvasRef: RefObject<HTMLCanvasElement | null>,\n options: CameraStreamOptions\n) {\n const mujoco = useMujoco();\n const sessionRef = useRef<CameraFrameCaptureSession | null>(null);\n const signatureRef = useRef<string>('');\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const elapsedRef = useRef(0);\n const inFlightRef = useRef(false);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n sessionRef.current?.dispose();\n sessionRef.current = null;\n signatureRef.current = '';\n };\n }, []);\n\n useFrame((_state, delta) => {\n const api = mujoco.api;\n if (!api || !canvasRef.current) return;\n\n const opts = optionsRef.current;\n if (opts.paused) return;\n\n if (opts.fps && opts.fps > 0) {\n elapsedRef.current += delta;\n if (elapsedRef.current < 1 / opts.fps) return;\n }\n // One capture in flight at a time — naturally rate-limits to capture speed.\n if (inFlightRef.current) return;\n elapsedRef.current = 0;\n\n const signature = streamSignature(opts);\n if (!sessionRef.current || signatureRef.current !== signature) {\n sessionRef.current?.dispose();\n sessionRef.current = api.createCameraFrameCaptureSession(opts);\n signatureRef.current = signature;\n }\n const session = sessionRef.current;\n\n inFlightRef.current = true;\n session\n .captureAsync(api.resolveCameraCaptureOptions(opts))\n .then((frame) => {\n const canvas = canvasRef.current;\n if (!mountedRef.current || !canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n if (canvas.width !== frame.width || canvas.height !== frame.height) {\n canvas.width = frame.width;\n canvas.height = frame.height;\n }\n ctx.drawImage(frame.canvas, 0, 0);\n })\n .catch(() => {})\n .finally(() => {\n inFlightRef.current = false;\n });\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Debug — visualization overlay for MuJoCo scene elements (spec 6.1)\n */\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { CAPTURE_EXCLUDE_KEY } from '../rendering/cameraFrameCapture';\nimport { getContact, withContacts } from '../types';\nimport type { CameraFrameCaptureVector3, DebugProps, DebugVirtualCamera } from '../types';\n\nconst JOINT_COLORS: Record<number, number> = {\n 0: 0xff0000, // free - red\n 1: 0x00ff00, // ball - green\n 2: 0x0000ff, // slide - blue\n 3: 0xffff00, // hinge - yellow\n};\n\n// Preallocated temps to avoid per-frame GC pressure\nconst _v3a = new THREE.Vector3();\nconst _v3b = new THREE.Vector3();\nconst _quat = new THREE.Quaternion();\nconst _cameraMatrix = new THREE.Matrix4();\nconst _contactPos = new THREE.Vector3();\nconst _contactNormal = new THREE.Vector3();\nconst MAX_CONTACT_ARROWS = 50;\nconst CAMERA_DEBUG_LENGTH = 0.12;\nconst CAMERA_DEBUG_FRUSTUM_DEPTH = 0.08;\n\ntype CameraDebugObject = THREE.Group & {\n userData: {\n cameraId: number;\n frustum: THREE.LineSegments;\n label?: THREE.Sprite;\n };\n};\n\nfunction toVector3(\n value: CameraFrameCaptureVector3 | undefined,\n fallback: THREE.Vector3\n) {\n if (!value) return fallback.clone();\n return value instanceof THREE.Vector3\n ? value.clone()\n : new THREE.Vector3(value[0], value[1], value[2]);\n}\n\nfunction createCameraLabel(text: string, color: THREE.ColorRepresentation) {\n const canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 64;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = new THREE.Color(color).getStyle();\n ctx.font = 'bold 32px monospace';\n ctx.textAlign = 'center';\n ctx.fillText(text, 128, 42);\n const texture = new THREE.CanvasTexture(canvas);\n const sprite = new THREE.Sprite(\n new THREE.SpriteMaterial({\n map: texture,\n depthTest: false,\n transparent: true,\n })\n );\n sprite.position.set(0, 0.014, 0.01);\n sprite.scale.set(0.05, 0.012, 1);\n sprite.renderOrder = 999;\n return sprite;\n}\n\nfunction createVirtualCameraDebugObject(\n camera: DebugVirtualCamera,\n index: number\n) {\n const color = camera.color ?? '#ff3d71';\n const aimColor = camera.aimColor ?? '#38bdf8';\n const markerScale = camera.markerScale ?? 1;\n const cameraPosition = toVector3(camera.position, new THREE.Vector3());\n const configuredUp = toVector3(camera.up, new THREE.Vector3(0, 0, 1)).normalize();\n const cameraQuaternion = new THREE.Quaternion();\n const forward = new THREE.Vector3();\n\n if (camera.quaternion) {\n if (camera.quaternion instanceof THREE.Quaternion) {\n cameraQuaternion.copy(camera.quaternion);\n } else {\n cameraQuaternion.set(\n camera.quaternion[0],\n camera.quaternion[1],\n camera.quaternion[2],\n camera.quaternion[3]\n );\n }\n forward.set(0, 0, -1).applyQuaternion(cameraQuaternion).normalize();\n } else {\n const target = toVector3(\n camera.lookAt,\n cameraPosition.clone().add(new THREE.Vector3(0, 0, -1))\n );\n forward.copy(target).sub(cameraPosition);\n if (forward.lengthSq() < 1e-8) forward.set(0, 0, -1);\n forward.normalize();\n cameraQuaternion.setFromRotationMatrix(\n new THREE.Matrix4().lookAt(cameraPosition, target, configuredUp)\n );\n }\n\n const target = camera.lookAt\n ? toVector3(camera.lookAt, cameraPosition.clone().add(forward))\n : cameraPosition.clone().addScaledVector(forward, 0.4);\n const distanceToTarget = Math.max(target.distanceTo(cameraPosition), 0.001);\n const depth = camera.frustumDepth ?? Math.min(Math.max(distanceToTarget * 0.42, 0.16), 0.45);\n const fov = camera.fov ?? 50;\n const aspect = (camera.width ?? 640) / (camera.height ?? 480);\n\n const right = forward.clone().cross(configuredUp);\n if (right.lengthSq() < 1e-8) right.set(1, 0, 0);\n right.normalize();\n const orthogonalUp = right.clone().cross(forward).normalize();\n const frustumHeight = 2 * Math.tan(THREE.MathUtils.degToRad(fov) / 2) * depth;\n const frustumWidth = frustumHeight * aspect;\n const center = cameraPosition.clone().addScaledVector(forward, depth);\n const halfRight = right.clone().multiplyScalar(frustumWidth / 2);\n const halfUp = orthogonalUp.clone().multiplyScalar(frustumHeight / 2);\n\n const topLeft = center.clone().sub(halfRight).add(halfUp);\n const topRight = center.clone().add(halfRight).add(halfUp);\n const bottomRight = center.clone().add(halfRight).sub(halfUp);\n const bottomLeft = center.clone().sub(halfRight).sub(halfUp);\n const frustumPoints = [\n cameraPosition, topLeft,\n cameraPosition, topRight,\n cameraPosition, bottomRight,\n cameraPosition, bottomLeft,\n topLeft, topRight,\n topRight, bottomRight,\n bottomRight, bottomLeft,\n bottomLeft, topLeft,\n ];\n\n const group = new THREE.Group();\n group.name = camera.name ?? `virtual-camera-${index}`;\n group.renderOrder = 999;\n group.frustumCulled = false;\n\n const frustum = new THREE.LineSegments(\n new THREE.BufferGeometry().setFromPoints(frustumPoints),\n new THREE.LineBasicMaterial({\n color,\n transparent: true,\n opacity: 0.9,\n depthTest: false,\n })\n );\n frustum.renderOrder = 999;\n frustum.frustumCulled = false;\n group.add(frustum);\n\n const aim = new THREE.LineSegments(\n new THREE.BufferGeometry().setFromPoints([cameraPosition, target]),\n new THREE.LineBasicMaterial({\n color: aimColor,\n transparent: true,\n opacity: 0.95,\n depthTest: false,\n })\n );\n aim.renderOrder = 999;\n aim.frustumCulled = false;\n group.add(aim);\n\n const markerGroup = new THREE.Group();\n markerGroup.position.copy(cameraPosition);\n markerGroup.quaternion.copy(cameraQuaternion);\n markerGroup.renderOrder = 999;\n markerGroup.frustumCulled = false;\n markerGroup.add(new THREE.Mesh(\n new THREE.BoxGeometry(0.045 * markerScale, 0.028 * markerScale, 0.022 * markerScale),\n new THREE.MeshBasicMaterial({ color, depthTest: false })\n ));\n const lens = new THREE.Mesh(\n new THREE.BoxGeometry(0.025 * markerScale, 0.018 * markerScale, 0.014 * markerScale),\n new THREE.MeshBasicMaterial({ color: aimColor, depthTest: false })\n );\n lens.position.set(0, 0, -0.021 * markerScale);\n markerGroup.add(lens);\n if (camera.name) markerGroup.add(createCameraLabel(camera.name, color));\n group.add(markerGroup);\n\n const targetMarker = new THREE.Mesh(\n new THREE.SphereGeometry(0.018 * markerScale, 16, 10),\n new THREE.MeshBasicMaterial({ color: aimColor, depthTest: false })\n );\n targetMarker.position.copy(target);\n targetMarker.renderOrder = 999;\n targetMarker.frustumCulled = false;\n group.add(targetMarker);\n\n return group;\n}\n\n/**\n * Declarative debug visualization component.\n * Renders wireframe geoms, site markers, joint axes, contact forces, COM markers, etc.\n */\nexport function Debug({\n showGeoms = false,\n showSites = false,\n showJoints = false,\n showCameras = false,\n virtualCameras = [],\n showContacts = false,\n showCOM = false,\n showInertia = false,\n showTendons = false,\n ...groupProps\n}: DebugProps & Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const { scene } = useThree();\n const groupRef = useRef<THREE.Group>(null);\n\n // Build static debug geometry when model loads\n const debugGeometry = useMemo(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return null;\n\n const geoms: THREE.Object3D[] = [];\n const sites: THREE.Object3D[] = [];\n const joints: THREE.Object3D[] = [];\n const cameras: CameraDebugObject[] = [];\n const virtualCameraObjects: THREE.Object3D[] = [];\n const comMarkers: THREE.Object3D[] = [];\n\n // Wireframe geoms\n if (showGeoms) {\n for (let i = 0; i < model.ngeom; i++) {\n const type = model.geom_type[i];\n const s = model.geom_size;\n let geometry: THREE.BufferGeometry | null = null;\n\n switch (type) {\n case 2: // sphere\n geometry = new THREE.SphereGeometry(s[3 * i], 12, 8);\n break;\n case 3: // capsule\n geometry = new THREE.CapsuleGeometry(s[3 * i], s[3 * i + 1] * 2, 6, 8);\n break;\n case 5: // cylinder\n geometry = new THREE.CylinderGeometry(s[3 * i], s[3 * i], s[3 * i + 1] * 2, 12);\n break;\n case 6: // box\n geometry = new THREE.BoxGeometry(s[3 * i] * 2, s[3 * i + 1] * 2, s[3 * i + 2] * 2);\n break;\n }\n\n if (geometry) {\n const mat = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true, transparent: true, opacity: 0.3 });\n const mesh = new THREE.Mesh(geometry, mat);\n mesh.userData.geomId = i;\n mesh.userData.bodyId = model.geom_bodyid[i];\n geoms.push(mesh);\n }\n }\n }\n\n // Site markers — scale based on site_size if available, else use geom_size of parent body\n if (showSites) {\n const siteSize = (model as Record<string, unknown>).site_size as Float64Array | undefined;\n for (let i = 0; i < model.nsite; i++) {\n // Determine marker radius: use site_size[3*i] if available, else estimate from parent body's geoms\n let radius = 0.008;\n if (siteSize) {\n radius = Math.max(siteSize[3 * i] * 0.5, 0.004);\n } else {\n // Estimate from parent body's geom sizes\n const bodyId = model.site_bodyid[i];\n let maxGeomSize = 0;\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === bodyId) {\n maxGeomSize = Math.max(maxGeomSize, model.geom_size[3 * g]);\n }\n }\n if (maxGeomSize > 0) radius = maxGeomSize * 0.15;\n }\n\n const geometry = new THREE.OctahedronGeometry(radius);\n const mat = new THREE.MeshBasicMaterial({ color: 0xff00ff, depthTest: false });\n const mesh = new THREE.Mesh(geometry, mat);\n mesh.renderOrder = 999;\n mesh.frustumCulled = false;\n mesh.userData.siteId = i;\n\n // Label\n const canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 64;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = '#ff00ff';\n ctx.font = 'bold 36px monospace';\n ctx.textAlign = 'center';\n ctx.fillText(getName(model, model.name_siteadr[i]), 128, 42);\n const tex = new THREE.CanvasTexture(canvas);\n const spriteMat = new THREE.SpriteMaterial({ map: tex, depthTest: false, transparent: true });\n const sprite = new THREE.Sprite(spriteMat);\n const labelScale = radius * 15;\n sprite.scale.set(labelScale, labelScale * 0.25, 1);\n sprite.position.y = radius * 2;\n sprite.renderOrder = 999;\n mesh.add(sprite);\n\n sites.push(mesh);\n }\n }\n\n // Joint axes — scale arrow length based on parent body's geom sizes\n if (showJoints) {\n // Safely check for jnt_pos/jnt_axis on the WASM model\n const jntPos = (model as Record<string, unknown>).jnt_pos as Float64Array | undefined;\n const jntAxis = (model as Record<string, unknown>).jnt_axis as Float64Array | undefined;\n\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const color = JOINT_COLORS[type] ?? 0xffffff;\n\n // Scale based on parent body geom size\n const bodyId = model.jnt_bodyid[i];\n let maxGeomSize = 0;\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === bodyId) {\n maxGeomSize = Math.max(maxGeomSize, model.geom_size[3 * g]);\n }\n }\n const arrowLen = Math.max(maxGeomSize * 0.8, 0.05);\n\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 0, 1), new THREE.Vector3(),\n arrowLen, color, arrowLen * 0.25, arrowLen * 0.12\n );\n // Render on top so arrows show through geometry\n arrow.renderOrder = 999;\n arrow.frustumCulled = false;\n arrow.line.material = new THREE.LineBasicMaterial({ color, depthTest: false });\n (arrow.cone.material as THREE.MeshBasicMaterial).depthTest = false;\n arrow.line.renderOrder = 999;\n arrow.line.frustumCulled = false;\n arrow.cone.renderOrder = 999;\n arrow.cone.frustumCulled = false;\n arrow.userData.jointId = i;\n arrow.userData.bodyId = bodyId;\n arrow.userData.hasJntPos = !!jntPos;\n arrow.userData.hasJntAxis = !!jntAxis;\n joints.push(arrow);\n }\n }\n\n if (showCameras && model.ncam && model.name_camadr) {\n for (let i = 0; i < model.ncam; i++) {\n const group = new THREE.Group() as CameraDebugObject;\n group.userData.cameraId = i;\n group.renderOrder = 999;\n group.frustumCulled = false;\n\n const marker = new THREE.Mesh(\n new THREE.BoxGeometry(0.014, 0.009, 0.006),\n new THREE.MeshBasicMaterial({ color: 0x38bdf8, depthTest: false })\n );\n marker.renderOrder = 999;\n marker.frustumCulled = false;\n group.add(marker);\n\n const forward = new THREE.ArrowHelper(\n new THREE.Vector3(0, 0, -1),\n new THREE.Vector3(),\n CAMERA_DEBUG_LENGTH,\n 0x38bdf8,\n CAMERA_DEBUG_LENGTH * 0.24,\n CAMERA_DEBUG_LENGTH * 0.11\n );\n forward.renderOrder = 999;\n forward.frustumCulled = false;\n forward.line.material = new THREE.LineBasicMaterial({\n color: 0x38bdf8,\n depthTest: false,\n });\n (forward.cone.material as THREE.MeshBasicMaterial).depthTest = false;\n group.add(forward);\n\n const frustumGeometry = new THREE.BufferGeometry();\n frustumGeometry.setAttribute(\n 'position',\n new THREE.Float32BufferAttribute(new Float32Array(8 * 2 * 3), 3)\n );\n const frustum = new THREE.LineSegments(\n frustumGeometry,\n new THREE.LineBasicMaterial({\n color: 0x38bdf8,\n transparent: true,\n opacity: 0.8,\n depthTest: false,\n })\n );\n frustum.renderOrder = 999;\n frustum.frustumCulled = false;\n group.userData.frustum = frustum;\n group.add(frustum);\n\n const canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 64;\n const ctx = canvas.getContext('2d')!;\n ctx.fillStyle = '#38bdf8';\n ctx.font = 'bold 32px monospace';\n ctx.textAlign = 'center';\n ctx.fillText(getName(model, model.name_camadr[i]), 128, 42);\n const texture = new THREE.CanvasTexture(canvas);\n const sprite = new THREE.Sprite(\n new THREE.SpriteMaterial({\n map: texture,\n depthTest: false,\n transparent: true,\n })\n );\n sprite.position.set(0, 0.014, 0.01);\n sprite.scale.set(0.04, 0.01, 1);\n sprite.renderOrder = 999;\n group.userData.label = sprite;\n group.add(sprite);\n\n cameras.push(group);\n }\n }\n\n for (let i = 0; i < virtualCameras.length; i += 1) {\n virtualCameraObjects.push(createVirtualCameraDebugObject(virtualCameras[i], i));\n }\n\n // COM markers\n if (showCOM) {\n for (let i = 1; i < model.nbody; i++) {\n const geometry = new THREE.SphereGeometry(0.005, 6, 6);\n const mat = new THREE.MeshBasicMaterial({ color: 0xff0000 });\n const mesh = new THREE.Mesh(geometry, mat);\n mesh.userData.bodyId = i;\n comMarkers.push(mesh);\n }\n }\n\n return { geoms, sites, joints, cameras, virtualCameraObjects, comMarkers };\n }, [status, mjModelRef, showGeoms, showSites, showJoints, showCameras, virtualCameras, showCOM]);\n\n // Add/remove debug objects from scene\n useEffect(() => {\n const group = groupRef.current;\n if (!group || !debugGeometry) return;\n\n const allObjects = [\n ...debugGeometry.geoms,\n ...debugGeometry.sites,\n ...debugGeometry.joints,\n ...debugGeometry.cameras,\n ...debugGeometry.virtualCameraObjects,\n ...debugGeometry.comMarkers,\n ];\n for (const obj of allObjects) group.add(obj);\n\n return () => {\n for (const obj of allObjects) {\n group.remove(obj);\n if ((obj as THREE.Mesh).geometry) (obj as THREE.Mesh).geometry.dispose();\n }\n };\n }, [debugGeometry]);\n\n // Update positions every frame\n useFrame(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || !debugGeometry) return;\n\n // Safely grab optional arrays once\n const jntPos = (model as Record<string, unknown>).jnt_pos as Float64Array | undefined;\n const jntAxis = (model as Record<string, unknown>).jnt_axis as Float64Array | undefined;\n\n // Update geom wireframes\n for (const mesh of debugGeometry.geoms) {\n const bid = mesh.userData.bodyId;\n const i3 = bid * 3;\n const i4 = bid * 4;\n mesh.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n mesh.quaternion.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n // Apply local geom offset\n const gid = mesh.userData.geomId;\n const gp = model.geom_pos;\n _v3a.set(gp[3 * gid], gp[3 * gid + 1], gp[3 * gid + 2])\n .applyQuaternion(mesh.quaternion);\n mesh.position.add(_v3a);\n }\n\n // Update site markers\n for (const mesh of debugGeometry.sites) {\n const sid = mesh.userData.siteId;\n mesh.position.set(\n data.site_xpos[3 * sid],\n data.site_xpos[3 * sid + 1],\n data.site_xpos[3 * sid + 2],\n );\n }\n\n // Update joint axes\n for (const obj of debugGeometry.joints) {\n const arrow = obj as THREE.ArrowHelper;\n const jid = arrow.userData.jointId;\n const bid = arrow.userData.bodyId;\n const i3 = bid * 3;\n const i4 = bid * 4;\n\n _quat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n\n // Position: body origin + local joint anchor (if available)\n arrow.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n if (jntPos) {\n _v3a.set(jntPos[3 * jid], jntPos[3 * jid + 1], jntPos[3 * jid + 2])\n .applyQuaternion(_quat);\n arrow.position.add(_v3a);\n }\n\n // Orient along joint axis in world frame (if available)\n if (jntAxis) {\n _v3a.set(jntAxis[3 * jid], jntAxis[3 * jid + 1], jntAxis[3 * jid + 2])\n .applyQuaternion(_quat).normalize();\n arrow.setDirection(_v3a);\n }\n }\n\n const camXpos = data.cam_xpos;\n const camXmat = data.cam_xmat;\n if (camXpos && camXmat) {\n for (const group of debugGeometry.cameras) {\n const cameraId = group.userData.cameraId;\n const i3 = cameraId * 3;\n const i9 = cameraId * 9;\n group.position.set(\n camXpos[i3],\n camXpos[i3 + 1],\n camXpos[i3 + 2]\n );\n _cameraMatrix.set(\n camXmat[i9], camXmat[i9 + 1], camXmat[i9 + 2], 0,\n camXmat[i9 + 3], camXmat[i9 + 4], camXmat[i9 + 5], 0,\n camXmat[i9 + 6], camXmat[i9 + 7], camXmat[i9 + 8], 0,\n 0, 0, 0, 1\n );\n group.quaternion.setFromRotationMatrix(_cameraMatrix);\n\n const fovy = model.cam_fovy?.[cameraId] ?? 45;\n const halfHeight = Math.tan(THREE.MathUtils.degToRad(fovy) / 2) *\n CAMERA_DEBUG_FRUSTUM_DEPTH;\n const halfWidth = halfHeight * 4 / 3;\n const positions = group.userData.frustum.geometry.attributes.position;\n const array = positions.array as Float32Array;\n const points = [\n [0, 0, 0],\n [-halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [0, 0, 0],\n [halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [0, 0, 0],\n [halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [0, 0, 0],\n [-halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [-halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [-halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [-halfWidth, -halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n [-halfWidth, halfHeight, -CAMERA_DEBUG_FRUSTUM_DEPTH],\n ];\n for (let i = 0; i < points.length; i += 1) {\n array[i * 3] = points[i][0];\n array[i * 3 + 1] = points[i][1];\n array[i * 3 + 2] = points[i][2];\n }\n positions.needsUpdate = true;\n }\n }\n\n // Update COM markers\n for (const mesh of debugGeometry.comMarkers) {\n const bid = mesh.userData.bodyId;\n const i3 = bid * 3;\n mesh.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n }\n });\n\n // Contact force vectors — pre-created pool to avoid per-frame allocation\n const contactGroupRef = useRef<THREE.Group>(null);\n const contactPoolRef = useRef<THREE.ArrowHelper[]>([]);\n const contactPoolInitRef = useRef(false);\n\n // Initialize arrow pool once\n useEffect(() => {\n const group = contactGroupRef.current;\n if (!group || contactPoolInitRef.current) return;\n contactPoolInitRef.current = true;\n\n const pool: THREE.ArrowHelper[] = [];\n for (let i = 0; i < MAX_CONTACT_ARROWS; i++) {\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 1, 0), new THREE.Vector3(), 0.1, 0xff4444, 0.03, 0.015\n );\n arrow.visible = false;\n group.add(arrow);\n pool.push(arrow);\n }\n contactPoolRef.current = pool;\n\n return () => {\n for (const arrow of pool) {\n group.remove(arrow);\n arrow.dispose();\n }\n contactPoolRef.current = [];\n contactPoolInitRef.current = false;\n };\n }, [showContacts]);\n\n useFrame(() => {\n if (!showContacts) return;\n const data = mjDataRef.current;\n const pool = contactPoolRef.current;\n if (!data || pool.length === 0) return;\n\n const ncon = data.ncon;\n let arrowIdx = 0;\n\n withContacts(data, (contactArray) => {\n for (let i = 0; i < Math.min(ncon, MAX_CONTACT_ARROWS); i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n _contactPos.set(c.pos[0], c.pos[1], c.pos[2]);\n _contactNormal.set(c.frame[0], c.frame[1], c.frame[2]);\n const force = Math.abs(c.dist) * 100;\n const length = Math.min(force * 0.01, 0.1);\n if (length > 0.001 && arrowIdx < pool.length) {\n const arrow = pool[arrowIdx];\n arrow.position.copy(_contactPos);\n arrow.setDirection(_contactNormal);\n arrow.setLength(length, length * 0.3, length * 0.15);\n arrow.visible = true;\n arrowIdx++;\n }\n }\n });\n\n // Hide unused arrows\n for (let i = arrowIdx; i < pool.length; i++) {\n pool[i].visible = false;\n }\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group\n {...groupProps}\n userData={{\n ...groupProps.userData,\n [CAPTURE_EXCLUDE_KEY]: true,\n }}\n >\n <group ref={groupRef} />\n {showContacts && <group ref={contactGroupRef} />}\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TendonRenderer — render tendons as tube geometries (spec 6.4)\n *\n * WASM fields used: model.ntendon, model.ten_wrapadr, model.ten_wrapnum\n * data.wrap_xpos, data.ten_wrapadr (runtime)\n *\n * Note: ten_rgba and ten_width may not be available in all MuJoCo WASM builds.\n * Tendons use a default color and width.\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\nconst DEFAULT_TENDON_COLOR = new THREE.Color(0.3, 0.3, 0.8);\nconst DEFAULT_TENDON_WIDTH = 0.002;\n\n// Preallocated temp vector to avoid per-frame allocations\nconst _tmpVec = new THREE.Vector3();\n\nexport function TendonRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n const curvesRef = useRef<THREE.CatmullRomCurve3[]>([]);\n const materialRef = useRef<THREE.MeshStandardMaterial | null>(null);\n\n // Build tendon meshes once when model loads\n useEffect(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const group = groupRef.current;\n if (!model || !data || !group) return;\n\n const ntendon = model.ntendon ?? 0;\n if (ntendon === 0) return;\n\n // Shared material for all tendons\n const material = new THREE.MeshStandardMaterial({\n color: DEFAULT_TENDON_COLOR,\n roughness: 0.6,\n metalness: 0.1,\n });\n materialRef.current = material;\n\n const meshes: THREE.Mesh[] = [];\n const curves: THREE.CatmullRomCurve3[] = [];\n\n for (let t = 0; t < ntendon; t++) {\n const wrapNum = model.ten_wrapnum[t];\n if (wrapNum < 2) {\n meshes.push(null!);\n curves.push(null!);\n continue;\n }\n\n // Initial dummy points — will be overwritten in useFrame\n const points = Array.from({ length: wrapNum }, () => new THREE.Vector3());\n const curve = new THREE.CatmullRomCurve3(points, false);\n const segments = Math.max(wrapNum * 2, 4);\n const geometry = new THREE.TubeGeometry(curve, segments, DEFAULT_TENDON_WIDTH, 6, false);\n const mesh = new THREE.Mesh(geometry, material);\n mesh.frustumCulled = false;\n group.add(mesh);\n meshes.push(mesh);\n curves.push(curve);\n }\n\n meshesRef.current = meshes;\n curvesRef.current = curves;\n\n return () => {\n for (const mesh of meshes) {\n if (!mesh) continue;\n group.remove(mesh);\n mesh.geometry.dispose();\n }\n material.dispose();\n meshesRef.current = [];\n curvesRef.current = [];\n materialRef.current = null;\n };\n }, [status, mjModelRef, mjDataRef]);\n\n // Update curve control points and rebuild geometry each frame\n useFrame(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const ntendon = model.ntendon ?? 0;\n const meshes = meshesRef.current;\n const curves = curvesRef.current;\n\n for (let t = 0; t < ntendon; t++) {\n const mesh = meshes[t];\n const curve = curves[t];\n if (!mesh || !curve) continue;\n\n const wrapAdr = model.ten_wrapadr[t];\n const wrapNum = model.ten_wrapnum[t];\n\n // Update existing control points in-place\n let validCount = 0;\n for (let w = 0; w < wrapNum; w++) {\n const idx = (wrapAdr + w) * 3;\n if (data.wrap_xpos && idx + 2 < data.wrap_xpos.length) {\n const x = data.wrap_xpos[idx];\n const y = data.wrap_xpos[idx + 1];\n const z = data.wrap_xpos[idx + 2];\n if (x !== 0 || y !== 0 || z !== 0) {\n if (validCount < curve.points.length) {\n curve.points[validCount].set(x, y, z);\n }\n validCount++;\n }\n }\n }\n\n if (validCount < 2) {\n mesh.visible = false;\n continue;\n }\n\n // Trim or pad points array to match valid count\n if (curve.points.length !== validCount) {\n curve.points.length = validCount;\n while (curve.points.length < validCount) {\n curve.points.push(new THREE.Vector3());\n }\n }\n\n // Rebuild geometry from updated curve\n mesh.geometry.dispose();\n mesh.geometry = new THREE.TubeGeometry(\n curve, Math.max(validCount * 2, 4), DEFAULT_TENDON_WIDTH, 6, false\n );\n mesh.visible = true;\n }\n });\n\n if (status !== 'ready') return null;\n return <group {...props} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * FlexRenderer — render deformable flex bodies (spec 6.4)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\n/**\n * Renders MuJoCo flex (deformable) bodies as dynamic meshes.\n * Vertices are updated every frame from flexvert_xpos.\n */\nexport function FlexRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n\n // Build flex meshes once when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group || status !== 'ready') return;\n\n const nflex = model.nflex ?? 0;\n if (nflex === 0) return;\n\n for (let f = 0; f < nflex; f++) {\n const vertAdr = model.flex_vertadr[f];\n const vertNum = model.flex_vertnum[f];\n\n if (vertNum === 0) continue;\n\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(vertNum * 3);\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n // Note: flex_faceadr/flex_facenum/flex_face may not be available in all MuJoCo WASM builds.\n // Without face data we render as a point cloud. If future WASM versions expose\n // face arrays, index-based triangle rendering can be added here.\n\n geometry.computeVertexNormals();\n\n let color = new THREE.Color(0.5, 0.5, 0.5);\n if (model.flex_rgba) {\n color = new THREE.Color(\n model.flex_rgba[4 * f],\n model.flex_rgba[4 * f + 1],\n model.flex_rgba[4 * f + 2],\n );\n }\n\n const material = new THREE.MeshStandardMaterial({\n color,\n roughness: 0.7,\n side: THREE.DoubleSide,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.userData.flexId = f;\n mesh.userData.vertAdr = vertAdr;\n mesh.userData.vertNum = vertNum;\n group.add(mesh);\n meshesRef.current.push(mesh);\n }\n\n return () => {\n for (const mesh of meshesRef.current) {\n group.remove(mesh);\n mesh.geometry.dispose();\n (mesh.material as THREE.Material).dispose();\n }\n meshesRef.current = [];\n };\n }, [status, mjModelRef]);\n\n // Update vertex positions every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !data.flexvert_xpos) return;\n\n for (const mesh of meshesRef.current) {\n const vertAdr = mesh.userData.vertAdr;\n const vertNum = mesh.userData.vertNum;\n const posAttr = mesh.geometry.getAttribute('position') as THREE.BufferAttribute;\n if (!posAttr) continue;\n\n for (let v = 0; v < vertNum; v++) {\n const srcIdx = (vertAdr + v) * 3;\n posAttr.setXYZ(v, data.flexvert_xpos[srcIdx], data.flexvert_xpos[srcIdx + 1], data.flexvert_xpos[srcIdx + 2]);\n }\n posAttr.needsUpdate = true;\n mesh.geometry.computeVertexNormals();\n }\n });\n\n if (status !== 'ready') return null;\n return <group {...props} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { GeomBuilder } from '../rendering/GeomBuilder';\nimport type { GeomInfo, MujocoModel } from '../types';\n\nexport interface InstancedGeomRendererProps extends Omit<ThreeElements['group'], 'ref'> {\n /** Only render geoms from this MuJoCo geom group. */\n geomGroup?: number;\n /** Predicate for selecting geoms. */\n filter?: (geom: GeomInfo) => boolean;\n /** Optional material override for every instanced batch. */\n material?: THREE.Material;\n /** Hide or show the instanced batches. */\n visible?: boolean;\n castShadow?: boolean;\n receiveShadow?: boolean;\n}\n\ninterface GeomBatch {\n key: string;\n geomIds: number[];\n geometry: THREE.BufferGeometry;\n material: THREE.Material;\n}\n\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\nconst _matrix = new THREE.Matrix4();\n\nfunction getGeomInfo(model: MujocoModel, geomId: number): GeomInfo {\n const size = model.geom_size.subarray(geomId * 3, geomId * 3 + 3);\n const type = model.geom_type[geomId];\n return {\n id: geomId,\n name: getName(model, model.name_geomadr[geomId]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `type-${type}`,\n size: [size[0], size[1], size[2]],\n bodyId: model.geom_bodyid[geomId],\n };\n}\n\nfunction geomSignature(model: MujocoModel, geomId: number): string {\n const type = model.geom_type[geomId];\n const size = Array.from(model.geom_size.subarray(geomId * 3, geomId * 3 + 3)).join(',');\n const mat = model.geom_matid[geomId];\n const data = model.geom_dataid[geomId];\n const rgba = Array.from(model.geom_rgba.subarray(geomId * 4, geomId * 4 + 4)).join(',');\n return [type, size, mat, data, rgba].join('|');\n}\n\nfunction firstMesh(object: THREE.Object3D): THREE.Mesh | null {\n if (object instanceof THREE.Mesh) return object;\n let mesh: THREE.Mesh | null = null;\n object.traverse((child) => {\n if (!mesh && child instanceof THREE.Mesh) mesh = child;\n });\n return mesh;\n}\n\nexport function InstancedGeomRenderer({\n geomGroup,\n filter,\n material,\n visible = true,\n castShadow = true,\n receiveShadow = true,\n ...groupProps\n}: InstancedGeomRendererProps = {}) {\n const { mjModelRef, mjDataRef, mujocoRef, status } = useMujocoContext();\n const meshRefs = useRef<(THREE.InstancedMesh | null)[]>([]);\n\n const batches = useMemo<GeomBatch[]>(() => {\n if (status !== 'ready') return [];\n const model = mjModelRef.current;\n if (!model) return [];\n\n const builder = new GeomBuilder(mujocoRef.current);\n const grouped = new Map<string, number[]>();\n\n for (let geomId = 0; geomId < model.ngeom; geomId++) {\n if (model.geom_group[geomId] === 3) continue;\n if (geomGroup !== undefined && model.geom_group[geomId] !== geomGroup) continue;\n const info = getGeomInfo(model, geomId);\n if (filter && !filter(info)) continue;\n const key = geomSignature(model, geomId);\n const ids = grouped.get(key);\n if (ids) ids.push(geomId);\n else grouped.set(key, [geomId]);\n }\n\n const next: GeomBatch[] = [];\n for (const [key, geomIds] of grouped) {\n if (geomIds.length < 2) continue;\n const object = builder.create(model, geomIds[0]);\n if (!object) continue;\n const mesh = firstMesh(object);\n if (!mesh) continue;\n const sourceMaterial = Array.isArray(mesh.material) ? mesh.material[0] : mesh.material;\n next.push({\n key,\n geomIds,\n geometry: mesh.geometry.clone(),\n material: material ?? sourceMaterial.clone(),\n });\n }\n\n return next;\n }, [filter, geomGroup, material, mjModelRef, mujocoRef, status]);\n\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !visible) return;\n\n batches.forEach((batch, batchIndex) => {\n const mesh = meshRefs.current[batchIndex];\n if (!mesh) return;\n batch.geomIds.forEach((geomId, instanceId) => {\n const p = geomId * 3;\n const r = geomId * 9;\n _matrix.set(\n data.geom_xmat[r], data.geom_xmat[r + 1], data.geom_xmat[r + 2], data.geom_xpos[p],\n data.geom_xmat[r + 3], data.geom_xmat[r + 4], data.geom_xmat[r + 5], data.geom_xpos[p + 1],\n data.geom_xmat[r + 6], data.geom_xmat[r + 7], data.geom_xmat[r + 8], data.geom_xpos[p + 2],\n 0, 0, 0, 1\n );\n mesh.setMatrixAt(instanceId, _matrix);\n });\n mesh.count = batch.geomIds.length;\n mesh.instanceMatrix.needsUpdate = true;\n });\n });\n\n if (status !== 'ready' || batches.length === 0) return null;\n\n return (\n <group {...groupProps} visible={visible}>\n {batches.map((batch, index) => (\n <instancedMesh\n key={batch.key}\n ref={(mesh) => { meshRefs.current[index] = mesh; }}\n args={[batch.geometry, batch.material, batch.geomIds.length]}\n castShadow={castShadow}\n receiveShadow={receiveShadow}\n frustumCulled={false}\n />\n ))}\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useContacts — structured contact query hook (spec 2.4)\n * useContactEvents — contact enter/exit events (spec 2.5)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName, getName } from '../core/SceneLoader';\nimport { getContact, withContacts } from '../types';\nimport type { Bodies, ContactInfo, MujocoModel } from '../types';\n\n// Cache geom names per model to avoid cross-model id collisions.\nconst geomNameCacheByModel = new WeakMap<MujocoModel, Map<number, string>>();\n\nfunction getGeomNameCached(model: MujocoModel, geomId: number): string {\n let perModel = geomNameCacheByModel.get(model);\n if (!perModel) {\n perModel = new Map<number, string>();\n geomNameCacheByModel.set(model, perModel);\n }\n\n let name = perModel.get(geomId);\n if (name === undefined) {\n name = getName(model, model.name_geomadr[geomId]);\n perModel.set(geomId, name);\n }\n return name;\n}\n\n/**\n * Track contacts for a specific body (or all contacts if no body specified).\n * Calls the callback every physics frame with current contact list.\n * Reads `data.ncon` first to avoid allocating for zero contacts.\n */\nexport function useContacts(\n bodyName?: Bodies,\n callback?: (contacts: ContactInfo[]) => void,\n): React.RefObject<ContactInfo[]> {\n const { mjModelRef, status } = useMujocoContext();\n const contactsRef = useRef<ContactInfo[]>([]);\n const bodyIdRef = useRef(-1);\n const bodyResolvedRef = useRef(false);\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n if (!bodyName) {\n bodyIdRef.current = -1;\n bodyResolvedRef.current = true;\n return;\n }\n bodyResolvedRef.current = false;\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, bodyName);\n bodyResolvedRef.current = true;\n }, [bodyName, status, mjModelRef]);\n\n useAfterPhysicsStep(({ model, data }) => {\n // Resolve body id lazily once model exists, to avoid missing the first ready frame.\n if (bodyName && !bodyResolvedRef.current) {\n bodyIdRef.current = findBodyByName(model, bodyName);\n bodyResolvedRef.current = true;\n }\n\n const ncon = data.ncon;\n if (ncon === 0) {\n if (contactsRef.current.length > 0) contactsRef.current = [];\n callbackRef.current?.([]);\n return;\n }\n\n const contacts: ContactInfo[] = [];\n const filterBody = bodyIdRef.current;\n\n withContacts(data, (contactArray) => {\n for (let i = 0; i < ncon; i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n // Filter by body if specified\n if (filterBody >= 0) {\n const b1 = model.geom_bodyid[c.geom1];\n const b2 = model.geom_bodyid[c.geom2];\n if (b1 !== filterBody && b2 !== filterBody) continue;\n }\n contacts.push({\n geom1: c.geom1,\n geom1Name: getGeomNameCached(model, c.geom1),\n geom2: c.geom2,\n geom2Name: getGeomNameCached(model, c.geom2),\n pos: [c.pos[0], c.pos[1], c.pos[2]],\n depth: c.dist,\n });\n }\n });\n contactsRef.current = contacts;\n callbackRef.current?.(contacts);\n });\n\n return contactsRef;\n}\n\n/**\n * Contact enter/exit events for a specific body (spec 2.5).\n * Tracks which geom pairs are in contact frame-to-frame and fires\n * onEnter/onExit callbacks on transitions.\n */\nexport function useContactEvents(\n bodyName: Bodies,\n handlers: {\n onEnter?: (info: ContactInfo) => void;\n onExit?: (info: ContactInfo) => void;\n },\n) {\n const prevPairsRef = useRef(new Set<string>());\n const onEnterRef = useRef(handlers.onEnter);\n const onExitRef = useRef(handlers.onExit);\n onEnterRef.current = handlers.onEnter;\n onExitRef.current = handlers.onExit;\n\n const prevContactMapRef = useRef(new Map<string, ContactInfo>());\n\n const onContacts = useCallback((contacts: ContactInfo[]) => {\n const currentPairs = new Set<string>();\n const currentMap = new Map<string, ContactInfo>();\n\n for (const c of contacts) {\n const key = `${Math.min(c.geom1, c.geom2)}_${Math.max(c.geom1, c.geom2)}`;\n currentPairs.add(key);\n currentMap.set(key, c);\n }\n\n // New contacts (enter)\n for (const key of currentPairs) {\n if (!prevPairsRef.current.has(key)) {\n onEnterRef.current?.(currentMap.get(key)!);\n }\n }\n\n // Lost contacts (exit)\n for (const key of prevPairsRef.current) {\n if (!currentPairs.has(key)) {\n const prev = prevContactMapRef.current.get(key);\n if (prev) onExitRef.current?.(prev);\n }\n }\n\n prevPairsRef.current = currentPairs;\n prevContactMapRef.current = currentMap;\n }, []);\n\n useContacts(bodyName, onContacts);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * ContactListener — component form of contact events (spec 2.5)\n */\n\nimport { useContactEvents } from '../hooks/useContacts';\nimport type { ContactListenerProps } from '../types';\n\n/**\n * Component form of useContactEvents.\n * Fires onContactEnter/onContactExit callbacks when contacts change.\n */\nexport function ContactListener({\n body,\n onContactEnter,\n onContactExit,\n}: ContactListenerProps) {\n useContactEvents(body, {\n onEnter: onContactEnter,\n onExit: onContactExit,\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryPlayer — trajectory playback/scrubbing (spec 13.2)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport type { PlaybackState, TrajectoryStateChangeInput, TrajectoryFrame, TrajectoryInput } from '../types';\n\nexport interface TrajectoryPlayerOptions {\n fps?: number;\n speed?: number;\n loop?: boolean;\n mode?: 'kinematic' | 'physics';\n onComplete?: () => void;\n onStateChange?: (input: TrajectoryStateChangeInput) => void;\n}\n\n/** Check if input is TrajectoryFrame[] (vs number[][]) */\nfunction isTrajectoryFrames(input: TrajectoryInput): input is TrajectoryFrame[] {\n return input.length > 0 && typeof (input[0] as TrajectoryFrame).time === 'number'\n && 'qpos' in (input[0] as TrajectoryFrame);\n}\n\n/** Extract qpos as plain number array from a frame */\nfunction getQpos(input: TrajectoryInput, idx: number): ArrayLike<number> | null {\n const item = input[idx];\n if (!item) return null;\n if (Array.isArray(item)) return item;\n return (item as TrajectoryFrame).qpos;\n}\n\n/** Extract ctrl values from a TrajectoryFrame, if available */\nfunction getCtrl(input: TrajectoryInput, idx: number): ArrayLike<number> | null {\n const item = input[idx];\n if (!item || Array.isArray(item)) return null;\n return (item as TrajectoryFrame).ctrl ?? null;\n}\n\n/**\n * Play back a trajectory, overriding simulation state.\n *\n * Accepts either `TrajectoryFrame[]` (from useTrajectoryRecorder) or\n * `number[][]` (raw qpos arrays).\n *\n * In `kinematic` mode (default), the simulation is paused and qpos is\n * set directly each frame with mj_forward for rendering.\n *\n * In `physics` mode, the simulation keeps running and ctrl values from\n * the trajectory are applied each physics step via useBeforePhysicsStep.\n */\nexport function useTrajectoryPlayer(\n trajectory: TrajectoryInput,\n options: TrajectoryPlayerOptions = {},\n) {\n const { mjModelRef, mjDataRef, mujocoRef, pausedRef } = useMujocoContext();\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const stateRef = useRef<PlaybackState>('idle');\n const frameRef = useRef(0);\n const lastFrameTimeRef = useRef(0);\n const speedRef = useRef(options.speed ?? 1.0);\n const wasPausedRef = useRef(false);\n\n // Stable ref to trajectory to avoid stale closures in useBeforePhysicsStep\n const trajectoryRef = useRef(trajectory);\n trajectoryRef.current = trajectory;\n\n const setState = useCallback((next: PlaybackState) => {\n if (stateRef.current === next) return;\n stateRef.current = next;\n optionsRef.current.onStateChange?.({ state: next });\n }, []);\n\n const play = useCallback(() => {\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n const mode = optionsRef.current.mode ?? 'kinematic';\n\n if (stateRef.current === 'completed') {\n frameRef.current = 0;\n }\n\n if (mode === 'kinematic') {\n wasPausedRef.current = pausedRef.current;\n pausedRef.current = true;\n }\n\n lastFrameTimeRef.current = performance.now();\n setState('playing');\n }, [pausedRef, setState]);\n\n const pause = useCallback(() => {\n if (stateRef.current !== 'playing') return;\n setState('paused');\n }, [setState]);\n\n const seek = useCallback((frameIdx: number) => {\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n frameRef.current = Math.max(0, Math.min(frameIdx, traj.length - 1));\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = getQpos(traj, frameRef.current);\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n }, [mjModelRef, mjDataRef, mujocoRef]);\n\n const reset = useCallback(() => {\n const mode = optionsRef.current.mode ?? 'kinematic';\n if (mode === 'kinematic' && stateRef.current !== 'idle') {\n pausedRef.current = wasPausedRef.current;\n }\n frameRef.current = 0;\n setState('idle');\n }, [pausedRef, setState]);\n\n const setSpeed = useCallback((s: number) => {\n speedRef.current = s;\n }, []);\n\n const complete = useCallback(() => {\n const mode = optionsRef.current.mode ?? 'kinematic';\n if (mode === 'kinematic') {\n pausedRef.current = wasPausedRef.current;\n }\n setState('completed');\n optionsRef.current.onComplete?.();\n }, [pausedRef, setState]);\n\n // --- Kinematic mode: drive qpos directly from useFrame ---\n useFrame(() => {\n if (stateRef.current !== 'playing') return;\n if ((optionsRef.current.mode ?? 'kinematic') !== 'kinematic') return;\n\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n const now = performance.now();\n const fps = optionsRef.current.fps ?? 30;\n const frameInterval = 1000 / (fps * speedRef.current);\n const elapsed = now - lastFrameTimeRef.current;\n\n if (elapsed < frameInterval) return;\n lastFrameTimeRef.current = now;\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = getQpos(traj, frameRef.current);\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n\n frameRef.current++;\n if (frameRef.current >= traj.length) {\n if (optionsRef.current.loop) {\n frameRef.current = 0;\n } else {\n complete();\n }\n }\n });\n\n // --- Physics mode: set ctrl values each physics step ---\n useBeforePhysicsStep(({ model, data }) => {\n if (stateRef.current !== 'playing') return;\n if ((optionsRef.current.mode ?? 'kinematic') !== 'physics') return;\n\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n // Advance frame based on sim time vs trajectory time\n const fps = optionsRef.current.fps ?? 30;\n const targetFrame = Math.floor(data.time * fps * speedRef.current);\n frameRef.current = Math.min(targetFrame, traj.length - 1);\n\n // Apply ctrl from trajectory\n const ctrl = getCtrl(traj, frameRef.current);\n if (ctrl) {\n for (let i = 0; i < Math.min(ctrl.length, model.nu); i++) {\n data.ctrl[i] = ctrl[i];\n }\n }\n\n // Check completion\n if (frameRef.current >= traj.length - 1) {\n if (optionsRef.current.loop) {\n // Reset sim time to restart\n data.time = 0;\n frameRef.current = 0;\n } else {\n complete();\n }\n }\n });\n\n return {\n play,\n pause,\n seek,\n reset,\n setSpeed,\n get state() { return stateRef.current; },\n get frame() { return frameRef.current; },\n get playing() { return stateRef.current === 'playing'; },\n get totalFrames() { return trajectory.length; },\n get progress() { return trajectory.length > 1 ? frameRef.current / (trajectory.length - 1) : 0; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TrajectoryPlayer — component form of trajectory playback (spec 13.2)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useTrajectoryPlayer } from '../hooks/useTrajectoryPlayer';\nimport type { TrajectoryPlayerProps } from '../types';\n\n/**\n * Component wrapper for useTrajectoryPlayer.\n * Provides declarative trajectory playback controlled via props.\n */\nexport function TrajectoryPlayer({\n trajectory,\n fps = 30,\n speed = 1.0,\n loop = false,\n playing = false,\n mode = 'kinematic',\n onFrame,\n onComplete,\n onStateChange,\n}: TrajectoryPlayerProps) {\n const player = useTrajectoryPlayer(trajectory, {\n fps,\n speed,\n loop,\n mode,\n onComplete,\n onStateChange,\n });\n const onFrameRef = useRef(onFrame);\n onFrameRef.current = onFrame;\n const lastReportedFrameRef = useRef(-1);\n\n useEffect(() => {\n player.setSpeed(speed);\n }, [speed, player]);\n\n useEffect(() => {\n if (playing) {\n player.play();\n } else {\n player.pause();\n }\n }, [playing, player]);\n\n useFrame(() => {\n if (!onFrameRef.current) return;\n const currentFrame = player.frame;\n if (currentFrame !== lastReportedFrameRef.current && player.playing) {\n lastReportedFrameRef.current = currentFrame;\n onFrameRef.current({\n frameIndex: currentFrame,\n frame: trajectory[currentFrame],\n });\n }\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { ActuatorInfo } from '../types';\n\n/**\n * Returns a stable array of actuator metadata for building control UIs.\n * Computed once when the model loads. Consumer reads/writes data.ctrl[id] directly.\n */\nexport function useActuators(): ActuatorInfo[] {\n const { mjModelRef, status } = useMujocoContext();\n\n return useMemo(() => {\n if (status !== 'ready') return [];\n const model = mjModelRef.current;\n if (!model) return [];\n\n const actuators: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const name = getName(model, model.name_actuatoradr[i]);\n const lo = model.actuator_ctrlrange[i * 2];\n const hi = model.actuator_ctrlrange[i * 2 + 1];\n const hasRange = lo < hi;\n const range: [number, number] = hasRange\n ? [lo, hi]\n : [-Infinity, Infinity];\n actuators.push({ id: i, name, range });\n }\n return actuators;\n }, [status, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { Sites, SitePositionResult } from '../types';\n\n// Preallocated temp for rotation matrix extraction\nconst _mat4 = new THREE.Matrix4();\n\n/**\n * Returns reactive refs for a MuJoCo site's world position and orientation.\n * Refs are updated every frame without triggering React re-renders.\n */\nexport function useSitePosition(siteName: Sites): SitePositionResult {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const siteIdRef = useRef(-1);\n const positionRef = useRef(new THREE.Vector3());\n const quaternionRef = useRef(new THREE.Quaternion());\n\n // Resolve site ID when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n return;\n }\n siteIdRef.current = findSiteByName(model, siteName);\n }, [siteName, status, mjModelRef]);\n\n // Update refs every frame\n useFrame(() => {\n const data = mjDataRef.current;\n const sid = siteIdRef.current;\n if (!data || sid < 0) return;\n\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n positionRef.current.set(\n data.site_xpos[i3],\n data.site_xpos[i3 + 1],\n data.site_xpos[i3 + 2]\n );\n\n const m = data.site_xmat;\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n quaternionRef.current.setFromRotationMatrix(_mat4);\n });\n\n return { position: positionRef, quaternion: quaternionRef };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useBeforePhysicsStep } from '../core/MujocoSimProvider';\n\n/**\n * Applies gravity compensation each physics frame by adding qfrc_bias\n * (gravity + Coriolis forces) to qfrc_applied for each DOF.\n *\n * The provider zeros qfrc_applied at the start of each frame, so this\n * hook (and DragInteraction) compose correctly — both add to a clean slate.\n */\nexport function useGravityCompensation(enabled = true): void {\n useBeforePhysicsStep(({ model, data }) => {\n if (!enabled) return;\n for (let i = 0; i < model.nv; i++) {\n data.qfrc_applied[i] += data.qfrc_bias[i];\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSensor / useSensors — MuJoCo sensor access hooks (spec 2.1)\n */\n\nimport { useEffect, useRef, useMemo } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { Sensors, SensorHandle, SensorInfo } from '../types';\n\n/**\n * Access a single MuJoCo sensor by name. Returns a `SensorHandle` with\n * `read()`, `dim`, and `name`. The backing array is updated every physics\n * frame without causing React re-renders.\n */\nexport function useSensor(name: Sensors): SensorHandle {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const sensorIdRef = useRef(-1);\n const sensorAdrRef = useRef(0);\n const sensorDimRef = useRef(0);\n const valueRef = useRef<Float64Array>(new Float64Array(0));\n\n // Resolve sensor ID once model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n for (let i = 0; i < model.nsensor; i++) {\n if (getName(model, model.name_sensoradr[i]) === name) {\n sensorIdRef.current = i;\n sensorAdrRef.current = model.sensor_adr[i];\n sensorDimRef.current = model.sensor_dim[i];\n valueRef.current = new Float64Array(model.sensor_dim[i]);\n return;\n }\n }\n sensorIdRef.current = -1;\n }, [name, status, mjModelRef]);\n\n // Update every frame after physics step\n useAfterPhysicsStep(({ data }) => {\n if (sensorIdRef.current < 0) return;\n const adr = sensorAdrRef.current;\n const dim = sensorDimRef.current;\n for (let i = 0; i < dim; i++) {\n valueRef.current[i] = data.sensordata[adr + i];\n }\n });\n\n return useMemo<SensorHandle>(() => ({\n read() {\n return valueRef.current;\n },\n get dim() {\n return sensorDimRef.current;\n },\n name,\n }), [name]);\n}\n\n/**\n * Enumerate all sensors in the loaded MuJoCo model.\n * Returns a stable array recomputed only when the model changes.\n */\nexport function useSensors(): SensorInfo[] {\n const { mjModelRef, status } = useMujocoContext();\n\n return useMemo(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return [];\n const SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'jointpos', 9: 'jointvel', 10: 'tendonpos', 11: 'tendonvel',\n 12: 'actuatorpos', 13: 'actuatorvel', 14: 'actuatorfrc',\n };\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, [mjModelRef, status]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useJointState — per-joint position/velocity access (spec 2.3)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type {\n ArrayJointStateResult,\n Joints,\n JointStateOptions,\n JointStateResult,\n ScalarJointStateResult,\n} from '../types';\n\n/**\n * Track a MuJoCo joint's position and velocity by name.\n * Values are updated every physics frame via refs (no re-renders).\n *\n * For hinge/slide joints, position/velocity are scalar numbers.\n * For ball joints, position is quat (4), velocity is angular vel (3).\n * For free joints, position is pos+quat (7), velocity is lin+ang vel (6).\n */\nexport function useJointState(name: Joints, options: { kind: 'scalar' }): ScalarJointStateResult;\nexport function useJointState(name: Joints, options: { kind: 'array' }): ArrayJointStateResult;\nexport function useJointState(name: Joints, options?: JointStateOptions): JointStateResult;\nexport function useJointState(name: Joints, options: JointStateOptions = {}): JointStateResult {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const jointIdRef = useRef(-1);\n const qposAdrRef = useRef(0);\n const dofAdrRef = useRef(0);\n const qposDimRef = useRef(1);\n const dofDimRef = useRef(1);\n const kindRef = useRef(options.kind ?? 'auto');\n kindRef.current = options.kind ?? 'auto';\n const positionRef = useRef<number | Float64Array>(0);\n const velocityRef = useRef<number | Float64Array>(0);\n // Preallocated typed arrays for multi-DOF joints\n const posBufferRef = useRef<Float64Array | null>(null);\n const velBufferRef = useRef<Float64Array | null>(null);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n for (let i = 0; i < model.njnt; i++) {\n if (getName(model, model.name_jntadr[i]) === name) {\n jointIdRef.current = i;\n qposAdrRef.current = model.jnt_qposadr[i];\n dofAdrRef.current = model.jnt_dofadr[i];\n const type = model.jnt_type[i];\n // Type 0=free (7 qpos, 6 dof), 1=ball (4 qpos, 3 dof), 2=slide (1,1), 3=hinge (1,1)\n if (type === 0) { qposDimRef.current = 7; dofDimRef.current = 6; }\n else if (type === 1) { qposDimRef.current = 4; dofDimRef.current = 3; }\n else { qposDimRef.current = 1; dofDimRef.current = 1; }\n\n // Preallocate buffers when callers request array output, or for multi-DOF joints.\n if (kindRef.current === 'array' || qposDimRef.current > 1) {\n posBufferRef.current = new Float64Array(qposDimRef.current);\n velBufferRef.current = new Float64Array(dofDimRef.current);\n } else {\n posBufferRef.current = null;\n velBufferRef.current = null;\n }\n return;\n }\n }\n jointIdRef.current = -1;\n }, [name, options.kind, status, mjModelRef]);\n\n useAfterPhysicsStep(({ data }) => {\n if (jointIdRef.current < 0) return;\n const qa = qposAdrRef.current;\n const da = dofAdrRef.current;\n if (kindRef.current === 'scalar' || (kindRef.current === 'auto' && qposDimRef.current === 1)) {\n positionRef.current = data.qpos[qa];\n velocityRef.current = data.qvel[da];\n } else {\n const posBuf = posBufferRef.current!;\n const velBuf = velBufferRef.current!;\n posBuf.set(data.qpos.subarray(qa, qa + qposDimRef.current));\n velBuf.set(data.qvel.subarray(da, da + dofDimRef.current));\n positionRef.current = posBuf;\n velocityRef.current = velBuf;\n }\n });\n\n return { position: positionRef, velocity: velocityRef };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useBodyState — per-body position/velocity tracking (spec 2.2)\n */\n\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { Bodies, BodyStateResult } from '../types';\n\n/**\n * Track a MuJoCo body's world position, quaternion, and velocities.\n * All values are ref-based — updated every physics frame without re-renders.\n */\nexport function useBodyState(name: Bodies): BodyStateResult {\n const { mjModelRef, status } = useMujocoContext();\n const bodyIdRef = useRef(-1);\n const position = useRef(new THREE.Vector3());\n const quaternion = useRef(new THREE.Quaternion());\n const linearVelocity = useRef(new THREE.Vector3());\n const angularVelocity = useRef(new THREE.Vector3());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n bodyIdRef.current = findBodyByName(model, name);\n }, [name, status, mjModelRef]);\n\n useAfterPhysicsStep(({ data }) => {\n const bid = bodyIdRef.current;\n if (bid < 0) return;\n\n // Position from xpos (3 per body)\n const i3 = bid * 3;\n position.current.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n\n // Quaternion from xquat (4 per body, MuJoCo order: w,x,y,z)\n const i4 = bid * 4;\n quaternion.current.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n\n // Velocity from cvel (6 per body: [angular(3), linear(3)])\n if (data.cvel) {\n const i6 = bid * 6;\n angularVelocity.current.set(data.cvel[i6], data.cvel[i6 + 1], data.cvel[i6 + 2]);\n linearVelocity.current.set(data.cvel[i6 + 3], data.cvel[i6 + 4], data.cvel[i6 + 5]);\n }\n });\n\n return { position, quaternion, linearVelocity, angularVelocity };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Ref-based world pose hooks for named MuJoCo bodies, geoms, and sites.\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport * as THREE from 'three';\nimport { useAfterPhysicsStep, useMujocoContext } from '../core/MujocoSimProvider';\nimport { findBodyByName, findGeomByName, findSiteByName } from '../core/SceneLoader';\nimport type { Bodies, Geoms, Sites } from '../types';\n\nexport type PoseResourceKind = 'body' | 'geom' | 'site';\n\nexport interface PoseReadout {\n id: RefObject<number>;\n found: RefObject<boolean>;\n position: RefObject<THREE.Vector3>;\n quaternion: RefObject<THREE.Quaternion>;\n}\n\nconst _matrix = new THREE.Matrix4();\n\nfunction quaternionFromMatrixArray(\n target: THREE.Quaternion,\n values: ArrayLike<number>,\n offset: number\n) {\n _matrix.set(\n values[offset], values[offset + 1], values[offset + 2], 0,\n values[offset + 3], values[offset + 4], values[offset + 5], 0,\n values[offset + 6], values[offset + 7], values[offset + 8], 0,\n 0, 0, 0, 1\n );\n target.setFromRotationMatrix(_matrix);\n}\n\nfunction quaternionFromMujocoQuat(\n target: THREE.Quaternion,\n values: ArrayLike<number>,\n offset: number\n) {\n target.set(\n values[offset + 1] ?? 0,\n values[offset + 2] ?? 0,\n values[offset + 3] ?? 0,\n values[offset] ?? 1\n );\n}\n\nfunction useNamedPose(kind: PoseResourceKind, name: string): PoseReadout {\n const { mjModelRef, status } = useMujocoContext();\n const idRef = useRef(-1);\n const foundRef = useRef(false);\n const positionRef = useRef(new THREE.Vector3());\n const quaternionRef = useRef(new THREE.Quaternion());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n idRef.current = -1;\n foundRef.current = false;\n return;\n }\n\n if (kind === 'body') idRef.current = findBodyByName(model, name);\n else if (kind === 'geom') idRef.current = findGeomByName(model, name);\n else idRef.current = findSiteByName(model, name);\n foundRef.current = idRef.current >= 0;\n }, [kind, name, status, mjModelRef]);\n\n useAfterPhysicsStep(({ data }) => {\n const id = idRef.current;\n if (id < 0) return;\n\n if (kind === 'body') {\n const p = id * 3;\n positionRef.current.set(data.xpos[p], data.xpos[p + 1], data.xpos[p + 2]);\n if (data.xmat) {\n quaternionFromMatrixArray(quaternionRef.current, data.xmat, id * 9);\n } else {\n quaternionFromMujocoQuat(quaternionRef.current, data.xquat, id * 4);\n }\n return;\n }\n\n if (kind === 'geom') {\n const p = id * 3;\n positionRef.current.set(data.geom_xpos[p], data.geom_xpos[p + 1], data.geom_xpos[p + 2]);\n quaternionFromMatrixArray(quaternionRef.current, data.geom_xmat, id * 9);\n return;\n }\n\n const p = id * 3;\n positionRef.current.set(data.site_xpos[p], data.site_xpos[p + 1], data.site_xpos[p + 2]);\n quaternionFromMatrixArray(quaternionRef.current, data.site_xmat, id * 9);\n });\n\n return {\n id: idRef,\n found: foundRef,\n position: positionRef,\n quaternion: quaternionRef,\n };\n}\n\nexport function useBodyPose(name: Bodies): PoseReadout {\n return useNamedPose('body', name);\n}\n\nexport function useGeomPose(name: Geoms): PoseReadout {\n return useNamedPose('geom', name);\n}\n\nexport function useSitePose(name: Sites): PoseReadout {\n return useNamedPose('site', name);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useCtrl — handle-based read/write access to a named actuator's ctrl value (spec 3.1)\n */\n\nimport { useEffect, useRef, useMemo } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport type { Actuators, CtrlHandle } from '../types';\n\n/**\n * Access a single actuator's control value by name.\n *\n * Returns a `CtrlHandle` with `read()` and `write()` methods that\n * operate directly on `data.ctrl` without causing React re-renders.\n */\nexport function useCtrl(name: Actuators): CtrlHandle {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const actuatorIdRef = useRef(-1);\n const rangeRef = useRef<[number, number]>([0, 0]);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n const id = findActuatorByName(model, name);\n actuatorIdRef.current = id;\n if (id >= 0) {\n rangeRef.current = [\n model.actuator_ctrlrange[id * 2],\n model.actuator_ctrlrange[id * 2 + 1],\n ];\n }\n }, [name, status, mjModelRef]);\n\n return useMemo<CtrlHandle>(() => ({\n read() {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return 0;\n return data.ctrl[actuatorIdRef.current];\n },\n write(value: number) {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return;\n data.ctrl[actuatorIdRef.current] = value;\n },\n name,\n get range(): [number, number] {\n return rangeRef.current;\n },\n }), [name, mjDataRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Cooperative actuator/control ownership for policies, IK, teleop, and replay.\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport type { ControlGroupInfo, ControlGroupSelector, MujocoData, MujocoModel } from '../types';\n\nexport interface ControlWriterConflict {\n actuatorIndex: number;\n owner: string;\n requestedBy: string;\n}\n\nexport interface ControlWriterOptions {\n owner: string;\n selector?: ControlGroupSelector;\n enabled?: boolean;\n warnOnConflict?: boolean;\n allowSameOwner?: boolean;\n onConflict?: (conflicts: ControlWriterConflict[]) => void;\n}\n\nexport interface ControlWriterWriteOptions {\n force?: boolean;\n}\n\nexport interface ControlWriterHandle {\n owner: string;\n group: RefObject<ControlGroupInfo | null>;\n conflicts: RefObject<ControlWriterConflict[]>;\n canWrite: () => boolean;\n read: () => Float64Array;\n write: (values: ArrayLike<number>, options?: ControlWriterWriteOptions) => boolean;\n release: () => void;\n}\n\ninterface ControlWriterClaim {\n owner: string;\n token: symbol;\n}\n\nconst claimsByModel = new WeakMap<MujocoModel, Map<number, ControlWriterClaim>>();\n\nfunction getClaims(model: MujocoModel) {\n let claims = claimsByModel.get(model);\n if (!claims) {\n claims = new Map();\n claimsByModel.set(model, claims);\n }\n return claims;\n}\n\nfunction releaseClaims(model: MujocoModel | null, token: symbol) {\n if (!model) return;\n const claims = claimsByModel.get(model);\n if (!claims) return;\n for (const [actuatorIndex, claim] of claims) {\n if (claim.token === token) claims.delete(actuatorIndex);\n }\n}\n\nexport function useControlWriter(options: ControlWriterOptions): ControlWriterHandle {\n const {\n owner,\n selector,\n enabled = true,\n warnOnConflict = true,\n allowSameOwner = true,\n onConflict,\n } = options;\n const { api, mjModelRef, mjDataRef, status } = useMujocoContext();\n const tokenRef = useRef(Symbol(owner));\n const claimedModelRef = useRef<MujocoModel | null>(null);\n const groupRef = useRef<ControlGroupInfo | null>(null);\n const conflictsRef = useRef<ControlWriterConflict[]>([]);\n const onConflictRef = useRef(onConflict);\n onConflictRef.current = onConflict;\n\n const release = useCallback(() => {\n releaseClaims(claimedModelRef.current, tokenRef.current);\n claimedModelRef.current = null;\n conflictsRef.current = [];\n }, []);\n\n useEffect(() => {\n release();\n if (!enabled || status !== 'ready') {\n groupRef.current = null;\n return;\n }\n\n const model = mjModelRef.current;\n if (!model) {\n groupRef.current = null;\n return;\n }\n\n const group = selector ? api.resolveControlGroup(selector) : api.getControlMap();\n groupRef.current = group;\n if (!group) return;\n\n const claims = getClaims(model);\n const conflicts: ControlWriterConflict[] = [];\n for (const actuatorIndex of group.ctrlAdr) {\n const existing = claims.get(actuatorIndex);\n if (\n existing &&\n existing.token !== tokenRef.current &&\n (!allowSameOwner || existing.owner !== owner)\n ) {\n conflicts.push({\n actuatorIndex,\n owner: existing.owner,\n requestedBy: owner,\n });\n }\n }\n\n conflictsRef.current = conflicts;\n if (conflicts.length > 0) {\n onConflictRef.current?.(conflicts);\n if (warnOnConflict) {\n console.warn(\n `[mujoco-react] Control writer \"${owner}\" conflicts with existing writer(s): ${conflicts\n .map((conflict) => `${conflict.actuatorIndex}:${conflict.owner}`)\n .join(', ')}`\n );\n }\n return;\n }\n\n for (const actuatorIndex of group.ctrlAdr) {\n claims.set(actuatorIndex, { owner, token: tokenRef.current });\n }\n claimedModelRef.current = model;\n\n return release;\n }, [allowSameOwner, api, enabled, mjModelRef, owner, release, selector, status, warnOnConflict]);\n\n const canWrite = useCallback(() => (\n enabled &&\n groupRef.current !== null &&\n conflictsRef.current.length === 0\n ), [enabled]);\n\n const read = useCallback(() => {\n const data = mjDataRef.current;\n const group = groupRef.current;\n if (!data || !group) return new Float64Array(0);\n return group.readCtrl(data);\n }, [mjDataRef]);\n\n const write = useCallback((values: ArrayLike<number>, writeOptions: ControlWriterWriteOptions = {}) => {\n const data: MujocoData | null = mjDataRef.current;\n const group = groupRef.current;\n if (!data || !group) return false;\n if (!writeOptions.force && !canWrite()) return false;\n group.writeCtrl(data, values);\n return true;\n }, [canWrite, mjDataRef]);\n\n return useMemo(() => ({\n owner,\n group: groupRef,\n conflicts: conflictsRef,\n canWrite,\n read,\n write,\n release,\n }), [canWrite, owner, read, release, write]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Typed, named control groups. Define the group once (like a zod schema or a\n * tanstack route), then read/set actuators by name with inferred keys — no\n * positional arrays, no `as const`, no owner bookkeeping.\n */\n\nimport { useCallback, useEffect, useId, useMemo, useRef } from 'react';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { useControlWriter, type ControlWriterOptions } from './useControlWriter';\nimport type { Actuators } from '../types';\n\ntype StringKeyOf<T> = Extract<keyof T, string>;\ntype ControlDefinitionMap = Record<string, Actuators>;\ntype ControlValues<K extends string> = Partial<Record<K, number>>;\n\nfunction objectKeys<T extends object>(value: T): StringKeyOf<T>[] {\n return Object.keys(value) as StringKeyOf<T>[];\n}\n\nfunction singleControlValue<K extends string>(name: K, value: number): ControlValues<K> {\n const values: ControlValues<K> = {};\n values[name] = value;\n return values;\n}\n\n/**\n * A typed description of a set of actuators, keyed by name. Create it once with\n * {@link controlGroup} and reuse it across controllers and scripts; the key\n * union flows through to {@link useControlGroup}.\n */\nexport interface ControlGroup<K extends Actuators = Actuators> {\n readonly keys: readonly K[];\n}\n\n/**\n * Declare a named control group. With the Vite plugin / codegen active, names\n * are constrained to the model's registered actuators (a wrong or stale name is\n * a compile error). Without it, the literal names you pass are still inferred —\n * no `as const` required (the `const` type parameter captures them).\n */\nexport function controlGroup<const T extends readonly Actuators[]>(\n names: T\n): ControlGroup<T[number]> {\n return { keys: names };\n}\n\nexport interface DefinedControls<TControls extends ControlDefinitionMap = ControlDefinitionMap> {\n readonly controls: TControls;\n readonly aliases: readonly StringKeyOf<TControls>[];\n readonly keys: readonly TControls[StringKeyOf<TControls>][];\n}\n\nexport function defineControls<const TControls extends ControlDefinitionMap>(\n controls: TControls\n): DefinedControls<TControls> {\n const aliases = objectKeys(controls);\n return {\n controls,\n aliases,\n keys: aliases.map((alias) => controls[alias]),\n };\n}\n\nexport interface ControlGroupSetOptions {\n /** Write even when another control writer owns one of these actuators. */\n force?: boolean;\n}\n\nexport interface ControlGroupHandle<K extends string> {\n /** The cooperative-ownership identity used for conflict detection. */\n owner: string;\n /** Set a single actuator by name. Returns false if blocked by a conflict. */\n set(name: K, value: number, options?: ControlGroupSetOptions): boolean;\n /** Set one or more actuators by name. Returns false if blocked by a conflict. */\n patch(values: ControlValues<K>, options?: ControlGroupSetOptions): boolean;\n /** Write values in the same order as the declared control group. */\n write(values: ArrayLike<number>, options?: ControlGroupSetOptions): boolean;\n /** Read one actuator value by name. */\n get(name: K): number;\n /** Read the current control value of every actuator in the group, by name. */\n read(): Record<K, number>;\n /** Whether this group can currently write (no unresolved conflicts). */\n canWrite(): boolean;\n /** Release this group's actuator ownership. */\n release(): void;\n}\n\nexport type UseControlGroupOptions = Omit<ControlWriterOptions, 'owner' | 'selector'> & {\n /** Human-readable conflict label. */\n label?: string;\n /** Override the generated conflict owner id. Prefer `label` for normal use. */\n owner?: string;\n};\n\nexport interface ControlsHandle<TControls extends ControlDefinitionMap> {\n /** The cooperative-ownership identity used for conflict detection. */\n owner: string;\n /** Set one alias by name. Returns false if blocked by a conflict. */\n set(name: StringKeyOf<TControls>, value: number, options?: ControlGroupSetOptions): boolean;\n /** Set one or more aliases by name. Returns false if blocked by a conflict. */\n patch(values: ControlValues<StringKeyOf<TControls>>, options?: ControlGroupSetOptions): boolean;\n /** Write values in the same order as the `defineControls()` object. */\n write(values: ArrayLike<number>, options?: ControlGroupSetOptions): boolean;\n /** Read one alias value by name. */\n get(name: StringKeyOf<TControls>): number;\n /** Read every alias value. */\n read(): Record<StringKeyOf<TControls>, number>;\n /** Whether this group can currently write (no unresolved conflicts). */\n canWrite(): boolean;\n /** Release this group's actuator ownership. */\n release(): void;\n}\n\nexport function useControlGroup<K extends Actuators>(\n group: ControlGroup<K>,\n options: UseControlGroupOptions = {}\n): ControlGroupHandle<K> {\n const generatedOwner = useId();\n const owner = options.owner ?? options.label ?? `control-group:${generatedOwner}`;\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n\n const names = group.keys;\n const namesRef = useRef(names);\n namesRef.current = names;\n const namesKey = names.join('\\u0000');\n\n // Cooperative ownership / conflict detection via the existing writer.\n const selector = useMemo(\n () => ({ actuators: names }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [namesKey]\n );\n const { canWrite, release } = useControlWriter({ ...options, owner, selector });\n\n // Direct name -> actuator index map: absolute and joint-topology independent,\n // so coupled actuators (e.g. a tendon gripper) still resolve by name.\n const indicesRef = useRef<number[]>([]);\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n indicesRef.current = [];\n return;\n }\n indicesRef.current = namesRef.current.map((name) => {\n const id = findActuatorByName(model, name);\n if (id < 0) {\n console.warn(`[mujoco-react] useControlGroup: actuator \"${name}\" was not found.`);\n }\n return id;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mjModelRef, status, namesKey]);\n\n const patch = useCallback(\n (values: ControlValues<K>, setOptions: ControlGroupSetOptions = {}) => {\n const data = mjDataRef.current;\n if (!data) return false;\n if (!setOptions.force && !canWrite()) return false;\n const groupNames = namesRef.current;\n const indices = indicesRef.current;\n for (const [i, name] of groupNames.entries()) {\n const value = values[name];\n if (value === undefined) continue;\n const adr = indices[i];\n if (adr >= 0) data.ctrl[adr] = value;\n }\n return true;\n },\n [canWrite, mjDataRef]\n );\n\n const write = useCallback(\n (values: ArrayLike<number>, setOptions: ControlGroupSetOptions = {}) => {\n const data = mjDataRef.current;\n if (!data) return false;\n if (!setOptions.force && !canWrite()) return false;\n const groupNames = namesRef.current;\n const indices = indicesRef.current;\n for (let i = 0; i < Math.min(groupNames.length, values.length); i += 1) {\n const adr = indices[i];\n if (adr >= 0) data.ctrl[adr] = values[i];\n }\n return true;\n },\n [canWrite, mjDataRef]\n );\n\n const set = useCallback(\n (name: K, value: number, setOptions?: ControlGroupSetOptions) => (\n patch(singleControlValue(name, value), setOptions)\n ),\n [patch]\n );\n\n const read = useCallback((): Record<K, number> => {\n const data = mjDataRef.current;\n const groupNames = namesRef.current;\n const indices = indicesRef.current;\n const result = {} as Record<K, number>;\n for (const [i, name] of groupNames.entries()) {\n const adr = indices[i];\n result[name] = data && adr >= 0 ? data.ctrl[adr] ?? 0 : 0;\n }\n return result;\n }, [mjDataRef]);\n\n const get = useCallback((name: K) => read()[name], [read]);\n\n return useMemo(\n () => ({ owner, set, patch, write, get, read, canWrite, release }),\n [owner, set, patch, write, get, read, canWrite, release]\n );\n}\n\nexport function useControls<TControls extends ControlDefinitionMap>(\n definition: DefinedControls<TControls>,\n options: UseControlGroupOptions = {}\n): ControlsHandle<TControls> {\n const group = useControlGroup(controlGroup(definition.keys), options);\n const controlsRef = useRef(definition.controls);\n const aliasesRef = useRef(definition.aliases);\n controlsRef.current = definition.controls;\n aliasesRef.current = definition.aliases;\n\n const set = useCallback(\n (name: StringKeyOf<TControls>, value: number, setOptions?: ControlGroupSetOptions) => (\n group.set(controlsRef.current[name], value, setOptions)\n ),\n [group]\n );\n\n const patch = useCallback(\n (values: ControlValues<StringKeyOf<TControls>>, setOptions?: ControlGroupSetOptions) => {\n const next: ControlValues<Actuators> = {};\n for (const alias of aliasesRef.current) {\n const value = values[alias];\n if (value !== undefined) next[controlsRef.current[alias]] = value;\n }\n return group.patch(next, setOptions);\n },\n [group]\n );\n\n const get = useCallback(\n (name: StringKeyOf<TControls>) => group.get(controlsRef.current[name]),\n [group]\n );\n\n const read = useCallback((): Record<StringKeyOf<TControls>, number> => {\n const values = group.read();\n const result = {} as Record<StringKeyOf<TControls>, number>;\n for (const alias of aliasesRef.current) {\n result[alias] = values[controlsRef.current[alias]] ?? 0;\n }\n return result;\n }, [group]);\n\n return useMemo(\n () => ({\n owner: group.owner,\n set,\n patch,\n write: group.write,\n get,\n read,\n canWrite: group.canWrite,\n release: group.release,\n }),\n [group, set, patch, get, read]\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Bounded contact history for rollout verification and debugging.\n */\n\nimport { useCallback, useRef } from 'react';\nimport type { RefObject } from 'react';\nimport { useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { getContact, withContacts } from '../types';\nimport type { ContactInfo, MujocoModel } from '../types';\n\nexport interface ContactHistoryEntry extends ContactInfo {\n time: number;\n body1: number;\n body1Name: string;\n body2: number;\n body2Name: string;\n}\n\nexport interface ContactHistoryOptions {\n maxLength?: number;\n bodyNames?: readonly string[];\n geomNames?: readonly string[];\n includeWorldBody?: boolean;\n}\n\nexport interface ContactHistoryHandle {\n entries: RefObject<ContactHistoryEntry[]>;\n clear: () => void;\n countPair: (nameA: string, nameB: string) => number;\n}\n\nconst geomNameCacheByModel = new WeakMap<MujocoModel, Map<number, string>>();\nconst bodyNameCacheByModel = new WeakMap<MujocoModel, Map<number, string>>();\n\nfunction getCachedName(\n cacheByModel: WeakMap<MujocoModel, Map<number, string>>,\n model: MujocoModel,\n id: number,\n address: number\n) {\n if (id < 0) return '';\n let cache = cacheByModel.get(model);\n if (!cache) {\n cache = new Map();\n cacheByModel.set(model, cache);\n }\n let name = cache.get(id);\n if (name === undefined) {\n name = getName(model, address);\n cache.set(id, name);\n }\n return name;\n}\n\nfunction matchesFilter(\n entry: ContactHistoryEntry,\n bodyNames: readonly string[] | undefined,\n geomNames: readonly string[] | undefined,\n includeWorldBody: boolean\n) {\n if (!includeWorldBody && (entry.body1 === 0 || entry.body2 === 0)) return false;\n if (\n bodyNames &&\n !bodyNames.includes(entry.body1Name) &&\n !bodyNames.includes(entry.body2Name)\n ) {\n return false;\n }\n if (\n geomNames &&\n !geomNames.includes(entry.geom1Name) &&\n !geomNames.includes(entry.geom2Name)\n ) {\n return false;\n }\n return true;\n}\n\nexport function useContactHistory(options: ContactHistoryOptions = {}): ContactHistoryHandle {\n const entriesRef = useRef<ContactHistoryEntry[]>([]);\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const clear = useCallback(() => {\n entriesRef.current = [];\n }, []);\n\n const countPair = useCallback((nameA: string, nameB: string) => {\n let count = 0;\n for (const entry of entriesRef.current) {\n const matchesBodies =\n (entry.body1Name === nameA && entry.body2Name === nameB) ||\n (entry.body1Name === nameB && entry.body2Name === nameA);\n const matchesGeoms =\n (entry.geom1Name === nameA && entry.geom2Name === nameB) ||\n (entry.geom1Name === nameB && entry.geom2Name === nameA);\n if (matchesBodies || matchesGeoms) count += 1;\n }\n return count;\n }, []);\n\n useAfterPhysicsStep(({ model, data }) => {\n if ((data.ncon ?? 0) <= 0) return;\n\n const {\n maxLength = 2000,\n bodyNames,\n geomNames,\n includeWorldBody = false,\n } = optionsRef.current;\n if (maxLength <= 0) return;\n\n const nextEntries: ContactHistoryEntry[] = [];\n withContacts(data, (contacts) => {\n for (let index = 0; index < data.ncon; index += 1) {\n const contact = getContact(contacts, index);\n if (!contact) break;\n const body1 = model.geom_bodyid[contact.geom1] ?? -1;\n const body2 = model.geom_bodyid[contact.geom2] ?? -1;\n const entry: ContactHistoryEntry = {\n geom1: contact.geom1,\n geom2: contact.geom2,\n geom1Name: getCachedName(geomNameCacheByModel, model, contact.geom1, model.name_geomadr[contact.geom1]),\n geom2Name: getCachedName(geomNameCacheByModel, model, contact.geom2, model.name_geomadr[contact.geom2]),\n body1,\n body2,\n body1Name: body1 >= 0 ? getCachedName(bodyNameCacheByModel, model, body1, model.name_bodyadr[body1]) : '',\n body2Name: body2 >= 0 ? getCachedName(bodyNameCacheByModel, model, body2, model.name_bodyadr[body2]) : '',\n pos: [contact.pos[0], contact.pos[1], contact.pos[2]],\n depth: contact.dist,\n time: data.time,\n };\n if (matchesFilter(entry, bodyNames, geomNames, includeWorldBody)) {\n nextEntries.push(entry);\n }\n }\n });\n\n if (nextEntries.length === 0) return;\n entriesRef.current.push(...nextEntries);\n if (entriesRef.current.length > maxLength) {\n entriesRef.current.splice(0, entriesRef.current.length - maxLength);\n }\n });\n\n return {\n entries: entriesRef,\n clear,\n countPair,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useKeyboardTeleop — keyboard teleoperation hook (spec 12.1)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport type { KeyboardTeleopConfig } from '../types';\n\n/**\n * Map keyboard keys to actuator commands.\n *\n * Supports three binding modes:\n * - `delta`: Add delta to actuator value while key is held\n * - `toggle`: Toggle between two values on key press\n * - `set`: Set actuator to a fixed value while key is held\n */\nexport function useKeyboardTeleop(config: KeyboardTeleopConfig) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const pressedRef = useRef(new Set<string>());\n const toggleStateRef = useRef(new Map<string, boolean>());\n const enabledRef = useRef(config.enabled ?? true);\n enabledRef.current = config.enabled ?? true;\n\n // Resolve actuator IDs\n const bindingsRef = useRef(config.bindings);\n bindingsRef.current = config.bindings;\n\n // Actuator ID cache\n const actuatorCacheRef = useRef(new Map<string, number>());\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n const cache = new Map<string, number>();\n for (const binding of Object.values(config.bindings)) {\n if (!cache.has(binding.actuator)) {\n cache.set(binding.actuator, findActuatorByName(model, binding.actuator));\n }\n }\n actuatorCacheRef.current = cache;\n }, [config.bindings, status, mjModelRef]);\n\n // Key event listeners\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (!enabledRef.current) return;\n const key = e.key.toLowerCase();\n if (bindingsRef.current[key]) {\n pressedRef.current.add(key);\n // Handle toggle on keydown\n const binding = bindingsRef.current[key];\n if (binding.toggle) {\n const current = toggleStateRef.current.get(key) ?? false;\n toggleStateRef.current.set(key, !current);\n }\n }\n };\n const onKeyUp = (e: KeyboardEvent) => {\n pressedRef.current.delete(e.key.toLowerCase());\n };\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('keyup', onKeyUp);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('keyup', onKeyUp);\n };\n }, []);\n\n // Apply bindings each physics frame\n useBeforePhysicsStep(({ data }) => {\n if (!enabledRef.current) return;\n const bindings = bindingsRef.current;\n const cache = actuatorCacheRef.current;\n\n for (const [key, binding] of Object.entries(bindings)) {\n const actId = cache.get(binding.actuator);\n if (actId === undefined || actId < 0) continue;\n\n if (binding.toggle) {\n // Toggle mode: set value based on toggle state\n const state = toggleStateRef.current.get(key) ?? false;\n data.ctrl[actId] = state ? binding.toggle[1] : binding.toggle[0];\n } else if (pressedRef.current.has(key)) {\n if (binding.delta !== undefined) {\n // Delta mode: add delta while held\n data.ctrl[actId] += binding.delta;\n } else if (binding.set !== undefined) {\n // Set mode: set fixed value while held\n data.ctrl[actId] = binding.set;\n }\n }\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport { useEffect, useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport type { KeyboardIkTargetAction, KeyboardIkTargetBinding, KeyboardIkTargetConfig } from '../types';\n\nconst DEFAULT_TRANSLATE_SPEED = 0.25;\nconst DEFAULT_ROTATE_SPEED = 1.0;\n\nconst _translation = new THREE.Vector3();\nconst _axis = new THREE.Vector3();\nconst _quat = new THREE.Quaternion();\n\nfunction actionSign(action: KeyboardIkTargetAction): 1 | -1 {\n return action.endsWith('+') ? 1 : -1;\n}\n\nfunction actionBase(action: KeyboardIkTargetAction) {\n return action.slice(0, -1);\n}\n\nfunction applyRotation(\n target: THREE.Object3D,\n action: KeyboardIkTargetAction,\n amount: number,\n frame: 'world' | 'target',\n) {\n const base = actionBase(action);\n if (base === 'pitch') {\n _axis.set(1, 0, 0);\n } else if (base === 'yaw') {\n _axis.set(0, 1, 0);\n } else if (base === 'roll') {\n _axis.set(0, 0, 1);\n } else {\n return;\n }\n\n _quat.setFromAxisAngle(_axis, amount);\n if (frame === 'target') {\n target.quaternion.multiply(_quat);\n } else {\n target.quaternion.premultiply(_quat);\n }\n}\n\nfunction addTranslation(action: KeyboardIkTargetAction, amount: number) {\n switch (action) {\n case 'x+':\n _translation.x += amount;\n break;\n case 'x-':\n _translation.x -= amount;\n break;\n case 'y+':\n _translation.y += amount;\n break;\n case 'y-':\n _translation.y -= amount;\n break;\n case 'z+':\n _translation.z += amount;\n break;\n case 'z-':\n _translation.z -= amount;\n break;\n }\n}\n\n/**\n * Moves an existing IK target from keyboard input.\n *\n * This hook is intentionally robot-agnostic: it only edits the target owned by\n * `useIkController`, then lets the normal IK solver write robot controls.\n */\nexport function useKeyboardIkTarget(config: KeyboardIkTargetConfig | null) {\n const pressedRef = useRef(new Set<string>());\n const wasActiveRef = useRef(false);\n const configRef = useRef(config);\n configRef.current = config;\n\n const boundCodes = useMemo(() => {\n return new Set((config?.bindings ?? []).map((binding) => binding.code));\n }, [config?.bindings]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n const current = configRef.current;\n if (!current || current.enabled === false || !boundCodes.has(event.code)) return;\n if (current.preventDefault !== false) event.preventDefault();\n pressedRef.current.add(event.code);\n };\n const onKeyUp = (event: KeyboardEvent) => {\n const current = configRef.current;\n if (boundCodes.has(event.code) && current?.preventDefault !== false) {\n event.preventDefault();\n }\n pressedRef.current.delete(event.code);\n };\n const onBlur = () => {\n pressedRef.current.clear();\n wasActiveRef.current = false;\n };\n\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('keyup', onKeyUp);\n window.addEventListener('blur', onBlur);\n\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('keyup', onKeyUp);\n window.removeEventListener('blur', onBlur);\n };\n }, [boundCodes]);\n\n useFrame((_state, delta) => {\n const current = configRef.current;\n const controller = current?.controller;\n if (!current || current.enabled === false || !controller) {\n wasActiveRef.current = false;\n return;\n }\n\n const activeBindings: KeyboardIkTargetBinding[] = [];\n for (const binding of current.bindings) {\n if (pressedRef.current.has(binding.code)) activeBindings.push(binding);\n }\n\n if (activeBindings.length === 0) {\n wasActiveRef.current = false;\n return;\n }\n\n if (!wasActiveRef.current) {\n if (current.syncOnStart !== false) controller.syncTargetToSite();\n if (current.autoEnableIk !== false && !controller.ikEnabledRef.current) {\n controller.setIkEnabled(true);\n }\n }\n wasActiveRef.current = true;\n\n const target = controller.ikTargetRef.current;\n if (!target) return;\n\n const frame = current.frame ?? 'world';\n _translation.set(0, 0, 0);\n\n for (const binding of activeBindings) {\n const translateSpeed = binding.translateSpeed ?? current.translateSpeed ?? DEFAULT_TRANSLATE_SPEED;\n const rotateSpeed = binding.rotateSpeed ?? current.rotateSpeed ?? DEFAULT_ROTATE_SPEED;\n const amount = actionSign(binding.action) * delta;\n const base = actionBase(binding.action);\n\n if (base === 'x' || base === 'y' || base === 'z') {\n addTranslation(binding.action, translateSpeed * delta);\n } else {\n applyRotation(target, binding.action, rotateSpeed * amount, frame);\n }\n }\n\n if (_translation.lengthSq() > 0) {\n if (frame === 'target') _translation.applyQuaternion(target.quaternion);\n target.position.add(_translation);\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * usePolicy — policy decimation loop hook (spec 10.1)\n */\n\nimport { useCallback, useMemo, useRef } from 'react';\nimport { useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport type { PolicyAPI, PolicyConfig, PolicyInferenceOutput, PolicyVector } from '../types';\n\ntype PendingPolicyAction = {\n action: PolicyVector;\n observation: PolicyVector;\n};\n\nfunction isPromiseLike(value: unknown): value is Promise<PolicyInferenceOutput> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n\nfunction isPolicyActionChunk(value: PolicyInferenceOutput): value is readonly PolicyVector[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n (Array.isArray(value[0]) || ArrayBuffer.isView(value[0]))\n );\n}\n\nfunction toPolicyActions(output: PolicyInferenceOutput): PolicyVector[] {\n return isPolicyActionChunk(output) ? [...output] : [output];\n}\n\nfunction enqueuePolicyActions(\n queue: PendingPolicyAction[],\n actions: PolicyVector[],\n observation: PolicyVector,\n strategy: PolicyConfig['queueStrategy']\n) {\n if (strategy === 'replace') {\n queue.splice(0, queue.length);\n }\n queue.push(...actions.map((action) => ({ action, observation })));\n}\n\n/**\n * Framework-agnostic policy execution hook.\n *\n * Manages a decimation loop: calls `onObservation` to build observations\n * at the specified frequency, then calls `onAction` to apply the policy output.\n * The actual inference (ONNX, TF.js, custom) is the consumer's responsibility.\n *\n * @param config Policy configuration\n * @returns { step, isRunning } control handles\n */\nexport function usePolicy(config: PolicyConfig): PolicyAPI {\n const lastActionTimeRef = useRef(0);\n const lastObservationRef = useRef<ReturnType<PolicyConfig['onObservation']> | null>(null);\n const lastActionRef = useRef<Float32Array | Float64Array | number[] | null>(null);\n const actionQueueRef = useRef<PendingPolicyAction[]>([]);\n const inFlightRef = useRef(false);\n const lastErrorRef = useRef<unknown>(null);\n const epochRef = useRef(0);\n const isRunningRef = useRef(config.enabled ?? true);\n const configRef = useRef(config);\n configRef.current = config;\n isRunningRef.current = config.enabled ?? isRunningRef.current;\n\n const clearQueue = useCallback(() => {\n epochRef.current += 1;\n actionQueueRef.current.splice(0, actionQueueRef.current.length);\n inFlightRef.current = false;\n lastErrorRef.current = null;\n }, []);\n\n const reset = useCallback(() => {\n clearQueue();\n lastActionTimeRef.current = 0;\n lastObservationRef.current = null;\n lastActionRef.current = null;\n }, [clearQueue]);\n\n useBeforePhysicsStep(({ model, data }) => {\n if (!isRunningRef.current) return;\n\n const cfg = configRef.current;\n const dt = model.opt?.timestep ?? 0.002;\n const interval = 1.0 / cfg.frequency;\n\n // Check if it's time for a new action\n if (data.time - lastActionTimeRef.current >= interval) {\n const queuedAction = actionQueueRef.current.shift();\n if (queuedAction) {\n cfg.onAction({\n action: queuedAction.action,\n observation: queuedAction.observation,\n model,\n data,\n });\n lastActionTimeRef.current = data.time;\n lastActionRef.current = queuedAction.action;\n }\n\n const prefetchThreshold = cfg.prefetchThreshold ?? 0;\n const shouldInfer = !inFlightRef.current && (!queuedAction || actionQueueRef.current.length <= prefetchThreshold);\n if (!shouldInfer) return;\n\n // Build observation\n const observation = cfg.onObservation({ model, data });\n const queuedActions = actionQueueRef.current.length;\n const result = cfg.infer\n ? cfg.infer({ observation, model, data, queuedActions })\n : observation;\n\n if (isPromiseLike(result)) {\n const epoch = epochRef.current;\n inFlightRef.current = true;\n result\n .then((output) => {\n if (epoch !== epochRef.current) return;\n enqueuePolicyActions(\n actionQueueRef.current,\n toPolicyActions(output),\n observation,\n cfg.queueStrategy ?? 'append'\n );\n lastErrorRef.current = null;\n })\n .catch((error: unknown) => {\n if (epoch !== epochRef.current) return;\n lastErrorRef.current = error;\n cfg.onError?.(error);\n })\n .finally(() => {\n if (epoch !== epochRef.current) return;\n inFlightRef.current = false;\n });\n } else {\n const actions = toPolicyActions(result);\n if (queuedAction) {\n enqueuePolicyActions(\n actionQueueRef.current,\n actions,\n observation,\n cfg.queueStrategy ?? 'append'\n );\n } else {\n const [action, ...queuedActions] = actions;\n if (!action) return;\n enqueuePolicyActions(\n actionQueueRef.current,\n queuedActions,\n observation,\n cfg.queueStrategy ?? 'append'\n );\n // Apply action. If `infer` is omitted, this preserves the legacy inline-controller path.\n cfg.onAction({ action, observation, model, data });\n lastActionRef.current = action;\n }\n }\n\n lastActionTimeRef.current = data.time;\n lastObservationRef.current = observation;\n }\n });\n\n return useMemo(() => ({\n get isRunning() { return isRunningRef.current; },\n start: () => { isRunningRef.current = true; },\n stop: () => {\n isRunningRef.current = false;\n if (configRef.current.clearQueueOnStop) reset();\n },\n clearQueue,\n reset,\n get inFlight() { return inFlightRef.current; },\n get queuedActions() { return actionQueueRef.current.length; },\n get lastObservation() { return lastObservationRef.current; },\n get lastAction() { return lastActionRef.current; },\n get lastError() { return lastErrorRef.current; },\n }), [clearQueue, reset]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useRemotePolicy — HTTP JSON inference wrapper around usePolicy.\n */\n\nimport { useMemo, useRef } from 'react';\nimport { usePolicy } from './usePolicy';\nimport type {\n PolicyInferenceOutput,\n PolicyVector,\n RemotePolicyAPI,\n RemotePolicyConfig,\n RemotePolicyRequestInput,\n RemotePolicyResponseInfo,\n RemotePolicyStatus,\n} from '../types';\n\nfunction now() {\n return typeof performance !== 'undefined' ? performance.now() : Date.now();\n}\n\nfunction isAbortError(error: unknown) {\n return (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException && error.name === 'AbortError'\n ) || (\n error instanceof Error && error.name === 'AbortError'\n );\n}\n\nfunction createAbortError(message: string) {\n if (typeof DOMException !== 'undefined') {\n return new DOMException(message, 'AbortError');\n }\n const error = new Error(message);\n error.name = 'AbortError';\n return error;\n}\n\nfunction abortController(controller: AbortController | null, reason?: unknown) {\n if (!controller || controller.signal.aborted) return;\n if (reason !== undefined) {\n controller.abort(reason);\n } else {\n controller.abort();\n }\n}\n\nfunction createMergedAbortSignal(\n localSignal: AbortSignal,\n externalSignal: AbortSignal | undefined\n) {\n if (!externalSignal) return localSignal;\n if (externalSignal.aborted) {\n const controller = new AbortController();\n abortController(controller, externalSignal.reason);\n return controller.signal;\n }\n if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.any === 'function') {\n return AbortSignal.any([localSignal, externalSignal]);\n }\n\n const controller = new AbortController();\n const abortFromLocal = () => abortController(controller, localSignal.reason);\n const abortFromExternal = () => abortController(controller, externalSignal.reason);\n localSignal.addEventListener('abort', abortFromLocal, { once: true });\n externalSignal.addEventListener('abort', abortFromExternal, { once: true });\n return controller.signal;\n}\n\nfunction vectorToArray(vector: PolicyVector) {\n return Array.from(vector, (value) => Number(value));\n}\n\nfunction isPolicyVectorArray(value: unknown): value is PolicyVector[] {\n return (\n Array.isArray(value) &&\n value.every((entry) => Array.isArray(entry) || ArrayBuffer.isView(entry))\n );\n}\n\nfunction isPolicyVector(value: unknown): value is PolicyVector {\n return Array.isArray(value) || ArrayBuffer.isView(value);\n}\n\nfunction defaultBuildRemotePolicyRequest(input: RemotePolicyRequestInput) {\n const observation = vectorToArray(input.observation);\n return {\n observation,\n state: observation,\n time: input.data.time,\n reset: input.reset,\n };\n}\n\nasync function defaultReadRemotePolicyResponse(response: Response) {\n const text = await response.text();\n if (text.length === 0) return null;\n return JSON.parse(text);\n}\n\nfunction defaultParseRemotePolicyResponse(responseBody: unknown): PolicyInferenceOutput {\n if (responseBody && typeof responseBody === 'object') {\n const body = responseBody as {\n action?: unknown;\n actions?: unknown;\n error?: unknown;\n };\n\n if (typeof body.error === 'string' && body.error.length > 0) {\n throw new Error(body.error);\n }\n\n if (isPolicyVectorArray(body.actions) && body.actions.length > 0) {\n return body.actions;\n }\n\n if (isPolicyVector(body.action)) {\n return body.action;\n }\n }\n\n if (isPolicyVectorArray(responseBody) && responseBody.length > 0) {\n return responseBody;\n }\n\n if (isPolicyVector(responseBody)) {\n return responseBody;\n }\n\n throw new Error('Remote policy response must include `action` or `actions`.');\n}\n\nfunction createHttpError(response: Response, responseBody: unknown) {\n const suffix =\n responseBody && typeof responseBody === 'object' && 'error' in responseBody\n ? `: ${String((responseBody as { error?: unknown }).error)}`\n : '';\n return new Error(`Remote policy request failed with HTTP ${response.status}${suffix}`);\n}\n\n/**\n * Run a policy whose inference step lives behind an HTTP JSON endpoint.\n *\n * The hook keeps `usePolicy` responsible for timing, queueing, and pause/reset\n * behavior. This wrapper only builds requests, parses responses, and exposes\n * request metadata for HUDs and debugging.\n */\nexport function useRemotePolicy(config: RemotePolicyConfig): RemotePolicyAPI {\n const configRef = useRef(config);\n configRef.current = config;\n const requestCountRef = useRef(0);\n const responseCountRef = useRef(0);\n const remoteStatusRef = useRef<RemotePolicyStatus>('idle');\n const lastRequestBodyRef = useRef<unknown>(null);\n const lastResponseBodyRef = useRef<unknown>(null);\n const lastHttpStatusRef = useRef<number | null>(null);\n const lastRequestMsRef = useRef<number | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const remoteEpochRef = useRef(0);\n\n const policy = usePolicy({\n ...config,\n infer: async ({ observation, model, data, queuedActions }) => {\n const cfg = configRef.current;\n abortController(abortControllerRef.current, createAbortError('Remote policy request was superseded.'));\n const controller = new AbortController();\n abortControllerRef.current = controller;\n const signal = createMergedAbortSignal(controller.signal, cfg.signal);\n const remoteEpoch = remoteEpochRef.current;\n const requestIndex = requestCountRef.current;\n const requestInput: RemotePolicyRequestInput = {\n observation,\n model,\n data,\n queuedActions,\n reset: requestIndex === 0,\n requestIndex,\n signal,\n };\n requestCountRef.current += 1;\n\n const requestStartedAt = now();\n const body = await (\n cfg.buildRequest?.(requestInput) ?? defaultBuildRemotePolicyRequest(requestInput)\n );\n signal.throwIfAborted();\n if (remoteEpoch !== remoteEpochRef.current) {\n throw createAbortError('Remote policy request was reset.');\n }\n lastRequestBodyRef.current = body;\n remoteStatusRef.current = 'requesting';\n cfg.onRequest?.({\n ...requestInput,\n body,\n requestStartedAt,\n });\n\n let response: Response | null = null;\n let responseBody: unknown = null;\n try {\n const headers = new Headers(cfg.headers);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n const fetcher = cfg.fetcher ?? fetch;\n response = await fetcher(String(cfg.endpoint), {\n ...cfg.requestInit,\n method: cfg.method ?? 'POST',\n credentials: cfg.credentials,\n headers,\n signal,\n body: typeof body === 'string' ? body : JSON.stringify(body),\n });\n if (remoteEpoch === remoteEpochRef.current) {\n lastHttpStatusRef.current = response.status;\n }\n responseBody = await (\n cfg.readResponse?.(response) ?? defaultReadRemotePolicyResponse(response)\n );\n signal.throwIfAborted();\n if (remoteEpoch !== remoteEpochRef.current) {\n throw createAbortError('Remote policy request was reset.');\n }\n lastResponseBodyRef.current = responseBody;\n\n if (!response.ok) {\n throw createHttpError(response, responseBody);\n }\n\n const responseFinishedAt = now();\n const info: RemotePolicyResponseInfo = {\n ...requestInput,\n body,\n requestStartedAt,\n response,\n responseBody,\n responseFinishedAt,\n requestMs: responseFinishedAt - requestStartedAt,\n };\n if (remoteEpoch === remoteEpochRef.current) {\n lastRequestMsRef.current = info.requestMs;\n responseCountRef.current += 1;\n }\n cfg.onResponse?.(info);\n const output = await (\n cfg.parseResponse?.(responseBody, info) ??\n defaultParseRemotePolicyResponse(responseBody)\n );\n if (remoteEpoch === remoteEpochRef.current) {\n remoteStatusRef.current = 'ready';\n }\n return output;\n } catch (error) {\n if (response && remoteEpoch === remoteEpochRef.current) {\n lastHttpStatusRef.current = response.status;\n }\n if (isAbortError(error) || signal.aborted) {\n if (remoteEpoch === remoteEpochRef.current) {\n remoteStatusRef.current = 'aborted';\n }\n throw error;\n }\n if (remoteEpoch === remoteEpochRef.current) {\n remoteStatusRef.current = 'error';\n }\n throw error;\n } finally {\n if (abortControllerRef.current === controller) {\n abortControllerRef.current = null;\n }\n }\n },\n });\n\n return useMemo(() => {\n const abort = (reason?: unknown) => {\n abortController(abortControllerRef.current, reason);\n if (abortControllerRef.current) {\n remoteStatusRef.current = 'aborted';\n }\n };\n const resetRemoteState = () => {\n remoteEpochRef.current += 1;\n abort(createAbortError('Remote policy request was reset.'));\n requestCountRef.current = 0;\n responseCountRef.current = 0;\n remoteStatusRef.current = 'idle';\n lastRequestBodyRef.current = null;\n lastResponseBodyRef.current = null;\n lastHttpStatusRef.current = null;\n lastRequestMsRef.current = null;\n };\n\n return {\n get isRunning() { return policy.isRunning; },\n start: policy.start,\n stop: () => {\n if (configRef.current.abortOnStop ?? true) {\n abort(createAbortError('Remote policy request was stopped.'));\n }\n policy.stop();\n if (configRef.current.clearQueueOnStop) {\n resetRemoteState();\n }\n },\n clearQueue: policy.clearQueue,\n abort,\n reset: () => {\n resetRemoteState();\n policy.reset();\n },\n get inFlight() { return policy.inFlight; },\n get queuedActions() { return policy.queuedActions; },\n get lastObservation() { return policy.lastObservation; },\n get lastAction() { return policy.lastAction; },\n get lastError() { return policy.lastError; },\n get remoteStatus() { return remoteStatusRef.current; },\n get requestCount() { return requestCountRef.current; },\n get responseCount() { return responseCountRef.current; },\n get lastRequestBody() { return lastRequestBodyRef.current; },\n get lastResponseBody() { return lastResponseBodyRef.current; },\n get lastHttpStatus() { return lastHttpStatusRef.current; },\n get lastRequestMs() { return lastRequestMsRef.current; },\n };\n }, [policy]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo, useRef } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { buildObservation } from '../core/ObservationBuilder';\nimport type { ObservationConfig, ObservationHandle, ObservationResult } from '../types';\n\nconst EMPTY_OBSERVATION: ObservationResult = {\n values: new Float32Array(0),\n layout: [],\n};\n\n/**\n * Live observation reader for policy loops and telemetry.\n *\n * The handle is stable; call `read()` inside callbacks to sample the latest\n * MuJoCo model/data state without forcing React renders.\n */\nexport function useObservation(config: ObservationConfig): ObservationHandle {\n const { mjModelRef, mjDataRef } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n\n return useMemo(() => ({\n read() {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return EMPTY_OBSERVATION;\n return buildObservation(model, data, configRef.current);\n },\n readValues() {\n return this.read().values;\n },\n }), [mjDataRef, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Named policy observation builders with layout and units metadata.\n */\n\nimport type {\n Bodies,\n Geoms,\n MujocoData,\n MujocoModel,\n ObservationOutput,\n Sites,\n} from './types';\nimport { findBodyByName, findGeomByName, findSiteByName } from './core/SceneLoader';\n\nexport type NamedObservationMissing = 'skip' | 'zeros' | 'throw';\n\nexport interface NamedObservationInput {\n model: MujocoModel;\n data: MujocoData;\n}\n\nexport interface NamedObservationField {\n name: string;\n size: number;\n units?: string;\n read: (input: NamedObservationInput) => ArrayLike<number> | number | null | undefined;\n}\n\nexport interface NamedObservationLayoutItem {\n name: string;\n start: number;\n size: number;\n units?: string;\n}\n\nexport interface NamedObservationOptions {\n fields: readonly NamedObservationField[];\n output?: ObservationOutput;\n missing?: NamedObservationMissing;\n}\n\nexport interface NamedObservationResult {\n values: Float32Array | Float64Array;\n layout: NamedObservationLayoutItem[];\n}\n\nfunction pushValues(target: number[], value: ArrayLike<number> | number, size: number) {\n if (typeof value === 'number') {\n target.push(value);\n for (let index = 1; index < size; index += 1) target.push(0);\n return;\n }\n\n for (let index = 0; index < size; index += 1) {\n target.push(Number(value[index] ?? 0));\n }\n}\n\nexport function readNamedObservation(\n model: MujocoModel,\n data: MujocoData,\n options: NamedObservationOptions\n): NamedObservationResult {\n const values: number[] = [];\n const layout: NamedObservationLayoutItem[] = [];\n const missing = options.missing ?? 'skip';\n\n for (const field of options.fields) {\n const start = values.length;\n const value = field.read({ model, data });\n if (value === null || value === undefined) {\n if (missing === 'skip') continue;\n if (missing === 'throw') {\n throw new Error(`Unable to read named observation field \"${field.name}\".`);\n }\n for (let index = 0; index < field.size; index += 1) values.push(0);\n } else {\n pushValues(values, value, field.size);\n }\n layout.push({\n name: field.name,\n start,\n size: field.size,\n units: field.units,\n });\n }\n\n return {\n values: options.output === 'float64'\n ? new Float64Array(values)\n : new Float32Array(values),\n layout,\n };\n}\n\nexport function createNamedObservationBuilder(options: NamedObservationOptions) {\n return (model: MujocoModel, data: MujocoData) => (\n readNamedObservation(model, data, options)\n );\n}\n\nexport function qposField(name: string, index: number, units = 'qpos'): NamedObservationField {\n return {\n name,\n size: 1,\n units,\n read: ({ data }) => data.qpos[index],\n };\n}\n\nexport function qvelField(name: string, index: number, units = 'qvel'): NamedObservationField {\n return {\n name,\n size: 1,\n units,\n read: ({ data }) => data.qvel[index],\n };\n}\n\nexport function ctrlField(name: string, index: number, units = 'ctrl'): NamedObservationField {\n return {\n name,\n size: 1,\n units,\n read: ({ data }) => data.ctrl[index],\n };\n}\n\nexport function bodyPositionField(name: Bodies, units = 'world_position'): NamedObservationField {\n return {\n name: `body:${name}:xpos`,\n size: 3,\n units,\n read: ({ model, data }) => {\n const bodyId = findBodyByName(model, name);\n if (bodyId < 0) return null;\n const offset = bodyId * 3;\n return data.xpos.subarray(offset, offset + 3);\n },\n };\n}\n\nexport function geomPositionField(name: Geoms, units = 'world_position'): NamedObservationField {\n return {\n name: `geom:${name}:xpos`,\n size: 3,\n units,\n read: ({ model, data }) => {\n const geomId = findGeomByName(model, name);\n if (geomId < 0) return null;\n const offset = geomId * 3;\n return data.geom_xpos.subarray(offset, offset + 3);\n },\n };\n}\n\nexport function sitePositionField(name: Sites, units = 'world_position'): NamedObservationField {\n return {\n name: `site:${name}:xpos`,\n size: 3,\n units,\n read: ({ model, data }) => {\n const siteId = findSiteByName(model, name);\n if (siteId < 0) return null;\n const offset = siteId * 3;\n return data.site_xpos.subarray(offset, offset + 3);\n },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Stable React handle for named policy observations.\n */\n\nimport { useMemo, useRef } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { readNamedObservation } from '../policyObservation';\nimport type {\n NamedObservationOptions,\n NamedObservationResult,\n} from '../policyObservation';\n\nconst EMPTY_NAMED_OBSERVATION: NamedObservationResult = {\n values: new Float32Array(0),\n layout: [],\n};\n\nexport interface NamedObservationHandle {\n read: () => NamedObservationResult;\n readValues: () => Float32Array | Float64Array;\n}\n\nexport function useNamedObservation(options: NamedObservationOptions): NamedObservationHandle {\n const { mjModelRef, mjDataRef } = useMujocoContext();\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n return useMemo(() => ({\n read() {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return EMPTY_NAMED_OBSERVATION;\n return readNamedObservation(model, data, optionsRef.current);\n },\n readValues() {\n return this.read().values;\n },\n }), [mjDataRef, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryRecorder — trajectory recording hook (spec 13.1)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport type { TrajectoryFrame } from '../types';\n\ninterface RecorderOptions {\n fields?: ('qpos' | 'qvel' | 'ctrl' | 'sensordata')[];\n}\n\n/**\n * Record simulation trajectories for analysis, replay, or training data.\n */\nexport function useTrajectoryRecorder(options: RecorderOptions = {}) {\n const { mjModelRef } = useMujocoContext();\n const recordingRef = useRef(false);\n const framesRef = useRef<TrajectoryFrame[]>([]);\n const fields = options.fields ?? ['qpos'];\n\n useAfterPhysicsStep(({ data }) => {\n if (!recordingRef.current) return;\n\n const frame: TrajectoryFrame = {\n time: data.time,\n qpos: new Float64Array(data.qpos),\n };\n\n if (fields.includes('qvel')) frame.qvel = new Float64Array(data.qvel);\n if (fields.includes('ctrl')) frame.ctrl = new Float64Array(data.ctrl);\n if (fields.includes('sensordata') && data.sensordata) {\n frame.sensordata = new Float64Array(data.sensordata);\n }\n\n framesRef.current.push(frame);\n });\n\n const start = useCallback(() => {\n framesRef.current = [];\n recordingRef.current = true;\n }, []);\n\n const stop = useCallback(() => {\n recordingRef.current = false;\n return framesRef.current;\n }, []);\n\n const downloadJSON = useCallback(() => {\n const frames = framesRef.current;\n const data = frames.map(f => ({\n time: f.time,\n qpos: Array.from(f.qpos),\n ...(f.qvel ? { qvel: Array.from(f.qvel) } : {}),\n ...(f.ctrl ? { ctrl: Array.from(f.ctrl) } : {}),\n ...(f.sensordata ? { sensordata: Array.from(f.sensordata) } : {}),\n }));\n const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'trajectory.json';\n a.click();\n URL.revokeObjectURL(url);\n }, []);\n\n const downloadCSV = useCallback(() => {\n const frames = framesRef.current;\n if (frames.length === 0) return;\n const nq = frames[0].qpos.length;\n const headers = ['time', ...Array.from({ length: nq }, (_, i) => `qpos_${i}`)];\n const rows = frames.map(f =>\n [f.time, ...Array.from(f.qpos)].join(',')\n );\n const csv = [headers.join(','), ...rows].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'trajectory.csv';\n a.click();\n URL.revokeObjectURL(url);\n }, []);\n\n return {\n start,\n stop,\n downloadJSON,\n downloadCSV,\n get recording() { return recordingRef.current; },\n get frameCount() { return framesRef.current.length; },\n get frames() { return framesRef.current; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useGamepad — gamepad teleoperation hook (spec 12.2)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\n\ninterface GamepadConfig {\n /** Map gamepad axis index to actuator name. */\n axes?: Record<number, string>;\n /** Map gamepad button index to actuator name. */\n buttons?: Record<number, string>;\n /** Axis deadzone. Default: 0.1. */\n deadzone?: number;\n /** Scale factor for axis values. Default: 1.0. */\n scale?: number;\n /** Gamepad index. Default: 0 (first connected). */\n gamepadIndex?: number;\n enabled?: boolean;\n}\n\n/**\n * Map gamepad axes and buttons to actuator controls.\n * Axes map their -1..1 value (scaled) to the actuator.\n * Buttons map their 0..1 pressed value to the actuator.\n */\nexport function useGamepad(config: GamepadConfig) {\n const { mjModelRef, status } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n\n // Cache actuator IDs\n const axisCacheRef = useRef(new Map<number, number>());\n const buttonCacheRef = useRef(new Map<number, number>());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n axisCacheRef.current.clear();\n buttonCacheRef.current.clear();\n for (const [idx, name] of Object.entries(config.axes ?? {})) {\n axisCacheRef.current.set(Number(idx), findActuatorByName(model, name));\n }\n for (const [idx, name] of Object.entries(config.buttons ?? {})) {\n buttonCacheRef.current.set(Number(idx), findActuatorByName(model, name));\n }\n }, [config.axes, config.buttons, status, mjModelRef]);\n\n useBeforePhysicsStep(({ data }) => {\n const cfg = configRef.current;\n if (cfg.enabled === false) return;\n\n const gamepads = navigator.getGamepads?.();\n if (!gamepads) return;\n const gp = gamepads[cfg.gamepadIndex ?? 0];\n if (!gp) return;\n\n const deadzone = cfg.deadzone ?? 0.1;\n const scale = cfg.scale ?? 1.0;\n\n for (const [axisIdx, actId] of axisCacheRef.current) {\n if (actId < 0 || axisIdx >= gp.axes.length) continue;\n let val = gp.axes[axisIdx];\n if (Math.abs(val) < deadzone) val = 0;\n data.ctrl[actId] = val * scale;\n }\n\n for (const [btnIdx, actId] of buttonCacheRef.current) {\n if (actId < 0 || btnIdx >= gp.buttons.length) continue;\n data.ctrl[actId] = gp.buttons[btnIdx].value;\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useVideoRecorder — canvas video recording hook (spec 13.3)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useThree } from '@react-three/fiber';\n\ninterface VideoRecorderOptions {\n fps?: number;\n mimeType?: string;\n}\n\n/**\n * Record the R3F canvas to a video file using MediaRecorder.\n */\nexport function useVideoRecorder(options: VideoRecorderOptions = {}) {\n const { gl } = useThree();\n const recorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const recordingRef = useRef(false);\n\n const start = useCallback(() => {\n const canvas = gl.domElement;\n const fps = options.fps ?? 30;\n const mimeType = options.mimeType ?? 'video/webm';\n\n const stream = canvas.captureStream(fps);\n const recorder = new MediaRecorder(stream, {\n mimeType: MediaRecorder.isTypeSupported(mimeType) ? mimeType : 'video/webm',\n });\n\n chunksRef.current = [];\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunksRef.current.push(e.data);\n };\n\n recorder.start();\n recorderRef.current = recorder;\n recordingRef.current = true;\n }, [gl, options.fps, options.mimeType]);\n\n const stop = useCallback((): Promise<Blob> => {\n return new Promise((resolve) => {\n const recorder = recorderRef.current;\n if (!recorder || recorder.state === 'inactive') {\n resolve(new Blob([]));\n return;\n }\n\n recorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: recorder.mimeType });\n chunksRef.current = [];\n recordingRef.current = false;\n recorderRef.current = null;\n resolve(blob);\n };\n\n recorder.stop();\n });\n }, []);\n\n const download = useCallback(async (filename = 'recording.webm') => {\n const blob = await stop();\n if (blob.size === 0) return;\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n }, [stop]);\n\n return {\n start,\n stop,\n download,\n get recording() { return recordingRef.current; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * React state wrapper around MuJoCo/R3F offscreen camera-frame capture.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport type {\n CameraFrameCaptureAPI,\n CameraFrameCaptureOptions,\n FrameCaptureStatus,\n} from '../types';\n\nexport function useCameraFrameCapture(\n defaultOptions: CameraFrameCaptureOptions = {}\n): CameraFrameCaptureAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback(\n async (options: CameraFrameCaptureOptions = {}) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for camera frame capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await mujoco.api.captureCameraFrame({\n ...defaultOptions,\n ...options,\n });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture the requested camera frame.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n const captureBlob = useCallback(\n async (options: CameraFrameCaptureOptions = {}) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for camera frame capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await mujoco.api.captureCameraFrameBlob({\n ...defaultOptions,\n ...options,\n });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture the requested camera frame.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n captureBlob,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Helpers for turning Three/MuJoCo camera captures into policy image payloads.\n */\n\nimport type {\n CameraFrameCaptureResult,\n MujocoSimAPI,\n PolicyCameraFrameCaptureOptions,\n PolicyCameraFrameCaptureResult,\n PolicyCameraFrameStream,\n} from './types';\nimport {\n createMountedCameraFrameSequencePlan,\n type MountedCameraFrameSequenceCameraOptions,\n type MountedCameraFrameSequenceDefaults,\n type MountedCameraFrameSequencePlan,\n type ResolveMountedCameraFrameSourceOptions,\n} from './rendering/cameraFrameSource';\n\nexport type PolicyCameraFrameCaptureTarget = Pick<MujocoSimAPI, 'captureCameraFrame'>;\nexport type PolicyCameraFramePlanTarget = Pick<MujocoSimAPI, 'getCameras' | 'getSites' | 'getBodies'>;\n\nexport type PolicyCameraFrameStreamOptions =\n Partial<Omit<PolicyCameraFrameStream, 'key'>> &\n MountedCameraFrameSequenceCameraOptions & {\n /** Additional policy payload keys that should receive this stream's data URL. */\n aliases?: readonly string[];\n};\n\nexport interface CreatePolicyCameraFrameCapturePlanOptions\n extends Omit<\n ResolveMountedCameraFrameSourceOptions,\n 'cameras' | 'sites' | 'bodies'\n > {\n cameraKeys: readonly string[];\n cameras?: ResolveMountedCameraFrameSourceOptions['cameras'];\n sites?: ResolveMountedCameraFrameSourceOptions['sites'];\n bodies?: ResolveMountedCameraFrameSourceOptions['bodies'];\n defaults?: MountedCameraFrameSequenceDefaults;\n streamOptions?: Record<string, PolicyCameraFrameStreamOptions>;\n includeObservationImageAliases?: boolean;\n requireAll?: boolean;\n}\n\nexport interface PolicyCameraFrameCapturePlan\n extends PolicyCameraFrameCaptureOptions {\n cameraKeys: string[];\n streams: PolicyCameraFrameStream[];\n mountedPlan: MountedCameraFrameSequencePlan;\n missingKeys: string[];\n}\n\nfunction addPolicyImageAliases(\n images: Record<string, string>,\n stream: PolicyCameraFrameStream,\n frame: CameraFrameCaptureResult,\n includeObservationImageAliases: boolean\n) {\n const keys = new Set<string>();\n keys.add(stream.key);\n for (const alias of stream.aliases ?? []) keys.add(alias);\n if (includeObservationImageAliases) {\n keys.add(`observation.images.${stream.key}`);\n for (const alias of stream.aliases ?? []) {\n keys.add(`observation.images.${alias}`);\n }\n }\n for (const key of keys) {\n images[key] = frame.dataUrl;\n }\n}\n\nfunction describeFrameSource(key: string, frame: CameraFrameCaptureResult) {\n return `${key}:${frame.source.kind}`;\n}\n\nfunction hasExplicitPolicyCameraSource(\n options: PolicyCameraFrameStreamOptions | undefined\n) {\n return Boolean(\n options?.camera ||\n options?.position ||\n options?.quaternion ||\n options?.source\n );\n}\n\nexport function createPolicyCameraFrameCapturePlan(\n options: CreatePolicyCameraFrameCapturePlanOptions\n): PolicyCameraFrameCapturePlan {\n const {\n cameraKeys,\n defaults,\n streamOptions,\n includeObservationImageAliases,\n requireAll,\n ...sourceOptions\n } = options;\n const mountedPlan = createMountedCameraFrameSequencePlan(cameraKeys, {\n ...sourceOptions,\n defaults,\n cameraOptions: streamOptions as\n | Record<string, MountedCameraFrameSequenceCameraOptions>\n | undefined,\n });\n const streams: PolicyCameraFrameStream[] = [];\n const missingKeys = new Set(mountedPlan.missingKeys);\n\n for (const key of cameraKeys) {\n const perStreamOptions = streamOptions?.[key];\n if (hasExplicitPolicyCameraSource(perStreamOptions)) {\n missingKeys.delete(key);\n streams.push({\n ...defaults,\n ...perStreamOptions,\n key,\n aliases: perStreamOptions?.aliases,\n });\n continue;\n }\n\n const mountedCamera = mountedPlan.cameras.find((camera) => camera.key === key);\n if (!mountedCamera) continue;\n const { key: _mountedKey, ...captureOptions } = mountedCamera;\n streams.push({\n ...captureOptions,\n key,\n aliases: perStreamOptions?.aliases,\n });\n }\n\n const result: PolicyCameraFrameCapturePlan = {\n cameraKeys: [...cameraKeys],\n streams,\n includeObservationImageAliases,\n mountedPlan,\n missingKeys: [...missingKeys],\n };\n\n if (requireAll && result.missingKeys.length > 0) {\n throw new Error(\n `Unable to resolve policy camera stream${\n result.missingKeys.length === 1 ? '' : 's'\n } for ${result.missingKeys.join(', ')}.`\n );\n }\n\n return result;\n}\n\nexport function createPolicyCameraFrameCapturePlanFromApi(\n api: PolicyCameraFramePlanTarget,\n options: Omit<CreatePolicyCameraFrameCapturePlanOptions, 'cameras' | 'sites' | 'bodies'>\n): PolicyCameraFrameCapturePlan {\n return createPolicyCameraFrameCapturePlan({\n ...options,\n cameras: api.getCameras(),\n sites: api.getSites(),\n bodies: api.getBodies(),\n });\n}\n\nexport async function capturePolicyCameraFrames(\n target: PolicyCameraFrameCaptureTarget,\n options: PolicyCameraFrameCaptureOptions\n): Promise<PolicyCameraFrameCaptureResult> {\n const includeObservationImageAliases =\n options.includeObservationImageAliases ?? true;\n\n const entries = await Promise.all(\n options.streams.map(async ({ key, aliases, ...captureOptions }) => {\n const frame = await target.captureCameraFrame(captureOptions);\n return [key, { frame, aliases }] as const;\n })\n );\n\n const frames: Record<string, CameraFrameCaptureResult> = {};\n const images: Record<string, string> = {};\n const sourceParts: string[] = [];\n\n for (const [key, { frame, aliases }] of entries) {\n const stream = { key, aliases };\n frames[key] = frame;\n addPolicyImageAliases(\n images,\n stream,\n frame,\n includeObservationImageAliases\n );\n sourceParts.push(describeFrameSource(key, frame));\n }\n\n return {\n frames,\n images,\n sourceSummary: sourceParts.length > 0\n ? sourceParts.join(' + ')\n : 'not used by policy',\n capturedAt: Date.now(),\n };\n}\n\nexport async function capturePolicyCameraFramesFromMountedStreams(\n target: PolicyCameraFrameCaptureTarget & PolicyCameraFramePlanTarget,\n options: Omit<CreatePolicyCameraFrameCapturePlanOptions, 'cameras' | 'sites' | 'bodies'>\n): Promise<PolicyCameraFrameCaptureResult & { plan: PolicyCameraFrameCapturePlan }> {\n const plan = createPolicyCameraFrameCapturePlanFromApi(target, options);\n const result = await capturePolicyCameraFrames(target, plan);\n return { ...result, plan };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * React wrapper for capturing policy image payloads from Three/MuJoCo cameras.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport {\n capturePolicyCameraFrames,\n capturePolicyCameraFramesFromMountedStreams,\n} from '../policyCameraFrames';\nimport type {\n CreatePolicyCameraFrameCapturePlanOptions,\n PolicyCameraFrameCapturePlan,\n} from '../policyCameraFrames';\nimport type {\n FrameCaptureStatus,\n PolicyCameraFrameCaptureAPI,\n PolicyCameraFrameCaptureOptions,\n PolicyCameraFrameCaptureResult,\n} from '../types';\n\nexport type MountedPolicyCameraFrameCaptureOptions = Omit<\n CreatePolicyCameraFrameCapturePlanOptions,\n 'cameras' | 'sites' | 'bodies'\n>;\n\nexport interface MountedPolicyCameraFrameCaptureAPI {\n status: FrameCaptureStatus;\n error: Error | null;\n isCapturing: boolean;\n capture: (\n options?: Partial<MountedPolicyCameraFrameCaptureOptions>\n ) => Promise<PolicyCameraFrameCaptureResult & { plan: PolicyCameraFrameCapturePlan }>;\n reset: () => void;\n}\n\nfunction mergePolicyCameraFrameCaptureOptions(\n defaultOptions: MountedPolicyCameraFrameCaptureOptions,\n options: Partial<MountedPolicyCameraFrameCaptureOptions>\n): MountedPolicyCameraFrameCaptureOptions {\n return {\n ...defaultOptions,\n ...options,\n cameraKeys: options.cameraKeys ?? defaultOptions.cameraKeys,\n aliases: {\n ...defaultOptions.aliases,\n ...options.aliases,\n },\n defaults: {\n ...defaultOptions.defaults,\n ...options.defaults,\n },\n streamOptions: {\n ...defaultOptions.streamOptions,\n ...options.streamOptions,\n },\n };\n}\n\nexport function usePolicyCameraFrames(\n defaultOptions: PolicyCameraFrameCaptureOptions\n): PolicyCameraFrameCaptureAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback(\n async (options: Partial<PolicyCameraFrameCaptureOptions> = {}) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for policy camera capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await capturePolicyCameraFrames(mujoco.api, {\n ...defaultOptions,\n ...options,\n streams: options.streams ?? defaultOptions.streams,\n });\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture policy camera frames.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n reset,\n };\n}\n\nexport function usePolicyCameraFramesFromMountedStreams(\n defaultOptions: MountedPolicyCameraFrameCaptureOptions\n): MountedPolicyCameraFrameCaptureAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback(\n async (options: Partial<MountedPolicyCameraFrameCaptureOptions> = {}) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for mounted policy camera capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await capturePolicyCameraFramesFromMountedStreams(\n mujoco.api,\n mergePolicyCameraFrameCaptureOptions(defaultOptions, options)\n );\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture mounted policy camera frames.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Capture policy observation tensors directly from Three/MuJoCo cameras,\n * skipping the data-URL/PNG round-trip. Sessions are created once per camera\n * and reused every step, so live inference and dataset recording read straight\n * from the GPU into Float32 tensors.\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport { createPolicyCameraFrameCapturePlanFromApi } from '../policyCameraFrames';\nimport type { MountedPolicyCameraFrameCaptureOptions } from './usePolicyCameraFrames';\nimport type {\n CameraFrameCaptureSession,\n CameraFrameCaptureTensorOptions,\n CameraFrameTensorResult,\n} from '../rendering/cameraFrameCapture';\nimport type { FrameCaptureStatus } from '../types';\n\nexport interface PolicyCameraTensorStream extends CameraFrameCaptureTensorOptions {\n /** Payload key this stream's tensor is stored under. */\n key: string;\n /** Additional payload keys that should reference the same tensor. */\n aliases?: readonly string[];\n}\n\nexport interface PolicyCameraTensorsOptions {\n streams: PolicyCameraTensorStream[];\n /** Also expose tensors under `observation.images.<key>` aliases. Defaults to `false`. */\n includeObservationImageAliases?: boolean;\n}\n\nexport interface PolicyCameraTensorsResult {\n tensors: Record<string, CameraFrameTensorResult>;\n sourceSummary: string;\n capturedAt: number;\n}\n\nexport interface PolicyCameraTensorsAPI {\n status: FrameCaptureStatus;\n error: Error | null;\n isCapturing: boolean;\n /** Synchronously render and convert every stream into a policy image tensor. */\n capture: () => PolicyCameraTensorsResult;\n reset: () => void;\n}\n\nexport type MountedPolicyCameraTensorOptions = MountedPolicyCameraFrameCaptureOptions & {\n tensor?: Pick<\n CameraFrameCaptureTensorOptions,\n 'width' | 'height' | 'channels' | 'layout' | 'range'\n >;\n};\n\ntype SessionEntry = {\n session: CameraFrameCaptureSession;\n signature: string;\n};\n\nfunction sessionSignature(stream: PolicyCameraTensorStream): string {\n return JSON.stringify({\n width: stream.width,\n height: stream.height,\n channels: stream.channels,\n renderIsolation: stream.renderIsolation ?? false,\n cameraName: stream.cameraName,\n siteName: stream.siteName,\n bodyName: stream.bodyName,\n });\n}\n\nfunction addTensorAliases(\n tensors: Record<string, CameraFrameTensorResult>,\n stream: PolicyCameraTensorStream,\n tensor: CameraFrameTensorResult,\n includeObservationImageAliases: boolean\n) {\n const keys = new Set<string>([stream.key, ...(stream.aliases ?? [])]);\n if (includeObservationImageAliases) {\n for (const base of [stream.key, ...(stream.aliases ?? [])]) {\n keys.add(`observation.images.${base}`);\n }\n }\n for (const key of keys) tensors[key] = tensor;\n}\n\nexport function usePolicyCameraTensors(\n options: PolicyCameraTensorsOptions\n): PolicyCameraTensorsAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const sessionsRef = useRef<Map<string, SessionEntry>>(new Map());\n\n const disposeSessions = useCallback(() => {\n for (const { session } of sessionsRef.current.values()) session.dispose();\n sessionsRef.current.clear();\n }, []);\n\n useEffect(() => disposeSessions, [disposeSessions]);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const capture = useCallback((): PolicyCameraTensorsResult => {\n const api = mujoco.api;\n if (!api) {\n throw new Error('MuJoCo scene is not ready for policy camera tensor capture.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const sessions = sessionsRef.current;\n const seen = new Set<string>();\n const tensors: Record<string, CameraFrameTensorResult> = {};\n const sourceParts: string[] = [];\n\n for (const stream of options.streams) {\n seen.add(stream.key);\n const resolved: CameraFrameCaptureTensorOptions = {\n ...api.resolveCameraCaptureOptions(stream),\n channels: stream.channels,\n layout: stream.layout,\n range: stream.range,\n };\n\n const signature = sessionSignature(stream);\n let entry = sessions.get(stream.key);\n if (!entry || entry.signature !== signature) {\n entry?.session.dispose();\n entry = {\n session: api.createCameraFrameCaptureSession(resolved),\n signature,\n };\n sessions.set(stream.key, entry);\n }\n\n const tensor = entry.session.captureTensor(resolved);\n addTensorAliases(\n tensors,\n stream,\n tensor,\n options.includeObservationImageAliases ?? false\n );\n sourceParts.push(`${stream.key}:${tensor.source.kind}`);\n }\n\n // Drop sessions for streams that are no longer requested.\n for (const key of [...sessions.keys()]) {\n if (!seen.has(key)) {\n sessions.get(key)?.session.dispose();\n sessions.delete(key);\n }\n }\n\n setStatus('captured');\n return {\n tensors,\n sourceSummary: sourceParts.join(' + ') || 'not used by policy',\n capturedAt: Date.now(),\n };\n } catch (nextError) {\n const captureError =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to capture policy camera tensors.');\n setError(captureError);\n setStatus('error');\n throw captureError;\n }\n }, [mujoco.api, options.includeObservationImageAliases, options.streams]);\n\n return {\n status,\n error,\n isCapturing: status === 'capturing',\n capture,\n reset,\n };\n}\n\nexport function usePolicyCameraTensorsFromMountedStreams(\n options: MountedPolicyCameraTensorOptions\n): PolicyCameraTensorsAPI {\n const mujoco = useMujoco();\n const tensorOptions = options.tensor;\n const mountedOptions = useMemo<PolicyCameraTensorsOptions>(() => {\n const api = mujoco.api;\n if (!api) {\n return {\n streams: [],\n includeObservationImageAliases: options.includeObservationImageAliases ?? false,\n };\n }\n\n const plan = createPolicyCameraFrameCapturePlanFromApi(api, options);\n return {\n streams: plan.streams.map(({ key, aliases, ...stream }) => ({\n ...stream,\n ...tensorOptions,\n key,\n aliases,\n })),\n includeObservationImageAliases: plan.includeObservationImageAliases ?? false,\n };\n }, [mujoco.api, options, tensorOptions]);\n\n return usePolicyCameraTensors(mountedOptions);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * React state wrapper around fixed-camera simulation sequence recording.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport type {\n CameraFrameSequenceOptions,\n CameraFrameSequenceRecorderAPI,\n FrameCaptureStatus,\n} from '../types';\n\nexport function useCameraSequenceRecorder(): CameraFrameSequenceRecorderAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n }, []);\n\n const record = useCallback(\n async (options: CameraFrameSequenceOptions) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for camera sequence recording.');\n }\n\n setStatus('capturing');\n setError(null);\n\n try {\n const result = await mujoco.api.recordCameraSequence(options);\n setStatus('captured');\n return result;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to record the requested camera sequence.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [mujoco.api]\n );\n\n return {\n status,\n error,\n isRecording: status === 'capturing',\n record,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * React state wrapper for named MuJoCo camera/site/body sequence recording.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport {\n createMountedCameraFrameSequenceReadiness,\n createMountedCameraFrameSequencePlanFromApi,\n recordMountedCameraFrameSequence,\n type MountedCameraFrameSequencePlan,\n type MountedCameraFrameSequencePlanOptions,\n type MountedCameraFrameSequenceReadiness,\n type MountedCameraFrameSequenceRecordOptions,\n type MountedCameraFrameSequenceRecordResult,\n} from '../rendering/cameraFrameSource';\nimport type {\n CameraFrameSequenceRecorderAPI,\n FrameCaptureStatus,\n} from '../types';\n\nexport type MountedCameraSequencePlanOptions =\n MountedCameraFrameSequencePlanOptions;\nexport type MountedCameraSequenceRecordOptions =\n MountedCameraFrameSequenceRecordOptions;\nexport type MountedCameraSequenceRecordResult =\n MountedCameraFrameSequenceRecordResult;\nexport type MountedCameraSequenceReadiness =\n MountedCameraFrameSequenceReadiness;\n\nexport interface MountedCameraSequenceRecorderAPI\n extends Omit<CameraFrameSequenceRecorderAPI, 'record'> {\n plan: MountedCameraFrameSequencePlan | null;\n readiness: MountedCameraSequenceReadiness | null;\n result: MountedCameraSequenceRecordResult | null;\n createPlan: (\n cameraKeys: readonly string[],\n options?: MountedCameraSequencePlanOptions\n ) => MountedCameraFrameSequencePlan;\n checkReadiness: (\n cameraKeys: readonly string[],\n options?: MountedCameraSequencePlanOptions\n ) => MountedCameraSequenceReadiness;\n record: (\n options: MountedCameraSequenceRecordOptions\n ) => Promise<MountedCameraSequenceRecordResult>;\n}\n\nexport function useMountedCameraSequenceRecorder(\n defaultOptions: MountedCameraSequencePlanOptions = {}\n): MountedCameraSequenceRecorderAPI {\n const mujoco = useMujoco();\n const [status, setStatus] = useState<FrameCaptureStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [plan, setPlan] = useState<MountedCameraFrameSequencePlan | null>(null);\n const [readiness, setReadiness] =\n useState<MountedCameraSequenceReadiness | null>(null);\n const [result, setResult] = useState<MountedCameraSequenceRecordResult | null>(\n null\n );\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setPlan(null);\n setReadiness(null);\n setResult(null);\n }, []);\n\n const createPlan = useCallback(\n (\n cameraKeys: readonly string[],\n options: MountedCameraSequencePlanOptions = {}\n ) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for mounted camera sequence planning.');\n }\n\n const nextPlan = createMountedCameraFrameSequencePlanFromApi(\n mujoco.api,\n cameraKeys,\n {\n ...defaultOptions,\n ...options,\n }\n );\n setPlan(nextPlan);\n setReadiness(null);\n return nextPlan;\n },\n [defaultOptions, mujoco.api]\n );\n\n const checkReadiness = useCallback(\n (\n cameraKeys: readonly string[],\n options: MountedCameraSequencePlanOptions = {}\n ) => {\n const nextPlan = createPlan(cameraKeys, options);\n const nextReadiness = createMountedCameraFrameSequenceReadiness(nextPlan);\n setReadiness(nextReadiness);\n return nextReadiness;\n },\n [createPlan]\n );\n\n const record = useCallback(\n async (options: MountedCameraSequenceRecordOptions) => {\n if (!mujoco.api) {\n throw new Error('MuJoCo scene is not ready for mounted camera sequence recording.');\n }\n\n setStatus('capturing');\n setError(null);\n setResult(null);\n\n try {\n const nextResult = await recordMountedCameraFrameSequence(mujoco.api, {\n ...defaultOptions,\n ...options,\n });\n setPlan(nextResult.plan);\n setReadiness(nextResult.readiness);\n setResult(nextResult);\n setStatus('captured');\n return nextResult;\n } catch (nextError) {\n const error =\n nextError instanceof Error\n ? nextError\n : new Error('Unable to record the requested mounted camera sequence.');\n setError(error);\n setStatus('error');\n throw error;\n }\n },\n [defaultOptions, mujoco.api]\n );\n\n return {\n status,\n error,\n plan,\n readiness,\n result,\n isRecording: status === 'capturing',\n createPlan,\n checkReadiness,\n record,\n reset,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * Helpers for applying policy action vectors to MuJoCo controls.\n */\n\nimport type { MujocoData, MujocoModel, PolicyVector } from './types';\n\nexport interface ApplyPolicyActionToControlsOptions {\n /**\n * First actuator/control index to write. Defaults to 0.\n */\n actuatorOffset?: number;\n /**\n * Maximum number of controls to write. Defaults to the action length.\n */\n actionSize?: number;\n /**\n * Clamp each action value to `model.actuator_ctrlrange` before writing.\n * Defaults to true because most learned policies should not exceed actuator limits.\n */\n clamp?: boolean;\n /**\n * Leave the current control unchanged when an action entry is not finite.\n * Defaults to true so a bad policy response cannot write NaN into the simulation.\n */\n skipInvalid?: boolean;\n}\n\nexport interface ApplyPolicyActionToControlsResult {\n /**\n * Values actually written to `data.ctrl`, after offset, truncation, and clamping.\n */\n applied: number[];\n /**\n * Actuator indices that were not written because the corresponding action value\n * was not finite and `skipInvalid` was enabled.\n */\n skipped: number[];\n actuatorOffset: number;\n}\n\nexport function clampPolicyActionValue(\n model: MujocoModel,\n actuatorIndex: number,\n value: number\n) {\n const ranges = model.actuator_ctrlrange;\n const min = ranges?.[actuatorIndex * 2] ?? -Infinity;\n const max = ranges?.[actuatorIndex * 2 + 1] ?? Infinity;\n return Math.max(min, Math.min(max, value));\n}\n\nexport function applyPolicyActionToControls(\n model: MujocoModel,\n data: MujocoData,\n action: PolicyVector,\n options: ApplyPolicyActionToControlsOptions = {}\n): ApplyPolicyActionToControlsResult {\n const actuatorOffset = options.actuatorOffset ?? 0;\n const actionSize = options.actionSize ?? action.length;\n const shouldClamp = options.clamp ?? true;\n const shouldSkipInvalid = options.skipInvalid ?? true;\n const count = Math.max(\n 0,\n Math.min(actionSize, action.length, data.ctrl.length - actuatorOffset, model.nu - actuatorOffset)\n );\n const applied: number[] = [];\n const skipped: number[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const actuatorIndex = actuatorOffset + index;\n const value = Number(action[index]);\n if (shouldSkipInvalid && !Number.isFinite(value)) {\n skipped.push(actuatorIndex);\n continue;\n }\n const nextValue = shouldClamp\n ? clampPolicyActionValue(model, actuatorIndex, value)\n : value;\n data.ctrl[actuatorIndex] = nextValue;\n applied.push(nextValue);\n }\n\n return { applied, skipped, actuatorOffset };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useCtrlNoise — control noise / perturbation hook (spec 3.2)\n */\n\nimport { useRef } from 'react';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\n\ninterface CtrlNoiseConfig {\n /** Exponential filter rate (0-1). Higher = faster noise changes. Default: 0.01. */\n rate?: number;\n /** Standard deviation of Gaussian noise. Default: 0.05. */\n std?: number;\n /** Enable/disable. Default: true. */\n enabled?: boolean;\n}\n\n/**\n * Apply Gaussian noise with exponential filtering to all ctrl values.\n * Useful for robustness testing and domain randomization.\n *\n * noise[i] = (1 - rate) * noise[i] + rate * N(0, std)\n * data.ctrl[i] += noise[i]\n */\nexport function useCtrlNoise(config: CtrlNoiseConfig = {}) {\n const { mjModelRef } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n const noiseRef = useRef<Float64Array | null>(null);\n\n useBeforePhysicsStep(({ data }) => {\n const cfg = configRef.current;\n if (cfg.enabled === false) return;\n\n const rate = cfg.rate ?? 0.01;\n const std = cfg.std ?? 0.05;\n const nu = mjModelRef.current?.nu ?? 0;\n if (nu === 0) return;\n\n // Initialize noise buffer\n if (!noiseRef.current || noiseRef.current.length !== nu) {\n noiseRef.current = new Float64Array(nu);\n }\n\n const noise = noiseRef.current;\n for (let i = 0; i < nu; i++) {\n // Box-Muller transform for Gaussian noise\n const u1 = Math.random();\n const u2 = Math.random();\n const gaussian = Math.sqrt(-2 * Math.log(u1)) * Math.cos(2 * Math.PI * u2);\n\n // Exponential filter\n noise[i] = (1 - rate) * noise[i] + rate * gaussian * std;\n data.ctrl[i] += noise[i];\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useBodyMeshes — returns Three.js meshes belonging to a MuJoCo body.\n *\n * Low-level primitive for custom selection visuals, outlines,\n * postprocessing effects, or any per-body mesh manipulation.\n */\n\nimport { useMemo } from 'react';\nimport { useThree } from '@react-three/fiber';\nimport * as THREE from 'three';\n\n/**\n * Returns all Three.js meshes belonging to the given MuJoCo body ID.\n *\n * @example\n * ```tsx\n * const meshes = useBodyMeshes(selectedBodyId);\n *\n * // Use with drei Outline\n * <Outline selection={meshes} />\n *\n * // Or manipulate directly\n * useFrame(() => {\n * meshes.forEach(m => { m.scale.setScalar(1.05); });\n * });\n * ```\n */\nexport function useBodyMeshes(bodyId: number | null): THREE.Mesh[] {\n const { scene } = useThree();\n\n return useMemo(() => {\n if (bodyId === null || bodyId < 0) return [];\n\n const meshes: THREE.Mesh[] = [];\n scene.traverse((obj) => {\n if (obj.userData.bodyID === bodyId && (obj as THREE.Mesh).isMesh) {\n meshes.push(obj as THREE.Mesh);\n }\n });\n return meshes;\n }, [bodyId, scene]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSelectionHighlight — convenience hook for emissive body highlights.\n *\n * Built on useBodyMeshes. For custom visuals, use useBodyMeshes directly.\n */\n\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useBodyMeshes } from './useBodyMeshes';\n\nexport function useSelectionHighlight(\n bodyId: number | null,\n options: { color?: string; emissiveIntensity?: number } = {},\n) {\n const { color = '#ff4444', emissiveIntensity = 0.3 } = options;\n const meshes = useBodyMeshes(bodyId);\n const prevRef = useRef<{ mesh: THREE.Mesh; originalEmissive: THREE.Color; originalIntensity: number }[]>([]);\n\n useEffect(() => {\n // Restore previous\n for (const entry of prevRef.current) {\n const mat = entry.mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n mat.emissive.copy(entry.originalEmissive);\n mat.emissiveIntensity = entry.originalIntensity;\n }\n }\n prevRef.current = [];\n\n // Apply new\n const highlightColor = new THREE.Color(color);\n for (const mesh of meshes) {\n const mat = mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n prevRef.current.push({\n mesh,\n originalEmissive: mat.emissive.clone(),\n originalIntensity: mat.emissiveIntensity ?? 0,\n });\n mat.emissive.copy(highlightColor);\n mat.emissiveIntensity = emissiveIntensity;\n }\n }\n\n return () => {\n for (const entry of prevRef.current) {\n const mat = entry.mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n mat.emissive.copy(entry.originalEmissive);\n mat.emissiveIntensity = entry.originalIntensity;\n }\n }\n prevRef.current = [];\n };\n }, [meshes, color, emissiveIntensity]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useCameraAnimation — composable camera animation hook.\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport * as THREE from 'three';\n\nexport interface CameraAnimationAPI {\n getCameraState(): { position: THREE.Vector3; target: THREE.Vector3 };\n moveCameraTo(position: THREE.Vector3, target: THREE.Vector3, durationMs: number): Promise<void>;\n}\n\n/**\n * Standalone hook for animated camera transitions.\n *\n * Manages its own `useFrame` callback — drop it into any component inside `<Canvas>`.\n */\nexport function useCameraAnimation(): CameraAnimationAPI {\n const { camera } = useThree();\n\n const orbitTargetRef = useRef(new THREE.Vector3(0, 0, 0));\n\n const cameraAnimRef = useRef({\n active: false,\n startPos: new THREE.Vector3(),\n endPos: new THREE.Vector3(),\n startRot: new THREE.Quaternion(),\n endRot: new THREE.Quaternion(),\n startTarget: new THREE.Vector3(),\n endTarget: new THREE.Vector3(),\n startTime: 0,\n duration: 0,\n resolve: null as (() => void) | null,\n });\n\n useFrame((state) => {\n const ca = cameraAnimRef.current;\n if (!ca.active) return;\n\n const now = performance.now();\n const progress = Math.min((now - ca.startTime) / ca.duration, 1.0);\n const ease =\n progress < 0.5\n ? 4 * progress * progress * progress\n : 1 - Math.pow(-2 * progress + 2, 3) / 2;\n\n camera.position.lerpVectors(ca.startPos, ca.endPos, ease);\n camera.quaternion.slerpQuaternions(ca.startRot, ca.endRot, ease);\n orbitTargetRef.current.lerpVectors(ca.startTarget, ca.endTarget, ease);\n\n const orbitControls = state.controls as { target?: THREE.Vector3 };\n if (orbitControls?.target) {\n orbitControls.target.copy(orbitTargetRef.current);\n }\n\n if (progress >= 1.0) {\n ca.active = false;\n camera.position.copy(ca.endPos);\n camera.quaternion.copy(ca.endRot);\n orbitTargetRef.current.copy(ca.endTarget);\n ca.resolve?.();\n ca.resolve = null;\n }\n });\n\n const getCameraState = useCallback(\n (): { position: THREE.Vector3; target: THREE.Vector3 } => ({\n position: camera.position.clone(),\n target: orbitTargetRef.current.clone(),\n }),\n [camera],\n );\n\n const moveCameraTo = useCallback(\n (position: THREE.Vector3, target: THREE.Vector3, durationMs: number): Promise<void> => {\n return new Promise((resolve) => {\n const ca = cameraAnimRef.current;\n ca.active = true;\n ca.startTime = performance.now();\n ca.duration = durationMs;\n ca.startPos.copy(camera.position);\n ca.startRot.copy(camera.quaternion);\n ca.startTarget.copy(orbitTargetRef.current);\n ca.endPos.copy(position);\n ca.endTarget.copy(target);\n const dummyCam = (camera as THREE.PerspectiveCamera).clone();\n dummyCam.position.copy(position);\n dummyCam.lookAt(target);\n ca.endRot.copy(dummyCam.quaternion);\n ca.resolve = resolve;\n setTimeout(resolve, durationMs + 100);\n });\n },\n [camera],\n );\n\n return { getCameraState, moveCameraTo };\n}\n"]}
|