mujoco-react 5.0.0 → 6.0.1
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 +14 -7
- package/dist/index.d.ts +31 -22
- package/dist/index.js +69 -68
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/hooks/useBodyMeshes.ts +45 -0
- package/src/hooks/useSelectionHighlight.ts +23 -29
- package/src/index.ts +1 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/MujocoProvider.tsx","../src/types.ts","../src/rendering/CapsuleGeometry.ts","../src/rendering/Reflector.ts","../src/rendering/GeomBuilder.ts","../src/core/SceneLoader.ts","../src/components/SceneRenderer.tsx","../src/core/MujocoSimProvider.tsx","../src/core/MujocoCanvas.tsx","../src/core/MujocoPhysics.tsx","../src/core/createController.tsx","../src/core/IkContext.tsx","../src/core/GenericIK.ts","../src/components/IkController.tsx","../src/components/IkGizmo.tsx","../src/components/ContactMarkers.tsx","../src/components/DragInteraction.tsx","../src/hooks/useSceneLights.ts","../src/components/SceneLights.tsx","../src/components/Debug.tsx","../src/components/TendonRenderer.tsx","../src/components/FlexRenderer.tsx","../src/hooks/useContacts.ts","../src/components/ContactListener.tsx","../src/hooks/useTrajectoryPlayer.ts","../src/components/TrajectoryPlayer.tsx","../src/hooks/useSelectionHighlight.ts","../src/components/SelectionHighlight.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/useCtrl.ts","../src/hooks/useKeyboardTeleop.ts","../src/hooks/usePolicy.ts","../src/hooks/useTrajectoryRecorder.ts","../src/hooks/useGamepad.ts","../src/hooks/useVideoRecorder.ts","../src/hooks/useCtrlNoise.ts","../src/hooks/useCameraAnimation.ts"],"names":["THREE","THREE2","THREE3","useRef","useEffect","THREE4","jsx","THREE5","createContext","useContext","useState","api","useFrame","useMemo","MujocoCanvas","forwardRef","MujocoPhysics","s","tmp","THREE6","useCallback","THREE7","useThree","THREE8","jsxs","THREE9","THREE10","_quat","THREE12","THREE13","THREE14","_mat4","THREE15","SENSOR_TYPE_NAMES","THREE16","THREE17"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport loadMujoco from 'mujoco-js';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport { 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\ninterface MujocoProviderProps {\n wasmUrl?: string;\n /** Timeout in ms for WASM module load. Default: 30000. */\n timeout?: number;\n children: React.ReactNode;\n onError?: (error: Error) => void;\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({ wasmUrl, timeout = 30000, children, onError }: 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\n useEffect(() => {\n isMounted.current = true;\n\n const wasmPromise = loadMujoco({\n ...(wasmUrl ? { locateFile: (path: string) => path.endsWith('.wasm') ? wasmUrl : 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 moduleRef.current = inst as MujocoModule;\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 onError?.(new Error(msg));\n }\n });\n\n return () => {\n isMounted.current = false;\n };\n }, [wasmUrl, 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\nimport type { CanvasProps } from '@react-three/fiber';\nimport * as THREE from 'three';\n\n// ---- MuJoCo WASM Types ----\n\n/**\n * A single MuJoCo contact from the WASM module.\n * Accessed via `data.contact.get(i)`.\n */\nexport interface MujocoContact {\n geom1: number;\n geom2: number;\n pos: Float64Array;\n frame: Float64Array;\n dist: number;\n}\n\n/**\n * WASM contact array — supports indexed access via `.get(i)`.\n */\nexport interface MujocoContactArray {\n get(i: number): MujocoContact | undefined;\n}\n\n/**\n * Read a single contact from the WASM contact array.\n * Returns undefined if the access fails (WASM heap issue, bad index, etc.).\n */\nexport function getContact(data: MujocoData, i: number): MujocoContact | undefined {\n try {\n return data.contact.get(i);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Minimal interface for MuJoCo Model to avoid 'any'.\n */\nexport interface MujocoModel {\n // Counts\n nbody: number;\n ngeom: number;\n nsite: number;\n nu: number;\n njnt: number;\n nq: number;\n nv: number;\n nkey: number;\n nsensor: number;\n nsensordata: number;\n nlight: number;\n ntendon: number;\n nflex: number;\n nmesh: number;\n nmat: number;\n\n // Name tables\n names: Int8Array;\n name_bodyadr: Int32Array;\n name_jntadr: Int32Array;\n name_geomadr: Int32Array;\n name_siteadr: Int32Array;\n name_actuatoradr: Int32Array;\n name_keyadr: Int32Array;\n name_sensoradr: Int32Array;\n name_tendonadr: Int32Array;\n\n // Body\n body_mass: Float64Array;\n body_parentid: Int32Array;\n body_jntnum: Int32Array;\n body_jntadr: Int32Array;\n body_pos: Float64Array;\n body_quat: Float64Array;\n body_geomnum: Int32Array;\n body_geomadr: Int32Array;\n body_inertia: Float64Array;\n\n // Default configuration\n qpos0: Float64Array;\n\n // Joint\n jnt_qposadr: Int32Array;\n jnt_dofadr: Int32Array;\n jnt_type: Int32Array;\n jnt_range: Float64Array;\n jnt_bodyid: Int32Array;\n jnt_pos: Float64Array;\n jnt_axis: Float64Array;\n jnt_limited: Uint8Array;\n\n // Geom\n geom_group: Int32Array;\n geom_type: Int32Array;\n geom_size: Float64Array;\n geom_pos: Float64Array;\n geom_quat: Float64Array;\n geom_matid: Int32Array;\n geom_rgba: Float32Array;\n geom_dataid: Int32Array;\n geom_bodyid: Int32Array;\n geom_contype: Int32Array;\n geom_conaffinity: Int32Array;\n geom_friction: Float64Array;\n\n // Material\n mat_rgba: Float32Array;\n\n // Mesh\n mesh_vertadr: Int32Array;\n mesh_vertnum: Int32Array;\n mesh_faceadr: Int32Array;\n mesh_facenum: Int32Array;\n mesh_vert: Float32Array;\n mesh_face: Int32Array;\n mesh_normal: Float32Array;\n\n // Site\n site_bodyid: Int32Array;\n\n // Actuator\n actuator_trnid: Int32Array;\n actuator_ctrlrange: Float64Array;\n actuator_trntype: Int32Array;\n actuator_gainprm: Float64Array;\n actuator_biasprm: Float64Array;\n\n // Sensor\n sensor_type: Int32Array;\n sensor_dim: Int32Array;\n sensor_adr: Int32Array;\n sensor_objtype: Int32Array;\n sensor_objid: Int32Array;\n\n // Keyframe\n key_qpos: Float64Array;\n key_ctrl: Float64Array;\n key_time: Float64Array;\n key_qvel: Float64Array;\n\n // Light\n light_pos: Float64Array;\n light_dir: Float64Array;\n light_diffuse: Float32Array;\n light_specular: Float32Array;\n light_type: Int32Array;\n light_active: Uint8Array;\n light_castshadow: Uint8Array;\n light_attenuation: Float32Array;\n light_cutoff: Float32Array;\n light_exponent: Float32Array;\n light_intensity: Float32Array;\n\n // Tendon\n ten_wrapadr: Int32Array;\n ten_wrapnum: Int32Array;\n ten_range: Float64Array;\n ten_rgba: Float32Array;\n ten_width: Float64Array;\n\n // Flex\n flex_vertadr: Int32Array;\n flex_vertnum: Int32Array;\n flex_faceadr: Int32Array;\n flex_facenum: Int32Array;\n flex_face: Int32Array;\n flex_rgba: Float32Array;\n\n // Model options\n opt: {\n timestep: number;\n gravity: Float64Array;\n integrator: number;\n [key: string]: unknown;\n };\n\n delete: () => void;\n [key: string]: unknown;\n}\n\n/**\n * Minimal interface for MuJoCo Data to avoid 'any'.\n */\nexport interface MujocoData {\n time: number;\n qpos: Float64Array;\n qvel: Float64Array;\n ctrl: Float64Array;\n act: Float64Array;\n xpos: Float64Array;\n xquat: Float64Array;\n xfrc_applied: Float64Array;\n qfrc_applied: Float64Array;\n qfrc_bias: Float64Array;\n site_xpos: Float64Array;\n site_xmat: Float64Array;\n sensordata: Float64Array;\n ncon: number;\n contact: MujocoContactArray;\n cvel: Float64Array;\n cfrc_ext: Float64Array;\n ten_length: Float64Array;\n wrap_xpos: Float64Array;\n ten_wrapadr: Int32Array;\n flexvert_xpos: Float64Array;\n geom_xpos: Float64Array;\n geom_xmat: Float64Array;\n delete: () => void;\n [key: string]: unknown;\n}\n\n/**\n * Minimal interface for the MuJoCo WASM Module.\n */\nexport interface MujocoModule {\n MjModel: { loadFromXML: (path: string) => MujocoModel; [key: string]: unknown };\n MjData: new (model: MujocoModel) => MujocoData;\n MjvOption: new () => { delete: () => void; [key: string]: unknown };\n mj_forward: (m: MujocoModel, d: MujocoData) => void;\n mj_step: (m: MujocoModel, d: MujocoData) => void;\n mj_resetData: (m: MujocoModel, d: MujocoData) => void;\n mj_step1: (m: MujocoModel, d: MujocoData) => void;\n mj_step2: (m: MujocoModel, d: MujocoData) => void;\n mj_applyFT: (\n model: MujocoModel,\n data: MujocoData,\n force: Float64Array,\n torque: Float64Array,\n point: Float64Array,\n bodyId: number,\n qfrc_target: Float64Array\n ) => void;\n mj_ray: (\n model: MujocoModel,\n data: MujocoData,\n pnt: Float64Array,\n vec: Float64Array,\n geomgroup: Uint8Array | null,\n flg_static: number,\n bodyexclude: number,\n geomid: Int32Array\n ) => number;\n mj_name2id: (model: MujocoModel, type: number, name: string) => number;\n mjtObj: Record<string, number>;\n mjtGeom: Record<string, number | {value: number}>;\n mjtJoint: Record<string, number | {value: number}>;\n mjtSensor: Record<string, number | {value: number}>;\n FS: {\n writeFile: (path: string, content: string | Uint8Array) => void;\n readFile: (path: string, opts?: { encoding: string }) => string | Uint8Array;\n mkdir: (path: string) => void;\n unmount: (path: string) => void;\n };\n [key: string]: unknown;\n}\n\n// ---- Scene Configuration ----\n\nexport interface SceneObject {\n name: string;\n type: 'box' | 'sphere' | 'cylinder';\n size: [number, number, number];\n position: [number, number, number];\n rgba: [number, number, number, number];\n mass?: number;\n freejoint?: boolean;\n friction?: string;\n solref?: string;\n solimp?: string;\n condim?: number;\n}\n\nexport interface XmlPatch {\n target: string;\n inject?: string;\n injectAfter?: string;\n replace?: [string, string];\n}\n\nexport interface SceneConfig {\n /** Base URL for fetching model files. The loader fetches `src + sceneFile` and follows dependencies. */\n src: string;\n /** Entry MJCF XML file name, e.g. 'scene.xml'. */\n sceneFile: string;\n sceneObjects?: SceneObject[];\n homeJoints?: number[];\n xmlPatches?: XmlPatch[];\n onReset?: (model: MujocoModel, data: MujocoData) => void;\n}\n\n// ---- IK Controller Config ----\n\nexport interface IkConfig {\n /** MuJoCo site name for IK target. */\n siteName: string;\n /** Number of joints to solve for. */\n numJoints: number;\n /** Custom IK solver. When omitted, uses built-in Damped Least-Squares solver. */\n ikSolveFn?: IKSolveFn;\n /** DLS damping. Default: 0.01. */\n damping?: number;\n /** Max solver iterations. Default: 50. */\n maxIterations?: number;\n}\n\nexport interface SceneMarker {\n id: number;\n position: THREE.Vector3;\n label: string;\n}\n\n// ---- Physics Config (spec 1.1) ----\n\nexport interface PhysicsConfig {\n gravity?: [number, number, number];\n timestep?: number;\n substeps?: number;\n paused?: boolean;\n speed?: number;\n}\n\n// ---- IK ----\n\nexport type IKSolveFn = (\n pos: THREE.Vector3,\n quat: THREE.Quaternion,\n currentQ: number[]\n) => number[] | null;\n\n// ---- Callbacks ----\n\nexport type PhysicsStepCallback = (\n model: MujocoModel,\n data: MujocoData\n) => void;\n\n// ---- State Management (spec 4.1) ----\n\nexport interface StateSnapshot {\n time: number;\n qpos: Float64Array;\n qvel: Float64Array;\n ctrl: Float64Array;\n act: Float64Array;\n qfrc_applied: Float64Array;\n}\n\n// ---- Model Introspection (spec 5.1) ----\n\nexport interface BodyInfo {\n id: number;\n name: string;\n mass: number;\n parentId: number;\n}\n\nexport interface JointInfo {\n id: number;\n name: string;\n type: number;\n typeName: string;\n range: [number, number];\n limited: boolean;\n bodyId: number;\n qposAdr: number;\n dofAdr: number;\n}\n\nexport interface GeomInfo {\n id: number;\n name: string;\n type: number;\n typeName: string;\n size: [number, number, number];\n bodyId: number;\n}\n\nexport interface SiteInfo {\n id: number;\n name: string;\n bodyId: number;\n}\n\nexport interface ActuatorInfo {\n id: number;\n name: string;\n range: [number, number];\n}\n\nexport interface SensorInfo {\n id: number;\n name: string;\n type: number;\n typeName: string;\n dim: number;\n adr: number;\n}\n\n// ---- Contacts (spec 2.4, 2.5) ----\n\nexport interface ContactInfo {\n geom1: number;\n geom1Name: string;\n geom2: number;\n geom2Name: string;\n pos: [number, number, number];\n depth: number;\n}\n\n// ---- Raycast (spec 7.1) ----\n\nexport interface RayHit {\n point: THREE.Vector3;\n bodyId: number;\n geomId: number;\n distance: number;\n}\n\n// ---- Model Options (spec 5.3) ----\n\nexport interface ModelOptions {\n timestep: number;\n gravity: [number, number, number];\n integrator: number;\n}\n\n// ---- Trajectory (spec 13.1, 13.2) ----\n\nexport interface TrajectoryFrame {\n time: number;\n qpos: Float64Array;\n qvel?: Float64Array;\n ctrl?: Float64Array;\n sensordata?: Float64Array;\n}\n\nexport interface TrajectoryData {\n frames: TrajectoryFrame[];\n fps: number;\n}\n\n// ---- Keyboard Teleop (spec 12.1) ----\n\nexport interface KeyBinding {\n actuator: string;\n delta?: number;\n toggle?: [number, number];\n set?: number;\n}\n\nexport interface KeyboardTeleopConfig {\n bindings: Record<string, KeyBinding>;\n enabled?: boolean;\n}\n\n// ---- Policy (spec 10.1) ----\n\nexport interface PolicyConfig {\n frequency: number;\n onObservation: (model: MujocoModel, data: MujocoData) => Float32Array | Float64Array | number[];\n onAction: (action: Float32Array | Float64Array | number[], model: MujocoModel, data: MujocoData) => void;\n}\n\n// ---- Debug Component (spec 6.1) ----\n\nexport interface DebugProps {\n showGeoms?: boolean;\n showSites?: boolean;\n showJoints?: boolean;\n showContacts?: boolean;\n showCOM?: boolean;\n showInertia?: boolean;\n showTendons?: boolean;\n}\n\n// ---- Component Props ----\n\nexport interface IkGizmoProps {\n siteName?: string;\n scale?: number;\n onDrag?: (position: THREE.Vector3, quaternion: THREE.Quaternion) => void;\n}\n\nexport interface DragInteractionProps {\n stiffness?: number;\n showArrow?: boolean;\n}\n\nexport interface SceneLightsProps {\n /** Override intensity for all MJCF lights. Default: 1.0. */\n intensity?: number;\n}\n\nexport interface TrajectoryPlayerProps {\n trajectory: number[][];\n fps?: number;\n loop?: boolean;\n playing?: boolean;\n onFrame?: (frameIdx: number) => void;\n}\n\nexport interface SelectionHighlightProps {\n bodyId: number | null;\n color?: string;\n emissiveIntensity?: number;\n}\n\nexport interface ContactListenerProps {\n body: string;\n onContactEnter?: (info: ContactInfo) => void;\n onContactExit?: (info: ContactInfo) => void;\n}\n\n// ---- Public API (spec: full surface) ----\n\nexport interface MujocoSimAPI {\n // State\n readonly status: 'loading' | 'ready' | 'error';\n readonly config: SceneConfig;\n\n // Simulation control (spec 1.1, 1.2, 1.3)\n reset(): void;\n setSpeed(multiplier: number): void;\n togglePause(): boolean;\n setPaused(paused: boolean): void;\n step(n?: number): void;\n getTime(): number;\n getTimestep(): number;\n applyKeyframe(nameOrIndex: string | number): void;\n\n // State management (spec 4.1, 4.2, 4.3)\n saveState(): StateSnapshot;\n restoreState(snapshot: StateSnapshot): void;\n setQpos(values: Float64Array | number[]): void;\n setQvel(values: Float64Array | number[]): void;\n getQpos(): Float64Array;\n getQvel(): Float64Array;\n\n // Actuator / control (spec 3.1)\n setCtrl(nameOrValues: string | Record<string, number>, value?: number): void;\n getCtrl(): Float64Array;\n\n // Force application (spec 8.1)\n applyForce(bodyName: string, force: THREE.Vector3, point?: THREE.Vector3): void;\n applyTorque(bodyName: string, torque: THREE.Vector3): void;\n setExternalForce(bodyName: string, force: THREE.Vector3, torque: THREE.Vector3): void;\n applyGeneralizedForce(values: Float64Array | number[]): void;\n\n // Sensors (spec 2.1)\n getSensorData(name: string): Float64Array | null;\n\n // Contacts (spec 2.4)\n getContacts(): ContactInfo[];\n\n // Model introspection (spec 5.1, 5.2)\n getBodies(): BodyInfo[];\n getJoints(): JointInfo[];\n getGeoms(): GeomInfo[];\n getSites(): SiteInfo[];\n getActuators(): ActuatorInfo[];\n getSensors(): SensorInfo[];\n\n // Model parameters (spec 5.3)\n getModelOption(): ModelOptions;\n setGravity(g: [number, number, number]): void;\n setTimestep(dt: number): void;\n\n // Raycasting (spec 7.1)\n raycast(origin: THREE.Vector3, direction: THREE.Vector3, maxDist?: number): RayHit | null;\n\n // Keyframes (spec 4.2)\n getKeyframeNames(): string[];\n getKeyframeCount(): number;\n\n // Model loading (spec 9.1)\n loadScene(newConfig: SceneConfig): Promise<void>;\n\n // Canvas\n getCanvasSnapshot(width?: number, height?: number, mimeType?: string): string;\n project2DTo3D(\n x: number,\n y: number,\n cameraPos: THREE.Vector3,\n lookAt: THREE.Vector3\n ): { point: THREE.Vector3; bodyId: number; geomId: number } | null;\n\n // Domain randomization (spec 10.3)\n setBodyMass(name: string, mass: number): void;\n setGeomFriction(name: string, friction: [number, number, number]): void;\n setGeomSize(name: string, size: [number, number, number]): void;\n\n // Internal refs for advanced use\n readonly mjModelRef: React.RefObject<MujocoModel | null>;\n readonly mjDataRef: React.RefObject<MujocoData | null>;\n}\n\n// ---- Canvas Props ----\n\nexport type MujocoCanvasProps = Omit<CanvasProps, 'onError'> & {\n config: SceneConfig;\n onReady?: (api: MujocoSimAPI) => void;\n onError?: (error: Error) => void;\n onStep?: (time: number) => void;\n onSelection?: (bodyId: number, name: string) => void;\n // Declarative physics config (spec 1.1)\n gravity?: [number, number, number];\n timestep?: number;\n substeps?: number;\n paused?: boolean;\n speed?: number;\n};\n\n// ---- Hook Return Types ----\n\nexport interface SitePositionResult {\n position: React.RefObject<THREE.Vector3>;\n quaternion: React.RefObject<THREE.Quaternion>;\n}\n\nexport interface MujocoContextValue {\n mujoco: MujocoModule | null;\n status: 'loading' | 'ready' | 'error';\n error: string | null;\n}\n\nexport interface SensorResult {\n value: React.RefObject<Float64Array>;\n size: number;\n}\n\nexport interface BodyStateResult {\n position: React.RefObject<THREE.Vector3>;\n quaternion: React.RefObject<THREE.Quaternion>;\n linearVelocity: React.RefObject<THREE.Vector3>;\n angularVelocity: React.RefObject<THREE.Vector3>;\n}\n\nexport interface JointStateResult {\n position: React.RefObject<number | Float64Array>;\n velocity: React.RefObject<number | Float64Array>;\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\n\nimport * as THREE from 'three';\n\n/**\n * Options for configuring the Reflector.\n */\nexport interface ReflectorOptions {\n color?: THREE.ColorRepresentation;\n textureWidth?: number;\n textureHeight?: number;\n clipBias?: number;\n multisample?: number;\n texture?: THREE.Texture;\n mixStrength?: number; // How strong the reflection is (0.0 - 1.0)\n}\n\ninterface ReflectorMesh extends THREE.Mesh {\n type: string;\n material: THREE.MeshPhysicalMaterial;\n // tslint:disable-next-line:no-any\n onBeforeRender: (renderer: any, scene: any, camera: any) => void;\n}\n\n/**\n * Reflector\n * Creates a reflective surface.\n */\nexport class Reflector extends THREE.Mesh {\n isReflector = true;\n camera: THREE.PerspectiveCamera;\n private reflectorPlane = new THREE.Plane();\n private normal = new THREE.Vector3();\n private reflectorWorldPosition = new THREE.Vector3();\n private cameraWorldPosition = new THREE.Vector3();\n private rotationMatrix = new THREE.Matrix4();\n private lookAtPosition = new THREE.Vector3(0, 0, -1);\n private clipPlane = new THREE.Vector4();\n private view = new THREE.Vector3();\n private target = new THREE.Vector3();\n private q = new THREE.Vector4();\n private textureMatrix = new THREE.Matrix4();\n private virtualCamera: THREE.PerspectiveCamera;\n private renderTarget: THREE.WebGLRenderTarget;\n\n constructor(geometry: THREE.BufferGeometry, options: ReflectorOptions = {}) {\n super(geometry);\n\n (this as unknown as ReflectorMesh).type = 'Reflector';\n this.camera = new THREE.PerspectiveCamera();\n\n const color = (options.color !== undefined) ? new THREE.Color(options.color) : new THREE.Color(0x7F7F7F);\n const textureWidth = options.textureWidth || 512;\n const textureHeight = options.textureHeight || 512;\n const clipBias = options.clipBias || 0;\n const multisample = (options.multisample !== undefined) ? options.multisample : 4;\n const blendTexture = options.texture || undefined;\n const mixStrength = (options.mixStrength !== undefined) ? options.mixStrength : 0.25; \n\n this.virtualCamera = this.camera;\n\n this.renderTarget = new THREE.WebGLRenderTarget(textureWidth, textureHeight, { \n samples: multisample, \n type: THREE.HalfFloatType \n });\n\n (this as unknown as ReflectorMesh).material = new THREE.MeshPhysicalMaterial({\n map: blendTexture,\n color,\n roughness: 0.5, \n metalness: 0.1, \n });\n\n (this as unknown as ReflectorMesh).material.onBeforeCompile = (shader) => {\n shader.uniforms.tDiffuse = { value: this.renderTarget.texture };\n shader.uniforms.textureMatrix = { value: this.textureMatrix };\n shader.uniforms.mixStrength = { value: mixStrength };\n\n // Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n const bodyStart = shader.vertexShader.indexOf('void main() {');\n shader.vertexShader =\n 'uniform mat4 textureMatrix;\\n' +\n 'varying vec4 vUvReflection;\\n' +\n shader.vertexShader.slice(0, bodyStart) +\n shader.vertexShader.slice(bodyStart, -1) +\n ' vUvReflection = textureMatrix * vec4( position, 1.0 );\\n' +\n '}';\n\n // Fragment Shader: Mix reflection with base material\n const fragmentBodyStart = shader.fragmentShader.indexOf('void main() {');\n shader.fragmentShader =\n 'uniform sampler2D tDiffuse;\\n' +\n 'uniform float mixStrength;\\n' +\n 'varying vec4 vUvReflection;\\n' +\n shader.fragmentShader.slice(0, fragmentBodyStart) +\n shader.fragmentShader.slice(fragmentBodyStart, -1) +\n ' vec4 reflectionColor = texture2DProj( tDiffuse, vUvReflection );\\n' +\n ' gl_FragColor = vec4( mix( gl_FragColor.rgb, reflectionColor.rgb, mixStrength ), gl_FragColor.a );\\n' +\n '}';\n };\n\n (this as THREE.Object3D).receiveShadow = true;\n\n (this as unknown as ReflectorMesh).onBeforeRender = (renderer: THREE.WebGLRenderer, scene: THREE.Scene, camera: THREE.Camera) => {\n this.reflectorWorldPosition.setFromMatrixPosition((this as THREE.Object3D).matrixWorld);\n this.cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld);\n\n this.rotationMatrix.extractRotation((this as THREE.Object3D).matrixWorld);\n\n this.normal.set(0, 0, 1);\n this.normal.applyMatrix4(this.rotationMatrix);\n\n this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition);\n\n // Avoid rendering when reflector is facing away\n if (this.view.dot(this.normal) > 0) return;\n\n this.view.reflect(this.normal).negate();\n this.view.add(this.reflectorWorldPosition);\n\n this.rotationMatrix.extractRotation(camera.matrixWorld);\n\n this.lookAtPosition.set(0, 0, -1);\n this.lookAtPosition.applyMatrix4(this.rotationMatrix);\n this.lookAtPosition.add(this.cameraWorldPosition);\n\n this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition);\n this.target.reflect(this.normal).negate();\n this.target.add(this.reflectorWorldPosition);\n\n this.virtualCamera.position.copy(this.view);\n this.virtualCamera.up.set(0, 1, 0);\n this.virtualCamera.up.applyMatrix4(this.rotationMatrix);\n this.virtualCamera.up.reflect(this.normal);\n this.virtualCamera.lookAt(this.target);\n\n this.virtualCamera.far = (camera as THREE.PerspectiveCamera).far; \n\n this.virtualCamera.updateMatrixWorld();\n this.virtualCamera.projectionMatrix.copy((camera as THREE.PerspectiveCamera).projectionMatrix);\n\n // Update the texture matrix\n this.textureMatrix.set(\n 0.5, 0.0, 0.0, 0.5,\n 0.0, 0.5, 0.0, 0.5,\n 0.0, 0.0, 0.5, 0.5,\n 0.0, 0.0, 0.0, 1.0\n );\n this.textureMatrix.multiply(this.virtualCamera.projectionMatrix);\n this.textureMatrix.multiply(this.virtualCamera.matrixWorldInverse);\n this.textureMatrix.multiply((this as THREE.Object3D).matrixWorld);\n\n // Now update projection matrix with new clip plane\n this.reflectorPlane.setFromNormalAndCoplanarPoint(this.normal, this.reflectorWorldPosition);\n this.reflectorPlane.applyMatrix4(this.virtualCamera.matrixWorldInverse);\n\n this.clipPlane.set(this.reflectorPlane.normal.x, this.reflectorPlane.normal.y, this.reflectorPlane.normal.z, this.reflectorPlane.constant);\n\n const projectionMatrix = this.virtualCamera.projectionMatrix;\n\n this.q.x = (Math.sign(this.clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];\n this.q.y = (Math.sign(this.clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];\n this.q.z = -1.0;\n this.q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];\n\n // Calculate the scaled plane vector\n this.clipPlane.multiplyScalar(2.0 / this.clipPlane.dot(this.q));\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = this.clipPlane.x;\n projectionMatrix.elements[6] = this.clipPlane.y;\n projectionMatrix.elements[10] = this.clipPlane.z + 1.0 - clipBias;\n projectionMatrix.elements[14] = this.clipPlane.w;\n\n // Render\n (this as THREE.Object3D).visible = false;\n\n const currentRenderTarget = renderer.getRenderTarget();\n const currentXrEnabled = renderer.xr.enabled;\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\n renderer.xr.enabled = false; \n renderer.shadowMap.autoUpdate = false; \n\n renderer.setRenderTarget(this.renderTarget);\n\n renderer.state.buffers.depth.setMask(true); \n\n if (renderer.autoClear === false) renderer.clear();\n renderer.render(scene, this.virtualCamera);\n\n renderer.xr.enabled = currentXrEnabled;\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\n renderer.setRenderTarget(currentRenderTarget);\n\n // Restore viewport\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const viewport = (camera as any).viewport;\n if (viewport !== undefined) {\n renderer.state.viewport(viewport);\n }\n\n (this as THREE.Object3D).visible = true;\n };\n }\n\n getRenderTarget() {\n return this.renderTarget;\n }\n\n dispose() {\n this.renderTarget.dispose();\n const mesh = this as THREE.Mesh;\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((m) => m.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n}","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\nimport { CapsuleGeometry } from './CapsuleGeometry';\nimport { Reflector } from './Reflector';\nimport { MujocoModel, MujocoModule } from '../types';\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\n constructor(mujoco: MujocoModule) {\n this.mujoco = mujoco;\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 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 versions of the mujoco-js bindings.\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 we need a finite mesh for Three.js. \n // Fallback reduced to 5m to match grid as requested.\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 geo.computeVertexNormals(); // Auto-calculate smooth lighting normals\n }\n\n // 5. Construct the final Mesh\n if (geo) {\n let mesh;\n // Special handling for the floor plane to make it shiny\n if (type === getVal(MG.mjGEOM_PLANE)) {\n mesh = new Reflector(geo, {\n clipBias: 0.003,\n textureWidth: 1024, textureHeight: 1024,\n color,\n mixStrength: 0.25\n });\n } else {\n // Standard physical material for everything else\n mesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({\n color,\n transparent: opacity < 1,\n opacity,\n roughness: 0.6,\n metalness: 0.2\n }));\n // Enable shadows\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n }\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\n return mesh;\n }\n\n return null;\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MujocoData, MujocoModel, MujocoModule } from '../types';\nimport { SceneConfig, SceneObject, XmlPatch } from '../types';\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 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\n/**\n * Convert a SceneObject config to MuJoCo XML.\n */\nfunction sceneObjectToXml(obj: SceneObject): string {\n const joint = obj.freejoint ? '<freejoint/>' : '';\n const pos = obj.position.map((v) => v.toFixed(3)).join(' ');\n const size = obj.size.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 // Always set contype/conaffinity=1 so objects collide regardless of model defaults\n return `<body name=\"${obj.name}\" pos=\"${pos}\">${joint}<geom type=\"${obj.type}\" size=\"${size}\" rgba=\"${rgba}\" contype=\"1\" conaffinity=\"1\"${mass}${friction}${solref}${solimp}${condim}/></body>`;\n}\n\ninterface LoadResult {\n mjModel: MujocoModel;\n mjData: MujocoData;\n}\n\n/**\n * Config-driven scene loader — replaces the old RobotLoader + patchSingleRobot approach.\n */\nexport async function loadScene(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\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 downloaded = new Set<string>();\n const queue: string[] = [config.sceneFile];\n const parser = new DOMParser();\n\n // 2. Download all model files\n while (queue.length > 0) {\n const fname = queue.shift()!;\n if (downloaded.has(fname)) continue;\n downloaded.add(fname);\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 // Create virtual directory structure\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 if (fname.endsWith('.xml')) {\n let text = await res.text();\n\n // 3. Apply XML patches from config\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 (text.includes(from)) {\n text = text.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 = text.indexOf(patch.injectAfter);\n if (idx !== -1) {\n // Find the end of the opening tag (next '>') after the match\n const tagEnd = text.indexOf('>', idx + patch.injectAfter.length);\n if (tagEnd !== -1) {\n text = text.slice(0, tagEnd + 1) + patch.inject + text.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 // 4. Inject scene objects into the scene file\n if (fname === config.sceneFile && config.sceneObjects?.length) {\n const xml = config.sceneObjects.map((obj) => sceneObjectToXml(obj)).join('');\n text = text.replace('</worldbody>', xml + '</worldbody>');\n }\n\n mujoco.FS.writeFile(`/working/${fname}`, text);\n scanDependencies(text, fname, parser, downloaded, queue);\n } else {\n const buffer = new Uint8Array(await res.arrayBuffer());\n mujoco.FS.writeFile(`/working/${fname}`, buffer);\n }\n }\n\n // 5. Load model\n onProgress?.('Loading model...');\n const mjModel = mujoco.MjModel.loadFromXML(`/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 if (config.homeJoints) {\n const homeCount = Math.min(config.homeJoints.length, mjModel.nu);\n for (let i = 0; i < homeCount; i++) {\n mjData.ctrl[i] = config.homeJoints[i];\n const qposAdr = getActuatedScalarQposAdr(mjModel, i);\n if (qposAdr !== -1) {\n mjData.qpos[qposAdr] = config.homeJoints[i];\n }\n }\n }\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 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 xmlDoc.querySelectorAll('[file]').forEach((el) => {\n const fileAttr = el.getAttribute('file');\n if (!fileAttr) 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 let fullPath = (currentDir + prefix + fileAttr).replace(/\\/\\//g, '/');\n const parts = fullPath.split('/');\n const norm: string[] = [];\n for (const p of parts) {\n if (p === '..') norm.pop();\n else if (p !== '.') norm.push(p);\n }\n fullPath = norm.join('/');\n\n if (!downloaded.has(fullPath)) queue.push(fullPath);\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 { useEffect, useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport { GeomBuilder } from '../rendering/GeomBuilder';\nimport { MujocoModel } from '../types';\nimport { getName } from '../core/SceneLoader';\nimport { useMujoco } 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 function SceneRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, mujocoRef, onSelectionRef, status } = useMujoco();\n const groupRef = useRef<THREE.Group>(null);\n const bodyRefs = useRef<(THREE.Group | null)[]>([]);\n const prevModelRef = useRef<MujocoModel | null>(null);\n\n const geomBuilder = useMemo(() => {\n if (status !== 'ready') return null;\n return new GeomBuilder(mujocoRef.current);\n }, [status, mujocoRef]);\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 (prevModelRef.current === model) return;\n prevModelRef.current = model;\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\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 group.add(bodyGroup);\n refs.push(bodyGroup);\n }\n bodyRefs.current = refs;\n }, [status, geomBuilder, mjModelRef]);\n\n // Sync body positions from mjData every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data) return;\n const bodies = bodyRefs.current;\n for (let i = 0; i < bodies.length; i++) {\n const ref = bodies[i];\n if (!ref) continue;\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\n return (\n <group\n {...props}\n ref={groupRef}\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, name);\n }\n }\n }}\n />\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 } from '../types';\nimport { SceneRenderer } from '../components/SceneRenderer';\nimport {\n ActuatorInfo,\n BodyInfo,\n ContactInfo,\n GeomInfo,\n JointInfo,\n ModelOptions,\n MujocoSimAPI,\n PhysicsStepCallback,\n RayHit,\n SceneConfig,\n SensorInfo,\n SiteInfo,\n StateSnapshot,\n} from '../types';\nimport {\n loadScene,\n findKeyframeByName,\n findBodyByName,\n findGeomByName,\n findSensorByName,\n findActuatorByName,\n getActuatedScalarQposAdr,\n getName,\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\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\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 onSelectionRef: React.RefObject<\n ((bodyId: number, name: string) => void) | undefined\n >;\n beforeStepCallbacks: React.RefObject<Set<PhysicsStepCallback>>;\n afterStepCallbacks: React.RefObject<Set<PhysicsStepCallback>>;\n resetCallbacks: React.RefObject<Set<() => void>>;\n status: 'loading' | 'ready' | 'error';\n}\n\nconst MujocoSimContext = createContext<MujocoSimContextValue | null>(null);\n\nexport function useMujoco(): 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 useBeforePhysicsStep(callback: PhysicsStepCallback) {\n const { beforeStepCallbacks } = useMujoco();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (model, data) => callbackRef.current(model, data);\n beforeStepCallbacks.current.add(wrapped);\n return () => { beforeStepCallbacks.current.delete(wrapped); };\n }, [beforeStepCallbacks]);\n}\n\nexport function useAfterPhysicsStep(callback: PhysicsStepCallback) {\n const { afterStepCallbacks } = useMujoco();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (model, data) => callbackRef.current(model, data);\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?: (api: MujocoSimAPI) => void;\n onError?: (error: Error) => void;\n onStep?: (time: number) => void;\n onSelection?: (bodyId: number, name: string) => void;\n // Declarative physics config props\n gravity?: [number, number, number];\n timestep?: number;\n substeps?: number;\n paused?: boolean;\n speed?: number;\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 children,\n}: MujocoSimProviderProps) {\n const { gl, camera } = 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 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\n configRef.current = config;\n\n // Sync declarative props to refs\n useEffect(() => { pausedRef.current = paused ?? false; }, [paused]);\n useEffect(() => { speedRef.current = speed ?? 1; }, [speed]);\n useEffect(() => { substepsRef.current = substeps ?? 1; }, [substeps]);\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 // --- Load scene on mount ---\n useEffect(() => {\n let disposed = false;\n\n (async () => {\n try {\n const result = await loadScene(mujoco, config);\n if (disposed) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\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 setStatus('error');\n onError?.(e instanceof Error ? e : new Error(String(e)));\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 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 {\n (externalApiRef as React.MutableRefObject<MujocoSimAPI | null>).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 // Step physics with substeps\n const numSubsteps = substepsRef.current;\n if (stepsToRunRef.current > 0) {\n for (let s = 0; s < stepsToRunRef.current; s++) {\n mujoco.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 mujoco.mj_step(model, data);\n }\n }\n }\n\n // After-step callbacks\n for (const cb of afterStepCallbacks.current) {\n cb(model, data);\n }\n\n onStepRef.current?.(data.time);\n }, -1);\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 mujoco.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 mujoco.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 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 mujoco.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 mujoco.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 for (let i = 0; i < ncon; i++) {\n const c = getContact(data, 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 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 limited = model.jnt_limited ? model.jnt_limited[i] !== 0 : false;\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: [model.jnt_range[2 * i], model.jnt_range[2 * i + 1]],\n limited,\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 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 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 mujoco.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, 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 configRef.current = newConfig;\n\n setStatus('ready');\n } catch (e) {\n if (gen !== loadGenRef.current) return;\n setStatus('error');\n throw e;\n }\n }, [mujoco]);\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 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 // --- 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 config,\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 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 getModelOption,\n setGravity,\n setTimestep: setTimestepApi,\n raycast,\n getKeyframeNames,\n getKeyframeCount,\n loadScene: loadSceneApi,\n getCanvasSnapshot,\n project2DTo3D,\n setBodyMass,\n setGeomFriction,\n setGeomSize,\n mjModelRef,\n mjDataRef,\n }),\n [\n status, config, reset, setSpeed, togglePause, setPaused, step,\n getTime, getTimestep, applyKeyframe, saveState, restoreState,\n setQpos, setQvel, getQpos, getQvel, setCtrl, getCtrl,\n applyForce, applyTorqueApi, setExternalForce, applyGeneralizedForce,\n getSensorData, getContacts, getBodies, getJoints, getGeoms, getSites,\n getActuatorsApi, getSensors, getModelOption, setGravity, setTimestepApi,\n raycast, getKeyframeNames, getKeyframeCount, loadSceneApi,\n getCanvasSnapshot, project2DTo3D,\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 onSelectionRef,\n beforeStepCallbacks,\n afterStepCallbacks,\n resetCallbacks,\n status,\n }),\n [api, status]\n );\n\n return (\n <MujocoSimContext.Provider value={contextValue}>\n <SceneRenderer />\n {children}\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 } 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 children,\n ...canvasProps\n },\n ref\n ) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujocoWasm();\n\n useEffect(() => {\n if (wasmStatus === 'error' && onError) {\n onError(new Error(wasmError ?? 'WASM load failed'));\n }\n }, [wasmStatus, wasmError, onError]);\n\n if (wasmStatus === 'error' || wasmStatus === 'loading' || !mujoco) {\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 >\n {children}\n </MujocoSimProvider>\n </Canvas>\n );\n }\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { forwardRef, useEffect } from 'react';\nimport { useMujocoWasm } from './MujocoProvider';\nimport { MujocoSimProvider } from './MujocoSimProvider';\nimport type { MujocoSimAPI, SceneConfig } 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?: (api: MujocoSimAPI) => void;\n /** Fires on scene load failure. */\n onError?: (error: Error) => void;\n /** Called each physics step. */\n onStep?: (time: number) => void;\n /** Called on body double-click selection. */\n onSelection?: (bodyId: number, name: string) => 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 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\n useEffect(() => {\n if (wasmStatus === 'error' && onError) {\n onError(new Error(wasmError ?? 'WASM load failed'));\n }\n }, [wasmStatus, wasmError, onError]);\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 * createController — typed factory for BYOC (Bring Your Own Controller) plugins.\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 * useBeforePhysicsStep((_model, data) => {\n * data.ctrl[0] = 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 * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * IkContext — React context for the IK controller plugin.\n */\n\nimport { createContext, useContext } from 'react';\nimport * as THREE from 'three';\n\nexport interface IkContextValue {\n ikEnabledRef: React.RefObject<boolean>;\n ikCalculatingRef: React.RefObject<boolean>;\n ikTargetRef: React.RefObject<THREE.Group>;\n siteIdRef: React.RefObject<number>;\n setIkEnabled(enabled: boolean): void;\n moveTarget(pos: THREE.Vector3, duration?: number): void;\n syncTargetToSite(): void;\n solveIK(pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null;\n getGizmoStats(): { pos: THREE.Vector3; rot: THREE.Euler } | null;\n}\n\nexport const IkContext = createContext<IkContextValue | null>(null);\n\n/**\n * Access the IK controller context.\n *\n * - `useIk()` — throws if no `<IkController>` ancestor (use inside `<IkController>`)\n * - `useIk({ optional: true })` — returns `null` if no ancestor (use in components\n * that optionally interact with IK, e.g. keyboard controllers that disable IK)\n */\nexport function useIk(): IkContextValue;\nexport function useIk(options: { optional: true }): IkContextValue | null;\nexport function useIk(options?: { optional?: boolean }): IkContextValue | null {\n const ctx = useContext(IkContext);\n if (!ctx && !options?.optional) {\n throw new Error('useIk() must be used inside an <IkController>');\n }\n return ctx;\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}\n\nconst DEFAULTS: GenericIKOptions = {\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\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 numJoints Number of arm joints (assumes qpos[0..numJoints-1])\n * @param targetPos Target position in world frame\n * @param targetQuat Target orientation in world frame\n * @param currentQ Current joint angles (length = numJoints)\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 numJoints: number,\n targetPos: THREE.Vector3,\n targetQuat: THREE.Quaternion,\n currentQ: number[],\n opts?: Partial<GenericIKOptions>\n ): number[] | null {\n const o = { ...DEFAULTS, ...opts };\n const n = numJoints;\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\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[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 saved = data.qpos[j];\n data.qpos[j] = 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[j] = saved;\n }\n\n // Restore base FK state for next iteration\n for (let i = 0; i < n; i++) data.qpos[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 * IkController — composable IK controller plugin.\n * Extracts all IK logic from MujocoSimProvider into an opt-in component.\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { createController } from '../core/createController';\nimport { IkContext, type IkContextValue } from '../core/IkContext';\nimport { useMujoco, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { GenericIK } from '../core/GenericIK';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { IkConfig, IKSolveFn, 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\nfunction IkControllerImpl({\n config,\n children,\n}: {\n config: IkConfig;\n children?: React.ReactNode;\n}) {\n const { mjModelRef, mjDataRef, mujocoRef, configRef, resetCallbacks, status } =\n useMujoco();\n\n // All IK state lives here, NOT in the provider\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 genericIkRef = useRef<GenericIK>(new GenericIK(mujocoRef.current));\n const firstIkEnableRef = useRef(true);\n\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 when model loads or config changes\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n return;\n }\n siteIdRef.current = findSiteByName(model, config.siteName);\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n }, [config.siteName, status, mjModelRef, mjDataRef]);\n\n // IK solve function — use custom solver if provided, otherwise built-in GenericIK\n const ikSolveFn = useCallback(\n (pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null => {\n if (config.ikSolveFn) return config.ikSolveFn(pos, quat, currentQ);\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || siteIdRef.current === -1) return null;\n return genericIkRef.current.solve(\n model,\n data,\n siteIdRef.current,\n config.numJoints,\n pos,\n quat,\n currentQ,\n {\n damping: config.damping,\n maxIterations: config.maxIterations,\n },\n );\n },\n [config.ikSolveFn, config.numJoints, config.damping, config.maxIterations, mjModelRef, mjDataRef],\n );\n const ikSolveFnRef = useRef<IKSolveFn>(ikSolveFn);\n ikSolveFnRef.current = ikSolveFn;\n\n // Gizmo animation + one-time initial sync in useFrame\n useFrame(() => {\n // Ensure the gizmo is positioned at the site after the first physics step\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 (!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 numJoints = config.numJoints;\n const currentQ: number[] = [];\n for (let i = 0; i < numJoints; i++) currentQ.push(data.qpos[i]);\n const solution = ikSolveFnRef.current(target.position, target.quaternion, currentQ);\n if (solution) {\n for (let i = 0; i < numJoints; i++) data.ctrl[i] = solution[i];\n }\n });\n\n // Reset callback — sync gizmo and reset IK state\n useEffect(() => {\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 () => {\n resetCallbacks.current.delete(cb);\n };\n }, [resetCallbacks, mjDataRef]);\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 (pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null => {\n return ikSolveFnRef.current(pos, quat, currentQ);\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 return <IkContext.Provider value={contextValue}>{children}</IkContext.Provider>;\n}\n\nexport const IkController = createController<IkConfig>(\n {\n name: 'IkController',\n defaultConfig: {\n damping: 0.01,\n maxIterations: 50,\n },\n },\n IkControllerImpl,\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 { useMujoco } from '../core/MujocoSimProvider';\nimport { useIk } from '../core/IkContext';\nimport { findSiteByName } from '../core/SceneLoader';\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 * Must be rendered inside an `<IkController>`.\n *\n * Props:\n * - `siteName` — MuJoCo site to track. Defaults to the IkController's configured site.\n * - `scale` — Gizmo handle scale. Default: 0.18.\n * - `onDrag` — Custom drag callback `(pos, quat) => 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({ siteName, scale = 0.18, onDrag }: IkGizmoProps) {\n const { mjModelRef, mjDataRef, status } = useMujoco();\n const { ikTargetRef, siteIdRef, ikEnabledRef, setIkEnabled } = useIk();\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 // Read IkController's siteIdRef directly in useFrame — avoids useEffect timing\n // issues (React runs child effects before parent effects, so reading siteIdRef\n // in a useEffect would see -1 before IkController resolves it).\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 // MuJoCo site_xmat is row-major 3x3; THREE.Matrix4.set() is row-major\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 ref={wrapperRef}>\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(_pos.clone(), _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 { useMujoco } from '../core/MujocoSimProvider';\nimport { getContact } 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 } = useMujoco();\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 for (let i = 0; i < count; i++) {\n const c = getContact(data, i);\n if (!c) {\n mesh.count = i;\n mesh.instanceMatrix.needsUpdate = true;\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 mesh.count = count;\n mesh.instanceMatrix.needsUpdate = true;\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group {...groupProps}>\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 { useMujoco, useBeforePhysicsStep } from '../core/MujocoSimProvider';\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 } = useMujoco();\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.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 { useMujoco } from '../core/MujocoSimProvider';\n\nexport function useSceneLights(intensity = 1.0) {\n const { mjModelRef, status } = useMujoco();\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 for (let i = 0; i < nlight; i++) {\n const active = model.light_active ? model.light_active[i] : 1;\n if (!active) continue;\n\n const lightType = model.light_type ? model.light_type[i] : 0;\n const isDirectional = lightType === 0;\n const castShadow = model.light_castshadow ? model.light_castshadow[i] !== 0 : false;\n\n const mjIntensity = model.light_intensity ? model.light_intensity[i] : 1.0;\n const finalIntensity = intensity * mjIntensity;\n\n const dr = model.light_diffuse ? model.light_diffuse[3 * i] : 1;\n const dg = model.light_diffuse ? model.light_diffuse[3 * i + 1] : 1;\n const db = model.light_diffuse ? model.light_diffuse[3 * i + 2] : 1;\n const color = new THREE.Color(dr, dg, db);\n\n const px = model.light_pos[3 * i];\n const py = model.light_pos[3 * i + 1];\n const pz = model.light_pos[3 * i + 2];\n const dx = model.light_dir[3 * i];\n const dy = model.light_dir[3 * i + 1];\n const dz = model.light_dir[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 = model.light_cutoff ? model.light_cutoff[i] : 45;\n const exponent = model.light_exponent ? model.light_exponent[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 (model.light_attenuation) {\n const att1 = model.light_attenuation[3 * i + 1];\n const att2 = model.light_attenuation[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","/**\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 * 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 { useMujoco } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { getContact } from '../types';\nimport type { DebugProps } 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 _contactPos = new THREE.Vector3();\nconst _contactNormal = new THREE.Vector3();\nconst MAX_CONTACT_ARROWS = 50;\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 showContacts = false,\n showCOM = false,\n showInertia = false,\n showTendons = false,\n ...groupProps\n}: DebugProps & Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujoco();\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 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 // 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, comMarkers };\n }, [status, mjModelRef, showGeoms, showSites, showJoints, 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.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 // 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 for (let i = 0; i < Math.min(ncon, MAX_CONTACT_ARROWS); i++) {\n const c = getContact(data, 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 // 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 {...groupProps}>\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 are NOT available in mujoco-js 0.0.7.\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 { useMujoco } 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 } = useMujoco();\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 { useMujoco } 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 } = useMujoco();\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 are NOT available in mujoco-js WASM.\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 * 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 { useMujoco, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName, getName } from '../core/SceneLoader';\nimport { getContact } from '../types';\nimport type { 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?: string,\n callback?: (contacts: ContactInfo[]) => void,\n): React.RefObject<ContactInfo[]> {\n const { mjModelRef, status } = useMujoco();\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 for (let i = 0; i < ncon; i++) {\n const c = getContact(data, 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 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: string,\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 { useMujoco } from '../core/MujocoSimProvider';\n\ninterface TrajectoryPlayerOptions {\n fps?: number;\n loop?: boolean;\n}\n\n/**\n * Play back a sequence of qpos frames, overriding simulation state.\n *\n * When playing, the simulation is effectively paused and qpos is set\n * from the trajectory each render frame at the specified FPS.\n */\nexport function useTrajectoryPlayer(\n trajectory: number[][],\n options: TrajectoryPlayerOptions = {},\n) {\n const { mjModelRef, mjDataRef, mujocoRef, pausedRef } = useMujoco();\n const fps = options.fps ?? 30;\n const loop = options.loop ?? false;\n\n const playingRef = useRef(false);\n const frameRef = useRef(0);\n const lastFrameTimeRef = useRef(0);\n\n const play = useCallback(() => {\n playingRef.current = true;\n pausedRef.current = true; // Pause sim during playback\n lastFrameTimeRef.current = performance.now();\n }, [pausedRef]);\n\n const pause = useCallback(() => {\n playingRef.current = false;\n }, []);\n\n const seek = useCallback((frameIdx: number) => {\n frameRef.current = Math.max(0, Math.min(frameIdx, trajectory.length - 1));\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || !trajectory[frameRef.current]) return;\n const qpos = trajectory[frameRef.current];\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 }, [trajectory, mjModelRef, mjDataRef, mujocoRef]);\n\n const reset = useCallback(() => {\n frameRef.current = 0;\n playingRef.current = false;\n pausedRef.current = false;\n }, [pausedRef]);\n\n useFrame(() => {\n if (!playingRef.current || trajectory.length === 0) return;\n\n const now = performance.now();\n const elapsed = now - lastFrameTimeRef.current;\n const frameInterval = 1000 / fps;\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 = trajectory[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 >= trajectory.length) {\n if (loop) {\n frameRef.current = 0;\n } else {\n playingRef.current = false;\n pausedRef.current = false;\n }\n }\n });\n\n return {\n play,\n pause,\n seek,\n reset,\n get frame() { return frameRef.current; },\n get playing() { return playingRef.current; },\n get totalFrames() { return trajectory.length; },\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 loop = false,\n playing = false,\n onFrame,\n}: TrajectoryPlayerProps) {\n const player = useTrajectoryPlayer(trajectory, { fps, loop });\n const onFrameRef = useRef(onFrame);\n onFrameRef.current = onFrame;\n const lastReportedFrameRef = useRef(-1);\n\n useEffect(() => {\n if (playing) {\n player.play();\n } else {\n player.pause();\n }\n }, [playing, player]);\n\n // Use useFrame instead of setInterval to sync with the render loop\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(currentFrame);\n }\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSelectionHighlight — hook form of SelectionHighlight (spec 6.5)\n *\n * Applies emissive highlight to all meshes belonging to a body.\n * Restores original emissive when bodyId changes or hook unmounts.\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useThree } from '@react-three/fiber';\nimport * as THREE from 'three';\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 { scene } = useThree();\n const prevMeshesRef = useRef<{ mesh: THREE.Mesh; originalEmissive: THREE.Color; originalIntensity: number }[]>([]);\n\n useEffect(() => {\n // Restore previous highlights\n for (const entry of prevMeshesRef.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 prevMeshesRef.current = [];\n\n if (bodyId === null || bodyId < 0) return;\n\n // Find all meshes belonging to this body\n const highlightColor = new THREE.Color(color);\n scene.traverse((obj) => {\n if (obj.userData.bodyID === bodyId && (obj as THREE.Mesh).isMesh) {\n const mesh = obj as THREE.Mesh;\n const mat = mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n prevMeshesRef.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\n return () => {\n for (const entry of prevMeshesRef.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 prevMeshesRef.current = [];\n };\n }, [bodyId, color, emissiveIntensity, scene]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * SelectionHighlight — highlight a selected body with emissive color (spec 6.5)\n */\n\nimport { useSelectionHighlight } from '../hooks/useSelectionHighlight';\nimport type { SelectionHighlightProps } from '../types';\n\n/**\n * Applies emissive highlight to all meshes belonging to a body.\n * Restores original emissive when bodyId changes or component unmounts.\n */\nexport function SelectionHighlight({\n bodyId,\n color = '#ff4444',\n emissiveIntensity = 0.3,\n}: SelectionHighlightProps) {\n useSelectionHighlight(bodyId, { color, emissiveIntensity });\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo } from 'react';\nimport { useMujoco } 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 } = useMujoco();\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 { useMujoco } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { 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: string): SitePositionResult {\n const { mjModelRef, mjDataRef, status } = useMujoco();\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 { useMujoco, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { SensorInfo, SensorResult } from '../types';\n\n/**\n * Access a single MuJoCo sensor by name. Returns a ref-based value\n * updated every physics frame without causing React re-renders.\n */\nexport function useSensor(name: string): SensorResult {\n const { mjModelRef, mjDataRef, status } = useMujoco();\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((_model, 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 { value: valueRef, size: sensorDimRef.current };\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 } = useMujoco();\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 { useMujoco, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { JointStateResult } 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 (stored as Float64Array of length 1).\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: string): JointStateResult {\n const { mjModelRef, mjDataRef, status } = useMujoco();\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 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 for multi-DOF joints\n if (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, status, mjModelRef]);\n\n useAfterPhysicsStep((_model, data) => {\n if (jointIdRef.current < 0) return;\n const qa = qposAdrRef.current;\n const da = dofAdrRef.current;\n if (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 { useMujoco, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { 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: string): BodyStateResult {\n const { mjModelRef, status } = useMujoco();\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((_model, 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 * useCtrl — clean read/write access to a named actuator's ctrl value (spec 3.1)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\n\n/**\n * Access a single actuator's control value by name.\n *\n * Returns [currentValue, setValue]:\n * - `currentValue` is a ref updated every frame (no re-renders).\n * - `setValue` writes directly to `data.ctrl[actuatorId]`.\n */\nexport function useCtrl(name: string): [React.RefObject<number>, (value: number) => void] {\n const { mjModelRef, mjDataRef, status } = useMujoco();\n const actuatorIdRef = useRef(-1);\n const valueRef = useRef(0);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n actuatorIdRef.current = findActuatorByName(model, name);\n }, [name, status, mjModelRef]);\n\n // Read current value each frame (via afterStep would be ideal but\n // useCtrl is primarily for writing; reading can use the ref)\n const setValue = useCallback((value: number) => {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return;\n data.ctrl[actuatorIdRef.current] = value;\n valueRef.current = value;\n }, [mjDataRef]);\n\n return [valueRef, setValue];\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 { useMujoco, 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 } = useMujoco();\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((_model, 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 * usePolicy — policy decimation loop hook (spec 10.1)\n */\n\nimport { useRef } from 'react';\nimport { useMujoco, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport type { PolicyConfig } from '../types';\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) {\n const { mjModelRef } = useMujoco();\n const lastActionTimeRef = useRef(0);\n const lastActionRef = useRef<Float32Array | Float64Array | number[] | null>(null);\n const isRunningRef = useRef(true);\n const configRef = useRef(config);\n configRef.current = config;\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 // Build observation\n const obs = cfg.onObservation(model, data);\n\n // Apply action (consumer does inference inline or uses cached result)\n cfg.onAction(obs, model, data);\n\n lastActionTimeRef.current = data.time;\n lastActionRef.current = obs;\n }\n });\n\n return {\n get isRunning() { return isRunningRef.current; },\n start: () => { isRunningRef.current = true; },\n stop: () => { isRunningRef.current = false; },\n get lastObservation() { return lastActionRef.current; },\n };\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 { useMujoco, 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 } = useMujoco();\n const recordingRef = useRef(false);\n const framesRef = useRef<TrajectoryFrame[]>([]);\n const fields = options.fields ?? ['qpos'];\n\n useAfterPhysicsStep((_model, 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 { useMujoco, 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 } = useMujoco();\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((_model, 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 * useCtrlNoise — control noise / perturbation hook (spec 3.2)\n */\n\nimport { useRef } from 'react';\nimport { useMujoco, 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 } = useMujoco();\n const configRef = useRef(config);\n configRef.current = config;\n const noiseRef = useRef<Float64Array | null>(null);\n\n useBeforePhysicsStep((_model, 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 * 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/types.ts","../src/rendering/CapsuleGeometry.ts","../src/rendering/Reflector.ts","../src/rendering/GeomBuilder.ts","../src/core/SceneLoader.ts","../src/components/SceneRenderer.tsx","../src/core/MujocoSimProvider.tsx","../src/core/MujocoCanvas.tsx","../src/core/MujocoPhysics.tsx","../src/core/createController.tsx","../src/core/IkContext.tsx","../src/core/GenericIK.ts","../src/components/IkController.tsx","../src/components/IkGizmo.tsx","../src/components/ContactMarkers.tsx","../src/components/DragInteraction.tsx","../src/hooks/useSceneLights.ts","../src/components/SceneLights.tsx","../src/components/Debug.tsx","../src/components/TendonRenderer.tsx","../src/components/FlexRenderer.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/useCtrl.ts","../src/hooks/useKeyboardTeleop.ts","../src/hooks/usePolicy.ts","../src/hooks/useTrajectoryRecorder.ts","../src/hooks/useGamepad.ts","../src/hooks/useVideoRecorder.ts","../src/hooks/useCtrlNoise.ts","../src/hooks/useBodyMeshes.ts","../src/hooks/useSelectionHighlight.ts","../src/hooks/useCameraAnimation.ts"],"names":["THREE","THREE2","THREE3","useRef","useEffect","THREE4","jsx","THREE5","createContext","useContext","useState","api","useFrame","useMemo","MujocoCanvas","forwardRef","MujocoPhysics","s","tmp","THREE6","useCallback","THREE7","useThree","THREE8","jsxs","THREE9","THREE10","_quat","THREE12","THREE13","_mat4","THREE14","SENSOR_TYPE_NAMES","THREE15","THREE16","THREE17"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport loadMujoco from 'mujoco-js';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport { 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\ninterface MujocoProviderProps {\n wasmUrl?: string;\n /** Timeout in ms for WASM module load. Default: 30000. */\n timeout?: number;\n children: React.ReactNode;\n onError?: (error: Error) => void;\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({ wasmUrl, timeout = 30000, children, onError }: 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\n useEffect(() => {\n isMounted.current = true;\n\n const wasmPromise = loadMujoco({\n ...(wasmUrl ? { locateFile: (path: string) => path.endsWith('.wasm') ? wasmUrl : 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 moduleRef.current = inst as MujocoModule;\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 onError?.(new Error(msg));\n }\n });\n\n return () => {\n isMounted.current = false;\n };\n }, [wasmUrl, 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\nimport type { CanvasProps } from '@react-three/fiber';\nimport * as THREE from 'three';\n\n// ---- MuJoCo WASM Types ----\n\n/**\n * A single MuJoCo contact from the WASM module.\n * Accessed via `data.contact.get(i)`.\n */\nexport interface MujocoContact {\n geom1: number;\n geom2: number;\n pos: Float64Array;\n frame: Float64Array;\n dist: number;\n}\n\n/**\n * WASM contact array — supports indexed access via `.get(i)`.\n */\nexport interface MujocoContactArray {\n get(i: number): MujocoContact | undefined;\n}\n\n/**\n * Read a single contact from the WASM contact array.\n * Returns undefined if the access fails (WASM heap issue, bad index, etc.).\n */\nexport function getContact(data: MujocoData, i: number): MujocoContact | undefined {\n try {\n return data.contact.get(i);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Minimal interface for MuJoCo Model to avoid 'any'.\n */\nexport interface MujocoModel {\n // Counts\n nbody: number;\n ngeom: number;\n nsite: number;\n nu: number;\n njnt: number;\n nq: number;\n nv: number;\n nkey: number;\n nsensor: number;\n nsensordata: number;\n nlight: number;\n ntendon: number;\n nflex: number;\n nmesh: number;\n nmat: number;\n\n // Name tables\n names: Int8Array;\n name_bodyadr: Int32Array;\n name_jntadr: Int32Array;\n name_geomadr: Int32Array;\n name_siteadr: Int32Array;\n name_actuatoradr: Int32Array;\n name_keyadr: Int32Array;\n name_sensoradr: Int32Array;\n name_tendonadr: Int32Array;\n\n // Body\n body_mass: Float64Array;\n body_parentid: Int32Array;\n body_jntnum: Int32Array;\n body_jntadr: Int32Array;\n body_pos: Float64Array;\n body_quat: Float64Array;\n body_geomnum: Int32Array;\n body_geomadr: Int32Array;\n body_inertia: Float64Array;\n\n // Default configuration\n qpos0: Float64Array;\n\n // Joint\n jnt_qposadr: Int32Array;\n jnt_dofadr: Int32Array;\n jnt_type: Int32Array;\n jnt_range: Float64Array;\n jnt_bodyid: Int32Array;\n jnt_pos: Float64Array;\n jnt_axis: Float64Array;\n jnt_limited: Uint8Array;\n\n // Geom\n geom_group: Int32Array;\n geom_type: Int32Array;\n geom_size: Float64Array;\n geom_pos: Float64Array;\n geom_quat: Float64Array;\n geom_matid: Int32Array;\n geom_rgba: Float32Array;\n geom_dataid: Int32Array;\n geom_bodyid: Int32Array;\n geom_contype: Int32Array;\n geom_conaffinity: Int32Array;\n geom_friction: Float64Array;\n\n // Material\n mat_rgba: Float32Array;\n\n // Mesh\n mesh_vertadr: Int32Array;\n mesh_vertnum: Int32Array;\n mesh_faceadr: Int32Array;\n mesh_facenum: Int32Array;\n mesh_vert: Float32Array;\n mesh_face: Int32Array;\n mesh_normal: Float32Array;\n\n // Site\n site_bodyid: Int32Array;\n\n // Actuator\n actuator_trnid: Int32Array;\n actuator_ctrlrange: Float64Array;\n actuator_trntype: Int32Array;\n actuator_gainprm: Float64Array;\n actuator_biasprm: Float64Array;\n\n // Sensor\n sensor_type: Int32Array;\n sensor_dim: Int32Array;\n sensor_adr: Int32Array;\n sensor_objtype: Int32Array;\n sensor_objid: Int32Array;\n\n // Keyframe\n key_qpos: Float64Array;\n key_ctrl: Float64Array;\n key_time: Float64Array;\n key_qvel: Float64Array;\n\n // Light\n light_pos: Float64Array;\n light_dir: Float64Array;\n light_diffuse: Float32Array;\n light_specular: Float32Array;\n light_type: Int32Array;\n light_active: Uint8Array;\n light_castshadow: Uint8Array;\n light_attenuation: Float32Array;\n light_cutoff: Float32Array;\n light_exponent: Float32Array;\n light_intensity: Float32Array;\n\n // Tendon\n ten_wrapadr: Int32Array;\n ten_wrapnum: Int32Array;\n ten_range: Float64Array;\n ten_rgba: Float32Array;\n ten_width: Float64Array;\n\n // Flex\n flex_vertadr: Int32Array;\n flex_vertnum: Int32Array;\n flex_faceadr: Int32Array;\n flex_facenum: Int32Array;\n flex_face: Int32Array;\n flex_rgba: Float32Array;\n\n // Model options\n opt: {\n timestep: number;\n gravity: Float64Array;\n integrator: number;\n [key: string]: unknown;\n };\n\n delete: () => void;\n [key: string]: unknown;\n}\n\n/**\n * Minimal interface for MuJoCo Data to avoid 'any'.\n */\nexport interface MujocoData {\n time: number;\n qpos: Float64Array;\n qvel: Float64Array;\n ctrl: Float64Array;\n act: Float64Array;\n xpos: Float64Array;\n xquat: Float64Array;\n xfrc_applied: Float64Array;\n qfrc_applied: Float64Array;\n qfrc_bias: Float64Array;\n site_xpos: Float64Array;\n site_xmat: Float64Array;\n sensordata: Float64Array;\n ncon: number;\n contact: MujocoContactArray;\n cvel: Float64Array;\n cfrc_ext: Float64Array;\n ten_length: Float64Array;\n wrap_xpos: Float64Array;\n ten_wrapadr: Int32Array;\n flexvert_xpos: Float64Array;\n geom_xpos: Float64Array;\n geom_xmat: Float64Array;\n delete: () => void;\n [key: string]: unknown;\n}\n\n/**\n * Minimal interface for the MuJoCo WASM Module.\n */\nexport interface MujocoModule {\n MjModel: { loadFromXML: (path: string) => MujocoModel; [key: string]: unknown };\n MjData: new (model: MujocoModel) => MujocoData;\n MjvOption: new () => { delete: () => void; [key: string]: unknown };\n mj_forward: (m: MujocoModel, d: MujocoData) => void;\n mj_step: (m: MujocoModel, d: MujocoData) => void;\n mj_resetData: (m: MujocoModel, d: MujocoData) => void;\n mj_step1: (m: MujocoModel, d: MujocoData) => void;\n mj_step2: (m: MujocoModel, d: MujocoData) => void;\n mj_applyFT: (\n model: MujocoModel,\n data: MujocoData,\n force: Float64Array,\n torque: Float64Array,\n point: Float64Array,\n bodyId: number,\n qfrc_target: Float64Array\n ) => void;\n mj_ray: (\n model: MujocoModel,\n data: MujocoData,\n pnt: Float64Array,\n vec: Float64Array,\n geomgroup: Uint8Array | null,\n flg_static: number,\n bodyexclude: number,\n geomid: Int32Array\n ) => number;\n mj_name2id: (model: MujocoModel, type: number, name: string) => number;\n mjtObj: Record<string, number>;\n mjtGeom: Record<string, number | {value: number}>;\n mjtJoint: Record<string, number | {value: number}>;\n mjtSensor: Record<string, number | {value: number}>;\n FS: {\n writeFile: (path: string, content: string | Uint8Array) => void;\n readFile: (path: string, opts?: { encoding: string }) => string | Uint8Array;\n mkdir: (path: string) => void;\n unmount: (path: string) => void;\n };\n [key: string]: unknown;\n}\n\n// ---- Scene Configuration ----\n\nexport interface SceneObject {\n name: string;\n type: 'box' | 'sphere' | 'cylinder';\n size: [number, number, number];\n position: [number, number, number];\n rgba: [number, number, number, number];\n mass?: number;\n freejoint?: boolean;\n friction?: string;\n solref?: string;\n solimp?: string;\n condim?: number;\n}\n\nexport interface XmlPatch {\n target: string;\n inject?: string;\n injectAfter?: string;\n replace?: [string, string];\n}\n\nexport interface SceneConfig {\n /** Base URL for fetching model files. The loader fetches `src + sceneFile` and follows dependencies. */\n src: string;\n /** Entry MJCF XML file name, e.g. 'scene.xml'. */\n sceneFile: string;\n sceneObjects?: SceneObject[];\n homeJoints?: number[];\n xmlPatches?: XmlPatch[];\n onReset?: (model: MujocoModel, data: MujocoData) => void;\n}\n\n// ---- IK Controller Config ----\n\nexport interface IkConfig {\n /** MuJoCo site name for IK target. */\n siteName: string;\n /** Number of joints to solve for. */\n numJoints: number;\n /** Custom IK solver. When omitted, uses built-in Damped Least-Squares solver. */\n ikSolveFn?: IKSolveFn;\n /** DLS damping. Default: 0.01. */\n damping?: number;\n /** Max solver iterations. Default: 50. */\n maxIterations?: number;\n}\n\nexport interface SceneMarker {\n id: number;\n position: THREE.Vector3;\n label: string;\n}\n\n// ---- Physics Config (spec 1.1) ----\n\nexport interface PhysicsConfig {\n gravity?: [number, number, number];\n timestep?: number;\n substeps?: number;\n paused?: boolean;\n speed?: number;\n}\n\n// ---- IK ----\n\nexport type IKSolveFn = (\n pos: THREE.Vector3,\n quat: THREE.Quaternion,\n currentQ: number[]\n) => number[] | null;\n\n// ---- Callbacks ----\n\nexport type PhysicsStepCallback = (\n model: MujocoModel,\n data: MujocoData\n) => void;\n\n// ---- State Management (spec 4.1) ----\n\nexport interface StateSnapshot {\n time: number;\n qpos: Float64Array;\n qvel: Float64Array;\n ctrl: Float64Array;\n act: Float64Array;\n qfrc_applied: Float64Array;\n}\n\n// ---- Model Introspection (spec 5.1) ----\n\nexport interface BodyInfo {\n id: number;\n name: string;\n mass: number;\n parentId: number;\n}\n\nexport interface JointInfo {\n id: number;\n name: string;\n type: number;\n typeName: string;\n range: [number, number];\n limited: boolean;\n bodyId: number;\n qposAdr: number;\n dofAdr: number;\n}\n\nexport interface GeomInfo {\n id: number;\n name: string;\n type: number;\n typeName: string;\n size: [number, number, number];\n bodyId: number;\n}\n\nexport interface SiteInfo {\n id: number;\n name: string;\n bodyId: number;\n}\n\nexport interface ActuatorInfo {\n id: number;\n name: string;\n range: [number, number];\n}\n\nexport interface SensorInfo {\n id: number;\n name: string;\n type: number;\n typeName: string;\n dim: number;\n adr: number;\n}\n\n// ---- Contacts (spec 2.4, 2.5) ----\n\nexport interface ContactInfo {\n geom1: number;\n geom1Name: string;\n geom2: number;\n geom2Name: string;\n pos: [number, number, number];\n depth: number;\n}\n\n// ---- Raycast (spec 7.1) ----\n\nexport interface RayHit {\n point: THREE.Vector3;\n bodyId: number;\n geomId: number;\n distance: number;\n}\n\n// ---- Model Options (spec 5.3) ----\n\nexport interface ModelOptions {\n timestep: number;\n gravity: [number, number, number];\n integrator: number;\n}\n\n// ---- Trajectory (spec 13.1, 13.2) ----\n\nexport interface TrajectoryFrame {\n time: number;\n qpos: Float64Array;\n qvel?: Float64Array;\n ctrl?: Float64Array;\n sensordata?: Float64Array;\n}\n\nexport interface TrajectoryData {\n frames: TrajectoryFrame[];\n fps: number;\n}\n\n// ---- Keyboard Teleop (spec 12.1) ----\n\nexport interface KeyBinding {\n actuator: string;\n delta?: number;\n toggle?: [number, number];\n set?: number;\n}\n\nexport interface KeyboardTeleopConfig {\n bindings: Record<string, KeyBinding>;\n enabled?: boolean;\n}\n\n// ---- Policy (spec 10.1) ----\n\nexport interface PolicyConfig {\n frequency: number;\n onObservation: (model: MujocoModel, data: MujocoData) => Float32Array | Float64Array | number[];\n onAction: (action: Float32Array | Float64Array | number[], model: MujocoModel, data: MujocoData) => void;\n}\n\n// ---- Debug Component (spec 6.1) ----\n\nexport interface DebugProps {\n showGeoms?: boolean;\n showSites?: boolean;\n showJoints?: boolean;\n showContacts?: boolean;\n showCOM?: boolean;\n showInertia?: boolean;\n showTendons?: boolean;\n}\n\n// ---- Component Props ----\n\nexport interface IkGizmoProps {\n siteName?: string;\n scale?: number;\n onDrag?: (position: THREE.Vector3, quaternion: THREE.Quaternion) => void;\n}\n\nexport interface DragInteractionProps {\n stiffness?: number;\n showArrow?: boolean;\n}\n\nexport interface SceneLightsProps {\n /** Override intensity for all MJCF lights. Default: 1.0. */\n intensity?: number;\n}\n\nexport interface TrajectoryPlayerProps {\n trajectory: number[][];\n fps?: number;\n loop?: boolean;\n playing?: boolean;\n onFrame?: (frameIdx: number) => void;\n}\n\nexport interface SelectionHighlightProps {\n bodyId: number | null;\n color?: string;\n emissiveIntensity?: number;\n}\n\nexport interface ContactListenerProps {\n body: string;\n onContactEnter?: (info: ContactInfo) => void;\n onContactExit?: (info: ContactInfo) => void;\n}\n\n// ---- Public API (spec: full surface) ----\n\nexport interface MujocoSimAPI {\n // State\n readonly status: 'loading' | 'ready' | 'error';\n readonly config: SceneConfig;\n\n // Simulation control (spec 1.1, 1.2, 1.3)\n reset(): void;\n setSpeed(multiplier: number): void;\n togglePause(): boolean;\n setPaused(paused: boolean): void;\n step(n?: number): void;\n getTime(): number;\n getTimestep(): number;\n applyKeyframe(nameOrIndex: string | number): void;\n\n // State management (spec 4.1, 4.2, 4.3)\n saveState(): StateSnapshot;\n restoreState(snapshot: StateSnapshot): void;\n setQpos(values: Float64Array | number[]): void;\n setQvel(values: Float64Array | number[]): void;\n getQpos(): Float64Array;\n getQvel(): Float64Array;\n\n // Actuator / control (spec 3.1)\n setCtrl(nameOrValues: string | Record<string, number>, value?: number): void;\n getCtrl(): Float64Array;\n\n // Force application (spec 8.1)\n applyForce(bodyName: string, force: THREE.Vector3, point?: THREE.Vector3): void;\n applyTorque(bodyName: string, torque: THREE.Vector3): void;\n setExternalForce(bodyName: string, force: THREE.Vector3, torque: THREE.Vector3): void;\n applyGeneralizedForce(values: Float64Array | number[]): void;\n\n // Sensors (spec 2.1)\n getSensorData(name: string): Float64Array | null;\n\n // Contacts (spec 2.4)\n getContacts(): ContactInfo[];\n\n // Model introspection (spec 5.1, 5.2)\n getBodies(): BodyInfo[];\n getJoints(): JointInfo[];\n getGeoms(): GeomInfo[];\n getSites(): SiteInfo[];\n getActuators(): ActuatorInfo[];\n getSensors(): SensorInfo[];\n\n // Model parameters (spec 5.3)\n getModelOption(): ModelOptions;\n setGravity(g: [number, number, number]): void;\n setTimestep(dt: number): void;\n\n // Raycasting (spec 7.1)\n raycast(origin: THREE.Vector3, direction: THREE.Vector3, maxDist?: number): RayHit | null;\n\n // Keyframes (spec 4.2)\n getKeyframeNames(): string[];\n getKeyframeCount(): number;\n\n // Model loading (spec 9.1)\n loadScene(newConfig: SceneConfig): Promise<void>;\n\n // Canvas\n getCanvasSnapshot(width?: number, height?: number, mimeType?: string): string;\n project2DTo3D(\n x: number,\n y: number,\n cameraPos: THREE.Vector3,\n lookAt: THREE.Vector3\n ): { point: THREE.Vector3; bodyId: number; geomId: number } | null;\n\n // Domain randomization (spec 10.3)\n setBodyMass(name: string, mass: number): void;\n setGeomFriction(name: string, friction: [number, number, number]): void;\n setGeomSize(name: string, size: [number, number, number]): void;\n\n // Internal refs for advanced use\n readonly mjModelRef: React.RefObject<MujocoModel | null>;\n readonly mjDataRef: React.RefObject<MujocoData | null>;\n}\n\n// ---- Canvas Props ----\n\nexport type MujocoCanvasProps = Omit<CanvasProps, 'onError'> & {\n config: SceneConfig;\n onReady?: (api: MujocoSimAPI) => void;\n onError?: (error: Error) => void;\n onStep?: (time: number) => void;\n onSelection?: (bodyId: number, name: string) => void;\n // Declarative physics config (spec 1.1)\n gravity?: [number, number, number];\n timestep?: number;\n substeps?: number;\n paused?: boolean;\n speed?: number;\n};\n\n// ---- Hook Return Types ----\n\nexport interface SitePositionResult {\n position: React.RefObject<THREE.Vector3>;\n quaternion: React.RefObject<THREE.Quaternion>;\n}\n\nexport interface MujocoContextValue {\n mujoco: MujocoModule | null;\n status: 'loading' | 'ready' | 'error';\n error: string | null;\n}\n\nexport interface SensorResult {\n value: React.RefObject<Float64Array>;\n size: number;\n}\n\nexport interface BodyStateResult {\n position: React.RefObject<THREE.Vector3>;\n quaternion: React.RefObject<THREE.Quaternion>;\n linearVelocity: React.RefObject<THREE.Vector3>;\n angularVelocity: React.RefObject<THREE.Vector3>;\n}\n\nexport interface JointStateResult {\n position: React.RefObject<number | Float64Array>;\n velocity: React.RefObject<number | Float64Array>;\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\n\nimport * as THREE from 'three';\n\n/**\n * Options for configuring the Reflector.\n */\nexport interface ReflectorOptions {\n color?: THREE.ColorRepresentation;\n textureWidth?: number;\n textureHeight?: number;\n clipBias?: number;\n multisample?: number;\n texture?: THREE.Texture;\n mixStrength?: number; // How strong the reflection is (0.0 - 1.0)\n}\n\ninterface ReflectorMesh extends THREE.Mesh {\n type: string;\n material: THREE.MeshPhysicalMaterial;\n // tslint:disable-next-line:no-any\n onBeforeRender: (renderer: any, scene: any, camera: any) => void;\n}\n\n/**\n * Reflector\n * Creates a reflective surface.\n */\nexport class Reflector extends THREE.Mesh {\n isReflector = true;\n camera: THREE.PerspectiveCamera;\n private reflectorPlane = new THREE.Plane();\n private normal = new THREE.Vector3();\n private reflectorWorldPosition = new THREE.Vector3();\n private cameraWorldPosition = new THREE.Vector3();\n private rotationMatrix = new THREE.Matrix4();\n private lookAtPosition = new THREE.Vector3(0, 0, -1);\n private clipPlane = new THREE.Vector4();\n private view = new THREE.Vector3();\n private target = new THREE.Vector3();\n private q = new THREE.Vector4();\n private textureMatrix = new THREE.Matrix4();\n private virtualCamera: THREE.PerspectiveCamera;\n private renderTarget: THREE.WebGLRenderTarget;\n\n constructor(geometry: THREE.BufferGeometry, options: ReflectorOptions = {}) {\n super(geometry);\n\n (this as unknown as ReflectorMesh).type = 'Reflector';\n this.camera = new THREE.PerspectiveCamera();\n\n const color = (options.color !== undefined) ? new THREE.Color(options.color) : new THREE.Color(0x7F7F7F);\n const textureWidth = options.textureWidth || 512;\n const textureHeight = options.textureHeight || 512;\n const clipBias = options.clipBias || 0;\n const multisample = (options.multisample !== undefined) ? options.multisample : 4;\n const blendTexture = options.texture || undefined;\n const mixStrength = (options.mixStrength !== undefined) ? options.mixStrength : 0.25; \n\n this.virtualCamera = this.camera;\n\n this.renderTarget = new THREE.WebGLRenderTarget(textureWidth, textureHeight, { \n samples: multisample, \n type: THREE.HalfFloatType \n });\n\n (this as unknown as ReflectorMesh).material = new THREE.MeshPhysicalMaterial({\n map: blendTexture,\n color,\n roughness: 0.5, \n metalness: 0.1, \n });\n\n (this as unknown as ReflectorMesh).material.onBeforeCompile = (shader) => {\n shader.uniforms.tDiffuse = { value: this.renderTarget.texture };\n shader.uniforms.textureMatrix = { value: this.textureMatrix };\n shader.uniforms.mixStrength = { value: mixStrength };\n\n // Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n const bodyStart = shader.vertexShader.indexOf('void main() {');\n shader.vertexShader =\n 'uniform mat4 textureMatrix;\\n' +\n 'varying vec4 vUvReflection;\\n' +\n shader.vertexShader.slice(0, bodyStart) +\n shader.vertexShader.slice(bodyStart, -1) +\n ' vUvReflection = textureMatrix * vec4( position, 1.0 );\\n' +\n '}';\n\n // Fragment Shader: Mix reflection with base material\n const fragmentBodyStart = shader.fragmentShader.indexOf('void main() {');\n shader.fragmentShader =\n 'uniform sampler2D tDiffuse;\\n' +\n 'uniform float mixStrength;\\n' +\n 'varying vec4 vUvReflection;\\n' +\n shader.fragmentShader.slice(0, fragmentBodyStart) +\n shader.fragmentShader.slice(fragmentBodyStart, -1) +\n ' vec4 reflectionColor = texture2DProj( tDiffuse, vUvReflection );\\n' +\n ' gl_FragColor = vec4( mix( gl_FragColor.rgb, reflectionColor.rgb, mixStrength ), gl_FragColor.a );\\n' +\n '}';\n };\n\n (this as THREE.Object3D).receiveShadow = true;\n\n (this as unknown as ReflectorMesh).onBeforeRender = (renderer: THREE.WebGLRenderer, scene: THREE.Scene, camera: THREE.Camera) => {\n this.reflectorWorldPosition.setFromMatrixPosition((this as THREE.Object3D).matrixWorld);\n this.cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld);\n\n this.rotationMatrix.extractRotation((this as THREE.Object3D).matrixWorld);\n\n this.normal.set(0, 0, 1);\n this.normal.applyMatrix4(this.rotationMatrix);\n\n this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition);\n\n // Avoid rendering when reflector is facing away\n if (this.view.dot(this.normal) > 0) return;\n\n this.view.reflect(this.normal).negate();\n this.view.add(this.reflectorWorldPosition);\n\n this.rotationMatrix.extractRotation(camera.matrixWorld);\n\n this.lookAtPosition.set(0, 0, -1);\n this.lookAtPosition.applyMatrix4(this.rotationMatrix);\n this.lookAtPosition.add(this.cameraWorldPosition);\n\n this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition);\n this.target.reflect(this.normal).negate();\n this.target.add(this.reflectorWorldPosition);\n\n this.virtualCamera.position.copy(this.view);\n this.virtualCamera.up.set(0, 1, 0);\n this.virtualCamera.up.applyMatrix4(this.rotationMatrix);\n this.virtualCamera.up.reflect(this.normal);\n this.virtualCamera.lookAt(this.target);\n\n this.virtualCamera.far = (camera as THREE.PerspectiveCamera).far; \n\n this.virtualCamera.updateMatrixWorld();\n this.virtualCamera.projectionMatrix.copy((camera as THREE.PerspectiveCamera).projectionMatrix);\n\n // Update the texture matrix\n this.textureMatrix.set(\n 0.5, 0.0, 0.0, 0.5,\n 0.0, 0.5, 0.0, 0.5,\n 0.0, 0.0, 0.5, 0.5,\n 0.0, 0.0, 0.0, 1.0\n );\n this.textureMatrix.multiply(this.virtualCamera.projectionMatrix);\n this.textureMatrix.multiply(this.virtualCamera.matrixWorldInverse);\n this.textureMatrix.multiply((this as THREE.Object3D).matrixWorld);\n\n // Now update projection matrix with new clip plane\n this.reflectorPlane.setFromNormalAndCoplanarPoint(this.normal, this.reflectorWorldPosition);\n this.reflectorPlane.applyMatrix4(this.virtualCamera.matrixWorldInverse);\n\n this.clipPlane.set(this.reflectorPlane.normal.x, this.reflectorPlane.normal.y, this.reflectorPlane.normal.z, this.reflectorPlane.constant);\n\n const projectionMatrix = this.virtualCamera.projectionMatrix;\n\n this.q.x = (Math.sign(this.clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];\n this.q.y = (Math.sign(this.clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];\n this.q.z = -1.0;\n this.q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];\n\n // Calculate the scaled plane vector\n this.clipPlane.multiplyScalar(2.0 / this.clipPlane.dot(this.q));\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = this.clipPlane.x;\n projectionMatrix.elements[6] = this.clipPlane.y;\n projectionMatrix.elements[10] = this.clipPlane.z + 1.0 - clipBias;\n projectionMatrix.elements[14] = this.clipPlane.w;\n\n // Render\n (this as THREE.Object3D).visible = false;\n\n const currentRenderTarget = renderer.getRenderTarget();\n const currentXrEnabled = renderer.xr.enabled;\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\n renderer.xr.enabled = false; \n renderer.shadowMap.autoUpdate = false; \n\n renderer.setRenderTarget(this.renderTarget);\n\n renderer.state.buffers.depth.setMask(true); \n\n if (renderer.autoClear === false) renderer.clear();\n renderer.render(scene, this.virtualCamera);\n\n renderer.xr.enabled = currentXrEnabled;\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\n renderer.setRenderTarget(currentRenderTarget);\n\n // Restore viewport\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const viewport = (camera as any).viewport;\n if (viewport !== undefined) {\n renderer.state.viewport(viewport);\n }\n\n (this as THREE.Object3D).visible = true;\n };\n }\n\n getRenderTarget() {\n return this.renderTarget;\n }\n\n dispose() {\n this.renderTarget.dispose();\n const mesh = this as THREE.Mesh;\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((m) => m.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n}","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\nimport { CapsuleGeometry } from './CapsuleGeometry';\nimport { Reflector } from './Reflector';\nimport { MujocoModel, MujocoModule } from '../types';\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\n constructor(mujoco: MujocoModule) {\n this.mujoco = mujoco;\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 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 versions of the mujoco-js bindings.\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 we need a finite mesh for Three.js. \n // Fallback reduced to 5m to match grid as requested.\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 geo.computeVertexNormals(); // Auto-calculate smooth lighting normals\n }\n\n // 5. Construct the final Mesh\n if (geo) {\n let mesh;\n // Special handling for the floor plane to make it shiny\n if (type === getVal(MG.mjGEOM_PLANE)) {\n mesh = new Reflector(geo, {\n clipBias: 0.003,\n textureWidth: 1024, textureHeight: 1024,\n color,\n mixStrength: 0.25\n });\n } else {\n // Standard physical material for everything else\n mesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({\n color,\n transparent: opacity < 1,\n opacity,\n roughness: 0.6,\n metalness: 0.2\n }));\n // Enable shadows\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n }\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\n return mesh;\n }\n\n return null;\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MujocoData, MujocoModel, MujocoModule } from '../types';\nimport { SceneConfig, SceneObject, XmlPatch } from '../types';\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 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\n/**\n * Convert a SceneObject config to MuJoCo XML.\n */\nfunction sceneObjectToXml(obj: SceneObject): string {\n const joint = obj.freejoint ? '<freejoint/>' : '';\n const pos = obj.position.map((v) => v.toFixed(3)).join(' ');\n const size = obj.size.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 // Always set contype/conaffinity=1 so objects collide regardless of model defaults\n return `<body name=\"${obj.name}\" pos=\"${pos}\">${joint}<geom type=\"${obj.type}\" size=\"${size}\" rgba=\"${rgba}\" contype=\"1\" conaffinity=\"1\"${mass}${friction}${solref}${solimp}${condim}/></body>`;\n}\n\ninterface LoadResult {\n mjModel: MujocoModel;\n mjData: MujocoData;\n}\n\n/**\n * Config-driven scene loader — replaces the old RobotLoader + patchSingleRobot approach.\n */\nexport async function loadScene(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\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 downloaded = new Set<string>();\n const queue: string[] = [config.sceneFile];\n const parser = new DOMParser();\n\n // 2. Download all model files\n while (queue.length > 0) {\n const fname = queue.shift()!;\n if (downloaded.has(fname)) continue;\n downloaded.add(fname);\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 // Create virtual directory structure\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 if (fname.endsWith('.xml')) {\n let text = await res.text();\n\n // 3. Apply XML patches from config\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 (text.includes(from)) {\n text = text.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 = text.indexOf(patch.injectAfter);\n if (idx !== -1) {\n // Find the end of the opening tag (next '>') after the match\n const tagEnd = text.indexOf('>', idx + patch.injectAfter.length);\n if (tagEnd !== -1) {\n text = text.slice(0, tagEnd + 1) + patch.inject + text.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 // 4. Inject scene objects into the scene file\n if (fname === config.sceneFile && config.sceneObjects?.length) {\n const xml = config.sceneObjects.map((obj) => sceneObjectToXml(obj)).join('');\n text = text.replace('</worldbody>', xml + '</worldbody>');\n }\n\n mujoco.FS.writeFile(`/working/${fname}`, text);\n scanDependencies(text, fname, parser, downloaded, queue);\n } else {\n const buffer = new Uint8Array(await res.arrayBuffer());\n mujoco.FS.writeFile(`/working/${fname}`, buffer);\n }\n }\n\n // 5. Load model\n onProgress?.('Loading model...');\n const mjModel = mujoco.MjModel.loadFromXML(`/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 if (config.homeJoints) {\n const homeCount = Math.min(config.homeJoints.length, mjModel.nu);\n for (let i = 0; i < homeCount; i++) {\n mjData.ctrl[i] = config.homeJoints[i];\n const qposAdr = getActuatedScalarQposAdr(mjModel, i);\n if (qposAdr !== -1) {\n mjData.qpos[qposAdr] = config.homeJoints[i];\n }\n }\n }\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 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 xmlDoc.querySelectorAll('[file]').forEach((el) => {\n const fileAttr = el.getAttribute('file');\n if (!fileAttr) 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 let fullPath = (currentDir + prefix + fileAttr).replace(/\\/\\//g, '/');\n const parts = fullPath.split('/');\n const norm: string[] = [];\n for (const p of parts) {\n if (p === '..') norm.pop();\n else if (p !== '.') norm.push(p);\n }\n fullPath = norm.join('/');\n\n if (!downloaded.has(fullPath)) queue.push(fullPath);\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 { useEffect, useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport { GeomBuilder } from '../rendering/GeomBuilder';\nimport { MujocoModel } from '../types';\nimport { getName } from '../core/SceneLoader';\nimport { useMujoco } 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 function SceneRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, mujocoRef, onSelectionRef, status } = useMujoco();\n const groupRef = useRef<THREE.Group>(null);\n const bodyRefs = useRef<(THREE.Group | null)[]>([]);\n const prevModelRef = useRef<MujocoModel | null>(null);\n\n const geomBuilder = useMemo(() => {\n if (status !== 'ready') return null;\n return new GeomBuilder(mujocoRef.current);\n }, [status, mujocoRef]);\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 (prevModelRef.current === model) return;\n prevModelRef.current = model;\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\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 group.add(bodyGroup);\n refs.push(bodyGroup);\n }\n bodyRefs.current = refs;\n }, [status, geomBuilder, mjModelRef]);\n\n // Sync body positions from mjData every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data) return;\n const bodies = bodyRefs.current;\n for (let i = 0; i < bodies.length; i++) {\n const ref = bodies[i];\n if (!ref) continue;\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\n return (\n <group\n {...props}\n ref={groupRef}\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, name);\n }\n }\n }}\n />\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 } from '../types';\nimport { SceneRenderer } from '../components/SceneRenderer';\nimport {\n ActuatorInfo,\n BodyInfo,\n ContactInfo,\n GeomInfo,\n JointInfo,\n ModelOptions,\n MujocoSimAPI,\n PhysicsStepCallback,\n RayHit,\n SceneConfig,\n SensorInfo,\n SiteInfo,\n StateSnapshot,\n} from '../types';\nimport {\n loadScene,\n findKeyframeByName,\n findBodyByName,\n findGeomByName,\n findSensorByName,\n findActuatorByName,\n getActuatedScalarQposAdr,\n getName,\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\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\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 onSelectionRef: React.RefObject<\n ((bodyId: number, name: string) => void) | undefined\n >;\n beforeStepCallbacks: React.RefObject<Set<PhysicsStepCallback>>;\n afterStepCallbacks: React.RefObject<Set<PhysicsStepCallback>>;\n resetCallbacks: React.RefObject<Set<() => void>>;\n status: 'loading' | 'ready' | 'error';\n}\n\nconst MujocoSimContext = createContext<MujocoSimContextValue | null>(null);\n\nexport function useMujoco(): 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 useBeforePhysicsStep(callback: PhysicsStepCallback) {\n const { beforeStepCallbacks } = useMujoco();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (model, data) => callbackRef.current(model, data);\n beforeStepCallbacks.current.add(wrapped);\n return () => { beforeStepCallbacks.current.delete(wrapped); };\n }, [beforeStepCallbacks]);\n}\n\nexport function useAfterPhysicsStep(callback: PhysicsStepCallback) {\n const { afterStepCallbacks } = useMujoco();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (model, data) => callbackRef.current(model, data);\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?: (api: MujocoSimAPI) => void;\n onError?: (error: Error) => void;\n onStep?: (time: number) => void;\n onSelection?: (bodyId: number, name: string) => void;\n // Declarative physics config props\n gravity?: [number, number, number];\n timestep?: number;\n substeps?: number;\n paused?: boolean;\n speed?: number;\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 children,\n}: MujocoSimProviderProps) {\n const { gl, camera } = 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 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\n configRef.current = config;\n\n // Sync declarative props to refs\n useEffect(() => { pausedRef.current = paused ?? false; }, [paused]);\n useEffect(() => { speedRef.current = speed ?? 1; }, [speed]);\n useEffect(() => { substepsRef.current = substeps ?? 1; }, [substeps]);\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 // --- Load scene on mount ---\n useEffect(() => {\n let disposed = false;\n\n (async () => {\n try {\n const result = await loadScene(mujoco, config);\n if (disposed) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\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 setStatus('error');\n onError?.(e instanceof Error ? e : new Error(String(e)));\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 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 {\n (externalApiRef as React.MutableRefObject<MujocoSimAPI | null>).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 // Step physics with substeps\n const numSubsteps = substepsRef.current;\n if (stepsToRunRef.current > 0) {\n for (let s = 0; s < stepsToRunRef.current; s++) {\n mujoco.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 mujoco.mj_step(model, data);\n }\n }\n }\n\n // After-step callbacks\n for (const cb of afterStepCallbacks.current) {\n cb(model, data);\n }\n\n onStepRef.current?.(data.time);\n }, -1);\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 mujoco.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 mujoco.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 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 mujoco.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 mujoco.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 for (let i = 0; i < ncon; i++) {\n const c = getContact(data, 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 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 limited = model.jnt_limited ? model.jnt_limited[i] !== 0 : false;\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: [model.jnt_range[2 * i], model.jnt_range[2 * i + 1]],\n limited,\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 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 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 mujoco.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, 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 configRef.current = newConfig;\n\n setStatus('ready');\n } catch (e) {\n if (gen !== loadGenRef.current) return;\n setStatus('error');\n throw e;\n }\n }, [mujoco]);\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 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 // --- 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 config,\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 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 getModelOption,\n setGravity,\n setTimestep: setTimestepApi,\n raycast,\n getKeyframeNames,\n getKeyframeCount,\n loadScene: loadSceneApi,\n getCanvasSnapshot,\n project2DTo3D,\n setBodyMass,\n setGeomFriction,\n setGeomSize,\n mjModelRef,\n mjDataRef,\n }),\n [\n status, config, reset, setSpeed, togglePause, setPaused, step,\n getTime, getTimestep, applyKeyframe, saveState, restoreState,\n setQpos, setQvel, getQpos, getQvel, setCtrl, getCtrl,\n applyForce, applyTorqueApi, setExternalForce, applyGeneralizedForce,\n getSensorData, getContacts, getBodies, getJoints, getGeoms, getSites,\n getActuatorsApi, getSensors, getModelOption, setGravity, setTimestepApi,\n raycast, getKeyframeNames, getKeyframeCount, loadSceneApi,\n getCanvasSnapshot, project2DTo3D,\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 onSelectionRef,\n beforeStepCallbacks,\n afterStepCallbacks,\n resetCallbacks,\n status,\n }),\n [api, status]\n );\n\n return (\n <MujocoSimContext.Provider value={contextValue}>\n <SceneRenderer />\n {children}\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 } 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 children,\n ...canvasProps\n },\n ref\n ) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujocoWasm();\n\n useEffect(() => {\n if (wasmStatus === 'error' && onError) {\n onError(new Error(wasmError ?? 'WASM load failed'));\n }\n }, [wasmStatus, wasmError, onError]);\n\n if (wasmStatus === 'error' || wasmStatus === 'loading' || !mujoco) {\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 >\n {children}\n </MujocoSimProvider>\n </Canvas>\n );\n }\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { forwardRef, useEffect } from 'react';\nimport { useMujocoWasm } from './MujocoProvider';\nimport { MujocoSimProvider } from './MujocoSimProvider';\nimport type { MujocoSimAPI, SceneConfig } 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?: (api: MujocoSimAPI) => void;\n /** Fires on scene load failure. */\n onError?: (error: Error) => void;\n /** Called each physics step. */\n onStep?: (time: number) => void;\n /** Called on body double-click selection. */\n onSelection?: (bodyId: number, name: string) => 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 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\n useEffect(() => {\n if (wasmStatus === 'error' && onError) {\n onError(new Error(wasmError ?? 'WASM load failed'));\n }\n }, [wasmStatus, wasmError, onError]);\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 * createController — typed factory for BYOC (Bring Your Own Controller) plugins.\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 * useBeforePhysicsStep((_model, data) => {\n * data.ctrl[0] = 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 * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * IkContext — React context for the IK controller plugin.\n */\n\nimport { createContext, useContext } from 'react';\nimport * as THREE from 'three';\n\nexport interface IkContextValue {\n ikEnabledRef: React.RefObject<boolean>;\n ikCalculatingRef: React.RefObject<boolean>;\n ikTargetRef: React.RefObject<THREE.Group>;\n siteIdRef: React.RefObject<number>;\n setIkEnabled(enabled: boolean): void;\n moveTarget(pos: THREE.Vector3, duration?: number): void;\n syncTargetToSite(): void;\n solveIK(pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null;\n getGizmoStats(): { pos: THREE.Vector3; rot: THREE.Euler } | null;\n}\n\nexport const IkContext = createContext<IkContextValue | null>(null);\n\n/**\n * Access the IK controller context.\n *\n * - `useIk()` — throws if no `<IkController>` ancestor (use inside `<IkController>`)\n * - `useIk({ optional: true })` — returns `null` if no ancestor (use in components\n * that optionally interact with IK, e.g. keyboard controllers that disable IK)\n */\nexport function useIk(): IkContextValue;\nexport function useIk(options: { optional: true }): IkContextValue | null;\nexport function useIk(options?: { optional?: boolean }): IkContextValue | null {\n const ctx = useContext(IkContext);\n if (!ctx && !options?.optional) {\n throw new Error('useIk() must be used inside an <IkController>');\n }\n return ctx;\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}\n\nconst DEFAULTS: GenericIKOptions = {\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\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 numJoints Number of arm joints (assumes qpos[0..numJoints-1])\n * @param targetPos Target position in world frame\n * @param targetQuat Target orientation in world frame\n * @param currentQ Current joint angles (length = numJoints)\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 numJoints: number,\n targetPos: THREE.Vector3,\n targetQuat: THREE.Quaternion,\n currentQ: number[],\n opts?: Partial<GenericIKOptions>\n ): number[] | null {\n const o = { ...DEFAULTS, ...opts };\n const n = numJoints;\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\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[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 saved = data.qpos[j];\n data.qpos[j] = 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[j] = saved;\n }\n\n // Restore base FK state for next iteration\n for (let i = 0; i < n; i++) data.qpos[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 * IkController — composable IK controller plugin.\n * Extracts all IK logic from MujocoSimProvider into an opt-in component.\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { createController } from '../core/createController';\nimport { IkContext, type IkContextValue } from '../core/IkContext';\nimport { useMujoco, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { GenericIK } from '../core/GenericIK';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { IkConfig, IKSolveFn, 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\nfunction IkControllerImpl({\n config,\n children,\n}: {\n config: IkConfig;\n children?: React.ReactNode;\n}) {\n const { mjModelRef, mjDataRef, mujocoRef, configRef, resetCallbacks, status } =\n useMujoco();\n\n // All IK state lives here, NOT in the provider\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 genericIkRef = useRef<GenericIK>(new GenericIK(mujocoRef.current));\n const firstIkEnableRef = useRef(true);\n\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 when model loads or config changes\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n return;\n }\n siteIdRef.current = findSiteByName(model, config.siteName);\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n }, [config.siteName, status, mjModelRef, mjDataRef]);\n\n // IK solve function — use custom solver if provided, otherwise built-in GenericIK\n const ikSolveFn = useCallback(\n (pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null => {\n if (config.ikSolveFn) return config.ikSolveFn(pos, quat, currentQ);\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || siteIdRef.current === -1) return null;\n return genericIkRef.current.solve(\n model,\n data,\n siteIdRef.current,\n config.numJoints,\n pos,\n quat,\n currentQ,\n {\n damping: config.damping,\n maxIterations: config.maxIterations,\n },\n );\n },\n [config.ikSolveFn, config.numJoints, config.damping, config.maxIterations, mjModelRef, mjDataRef],\n );\n const ikSolveFnRef = useRef<IKSolveFn>(ikSolveFn);\n ikSolveFnRef.current = ikSolveFn;\n\n // Gizmo animation + one-time initial sync in useFrame\n useFrame(() => {\n // Ensure the gizmo is positioned at the site after the first physics step\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 (!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 numJoints = config.numJoints;\n const currentQ: number[] = [];\n for (let i = 0; i < numJoints; i++) currentQ.push(data.qpos[i]);\n const solution = ikSolveFnRef.current(target.position, target.quaternion, currentQ);\n if (solution) {\n for (let i = 0; i < numJoints; i++) data.ctrl[i] = solution[i];\n }\n });\n\n // Reset callback — sync gizmo and reset IK state\n useEffect(() => {\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 () => {\n resetCallbacks.current.delete(cb);\n };\n }, [resetCallbacks, mjDataRef]);\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 (pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null => {\n return ikSolveFnRef.current(pos, quat, currentQ);\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 return <IkContext.Provider value={contextValue}>{children}</IkContext.Provider>;\n}\n\nexport const IkController = createController<IkConfig>(\n {\n name: 'IkController',\n defaultConfig: {\n damping: 0.01,\n maxIterations: 50,\n },\n },\n IkControllerImpl,\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 { useMujoco } from '../core/MujocoSimProvider';\nimport { useIk } from '../core/IkContext';\nimport { findSiteByName } from '../core/SceneLoader';\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 * Must be rendered inside an `<IkController>`.\n *\n * Props:\n * - `siteName` — MuJoCo site to track. Defaults to the IkController's configured site.\n * - `scale` — Gizmo handle scale. Default: 0.18.\n * - `onDrag` — Custom drag callback `(pos, quat) => 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({ siteName, scale = 0.18, onDrag }: IkGizmoProps) {\n const { mjModelRef, mjDataRef, status } = useMujoco();\n const { ikTargetRef, siteIdRef, ikEnabledRef, setIkEnabled } = useIk();\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 // Read IkController's siteIdRef directly in useFrame — avoids useEffect timing\n // issues (React runs child effects before parent effects, so reading siteIdRef\n // in a useEffect would see -1 before IkController resolves it).\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 // MuJoCo site_xmat is row-major 3x3; THREE.Matrix4.set() is row-major\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 ref={wrapperRef}>\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(_pos.clone(), _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 { useMujoco } from '../core/MujocoSimProvider';\nimport { getContact } 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 } = useMujoco();\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 for (let i = 0; i < count; i++) {\n const c = getContact(data, i);\n if (!c) {\n mesh.count = i;\n mesh.instanceMatrix.needsUpdate = true;\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 mesh.count = count;\n mesh.instanceMatrix.needsUpdate = true;\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group {...groupProps}>\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 { useMujoco, useBeforePhysicsStep } from '../core/MujocoSimProvider';\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 } = useMujoco();\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.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 { useMujoco } from '../core/MujocoSimProvider';\n\nexport function useSceneLights(intensity = 1.0) {\n const { mjModelRef, status } = useMujoco();\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 for (let i = 0; i < nlight; i++) {\n const active = model.light_active ? model.light_active[i] : 1;\n if (!active) continue;\n\n const lightType = model.light_type ? model.light_type[i] : 0;\n const isDirectional = lightType === 0;\n const castShadow = model.light_castshadow ? model.light_castshadow[i] !== 0 : false;\n\n const mjIntensity = model.light_intensity ? model.light_intensity[i] : 1.0;\n const finalIntensity = intensity * mjIntensity;\n\n const dr = model.light_diffuse ? model.light_diffuse[3 * i] : 1;\n const dg = model.light_diffuse ? model.light_diffuse[3 * i + 1] : 1;\n const db = model.light_diffuse ? model.light_diffuse[3 * i + 2] : 1;\n const color = new THREE.Color(dr, dg, db);\n\n const px = model.light_pos[3 * i];\n const py = model.light_pos[3 * i + 1];\n const pz = model.light_pos[3 * i + 2];\n const dx = model.light_dir[3 * i];\n const dy = model.light_dir[3 * i + 1];\n const dz = model.light_dir[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 = model.light_cutoff ? model.light_cutoff[i] : 45;\n const exponent = model.light_exponent ? model.light_exponent[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 (model.light_attenuation) {\n const att1 = model.light_attenuation[3 * i + 1];\n const att2 = model.light_attenuation[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","/**\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 * 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 { useMujoco } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { getContact } from '../types';\nimport type { DebugProps } 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 _contactPos = new THREE.Vector3();\nconst _contactNormal = new THREE.Vector3();\nconst MAX_CONTACT_ARROWS = 50;\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 showContacts = false,\n showCOM = false,\n showInertia = false,\n showTendons = false,\n ...groupProps\n}: DebugProps & Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujoco();\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 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 // 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, comMarkers };\n }, [status, mjModelRef, showGeoms, showSites, showJoints, 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.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 // 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 for (let i = 0; i < Math.min(ncon, MAX_CONTACT_ARROWS); i++) {\n const c = getContact(data, 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 // 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 {...groupProps}>\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 are NOT available in mujoco-js 0.0.7.\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 { useMujoco } 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 } = useMujoco();\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 { useMujoco } 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 } = useMujoco();\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 are NOT available in mujoco-js WASM.\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 * 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 { useMujoco, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName, getName } from '../core/SceneLoader';\nimport { getContact } from '../types';\nimport type { 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?: string,\n callback?: (contacts: ContactInfo[]) => void,\n): React.RefObject<ContactInfo[]> {\n const { mjModelRef, status } = useMujoco();\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 for (let i = 0; i < ncon; i++) {\n const c = getContact(data, 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 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: string,\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 { useMujoco } from '../core/MujocoSimProvider';\n\ninterface TrajectoryPlayerOptions {\n fps?: number;\n loop?: boolean;\n}\n\n/**\n * Play back a sequence of qpos frames, overriding simulation state.\n *\n * When playing, the simulation is effectively paused and qpos is set\n * from the trajectory each render frame at the specified FPS.\n */\nexport function useTrajectoryPlayer(\n trajectory: number[][],\n options: TrajectoryPlayerOptions = {},\n) {\n const { mjModelRef, mjDataRef, mujocoRef, pausedRef } = useMujoco();\n const fps = options.fps ?? 30;\n const loop = options.loop ?? false;\n\n const playingRef = useRef(false);\n const frameRef = useRef(0);\n const lastFrameTimeRef = useRef(0);\n\n const play = useCallback(() => {\n playingRef.current = true;\n pausedRef.current = true; // Pause sim during playback\n lastFrameTimeRef.current = performance.now();\n }, [pausedRef]);\n\n const pause = useCallback(() => {\n playingRef.current = false;\n }, []);\n\n const seek = useCallback((frameIdx: number) => {\n frameRef.current = Math.max(0, Math.min(frameIdx, trajectory.length - 1));\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || !trajectory[frameRef.current]) return;\n const qpos = trajectory[frameRef.current];\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 }, [trajectory, mjModelRef, mjDataRef, mujocoRef]);\n\n const reset = useCallback(() => {\n frameRef.current = 0;\n playingRef.current = false;\n pausedRef.current = false;\n }, [pausedRef]);\n\n useFrame(() => {\n if (!playingRef.current || trajectory.length === 0) return;\n\n const now = performance.now();\n const elapsed = now - lastFrameTimeRef.current;\n const frameInterval = 1000 / fps;\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 = trajectory[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 >= trajectory.length) {\n if (loop) {\n frameRef.current = 0;\n } else {\n playingRef.current = false;\n pausedRef.current = false;\n }\n }\n });\n\n return {\n play,\n pause,\n seek,\n reset,\n get frame() { return frameRef.current; },\n get playing() { return playingRef.current; },\n get totalFrames() { return trajectory.length; },\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 loop = false,\n playing = false,\n onFrame,\n}: TrajectoryPlayerProps) {\n const player = useTrajectoryPlayer(trajectory, { fps, loop });\n const onFrameRef = useRef(onFrame);\n onFrameRef.current = onFrame;\n const lastReportedFrameRef = useRef(-1);\n\n useEffect(() => {\n if (playing) {\n player.play();\n } else {\n player.pause();\n }\n }, [playing, player]);\n\n // Use useFrame instead of setInterval to sync with the render loop\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(currentFrame);\n }\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo } from 'react';\nimport { useMujoco } 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 } = useMujoco();\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 { useMujoco } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { 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: string): SitePositionResult {\n const { mjModelRef, mjDataRef, status } = useMujoco();\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 { useMujoco, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { SensorInfo, SensorResult } from '../types';\n\n/**\n * Access a single MuJoCo sensor by name. Returns a ref-based value\n * updated every physics frame without causing React re-renders.\n */\nexport function useSensor(name: string): SensorResult {\n const { mjModelRef, mjDataRef, status } = useMujoco();\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((_model, 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 { value: valueRef, size: sensorDimRef.current };\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 } = useMujoco();\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 { useMujoco, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { JointStateResult } 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 (stored as Float64Array of length 1).\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: string): JointStateResult {\n const { mjModelRef, mjDataRef, status } = useMujoco();\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 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 for multi-DOF joints\n if (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, status, mjModelRef]);\n\n useAfterPhysicsStep((_model, data) => {\n if (jointIdRef.current < 0) return;\n const qa = qposAdrRef.current;\n const da = dofAdrRef.current;\n if (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 { useMujoco, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { 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: string): BodyStateResult {\n const { mjModelRef, status } = useMujoco();\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((_model, 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 * useCtrl — clean read/write access to a named actuator's ctrl value (spec 3.1)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujoco } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\n\n/**\n * Access a single actuator's control value by name.\n *\n * Returns [currentValue, setValue]:\n * - `currentValue` is a ref updated every frame (no re-renders).\n * - `setValue` writes directly to `data.ctrl[actuatorId]`.\n */\nexport function useCtrl(name: string): [React.RefObject<number>, (value: number) => void] {\n const { mjModelRef, mjDataRef, status } = useMujoco();\n const actuatorIdRef = useRef(-1);\n const valueRef = useRef(0);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n actuatorIdRef.current = findActuatorByName(model, name);\n }, [name, status, mjModelRef]);\n\n // Read current value each frame (via afterStep would be ideal but\n // useCtrl is primarily for writing; reading can use the ref)\n const setValue = useCallback((value: number) => {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return;\n data.ctrl[actuatorIdRef.current] = value;\n valueRef.current = value;\n }, [mjDataRef]);\n\n return [valueRef, setValue];\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 { useMujoco, 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 } = useMujoco();\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((_model, 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 * usePolicy — policy decimation loop hook (spec 10.1)\n */\n\nimport { useRef } from 'react';\nimport { useMujoco, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport type { PolicyConfig } from '../types';\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) {\n const { mjModelRef } = useMujoco();\n const lastActionTimeRef = useRef(0);\n const lastActionRef = useRef<Float32Array | Float64Array | number[] | null>(null);\n const isRunningRef = useRef(true);\n const configRef = useRef(config);\n configRef.current = config;\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 // Build observation\n const obs = cfg.onObservation(model, data);\n\n // Apply action (consumer does inference inline or uses cached result)\n cfg.onAction(obs, model, data);\n\n lastActionTimeRef.current = data.time;\n lastActionRef.current = obs;\n }\n });\n\n return {\n get isRunning() { return isRunningRef.current; },\n start: () => { isRunningRef.current = true; },\n stop: () => { isRunningRef.current = false; },\n get lastObservation() { return lastActionRef.current; },\n };\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 { useMujoco, 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 } = useMujoco();\n const recordingRef = useRef(false);\n const framesRef = useRef<TrajectoryFrame[]>([]);\n const fields = options.fields ?? ['qpos'];\n\n useAfterPhysicsStep((_model, 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 { useMujoco, 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 } = useMujoco();\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((_model, 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 * useCtrlNoise — control noise / perturbation hook (spec 3.2)\n */\n\nimport { useRef } from 'react';\nimport { useMujoco, 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 } = useMujoco();\n const configRef = useRef(config);\n configRef.current = config;\n const noiseRef = useRef<Float64Array | null>(null);\n\n useBeforePhysicsStep((_model, 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"]}
|