mujoco-react 8.8.0 → 8.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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/ObservationBuilder.ts","../src/core/createController.tsx","../src/core/GenericIK.ts","../src/hooks/useIkController.ts","../src/components/Body.tsx","../src/components/IkGizmo.tsx","../src/components/ContactMarkers.tsx","../src/components/DragInteraction.tsx","../src/hooks/useSceneLights.ts","../src/components/SceneLights.tsx","../src/components/Debug.tsx","../src/components/TendonRenderer.tsx","../src/components/FlexRenderer.tsx","../src/components/InstancedGeomRenderer.tsx","../src/hooks/useContacts.ts","../src/components/ContactListener.tsx","../src/hooks/useTrajectoryPlayer.ts","../src/components/TrajectoryPlayer.tsx","../src/hooks/useActuators.ts","../src/hooks/useSitePosition.ts","../src/hooks/useGravityCompensation.ts","../src/hooks/useSensor.ts","../src/hooks/useJointState.ts","../src/hooks/useBodyState.ts","../src/hooks/useCtrl.ts","../src/hooks/useKeyboardTeleop.ts","../src/hooks/usePolicy.ts","../src/hooks/useObservation.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","JOINT_TYPE_NAMES","THREE5","createContext","useContext","useState","api","useFrame","getQpos","getCtrl","useMemo","MujocoCanvas","forwardRef","MujocoPhysics","s","tmp","THREE6","useCallback","THREE7","useThree","THREE8","jsxs","THREE9","THREE10","_quat","THREE12","THREE13","GEOM_TYPE_NAMES","THREE14","_mat4","THREE15","SENSOR_TYPE_NAMES","THREE16","THREE17","THREE18"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport loadMujoco from '@mujoco/mujoco';\nimport defaultMujocoWasmUrl from '@mujoco/mujoco/mujoco.wasm?url';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport type { MujocoModule, MujocoContextValue } from '../types';\n\nconst MujocoContext = createContext<MujocoContextValue>({\n mujoco: null,\n status: 'loading',\n error: null,\n});\n\n/**\n * Hook to access the MuJoCo WASM module.\n */\nexport function useMujocoWasm(): MujocoContextValue {\n return useContext(MujocoContext);\n}\n\nexport type MujocoWasmVariant = 'single' | 'threaded' | 'auto';\n\nexport interface MujocoLoaderOptions {\n locateFile?: (path: string) => string;\n printErr?: (text: string) => void;\n}\n\nexport type MujocoLoader = (options?: MujocoLoaderOptions) => Promise<unknown>;\n\nexport interface MujocoProviderProps {\n wasmUrl?: string;\n /** Optional URL for the multi-threaded WASM asset. */\n mtWasmUrl?: string;\n /**\n * Optional official multi-threaded loader, usually imported from\n * `@mujoco/mujoco/mt`. It is supplied by the app so the default package path\n * does not force every bundler to process the threaded Emscripten build.\n */\n threadedLoader?: MujocoLoader;\n /**\n * MuJoCo WASM build to load. `single` is the default and works everywhere.\n * `threaded` requires `threadedLoader` and cross-origin isolation. `auto`\n * uses threaded only when both conditions are satisfied.\n */\n wasmVariant?: MujocoWasmVariant;\n /** Timeout in ms for WASM module load. Default: 30000. */\n timeout?: number;\n children: React.ReactNode;\n onError?: (error: Error) => void;\n}\n\nfunction canUseThreadedWasm(): boolean {\n return typeof globalThis !== 'undefined' && globalThis.crossOriginIsolated === true;\n}\n\nfunction isMujocoModule(value: unknown): value is MujocoModule {\n return typeof value === 'object'\n && value !== null\n && 'FS' in value\n && 'MjModel' in value\n && 'MjData' in value\n && 'mj_step' in value;\n}\n\nfunction hasWasmUrl(value: string | undefined): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\nfunction resolveWasmVariant(\n variant: MujocoWasmVariant | undefined,\n threadedLoader: MujocoLoader | undefined,\n mtWasmUrl: string | undefined\n): 'single' | 'threaded' {\n if (variant === 'threaded') return 'threaded';\n if (variant === 'auto' && threadedLoader && mtWasmUrl && canUseThreadedWasm()) return 'threaded';\n return 'single';\n}\n\n/**\n * MujocoProvider — WASM / module lifecycle.\n * Loads the MuJoCo WASM module on mount and provides it to children via context.\n */\nexport function MujocoProvider({\n wasmUrl,\n mtWasmUrl,\n threadedLoader,\n wasmVariant = 'single',\n timeout = 30000,\n children,\n onError,\n}: MujocoProviderProps) {\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n const [error, setError] = useState<string | null>(null);\n const moduleRef = useRef<MujocoModule | null>(null);\n const isMounted = useRef(true);\n\n useEffect(() => {\n isMounted.current = true;\n\n const variant = resolveWasmVariant(wasmVariant, threadedLoader, mtWasmUrl);\n if (variant === 'threaded' && !threadedLoader) {\n const err = new Error('MujocoProvider wasmVariant=\"threaded\" requires a threadedLoader from @mujoco/mujoco/mt');\n setError(err.message);\n setStatus('error');\n onError?.(err);\n return;\n }\n let selectedWasmUrl = wasmUrl ?? defaultMujocoWasmUrl;\n\n if (variant === 'threaded') {\n if (!hasWasmUrl(mtWasmUrl)) {\n const err = new Error('MujocoProvider wasmVariant=\"threaded\" requires mtWasmUrl from @mujoco/mujoco/mt/mujoco.wasm?url');\n setError(err.message);\n setStatus('error');\n onError?.(err);\n return;\n }\n selectedWasmUrl = mtWasmUrl;\n }\n\n const load: MujocoLoader = variant === 'threaded' && threadedLoader ? threadedLoader : loadMujoco;\n\n const wasmPromise = load({\n locateFile: (path: string) => path.endsWith('.wasm') ? selectedWasmUrl : path,\n printErr: (text: string) => {\n if (text.includes('Aborted') && isMounted.current) {\n setError('Simulation crashed. Reload page.');\n setStatus('error');\n }\n },\n });\n\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`WASM module load timed out after ${timeout}ms`)), timeout)\n );\n\n Promise.race([wasmPromise, timeoutPromise])\n .then((inst: unknown) => {\n if (isMounted.current) {\n if (!isMujocoModule(inst)) {\n throw new Error('MuJoCo WASM module initialized with an unexpected shape');\n }\n moduleRef.current = inst;\n setStatus('ready');\n }\n })\n .catch((err: Error) => {\n if (isMounted.current) {\n const msg = err.message || 'Failed to init spatial simulation';\n setError(msg);\n setStatus('error');\n onError?.(new Error(msg));\n }\n });\n\n return () => {\n isMounted.current = false;\n };\n }, [wasmUrl, mtWasmUrl, threadedLoader, wasmVariant, timeout, onError]);\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 React from 'react';\nimport type { ReactNode } from 'react';\nimport type { CanvasProps } from '@react-three/fiber';\nimport * as THREE from 'three';\n\n// ---- Register (type-safe named resources) ----\n\n/**\n * Module augmentation interface for type-safe resource names.\n *\n * Declare your model's resource names via module augmentation:\n * ```ts\n * declare module 'mujoco-react' {\n * interface Register {\n * robots: {\n * panda: {\n * actuators: 'joint1' | 'joint2' | 'gripper';\n * sensors: 'force_sensor' | 'torque_sensor';\n * bodies: 'link0' | 'link1' | 'hand';\n * };\n * };\n * actuators: 'joint1' | 'joint2' | 'gripper';\n * sensors: 'force_sensor' | 'torque_sensor';\n * bodies: 'link0' | 'link1' | 'hand';\n * }\n * }\n * ```\n *\n * When no augmentation is declared, all names fall back to `string`.\n */\nexport interface Register {}\n\nexport type RegisteredRobotMap = Register extends { robots: infer T extends Record<string, Record<string, string>> }\n ? T\n : never;\nexport type Robots = [RegisteredRobotMap] extends [never] ? string : Extract<keyof RegisteredRobotMap, string>;\nexport type RobotResource<TRobot extends string, TKey extends string> =\n [RegisteredRobotMap] extends [never]\n ? string\n : TRobot extends keyof RegisteredRobotMap\n ? TKey extends keyof RegisteredRobotMap[TRobot]\n ? RegisteredRobotMap[TRobot][TKey]\n : string\n : never;\nexport type RobotActuators<TRobot extends string> = RobotResource<TRobot, 'actuators'>;\nexport type RobotSensors<TRobot extends string> = RobotResource<TRobot, 'sensors'>;\nexport type RobotBodies<TRobot extends string> = RobotResource<TRobot, 'bodies'>;\nexport type RobotJoints<TRobot extends string> = RobotResource<TRobot, 'joints'>;\nexport type RobotSites<TRobot extends string> = RobotResource<TRobot, 'sites'>;\nexport type RobotGeoms<TRobot extends string> = RobotResource<TRobot, 'geoms'>;\nexport type RobotKeyframes<TRobot extends string> = RobotResource<TRobot, 'keyframes'>;\n\nexport type Actuators = Register extends { actuators: infer T extends string } ? T : string;\nexport type Sensors = Register extends { sensors: infer T extends string } ? T : string;\nexport type Bodies = Register extends { bodies: infer T extends string } ? T : string;\nexport type Joints = Register extends { joints: infer T extends string } ? T : string;\nexport type Sites = Register extends { sites: infer T extends string } ? T : string;\nexport type Geoms = Register extends { geoms: infer T extends string } ? T : string;\nexport type Keyframes = Register extends { keyframes: infer T extends string } ? T : string;\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 delete?: () => void;\n}\n\n/**\n * Read a single contact from an already-acquired WASM contact array.\n * Returns undefined if the access fails (WASM heap issue, bad index, etc.).\n */\nexport function getContact(contacts: MujocoContactArray, i: number): MujocoContact | undefined {\n try {\n return contacts.get(i);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Access the current contact vector and release the copied WASM handle afterwards.\n */\nexport function withContacts<T>(data: MujocoData, read: (contacts: MujocoContactArray) => T): T {\n const contacts = data.contact;\n try {\n return read(contacts);\n } finally {\n contacts.delete?.();\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: {\n from_xml_path?: (path: string) => MujocoModel;\n from_xml_string?: (xml: string, vfs?: unknown) => MujocoModel;\n loadFromXML?: (path: string) => MujocoModel;\n [key: string]: unknown;\n };\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 type LocalMujocoFile = File;\n\nexport interface LoadFromFilesOptions {\n /** Entry MJCF/URDF file. Inferred from scene.xml, model.xml, robot.xml, or the first XML/URDF file when omitted. */\n sceneFile?: string;\n homeJoints?: number[];\n xmlPatches?: XmlPatch[];\n sceneObjects?: SceneObject[];\n onReset?: (model: MujocoModel, data: MujocoData) => void;\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 or URDF file name, e.g. 'scene.xml' or 'robot.urdf'. */\n sceneFile: string;\n /** Browser-selected files for local MJCF/URDF loading. Preserves webkitRelativePath when available. */\n files?: readonly LocalMujocoFile[];\n sceneObjects?: SceneObject[];\n homeJoints?: number[];\n xmlPatches?: XmlPatch[];\n onReset?: (model: MujocoModel, data: MujocoData) => void;\n}\n\n// ---- IK Controller Config ----\n\nexport type ResourceSelector<TInfo, TName extends string = string> =\n | TName\n | readonly TName[]\n | RegExp\n | ((info: TInfo) => boolean);\n\nexport interface IkConfig {\n /** MuJoCo site name for IK target. */\n siteName: Sites;\n /**\n * Explicit joints for IK. When omitted, the controller infers scalar hinge/slide\n * joints by walking from the site body to the model root.\n */\n joints?: ResourceSelector<JointInfo, Joints>;\n /** Explicit actuators for IK control output. */\n actuators?: ResourceSelector<ActuatorInfo, Actuators>;\n /**\n * Number of joints to solve for, assuming legacy contiguous qpos/ctrl layout\n * starting at index 0. Prefer inferred IK or `joints`/`actuators`.\n */\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 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 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 context?: IKSolveContext\n) => number[] | null;\n\nexport interface IKSolveContext {\n model: MujocoModel;\n data: MujocoData;\n siteId: number;\n controlGroup: ControlGroupInfo;\n}\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 ActuatedJointInfo extends JointInfo {\n actuatorId: number;\n actuatorName: string;\n ctrlAdr: number;\n ctrlRange: [number, number];\n}\n\nexport interface ControlJointInfo extends JointInfo {\n actuatorId: number | null;\n actuatorName: string | null;\n ctrlAdr: number | null;\n ctrlRange: [number, number] | null;\n}\n\nexport interface ControlGroupSelector {\n /** Infer a kinematic chain from a MuJoCo site. */\n siteName?: Sites;\n /** Infer a kinematic chain from a body. */\n bodyName?: Bodies;\n /** Select joints by name, names, regex, or predicate. */\n joints?: ResourceSelector<JointInfo, Joints>;\n /** Select actuators by name, names, regex, or predicate. */\n actuators?: ResourceSelector<ActuatorInfo, Actuators>;\n}\n\nexport interface ControlGroupInfo {\n /** Joints in solve/control order. */\n joints: ControlJointInfo[];\n /** Actuators in control output order. */\n actuators: ActuatorInfo[];\n /** qpos addresses for scalar hinge/slide joints. */\n qposAdr: number[];\n /** dof addresses for scalar hinge/slide joints. */\n dofAdr: number[];\n /** ctrl addresses matching writable actuators. */\n ctrlAdr: number[];\n readQpos(data: MujocoData): Float64Array;\n readCtrl(data: MujocoData): Float64Array;\n writeQpos(data: MujocoData, values: ArrayLike<number>): void;\n writeCtrl(data: MujocoData, values: ArrayLike<number>): void;\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\nexport type PlaybackState = 'idle' | 'playing' | 'paused' | 'completed';\n\n// ---- Keyboard Teleop (spec 12.1) ----\n\nexport interface KeyBinding {\n actuator: Actuators;\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// ---- Observation Builder ----\n\nexport type ObservationOutput = 'float32' | 'float64';\n\nexport interface ObservationConfig {\n /** Include scalar simulation time. */\n time?: boolean;\n /** Include all qpos values. */\n qpos?: boolean;\n /** Include all qvel values. */\n qvel?: boolean;\n /** Include all ctrl values. */\n ctrl?: boolean;\n /** Include all actuator activation values. */\n act?: boolean;\n /** Include all raw sensordata values. */\n sensordata?: boolean;\n /** Include named sensor values in the configured order. */\n sensors?: readonly Sensors[];\n /** Include named site world positions in the configured order. */\n sites?: readonly Sites[];\n /** Include world gravity projected into each named body's local frame. */\n projectedGravity?: Bodies | readonly Bodies[];\n /** Output array type. Defaults to Float32Array. */\n output?: ObservationOutput;\n}\n\nexport interface ObservationLayoutItem {\n name: string;\n start: number;\n size: number;\n}\n\nexport interface ObservationResult {\n values: Float32Array | Float64Array;\n layout: ObservationLayoutItem[];\n}\n\nexport interface ObservationHandle {\n /** Read a fresh observation from the current live MuJoCo model/data refs. */\n read(): ObservationResult;\n /** Read just the vector values for policy inference. */\n readValues(): Float32Array | Float64Array;\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 controller: IkContextValue;\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 type TrajectoryInput = TrajectoryFrame[] | number[][];\n\nexport interface TrajectoryPlayerProps {\n trajectory: TrajectoryInput;\n fps?: number;\n speed?: number;\n loop?: boolean;\n playing?: boolean;\n mode?: 'kinematic' | 'physics';\n onFrame?: (frameIdx: number) => void;\n onComplete?: () => void;\n onStateChange?: (state: PlaybackState) => void;\n}\n\nexport interface SelectionHighlightProps {\n bodyId: number | null;\n color?: string;\n emissiveIntensity?: number;\n}\n\nexport interface ContactListenerProps {\n body: Bodies;\n onContactEnter?: (info: ContactInfo) => void;\n onContactExit?: (info: ContactInfo) => void;\n}\n\nexport interface BodyProps {\n name: Bodies;\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 children?: ReactNode;\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: Keyframes | 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: Actuators | Record<Actuators, number>, value?: number): void;\n getCtrl(): Float64Array;\n getControlMap(): ControlGroupInfo;\n getActuatedJoints(): ActuatedJointInfo[];\n resolveControlGroup(selector: ControlGroupSelector): ControlGroupInfo | null;\n\n // Force application (spec 8.1)\n applyForce(bodyName: Bodies, force: THREE.Vector3, point?: THREE.Vector3): void;\n applyTorque(bodyName: Bodies, torque: THREE.Vector3): void;\n setExternalForce(bodyName: Bodies, force: THREE.Vector3, torque: THREE.Vector3): void;\n applyGeneralizedForce(values: Float64Array | number[]): void;\n\n // Sensors (spec 2.1)\n getSensorData(name: Sensors): 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 loadFromFiles(files: FileList | readonly LocalMujocoFile[], options?: LoadFromFilesOptions): Promise<void>;\n addBody(body: SceneObject): Promise<void>;\n removeBody(name: Bodies): Promise<void>;\n recompile(patches?: XmlPatch[]): 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: Bodies, mass: number): void;\n setGeomFriction(name: Geoms, friction: [number, number, number]): void;\n setGeomSize(name: Geoms, 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 interpolate?: boolean;\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\n/** @deprecated Use `SensorHandle` instead. */\nexport interface SensorResult {\n value: React.RefObject<Float64Array>;\n size: number;\n}\n\nexport interface CtrlHandle {\n /** Read the current ctrl value. */\n read(): number;\n /** Write a ctrl value (goes directly to data.ctrl). */\n write(value: number): void;\n /** Actuator name. */\n name: Actuators;\n /** Actuator control range [min, max]. */\n range: [number, number];\n}\n\nexport interface SensorHandle {\n /** Read the current sensor data. */\n read(): Float64Array;\n /** Sensor dimensionality. */\n dim: number;\n /** Sensor name. */\n name: Sensors;\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 MuJoCo WASM binding versions.\n const getVal = (v: unknown) => (v as { value: number })?.value ?? v;\n\n if (type === getVal(MG.mjGEOM_PLANE)) {\n // Planes are infinite in MuJoCo, but 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 type {\n ActuatedJointInfo,\n ActuatorInfo,\n ControlGroupInfo,\n ControlGroupSelector,\n ControlJointInfo,\n JointInfo,\n LoadFromFilesOptions,\n LocalMujocoFile,\n MujocoData,\n MujocoModel,\n MujocoModule,\n ResourceSelector,\n} from '../types';\nimport { SceneConfig, SceneObject, XmlPatch } from '../types';\n\nconst JOINT_TYPE_NAMES: Record<number, string> = {\n 0: 'free',\n 1: 'ball',\n 2: 'slide',\n 3: 'hinge',\n};\n\n/**\n * Reads a null-terminated C string from MuJoCo's WASM memory.\n */\nexport function getName(mjModel: MujocoModel, address: number): string {\n let name = '';\n let idx = address;\n let safety = 0;\n while (mjModel.names[idx] !== 0 && safety < 100) {\n name += String.fromCharCode(mjModel.names[idx++]);\n safety++;\n }\n return name;\n}\n\n/**\n * Find a site by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSiteByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsite; i++) {\n if (getName(mjModel, mjModel.name_siteadr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find an actuator by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findActuatorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nu; i++) {\n if (getName(mjModel, mjModel.name_actuatoradr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find a keyframe by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findKeyframeByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nkey; i++) {\n if (getName(mjModel, mjModel.name_keyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a body by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findBodyByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nbody; i++) {\n if (getName(mjModel, mjModel.name_bodyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a joint by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findJointByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.njnt; i++) {\n if (getName(mjModel, mjModel.name_jntadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a geom by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findGeomByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.ngeom; i++) {\n if (getName(mjModel, mjModel.name_geomadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a sensor by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSensorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsensor; i++) {\n if (getName(mjModel, mjModel.name_sensoradr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a tendon by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findTendonByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < (mjModel.ntendon ?? 0); i++) {\n if (getName(mjModel, mjModel.name_tendonadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Return qpos address for actuators that directly target a scalar joint.\n * Returns -1 for non-joint transmissions and multi-DOF joints.\n */\nexport function getActuatedScalarQposAdr(mjModel: MujocoModel, actuatorId: number): number {\n if (actuatorId < 0 || actuatorId >= mjModel.nu) return -1;\n\n // mjTRN_JOINT=0, mjTRN_JOINTINPARENT=1. Other transmission types don't map ctrl to a single qpos.\n const trnType = mjModel.actuator_trntype?.[actuatorId];\n if (trnType !== undefined && trnType !== 0 && trnType !== 1) return -1;\n\n const jointId = mjModel.actuator_trnid[2 * actuatorId];\n if (jointId < 0 || jointId >= mjModel.njnt) return -1;\n\n const jntType = mjModel.jnt_type[jointId];\n if (jntType !== 2 && jntType !== 3) return -1; // slide=2, hinge=3\n\n return mjModel.jnt_qposadr[jointId];\n}\n\nfunction getScalarJointDim(jointType: number): 0 | 1 {\n return jointType === 2 || jointType === 3 ? 1 : 0;\n}\n\nfunction unlimitedRange(): [number, number] {\n return [-Infinity, Infinity];\n}\n\nfunction isScalarJoint(mjModel: MujocoModel, jointId: number): boolean {\n return jointId >= 0 && jointId < mjModel.njnt && getScalarJointDim(mjModel.jnt_type[jointId]) === 1;\n}\n\nfunction getActuatorJointId(mjModel: MujocoModel, actuatorId: number): number {\n if (actuatorId < 0 || actuatorId >= mjModel.nu) return -1;\n const trnType = mjModel.actuator_trntype?.[actuatorId];\n if (trnType !== undefined && trnType !== 0 && trnType !== 1) return -1;\n const jointId = mjModel.actuator_trnid[2 * actuatorId];\n return isScalarJoint(mjModel, jointId) ? jointId : -1;\n}\n\nfunction getJointInfo(mjModel: MujocoModel, jointId: number): JointInfo {\n const type = mjModel.jnt_type[jointId];\n const range: [number, number] = [mjModel.jnt_range[2 * jointId], mjModel.jnt_range[2 * jointId + 1]];\n return {\n id: jointId,\n name: getName(mjModel, mjModel.name_jntadr[jointId]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range,\n limited: range[0] < range[1],\n bodyId: mjModel.jnt_bodyid[jointId],\n qposAdr: mjModel.jnt_qposadr[jointId],\n dofAdr: mjModel.jnt_dofadr[jointId],\n };\n}\n\nfunction getActuatorInfo(mjModel: MujocoModel, actuatorId: number): ActuatorInfo {\n const hasRange = mjModel.actuator_ctrlrange[2 * actuatorId] < mjModel.actuator_ctrlrange[2 * actuatorId + 1];\n return {\n id: actuatorId,\n name: getName(mjModel, mjModel.name_actuatoradr[actuatorId]),\n range: hasRange\n ? [mjModel.actuator_ctrlrange[2 * actuatorId], mjModel.actuator_ctrlrange[2 * actuatorId + 1]]\n : unlimitedRange(),\n };\n}\n\nfunction includesResourceName(names: readonly string[], name: string): boolean {\n return names.includes(name);\n}\n\nfunction matchesSelector<TInfo extends { name: string }, TName extends string>(\n info: TInfo,\n selector: ResourceSelector<TInfo, TName>\n): boolean {\n if (typeof selector === 'string') return info.name === selector;\n if (selector instanceof RegExp) return selector.test(info.name);\n if (Array.isArray(selector)) return includesResourceName(selector, info.name);\n if (typeof selector === 'function') return selector(info);\n return false;\n}\n\nfunction orderedJointIdsFromSelector(\n mjModel: MujocoModel,\n selector: ResourceSelector<JointInfo, string>\n): number[] {\n if (typeof selector === 'string') {\n const id = findJointByName(mjModel, selector);\n return id >= 0 && isScalarJoint(mjModel, id) ? [id] : [];\n }\n if (Array.isArray(selector)) {\n return selector\n .map((name) => findJointByName(mjModel, name))\n .filter((id) => id >= 0 && isScalarJoint(mjModel, id));\n }\n const ids: number[] = [];\n for (let i = 0; i < mjModel.njnt; i++) {\n if (!isScalarJoint(mjModel, i)) continue;\n const info = getJointInfo(mjModel, i);\n if (matchesSelector(info, selector)) ids.push(i);\n }\n return ids;\n}\n\nfunction orderedActuatorIdsFromSelector(\n mjModel: MujocoModel,\n selector: ResourceSelector<ActuatorInfo, string>\n): number[] {\n if (typeof selector === 'string') {\n const id = findActuatorByName(mjModel, selector);\n return id >= 0 && getActuatorJointId(mjModel, id) >= 0 ? [id] : [];\n }\n if (Array.isArray(selector)) {\n return selector\n .map((name) => findActuatorByName(mjModel, name))\n .filter((id) => id >= 0 && getActuatorJointId(mjModel, id) >= 0);\n }\n const ids: number[] = [];\n for (let i = 0; i < mjModel.nu; i++) {\n if (getActuatorJointId(mjModel, i) < 0) continue;\n const info = getActuatorInfo(mjModel, i);\n if (matchesSelector(info, selector)) ids.push(i);\n }\n return ids;\n}\n\nfunction inferScalarJointChain(mjModel: MujocoModel, bodyId: number): number[] {\n if (bodyId < 0 || bodyId >= mjModel.nbody) return [];\n const chainByBody: number[][] = [];\n let current = bodyId;\n const seen = new Set<number>();\n\n while (current >= 0 && current < mjModel.nbody && !seen.has(current)) {\n seen.add(current);\n const joints: number[] = [];\n const jointCount = mjModel.body_jntnum[current] ?? 0;\n const jointStart = mjModel.body_jntadr[current] ?? -1;\n for (let i = 0; i < jointCount; i++) {\n const jointId = jointStart + i;\n if (isScalarJoint(mjModel, jointId)) joints.push(jointId);\n }\n if (joints.length) chainByBody.push(joints);\n const parent = mjModel.body_parentid[current];\n if (parent === current) break;\n current = parent;\n }\n\n return chainByBody.reverse().flat();\n}\n\nfunction unique(values: number[]): number[] {\n const seen = new Set<number>();\n const result: number[] = [];\n for (const value of values) {\n if (seen.has(value)) continue;\n seen.add(value);\n result.push(value);\n }\n return result;\n}\n\nfunction findActuatorForJoint(mjModel: MujocoModel, jointId: number, preferredActuatorIds?: number[]): number {\n const search = preferredActuatorIds ?? Array.from({ length: mjModel.nu }, (_, i) => i);\n for (const actuatorId of search) {\n if (getActuatorJointId(mjModel, actuatorId) === jointId) return actuatorId;\n }\n return -1;\n}\n\nfunction buildControlGroup(\n mjModel: MujocoModel,\n jointIds: number[],\n preferredActuatorIds?: number[]\n): ControlGroupInfo | null {\n const ids = unique(jointIds).filter((id) => isScalarJoint(mjModel, id));\n if (!ids.length) return null;\n\n const joints: ControlJointInfo[] = [];\n const actuators: ActuatorInfo[] = [];\n const qposAdr: number[] = [];\n const dofAdr: number[] = [];\n const ctrlAdr: number[] = [];\n\n for (const jointId of ids) {\n const actuatorId = findActuatorForJoint(mjModel, jointId, preferredActuatorIds);\n const joint = getJointInfo(mjModel, jointId);\n qposAdr.push(joint.qposAdr);\n dofAdr.push(joint.dofAdr);\n\n if (actuatorId >= 0) {\n const actuator = getActuatorInfo(mjModel, actuatorId);\n actuators.push(actuator);\n ctrlAdr.push(actuatorId);\n joints.push({\n ...joint,\n actuatorId,\n actuatorName: actuator.name,\n ctrlAdr: actuatorId,\n ctrlRange: actuator.range,\n });\n } else {\n joints.push({\n ...joint,\n actuatorId: null,\n actuatorName: null,\n ctrlAdr: null,\n ctrlRange: null,\n });\n }\n }\n\n return {\n joints,\n actuators,\n qposAdr,\n dofAdr,\n ctrlAdr,\n readQpos(data: MujocoData) {\n return new Float64Array(qposAdr.map((adr) => data.qpos[adr] ?? 0));\n },\n readCtrl(data: MujocoData) {\n return new Float64Array(joints.map((joint) => joint.ctrlAdr === null ? 0 : data.ctrl[joint.ctrlAdr] ?? 0));\n },\n writeQpos(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, qposAdr.length); i++) {\n data.qpos[qposAdr[i]] = values[i];\n }\n },\n writeCtrl(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, joints.length); i++) {\n const adr = joints[i].ctrlAdr;\n if (adr !== null) data.ctrl[adr] = values[i];\n }\n },\n };\n}\n\nexport function getActuatedJoints(mjModel: MujocoModel): ActuatedJointInfo[] {\n const result: ActuatedJointInfo[] = [];\n for (let actuatorId = 0; actuatorId < mjModel.nu; actuatorId++) {\n const jointId = getActuatorJointId(mjModel, actuatorId);\n if (jointId < 0) continue;\n const actuator = getActuatorInfo(mjModel, actuatorId);\n result.push({\n ...getJointInfo(mjModel, jointId),\n actuatorId,\n actuatorName: actuator.name,\n ctrlAdr: actuatorId,\n ctrlRange: actuator.range,\n });\n }\n return result;\n}\n\nexport function getControlMap(mjModel: MujocoModel): ControlGroupInfo {\n const actuatorIds = Array.from({ length: mjModel.nu }, (_, i) => i)\n .filter((id) => getActuatorJointId(mjModel, id) >= 0);\n const jointIds = actuatorIds.map((id) => getActuatorJointId(mjModel, id));\n return buildControlGroup(mjModel, jointIds, actuatorIds) ?? createContiguousControlGroup(mjModel, 0);\n}\n\nexport function resolveControlGroup(\n mjModel: MujocoModel,\n selector: ControlGroupSelector\n): ControlGroupInfo | null {\n if (selector.actuators) {\n const actuatorIds = orderedActuatorIdsFromSelector(mjModel, selector.actuators);\n const jointIds = actuatorIds.map((id) => getActuatorJointId(mjModel, id));\n return buildControlGroup(mjModel, jointIds, actuatorIds);\n }\n\n if (selector.joints) {\n return buildControlGroup(mjModel, orderedJointIdsFromSelector(mjModel, selector.joints));\n }\n\n if (selector.siteName) {\n const siteId = findSiteByName(mjModel, selector.siteName);\n const bodyId = siteId >= 0 ? (mjModel.site_bodyid?.[siteId] ?? -1) : -1;\n return buildControlGroup(mjModel, inferScalarJointChain(mjModel, bodyId));\n }\n\n if (selector.bodyName) {\n return buildControlGroup(mjModel, inferScalarJointChain(mjModel, findBodyByName(mjModel, selector.bodyName)));\n }\n\n return getControlMap(mjModel);\n}\n\nexport function createContiguousControlGroup(mjModel: MujocoModel, count: number): ControlGroupInfo {\n const n = Math.max(0, Math.min(count, mjModel.nq, mjModel.nu));\n const joints: ControlJointInfo[] = [];\n const actuators: ActuatorInfo[] = [];\n const qposAdr: number[] = [];\n const dofAdr: number[] = [];\n const ctrlAdr: number[] = [];\n\n for (let i = 0; i < n; i++) {\n qposAdr.push(i);\n dofAdr.push(i);\n ctrlAdr.push(i);\n const jointId = Array.from({ length: mjModel.njnt }, (_, id) => id)\n .find((id) => mjModel.jnt_qposadr[id] === i);\n const actuator = getActuatorInfo(mjModel, i);\n actuators.push(actuator);\n joints.push({\n ...(jointId !== undefined ? getJointInfo(mjModel, jointId) : {\n id: i,\n name: `qpos${i}`,\n type: 3,\n typeName: 'hinge',\n range: unlimitedRange(),\n limited: false,\n bodyId: -1,\n qposAdr: i,\n dofAdr: i,\n }),\n actuatorId: i,\n actuatorName: actuator.name,\n ctrlAdr: i,\n ctrlRange: actuator.range,\n });\n }\n\n return {\n joints,\n actuators,\n qposAdr,\n dofAdr,\n ctrlAdr,\n readQpos(data: MujocoData) {\n return new Float64Array(qposAdr.map((adr) => data.qpos[adr] ?? 0));\n },\n readCtrl(data: MujocoData) {\n return new Float64Array(ctrlAdr.map((adr) => data.ctrl[adr] ?? 0));\n },\n writeQpos(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, qposAdr.length); i++) data.qpos[qposAdr[i]] = values[i];\n },\n writeCtrl(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, ctrlAdr.length); i++) data.ctrl[ctrlAdr[i]] = values[i];\n },\n };\n}\n\n/**\n * Convert a SceneObject config to MuJoCo XML.\n */\nfunction sceneObjectToXml(obj: SceneObject): string {\n const joint = obj.freejoint ? '<freejoint/>' : '';\n const 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\n/** Create virtual directory structure for a file path. */\nfunction ensureDir(mujoco: MujocoModule, fname: string) {\n const dirParts = fname.split('/');\n dirParts.pop();\n let currentPath = '/working';\n for (const part of dirParts) {\n currentPath += '/' + part;\n try { mujoco.FS.mkdir(currentPath); } catch { /* ignore */ }\n }\n}\n\ninterface LoadResult {\n mjModel: MujocoModel;\n mjData: MujocoData;\n}\n\nfunction loadModelFromPath(mujoco: MujocoModule, path: string): MujocoModel {\n if (mujoco.MjModel.from_xml_path) {\n return mujoco.MjModel.from_xml_path(path);\n }\n if (mujoco.MjModel.loadFromXML) {\n return mujoco.MjModel.loadFromXML(path);\n }\n throw new Error('MuJoCo WASM module does not expose an XML path loader');\n}\n\nfunction isModelTextFile(fname: string): boolean {\n const lower = fname.toLowerCase();\n return lower.endsWith('.xml') || lower.endsWith('.urdf') || lower.endsWith('.mjcf');\n}\n\nfunction normalizeVfsPath(path: string): string {\n const parts = path.replace(/\\\\/g, '/').split('/');\n const norm: string[] = [];\n for (const part of parts) {\n if (!part || part === '.') continue;\n if (part === '..') norm.pop();\n else norm.push(part);\n }\n return norm.join('/');\n}\n\nfunction localFilePath(file: LocalMujocoFile): string {\n return normalizeVfsPath(file.webkitRelativePath || file.name);\n}\n\nfunction inferSceneFile(files: readonly LocalMujocoFile[], options?: LoadFromFilesOptions): string {\n if (options?.sceneFile) return normalizeVfsPath(options.sceneFile);\n\n const paths = files.map(localFilePath);\n const preferred = ['scene.xml', 'model.xml', 'robot.xml', 'scene.urdf', 'model.urdf', 'robot.urdf'];\n for (const name of preferred) {\n const match = paths.find((path) => path.endsWith(name));\n if (match) return match;\n }\n\n const firstModel = paths.find(isModelTextFile);\n if (!firstModel) throw new Error('No MJCF XML or URDF file found in FileList');\n return firstModel;\n}\n\nexport function createSceneConfigFromFiles(\n files: FileList | readonly LocalMujocoFile[],\n options: LoadFromFilesOptions = {}\n): SceneConfig {\n const fileArray = Array.from(files) as LocalMujocoFile[];\n return {\n src: '',\n sceneFile: inferSceneFile(fileArray, options),\n files: fileArray,\n homeJoints: options.homeJoints,\n xmlPatches: options.xmlPatches,\n sceneObjects: options.sceneObjects,\n onReset: options.onReset,\n };\n}\n\nfunction applyXmlPatches(text: string, fname: string, config: SceneConfig): string {\n let result = text;\n for (const patch of config.xmlPatches ?? []) {\n if (fname.endsWith(patch.target) || fname === patch.target) {\n if (patch.replace) {\n const [from, to] = patch.replace;\n if (result.includes(from)) {\n result = result.replace(from, to);\n } else {\n const preview = from.length > 80 ? `${from.slice(0, 80)}...` : from;\n console.warn(`XML patch replace pattern not found in ${fname}: \"${preview}\"`);\n }\n }\n if (patch.inject && patch.injectAfter) {\n const idx = result.indexOf(patch.injectAfter);\n if (idx !== -1) {\n const tagEnd = result.indexOf('>', idx + patch.injectAfter.length);\n if (tagEnd !== -1) {\n result = result.slice(0, tagEnd + 1) + patch.inject + result.slice(tagEnd + 1);\n } else {\n console.warn(`XML patch inject failed in ${fname}: could not find tag end after \"${patch.injectAfter}\"`);\n }\n } else {\n const preview = patch.injectAfter.length > 80\n ? `${patch.injectAfter.slice(0, 80)}...`\n : patch.injectAfter;\n console.warn(`XML patch inject anchor not found in ${fname}: \"${preview}\"`);\n }\n }\n }\n }\n\n if (fname === config.sceneFile && config.sceneObjects?.length && result.includes('</worldbody>')) {\n const xml = config.sceneObjects.map((obj) => sceneObjectToXml(obj)).join('');\n result = result.replace('</worldbody>', xml + '</worldbody>');\n }\n\n return result;\n}\n\nasync function loadSceneFromFiles(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n const files = config.files ?? [];\n if (!files.length) throw new Error('loadFromFiles requires at least one File');\n\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const parser = new DOMParser();\n const byPath = new Map<string, LocalMujocoFile>();\n const byBasename = new Map<string, LocalMujocoFile>();\n const written = new Set<string>();\n const textByPath = new Map<string, string>();\n\n for (const file of files) {\n const path = localFilePath(file);\n byPath.set(path, file);\n byBasename.set(path.split('/').pop() ?? path, file);\n }\n\n for (const [path, file] of byPath) {\n onProgress?.(`Reading ${path}...`);\n ensureDir(mujoco, path);\n if (isModelTextFile(path)) {\n const text = applyXmlPatches(await file.text(), path, config);\n textByPath.set(path, text);\n mujoco.FS.writeFile(`/working/${path}`, text);\n } else {\n mujoco.FS.writeFile(`/working/${path}`, new Uint8Array(await file.arrayBuffer()));\n }\n written.add(path);\n }\n\n for (const [path, text] of textByPath) {\n const deps = collectDependencyPaths(text, path, parser);\n for (const dep of deps) {\n if (written.has(dep)) continue;\n const file = byPath.get(dep) ?? byBasename.get(dep.split('/').pop() ?? dep);\n if (!file) continue;\n ensureDir(mujoco, dep);\n if (isModelTextFile(dep)) {\n mujoco.FS.writeFile(`/working/${dep}`, applyXmlPatches(await file.text(), dep, config));\n } else {\n mujoco.FS.writeFile(`/working/${dep}`, new Uint8Array(await file.arrayBuffer()));\n }\n written.add(dep);\n }\n }\n\n onProgress?.('Loading model...');\n const mjModel = loadModelFromPath(mujoco, `/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n applyInitialPose(mjModel, mjData, config);\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData };\n}\n\nfunction applyInitialPose(mjModel: MujocoModel, mjData: MujocoData, config: SceneConfig) {\n if (!config.homeJoints) return;\n const homeCount = Math.min(config.homeJoints.length, Math.max(mjModel.nu, mjModel.nq));\n for (let i = 0; i < homeCount; i++) {\n if (i < mjModel.nu) mjData.ctrl[i] = config.homeJoints[i];\n if (i < mjModel.nq) {\n const qposAdr = i < mjModel.nu ? getActuatedScalarQposAdr(mjModel, i) : -1;\n mjData.qpos[qposAdr !== -1 ? qposAdr : i] = config.homeJoints[i];\n }\n }\n}\n\n/**\n * Config-driven scene loader — replaces the old RobotLoader + patchSingleRobot approach.\n */\nexport async function loadScene(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n if (config.files?.length) {\n return loadSceneFromFiles(mujoco, config, onProgress);\n }\n\n // 1. Clean up virtual filesystem\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const baseUrl = config.src.endsWith('/') ? config.src : config.src + '/';\n\n const downloaded = new Set<string>();\n const xmlQueue: string[] = [config.sceneFile];\n const assetFiles: string[] = [];\n const parser = new DOMParser();\n\n // 2a. Download XML files sequentially (to discover dependencies)\n while (xmlQueue.length > 0) {\n const fname = xmlQueue.shift()!;\n if (downloaded.has(fname)) continue;\n downloaded.add(fname);\n\n if (!isModelTextFile(fname)) {\n // Non-XML discovered during XML scan — collect for parallel download\n assetFiles.push(fname);\n continue;\n }\n\n onProgress?.(`Downloading ${fname}...`);\n\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n continue;\n }\n\n const text = applyXmlPatches(await res.text(), fname, config);\n\n ensureDir(mujoco, fname);\n mujoco.FS.writeFile(`/working/${fname}`, text);\n scanDependencies(text, fname, parser, downloaded, xmlQueue);\n }\n\n // 2b. Download all binary assets (meshes, textures) in parallel\n if (assetFiles.length > 0) {\n onProgress?.(`Downloading ${assetFiles.length} assets...`);\n\n const results = await Promise.all(\n assetFiles.map(async (fname) => {\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n return null;\n }\n return { fname, buffer: new Uint8Array(await res.arrayBuffer()) };\n })\n );\n\n for (const result of results) {\n if (!result) continue;\n ensureDir(mujoco, result.fname);\n mujoco.FS.writeFile(`/working/${result.fname}`, result.buffer);\n }\n }\n\n // 5. Load model\n onProgress?.('Loading model...');\n const mjModel = loadModelFromPath(mujoco, `/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n\n // 6. Set initial pose — set both ctrl and qpos so robot starts at home.\n // If homeJoints is not provided, keep raw MuJoCo defaults.\n applyInitialPose(mjModel, mjData, config);\n\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData };\n}\n\n/**\n * Scan XML for file dependencies (meshes, textures, includes).\n */\nfunction scanDependencies(\n xmlString: string,\n currentFile: string,\n parser: DOMParser,\n downloaded: Set<string>,\n queue: string[]\n) {\n for (const fullPath of collectDependencyPaths(xmlString, currentFile, parser)) {\n if (!downloaded.has(fullPath)) queue.push(fullPath);\n }\n}\n\nfunction collectDependencyPaths(\n xmlString: string,\n currentFile: string,\n parser: DOMParser\n): string[] {\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\n\n const compiler = xmlDoc.querySelector('compiler');\n const assetDir = compiler?.getAttribute('assetdir') || '';\n const meshDir = compiler?.getAttribute('meshdir') || assetDir;\n const textureDir = compiler?.getAttribute('texturedir') || assetDir;\n const currentDir = currentFile.includes('/')\n ? currentFile.substring(0, currentFile.lastIndexOf('/') + 1)\n : '';\n\n const paths: string[] = [];\n xmlDoc.querySelectorAll('[file], [filename]').forEach((el) => {\n const fileAttr = el.getAttribute('file') ?? el.getAttribute('filename');\n if (!fileAttr) return;\n if (/^[a-z]+:\\/\\//i.test(fileAttr) || fileAttr.startsWith('package://')) return;\n\n let prefix = '';\n if (el.tagName.toLowerCase() === 'mesh') {\n prefix = meshDir ? meshDir + '/' : '';\n } else if (['texture', 'hfield'].includes(el.tagName.toLowerCase())) {\n prefix = textureDir ? textureDir + '/' : '';\n }\n\n const fullPath = normalizeVfsPath(currentDir + prefix + fileAttr);\n\n paths.push(fullPath);\n });\n return paths;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\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 { useMujocoContext } from '../core/MujocoSimProvider';\n\n/**\n * SceneRenderer — creates and syncs MuJoCo body meshes every frame.\n * Accepts standard R3F group props (position, rotation, scale, visible, etc.).\n */\nexport function SceneRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const {\n mjModelRef,\n mjDataRef,\n mujocoRef,\n onSelectionRef,\n hiddenBodiesRef,\n interpolateRef,\n interpolationStateRef,\n status,\n } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const bodyRefs = useRef<(THREE.Group | null)[]>([]);\n const prevModelRef = useRef<MujocoModel | null>(null);\n\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 const bodyName = getName(model, model.name_bodyadr[i]);\n\n if (!hiddenBodiesRef.current.has(bodyName)) {\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === i) {\n const mesh = geomBuilder.create(model, g);\n if (mesh) bodyGroup.add(mesh);\n }\n }\n }\n\n group.add(bodyGroup);\n refs.push(bodyGroup);\n }\n bodyRefs.current = refs;\n }, [status, geomBuilder, mjModelRef]);\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 const interpolation = interpolationStateRef.current;\n const useInterpolation = interpolateRef.current && interpolation.valid;\n\n for (let i = 0; i < bodies.length; i++) {\n const ref = bodies[i];\n if (!ref) continue;\n if (useInterpolation) {\n const alpha = interpolation.alpha;\n const i3 = i * 3;\n ref.position.set(\n THREE.MathUtils.lerp(interpolation.previousXpos[i3], interpolation.currentXpos[i3], alpha),\n THREE.MathUtils.lerp(interpolation.previousXpos[i3 + 1], interpolation.currentXpos[i3 + 1], alpha),\n THREE.MathUtils.lerp(interpolation.previousXpos[i3 + 2], interpolation.currentXpos[i3 + 2], alpha)\n );\n const i4 = i * 4;\n _previousQuat.set(\n interpolation.previousXquat[i4 + 1],\n interpolation.previousXquat[i4 + 2],\n interpolation.previousXquat[i4 + 3],\n interpolation.previousXquat[i4]\n );\n _currentQuat.set(\n interpolation.currentXquat[i4 + 1],\n interpolation.currentXquat[i4 + 2],\n interpolation.currentXquat[i4 + 3],\n interpolation.currentXquat[i4]\n );\n ref.quaternion.copy(_previousQuat).slerp(_currentQuat, alpha);\n } else {\n ref.position.set(\n data.xpos[i * 3],\n data.xpos[i * 3 + 1],\n data.xpos[i * 3 + 2]\n );\n ref.quaternion.set(\n data.xquat[i * 4 + 1],\n data.xquat[i * 4 + 2],\n data.xquat[i * 4 + 3],\n data.xquat[i * 4]\n );\n }\n }\n });\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\nconst _previousQuat = new THREE.Quaternion();\nconst _currentQuat = new THREE.Quaternion();\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, useThree } from '@react-three/fiber';\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport * as THREE from 'three';\nimport { MujocoData, MujocoModel, MujocoModule, getContact, withContacts } from '../types';\nimport { SceneRenderer } from '../components/SceneRenderer';\nimport {\n ActuatedJointInfo,\n ActuatorInfo,\n BodyInfo,\n ControlGroupInfo,\n ControlGroupSelector,\n ContactInfo,\n GeomInfo,\n JointInfo,\n LoadFromFilesOptions,\n LocalMujocoFile,\n ModelOptions,\n MujocoSimAPI,\n PhysicsStepCallback,\n RayHit,\n SceneConfig,\n SceneObject,\n SensorInfo,\n SiteInfo,\n StateSnapshot,\n XmlPatch,\n} from '../types';\nimport {\n loadScene,\n createSceneConfigFromFiles,\n findKeyframeByName,\n findBodyByName,\n findGeomByName,\n findSensorByName,\n findActuatorByName,\n getActuatedScalarQposAdr,\n getActuatedJoints as getActuatedJointsFromModel,\n getControlMap as getControlMapFromModel,\n getName,\n resolveControlGroup as resolveControlGroupFromModel,\n} from './SceneLoader';\n\n// ---- Joint type names ----\nconst JOINT_TYPE_NAMES = ['free', 'ball', 'slide', 'hinge'];\n// ---- Geom type names ----\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\n// ---- Sensor type names (subset — MuJoCo has many) ----\nconst SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'camprojection', 9: 'jointpos', 10: 'jointvel', 11: 'tendonpos',\n 12: 'tendonvel', 13: 'actuatorpos', 14: 'actuatorvel', 15: 'actuatorfrc',\n 16: 'jointactfrc', 17: 'tendonactfrc', 18: 'ballquat', 19: 'ballangvel',\n 20: 'jointlimitpos', 21: 'jointlimitvel', 22: 'jointlimitfrc',\n 23: 'tendonlimitpos', 24: 'tendonlimitvel', 25: 'tendonlimitfrc',\n 26: 'framepos', 27: 'framequat', 28: 'framexaxis', 29: 'frameyaxis',\n 30: 'framezaxis', 31: 'framelinvel', 32: 'frameangvel',\n 33: 'framelinacc', 34: 'frameangacc', 35: 'subtreecom',\n 36: 'subtreelinvel', 37: 'subtreeangmom', 38: 'insidesite',\n 39: 'geomdist', 40: 'geomnormal', 41: 'geomfromto',\n 42: 'contact', 43: 'e_potential', 44: 'e_kinetic',\n 45: 'clock', 46: 'tactile', 47: 'plugin', 48: 'user',\n};\n\nconst EMPTY_CONTROL_GROUP: ControlGroupInfo = {\n joints: [],\n actuators: [],\n qposAdr: [],\n dofAdr: [],\n ctrlAdr: [],\n readQpos: () => new Float64Array(0),\n readCtrl: () => new Float64Array(0),\n writeQpos: () => {},\n writeCtrl: () => {},\n};\n\nfunction isMutableApiRef(\n ref: React.ForwardedRef<MujocoSimAPI>\n): ref is React.MutableRefObject<MujocoSimAPI | null> {\n return typeof ref === 'object' && ref !== null && 'current' in ref;\n}\n\n// Preallocated force/torque temps for applyForce/applyTorque\nconst _applyForce = new Float64Array(3);\nconst _applyTorque = new Float64Array(3);\nconst _applyPoint = new Float64Array(3);\nconst _rayPnt = new Float64Array(3);\nconst _rayVec = new Float64Array(3);\nconst _rayGeomId = new Int32Array(1);\nconst _projRaycaster = new THREE.Raycaster();\nconst _projNdc = new THREE.Vector2();\n\n// ---- Internal context types ----\n\nexport interface MujocoSimContextValue {\n api: MujocoSimAPI;\n mjModelRef: React.RefObject<MujocoModel | null>;\n mjDataRef: React.RefObject<MujocoData | null>;\n mujocoRef: React.RefObject<MujocoModule>;\n configRef: React.RefObject<SceneConfig>;\n pausedRef: React.RefObject<boolean>;\n speedRef: React.RefObject<number>;\n substepsRef: React.RefObject<number>;\n interpolateRef: React.RefObject<boolean>;\n interpolationStateRef: React.RefObject<BodyInterpolationState>;\n onSelectionRef: React.RefObject<\n ((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 errorRef: React.RefObject<string | null>;\n bodyRegistryRef: React.RefObject<Map<string, { definition: SceneObject; hasCustomChildren: boolean }>>;\n hiddenBodiesRef: React.RefObject<Set<string>>;\n requestBodyReload: () => void;\n status: 'loading' | 'ready' | 'error';\n}\n\nexport interface BodyInterpolationState {\n alpha: number;\n previousXpos: Float64Array;\n previousXquat: Float64Array;\n currentXpos: Float64Array;\n currentXquat: Float64Array;\n valid: boolean;\n}\n\nconst MujocoSimContext = createContext<MujocoSimContextValue | null>(null);\n\nexport type UseMujocoResult =\n | { status: 'loading'; isPending: true; isReady: false; isError: false; error: null; api: null; mjModelRef: null; mjDataRef: null }\n | { status: 'error'; isPending: false; isReady: false; isError: true; error: string; api: null; mjModelRef: null; mjDataRef: null }\n | { status: 'ready'; isPending: false; isReady: true; isError: false; error: null;\n api: MujocoSimAPI; mjModelRef: React.RefObject<MujocoModel | null>; mjDataRef: React.RefObject<MujocoData | null> };\n\nexport function useMujocoContext(): MujocoSimContextValue {\n const ctx = useContext(MujocoSimContext);\n if (!ctx)\n throw new Error('useMujoco must be used inside <MujocoSimProvider>');\n return ctx;\n}\n\nexport function useMujoco(): UseMujocoResult {\n const ctx = useMujocoContext();\n if (ctx.status === 'ready') {\n return {\n status: 'ready',\n isPending: false,\n isReady: true,\n isError: false,\n error: null,\n api: ctx.api,\n mjModelRef: ctx.mjModelRef,\n mjDataRef: ctx.mjDataRef,\n };\n }\n if (ctx.status === 'error') {\n return {\n status: 'error',\n isPending: false,\n isReady: false,\n isError: true,\n error: ctx.errorRef.current ?? 'Unknown error',\n api: null,\n mjModelRef: null,\n mjDataRef: null,\n };\n }\n return {\n status: 'loading',\n isPending: true,\n isReady: false,\n isError: false,\n error: null,\n api: null,\n mjModelRef: null,\n mjDataRef: null,\n };\n}\n\nexport function useBeforePhysicsStep(callback: PhysicsStepCallback) {\n const { beforeStepCallbacks } = useMujocoContext();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (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 } = useMujocoContext();\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 interpolate?: boolean;\n children: React.ReactNode;\n}\n\nexport function MujocoSimProvider({\n mujoco,\n config,\n apiRef: externalApiRef,\n onReady,\n onError,\n onStep,\n onSelection,\n gravity,\n timestep,\n substeps,\n paused,\n speed,\n interpolate,\n 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 interpolateRef = useRef(interpolate ?? false);\n const interpolationStateRef = useRef<BodyInterpolationState>({\n alpha: 1,\n previousXpos: new Float64Array(0),\n previousXquat: new Float64Array(0),\n currentXpos: new Float64Array(0),\n currentXquat: new Float64Array(0),\n valid: false,\n });\n const physicsAccumulatorRef = useRef(0);\n const stepsToRunRef = useRef(0);\n const loadGenRef = useRef(0);\n\n const onSelectionRef = useRef(onSelection);\n onSelectionRef.current = onSelection;\n const onStepRef = useRef(onStep);\n onStepRef.current = onStep;\n\n const beforeStepCallbacks = useRef(new Set<PhysicsStepCallback>());\n const afterStepCallbacks = useRef(new Set<PhysicsStepCallback>());\n const resetCallbacks = useRef(new Set<() => void>());\n const errorRef = useRef<string | null>(null);\n const bodyRegistryRef = useRef(new Map<string, { definition: SceneObject; hasCustomChildren: boolean }>());\n const hiddenBodiesRef = useRef(new Set<string>());\n const bodyReloadTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => { configRef.current = config; }, [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 useEffect(() => { interpolateRef.current = interpolate ?? false; }, [interpolate]);\n\n // Sync gravity prop\n useEffect(() => {\n if (!gravity) return;\n const model = mjModelRef.current;\n if (!model?.opt?.gravity) return;\n model.opt.gravity[0] = gravity[0];\n model.opt.gravity[1] = gravity[1];\n model.opt.gravity[2] = gravity[2];\n }, [gravity]);\n\n // Sync timestep prop\n useEffect(() => {\n if (timestep === undefined) return;\n const model = mjModelRef.current;\n if (!model?.opt) return;\n model.opt.timestep = timestep;\n }, [timestep]);\n\n // --- Build merged config (base + body registry) ---\n function buildMergedConfig(baseConfig: SceneConfig): SceneConfig {\n if (bodyRegistryRef.current.size === 0) return baseConfig;\n const registeredNames = new Set(bodyRegistryRef.current.keys());\n const baseObjects = (baseConfig.sceneObjects ?? []).filter(o => !registeredNames.has(o.name));\n const registeredBodies = Array.from(bodyRegistryRef.current.values()).map(e => e.definition);\n hiddenBodiesRef.current.clear();\n for (const [name, entry] of bodyRegistryRef.current) {\n if (entry.hasCustomChildren) hiddenBodiesRef.current.add(name);\n }\n return { ...baseConfig, sceneObjects: [...baseObjects, ...registeredBodies] };\n }\n\n // --- Load scene on mount ---\n useEffect(() => {\n let disposed = false;\n\n (async () => {\n try {\n const result = await loadScene(mujoco, buildMergedConfig(config));\n if (disposed) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n\n // Apply declarative physics props after load\n if (gravity && result.mjModel.opt?.gravity) {\n result.mjModel.opt.gravity[0] = gravity[0];\n result.mjModel.opt.gravity[1] = gravity[1];\n result.mjModel.opt.gravity[2] = gravity[2];\n }\n if (timestep !== undefined && result.mjModel.opt) {\n result.mjModel.opt.timestep = timestep;\n }\n\n setStatus('ready');\n } catch (e: unknown) {\n if (!disposed) {\n const err = e instanceof Error ? e : new Error(String(e));\n errorRef.current = err.message;\n setStatus('error');\n onError?.(err);\n }\n }\n })();\n\n return () => {\n disposed = true;\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n };\n }, [mujoco, config]);\n\n // Fire onReady and assign external ref when status changes to ready\n useEffect(() => {\n if (status === 'ready') {\n const api = apiRef.current;\n if (onReady) onReady(api);\n // Assign the forwarded ref\n if (externalApiRef) {\n if (typeof externalApiRef === 'function') {\n externalApiRef(api);\n } else if (isMutableApiRef(externalApiRef)) {\n externalApiRef.current = api;\n }\n }\n }\n }, [status]);\n\n // --- Physics step (priority -1) ---\n useFrame((_state, delta) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n // Check single-step mode\n const shouldStep = !pausedRef.current || stepsToRunRef.current > 0;\n if (!shouldStep) return;\n\n // Zero generalized applied forces\n for (let i = 0; i < model.nv; i++) {\n data.qfrc_applied[i] = 0;\n }\n\n // Before-step callbacks\n for (const cb of beforeStepCallbacks.current) {\n cb(model, data);\n }\n\n const numSubsteps = substepsRef.current;\n if (!interpolateRef.current) {\n // Step physics with substeps\n if (stepsToRunRef.current > 0) {\n for (let s = 0; s < stepsToRunRef.current; s++) {\n 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 } else if (stepsToRunRef.current > 0) {\n ensureInterpolationBuffers(model);\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n for (let s = 0; s < stepsToRunRef.current; s++) {\n mujoco.mj_step(model, data);\n }\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n interpolationStateRef.current.alpha = 1;\n interpolationStateRef.current.valid = true;\n stepsToRunRef.current = 0;\n } else {\n ensureInterpolationBuffers(model);\n const clampedDelta = Math.min(delta, 1 / 15); // cap to avoid spiral of death\n physicsAccumulatorRef.current += clampedDelta * speedRef.current;\n const stepDt = Math.max((model.opt?.timestep ?? 0.002) * Math.max(1, numSubsteps), 1e-6);\n let stepped = false;\n\n while (physicsAccumulatorRef.current >= stepDt) {\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n for (let s = 0; s < numSubsteps; s++) {\n mujoco.mj_step(model, data);\n }\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n physicsAccumulatorRef.current -= stepDt;\n stepped = true;\n }\n\n if (!interpolationStateRef.current.valid) {\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n }\n\n interpolationStateRef.current.alpha = Math.min(Math.max(physicsAccumulatorRef.current / stepDt, 0), 1);\n interpolationStateRef.current.valid = true;\n\n if (!stepped) {\n onStepRef.current?.(data.time);\n return;\n }\n }\n\n // After-step callbacks\n for (const cb of afterStepCallbacks.current) {\n cb(model, data);\n }\n\n onStepRef.current?.(data.time);\n }, -1);\n\n function ensureInterpolationBuffers(model: MujocoModel) {\n const state = interpolationStateRef.current;\n const xposLength = model.nbody * 3;\n const xquatLength = model.nbody * 4;\n if (state.previousXpos.length !== xposLength) state.previousXpos = new Float64Array(xposLength);\n if (state.currentXpos.length !== xposLength) state.currentXpos = new Float64Array(xposLength);\n if (state.previousXquat.length !== xquatLength) state.previousXquat = new Float64Array(xquatLength);\n if (state.currentXquat.length !== xquatLength) state.currentXquat = new Float64Array(xquatLength);\n }\n\n function copyBodyPose(data: MujocoData, xpos: Float64Array, xquat: Float64Array) {\n xpos.set(data.xpos.subarray(0, xpos.length));\n xquat.set(data.xquat.subarray(0, xquat.length));\n }\n\n // --- API Methods ---\n\n const reset = useCallback(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n 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 withContacts(data, (contactArray) => {\n for (let i = 0; i < ncon; i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n contacts.push({\n geom1: c.geom1,\n geom1Name: getName(model, model.name_geomadr[c.geom1]),\n geom2: c.geom2,\n geom2Name: getName(model, model.name_geomadr[c.geom2]),\n pos: [c.pos[0], c.pos[1], c.pos[2]],\n depth: c.dist,\n });\n }\n });\n return contacts;\n }, []);\n\n const getBodies = useCallback((): BodyInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: BodyInfo[] = [];\n for (let i = 0; i < model.nbody; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_bodyadr[i]),\n mass: model.body_mass[i],\n parentId: model.body_parentid[i],\n });\n }\n return result;\n }, []);\n\n const getJoints = useCallback((): JointInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: JointInfo[] = [];\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const range: [number, number] = [model.jnt_range[2 * i], model.jnt_range[2 * i + 1]];\n result.push({\n id: i,\n name: getName(model, model.name_jntadr[i]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range,\n limited: range[0] < range[1],\n bodyId: model.jnt_bodyid[i],\n qposAdr: model.jnt_qposadr[i],\n dofAdr: model.jnt_dofadr[i],\n });\n }\n return result;\n }, []);\n\n const getGeoms = useCallback((): GeomInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: GeomInfo[] = [];\n for (let i = 0; i < model.ngeom; i++) {\n const type = model.geom_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_geomadr[i]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `unknown(${type})`,\n size: [model.geom_size[3 * i], model.geom_size[3 * i + 1], model.geom_size[3 * i + 2]],\n bodyId: model.geom_bodyid[i],\n });\n }\n return result;\n }, []);\n\n const getSites = useCallback((): SiteInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SiteInfo[] = [];\n for (let i = 0; i < model.nsite; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_siteadr[i]),\n bodyId: model.site_bodyid ? model.site_bodyid[i] : -1,\n });\n }\n return result;\n }, []);\n\n const getActuatorsApi = useCallback((): ActuatorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const hasRange = model.actuator_ctrlrange[2 * i] < model.actuator_ctrlrange[2 * i + 1];\n result.push({\n id: i,\n name: getName(model, model.name_actuatoradr[i]),\n range: hasRange\n ? [model.actuator_ctrlrange[2 * i], model.actuator_ctrlrange[2 * i + 1]]\n : [-Infinity, Infinity],\n });\n }\n return result;\n }, []);\n\n const getControlMapApi = useCallback((): ControlGroupInfo => {\n const model = mjModelRef.current;\n return model ? getControlMapFromModel(model) : EMPTY_CONTROL_GROUP;\n }, []);\n\n const getActuatedJointsApi = useCallback((): ActuatedJointInfo[] => {\n const model = mjModelRef.current;\n return model ? getActuatedJointsFromModel(model) : [];\n }, []);\n\n const resolveControlGroupApi = useCallback((selector: ControlGroupSelector): ControlGroupInfo | null => {\n const model = mjModelRef.current;\n return model ? resolveControlGroupFromModel(model, selector) : null;\n }, []);\n\n const getSensors = useCallback((): SensorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, []);\n\n const 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, buildMergedConfig(newConfig));\n\n if (gen !== loadGenRef.current) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n configRef.current = newConfig;\n\n setStatus('ready');\n } catch (e) {\n if (gen !== loadGenRef.current) return;\n errorRef.current = e instanceof Error ? e.message : String(e);\n setStatus('error');\n throw e;\n }\n }, [mujoco]);\n\n const requestBodyReload = useCallback(() => {\n if (bodyReloadTimerRef.current) clearTimeout(bodyReloadTimerRef.current);\n bodyReloadTimerRef.current = setTimeout(() => {\n bodyReloadTimerRef.current = null;\n loadSceneApi(configRef.current);\n }, 0);\n }, [loadSceneApi]);\n\n const loadFromFilesApi = useCallback(\n async (files: FileList | readonly LocalMujocoFile[], options?: LoadFromFilesOptions): Promise<void> => {\n await loadSceneApi(createSceneConfigFromFiles(files, options));\n },\n [loadSceneApi]\n );\n\n const addBodyApi = useCallback(async (body: SceneObject): Promise<void> => {\n const current = configRef.current;\n const sceneObjects = [\n ...(current.sceneObjects ?? []).filter((obj) => obj.name !== body.name),\n body,\n ];\n await loadSceneApi({ ...current, sceneObjects });\n }, [loadSceneApi]);\n\n const removeBodyApi = useCallback(async (name: string): Promise<void> => {\n const current = configRef.current;\n bodyRegistryRef.current.delete(name);\n const sceneObjects = (current.sceneObjects ?? []).filter((obj) => obj.name !== name);\n await loadSceneApi({ ...current, sceneObjects });\n }, [loadSceneApi]);\n\n const recompileApi = useCallback(async (patches: XmlPatch[] = []): Promise<void> => {\n const current = configRef.current;\n await loadSceneApi({\n ...current,\n xmlPatches: patches.length ? [...(current.xmlPatches ?? []), ...patches] : current.xmlPatches,\n });\n }, [loadSceneApi]);\n\n const getCanvasSnapshot = useCallback(\n (width?: number, height?: number, mimeType = 'image/jpeg'): string => {\n if (width && height) {\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = width;\n tempCanvas.height = height;\n const ctx = tempCanvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(gl.domElement, 0, 0, width, height);\n return tempCanvas.toDataURL(mimeType, mimeType === 'image/jpeg' ? 0.8 : undefined);\n }\n }\n return gl.domElement.toDataURL(mimeType, mimeType === 'image/jpeg' ? 0.8 : undefined);\n },\n [gl]\n );\n\n const 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 get config() { return configRef.current; },\n reset,\n setSpeed,\n togglePause,\n setPaused,\n step,\n getTime,\n getTimestep,\n applyKeyframe,\n saveState,\n restoreState,\n setQpos,\n setQvel,\n getQpos,\n getQvel,\n setCtrl,\n getCtrl,\n getControlMap: getControlMapApi,\n getActuatedJoints: getActuatedJointsApi,\n resolveControlGroup: resolveControlGroupApi,\n applyForce,\n applyTorque: applyTorqueApi,\n setExternalForce,\n applyGeneralizedForce,\n getSensorData,\n getContacts,\n getBodies,\n getJoints,\n getGeoms,\n getSites,\n getActuators: getActuatorsApi,\n getSensors,\n getModelOption,\n setGravity,\n setTimestep: setTimestepApi,\n raycast,\n getKeyframeNames,\n getKeyframeCount,\n loadScene: loadSceneApi,\n loadFromFiles: loadFromFilesApi,\n addBody: addBodyApi,\n removeBody: removeBodyApi,\n recompile: recompileApi,\n getCanvasSnapshot,\n project2DTo3D,\n setBodyMass,\n setGeomFriction,\n setGeomSize,\n mjModelRef,\n mjDataRef,\n }),\n [\n status, reset, setSpeed, togglePause, setPaused, step,\n getTime, getTimestep, applyKeyframe, saveState, restoreState,\n setQpos, setQvel, getQpos, getQvel, setCtrl, getCtrl,\n getControlMapApi, getActuatedJointsApi, resolveControlGroupApi,\n applyForce, applyTorqueApi, setExternalForce, applyGeneralizedForce,\n getSensorData, getContacts, getBodies, getJoints, getGeoms, getSites,\n getActuatorsApi, getSensors, getModelOption, setGravity, setTimestepApi,\n raycast, getKeyframeNames, getKeyframeCount, loadSceneApi,\n loadFromFilesApi, addBodyApi, removeBodyApi, recompileApi,\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 interpolateRef,\n interpolationStateRef,\n onSelectionRef,\n beforeStepCallbacks,\n afterStepCallbacks,\n resetCallbacks,\n errorRef,\n bodyRegistryRef,\n hiddenBodiesRef,\n requestBodyReload,\n status,\n }),\n [api, status, requestBodyReload]\n );\n\n return (\n <MujocoSimContext.Provider value={contextValue}>\n <SceneRenderer />\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 interpolate,\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 interpolate={interpolate}\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 /** Interpolate rendered body poses between fixed physics steps. */\n interpolate?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * MujocoPhysics — physics provider for use inside a user-owned R3F Canvas.\n *\n * This is the R3F-idiomatic alternative to MujocoCanvas. Instead of wrapping\n * the Canvas, place this inside your own <Canvas>:\n *\n * ```tsx\n * <MujocoProvider>\n * <Canvas shadows camera={...}>\n * <MujocoPhysics config={config} paused={paused}>\n * <SceneRenderer />\n * <OrbitControls />\n * </MujocoPhysics>\n * </Canvas>\n * </MujocoProvider>\n * ```\n *\n * Forward ref exposes MujocoSimAPI.\n */\nexport const MujocoPhysics = forwardRef<MujocoSimAPI, MujocoPhysicsProps>(\n function MujocoPhysics({ onError, children, ...props }, ref) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujocoWasm();\n\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\nimport type {\n Bodies,\n MujocoData,\n MujocoModel,\n ObservationConfig,\n ObservationLayoutItem,\n ObservationResult,\n} from '../types';\nimport { findBodyByName, findSensorByName, findSiteByName } from './SceneLoader';\n\nfunction append(\n values: number[],\n layout: ObservationLayoutItem[],\n name: string,\n chunk: ArrayLike<number>\n) {\n const start = values.length;\n for (let i = 0; i < chunk.length; i++) values.push(chunk[i] ?? 0);\n layout.push({ name, start, size: chunk.length });\n}\n\nfunction appendScalar(\n values: number[],\n layout: ObservationLayoutItem[],\n name: string,\n value: number\n) {\n const start = values.length;\n values.push(value);\n layout.push({ name, start, size: 1 });\n}\n\nfunction namedBodyList(names: Bodies | readonly Bodies[] | undefined): readonly Bodies[] {\n if (!names) return [];\n return typeof names === 'string' ? [names] : names;\n}\n\nfunction normalizedGravity(model: MujocoModel): [number, number, number] {\n const gx = model.opt.gravity[0] ?? 0;\n const gy = model.opt.gravity[1] ?? 0;\n const gz = model.opt.gravity[2] ?? -9.81;\n const length = Math.hypot(gx, gy, gz);\n if (length === 0) return [0, 0, 0];\n return [gx / length, gy / length, gz / length];\n}\n\nfunction rotateWorldVectorToBody(data: MujocoData, bodyId: number, world: readonly [number, number, number]): [number, number, number] {\n const adr = bodyId * 4;\n const w = data.xquat[adr] ?? 1;\n const x = -(data.xquat[adr + 1] ?? 0);\n const y = -(data.xquat[adr + 2] ?? 0);\n const z = -(data.xquat[adr + 3] ?? 0);\n const vx = world[0];\n const vy = world[1];\n const vz = world[2];\n\n const tx = 2 * (y * vz - z * vy);\n const ty = 2 * (z * vx - x * vz);\n const tz = 2 * (x * vy - y * vx);\n\n return [\n vx + w * tx + y * tz - z * ty,\n vy + w * ty + z * tx - x * tz,\n vz + w * tz + x * ty - y * tx,\n ];\n}\n\n/**\n * Build a flat observation vector plus a layout map from live MuJoCo state.\n *\n * Missing named resources are skipped. The returned layout is the source of\n * truth for the vector produced from the current model.\n */\nexport function buildObservation(\n model: MujocoModel,\n data: MujocoData,\n config: ObservationConfig\n): ObservationResult {\n const values: number[] = [];\n const layout: ObservationLayoutItem[] = [];\n\n if (config.time) appendScalar(values, layout, 'time', data.time);\n if (config.qpos) append(values, layout, 'qpos', data.qpos);\n if (config.qvel) append(values, layout, 'qvel', data.qvel);\n if (config.ctrl) append(values, layout, 'ctrl', data.ctrl);\n if (config.act) append(values, layout, 'act', data.act);\n if (config.sensordata) append(values, layout, 'sensordata', data.sensordata);\n\n for (const name of config.sensors ?? []) {\n const sensorId = findSensorByName(model, name);\n if (sensorId < 0) continue;\n const start = model.sensor_adr[sensorId] ?? 0;\n const dim = model.sensor_dim[sensorId] ?? 0;\n append(values, layout, `sensor:${name}`, data.sensordata.subarray(start, start + dim));\n }\n\n for (const name of config.sites ?? []) {\n const siteId = findSiteByName(model, name);\n if (siteId < 0) continue;\n const start = siteId * 3;\n append(values, layout, `site:${name}:xpos`, data.site_xpos.subarray(start, start + 3));\n }\n\n const gravity = normalizedGravity(model);\n for (const name of namedBodyList(config.projectedGravity)) {\n const bodyId = findBodyByName(model, name);\n if (bodyId < 0) continue;\n append(values, layout, `projectedGravity:${name}`, rotateWorldVectorToBody(data, bodyId, gravity));\n }\n\n return {\n values: config.output === 'float64' ? new Float64Array(values) : new Float32Array(values),\n layout,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo, useRef } from 'react';\n\n/** Shallow-compare two plain objects by own enumerable keys. */\nfunction shallowEqual(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n}\n\nexport interface ControllerOptions<TConfig> {\n /** Unique name for this controller (used as displayName). */\n name: string;\n /** Default values merged under user-supplied config. */\n defaultConfig?: Partial<TConfig>;\n}\n\nexport type ControllerComponent<TConfig> = React.FC<{\n config?: Partial<TConfig>;\n children?: React.ReactNode;\n}> & {\n controllerName: string;\n defaultConfig: Partial<TConfig>;\n};\n\n/**\n * Factory that produces a typed controller component.\n *\n * Controllers are React components that plug into the MuJoCo simulation tree.\n * Inside `Impl`, use any hooks (`useMujoco`, `useBeforePhysicsStep`, etc.)\n * to interact with the physics engine.\n *\n * @example\n * ```tsx\n * const MyController = createController<{ speed: number }>(\n * { name: 'my-controller', defaultConfig: { speed: 1.0 } },\n * function MyControllerImpl({ config }) {\n * 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/**\n * Factory that produces a typed controller hook.\n *\n * Same config stabilization and default merging as `createController`,\n * but returns a hook instead of a component. Pass `null` to disable.\n *\n * @example\n * ```tsx\n * const useMyController = createControllerHook<MyConfig, MyValue>(\n * { name: 'useMyController', defaultConfig: { gain: 1.0 } },\n * function useMyControllerImpl(config) {\n * // config is MyConfig | null — hooks must be called unconditionally\n * useBeforePhysicsStep((_model, data) => {\n * if (!config) return;\n * data.ctrl[0] = config.gain * Math.sin(data.time);\n * });\n * if (!config) return null;\n * return { /* value *\\/ };\n * },\n * );\n *\n * // Usage:\n * const value = useMyController({ gain: 2.0 });\n * const disabled = useMyController(null); // returns null\n * ```\n */\nexport function createControllerHook<TConfig, TValue>(\n options: ControllerOptions<TConfig>,\n useImpl: (config: TConfig | null) => TValue | null,\n): (config: TConfig | null) => TValue | null {\n const useController = (config: TConfig | null): TValue | null => {\n const configObj = config as Record<string, unknown> | null;\n const stableRef = useRef(configObj);\n if (configObj && stableRef.current) {\n if (!shallowEqual(stableRef.current, configObj)) {\n stableRef.current = configObj;\n }\n } else {\n stableRef.current = configObj;\n }\n\n const mergedConfig = useMemo(\n () => stableRef.current\n ? ({ ...options.defaultConfig, ...stableRef.current } as TConfig)\n : null,\n [stableRef.current],\n );\n\n return useImpl(mergedConfig);\n };\n\n return useController;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as THREE from 'three';\nimport { MujocoModule, MujocoModel, MujocoData } from '../types';\n\nexport interface GenericIKOptions {\n maxIterations: number;\n damping: number;\n tolerance: number;\n epsilon: number;\n posWeight: number;\n rotWeight: number;\n}\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 qposAdr qpos addresses for scalar joints in solve order\n * @param targetPos Target position in world frame\n * @param targetQuat Target orientation in world frame\n * @param currentQ Current joint angles matching qposAdr order\n * @param opts Optional solver parameters\n * @returns Joint angles array, or null if solver diverged\n */\n solve(\n model: MujocoModel,\n data: MujocoData,\n siteId: number,\n qposAdr: ArrayLike<number>,\n targetPos: THREE.Vector3,\n targetQuat: THREE.Quaternion,\n currentQ: ArrayLike<number>,\n opts?: Partial<GenericIKOptions>\n ): number[] | null {\n const o = { ...DEFAULTS, ...opts };\n const n = qposAdr.length;\n\n // Save full qpos so we can restore after solving\n const savedQpos = new Float64Array(data.qpos.length);\n savedQpos.set(data.qpos);\n\n // Build target rotation matrix (3x3 row-major)\n const R_target = quatToMat3(targetQuat);\n\n // Working joint angles — start from current configuration\n const q = new Float64Array(n);\n for (let i = 0; i < n; i++) q[i] = currentQ[i];\n\n // Pre-allocate work arrays\n const J = new Float64Array(6 * n); // 6×n Jacobian (row-major)\n const JJt = new Float64Array(36); // 6×6\n const rhs = new Float64Array(6); // right-hand side\n const x = new Float64Array(6); // solve result\n const dq = new Float64Array(n); // joint update\n const baseSitePos = new Float64Array(3);\n const baseSiteMat = new Float64Array(9);\n const pertSitePos = new Float64Array(3);\n const pertSiteMat = new Float64Array(9);\n\n let bestQ: number[] | null = null;\n let bestErr = Infinity;\n\n if (n === 0) return null;\n\n for (let iter = 0; iter < o.maxIterations; iter++) {\n // Set joints and run FK\n for (let i = 0; i < n; i++) data.qpos[qposAdr[i]] = q[i];\n this.mujoco.mj_forward(model, data);\n\n // Read current site pose\n const sp = data.site_xpos;\n const sm = data.site_xmat;\n const off3 = siteId * 3;\n const off9 = siteId * 9;\n for (let i = 0; i < 3; i++) baseSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) baseSiteMat[i] = sm[off9 + i];\n\n // Compute 6D error\n const posErr0 = targetPos.x - baseSitePos[0];\n const posErr1 = targetPos.y - baseSitePos[1];\n const posErr2 = targetPos.z - baseSitePos[2];\n const rotErr = orientationError(baseSiteMat, R_target);\n\n const error = [\n posErr0 * o.posWeight,\n posErr1 * o.posWeight,\n posErr2 * o.posWeight,\n rotErr[0] * o.rotWeight,\n rotErr[1] * o.rotWeight,\n rotErr[2] * o.rotWeight,\n ];\n\n const errNorm = Math.sqrt(\n error[0] * error[0] + error[1] * error[1] + error[2] * error[2] +\n error[3] * error[3] + error[4] * error[4] + error[5] * error[5]\n );\n\n // Track best solution\n if (errNorm < bestErr) {\n bestErr = errNorm;\n bestQ = Array.from(q);\n }\n\n // Converged\n if (errNorm < o.tolerance) break;\n\n // Compute Jacobian via finite differences\n for (let j = 0; j < n; j++) {\n const adr = qposAdr[j];\n const saved = data.qpos[adr];\n data.qpos[adr] = q[j] + o.epsilon;\n this.mujoco.mj_forward(model, data);\n\n for (let i = 0; i < 3; i++) pertSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) pertSiteMat[i] = sm[off9 + i];\n\n // Position Jacobian columns (rows 0-2)\n J[0 * n + j] = ((pertSitePos[0] - baseSitePos[0]) / o.epsilon) * o.posWeight;\n J[1 * n + j] = ((pertSitePos[1] - baseSitePos[1]) / o.epsilon) * o.posWeight;\n J[2 * n + j] = ((pertSitePos[2] - baseSitePos[2]) / o.epsilon) * o.posWeight;\n\n // Orientation Jacobian columns (rows 3-5)\n // δR = R_perturbed * R_base^T, then extract angular velocity\n const dRot = angularDelta(baseSiteMat, pertSiteMat);\n J[3 * n + j] = (dRot[0] / o.epsilon) * o.rotWeight;\n J[4 * n + j] = (dRot[1] / o.epsilon) * o.rotWeight;\n J[5 * n + j] = (dRot[2] / o.epsilon) * o.rotWeight;\n\n // Restore joint\n data.qpos[adr] = saved;\n }\n\n // Restore base FK state for next iteration\n for (let i = 0; i < n; i++) data.qpos[qposAdr[i]] = q[i];\n\n // Damped least squares: Δq = Jᵀ (J Jᵀ + λI)⁻¹ error\n // 1. Compute JJᵀ (6×6)\n for (let r = 0; r < 6; r++) {\n for (let c = 0; c < 6; c++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += J[r * n + k] * J[c * n + k];\n }\n JJt[r * 6 + c] = sum + (r === c ? o.damping : 0);\n }\n }\n\n // 2. Solve (JJᵀ + λI) x = error\n for (let i = 0; i < 6; i++) rhs[i] = error[i];\n solve6x6(JJt, rhs, x);\n\n // 3. Δq = Jᵀ x\n for (let j = 0; j < n; j++) {\n let sum = 0;\n for (let r = 0; r < 6; r++) {\n sum += J[r * n + j] * x[r];\n }\n dq[j] = sum;\n }\n\n // Update joints\n for (let i = 0; i < n; i++) q[i] += dq[i];\n }\n\n // Restore original qpos\n data.qpos.set(savedQpos);\n this.mujoco.mj_forward(model, data);\n\n return bestQ;\n }\n}\n\n// --- Math utilities ---\n\n/** Convert THREE.Quaternion to 3x3 rotation matrix (row-major Float64Array) */\nfunction quatToMat3(q: THREE.Quaternion): Float64Array {\n const m = new Float64Array(9);\n const x = q.x, y = q.y, z = q.z, w = q.w;\n const xx = x * x, yy = y * y, zz = z * z;\n const xy = x * y, xz = x * z, yz = y * z;\n const wx = w * x, wy = w * y, wz = w * z;\n m[0] = 1 - 2 * (yy + zz); m[1] = 2 * (xy - wz); m[2] = 2 * (xz + wy);\n m[3] = 2 * (xy + wz); m[4] = 1 - 2 * (xx + zz); m[5] = 2 * (yz - wx);\n m[6] = 2 * (xz - wy); m[7] = 2 * (yz + wx); m[8] = 1 - 2 * (xx + yy);\n return m;\n}\n\n/**\n * Compute orientation error between current and target rotation matrices.\n * Returns the axis-angle vector (log map of R_target * R_current^T).\n * Uses the small-angle approximation: error ≈ 0.5 * [R32-R23, R13-R31, R21-R12]\n * where R = R_target * R_current^T.\n */\nfunction orientationError(R_cur: Float64Array, R_tgt: Float64Array): [number, number, number] {\n // R_err = R_tgt * R_cur^T (both row-major 3x3)\n // R_err[i][j] = sum_k R_tgt[i][k] * R_cur[j][k] (note: transposing R_cur)\n const Re = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_tgt[i * 3 + k] * R_cur[j * 3 + k];\n }\n Re[i * 3 + j] = s;\n }\n }\n\n // Extract axis-angle from rotation matrix\n // For better accuracy than small-angle approx, use full log map\n const trace = Re[0] + Re[4] + Re[8];\n const cosAngle = Math.max(-1, Math.min(1, (trace - 1) * 0.5));\n const angle = Math.acos(cosAngle);\n\n // Near zero rotation — use small-angle approximation\n if (angle < 1e-6) {\n return [0, 0, 0];\n }\n\n // Near π — degenerate, use small-angle approx of the skew-symmetric part\n if (angle > Math.PI - 1e-6) {\n return [\n 0.5 * (Re[7] - Re[5]),\n 0.5 * (Re[2] - Re[6]),\n 0.5 * (Re[3] - Re[1]),\n ];\n }\n\n // General case: axis = skew(R_err) / (2 sin(angle)), scaled by angle\n const s = angle / (2 * Math.sin(angle));\n return [\n s * (Re[7] - Re[5]),\n s * (Re[2] - Re[6]),\n s * (Re[3] - Re[1]),\n ];\n}\n\n/**\n * Compute angular velocity vector from R_base to R_perturbed.\n * Returns the axis-angle of R_perturbed * R_base^T.\n * (Small angle: the rotation caused by the perturbation.)\n */\nfunction angularDelta(R_base: Float64Array, R_pert: Float64Array): [number, number, number] {\n // δR = R_pert * R_base^T\n // Small angle approx: ω ≈ 0.5 * [δR[7]-δR[5], δR[2]-δR[6], δR[3]-δR[1]]\n // This is fine because the perturbation epsilon is tiny.\n const dR = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_pert[i * 3 + k] * R_base[j * 3 + k];\n }\n dR[i * 3 + j] = s;\n }\n }\n return [\n 0.5 * (dR[7] - dR[5]),\n 0.5 * (dR[2] - dR[6]),\n 0.5 * (dR[3] - dR[1]),\n ];\n}\n\n/**\n * Solve 6×6 linear system Ax = b via Gaussian elimination with partial pivoting.\n * Modifies A and b in place. Result written to x.\n */\nfunction solve6x6(A: Float64Array, b: Float64Array, x: Float64Array): void {\n const N = 6;\n // Work on copies to avoid destroying originals needed elsewhere\n const a = new Float64Array(A);\n const r = new Float64Array(b);\n\n // Forward elimination with partial pivoting\n for (let col = 0; col < N; col++) {\n // Find pivot\n let maxVal = Math.abs(a[col * N + col]);\n let maxRow = col;\n for (let row = col + 1; row < N; row++) {\n const val = Math.abs(a[row * N + col]);\n if (val > maxVal) { maxVal = val; maxRow = row; }\n }\n\n // Swap rows\n if (maxRow !== col) {\n for (let k = 0; k < N; k++) {\n const tmp = a[col * N + k]; a[col * N + k] = a[maxRow * N + k]; a[maxRow * N + k] = tmp;\n }\n const tmp = r[col]; r[col] = r[maxRow]; r[maxRow] = tmp;\n }\n\n const pivot = a[col * N + col];\n if (Math.abs(pivot) < 1e-12) {\n // Singular — return zeros\n x.fill(0);\n return;\n }\n\n // Eliminate below\n for (let row = col + 1; row < N; row++) {\n const factor = a[row * N + col] / pivot;\n for (let k = col; k < N; k++) {\n a[row * N + k] -= factor * a[col * N + k];\n }\n r[row] -= factor * r[col];\n }\n }\n\n // Back substitution\n for (let row = N - 1; row >= 0; row--) {\n let sum = r[row];\n for (let k = row + 1; k < N; k++) {\n sum -= a[row * N + k] * x[k];\n }\n x[row] = sum / a[row * N + row];\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { createControllerHook } from '../core/createController';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { GenericIK } from '../core/GenericIK';\nimport { createContiguousControlGroup, findSiteByName, resolveControlGroup } from '../core/SceneLoader';\nimport type { ControlGroupInfo, IkConfig, IkContextValue, 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\nexport const useIkController = createControllerHook<IkConfig, IkContextValue>(\n { name: 'useIkController', defaultConfig: { damping: 0.01, maxIterations: 50 } },\n function useIkControllerImpl(config) {\n const { mjModelRef, mjDataRef, mujocoRef, resetCallbacks, status } =\n useMujocoContext();\n\n // All IK state lives here\n const ikEnabledRef = useRef(false);\n const ikCalculatingRef = useRef(false);\n const ikTargetRef = useRef<THREE.Group>(new THREE.Group());\n const siteIdRef = useRef(-1);\n const controlGroupRef = useRef<ControlGroupInfo | null>(null);\n const genericIkRef = useRef<GenericIK>(new GenericIK(mujocoRef.current));\n const firstIkEnableRef = useRef(true);\n const needsInitialSync = useRef(true);\n\n const gizmoAnimRef = useRef({\n active: false,\n startPos: new THREE.Vector3(),\n endPos: new THREE.Vector3(),\n startRot: new THREE.Quaternion(),\n endRot: new THREE.Quaternion(),\n startTime: 0,\n duration: 1000,\n });\n\n // Resolve site ID and model-aware control group when model loads or config changes.\n useEffect(() => {\n if (!config) {\n siteIdRef.current = -1;\n controlGroupRef.current = null;\n return;\n }\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n controlGroupRef.current = null;\n return;\n }\n siteIdRef.current = findSiteByName(model, config.siteName);\n controlGroupRef.current = config.numJoints !== undefined\n ? createContiguousControlGroup(model, config.numJoints)\n : resolveControlGroup(model, {\n siteName: config.siteName,\n joints: config.joints,\n actuators: config.actuators,\n });\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n }, [config?.siteName, config?.numJoints, config?.joints, config?.actuators, status, mjModelRef, mjDataRef, config]);\n\n // IK solve function\n const ikSolveFn = useCallback(\n (pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null => {\n if (!config) return null;\n if (config.ikSolveFn) return config.ikSolveFn(pos, quat, currentQ);\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const controlGroup = controlGroupRef.current;\n if (!model || !data || !controlGroup || siteIdRef.current === -1) return null;\n return genericIkRef.current.solve(\n model, data, siteIdRef.current, controlGroup.qposAdr,\n pos, quat, currentQ,\n { damping: config.damping, maxIterations: config.maxIterations },\n );\n },\n [config, mjModelRef, mjDataRef],\n );\n const ikSolveFnRef = useRef<IKSolveFn>(ikSolveFn);\n ikSolveFnRef.current = ikSolveFn;\n\n // Gizmo animation + one-time initial sync\n useFrame(() => {\n if (!config) return;\n\n if (needsInitialSync.current && siteIdRef.current !== -1) {\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n needsInitialSync.current = false;\n }\n }\n\n const ga = gizmoAnimRef.current;\n const target = ikTargetRef.current;\n if (!ga.active || !target) return;\n\n const now = performance.now();\n const elapsed = now - ga.startTime;\n const t = Math.min(elapsed / ga.duration, 1.0);\n const ease = 1 - Math.pow(1 - t, 3);\n target.position.lerpVectors(ga.startPos, ga.endPos, ease);\n target.quaternion.slerpQuaternions(ga.startRot, ga.endRot, ease);\n if (t >= 1.0) ga.active = false;\n });\n\n // IK solve in physics loop\n useBeforePhysicsStep((model, data) => {\n if (!config || !ikEnabledRef.current) {\n ikCalculatingRef.current = false;\n return;\n }\n const target = ikTargetRef.current;\n if (!target) return;\n\n ikCalculatingRef.current = true;\n const controlGroup = controlGroupRef.current;\n if (!controlGroup) return;\n\n const currentQ = Array.from(controlGroup.readQpos(data));\n const solution = config.ikSolveFn\n ? config.ikSolveFn(target.position, target.quaternion, currentQ, {\n model,\n data,\n siteId: siteIdRef.current,\n controlGroup,\n })\n : ikSolveFnRef.current(target.position, target.quaternion, currentQ);\n if (solution) {\n controlGroup.writeCtrl(data, solution);\n }\n });\n\n // Reset callback\n useEffect(() => {\n if (!config) return;\n const cb = () => {\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n gizmoAnimRef.current.active = false;\n firstIkEnableRef.current = true;\n ikEnabledRef.current = false;\n needsInitialSync.current = true;\n };\n resetCallbacks.current.add(cb);\n return () => { resetCallbacks.current.delete(cb); };\n }, [resetCallbacks, mjDataRef, config]);\n\n // --- API methods ---\n\n const setIkEnabled = useCallback(\n (enabled: boolean) => {\n ikEnabledRef.current = enabled;\n const data = mjDataRef.current;\n if (enabled && data && !gizmoAnimRef.current.active && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n firstIkEnableRef.current = false;\n }\n },\n [mjDataRef],\n );\n\n const syncTargetToSiteApi = useCallback(() => {\n const data = mjDataRef.current;\n const target = ikTargetRef.current;\n if (data && target) syncGizmoToSite(data, siteIdRef.current, target);\n }, [mjDataRef]);\n\n const solveIK = useCallback(\n (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 if (!config) return null;\n\n return contextValue;\n },\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport { useEffect, useLayoutEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { BodyProps, SceneObject } from '../types';\n\n/**\n * Declarative physics body component. Registers a body definition in the\n * provider-level registry so it gets injected into the MJCF XML at load time.\n *\n * Bodies present at initial mount cause zero extra reloads (useLayoutEffect\n * runs before the provider's loadScene useEffect). Bodies added/removed after\n * the initial load trigger a debounced scene reload.\n */\nexport function Body({\n name,\n type,\n size,\n position = [0, 0, 0],\n rgba = [0.5, 0.5, 0.5, 1],\n mass,\n freejoint,\n friction,\n solref,\n solimp,\n condim,\n children,\n}: BodyProps) {\n const { bodyRegistryRef, hiddenBodiesRef, requestBodyReload, mjDataRef, mjModelRef, status } =\n useMujocoContext();\n const bodyIdRef = useRef(-1);\n const groupRef = useRef<THREE.Group>(null);\n const initialLoadRef = useRef(true);\n const hasChildren = children != null;\n\n // Register in body registry BEFORE the provider's loadScene useEffect fires.\n useLayoutEffect(() => {\n const definition: SceneObject = {\n name,\n type,\n size,\n position,\n rgba,\n mass,\n freejoint,\n friction,\n solref,\n solimp,\n condim,\n };\n bodyRegistryRef.current.set(name, { definition, hasCustomChildren: hasChildren });\n if (hasChildren) {\n hiddenBodiesRef.current.add(name);\n }\n\n return () => {\n bodyRegistryRef.current.delete(name);\n hiddenBodiesRef.current.delete(name);\n if (!initialLoadRef.current) {\n requestBodyReload();\n }\n };\n }, [name, type, size, position, rgba, mass, freejoint, friction, solref, solimp, condim, hasChildren, bodyRegistryRef, hiddenBodiesRef, requestBodyReload]);\n\n // Resolve body ID once the scene is ready\n useEffect(() => {\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, name);\n initialLoadRef.current = false;\n }, [status, name, mjModelRef]);\n\n // Sync group transform to body pose each frame (only when children are provided)\n useFrame(() => {\n if (!hasChildren) return;\n const data = mjDataRef.current;\n const id = bodyIdRef.current;\n const group = groupRef.current;\n if (!data || id < 0 || !group) return;\n\n const i3 = id * 3;\n const i4 = id * 4;\n group.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n group.quaternion.set(\n data.xquat[i4 + 1],\n data.xquat[i4 + 2],\n data.xquat[i4 + 3],\n data.xquat[i4],\n );\n });\n\n if (!hasChildren) return null;\n\n return <group ref={groupRef}>{children}</group>;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { PivotControls } from '@react-three/drei';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { IkGizmoProps } from '../types';\n\n// Preallocated temps to avoid GC pressure in useFrame\nconst _mat4 = new THREE.Matrix4();\nconst _pos = new THREE.Vector3();\nconst _quat = new THREE.Quaternion();\nconst _scale = new THREE.Vector3(1, 1, 1);\n\n/**\n * IkGizmo — drei PivotControls that tracks a MuJoCo site.\n *\n * Requires a `controller` from `useIkController()`.\n *\n * Props:\n * - `controller` — IkContextValue from `useIkController()`.\n * - `siteName` — MuJoCo site to track. Defaults to the controller's configured site.\n * - `scale` — Gizmo handle scale. Default: 0.18.\n * - `onDrag` — Custom drag callback `(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({ controller, siteName, scale = 0.18, onDrag }: IkGizmoProps) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const { ikTargetRef, siteIdRef, ikEnabledRef, setIkEnabled } = controller;\n\n const wrapperRef = useRef<THREE.Group>(null);\n const pivotRef = useRef<THREE.Group>(null);\n const draggingRef = useRef(false);\n const localSiteIdRef = useRef(-1);\n const { controls } = useThree();\n\n // Resolve the site ID from siteName (only when an explicit siteName override is given)\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready' || !siteName) {\n localSiteIdRef.current = -1;\n return;\n }\n localSiteIdRef.current = findSiteByName(model, siteName);\n }, [siteName, status, mjModelRef]);\n\n // Every frame: sync the visual wrapper to the tracked site (when not dragging)\n useFrame(() => {\n const data = mjDataRef.current;\n const sid = siteName ? localSiteIdRef.current : siteIdRef.current;\n if (!data || sid < 0 || !wrapperRef.current) return;\n\n if (!draggingRef.current) {\n const p = data.site_xpos;\n const m = data.site_xmat;\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n // Position wrapper at the site\n wrapperRef.current.position.set(p[i3], p[i3 + 1], p[i3 + 2]);\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n wrapperRef.current.quaternion.setFromRotationMatrix(_mat4);\n\n // Reset any accumulated drag delta so handles stay at wrapper origin\n if (pivotRef.current) {\n pivotRef.current.matrix.identity();\n }\n }\n });\n\n // Don't render until the model is loaded (avoids gizmo at origin)\n if (status !== 'ready') return null;\n\n return (\n <group 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 { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getContact, withContacts } from '../types';\n\nconst _dummy = new THREE.Object3D();\n\ninterface ContactMarkersProps {\n /** Maximum contacts to render. Default: 100. */\n maxContacts?: number;\n /** Sphere radius. Default: 0.008. */\n radius?: number;\n /** Color. Default: '#22d3ee'. */\n color?: string;\n /** Show markers. Default: true. */\n visible?: boolean;\n}\n\nexport function ContactMarkers({\n maxContacts = 100,\n radius = 0.008,\n color = '#22d3ee',\n visible = true,\n ...groupProps\n}: ContactMarkersProps & Omit<ThreeElements['group'], 'ref' | 'visible'> = {}) {\n const { mjDataRef, status } = useMujocoContext();\n const meshRef = useRef<THREE.InstancedMesh>(null);\n\n useFrame(() => {\n const mesh = meshRef.current;\n const data = mjDataRef.current;\n if (!mesh || !data || !visible) {\n if (mesh) mesh.count = 0;\n return;\n }\n\n const ncon = data.ncon;\n const count = Math.min(ncon, maxContacts);\n\n let resolvedCount = count;\n withContacts(data, (contactArray) => {\n for (let i = 0; i < count; i++) {\n const c = getContact(contactArray, i);\n if (!c) {\n resolvedCount = i;\n return;\n }\n _dummy.position.set(c.pos[0], c.pos[1], c.pos[2]);\n _dummy.updateMatrix();\n mesh.setMatrixAt(i, _dummy.matrix);\n }\n });\n\n mesh.count = resolvedCount;\n mesh.instanceMatrix.needsUpdate = true;\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group {...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 { useMujocoContext, 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 } = useMujocoContext();\n const { gl, camera, scene, controls } = useThree();\n\n const draggingRef = useRef(false);\n const bodyIdRef = useRef(-1);\n const grabDistanceRef = useRef(0);\n const localHitRef = useRef(new THREE.Vector3());\n const grabWorldRef = useRef(new THREE.Vector3());\n const mouseWorldRef = useRef(new THREE.Vector3());\n\n // Arrow helper for visual feedback (managed imperatively)\n const arrowRef = useRef<THREE.ArrowHelper | null>(null);\n const groupRef = useRef<THREE.Group>(null);\n\n useEffect(() => {\n if (!showArrow || !groupRef.current) return;\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 1, 0),\n new THREE.Vector3(),\n 0.1,\n 0xff4444,\n );\n arrow.visible = false;\n // Make arrow semi-transparent\n (arrow.line.material as THREE.LineBasicMaterial).transparent = true;\n (arrow.line.material as THREE.LineBasicMaterial).opacity = 0.6;\n (arrow.cone.material as THREE.MeshBasicMaterial).transparent = true;\n (arrow.cone.material as THREE.MeshBasicMaterial).opacity = 0.6;\n groupRef.current.add(arrow);\n arrowRef.current = arrow;\n return () => {\n if (groupRef.current) groupRef.current.remove(arrow);\n arrow.dispose();\n arrowRef.current = null;\n };\n }, [showArrow]);\n\n // Pointer events on the canvas\n useEffect(() => {\n const canvas = gl.domElement;\n\n const onPointerDown = (evt: PointerEvent) => {\n if (evt.button !== 0) return; // left click only\n if (!evt.ctrlKey && !evt.metaKey) return; // require Ctrl/Cmd+click\n const rect = canvas.getBoundingClientRect();\n _mouse.set(\n ((evt.clientX - rect.left) / rect.width) * 2 - 1,\n -((evt.clientY - rect.top) / rect.height) * 2 + 1,\n );\n _raycaster.setFromCamera(_mouse, camera);\n\n const hits = _raycaster.intersectObjects(scene.children, true);\n for (const hit of hits) {\n let obj: THREE.Object3D | null = hit.object;\n while (obj && obj.userData.bodyID === undefined && obj.parent) {\n obj = obj.parent;\n }\n const bid = obj?.userData.bodyID;\n if (bid !== undefined && bid > 0) {\n bodyIdRef.current = bid;\n draggingRef.current = true;\n grabDistanceRef.current = hit.distance;\n\n // Store hit point in body-local coords\n const data = mjDataRef.current;\n if (data) {\n const i3 = bid * 3;\n const i4 = bid * 4;\n _bodyPos.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n // MuJoCo xquat is [w,x,y,z]; THREE wants (x,y,z,w)\n _bodyQuat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n // World hit → body-local: inverse(bodyRot) * (hitWorld - bodyPos)\n localHitRef.current.copy(hit.point).sub(_bodyPos);\n localHitRef.current.applyQuaternion(_bodyQuat.clone().invert());\n }\n\n mouseWorldRef.current.copy(hit.point);\n grabWorldRef.current.copy(hit.point);\n\n // Disable orbit controls during drag\n if (controls) (controls as unknown as { enabled: boolean }).enabled = false;\n break;\n }\n }\n };\n\n const onPointerMove = (evt: PointerEvent) => {\n if (!draggingRef.current) return;\n // Safety: if no buttons are pressed, the pointerup was missed\n if (evt.buttons === 0) {\n draggingRef.current = false;\n bodyIdRef.current = -1;\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n return;\n }\n const rect = canvas.getBoundingClientRect();\n _mouse.set(\n ((evt.clientX - rect.left) / rect.width) * 2 - 1,\n -((evt.clientY - rect.top) / rect.height) * 2 + 1,\n );\n _raycaster.setFromCamera(_mouse, camera);\n // Project mouse ray to the same grab distance\n mouseWorldRef.current.copy(_raycaster.ray.origin)\n .addScaledVector(_raycaster.ray.direction, grabDistanceRef.current);\n };\n\n const onPointerUp = () => {\n if (!draggingRef.current) return;\n draggingRef.current = false;\n bodyIdRef.current = -1;\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n };\n\n canvas.addEventListener('pointerdown', onPointerDown);\n canvas.addEventListener('pointermove', onPointerMove);\n // Listen on window so we catch releases even if pointer leaves the canvas\n window.addEventListener('pointerup', onPointerUp);\n window.addEventListener('pointercancel', onPointerUp);\n return () => {\n canvas.removeEventListener('pointerdown', onPointerDown);\n canvas.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onPointerUp);\n window.removeEventListener('pointercancel', onPointerUp);\n };\n }, [gl, camera, scene, controls, mjDataRef]);\n\n // Apply spring force each physics frame\n useBeforePhysicsStep((model, data) => {\n if (!draggingRef.current || bodyIdRef.current <= 0) return;\n\n const bid = bodyIdRef.current;\n const mujoco = mujocoRef.current;\n\n // Reconstruct grab point world position from body's current pose\n const i3 = bid * 3;\n const i4 = bid * 4;\n _bodyPos.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n _bodyQuat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n _worldHit.copy(localHitRef.current);\n _worldHit.applyQuaternion(_bodyQuat);\n _worldHit.add(_bodyPos);\n grabWorldRef.current.copy(_worldHit);\n\n // Compute spring force: F = (mouseWorld - grabWorld) * body_mass * stiffness\n const mass = model.body_mass[bid];\n const s = stiffness * mass;\n _force[0] = (mouseWorldRef.current.x - _worldHit.x) * s;\n _force[1] = (mouseWorldRef.current.y - _worldHit.y) * s;\n _force[2] = (mouseWorldRef.current.z - _worldHit.z) * s;\n\n _point[0] = _worldHit.x;\n _point[1] = _worldHit.y;\n _point[2] = _worldHit.z;\n\n _torque[0] = 0; _torque[1] = 0; _torque[2] = 0;\n\n mujoco.mj_applyFT(model, data, _force, _torque, _point, bid, data.qfrc_applied);\n });\n\n // Update arrow visual\n useFrame(() => {\n const arrow = arrowRef.current;\n if (!arrow) return;\n\n if (draggingRef.current && bodyIdRef.current > 0) {\n arrow.visible = true;\n const dir = _bodyPos.copy(mouseWorldRef.current).sub(grabWorldRef.current);\n const len = dir.length();\n if (len > 0.001) {\n dir.normalize();\n arrow.position.copy(grabWorldRef.current);\n arrow.setDirection(dir);\n arrow.setLength(len, Math.min(len * 0.2, 0.05), Math.min(len * 0.1, 0.03));\n }\n } else {\n arrow.visible = false;\n }\n });\n\n if (status !== 'ready') return null;\n\n return <group {...groupProps} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSceneLights — hook form of SceneLights (spec 6.3)\n *\n * Auto-creates Three.js lights from MJCF <light> elements.\n */\n\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\nexport function useSceneLights(intensity = 1.0) {\n const { mjModelRef, status } = useMujocoContext();\n const { scene } = useThree();\n const lightsRef = useRef<THREE.Light[]>([]);\n const targetsRef = useRef<THREE.Object3D[]>([]);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n\n // Clean up previous lights\n for (const light of lightsRef.current) {\n scene.remove(light);\n light.dispose();\n }\n for (const t of targetsRef.current) scene.remove(t);\n lightsRef.current = [];\n targetsRef.current = [];\n\n const nlight = model.nlight ?? 0;\n if (nlight === 0) return;\n\n 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 { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { getContact, withContacts } 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 } = useMujocoContext();\n const { scene } = useThree();\n const groupRef = useRef<THREE.Group>(null);\n\n // Build static debug geometry when model loads\n const debugGeometry = useMemo(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return null;\n\n const geoms: THREE.Object3D[] = [];\n const sites: THREE.Object3D[] = [];\n const joints: THREE.Object3D[] = [];\n const 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 withContacts(data, (contactArray) => {\n for (let i = 0; i < Math.min(ncon, MAX_CONTACT_ARROWS); i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n _contactPos.set(c.pos[0], c.pos[1], c.pos[2]);\n _contactNormal.set(c.frame[0], c.frame[1], c.frame[2]);\n const force = Math.abs(c.dist) * 100;\n const length = Math.min(force * 0.01, 0.1);\n if (length > 0.001 && arrowIdx < pool.length) {\n const arrow = pool[arrowIdx];\n arrow.position.copy(_contactPos);\n arrow.setDirection(_contactNormal);\n arrow.setLength(length, length * 0.3, length * 0.15);\n arrow.visible = true;\n arrowIdx++;\n }\n }\n });\n\n // Hide unused arrows\n for (let i = arrowIdx; i < pool.length; i++) {\n pool[i].visible = false;\n }\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group {...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 may not be available in all MuJoCo WASM builds.\n * Tendons use a default color and width.\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\nconst DEFAULT_TENDON_COLOR = new THREE.Color(0.3, 0.3, 0.8);\nconst DEFAULT_TENDON_WIDTH = 0.002;\n\n// Preallocated temp vector to avoid per-frame allocations\nconst _tmpVec = new THREE.Vector3();\n\nexport function TendonRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n const curvesRef = useRef<THREE.CatmullRomCurve3[]>([]);\n const materialRef = useRef<THREE.MeshStandardMaterial | null>(null);\n\n // Build tendon meshes once when model loads\n useEffect(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const group = groupRef.current;\n if (!model || !data || !group) return;\n\n const ntendon = model.ntendon ?? 0;\n if (ntendon === 0) return;\n\n // Shared material for all tendons\n const material = new THREE.MeshStandardMaterial({\n color: DEFAULT_TENDON_COLOR,\n roughness: 0.6,\n metalness: 0.1,\n });\n materialRef.current = material;\n\n const meshes: THREE.Mesh[] = [];\n const curves: THREE.CatmullRomCurve3[] = [];\n\n for (let t = 0; t < ntendon; t++) {\n const wrapNum = model.ten_wrapnum[t];\n if (wrapNum < 2) {\n meshes.push(null!);\n curves.push(null!);\n continue;\n }\n\n // Initial dummy points — will be overwritten in useFrame\n const points = Array.from({ length: wrapNum }, () => new THREE.Vector3());\n const curve = new THREE.CatmullRomCurve3(points, false);\n const segments = Math.max(wrapNum * 2, 4);\n const geometry = new THREE.TubeGeometry(curve, segments, DEFAULT_TENDON_WIDTH, 6, false);\n const mesh = new THREE.Mesh(geometry, material);\n mesh.frustumCulled = false;\n group.add(mesh);\n meshes.push(mesh);\n curves.push(curve);\n }\n\n meshesRef.current = meshes;\n curvesRef.current = curves;\n\n return () => {\n for (const mesh of meshes) {\n if (!mesh) continue;\n group.remove(mesh);\n mesh.geometry.dispose();\n }\n material.dispose();\n meshesRef.current = [];\n curvesRef.current = [];\n materialRef.current = null;\n };\n }, [status, mjModelRef, mjDataRef]);\n\n // Update curve control points and rebuild geometry each frame\n useFrame(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const ntendon = model.ntendon ?? 0;\n const meshes = meshesRef.current;\n const curves = curvesRef.current;\n\n for (let t = 0; t < ntendon; t++) {\n const mesh = meshes[t];\n const curve = curves[t];\n if (!mesh || !curve) continue;\n\n const wrapAdr = model.ten_wrapadr[t];\n const wrapNum = model.ten_wrapnum[t];\n\n // Update existing control points in-place\n let validCount = 0;\n for (let w = 0; w < wrapNum; w++) {\n const idx = (wrapAdr + w) * 3;\n if (data.wrap_xpos && idx + 2 < data.wrap_xpos.length) {\n const x = data.wrap_xpos[idx];\n const y = data.wrap_xpos[idx + 1];\n const z = data.wrap_xpos[idx + 2];\n if (x !== 0 || y !== 0 || z !== 0) {\n if (validCount < curve.points.length) {\n curve.points[validCount].set(x, y, z);\n }\n validCount++;\n }\n }\n }\n\n if (validCount < 2) {\n mesh.visible = false;\n continue;\n }\n\n // Trim or pad points array to match valid count\n if (curve.points.length !== validCount) {\n curve.points.length = validCount;\n while (curve.points.length < validCount) {\n curve.points.push(new THREE.Vector3());\n }\n }\n\n // Rebuild geometry from updated curve\n mesh.geometry.dispose();\n mesh.geometry = new THREE.TubeGeometry(\n curve, Math.max(validCount * 2, 4), DEFAULT_TENDON_WIDTH, 6, false\n );\n mesh.visible = true;\n }\n });\n\n if (status !== 'ready') return null;\n return <group {...props} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * FlexRenderer — render deformable flex bodies (spec 6.4)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\n/**\n * Renders MuJoCo flex (deformable) bodies as dynamic meshes.\n * Vertices are updated every frame from flexvert_xpos.\n */\nexport function FlexRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n\n // Build flex meshes once when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group || status !== 'ready') return;\n\n const nflex = model.nflex ?? 0;\n if (nflex === 0) return;\n\n for (let f = 0; f < nflex; f++) {\n const vertAdr = model.flex_vertadr[f];\n const vertNum = model.flex_vertnum[f];\n\n if (vertNum === 0) continue;\n\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(vertNum * 3);\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n // Note: flex_faceadr/flex_facenum/flex_face may not be available in all MuJoCo WASM builds.\n // Without face data we render as a point cloud. If future WASM versions expose\n // face arrays, index-based triangle rendering can be added here.\n\n geometry.computeVertexNormals();\n\n let color = new THREE.Color(0.5, 0.5, 0.5);\n if (model.flex_rgba) {\n color = new THREE.Color(\n model.flex_rgba[4 * f],\n model.flex_rgba[4 * f + 1],\n model.flex_rgba[4 * f + 2],\n );\n }\n\n const material = new THREE.MeshStandardMaterial({\n color,\n roughness: 0.7,\n side: THREE.DoubleSide,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.userData.flexId = f;\n mesh.userData.vertAdr = vertAdr;\n mesh.userData.vertNum = vertNum;\n group.add(mesh);\n meshesRef.current.push(mesh);\n }\n\n return () => {\n for (const mesh of meshesRef.current) {\n group.remove(mesh);\n mesh.geometry.dispose();\n (mesh.material as THREE.Material).dispose();\n }\n meshesRef.current = [];\n };\n }, [status, mjModelRef]);\n\n // Update vertex positions every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !data.flexvert_xpos) return;\n\n for (const mesh of meshesRef.current) {\n const vertAdr = mesh.userData.vertAdr;\n const vertNum = mesh.userData.vertNum;\n const posAttr = mesh.geometry.getAttribute('position') as THREE.BufferAttribute;\n if (!posAttr) continue;\n\n for (let v = 0; v < vertNum; v++) {\n const srcIdx = (vertAdr + v) * 3;\n posAttr.setXYZ(v, data.flexvert_xpos[srcIdx], data.flexvert_xpos[srcIdx + 1], data.flexvert_xpos[srcIdx + 2]);\n }\n posAttr.needsUpdate = true;\n mesh.geometry.computeVertexNormals();\n }\n });\n\n if (status !== 'ready') return null;\n return <group {...props} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { GeomBuilder } from '../rendering/GeomBuilder';\nimport type { GeomInfo, MujocoModel } from '../types';\n\nexport interface InstancedGeomRendererProps extends Omit<ThreeElements['group'], 'ref'> {\n /** Only render geoms from this MuJoCo geom group. */\n geomGroup?: number;\n /** Predicate for selecting geoms. */\n filter?: (geom: GeomInfo) => boolean;\n /** Optional material override for every instanced batch. */\n material?: THREE.Material;\n /** Hide or show the instanced batches. */\n visible?: boolean;\n castShadow?: boolean;\n receiveShadow?: boolean;\n}\n\ninterface GeomBatch {\n key: string;\n geomIds: number[];\n geometry: THREE.BufferGeometry;\n material: THREE.Material;\n}\n\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\nconst _matrix = new THREE.Matrix4();\n\nfunction getGeomInfo(model: MujocoModel, geomId: number): GeomInfo {\n const size = model.geom_size.subarray(geomId * 3, geomId * 3 + 3);\n const type = model.geom_type[geomId];\n return {\n id: geomId,\n name: getName(model, model.name_geomadr[geomId]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `type-${type}`,\n size: [size[0], size[1], size[2]],\n bodyId: model.geom_bodyid[geomId],\n };\n}\n\nfunction geomSignature(model: MujocoModel, geomId: number): string {\n const type = model.geom_type[geomId];\n const size = Array.from(model.geom_size.subarray(geomId * 3, geomId * 3 + 3)).join(',');\n const mat = model.geom_matid[geomId];\n const data = model.geom_dataid[geomId];\n const rgba = Array.from(model.geom_rgba.subarray(geomId * 4, geomId * 4 + 4)).join(',');\n return [type, size, mat, data, rgba].join('|');\n}\n\nfunction firstMesh(object: THREE.Object3D): THREE.Mesh | null {\n if (object instanceof THREE.Mesh) return object;\n let mesh: THREE.Mesh | null = null;\n object.traverse((child) => {\n if (!mesh && child instanceof THREE.Mesh) mesh = child;\n });\n return mesh;\n}\n\nexport function InstancedGeomRenderer({\n geomGroup,\n filter,\n material,\n visible = true,\n castShadow = true,\n receiveShadow = true,\n ...groupProps\n}: InstancedGeomRendererProps = {}) {\n const { mjModelRef, mjDataRef, mujocoRef, status } = useMujocoContext();\n const meshRefs = useRef<(THREE.InstancedMesh | null)[]>([]);\n\n const batches = useMemo<GeomBatch[]>(() => {\n if (status !== 'ready') return [];\n const model = mjModelRef.current;\n if (!model) return [];\n\n const builder = new GeomBuilder(mujocoRef.current);\n const grouped = new Map<string, number[]>();\n\n for (let geomId = 0; geomId < model.ngeom; geomId++) {\n if (model.geom_group[geomId] === 3) continue;\n if (geomGroup !== undefined && model.geom_group[geomId] !== geomGroup) continue;\n const info = getGeomInfo(model, geomId);\n if (filter && !filter(info)) continue;\n const key = geomSignature(model, geomId);\n const ids = grouped.get(key);\n if (ids) ids.push(geomId);\n else grouped.set(key, [geomId]);\n }\n\n const next: GeomBatch[] = [];\n for (const [key, geomIds] of grouped) {\n if (geomIds.length < 2) continue;\n const object = builder.create(model, geomIds[0]);\n if (!object) continue;\n const mesh = firstMesh(object);\n if (!mesh) continue;\n const sourceMaterial = Array.isArray(mesh.material) ? mesh.material[0] : mesh.material;\n next.push({\n key,\n geomIds,\n geometry: mesh.geometry.clone(),\n material: material ?? sourceMaterial.clone(),\n });\n }\n\n return next;\n }, [filter, geomGroup, material, mjModelRef, mujocoRef, status]);\n\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !visible) return;\n\n batches.forEach((batch, batchIndex) => {\n const mesh = meshRefs.current[batchIndex];\n if (!mesh) return;\n batch.geomIds.forEach((geomId, instanceId) => {\n const p = geomId * 3;\n const r = geomId * 9;\n _matrix.set(\n data.geom_xmat[r], data.geom_xmat[r + 1], data.geom_xmat[r + 2], data.geom_xpos[p],\n data.geom_xmat[r + 3], data.geom_xmat[r + 4], data.geom_xmat[r + 5], data.geom_xpos[p + 1],\n data.geom_xmat[r + 6], data.geom_xmat[r + 7], data.geom_xmat[r + 8], data.geom_xpos[p + 2],\n 0, 0, 0, 1\n );\n mesh.setMatrixAt(instanceId, _matrix);\n });\n mesh.count = batch.geomIds.length;\n mesh.instanceMatrix.needsUpdate = true;\n });\n });\n\n if (status !== 'ready' || batches.length === 0) return null;\n\n return (\n <group {...groupProps} visible={visible}>\n {batches.map((batch, index) => (\n <instancedMesh\n key={batch.key}\n ref={(mesh) => { meshRefs.current[index] = mesh; }}\n args={[batch.geometry, batch.material, batch.geomIds.length]}\n castShadow={castShadow}\n receiveShadow={receiveShadow}\n frustumCulled={false}\n />\n ))}\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useContacts — structured contact query hook (spec 2.4)\n * useContactEvents — contact enter/exit events (spec 2.5)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName, getName } from '../core/SceneLoader';\nimport { getContact, withContacts } from '../types';\nimport type { Bodies, ContactInfo, MujocoModel } from '../types';\n\n// Cache geom names per model to avoid cross-model id collisions.\nconst geomNameCacheByModel = new WeakMap<MujocoModel, Map<number, string>>();\n\nfunction getGeomNameCached(model: MujocoModel, geomId: number): string {\n let perModel = geomNameCacheByModel.get(model);\n if (!perModel) {\n perModel = new Map<number, string>();\n geomNameCacheByModel.set(model, perModel);\n }\n\n let name = perModel.get(geomId);\n if (name === undefined) {\n name = getName(model, model.name_geomadr[geomId]);\n perModel.set(geomId, name);\n }\n return name;\n}\n\n/**\n * Track contacts for a specific body (or all contacts if no body specified).\n * Calls the callback every physics frame with current contact list.\n * Reads `data.ncon` first to avoid allocating for zero contacts.\n */\nexport function useContacts(\n bodyName?: Bodies,\n callback?: (contacts: ContactInfo[]) => void,\n): React.RefObject<ContactInfo[]> {\n const { mjModelRef, status } = useMujocoContext();\n const contactsRef = useRef<ContactInfo[]>([]);\n const bodyIdRef = useRef(-1);\n const bodyResolvedRef = useRef(false);\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n if (!bodyName) {\n bodyIdRef.current = -1;\n bodyResolvedRef.current = true;\n return;\n }\n bodyResolvedRef.current = false;\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, bodyName);\n bodyResolvedRef.current = true;\n }, [bodyName, status, mjModelRef]);\n\n useAfterPhysicsStep((model, data) => {\n // Resolve body id lazily once model exists, to avoid missing the first ready frame.\n if (bodyName && !bodyResolvedRef.current) {\n bodyIdRef.current = findBodyByName(model, bodyName);\n bodyResolvedRef.current = true;\n }\n\n const ncon = data.ncon;\n if (ncon === 0) {\n if (contactsRef.current.length > 0) contactsRef.current = [];\n callbackRef.current?.([]);\n return;\n }\n\n const contacts: ContactInfo[] = [];\n const filterBody = bodyIdRef.current;\n\n withContacts(data, (contactArray) => {\n for (let i = 0; i < ncon; i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n // Filter by body if specified\n if (filterBody >= 0) {\n const b1 = model.geom_bodyid[c.geom1];\n const b2 = model.geom_bodyid[c.geom2];\n if (b1 !== filterBody && b2 !== filterBody) continue;\n }\n contacts.push({\n geom1: c.geom1,\n geom1Name: getGeomNameCached(model, c.geom1),\n geom2: c.geom2,\n geom2Name: getGeomNameCached(model, c.geom2),\n pos: [c.pos[0], c.pos[1], c.pos[2]],\n depth: c.dist,\n });\n }\n });\n contactsRef.current = contacts;\n callbackRef.current?.(contacts);\n });\n\n return contactsRef;\n}\n\n/**\n * Contact enter/exit events for a specific body (spec 2.5).\n * Tracks which geom pairs are in contact frame-to-frame and fires\n * onEnter/onExit callbacks on transitions.\n */\nexport function useContactEvents(\n bodyName: Bodies,\n handlers: {\n onEnter?: (info: ContactInfo) => void;\n onExit?: (info: ContactInfo) => void;\n },\n) {\n const prevPairsRef = useRef(new Set<string>());\n const onEnterRef = useRef(handlers.onEnter);\n const onExitRef = useRef(handlers.onExit);\n onEnterRef.current = handlers.onEnter;\n onExitRef.current = handlers.onExit;\n\n const prevContactMapRef = useRef(new Map<string, ContactInfo>());\n\n const onContacts = useCallback((contacts: ContactInfo[]) => {\n const currentPairs = new Set<string>();\n const currentMap = new Map<string, ContactInfo>();\n\n for (const c of contacts) {\n const key = `${Math.min(c.geom1, c.geom2)}_${Math.max(c.geom1, c.geom2)}`;\n currentPairs.add(key);\n currentMap.set(key, c);\n }\n\n // New contacts (enter)\n for (const key of currentPairs) {\n if (!prevPairsRef.current.has(key)) {\n onEnterRef.current?.(currentMap.get(key)!);\n }\n }\n\n // Lost contacts (exit)\n for (const key of prevPairsRef.current) {\n if (!currentPairs.has(key)) {\n const prev = prevContactMapRef.current.get(key);\n if (prev) onExitRef.current?.(prev);\n }\n }\n\n prevPairsRef.current = currentPairs;\n prevContactMapRef.current = currentMap;\n }, []);\n\n useContacts(bodyName, onContacts);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * ContactListener — component form of contact events (spec 2.5)\n */\n\nimport { useContactEvents } from '../hooks/useContacts';\nimport type { ContactListenerProps } from '../types';\n\n/**\n * Component form of useContactEvents.\n * Fires onContactEnter/onContactExit callbacks when contacts change.\n */\nexport function ContactListener({\n body,\n onContactEnter,\n onContactExit,\n}: ContactListenerProps) {\n useContactEvents(body, {\n onEnter: onContactEnter,\n onExit: onContactExit,\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryPlayer — trajectory playback/scrubbing (spec 13.2)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport type { PlaybackState, TrajectoryFrame, TrajectoryInput } from '../types';\n\nexport interface TrajectoryPlayerOptions {\n fps?: number;\n speed?: number;\n loop?: boolean;\n mode?: 'kinematic' | 'physics';\n onComplete?: () => void;\n onStateChange?: (state: PlaybackState) => void;\n}\n\n/** Check if input is TrajectoryFrame[] (vs number[][]) */\nfunction isTrajectoryFrames(input: TrajectoryInput): input is TrajectoryFrame[] {\n return input.length > 0 && typeof (input[0] as TrajectoryFrame).time === 'number'\n && 'qpos' in (input[0] as TrajectoryFrame);\n}\n\n/** Extract qpos as plain number array from a frame */\nfunction getQpos(input: TrajectoryInput, idx: number): ArrayLike<number> | null {\n const item = input[idx];\n if (!item) return null;\n if (Array.isArray(item)) return item;\n return (item as TrajectoryFrame).qpos;\n}\n\n/** Extract ctrl values from a TrajectoryFrame, if available */\nfunction getCtrl(input: TrajectoryInput, idx: number): ArrayLike<number> | null {\n const item = input[idx];\n if (!item || Array.isArray(item)) return null;\n return (item as TrajectoryFrame).ctrl ?? null;\n}\n\n/**\n * Play back a trajectory, overriding simulation state.\n *\n * Accepts either `TrajectoryFrame[]` (from useTrajectoryRecorder) or\n * `number[][]` (raw qpos arrays).\n *\n * In `kinematic` mode (default), the simulation is paused and qpos is\n * set directly each frame with mj_forward for rendering.\n *\n * In `physics` mode, the simulation keeps running and ctrl values from\n * the trajectory are applied each physics step via useBeforePhysicsStep.\n */\nexport function useTrajectoryPlayer(\n trajectory: TrajectoryInput,\n options: TrajectoryPlayerOptions = {},\n) {\n const { mjModelRef, mjDataRef, mujocoRef, pausedRef } = useMujocoContext();\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const stateRef = useRef<PlaybackState>('idle');\n const frameRef = useRef(0);\n const lastFrameTimeRef = useRef(0);\n const speedRef = useRef(options.speed ?? 1.0);\n const wasPausedRef = useRef(false);\n\n // Stable ref to trajectory to avoid stale closures in useBeforePhysicsStep\n const trajectoryRef = useRef(trajectory);\n trajectoryRef.current = trajectory;\n\n const setState = useCallback((next: PlaybackState) => {\n if (stateRef.current === next) return;\n stateRef.current = next;\n optionsRef.current.onStateChange?.(next);\n }, []);\n\n const play = useCallback(() => {\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n const mode = optionsRef.current.mode ?? 'kinematic';\n\n if (stateRef.current === 'completed') {\n frameRef.current = 0;\n }\n\n if (mode === 'kinematic') {\n wasPausedRef.current = pausedRef.current;\n pausedRef.current = true;\n }\n\n lastFrameTimeRef.current = performance.now();\n setState('playing');\n }, [pausedRef, setState]);\n\n const pause = useCallback(() => {\n if (stateRef.current !== 'playing') return;\n setState('paused');\n }, [setState]);\n\n const seek = useCallback((frameIdx: number) => {\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n frameRef.current = Math.max(0, Math.min(frameIdx, traj.length - 1));\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = getQpos(traj, frameRef.current);\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n }, [mjModelRef, mjDataRef, mujocoRef]);\n\n const reset = useCallback(() => {\n const mode = optionsRef.current.mode ?? 'kinematic';\n if (mode === 'kinematic' && stateRef.current !== 'idle') {\n pausedRef.current = wasPausedRef.current;\n }\n frameRef.current = 0;\n setState('idle');\n }, [pausedRef, setState]);\n\n const setSpeed = useCallback((s: number) => {\n speedRef.current = s;\n }, []);\n\n const complete = useCallback(() => {\n const mode = optionsRef.current.mode ?? 'kinematic';\n if (mode === 'kinematic') {\n pausedRef.current = wasPausedRef.current;\n }\n setState('completed');\n optionsRef.current.onComplete?.();\n }, [pausedRef, setState]);\n\n // --- Kinematic mode: drive qpos directly from useFrame ---\n useFrame(() => {\n if (stateRef.current !== 'playing') return;\n if ((optionsRef.current.mode ?? 'kinematic') !== 'kinematic') return;\n\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n const now = performance.now();\n const fps = optionsRef.current.fps ?? 30;\n const frameInterval = 1000 / (fps * speedRef.current);\n const elapsed = now - lastFrameTimeRef.current;\n\n if (elapsed < frameInterval) return;\n lastFrameTimeRef.current = now;\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = getQpos(traj, frameRef.current);\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n\n frameRef.current++;\n if (frameRef.current >= traj.length) {\n if (optionsRef.current.loop) {\n frameRef.current = 0;\n } else {\n complete();\n }\n }\n });\n\n // --- Physics mode: set ctrl values each physics step ---\n useBeforePhysicsStep((model, data) => {\n if (stateRef.current !== 'playing') return;\n if ((optionsRef.current.mode ?? 'kinematic') !== 'physics') return;\n\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n // Advance frame based on sim time vs trajectory time\n const fps = optionsRef.current.fps ?? 30;\n const targetFrame = Math.floor(data.time * fps * speedRef.current);\n frameRef.current = Math.min(targetFrame, traj.length - 1);\n\n // Apply ctrl from trajectory\n const ctrl = getCtrl(traj, frameRef.current);\n if (ctrl) {\n for (let i = 0; i < Math.min(ctrl.length, model.nu); i++) {\n data.ctrl[i] = ctrl[i];\n }\n }\n\n // Check completion\n if (frameRef.current >= traj.length - 1) {\n if (optionsRef.current.loop) {\n // Reset sim time to restart\n data.time = 0;\n frameRef.current = 0;\n } else {\n complete();\n }\n }\n });\n\n return {\n play,\n pause,\n seek,\n reset,\n setSpeed,\n get state() { return stateRef.current; },\n get frame() { return frameRef.current; },\n get playing() { return stateRef.current === 'playing'; },\n get totalFrames() { return trajectory.length; },\n get progress() { return trajectory.length > 1 ? frameRef.current / (trajectory.length - 1) : 0; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TrajectoryPlayer — component form of trajectory playback (spec 13.2)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useTrajectoryPlayer } from '../hooks/useTrajectoryPlayer';\nimport type { TrajectoryPlayerProps } from '../types';\n\n/**\n * Component wrapper for useTrajectoryPlayer.\n * Provides declarative trajectory playback controlled via props.\n */\nexport function TrajectoryPlayer({\n trajectory,\n fps = 30,\n speed = 1.0,\n loop = false,\n playing = false,\n mode = 'kinematic',\n onFrame,\n onComplete,\n onStateChange,\n}: TrajectoryPlayerProps) {\n const player = useTrajectoryPlayer(trajectory, {\n fps,\n speed,\n loop,\n mode,\n onComplete,\n onStateChange,\n });\n const onFrameRef = useRef(onFrame);\n onFrameRef.current = onFrame;\n const lastReportedFrameRef = useRef(-1);\n\n useEffect(() => {\n player.setSpeed(speed);\n }, [speed, player]);\n\n useEffect(() => {\n if (playing) {\n player.play();\n } else {\n player.pause();\n }\n }, [playing, player]);\n\n useFrame(() => {\n if (!onFrameRef.current) return;\n const currentFrame = player.frame;\n if (currentFrame !== lastReportedFrameRef.current && player.playing) {\n lastReportedFrameRef.current = currentFrame;\n onFrameRef.current(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 { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { ActuatorInfo } from '../types';\n\n/**\n * Returns a stable array of actuator metadata for building control UIs.\n * Computed once when the model loads. Consumer reads/writes data.ctrl[id] directly.\n */\nexport function useActuators(): ActuatorInfo[] {\n const { mjModelRef, status } = useMujocoContext();\n\n return useMemo(() => {\n if (status !== 'ready') return [];\n const model = mjModelRef.current;\n if (!model) return [];\n\n const actuators: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const name = getName(model, model.name_actuatoradr[i]);\n const lo = model.actuator_ctrlrange[i * 2];\n const hi = model.actuator_ctrlrange[i * 2 + 1];\n const hasRange = lo < hi;\n const range: [number, number] = hasRange\n ? [lo, hi]\n : [-Infinity, Infinity];\n actuators.push({ id: i, name, range });\n }\n return actuators;\n }, [status, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { Sites, SitePositionResult } from '../types';\n\n// Preallocated temp for rotation matrix extraction\nconst _mat4 = new THREE.Matrix4();\n\n/**\n * Returns reactive refs for a MuJoCo site's world position and orientation.\n * Refs are updated every frame without triggering React re-renders.\n */\nexport function useSitePosition(siteName: Sites): SitePositionResult {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const siteIdRef = useRef(-1);\n const positionRef = useRef(new THREE.Vector3());\n const quaternionRef = useRef(new THREE.Quaternion());\n\n // Resolve site ID when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n return;\n }\n siteIdRef.current = findSiteByName(model, siteName);\n }, [siteName, status, mjModelRef]);\n\n // Update refs every frame\n useFrame(() => {\n const data = mjDataRef.current;\n const sid = siteIdRef.current;\n if (!data || sid < 0) return;\n\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n positionRef.current.set(\n data.site_xpos[i3],\n data.site_xpos[i3 + 1],\n data.site_xpos[i3 + 2]\n );\n\n const m = data.site_xmat;\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n quaternionRef.current.setFromRotationMatrix(_mat4);\n });\n\n return { position: positionRef, quaternion: quaternionRef };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useBeforePhysicsStep } from '../core/MujocoSimProvider';\n\n/**\n * Applies gravity compensation each physics frame by adding qfrc_bias\n * (gravity + Coriolis forces) to qfrc_applied for each DOF.\n *\n * The provider zeros qfrc_applied at the start of each frame, so this\n * hook (and DragInteraction) compose correctly — both add to a clean slate.\n */\nexport function useGravityCompensation(enabled = true): void {\n useBeforePhysicsStep((model, data) => {\n if (!enabled) return;\n for (let i = 0; i < model.nv; i++) {\n data.qfrc_applied[i] += data.qfrc_bias[i];\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSensor / useSensors — MuJoCo sensor access hooks (spec 2.1)\n */\n\nimport { useEffect, useRef, useMemo } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { Sensors, SensorHandle, SensorInfo } from '../types';\n\n/**\n * Access a single MuJoCo sensor by name. Returns a `SensorHandle` with\n * `read()`, `dim`, and `name`. The backing array is updated every physics\n * frame without causing React re-renders.\n */\nexport function useSensor(name: Sensors): SensorHandle {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const sensorIdRef = useRef(-1);\n const sensorAdrRef = useRef(0);\n const sensorDimRef = useRef(0);\n const valueRef = useRef<Float64Array>(new Float64Array(0));\n\n // Resolve sensor ID once model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n for (let i = 0; i < model.nsensor; i++) {\n if (getName(model, model.name_sensoradr[i]) === name) {\n sensorIdRef.current = i;\n sensorAdrRef.current = model.sensor_adr[i];\n sensorDimRef.current = model.sensor_dim[i];\n valueRef.current = new Float64Array(model.sensor_dim[i]);\n return;\n }\n }\n sensorIdRef.current = -1;\n }, [name, status, mjModelRef]);\n\n // Update every frame after physics step\n useAfterPhysicsStep((_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 useMemo<SensorHandle>(() => ({\n read() {\n return valueRef.current;\n },\n get dim() {\n return sensorDimRef.current;\n },\n name,\n }), [name]);\n}\n\n/**\n * Enumerate all sensors in the loaded MuJoCo model.\n * Returns a stable array recomputed only when the model changes.\n */\nexport function useSensors(): SensorInfo[] {\n const { mjModelRef, status } = useMujocoContext();\n\n return useMemo(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return [];\n const SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'jointpos', 9: 'jointvel', 10: 'tendonpos', 11: 'tendonvel',\n 12: 'actuatorpos', 13: 'actuatorvel', 14: 'actuatorfrc',\n };\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, [mjModelRef, status]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useJointState — per-joint position/velocity access (spec 2.3)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { Joints, 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: Joints): JointStateResult {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const jointIdRef = useRef(-1);\n const qposAdrRef = useRef(0);\n const dofAdrRef = useRef(0);\n const qposDimRef = useRef(1);\n const dofDimRef = useRef(1);\n const 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 { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { Bodies, BodyStateResult } from '../types';\n\n/**\n * Track a MuJoCo body's world position, quaternion, and velocities.\n * All values are ref-based — updated every physics frame without re-renders.\n */\nexport function useBodyState(name: Bodies): BodyStateResult {\n const { mjModelRef, status } = useMujocoContext();\n const bodyIdRef = useRef(-1);\n const position = useRef(new THREE.Vector3());\n const quaternion = useRef(new THREE.Quaternion());\n const linearVelocity = useRef(new THREE.Vector3());\n const angularVelocity = useRef(new THREE.Vector3());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n bodyIdRef.current = findBodyByName(model, name);\n }, [name, status, mjModelRef]);\n\n useAfterPhysicsStep((_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 — handle-based read/write access to a named actuator's ctrl value (spec 3.1)\n */\n\nimport { useEffect, useRef, useMemo } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport type { Actuators, CtrlHandle } from '../types';\n\n/**\n * Access a single actuator's control value by name.\n *\n * Returns a `CtrlHandle` with `read()` and `write()` methods that\n * operate directly on `data.ctrl` without causing React re-renders.\n */\nexport function useCtrl(name: Actuators): CtrlHandle {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const actuatorIdRef = useRef(-1);\n const rangeRef = useRef<[number, number]>([0, 0]);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n const id = findActuatorByName(model, name);\n actuatorIdRef.current = id;\n if (id >= 0) {\n rangeRef.current = [\n model.actuator_ctrlrange[id * 2],\n model.actuator_ctrlrange[id * 2 + 1],\n ];\n }\n }, [name, status, mjModelRef]);\n\n return useMemo<CtrlHandle>(() => ({\n read() {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return 0;\n return data.ctrl[actuatorIdRef.current];\n },\n write(value: number) {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return;\n data.ctrl[actuatorIdRef.current] = value;\n },\n name,\n get range(): [number, number] {\n return rangeRef.current;\n },\n }), [name, mjDataRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useKeyboardTeleop — keyboard teleoperation hook (spec 12.1)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport type { KeyboardTeleopConfig } from '../types';\n\n/**\n * Map keyboard keys to actuator commands.\n *\n * Supports three binding modes:\n * - `delta`: Add delta to actuator value while key is held\n * - `toggle`: Toggle between two values on key press\n * - `set`: Set actuator to a fixed value while key is held\n */\nexport function useKeyboardTeleop(config: KeyboardTeleopConfig) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const pressedRef = useRef(new Set<string>());\n const toggleStateRef = useRef(new Map<string, boolean>());\n const enabledRef = useRef(config.enabled ?? true);\n enabledRef.current = config.enabled ?? true;\n\n // Resolve actuator IDs\n const bindingsRef = useRef(config.bindings);\n bindingsRef.current = config.bindings;\n\n // Actuator ID cache\n const actuatorCacheRef = useRef(new Map<string, number>());\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n const cache = new Map<string, number>();\n for (const binding of Object.values(config.bindings)) {\n if (!cache.has(binding.actuator)) {\n cache.set(binding.actuator, findActuatorByName(model, binding.actuator));\n }\n }\n actuatorCacheRef.current = cache;\n }, [config.bindings, status, mjModelRef]);\n\n // Key event listeners\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (!enabledRef.current) return;\n const key = e.key.toLowerCase();\n if (bindingsRef.current[key]) {\n pressedRef.current.add(key);\n // Handle toggle on keydown\n const binding = bindingsRef.current[key];\n if (binding.toggle) {\n const current = toggleStateRef.current.get(key) ?? false;\n toggleStateRef.current.set(key, !current);\n }\n }\n };\n const onKeyUp = (e: KeyboardEvent) => {\n pressedRef.current.delete(e.key.toLowerCase());\n };\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('keyup', onKeyUp);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('keyup', onKeyUp);\n };\n }, []);\n\n // Apply bindings each physics frame\n useBeforePhysicsStep((_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 { useMujocoContext, 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 } = useMujocoContext();\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\nimport { useMemo, useRef } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { buildObservation } from '../core/ObservationBuilder';\nimport type { ObservationConfig, ObservationHandle, ObservationResult } from '../types';\n\nconst EMPTY_OBSERVATION: ObservationResult = {\n values: new Float32Array(0),\n layout: [],\n};\n\n/**\n * Live observation reader for policy loops and telemetry.\n *\n * The handle is stable; call `read()` inside callbacks to sample the latest\n * MuJoCo model/data state without forcing React renders.\n */\nexport function useObservation(config: ObservationConfig): ObservationHandle {\n const { mjModelRef, mjDataRef } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n\n return useMemo(() => ({\n read() {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return EMPTY_OBSERVATION;\n return buildObservation(model, data, configRef.current);\n },\n readValues() {\n return this.read().values;\n },\n }), [mjDataRef, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryRecorder — trajectory recording hook (spec 13.1)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport type { TrajectoryFrame } from '../types';\n\ninterface RecorderOptions {\n fields?: ('qpos' | 'qvel' | 'ctrl' | 'sensordata')[];\n}\n\n/**\n * Record simulation trajectories for analysis, replay, or training data.\n */\nexport function useTrajectoryRecorder(options: RecorderOptions = {}) {\n const { mjModelRef } = useMujocoContext();\n const recordingRef = useRef(false);\n const framesRef = useRef<TrajectoryFrame[]>([]);\n const fields = options.fields ?? ['qpos'];\n\n useAfterPhysicsStep((_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 { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\n\ninterface GamepadConfig {\n /** Map gamepad axis index to actuator name. */\n axes?: Record<number, string>;\n /** Map gamepad button index to actuator name. */\n buttons?: Record<number, string>;\n /** Axis deadzone. Default: 0.1. */\n deadzone?: number;\n /** Scale factor for axis values. Default: 1.0. */\n scale?: number;\n /** Gamepad index. Default: 0 (first connected). */\n gamepadIndex?: number;\n enabled?: boolean;\n}\n\n/**\n * Map gamepad axes and buttons to actuator controls.\n * Axes map their -1..1 value (scaled) to the actuator.\n * Buttons map their 0..1 pressed value to the actuator.\n */\nexport function useGamepad(config: GamepadConfig) {\n const { mjModelRef, status } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n\n // Cache actuator IDs\n const axisCacheRef = useRef(new Map<number, number>());\n const buttonCacheRef = useRef(new Map<number, number>());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n axisCacheRef.current.clear();\n buttonCacheRef.current.clear();\n for (const [idx, name] of Object.entries(config.axes ?? {})) {\n axisCacheRef.current.set(Number(idx), findActuatorByName(model, name));\n }\n for (const [idx, name] of Object.entries(config.buttons ?? {})) {\n buttonCacheRef.current.set(Number(idx), findActuatorByName(model, name));\n }\n }, [config.axes, config.buttons, status, mjModelRef]);\n\n useBeforePhysicsStep((_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 { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\n\ninterface CtrlNoiseConfig {\n /** Exponential filter rate (0-1). Higher = faster noise changes. Default: 0.01. */\n rate?: number;\n /** Standard deviation of Gaussian noise. Default: 0.05. */\n std?: number;\n /** Enable/disable. Default: true. */\n enabled?: boolean;\n}\n\n/**\n * Apply Gaussian noise with exponential filtering to all ctrl values.\n * Useful for robustness testing and domain randomization.\n *\n * noise[i] = (1 - rate) * noise[i] + rate * N(0, std)\n * data.ctrl[i] += noise[i]\n */\nexport function useCtrlNoise(config: CtrlNoiseConfig = {}) {\n const { mjModelRef } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n const noiseRef = useRef<Float64Array | null>(null);\n\n useBeforePhysicsStep((_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"]}
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/ObservationBuilder.ts","../src/core/createController.tsx","../src/core/GenericIK.ts","../src/hooks/useIkController.ts","../src/components/Body.tsx","../src/components/IkGizmo.tsx","../src/components/ContactMarkers.tsx","../src/components/DragInteraction.tsx","../src/hooks/useSceneLights.ts","../src/components/SceneLights.tsx","../src/components/Debug.tsx","../src/components/TendonRenderer.tsx","../src/components/FlexRenderer.tsx","../src/components/InstancedGeomRenderer.tsx","../src/hooks/useContacts.ts","../src/components/ContactListener.tsx","../src/hooks/useTrajectoryPlayer.ts","../src/components/TrajectoryPlayer.tsx","../src/hooks/useActuators.ts","../src/hooks/useSitePosition.ts","../src/hooks/useGravityCompensation.ts","../src/hooks/useSensor.ts","../src/hooks/useJointState.ts","../src/hooks/useBodyState.ts","../src/hooks/useCtrl.ts","../src/hooks/useKeyboardTeleop.ts","../src/hooks/usePolicy.ts","../src/hooks/useObservation.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","JOINT_TYPE_NAMES","THREE5","createContext","useContext","useState","api","useFrame","getQpos","getCtrl","useMemo","MujocoCanvas","forwardRef","MujocoPhysics","s","tmp","THREE6","useCallback","THREE7","useThree","THREE8","jsxs","THREE9","THREE10","_quat","THREE12","THREE13","GEOM_TYPE_NAMES","THREE14","_mat4","THREE15","SENSOR_TYPE_NAMES","THREE16","THREE17","THREE18"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport loadMujoco from '@mujoco/mujoco';\nimport defaultMujocoWasmUrl from '@mujoco/mujoco/mujoco.wasm?url';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport type { MujocoModule, MujocoContextValue } from '../types';\n\nconst MujocoContext = createContext<MujocoContextValue>({\n mujoco: null,\n status: 'loading',\n error: null,\n});\n\n/**\n * Hook to access the MuJoCo WASM module.\n */\nexport function useMujocoWasm(): MujocoContextValue {\n return useContext(MujocoContext);\n}\n\nexport type MujocoWasmVariant = 'single' | 'threaded' | 'auto';\n\nexport interface MujocoLoaderOptions {\n locateFile?: (path: string) => string;\n printErr?: (text: string) => void;\n}\n\nexport type MujocoLoader = (options?: MujocoLoaderOptions) => Promise<unknown>;\n\nexport interface MujocoProviderProps {\n wasmUrl?: string;\n /** Optional URL for the multi-threaded WASM asset. */\n mtWasmUrl?: string;\n /**\n * Optional official multi-threaded loader, usually imported from\n * `@mujoco/mujoco/mt`. It is supplied by the app so the default package path\n * does not force every bundler to process the threaded Emscripten build.\n */\n threadedLoader?: MujocoLoader;\n /**\n * MuJoCo WASM build to load. `single` is the default and works everywhere.\n * `threaded` requires `threadedLoader` and cross-origin isolation. `auto`\n * uses threaded only when both conditions are satisfied.\n */\n wasmVariant?: MujocoWasmVariant;\n /** Timeout in ms for WASM module load. Default: 30000. */\n timeout?: number;\n children: React.ReactNode;\n onError?: (error: Error) => void;\n}\n\nfunction canUseThreadedWasm(): boolean {\n return typeof globalThis !== 'undefined' && globalThis.crossOriginIsolated === true;\n}\n\nfunction isMujocoModule(value: unknown): value is MujocoModule {\n return typeof value === 'object'\n && value !== null\n && 'FS' in value\n && 'MjModel' in value\n && 'MjData' in value\n && 'mj_step' in value;\n}\n\nfunction hasWasmUrl(value: string | undefined): value is string {\n return typeof value === 'string' && value.length > 0;\n}\n\nfunction resolveWasmVariant(\n variant: MujocoWasmVariant | undefined,\n threadedLoader: MujocoLoader | undefined,\n mtWasmUrl: string | undefined\n): 'single' | 'threaded' {\n if (variant === 'threaded') return 'threaded';\n if (variant === 'auto' && threadedLoader && mtWasmUrl && canUseThreadedWasm()) return 'threaded';\n return 'single';\n}\n\n/**\n * MujocoProvider — WASM / module lifecycle.\n * Loads the MuJoCo WASM module on mount and provides it to children via context.\n */\nexport function MujocoProvider({\n wasmUrl,\n mtWasmUrl,\n threadedLoader,\n wasmVariant = 'single',\n timeout = 30000,\n children,\n onError,\n}: MujocoProviderProps) {\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n const [error, setError] = useState<string | null>(null);\n const moduleRef = useRef<MujocoModule | null>(null);\n const isMounted = useRef(true);\n\n useEffect(() => {\n isMounted.current = true;\n\n const variant = resolveWasmVariant(wasmVariant, threadedLoader, mtWasmUrl);\n if (variant === 'threaded' && !threadedLoader) {\n const err = new Error('MujocoProvider wasmVariant=\"threaded\" requires a threadedLoader from @mujoco/mujoco/mt');\n setError(err.message);\n setStatus('error');\n onError?.(err);\n return;\n }\n let selectedWasmUrl = wasmUrl ?? defaultMujocoWasmUrl;\n\n if (variant === 'threaded') {\n if (!hasWasmUrl(mtWasmUrl)) {\n const err = new Error('MujocoProvider wasmVariant=\"threaded\" requires mtWasmUrl from @mujoco/mujoco/mt/mujoco.wasm?url');\n setError(err.message);\n setStatus('error');\n onError?.(err);\n return;\n }\n selectedWasmUrl = mtWasmUrl;\n }\n\n const load: MujocoLoader = variant === 'threaded' && threadedLoader ? threadedLoader : loadMujoco;\n\n const wasmPromise = load({\n locateFile: (path: string) => path.endsWith('.wasm') ? selectedWasmUrl : path,\n printErr: (text: string) => {\n if (text.includes('Aborted') && isMounted.current) {\n setError('Simulation crashed. Reload page.');\n setStatus('error');\n }\n },\n });\n\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(`WASM module load timed out after ${timeout}ms`)), timeout)\n );\n\n Promise.race([wasmPromise, timeoutPromise])\n .then((inst: unknown) => {\n if (isMounted.current) {\n if (!isMujocoModule(inst)) {\n throw new Error('MuJoCo WASM module initialized with an unexpected shape');\n }\n moduleRef.current = inst;\n setStatus('ready');\n }\n })\n .catch((err: Error) => {\n if (isMounted.current) {\n const msg = err.message || 'Failed to init spatial simulation';\n setError(msg);\n setStatus('error');\n onError?.(new Error(msg));\n }\n });\n\n return () => {\n isMounted.current = false;\n };\n }, [wasmUrl, mtWasmUrl, threadedLoader, wasmVariant, timeout, onError]);\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 React from 'react';\nimport type { ReactNode } from 'react';\nimport type { CanvasProps } from '@react-three/fiber';\nimport * as THREE from 'three';\n\n// ---- Register (type-safe named resources) ----\n\n/**\n * Module augmentation interface for type-safe resource names.\n *\n * Declare your model's resource names via module augmentation:\n * ```ts\n * declare module 'mujoco-react' {\n * interface Register {\n * robots: {\n * panda: {\n * actuators: 'joint1' | 'joint2' | 'gripper';\n * sensors: 'force_sensor' | 'torque_sensor';\n * bodies: 'link0' | 'link1' | 'hand';\n * };\n * };\n * actuators: 'joint1' | 'joint2' | 'gripper';\n * sensors: 'force_sensor' | 'torque_sensor';\n * bodies: 'link0' | 'link1' | 'hand';\n * }\n * }\n * ```\n *\n * When no augmentation is declared, all names fall back to `string`.\n */\nexport interface Register {}\n\nexport type RegisteredRobotMap = Register extends { robots: infer T extends Record<string, Record<string, string>> }\n ? T\n : never;\nexport type Robots = [RegisteredRobotMap] extends [never] ? string : Extract<keyof RegisteredRobotMap, string>;\nexport type RobotResource<TRobot extends string, TKey extends string> =\n [RegisteredRobotMap] extends [never]\n ? string\n : TRobot extends keyof RegisteredRobotMap\n ? TKey extends keyof RegisteredRobotMap[TRobot]\n ? RegisteredRobotMap[TRobot][TKey]\n : string\n : never;\nexport type RobotActuators<TRobot extends string> = RobotResource<TRobot, 'actuators'>;\nexport type RobotSensors<TRobot extends string> = RobotResource<TRobot, 'sensors'>;\nexport type RobotBodies<TRobot extends string> = RobotResource<TRobot, 'bodies'>;\nexport type RobotJoints<TRobot extends string> = RobotResource<TRobot, 'joints'>;\nexport type RobotSites<TRobot extends string> = RobotResource<TRobot, 'sites'>;\nexport type RobotGeoms<TRobot extends string> = RobotResource<TRobot, 'geoms'>;\nexport type RobotKeyframes<TRobot extends string> = RobotResource<TRobot, 'keyframes'>;\n\nexport type RegisterResourceKey = 'actuators' | 'sensors' | 'bodies' | 'joints' | 'sites' | 'geoms' | 'keyframes';\nexport type RobotResourceObject<TRobot extends string, TKey extends RegisterResourceKey> =\n string extends RobotResource<TRobot, TKey>\n ? Record<string, string>\n : { readonly [K in RobotResource<TRobot, TKey>]: K };\nexport type RobotResourceCategory<TKey extends RegisterResourceKey> =\n string extends Robots\n ? Record<string, Record<string, string>>\n : { readonly [TRobot in Robots]: RobotResourceObject<TRobot, TKey> };\nexport type RobotResourceRegistry =\n string extends Robots\n ? Record<string, Record<RegisterResourceKey, Record<string, string>>>\n : { readonly [TRobot in Robots]: { readonly [TKey in RegisterResourceKey]: RobotResourceObject<TRobot, TKey> } };\n\ntype RuntimeRobotResources = Record<string, Record<RegisterResourceKey, Record<string, string>>>;\ntype RuntimeRobotResourceRegistration = Readonly<Record<string, Readonly<Record<RegisterResourceKey, Readonly<Record<string, string>>>>>>;\n\nconst runtimeRobotResources: RuntimeRobotResources = {};\nconst REGISTER_RESOURCE_KEYS: RegisterResourceKey[] = ['actuators', 'sensors', 'bodies', 'joints', 'sites', 'geoms', 'keyframes'];\n\nfunction createEmptyRuntimeResources(): Record<RegisterResourceKey, Record<string, string>> {\n return {\n actuators: {},\n sensors: {},\n bodies: {},\n joints: {},\n sites: {},\n geoms: {},\n keyframes: {},\n };\n}\n\nexport function registerRobotResources(resources: RuntimeRobotResourceRegistration): void {\n for (const [robot, robotResources] of Object.entries(resources)) {\n const existing = runtimeRobotResources[robot] ?? createEmptyRuntimeResources();\n for (const key of REGISTER_RESOURCE_KEYS) {\n existing[key] = { ...existing[key], ...(robotResources[key] ?? {}) };\n }\n runtimeRobotResources[robot] = existing;\n }\n}\n\nfunction createResourceCategory<TKey extends RegisterResourceKey>(key: TKey): RobotResourceCategory<TKey> {\n return new Proxy({}, {\n get(_target, robot) {\n if (typeof robot !== 'string') return undefined;\n return runtimeRobotResources[robot]?.[key] ?? {};\n },\n ownKeys() {\n return Reflect.ownKeys(runtimeRobotResources);\n },\n getOwnPropertyDescriptor(_target, robot) {\n if (typeof robot !== 'string' || !(robot in runtimeRobotResources)) return undefined;\n return { enumerable: true, configurable: true };\n },\n }) as RobotResourceCategory<TKey>;\n}\n\nexport const RobotResources: RobotResourceRegistry = new Proxy(runtimeRobotResources, {\n get(target, robot) {\n if (typeof robot !== 'string') return undefined;\n return target[robot] ?? createEmptyRuntimeResources();\n },\n ownKeys(target) {\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(target, robot) {\n if (typeof robot !== 'string' || !(robot in target)) return undefined;\n return { enumerable: true, configurable: true };\n },\n}) as RobotResourceRegistry;\n\nexport const RobotActuators: RobotResourceCategory<'actuators'> = createResourceCategory('actuators');\nexport const RobotSensors: RobotResourceCategory<'sensors'> = createResourceCategory('sensors');\nexport const RobotBodies: RobotResourceCategory<'bodies'> = createResourceCategory('bodies');\nexport const RobotJoints: RobotResourceCategory<'joints'> = createResourceCategory('joints');\nexport const RobotSites: RobotResourceCategory<'sites'> = createResourceCategory('sites');\nexport const RobotGeoms: RobotResourceCategory<'geoms'> = createResourceCategory('geoms');\nexport const RobotKeyframes: RobotResourceCategory<'keyframes'> = createResourceCategory('keyframes');\n\nexport type Actuators = Register extends { actuators: infer T extends string } ? T : string;\nexport type Sensors = Register extends { sensors: infer T extends string } ? T : string;\nexport type Bodies = Register extends { bodies: infer T extends string } ? T : string;\nexport type Joints = Register extends { joints: infer T extends string } ? T : string;\nexport type Sites = Register extends { sites: infer T extends string } ? T : string;\nexport type Geoms = Register extends { geoms: infer T extends string } ? T : string;\nexport type Keyframes = Register extends { keyframes: infer T extends string } ? T : string;\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 delete?: () => void;\n}\n\n/**\n * Read a single contact from an already-acquired WASM contact array.\n * Returns undefined if the access fails (WASM heap issue, bad index, etc.).\n */\nexport function getContact(contacts: MujocoContactArray, i: number): MujocoContact | undefined {\n try {\n return contacts.get(i);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Access the current contact vector and release the copied WASM handle afterwards.\n */\nexport function withContacts<T>(data: MujocoData, read: (contacts: MujocoContactArray) => T): T {\n const contacts = data.contact;\n try {\n return read(contacts);\n } finally {\n contacts.delete?.();\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: {\n from_xml_path?: (path: string) => MujocoModel;\n from_xml_string?: (xml: string, vfs?: unknown) => MujocoModel;\n loadFromXML?: (path: string) => MujocoModel;\n [key: string]: unknown;\n };\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 type LocalMujocoFile = File;\n\nexport interface LoadFromFilesOptions {\n /** Entry MJCF/URDF file. Inferred from scene.xml, model.xml, robot.xml, or the first XML/URDF file when omitted. */\n sceneFile?: string;\n homeJoints?: number[];\n xmlPatches?: XmlPatch[];\n sceneObjects?: SceneObject[];\n onReset?: (model: MujocoModel, data: MujocoData) => void;\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 or URDF file name, e.g. 'scene.xml' or 'robot.urdf'. */\n sceneFile: string;\n /** Browser-selected files for local MJCF/URDF loading. Preserves webkitRelativePath when available. */\n files?: readonly LocalMujocoFile[];\n sceneObjects?: SceneObject[];\n homeJoints?: number[];\n xmlPatches?: XmlPatch[];\n onReset?: (model: MujocoModel, data: MujocoData) => void;\n}\n\n// ---- IK Controller Config ----\n\nexport type ResourceSelector<TInfo, TName extends string = string> =\n | TName\n | readonly TName[]\n | RegExp\n | ((info: TInfo) => boolean);\n\nexport interface IkConfig {\n /** MuJoCo site name for IK target. */\n siteName: Sites;\n /**\n * Explicit joints for IK. When omitted, the controller infers scalar hinge/slide\n * joints by walking from the site body to the model root.\n */\n joints?: ResourceSelector<JointInfo, Joints>;\n /** Explicit actuators for IK control output. */\n actuators?: ResourceSelector<ActuatorInfo, Actuators>;\n /**\n * Number of joints to solve for, assuming legacy contiguous qpos/ctrl layout\n * starting at index 0. Prefer inferred IK or `joints`/`actuators`.\n */\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 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 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 context?: IKSolveContext\n) => number[] | null;\n\nexport interface IKSolveContext {\n model: MujocoModel;\n data: MujocoData;\n siteId: number;\n controlGroup: ControlGroupInfo;\n}\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 ActuatedJointInfo extends JointInfo {\n actuatorId: number;\n actuatorName: string;\n ctrlAdr: number;\n ctrlRange: [number, number];\n}\n\nexport interface ControlJointInfo extends JointInfo {\n actuatorId: number | null;\n actuatorName: string | null;\n ctrlAdr: number | null;\n ctrlRange: [number, number] | null;\n}\n\nexport interface ControlGroupSelector {\n /** Infer a kinematic chain from a MuJoCo site. */\n siteName?: Sites;\n /** Infer a kinematic chain from a body. */\n bodyName?: Bodies;\n /** Select joints by name, names, regex, or predicate. */\n joints?: ResourceSelector<JointInfo, Joints>;\n /** Select actuators by name, names, regex, or predicate. */\n actuators?: ResourceSelector<ActuatorInfo, Actuators>;\n}\n\nexport interface ControlGroupInfo {\n /** Joints in solve/control order. */\n joints: ControlJointInfo[];\n /** Actuators in control output order. */\n actuators: ActuatorInfo[];\n /** qpos addresses for scalar hinge/slide joints. */\n qposAdr: number[];\n /** dof addresses for scalar hinge/slide joints. */\n dofAdr: number[];\n /** ctrl addresses matching writable actuators. */\n ctrlAdr: number[];\n readQpos(data: MujocoData): Float64Array;\n readCtrl(data: MujocoData): Float64Array;\n writeQpos(data: MujocoData, values: ArrayLike<number>): void;\n writeCtrl(data: MujocoData, values: ArrayLike<number>): void;\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\nexport type PlaybackState = 'idle' | 'playing' | 'paused' | 'completed';\n\n// ---- Keyboard Teleop (spec 12.1) ----\n\nexport interface KeyBinding {\n actuator: Actuators;\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// ---- Observation Builder ----\n\nexport type ObservationOutput = 'float32' | 'float64';\n\nexport interface ObservationConfig {\n /** Include scalar simulation time. */\n time?: boolean;\n /** Include all qpos values. */\n qpos?: boolean;\n /** Include all qvel values. */\n qvel?: boolean;\n /** Include all ctrl values. */\n ctrl?: boolean;\n /** Include all actuator activation values. */\n act?: boolean;\n /** Include all raw sensordata values. */\n sensordata?: boolean;\n /** Include named sensor values in the configured order. */\n sensors?: readonly Sensors[];\n /** Include named site world positions in the configured order. */\n sites?: readonly Sites[];\n /** Include world gravity projected into each named body's local frame. */\n projectedGravity?: Bodies | readonly Bodies[];\n /** Output array type. Defaults to Float32Array. */\n output?: ObservationOutput;\n}\n\nexport interface ObservationLayoutItem {\n name: string;\n start: number;\n size: number;\n}\n\nexport interface ObservationResult {\n values: Float32Array | Float64Array;\n layout: ObservationLayoutItem[];\n}\n\nexport interface ObservationHandle {\n /** Read a fresh observation from the current live MuJoCo model/data refs. */\n read(): ObservationResult;\n /** Read just the vector values for policy inference. */\n readValues(): Float32Array | Float64Array;\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 controller: IkContextValue;\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 type TrajectoryInput = TrajectoryFrame[] | number[][];\n\nexport interface TrajectoryPlayerProps {\n trajectory: TrajectoryInput;\n fps?: number;\n speed?: number;\n loop?: boolean;\n playing?: boolean;\n mode?: 'kinematic' | 'physics';\n onFrame?: (frameIdx: number) => void;\n onComplete?: () => void;\n onStateChange?: (state: PlaybackState) => void;\n}\n\nexport interface SelectionHighlightProps {\n bodyId: number | null;\n color?: string;\n emissiveIntensity?: number;\n}\n\nexport interface ContactListenerProps {\n body: Bodies;\n onContactEnter?: (info: ContactInfo) => void;\n onContactExit?: (info: ContactInfo) => void;\n}\n\nexport interface BodyProps {\n name: Bodies;\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 children?: ReactNode;\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: Keyframes | 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: Actuators | Record<Actuators, number>, value?: number): void;\n getCtrl(): Float64Array;\n getControlMap(): ControlGroupInfo;\n getActuatedJoints(): ActuatedJointInfo[];\n resolveControlGroup(selector: ControlGroupSelector): ControlGroupInfo | null;\n\n // Force application (spec 8.1)\n applyForce(bodyName: Bodies, force: THREE.Vector3, point?: THREE.Vector3): void;\n applyTorque(bodyName: Bodies, torque: THREE.Vector3): void;\n setExternalForce(bodyName: Bodies, force: THREE.Vector3, torque: THREE.Vector3): void;\n applyGeneralizedForce(values: Float64Array | number[]): void;\n\n // Sensors (spec 2.1)\n getSensorData(name: Sensors): 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 loadFromFiles(files: FileList | readonly LocalMujocoFile[], options?: LoadFromFilesOptions): Promise<void>;\n addBody(body: SceneObject): Promise<void>;\n removeBody(name: Bodies): Promise<void>;\n recompile(patches?: XmlPatch[]): 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: Bodies, mass: number): void;\n setGeomFriction(name: Geoms, friction: [number, number, number]): void;\n setGeomSize(name: Geoms, 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 interpolate?: boolean;\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\n/** @deprecated Use `SensorHandle` instead. */\nexport interface SensorResult {\n value: React.RefObject<Float64Array>;\n size: number;\n}\n\nexport interface CtrlHandle {\n /** Read the current ctrl value. */\n read(): number;\n /** Write a ctrl value (goes directly to data.ctrl). */\n write(value: number): void;\n /** Actuator name. */\n name: Actuators;\n /** Actuator control range [min, max]. */\n range: [number, number];\n}\n\nexport interface SensorHandle {\n /** Read the current sensor data. */\n read(): Float64Array;\n /** Sensor dimensionality. */\n dim: number;\n /** Sensor name. */\n name: Sensors;\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 MuJoCo WASM binding versions.\n const getVal = (v: unknown) => (v as { value: number })?.value ?? v;\n\n if (type === getVal(MG.mjGEOM_PLANE)) {\n // Planes are infinite in MuJoCo, but 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 type {\n ActuatedJointInfo,\n ActuatorInfo,\n ControlGroupInfo,\n ControlGroupSelector,\n ControlJointInfo,\n JointInfo,\n LoadFromFilesOptions,\n LocalMujocoFile,\n MujocoData,\n MujocoModel,\n MujocoModule,\n ResourceSelector,\n} from '../types';\nimport { SceneConfig, SceneObject, XmlPatch } from '../types';\n\nconst JOINT_TYPE_NAMES: Record<number, string> = {\n 0: 'free',\n 1: 'ball',\n 2: 'slide',\n 3: 'hinge',\n};\n\n/**\n * Reads a null-terminated C string from MuJoCo's WASM memory.\n */\nexport function getName(mjModel: MujocoModel, address: number): string {\n let name = '';\n let idx = address;\n let safety = 0;\n while (mjModel.names[idx] !== 0 && safety < 100) {\n name += String.fromCharCode(mjModel.names[idx++]);\n safety++;\n }\n return name;\n}\n\n/**\n * Find a site by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSiteByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsite; i++) {\n if (getName(mjModel, mjModel.name_siteadr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find an actuator by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findActuatorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nu; i++) {\n if (getName(mjModel, mjModel.name_actuatoradr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find a keyframe by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findKeyframeByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nkey; i++) {\n if (getName(mjModel, mjModel.name_keyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a body by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findBodyByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nbody; i++) {\n if (getName(mjModel, mjModel.name_bodyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a joint by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findJointByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.njnt; i++) {\n if (getName(mjModel, mjModel.name_jntadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a geom by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findGeomByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.ngeom; i++) {\n if (getName(mjModel, mjModel.name_geomadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a sensor by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSensorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsensor; i++) {\n if (getName(mjModel, mjModel.name_sensoradr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a tendon by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findTendonByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < (mjModel.ntendon ?? 0); i++) {\n if (getName(mjModel, mjModel.name_tendonadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Return qpos address for actuators that directly target a scalar joint.\n * Returns -1 for non-joint transmissions and multi-DOF joints.\n */\nexport function getActuatedScalarQposAdr(mjModel: MujocoModel, actuatorId: number): number {\n if (actuatorId < 0 || actuatorId >= mjModel.nu) return -1;\n\n // mjTRN_JOINT=0, mjTRN_JOINTINPARENT=1. Other transmission types don't map ctrl to a single qpos.\n const trnType = mjModel.actuator_trntype?.[actuatorId];\n if (trnType !== undefined && trnType !== 0 && trnType !== 1) return -1;\n\n const jointId = mjModel.actuator_trnid[2 * actuatorId];\n if (jointId < 0 || jointId >= mjModel.njnt) return -1;\n\n const jntType = mjModel.jnt_type[jointId];\n if (jntType !== 2 && jntType !== 3) return -1; // slide=2, hinge=3\n\n return mjModel.jnt_qposadr[jointId];\n}\n\nfunction getScalarJointDim(jointType: number): 0 | 1 {\n return jointType === 2 || jointType === 3 ? 1 : 0;\n}\n\nfunction unlimitedRange(): [number, number] {\n return [-Infinity, Infinity];\n}\n\nfunction isScalarJoint(mjModel: MujocoModel, jointId: number): boolean {\n return jointId >= 0 && jointId < mjModel.njnt && getScalarJointDim(mjModel.jnt_type[jointId]) === 1;\n}\n\nfunction getActuatorJointId(mjModel: MujocoModel, actuatorId: number): number {\n if (actuatorId < 0 || actuatorId >= mjModel.nu) return -1;\n const trnType = mjModel.actuator_trntype?.[actuatorId];\n if (trnType !== undefined && trnType !== 0 && trnType !== 1) return -1;\n const jointId = mjModel.actuator_trnid[2 * actuatorId];\n return isScalarJoint(mjModel, jointId) ? jointId : -1;\n}\n\nfunction getJointInfo(mjModel: MujocoModel, jointId: number): JointInfo {\n const type = mjModel.jnt_type[jointId];\n const range: [number, number] = [mjModel.jnt_range[2 * jointId], mjModel.jnt_range[2 * jointId + 1]];\n return {\n id: jointId,\n name: getName(mjModel, mjModel.name_jntadr[jointId]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range,\n limited: range[0] < range[1],\n bodyId: mjModel.jnt_bodyid[jointId],\n qposAdr: mjModel.jnt_qposadr[jointId],\n dofAdr: mjModel.jnt_dofadr[jointId],\n };\n}\n\nfunction getActuatorInfo(mjModel: MujocoModel, actuatorId: number): ActuatorInfo {\n const hasRange = mjModel.actuator_ctrlrange[2 * actuatorId] < mjModel.actuator_ctrlrange[2 * actuatorId + 1];\n return {\n id: actuatorId,\n name: getName(mjModel, mjModel.name_actuatoradr[actuatorId]),\n range: hasRange\n ? [mjModel.actuator_ctrlrange[2 * actuatorId], mjModel.actuator_ctrlrange[2 * actuatorId + 1]]\n : unlimitedRange(),\n };\n}\n\nfunction includesResourceName(names: readonly string[], name: string): boolean {\n return names.includes(name);\n}\n\nfunction matchesSelector<TInfo extends { name: string }, TName extends string>(\n info: TInfo,\n selector: ResourceSelector<TInfo, TName>\n): boolean {\n if (typeof selector === 'string') return info.name === selector;\n if (selector instanceof RegExp) return selector.test(info.name);\n if (Array.isArray(selector)) return includesResourceName(selector, info.name);\n if (typeof selector === 'function') return selector(info);\n return false;\n}\n\nfunction orderedJointIdsFromSelector(\n mjModel: MujocoModel,\n selector: ResourceSelector<JointInfo, string>\n): number[] {\n if (typeof selector === 'string') {\n const id = findJointByName(mjModel, selector);\n return id >= 0 && isScalarJoint(mjModel, id) ? [id] : [];\n }\n if (Array.isArray(selector)) {\n return selector\n .map((name) => findJointByName(mjModel, name))\n .filter((id) => id >= 0 && isScalarJoint(mjModel, id));\n }\n const ids: number[] = [];\n for (let i = 0; i < mjModel.njnt; i++) {\n if (!isScalarJoint(mjModel, i)) continue;\n const info = getJointInfo(mjModel, i);\n if (matchesSelector(info, selector)) ids.push(i);\n }\n return ids;\n}\n\nfunction orderedActuatorIdsFromSelector(\n mjModel: MujocoModel,\n selector: ResourceSelector<ActuatorInfo, string>\n): number[] {\n if (typeof selector === 'string') {\n const id = findActuatorByName(mjModel, selector);\n return id >= 0 && getActuatorJointId(mjModel, id) >= 0 ? [id] : [];\n }\n if (Array.isArray(selector)) {\n return selector\n .map((name) => findActuatorByName(mjModel, name))\n .filter((id) => id >= 0 && getActuatorJointId(mjModel, id) >= 0);\n }\n const ids: number[] = [];\n for (let i = 0; i < mjModel.nu; i++) {\n if (getActuatorJointId(mjModel, i) < 0) continue;\n const info = getActuatorInfo(mjModel, i);\n if (matchesSelector(info, selector)) ids.push(i);\n }\n return ids;\n}\n\nfunction inferScalarJointChain(mjModel: MujocoModel, bodyId: number): number[] {\n if (bodyId < 0 || bodyId >= mjModel.nbody) return [];\n const chainByBody: number[][] = [];\n let current = bodyId;\n const seen = new Set<number>();\n\n while (current >= 0 && current < mjModel.nbody && !seen.has(current)) {\n seen.add(current);\n const joints: number[] = [];\n const jointCount = mjModel.body_jntnum[current] ?? 0;\n const jointStart = mjModel.body_jntadr[current] ?? -1;\n for (let i = 0; i < jointCount; i++) {\n const jointId = jointStart + i;\n if (isScalarJoint(mjModel, jointId)) joints.push(jointId);\n }\n if (joints.length) chainByBody.push(joints);\n const parent = mjModel.body_parentid[current];\n if (parent === current) break;\n current = parent;\n }\n\n return chainByBody.reverse().flat();\n}\n\nfunction unique(values: number[]): number[] {\n const seen = new Set<number>();\n const result: number[] = [];\n for (const value of values) {\n if (seen.has(value)) continue;\n seen.add(value);\n result.push(value);\n }\n return result;\n}\n\nfunction findActuatorForJoint(mjModel: MujocoModel, jointId: number, preferredActuatorIds?: number[]): number {\n const search = preferredActuatorIds ?? Array.from({ length: mjModel.nu }, (_, i) => i);\n for (const actuatorId of search) {\n if (getActuatorJointId(mjModel, actuatorId) === jointId) return actuatorId;\n }\n return -1;\n}\n\nfunction buildControlGroup(\n mjModel: MujocoModel,\n jointIds: number[],\n preferredActuatorIds?: number[]\n): ControlGroupInfo | null {\n const ids = unique(jointIds).filter((id) => isScalarJoint(mjModel, id));\n if (!ids.length) return null;\n\n const joints: ControlJointInfo[] = [];\n const actuators: ActuatorInfo[] = [];\n const qposAdr: number[] = [];\n const dofAdr: number[] = [];\n const ctrlAdr: number[] = [];\n\n for (const jointId of ids) {\n const actuatorId = findActuatorForJoint(mjModel, jointId, preferredActuatorIds);\n const joint = getJointInfo(mjModel, jointId);\n qposAdr.push(joint.qposAdr);\n dofAdr.push(joint.dofAdr);\n\n if (actuatorId >= 0) {\n const actuator = getActuatorInfo(mjModel, actuatorId);\n actuators.push(actuator);\n ctrlAdr.push(actuatorId);\n joints.push({\n ...joint,\n actuatorId,\n actuatorName: actuator.name,\n ctrlAdr: actuatorId,\n ctrlRange: actuator.range,\n });\n } else {\n joints.push({\n ...joint,\n actuatorId: null,\n actuatorName: null,\n ctrlAdr: null,\n ctrlRange: null,\n });\n }\n }\n\n return {\n joints,\n actuators,\n qposAdr,\n dofAdr,\n ctrlAdr,\n readQpos(data: MujocoData) {\n return new Float64Array(qposAdr.map((adr) => data.qpos[adr] ?? 0));\n },\n readCtrl(data: MujocoData) {\n return new Float64Array(joints.map((joint) => joint.ctrlAdr === null ? 0 : data.ctrl[joint.ctrlAdr] ?? 0));\n },\n writeQpos(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, qposAdr.length); i++) {\n data.qpos[qposAdr[i]] = values[i];\n }\n },\n writeCtrl(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, joints.length); i++) {\n const adr = joints[i].ctrlAdr;\n if (adr !== null) data.ctrl[adr] = values[i];\n }\n },\n };\n}\n\nexport function getActuatedJoints(mjModel: MujocoModel): ActuatedJointInfo[] {\n const result: ActuatedJointInfo[] = [];\n for (let actuatorId = 0; actuatorId < mjModel.nu; actuatorId++) {\n const jointId = getActuatorJointId(mjModel, actuatorId);\n if (jointId < 0) continue;\n const actuator = getActuatorInfo(mjModel, actuatorId);\n result.push({\n ...getJointInfo(mjModel, jointId),\n actuatorId,\n actuatorName: actuator.name,\n ctrlAdr: actuatorId,\n ctrlRange: actuator.range,\n });\n }\n return result;\n}\n\nexport function getControlMap(mjModel: MujocoModel): ControlGroupInfo {\n const actuatorIds = Array.from({ length: mjModel.nu }, (_, i) => i)\n .filter((id) => getActuatorJointId(mjModel, id) >= 0);\n const jointIds = actuatorIds.map((id) => getActuatorJointId(mjModel, id));\n return buildControlGroup(mjModel, jointIds, actuatorIds) ?? createContiguousControlGroup(mjModel, 0);\n}\n\nexport function resolveControlGroup(\n mjModel: MujocoModel,\n selector: ControlGroupSelector\n): ControlGroupInfo | null {\n if (selector.actuators) {\n const actuatorIds = orderedActuatorIdsFromSelector(mjModel, selector.actuators);\n const jointIds = actuatorIds.map((id) => getActuatorJointId(mjModel, id));\n return buildControlGroup(mjModel, jointIds, actuatorIds);\n }\n\n if (selector.joints) {\n return buildControlGroup(mjModel, orderedJointIdsFromSelector(mjModel, selector.joints));\n }\n\n if (selector.siteName) {\n const siteId = findSiteByName(mjModel, selector.siteName);\n const bodyId = siteId >= 0 ? (mjModel.site_bodyid?.[siteId] ?? -1) : -1;\n return buildControlGroup(mjModel, inferScalarJointChain(mjModel, bodyId));\n }\n\n if (selector.bodyName) {\n return buildControlGroup(mjModel, inferScalarJointChain(mjModel, findBodyByName(mjModel, selector.bodyName)));\n }\n\n return getControlMap(mjModel);\n}\n\nexport function createContiguousControlGroup(mjModel: MujocoModel, count: number): ControlGroupInfo {\n const n = Math.max(0, Math.min(count, mjModel.nq, mjModel.nu));\n const joints: ControlJointInfo[] = [];\n const actuators: ActuatorInfo[] = [];\n const qposAdr: number[] = [];\n const dofAdr: number[] = [];\n const ctrlAdr: number[] = [];\n\n for (let i = 0; i < n; i++) {\n qposAdr.push(i);\n dofAdr.push(i);\n ctrlAdr.push(i);\n const jointId = Array.from({ length: mjModel.njnt }, (_, id) => id)\n .find((id) => mjModel.jnt_qposadr[id] === i);\n const actuator = getActuatorInfo(mjModel, i);\n actuators.push(actuator);\n joints.push({\n ...(jointId !== undefined ? getJointInfo(mjModel, jointId) : {\n id: i,\n name: `qpos${i}`,\n type: 3,\n typeName: 'hinge',\n range: unlimitedRange(),\n limited: false,\n bodyId: -1,\n qposAdr: i,\n dofAdr: i,\n }),\n actuatorId: i,\n actuatorName: actuator.name,\n ctrlAdr: i,\n ctrlRange: actuator.range,\n });\n }\n\n return {\n joints,\n actuators,\n qposAdr,\n dofAdr,\n ctrlAdr,\n readQpos(data: MujocoData) {\n return new Float64Array(qposAdr.map((adr) => data.qpos[adr] ?? 0));\n },\n readCtrl(data: MujocoData) {\n return new Float64Array(ctrlAdr.map((adr) => data.ctrl[adr] ?? 0));\n },\n writeQpos(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, qposAdr.length); i++) data.qpos[qposAdr[i]] = values[i];\n },\n writeCtrl(data: MujocoData, values: ArrayLike<number>) {\n for (let i = 0; i < Math.min(values.length, ctrlAdr.length); i++) data.ctrl[ctrlAdr[i]] = values[i];\n },\n };\n}\n\n/**\n * Convert a SceneObject config to MuJoCo XML.\n */\nfunction sceneObjectToXml(obj: SceneObject): string {\n const joint = obj.freejoint ? '<freejoint/>' : '';\n const 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\n/** Create virtual directory structure for a file path. */\nfunction ensureDir(mujoco: MujocoModule, fname: string) {\n const dirParts = fname.split('/');\n dirParts.pop();\n let currentPath = '/working';\n for (const part of dirParts) {\n currentPath += '/' + part;\n try { mujoco.FS.mkdir(currentPath); } catch { /* ignore */ }\n }\n}\n\ninterface LoadResult {\n mjModel: MujocoModel;\n mjData: MujocoData;\n}\n\nfunction loadModelFromPath(mujoco: MujocoModule, path: string): MujocoModel {\n if (mujoco.MjModel.from_xml_path) {\n return mujoco.MjModel.from_xml_path(path);\n }\n if (mujoco.MjModel.loadFromXML) {\n return mujoco.MjModel.loadFromXML(path);\n }\n throw new Error('MuJoCo WASM module does not expose an XML path loader');\n}\n\nfunction isModelTextFile(fname: string): boolean {\n const lower = fname.toLowerCase();\n return lower.endsWith('.xml') || lower.endsWith('.urdf') || lower.endsWith('.mjcf');\n}\n\nfunction normalizeVfsPath(path: string): string {\n const parts = path.replace(/\\\\/g, '/').split('/');\n const norm: string[] = [];\n for (const part of parts) {\n if (!part || part === '.') continue;\n if (part === '..') norm.pop();\n else norm.push(part);\n }\n return norm.join('/');\n}\n\nfunction localFilePath(file: LocalMujocoFile): string {\n return normalizeVfsPath(file.webkitRelativePath || file.name);\n}\n\nfunction inferSceneFile(files: readonly LocalMujocoFile[], options?: LoadFromFilesOptions): string {\n if (options?.sceneFile) return normalizeVfsPath(options.sceneFile);\n\n const paths = files.map(localFilePath);\n const preferred = ['scene.xml', 'model.xml', 'robot.xml', 'scene.urdf', 'model.urdf', 'robot.urdf'];\n for (const name of preferred) {\n const match = paths.find((path) => path.endsWith(name));\n if (match) return match;\n }\n\n const firstModel = paths.find(isModelTextFile);\n if (!firstModel) throw new Error('No MJCF XML or URDF file found in FileList');\n return firstModel;\n}\n\nexport function createSceneConfigFromFiles(\n files: FileList | readonly LocalMujocoFile[],\n options: LoadFromFilesOptions = {}\n): SceneConfig {\n const fileArray = Array.from(files) as LocalMujocoFile[];\n return {\n src: '',\n sceneFile: inferSceneFile(fileArray, options),\n files: fileArray,\n homeJoints: options.homeJoints,\n xmlPatches: options.xmlPatches,\n sceneObjects: options.sceneObjects,\n onReset: options.onReset,\n };\n}\n\nfunction applyXmlPatches(text: string, fname: string, config: SceneConfig): string {\n let result = text;\n for (const patch of config.xmlPatches ?? []) {\n if (fname.endsWith(patch.target) || fname === patch.target) {\n if (patch.replace) {\n const [from, to] = patch.replace;\n if (result.includes(from)) {\n result = result.replace(from, to);\n } else {\n const preview = from.length > 80 ? `${from.slice(0, 80)}...` : from;\n console.warn(`XML patch replace pattern not found in ${fname}: \"${preview}\"`);\n }\n }\n if (patch.inject && patch.injectAfter) {\n const idx = result.indexOf(patch.injectAfter);\n if (idx !== -1) {\n const tagEnd = result.indexOf('>', idx + patch.injectAfter.length);\n if (tagEnd !== -1) {\n result = result.slice(0, tagEnd + 1) + patch.inject + result.slice(tagEnd + 1);\n } else {\n console.warn(`XML patch inject failed in ${fname}: could not find tag end after \"${patch.injectAfter}\"`);\n }\n } else {\n const preview = patch.injectAfter.length > 80\n ? `${patch.injectAfter.slice(0, 80)}...`\n : patch.injectAfter;\n console.warn(`XML patch inject anchor not found in ${fname}: \"${preview}\"`);\n }\n }\n }\n }\n\n if (fname === config.sceneFile && config.sceneObjects?.length && result.includes('</worldbody>')) {\n const xml = config.sceneObjects.map((obj) => sceneObjectToXml(obj)).join('');\n result = result.replace('</worldbody>', xml + '</worldbody>');\n }\n\n return result;\n}\n\nasync function loadSceneFromFiles(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n const files = config.files ?? [];\n if (!files.length) throw new Error('loadFromFiles requires at least one File');\n\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const parser = new DOMParser();\n const byPath = new Map<string, LocalMujocoFile>();\n const byBasename = new Map<string, LocalMujocoFile>();\n const written = new Set<string>();\n const textByPath = new Map<string, string>();\n\n for (const file of files) {\n const path = localFilePath(file);\n byPath.set(path, file);\n byBasename.set(path.split('/').pop() ?? path, file);\n }\n\n for (const [path, file] of byPath) {\n onProgress?.(`Reading ${path}...`);\n ensureDir(mujoco, path);\n if (isModelTextFile(path)) {\n const text = applyXmlPatches(await file.text(), path, config);\n textByPath.set(path, text);\n mujoco.FS.writeFile(`/working/${path}`, text);\n } else {\n mujoco.FS.writeFile(`/working/${path}`, new Uint8Array(await file.arrayBuffer()));\n }\n written.add(path);\n }\n\n for (const [path, text] of textByPath) {\n const deps = collectDependencyPaths(text, path, parser);\n for (const dep of deps) {\n if (written.has(dep)) continue;\n const file = byPath.get(dep) ?? byBasename.get(dep.split('/').pop() ?? dep);\n if (!file) continue;\n ensureDir(mujoco, dep);\n if (isModelTextFile(dep)) {\n mujoco.FS.writeFile(`/working/${dep}`, applyXmlPatches(await file.text(), dep, config));\n } else {\n mujoco.FS.writeFile(`/working/${dep}`, new Uint8Array(await file.arrayBuffer()));\n }\n written.add(dep);\n }\n }\n\n onProgress?.('Loading model...');\n const mjModel = loadModelFromPath(mujoco, `/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n applyInitialPose(mjModel, mjData, config);\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData };\n}\n\nfunction applyInitialPose(mjModel: MujocoModel, mjData: MujocoData, config: SceneConfig) {\n if (!config.homeJoints) return;\n const homeCount = Math.min(config.homeJoints.length, Math.max(mjModel.nu, mjModel.nq));\n for (let i = 0; i < homeCount; i++) {\n if (i < mjModel.nu) mjData.ctrl[i] = config.homeJoints[i];\n if (i < mjModel.nq) {\n const qposAdr = i < mjModel.nu ? getActuatedScalarQposAdr(mjModel, i) : -1;\n mjData.qpos[qposAdr !== -1 ? qposAdr : i] = config.homeJoints[i];\n }\n }\n}\n\n/**\n * Config-driven scene loader — replaces the old RobotLoader + patchSingleRobot approach.\n */\nexport async function loadScene(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n if (config.files?.length) {\n return loadSceneFromFiles(mujoco, config, onProgress);\n }\n\n // 1. Clean up virtual filesystem\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const baseUrl = config.src.endsWith('/') ? config.src : config.src + '/';\n\n const downloaded = new Set<string>();\n const xmlQueue: string[] = [config.sceneFile];\n const assetFiles: string[] = [];\n const parser = new DOMParser();\n\n // 2a. Download XML files sequentially (to discover dependencies)\n while (xmlQueue.length > 0) {\n const fname = xmlQueue.shift()!;\n if (downloaded.has(fname)) continue;\n downloaded.add(fname);\n\n if (!isModelTextFile(fname)) {\n // Non-XML discovered during XML scan — collect for parallel download\n assetFiles.push(fname);\n continue;\n }\n\n onProgress?.(`Downloading ${fname}...`);\n\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n continue;\n }\n\n const text = applyXmlPatches(await res.text(), fname, config);\n\n ensureDir(mujoco, fname);\n mujoco.FS.writeFile(`/working/${fname}`, text);\n scanDependencies(text, fname, parser, downloaded, xmlQueue);\n }\n\n // 2b. Download all binary assets (meshes, textures) in parallel\n if (assetFiles.length > 0) {\n onProgress?.(`Downloading ${assetFiles.length} assets...`);\n\n const results = await Promise.all(\n assetFiles.map(async (fname) => {\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n return null;\n }\n return { fname, buffer: new Uint8Array(await res.arrayBuffer()) };\n })\n );\n\n for (const result of results) {\n if (!result) continue;\n ensureDir(mujoco, result.fname);\n mujoco.FS.writeFile(`/working/${result.fname}`, result.buffer);\n }\n }\n\n // 5. Load model\n onProgress?.('Loading model...');\n const mjModel = loadModelFromPath(mujoco, `/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n\n // 6. Set initial pose — set both ctrl and qpos so robot starts at home.\n // If homeJoints is not provided, keep raw MuJoCo defaults.\n applyInitialPose(mjModel, mjData, config);\n\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData };\n}\n\n/**\n * Scan XML for file dependencies (meshes, textures, includes).\n */\nfunction scanDependencies(\n xmlString: string,\n currentFile: string,\n parser: DOMParser,\n downloaded: Set<string>,\n queue: string[]\n) {\n for (const fullPath of collectDependencyPaths(xmlString, currentFile, parser)) {\n if (!downloaded.has(fullPath)) queue.push(fullPath);\n }\n}\n\nfunction collectDependencyPaths(\n xmlString: string,\n currentFile: string,\n parser: DOMParser\n): string[] {\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\n\n const compiler = xmlDoc.querySelector('compiler');\n const assetDir = compiler?.getAttribute('assetdir') || '';\n const meshDir = compiler?.getAttribute('meshdir') || assetDir;\n const textureDir = compiler?.getAttribute('texturedir') || assetDir;\n const currentDir = currentFile.includes('/')\n ? currentFile.substring(0, currentFile.lastIndexOf('/') + 1)\n : '';\n\n const paths: string[] = [];\n xmlDoc.querySelectorAll('[file], [filename]').forEach((el) => {\n const fileAttr = el.getAttribute('file') ?? el.getAttribute('filename');\n if (!fileAttr) return;\n if (/^[a-z]+:\\/\\//i.test(fileAttr) || fileAttr.startsWith('package://')) return;\n\n let prefix = '';\n if (el.tagName.toLowerCase() === 'mesh') {\n prefix = meshDir ? meshDir + '/' : '';\n } else if (['texture', 'hfield'].includes(el.tagName.toLowerCase())) {\n prefix = textureDir ? textureDir + '/' : '';\n }\n\n const fullPath = normalizeVfsPath(currentDir + prefix + fileAttr);\n\n paths.push(fullPath);\n });\n return paths;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\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 { useMujocoContext } from '../core/MujocoSimProvider';\n\n/**\n * SceneRenderer — creates and syncs MuJoCo body meshes every frame.\n * Accepts standard R3F group props (position, rotation, scale, visible, etc.).\n */\nexport function SceneRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const {\n mjModelRef,\n mjDataRef,\n mujocoRef,\n onSelectionRef,\n hiddenBodiesRef,\n interpolateRef,\n interpolationStateRef,\n status,\n } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const bodyRefs = useRef<(THREE.Group | null)[]>([]);\n const prevModelRef = useRef<MujocoModel | null>(null);\n\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 const bodyName = getName(model, model.name_bodyadr[i]);\n\n if (!hiddenBodiesRef.current.has(bodyName)) {\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === i) {\n const mesh = geomBuilder.create(model, g);\n if (mesh) bodyGroup.add(mesh);\n }\n }\n }\n\n group.add(bodyGroup);\n refs.push(bodyGroup);\n }\n bodyRefs.current = refs;\n }, [status, geomBuilder, mjModelRef]);\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 const interpolation = interpolationStateRef.current;\n const useInterpolation = interpolateRef.current && interpolation.valid;\n\n for (let i = 0; i < bodies.length; i++) {\n const ref = bodies[i];\n if (!ref) continue;\n if (useInterpolation) {\n const alpha = interpolation.alpha;\n const i3 = i * 3;\n ref.position.set(\n THREE.MathUtils.lerp(interpolation.previousXpos[i3], interpolation.currentXpos[i3], alpha),\n THREE.MathUtils.lerp(interpolation.previousXpos[i3 + 1], interpolation.currentXpos[i3 + 1], alpha),\n THREE.MathUtils.lerp(interpolation.previousXpos[i3 + 2], interpolation.currentXpos[i3 + 2], alpha)\n );\n const i4 = i * 4;\n _previousQuat.set(\n interpolation.previousXquat[i4 + 1],\n interpolation.previousXquat[i4 + 2],\n interpolation.previousXquat[i4 + 3],\n interpolation.previousXquat[i4]\n );\n _currentQuat.set(\n interpolation.currentXquat[i4 + 1],\n interpolation.currentXquat[i4 + 2],\n interpolation.currentXquat[i4 + 3],\n interpolation.currentXquat[i4]\n );\n ref.quaternion.copy(_previousQuat).slerp(_currentQuat, alpha);\n } else {\n ref.position.set(\n data.xpos[i * 3],\n data.xpos[i * 3 + 1],\n data.xpos[i * 3 + 2]\n );\n ref.quaternion.set(\n data.xquat[i * 4 + 1],\n data.xquat[i * 4 + 2],\n data.xquat[i * 4 + 3],\n data.xquat[i * 4]\n );\n }\n }\n });\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\nconst _previousQuat = new THREE.Quaternion();\nconst _currentQuat = new THREE.Quaternion();\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, useThree } from '@react-three/fiber';\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport * as THREE from 'three';\nimport { MujocoData, MujocoModel, MujocoModule, getContact, withContacts } from '../types';\nimport { SceneRenderer } from '../components/SceneRenderer';\nimport {\n ActuatedJointInfo,\n ActuatorInfo,\n BodyInfo,\n ControlGroupInfo,\n ControlGroupSelector,\n ContactInfo,\n GeomInfo,\n JointInfo,\n LoadFromFilesOptions,\n LocalMujocoFile,\n ModelOptions,\n MujocoSimAPI,\n PhysicsStepCallback,\n RayHit,\n SceneConfig,\n SceneObject,\n SensorInfo,\n SiteInfo,\n StateSnapshot,\n XmlPatch,\n} from '../types';\nimport {\n loadScene,\n createSceneConfigFromFiles,\n findKeyframeByName,\n findBodyByName,\n findGeomByName,\n findSensorByName,\n findActuatorByName,\n getActuatedScalarQposAdr,\n getActuatedJoints as getActuatedJointsFromModel,\n getControlMap as getControlMapFromModel,\n getName,\n resolveControlGroup as resolveControlGroupFromModel,\n} from './SceneLoader';\n\n// ---- Joint type names ----\nconst JOINT_TYPE_NAMES = ['free', 'ball', 'slide', 'hinge'];\n// ---- Geom type names ----\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\n// ---- Sensor type names (subset — MuJoCo has many) ----\nconst SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'camprojection', 9: 'jointpos', 10: 'jointvel', 11: 'tendonpos',\n 12: 'tendonvel', 13: 'actuatorpos', 14: 'actuatorvel', 15: 'actuatorfrc',\n 16: 'jointactfrc', 17: 'tendonactfrc', 18: 'ballquat', 19: 'ballangvel',\n 20: 'jointlimitpos', 21: 'jointlimitvel', 22: 'jointlimitfrc',\n 23: 'tendonlimitpos', 24: 'tendonlimitvel', 25: 'tendonlimitfrc',\n 26: 'framepos', 27: 'framequat', 28: 'framexaxis', 29: 'frameyaxis',\n 30: 'framezaxis', 31: 'framelinvel', 32: 'frameangvel',\n 33: 'framelinacc', 34: 'frameangacc', 35: 'subtreecom',\n 36: 'subtreelinvel', 37: 'subtreeangmom', 38: 'insidesite',\n 39: 'geomdist', 40: 'geomnormal', 41: 'geomfromto',\n 42: 'contact', 43: 'e_potential', 44: 'e_kinetic',\n 45: 'clock', 46: 'tactile', 47: 'plugin', 48: 'user',\n};\n\nconst EMPTY_CONTROL_GROUP: ControlGroupInfo = {\n joints: [],\n actuators: [],\n qposAdr: [],\n dofAdr: [],\n ctrlAdr: [],\n readQpos: () => new Float64Array(0),\n readCtrl: () => new Float64Array(0),\n writeQpos: () => {},\n writeCtrl: () => {},\n};\n\nfunction isMutableApiRef(\n ref: React.ForwardedRef<MujocoSimAPI>\n): ref is React.MutableRefObject<MujocoSimAPI | null> {\n return typeof ref === 'object' && ref !== null && 'current' in ref;\n}\n\n// Preallocated force/torque temps for applyForce/applyTorque\nconst _applyForce = new Float64Array(3);\nconst _applyTorque = new Float64Array(3);\nconst _applyPoint = new Float64Array(3);\nconst _rayPnt = new Float64Array(3);\nconst _rayVec = new Float64Array(3);\nconst _rayGeomId = new Int32Array(1);\nconst _projRaycaster = new THREE.Raycaster();\nconst _projNdc = new THREE.Vector2();\n\n// ---- Internal context types ----\n\nexport interface MujocoSimContextValue {\n api: MujocoSimAPI;\n mjModelRef: React.RefObject<MujocoModel | null>;\n mjDataRef: React.RefObject<MujocoData | null>;\n mujocoRef: React.RefObject<MujocoModule>;\n configRef: React.RefObject<SceneConfig>;\n pausedRef: React.RefObject<boolean>;\n speedRef: React.RefObject<number>;\n substepsRef: React.RefObject<number>;\n interpolateRef: React.RefObject<boolean>;\n interpolationStateRef: React.RefObject<BodyInterpolationState>;\n onSelectionRef: React.RefObject<\n ((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 errorRef: React.RefObject<string | null>;\n bodyRegistryRef: React.RefObject<Map<string, { definition: SceneObject; hasCustomChildren: boolean }>>;\n hiddenBodiesRef: React.RefObject<Set<string>>;\n requestBodyReload: () => void;\n status: 'loading' | 'ready' | 'error';\n}\n\nexport interface BodyInterpolationState {\n alpha: number;\n previousXpos: Float64Array;\n previousXquat: Float64Array;\n currentXpos: Float64Array;\n currentXquat: Float64Array;\n valid: boolean;\n}\n\nconst MujocoSimContext = createContext<MujocoSimContextValue | null>(null);\n\nexport type UseMujocoResult =\n | { status: 'loading'; isPending: true; isReady: false; isError: false; error: null; api: null; mjModelRef: null; mjDataRef: null }\n | { status: 'error'; isPending: false; isReady: false; isError: true; error: string; api: null; mjModelRef: null; mjDataRef: null }\n | { status: 'ready'; isPending: false; isReady: true; isError: false; error: null;\n api: MujocoSimAPI; mjModelRef: React.RefObject<MujocoModel | null>; mjDataRef: React.RefObject<MujocoData | null> };\n\nexport function useMujocoContext(): MujocoSimContextValue {\n const ctx = useContext(MujocoSimContext);\n if (!ctx)\n throw new Error('useMujoco must be used inside <MujocoSimProvider>');\n return ctx;\n}\n\nexport function useMujoco(): UseMujocoResult {\n const ctx = useMujocoContext();\n if (ctx.status === 'ready') {\n return {\n status: 'ready',\n isPending: false,\n isReady: true,\n isError: false,\n error: null,\n api: ctx.api,\n mjModelRef: ctx.mjModelRef,\n mjDataRef: ctx.mjDataRef,\n };\n }\n if (ctx.status === 'error') {\n return {\n status: 'error',\n isPending: false,\n isReady: false,\n isError: true,\n error: ctx.errorRef.current ?? 'Unknown error',\n api: null,\n mjModelRef: null,\n mjDataRef: null,\n };\n }\n return {\n status: 'loading',\n isPending: true,\n isReady: false,\n isError: false,\n error: null,\n api: null,\n mjModelRef: null,\n mjDataRef: null,\n };\n}\n\nexport function useBeforePhysicsStep(callback: PhysicsStepCallback) {\n const { beforeStepCallbacks } = useMujocoContext();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const wrapped: PhysicsStepCallback = (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 } = useMujocoContext();\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 interpolate?: boolean;\n children: React.ReactNode;\n}\n\nexport function MujocoSimProvider({\n mujoco,\n config,\n apiRef: externalApiRef,\n onReady,\n onError,\n onStep,\n onSelection,\n gravity,\n timestep,\n substeps,\n paused,\n speed,\n interpolate,\n 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 interpolateRef = useRef(interpolate ?? false);\n const interpolationStateRef = useRef<BodyInterpolationState>({\n alpha: 1,\n previousXpos: new Float64Array(0),\n previousXquat: new Float64Array(0),\n currentXpos: new Float64Array(0),\n currentXquat: new Float64Array(0),\n valid: false,\n });\n const physicsAccumulatorRef = useRef(0);\n const stepsToRunRef = useRef(0);\n const loadGenRef = useRef(0);\n\n const onSelectionRef = useRef(onSelection);\n onSelectionRef.current = onSelection;\n const onStepRef = useRef(onStep);\n onStepRef.current = onStep;\n\n const beforeStepCallbacks = useRef(new Set<PhysicsStepCallback>());\n const afterStepCallbacks = useRef(new Set<PhysicsStepCallback>());\n const resetCallbacks = useRef(new Set<() => void>());\n const errorRef = useRef<string | null>(null);\n const bodyRegistryRef = useRef(new Map<string, { definition: SceneObject; hasCustomChildren: boolean }>());\n const hiddenBodiesRef = useRef(new Set<string>());\n const bodyReloadTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => { configRef.current = config; }, [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 useEffect(() => { interpolateRef.current = interpolate ?? false; }, [interpolate]);\n\n // Sync gravity prop\n useEffect(() => {\n if (!gravity) return;\n const model = mjModelRef.current;\n if (!model?.opt?.gravity) return;\n model.opt.gravity[0] = gravity[0];\n model.opt.gravity[1] = gravity[1];\n model.opt.gravity[2] = gravity[2];\n }, [gravity]);\n\n // Sync timestep prop\n useEffect(() => {\n if (timestep === undefined) return;\n const model = mjModelRef.current;\n if (!model?.opt) return;\n model.opt.timestep = timestep;\n }, [timestep]);\n\n // --- Build merged config (base + body registry) ---\n function buildMergedConfig(baseConfig: SceneConfig): SceneConfig {\n if (bodyRegistryRef.current.size === 0) return baseConfig;\n const registeredNames = new Set(bodyRegistryRef.current.keys());\n const baseObjects = (baseConfig.sceneObjects ?? []).filter(o => !registeredNames.has(o.name));\n const registeredBodies = Array.from(bodyRegistryRef.current.values()).map(e => e.definition);\n hiddenBodiesRef.current.clear();\n for (const [name, entry] of bodyRegistryRef.current) {\n if (entry.hasCustomChildren) hiddenBodiesRef.current.add(name);\n }\n return { ...baseConfig, sceneObjects: [...baseObjects, ...registeredBodies] };\n }\n\n // --- Load scene on mount ---\n useEffect(() => {\n let disposed = false;\n\n (async () => {\n try {\n const result = await loadScene(mujoco, buildMergedConfig(config));\n if (disposed) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n\n // Apply declarative physics props after load\n if (gravity && result.mjModel.opt?.gravity) {\n result.mjModel.opt.gravity[0] = gravity[0];\n result.mjModel.opt.gravity[1] = gravity[1];\n result.mjModel.opt.gravity[2] = gravity[2];\n }\n if (timestep !== undefined && result.mjModel.opt) {\n result.mjModel.opt.timestep = timestep;\n }\n\n setStatus('ready');\n } catch (e: unknown) {\n if (!disposed) {\n const err = e instanceof Error ? e : new Error(String(e));\n errorRef.current = err.message;\n setStatus('error');\n onError?.(err);\n }\n }\n })();\n\n return () => {\n disposed = true;\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n };\n }, [mujoco, config]);\n\n // Fire onReady and assign external ref when status changes to ready\n useEffect(() => {\n if (status === 'ready') {\n const api = apiRef.current;\n if (onReady) onReady(api);\n // Assign the forwarded ref\n if (externalApiRef) {\n if (typeof externalApiRef === 'function') {\n externalApiRef(api);\n } else if (isMutableApiRef(externalApiRef)) {\n externalApiRef.current = api;\n }\n }\n }\n }, [status]);\n\n // --- Physics step (priority -1) ---\n useFrame((_state, delta) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n // Check single-step mode\n const shouldStep = !pausedRef.current || stepsToRunRef.current > 0;\n if (!shouldStep) return;\n\n // Zero generalized applied forces\n for (let i = 0; i < model.nv; i++) {\n data.qfrc_applied[i] = 0;\n }\n\n // Before-step callbacks\n for (const cb of beforeStepCallbacks.current) {\n cb(model, data);\n }\n\n const numSubsteps = substepsRef.current;\n if (!interpolateRef.current) {\n // Step physics with substeps\n if (stepsToRunRef.current > 0) {\n for (let s = 0; s < stepsToRunRef.current; s++) {\n 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 } else if (stepsToRunRef.current > 0) {\n ensureInterpolationBuffers(model);\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n for (let s = 0; s < stepsToRunRef.current; s++) {\n mujoco.mj_step(model, data);\n }\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n interpolationStateRef.current.alpha = 1;\n interpolationStateRef.current.valid = true;\n stepsToRunRef.current = 0;\n } else {\n ensureInterpolationBuffers(model);\n const clampedDelta = Math.min(delta, 1 / 15); // cap to avoid spiral of death\n physicsAccumulatorRef.current += clampedDelta * speedRef.current;\n const stepDt = Math.max((model.opt?.timestep ?? 0.002) * Math.max(1, numSubsteps), 1e-6);\n let stepped = false;\n\n while (physicsAccumulatorRef.current >= stepDt) {\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n for (let s = 0; s < numSubsteps; s++) {\n mujoco.mj_step(model, data);\n }\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n physicsAccumulatorRef.current -= stepDt;\n stepped = true;\n }\n\n if (!interpolationStateRef.current.valid) {\n copyBodyPose(data, interpolationStateRef.current.previousXpos, interpolationStateRef.current.previousXquat);\n copyBodyPose(data, interpolationStateRef.current.currentXpos, interpolationStateRef.current.currentXquat);\n }\n\n interpolationStateRef.current.alpha = Math.min(Math.max(physicsAccumulatorRef.current / stepDt, 0), 1);\n interpolationStateRef.current.valid = true;\n\n if (!stepped) {\n onStepRef.current?.(data.time);\n return;\n }\n }\n\n // After-step callbacks\n for (const cb of afterStepCallbacks.current) {\n cb(model, data);\n }\n\n onStepRef.current?.(data.time);\n }, -1);\n\n function ensureInterpolationBuffers(model: MujocoModel) {\n const state = interpolationStateRef.current;\n const xposLength = model.nbody * 3;\n const xquatLength = model.nbody * 4;\n if (state.previousXpos.length !== xposLength) state.previousXpos = new Float64Array(xposLength);\n if (state.currentXpos.length !== xposLength) state.currentXpos = new Float64Array(xposLength);\n if (state.previousXquat.length !== xquatLength) state.previousXquat = new Float64Array(xquatLength);\n if (state.currentXquat.length !== xquatLength) state.currentXquat = new Float64Array(xquatLength);\n }\n\n function copyBodyPose(data: MujocoData, xpos: Float64Array, xquat: Float64Array) {\n xpos.set(data.xpos.subarray(0, xpos.length));\n xquat.set(data.xquat.subarray(0, xquat.length));\n }\n\n // --- API Methods ---\n\n const reset = useCallback(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n 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 withContacts(data, (contactArray) => {\n for (let i = 0; i < ncon; i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n contacts.push({\n geom1: c.geom1,\n geom1Name: getName(model, model.name_geomadr[c.geom1]),\n geom2: c.geom2,\n geom2Name: getName(model, model.name_geomadr[c.geom2]),\n pos: [c.pos[0], c.pos[1], c.pos[2]],\n depth: c.dist,\n });\n }\n });\n return contacts;\n }, []);\n\n const getBodies = useCallback((): BodyInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: BodyInfo[] = [];\n for (let i = 0; i < model.nbody; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_bodyadr[i]),\n mass: model.body_mass[i],\n parentId: model.body_parentid[i],\n });\n }\n return result;\n }, []);\n\n const getJoints = useCallback((): JointInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: JointInfo[] = [];\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const range: [number, number] = [model.jnt_range[2 * i], model.jnt_range[2 * i + 1]];\n result.push({\n id: i,\n name: getName(model, model.name_jntadr[i]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range,\n limited: range[0] < range[1],\n bodyId: model.jnt_bodyid[i],\n qposAdr: model.jnt_qposadr[i],\n dofAdr: model.jnt_dofadr[i],\n });\n }\n return result;\n }, []);\n\n const getGeoms = useCallback((): GeomInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: GeomInfo[] = [];\n for (let i = 0; i < model.ngeom; i++) {\n const type = model.geom_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_geomadr[i]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `unknown(${type})`,\n size: [model.geom_size[3 * i], model.geom_size[3 * i + 1], model.geom_size[3 * i + 2]],\n bodyId: model.geom_bodyid[i],\n });\n }\n return result;\n }, []);\n\n const getSites = useCallback((): SiteInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SiteInfo[] = [];\n for (let i = 0; i < model.nsite; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_siteadr[i]),\n bodyId: model.site_bodyid ? model.site_bodyid[i] : -1,\n });\n }\n return result;\n }, []);\n\n const getActuatorsApi = useCallback((): ActuatorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const hasRange = model.actuator_ctrlrange[2 * i] < model.actuator_ctrlrange[2 * i + 1];\n result.push({\n id: i,\n name: getName(model, model.name_actuatoradr[i]),\n range: hasRange\n ? [model.actuator_ctrlrange[2 * i], model.actuator_ctrlrange[2 * i + 1]]\n : [-Infinity, Infinity],\n });\n }\n return result;\n }, []);\n\n const getControlMapApi = useCallback((): ControlGroupInfo => {\n const model = mjModelRef.current;\n return model ? getControlMapFromModel(model) : EMPTY_CONTROL_GROUP;\n }, []);\n\n const getActuatedJointsApi = useCallback((): ActuatedJointInfo[] => {\n const model = mjModelRef.current;\n return model ? getActuatedJointsFromModel(model) : [];\n }, []);\n\n const resolveControlGroupApi = useCallback((selector: ControlGroupSelector): ControlGroupInfo | null => {\n const model = mjModelRef.current;\n return model ? resolveControlGroupFromModel(model, selector) : null;\n }, []);\n\n const getSensors = useCallback((): SensorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, []);\n\n const 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, buildMergedConfig(newConfig));\n\n if (gen !== loadGenRef.current) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n physicsAccumulatorRef.current = 0;\n interpolationStateRef.current.valid = false;\n configRef.current = newConfig;\n\n setStatus('ready');\n } catch (e) {\n if (gen !== loadGenRef.current) return;\n errorRef.current = e instanceof Error ? e.message : String(e);\n setStatus('error');\n throw e;\n }\n }, [mujoco]);\n\n const requestBodyReload = useCallback(() => {\n if (bodyReloadTimerRef.current) clearTimeout(bodyReloadTimerRef.current);\n bodyReloadTimerRef.current = setTimeout(() => {\n bodyReloadTimerRef.current = null;\n loadSceneApi(configRef.current);\n }, 0);\n }, [loadSceneApi]);\n\n const loadFromFilesApi = useCallback(\n async (files: FileList | readonly LocalMujocoFile[], options?: LoadFromFilesOptions): Promise<void> => {\n await loadSceneApi(createSceneConfigFromFiles(files, options));\n },\n [loadSceneApi]\n );\n\n const addBodyApi = useCallback(async (body: SceneObject): Promise<void> => {\n const current = configRef.current;\n const sceneObjects = [\n ...(current.sceneObjects ?? []).filter((obj) => obj.name !== body.name),\n body,\n ];\n await loadSceneApi({ ...current, sceneObjects });\n }, [loadSceneApi]);\n\n const removeBodyApi = useCallback(async (name: string): Promise<void> => {\n const current = configRef.current;\n bodyRegistryRef.current.delete(name);\n const sceneObjects = (current.sceneObjects ?? []).filter((obj) => obj.name !== name);\n await loadSceneApi({ ...current, sceneObjects });\n }, [loadSceneApi]);\n\n const recompileApi = useCallback(async (patches: XmlPatch[] = []): Promise<void> => {\n const current = configRef.current;\n await loadSceneApi({\n ...current,\n xmlPatches: patches.length ? [...(current.xmlPatches ?? []), ...patches] : current.xmlPatches,\n });\n }, [loadSceneApi]);\n\n const getCanvasSnapshot = useCallback(\n (width?: number, height?: number, mimeType = 'image/jpeg'): string => {\n if (width && height) {\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = width;\n tempCanvas.height = height;\n const ctx = tempCanvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(gl.domElement, 0, 0, width, height);\n return tempCanvas.toDataURL(mimeType, mimeType === 'image/jpeg' ? 0.8 : undefined);\n }\n }\n return gl.domElement.toDataURL(mimeType, mimeType === 'image/jpeg' ? 0.8 : undefined);\n },\n [gl]\n );\n\n const 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 get config() { return configRef.current; },\n reset,\n setSpeed,\n togglePause,\n setPaused,\n step,\n getTime,\n getTimestep,\n applyKeyframe,\n saveState,\n restoreState,\n setQpos,\n setQvel,\n getQpos,\n getQvel,\n setCtrl,\n getCtrl,\n getControlMap: getControlMapApi,\n getActuatedJoints: getActuatedJointsApi,\n resolveControlGroup: resolveControlGroupApi,\n applyForce,\n applyTorque: applyTorqueApi,\n setExternalForce,\n applyGeneralizedForce,\n getSensorData,\n getContacts,\n getBodies,\n getJoints,\n getGeoms,\n getSites,\n getActuators: getActuatorsApi,\n getSensors,\n getModelOption,\n setGravity,\n setTimestep: setTimestepApi,\n raycast,\n getKeyframeNames,\n getKeyframeCount,\n loadScene: loadSceneApi,\n loadFromFiles: loadFromFilesApi,\n addBody: addBodyApi,\n removeBody: removeBodyApi,\n recompile: recompileApi,\n getCanvasSnapshot,\n project2DTo3D,\n setBodyMass,\n setGeomFriction,\n setGeomSize,\n mjModelRef,\n mjDataRef,\n }),\n [\n status, reset, setSpeed, togglePause, setPaused, step,\n getTime, getTimestep, applyKeyframe, saveState, restoreState,\n setQpos, setQvel, getQpos, getQvel, setCtrl, getCtrl,\n getControlMapApi, getActuatedJointsApi, resolveControlGroupApi,\n applyForce, applyTorqueApi, setExternalForce, applyGeneralizedForce,\n getSensorData, getContacts, getBodies, getJoints, getGeoms, getSites,\n getActuatorsApi, getSensors, getModelOption, setGravity, setTimestepApi,\n raycast, getKeyframeNames, getKeyframeCount, loadSceneApi,\n loadFromFilesApi, addBodyApi, removeBodyApi, recompileApi,\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 interpolateRef,\n interpolationStateRef,\n onSelectionRef,\n beforeStepCallbacks,\n afterStepCallbacks,\n resetCallbacks,\n errorRef,\n bodyRegistryRef,\n hiddenBodiesRef,\n requestBodyReload,\n status,\n }),\n [api, status, requestBodyReload]\n );\n\n return (\n <MujocoSimContext.Provider value={contextValue}>\n <SceneRenderer />\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 interpolate,\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 interpolate={interpolate}\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 /** Interpolate rendered body poses between fixed physics steps. */\n interpolate?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * MujocoPhysics — physics provider for use inside a user-owned R3F Canvas.\n *\n * This is the R3F-idiomatic alternative to MujocoCanvas. Instead of wrapping\n * the Canvas, place this inside your own <Canvas>:\n *\n * ```tsx\n * <MujocoProvider>\n * <Canvas shadows camera={...}>\n * <MujocoPhysics config={config} paused={paused}>\n * <SceneRenderer />\n * <OrbitControls />\n * </MujocoPhysics>\n * </Canvas>\n * </MujocoProvider>\n * ```\n *\n * Forward ref exposes MujocoSimAPI.\n */\nexport const MujocoPhysics = forwardRef<MujocoSimAPI, MujocoPhysicsProps>(\n function MujocoPhysics({ onError, children, ...props }, ref) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujocoWasm();\n\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\nimport type {\n Bodies,\n MujocoData,\n MujocoModel,\n ObservationConfig,\n ObservationLayoutItem,\n ObservationResult,\n} from '../types';\nimport { findBodyByName, findSensorByName, findSiteByName } from './SceneLoader';\n\nfunction append(\n values: number[],\n layout: ObservationLayoutItem[],\n name: string,\n chunk: ArrayLike<number>\n) {\n const start = values.length;\n for (let i = 0; i < chunk.length; i++) values.push(chunk[i] ?? 0);\n layout.push({ name, start, size: chunk.length });\n}\n\nfunction appendScalar(\n values: number[],\n layout: ObservationLayoutItem[],\n name: string,\n value: number\n) {\n const start = values.length;\n values.push(value);\n layout.push({ name, start, size: 1 });\n}\n\nfunction namedBodyList(names: Bodies | readonly Bodies[] | undefined): readonly Bodies[] {\n if (!names) return [];\n return typeof names === 'string' ? [names] : names;\n}\n\nfunction normalizedGravity(model: MujocoModel): [number, number, number] {\n const gx = model.opt.gravity[0] ?? 0;\n const gy = model.opt.gravity[1] ?? 0;\n const gz = model.opt.gravity[2] ?? -9.81;\n const length = Math.hypot(gx, gy, gz);\n if (length === 0) return [0, 0, 0];\n return [gx / length, gy / length, gz / length];\n}\n\nfunction rotateWorldVectorToBody(data: MujocoData, bodyId: number, world: readonly [number, number, number]): [number, number, number] {\n const adr = bodyId * 4;\n const w = data.xquat[adr] ?? 1;\n const x = -(data.xquat[adr + 1] ?? 0);\n const y = -(data.xquat[adr + 2] ?? 0);\n const z = -(data.xquat[adr + 3] ?? 0);\n const vx = world[0];\n const vy = world[1];\n const vz = world[2];\n\n const tx = 2 * (y * vz - z * vy);\n const ty = 2 * (z * vx - x * vz);\n const tz = 2 * (x * vy - y * vx);\n\n return [\n vx + w * tx + y * tz - z * ty,\n vy + w * ty + z * tx - x * tz,\n vz + w * tz + x * ty - y * tx,\n ];\n}\n\n/**\n * Build a flat observation vector plus a layout map from live MuJoCo state.\n *\n * Missing named resources are skipped. The returned layout is the source of\n * truth for the vector produced from the current model.\n */\nexport function buildObservation(\n model: MujocoModel,\n data: MujocoData,\n config: ObservationConfig\n): ObservationResult {\n const values: number[] = [];\n const layout: ObservationLayoutItem[] = [];\n\n if (config.time) appendScalar(values, layout, 'time', data.time);\n if (config.qpos) append(values, layout, 'qpos', data.qpos);\n if (config.qvel) append(values, layout, 'qvel', data.qvel);\n if (config.ctrl) append(values, layout, 'ctrl', data.ctrl);\n if (config.act) append(values, layout, 'act', data.act);\n if (config.sensordata) append(values, layout, 'sensordata', data.sensordata);\n\n for (const name of config.sensors ?? []) {\n const sensorId = findSensorByName(model, name);\n if (sensorId < 0) continue;\n const start = model.sensor_adr[sensorId] ?? 0;\n const dim = model.sensor_dim[sensorId] ?? 0;\n append(values, layout, `sensor:${name}`, data.sensordata.subarray(start, start + dim));\n }\n\n for (const name of config.sites ?? []) {\n const siteId = findSiteByName(model, name);\n if (siteId < 0) continue;\n const start = siteId * 3;\n append(values, layout, `site:${name}:xpos`, data.site_xpos.subarray(start, start + 3));\n }\n\n const gravity = normalizedGravity(model);\n for (const name of namedBodyList(config.projectedGravity)) {\n const bodyId = findBodyByName(model, name);\n if (bodyId < 0) continue;\n append(values, layout, `projectedGravity:${name}`, rotateWorldVectorToBody(data, bodyId, gravity));\n }\n\n return {\n values: config.output === 'float64' ? new Float64Array(values) : new Float32Array(values),\n layout,\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo, useRef } from 'react';\n\n/** Shallow-compare two plain objects by own enumerable keys. */\nfunction shallowEqual(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (a[key] !== b[key]) return false;\n }\n return true;\n}\n\nexport interface ControllerOptions<TConfig> {\n /** Unique name for this controller (used as displayName). */\n name: string;\n /** Default values merged under user-supplied config. */\n defaultConfig?: Partial<TConfig>;\n}\n\nexport type ControllerComponent<TConfig> = React.FC<{\n config?: Partial<TConfig>;\n children?: React.ReactNode;\n}> & {\n controllerName: string;\n defaultConfig: Partial<TConfig>;\n};\n\n/**\n * Factory that produces a typed controller component.\n *\n * Controllers are React components that plug into the MuJoCo simulation tree.\n * Inside `Impl`, use any hooks (`useMujoco`, `useBeforePhysicsStep`, etc.)\n * to interact with the physics engine.\n *\n * @example\n * ```tsx\n * const MyController = createController<{ speed: number }>(\n * { name: 'my-controller', defaultConfig: { speed: 1.0 } },\n * function MyControllerImpl({ config }) {\n * 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/**\n * Factory that produces a typed controller hook.\n *\n * Same config stabilization and default merging as `createController`,\n * but returns a hook instead of a component. Pass `null` to disable.\n *\n * @example\n * ```tsx\n * const useMyController = createControllerHook<MyConfig, MyValue>(\n * { name: 'useMyController', defaultConfig: { gain: 1.0 } },\n * function useMyControllerImpl(config) {\n * // config is MyConfig | null — hooks must be called unconditionally\n * useBeforePhysicsStep((_model, data) => {\n * if (!config) return;\n * data.ctrl[0] = config.gain * Math.sin(data.time);\n * });\n * if (!config) return null;\n * return { /* value *\\/ };\n * },\n * );\n *\n * // Usage:\n * const value = useMyController({ gain: 2.0 });\n * const disabled = useMyController(null); // returns null\n * ```\n */\nexport function createControllerHook<TConfig, TValue>(\n options: ControllerOptions<TConfig>,\n useImpl: (config: TConfig | null) => TValue | null,\n): (config: TConfig | null) => TValue | null {\n const useController = (config: TConfig | null): TValue | null => {\n const configObj = config as Record<string, unknown> | null;\n const stableRef = useRef(configObj);\n if (configObj && stableRef.current) {\n if (!shallowEqual(stableRef.current, configObj)) {\n stableRef.current = configObj;\n }\n } else {\n stableRef.current = configObj;\n }\n\n const mergedConfig = useMemo(\n () => stableRef.current\n ? ({ ...options.defaultConfig, ...stableRef.current } as TConfig)\n : null,\n [stableRef.current],\n );\n\n return useImpl(mergedConfig);\n };\n\n return useController;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as THREE from 'three';\nimport { MujocoModule, MujocoModel, MujocoData } from '../types';\n\nexport interface GenericIKOptions {\n maxIterations: number;\n damping: number;\n tolerance: number;\n epsilon: number;\n posWeight: number;\n rotWeight: number;\n}\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 qposAdr qpos addresses for scalar joints in solve order\n * @param targetPos Target position in world frame\n * @param targetQuat Target orientation in world frame\n * @param currentQ Current joint angles matching qposAdr order\n * @param opts Optional solver parameters\n * @returns Joint angles array, or null if solver diverged\n */\n solve(\n model: MujocoModel,\n data: MujocoData,\n siteId: number,\n qposAdr: ArrayLike<number>,\n targetPos: THREE.Vector3,\n targetQuat: THREE.Quaternion,\n currentQ: ArrayLike<number>,\n opts?: Partial<GenericIKOptions>\n ): number[] | null {\n const o = { ...DEFAULTS, ...opts };\n const n = qposAdr.length;\n\n // Save full qpos so we can restore after solving\n const savedQpos = new Float64Array(data.qpos.length);\n savedQpos.set(data.qpos);\n\n // Build target rotation matrix (3x3 row-major)\n const R_target = quatToMat3(targetQuat);\n\n // Working joint angles — start from current configuration\n const q = new Float64Array(n);\n for (let i = 0; i < n; i++) q[i] = currentQ[i];\n\n // Pre-allocate work arrays\n const J = new Float64Array(6 * n); // 6×n Jacobian (row-major)\n const JJt = new Float64Array(36); // 6×6\n const rhs = new Float64Array(6); // right-hand side\n const x = new Float64Array(6); // solve result\n const dq = new Float64Array(n); // joint update\n const baseSitePos = new Float64Array(3);\n const baseSiteMat = new Float64Array(9);\n const pertSitePos = new Float64Array(3);\n const pertSiteMat = new Float64Array(9);\n\n let bestQ: number[] | null = null;\n let bestErr = Infinity;\n\n if (n === 0) return null;\n\n for (let iter = 0; iter < o.maxIterations; iter++) {\n // Set joints and run FK\n for (let i = 0; i < n; i++) data.qpos[qposAdr[i]] = q[i];\n this.mujoco.mj_forward(model, data);\n\n // Read current site pose\n const sp = data.site_xpos;\n const sm = data.site_xmat;\n const off3 = siteId * 3;\n const off9 = siteId * 9;\n for (let i = 0; i < 3; i++) baseSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) baseSiteMat[i] = sm[off9 + i];\n\n // Compute 6D error\n const posErr0 = targetPos.x - baseSitePos[0];\n const posErr1 = targetPos.y - baseSitePos[1];\n const posErr2 = targetPos.z - baseSitePos[2];\n const rotErr = orientationError(baseSiteMat, R_target);\n\n const error = [\n posErr0 * o.posWeight,\n posErr1 * o.posWeight,\n posErr2 * o.posWeight,\n rotErr[0] * o.rotWeight,\n rotErr[1] * o.rotWeight,\n rotErr[2] * o.rotWeight,\n ];\n\n const errNorm = Math.sqrt(\n error[0] * error[0] + error[1] * error[1] + error[2] * error[2] +\n error[3] * error[3] + error[4] * error[4] + error[5] * error[5]\n );\n\n // Track best solution\n if (errNorm < bestErr) {\n bestErr = errNorm;\n bestQ = Array.from(q);\n }\n\n // Converged\n if (errNorm < o.tolerance) break;\n\n // Compute Jacobian via finite differences\n for (let j = 0; j < n; j++) {\n const adr = qposAdr[j];\n const saved = data.qpos[adr];\n data.qpos[adr] = q[j] + o.epsilon;\n this.mujoco.mj_forward(model, data);\n\n for (let i = 0; i < 3; i++) pertSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) pertSiteMat[i] = sm[off9 + i];\n\n // Position Jacobian columns (rows 0-2)\n J[0 * n + j] = ((pertSitePos[0] - baseSitePos[0]) / o.epsilon) * o.posWeight;\n J[1 * n + j] = ((pertSitePos[1] - baseSitePos[1]) / o.epsilon) * o.posWeight;\n J[2 * n + j] = ((pertSitePos[2] - baseSitePos[2]) / o.epsilon) * o.posWeight;\n\n // Orientation Jacobian columns (rows 3-5)\n // δR = R_perturbed * R_base^T, then extract angular velocity\n const dRot = angularDelta(baseSiteMat, pertSiteMat);\n J[3 * n + j] = (dRot[0] / o.epsilon) * o.rotWeight;\n J[4 * n + j] = (dRot[1] / o.epsilon) * o.rotWeight;\n J[5 * n + j] = (dRot[2] / o.epsilon) * o.rotWeight;\n\n // Restore joint\n data.qpos[adr] = saved;\n }\n\n // Restore base FK state for next iteration\n for (let i = 0; i < n; i++) data.qpos[qposAdr[i]] = q[i];\n\n // Damped least squares: Δq = Jᵀ (J Jᵀ + λI)⁻¹ error\n // 1. Compute JJᵀ (6×6)\n for (let r = 0; r < 6; r++) {\n for (let c = 0; c < 6; c++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += J[r * n + k] * J[c * n + k];\n }\n JJt[r * 6 + c] = sum + (r === c ? o.damping : 0);\n }\n }\n\n // 2. Solve (JJᵀ + λI) x = error\n for (let i = 0; i < 6; i++) rhs[i] = error[i];\n solve6x6(JJt, rhs, x);\n\n // 3. Δq = Jᵀ x\n for (let j = 0; j < n; j++) {\n let sum = 0;\n for (let r = 0; r < 6; r++) {\n sum += J[r * n + j] * x[r];\n }\n dq[j] = sum;\n }\n\n // Update joints\n for (let i = 0; i < n; i++) q[i] += dq[i];\n }\n\n // Restore original qpos\n data.qpos.set(savedQpos);\n this.mujoco.mj_forward(model, data);\n\n return bestQ;\n }\n}\n\n// --- Math utilities ---\n\n/** Convert THREE.Quaternion to 3x3 rotation matrix (row-major Float64Array) */\nfunction quatToMat3(q: THREE.Quaternion): Float64Array {\n const m = new Float64Array(9);\n const x = q.x, y = q.y, z = q.z, w = q.w;\n const xx = x * x, yy = y * y, zz = z * z;\n const xy = x * y, xz = x * z, yz = y * z;\n const wx = w * x, wy = w * y, wz = w * z;\n m[0] = 1 - 2 * (yy + zz); m[1] = 2 * (xy - wz); m[2] = 2 * (xz + wy);\n m[3] = 2 * (xy + wz); m[4] = 1 - 2 * (xx + zz); m[5] = 2 * (yz - wx);\n m[6] = 2 * (xz - wy); m[7] = 2 * (yz + wx); m[8] = 1 - 2 * (xx + yy);\n return m;\n}\n\n/**\n * Compute orientation error between current and target rotation matrices.\n * Returns the axis-angle vector (log map of R_target * R_current^T).\n * Uses the small-angle approximation: error ≈ 0.5 * [R32-R23, R13-R31, R21-R12]\n * where R = R_target * R_current^T.\n */\nfunction orientationError(R_cur: Float64Array, R_tgt: Float64Array): [number, number, number] {\n // R_err = R_tgt * R_cur^T (both row-major 3x3)\n // R_err[i][j] = sum_k R_tgt[i][k] * R_cur[j][k] (note: transposing R_cur)\n const Re = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_tgt[i * 3 + k] * R_cur[j * 3 + k];\n }\n Re[i * 3 + j] = s;\n }\n }\n\n // Extract axis-angle from rotation matrix\n // For better accuracy than small-angle approx, use full log map\n const trace = Re[0] + Re[4] + Re[8];\n const cosAngle = Math.max(-1, Math.min(1, (trace - 1) * 0.5));\n const angle = Math.acos(cosAngle);\n\n // Near zero rotation — use small-angle approximation\n if (angle < 1e-6) {\n return [0, 0, 0];\n }\n\n // Near π — degenerate, use small-angle approx of the skew-symmetric part\n if (angle > Math.PI - 1e-6) {\n return [\n 0.5 * (Re[7] - Re[5]),\n 0.5 * (Re[2] - Re[6]),\n 0.5 * (Re[3] - Re[1]),\n ];\n }\n\n // General case: axis = skew(R_err) / (2 sin(angle)), scaled by angle\n const s = angle / (2 * Math.sin(angle));\n return [\n s * (Re[7] - Re[5]),\n s * (Re[2] - Re[6]),\n s * (Re[3] - Re[1]),\n ];\n}\n\n/**\n * Compute angular velocity vector from R_base to R_perturbed.\n * Returns the axis-angle of R_perturbed * R_base^T.\n * (Small angle: the rotation caused by the perturbation.)\n */\nfunction angularDelta(R_base: Float64Array, R_pert: Float64Array): [number, number, number] {\n // δR = R_pert * R_base^T\n // Small angle approx: ω ≈ 0.5 * [δR[7]-δR[5], δR[2]-δR[6], δR[3]-δR[1]]\n // This is fine because the perturbation epsilon is tiny.\n const dR = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_pert[i * 3 + k] * R_base[j * 3 + k];\n }\n dR[i * 3 + j] = s;\n }\n }\n return [\n 0.5 * (dR[7] - dR[5]),\n 0.5 * (dR[2] - dR[6]),\n 0.5 * (dR[3] - dR[1]),\n ];\n}\n\n/**\n * Solve 6×6 linear system Ax = b via Gaussian elimination with partial pivoting.\n * Modifies A and b in place. Result written to x.\n */\nfunction solve6x6(A: Float64Array, b: Float64Array, x: Float64Array): void {\n const N = 6;\n // Work on copies to avoid destroying originals needed elsewhere\n const a = new Float64Array(A);\n const r = new Float64Array(b);\n\n // Forward elimination with partial pivoting\n for (let col = 0; col < N; col++) {\n // Find pivot\n let maxVal = Math.abs(a[col * N + col]);\n let maxRow = col;\n for (let row = col + 1; row < N; row++) {\n const val = Math.abs(a[row * N + col]);\n if (val > maxVal) { maxVal = val; maxRow = row; }\n }\n\n // Swap rows\n if (maxRow !== col) {\n for (let k = 0; k < N; k++) {\n const tmp = a[col * N + k]; a[col * N + k] = a[maxRow * N + k]; a[maxRow * N + k] = tmp;\n }\n const tmp = r[col]; r[col] = r[maxRow]; r[maxRow] = tmp;\n }\n\n const pivot = a[col * N + col];\n if (Math.abs(pivot) < 1e-12) {\n // Singular — return zeros\n x.fill(0);\n return;\n }\n\n // Eliminate below\n for (let row = col + 1; row < N; row++) {\n const factor = a[row * N + col] / pivot;\n for (let k = col; k < N; k++) {\n a[row * N + k] -= factor * a[col * N + k];\n }\n r[row] -= factor * r[col];\n }\n }\n\n // Back substitution\n for (let row = N - 1; row >= 0; row--) {\n let sum = r[row];\n for (let k = row + 1; k < N; k++) {\n sum -= a[row * N + k] * x[k];\n }\n x[row] = sum / a[row * N + row];\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { createControllerHook } from '../core/createController';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { GenericIK } from '../core/GenericIK';\nimport { createContiguousControlGroup, findSiteByName, resolveControlGroup } from '../core/SceneLoader';\nimport type { ControlGroupInfo, IkConfig, IkContextValue, 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\nexport const useIkController = createControllerHook<IkConfig, IkContextValue>(\n { name: 'useIkController', defaultConfig: { damping: 0.01, maxIterations: 50 } },\n function useIkControllerImpl(config) {\n const { mjModelRef, mjDataRef, mujocoRef, resetCallbacks, status } =\n useMujocoContext();\n\n // All IK state lives here\n const ikEnabledRef = useRef(false);\n const ikCalculatingRef = useRef(false);\n const ikTargetRef = useRef<THREE.Group>(new THREE.Group());\n const siteIdRef = useRef(-1);\n const controlGroupRef = useRef<ControlGroupInfo | null>(null);\n const genericIkRef = useRef<GenericIK>(new GenericIK(mujocoRef.current));\n const firstIkEnableRef = useRef(true);\n const needsInitialSync = useRef(true);\n\n const gizmoAnimRef = useRef({\n active: false,\n startPos: new THREE.Vector3(),\n endPos: new THREE.Vector3(),\n startRot: new THREE.Quaternion(),\n endRot: new THREE.Quaternion(),\n startTime: 0,\n duration: 1000,\n });\n\n // Resolve site ID and model-aware control group when model loads or config changes.\n useEffect(() => {\n if (!config) {\n siteIdRef.current = -1;\n controlGroupRef.current = null;\n return;\n }\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n controlGroupRef.current = null;\n return;\n }\n siteIdRef.current = findSiteByName(model, config.siteName);\n controlGroupRef.current = config.numJoints !== undefined\n ? createContiguousControlGroup(model, config.numJoints)\n : resolveControlGroup(model, {\n siteName: config.siteName,\n joints: config.joints,\n actuators: config.actuators,\n });\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n }, [config?.siteName, config?.numJoints, config?.joints, config?.actuators, status, mjModelRef, mjDataRef, config]);\n\n // IK solve function\n const ikSolveFn = useCallback(\n (pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null => {\n if (!config) return null;\n if (config.ikSolveFn) return config.ikSolveFn(pos, quat, currentQ);\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const controlGroup = controlGroupRef.current;\n if (!model || !data || !controlGroup || siteIdRef.current === -1) return null;\n return genericIkRef.current.solve(\n model, data, siteIdRef.current, controlGroup.qposAdr,\n pos, quat, currentQ,\n { damping: config.damping, maxIterations: config.maxIterations },\n );\n },\n [config, mjModelRef, mjDataRef],\n );\n const ikSolveFnRef = useRef<IKSolveFn>(ikSolveFn);\n ikSolveFnRef.current = ikSolveFn;\n\n // Gizmo animation + one-time initial sync\n useFrame(() => {\n if (!config) return;\n\n if (needsInitialSync.current && siteIdRef.current !== -1) {\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n needsInitialSync.current = false;\n }\n }\n\n const ga = gizmoAnimRef.current;\n const target = ikTargetRef.current;\n if (!ga.active || !target) return;\n\n const now = performance.now();\n const elapsed = now - ga.startTime;\n const t = Math.min(elapsed / ga.duration, 1.0);\n const ease = 1 - Math.pow(1 - t, 3);\n target.position.lerpVectors(ga.startPos, ga.endPos, ease);\n target.quaternion.slerpQuaternions(ga.startRot, ga.endRot, ease);\n if (t >= 1.0) ga.active = false;\n });\n\n // IK solve in physics loop\n useBeforePhysicsStep((model, data) => {\n if (!config || !ikEnabledRef.current) {\n ikCalculatingRef.current = false;\n return;\n }\n const target = ikTargetRef.current;\n if (!target) return;\n\n ikCalculatingRef.current = true;\n const controlGroup = controlGroupRef.current;\n if (!controlGroup) return;\n\n const currentQ = Array.from(controlGroup.readQpos(data));\n const solution = config.ikSolveFn\n ? config.ikSolveFn(target.position, target.quaternion, currentQ, {\n model,\n data,\n siteId: siteIdRef.current,\n controlGroup,\n })\n : ikSolveFnRef.current(target.position, target.quaternion, currentQ);\n if (solution) {\n controlGroup.writeCtrl(data, solution);\n }\n });\n\n // Reset callback\n useEffect(() => {\n if (!config) return;\n const cb = () => {\n const data = mjDataRef.current;\n if (data && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n gizmoAnimRef.current.active = false;\n firstIkEnableRef.current = true;\n ikEnabledRef.current = false;\n needsInitialSync.current = true;\n };\n resetCallbacks.current.add(cb);\n return () => { resetCallbacks.current.delete(cb); };\n }, [resetCallbacks, mjDataRef, config]);\n\n // --- API methods ---\n\n const setIkEnabled = useCallback(\n (enabled: boolean) => {\n ikEnabledRef.current = enabled;\n const data = mjDataRef.current;\n if (enabled && data && !gizmoAnimRef.current.active && ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n firstIkEnableRef.current = false;\n }\n },\n [mjDataRef],\n );\n\n const syncTargetToSiteApi = useCallback(() => {\n const data = mjDataRef.current;\n const target = ikTargetRef.current;\n if (data && target) syncGizmoToSite(data, siteIdRef.current, target);\n }, [mjDataRef]);\n\n const solveIK = useCallback(\n (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 if (!config) return null;\n\n return contextValue;\n },\n);\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport { useEffect, useLayoutEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { BodyProps, SceneObject } from '../types';\n\n/**\n * Declarative physics body component. Registers a body definition in the\n * provider-level registry so it gets injected into the MJCF XML at load time.\n *\n * Bodies present at initial mount cause zero extra reloads (useLayoutEffect\n * runs before the provider's loadScene useEffect). Bodies added/removed after\n * the initial load trigger a debounced scene reload.\n */\nexport function Body({\n name,\n type,\n size,\n position = [0, 0, 0],\n rgba = [0.5, 0.5, 0.5, 1],\n mass,\n freejoint,\n friction,\n solref,\n solimp,\n condim,\n children,\n}: BodyProps) {\n const { bodyRegistryRef, hiddenBodiesRef, requestBodyReload, mjDataRef, mjModelRef, status } =\n useMujocoContext();\n const bodyIdRef = useRef(-1);\n const groupRef = useRef<THREE.Group>(null);\n const initialLoadRef = useRef(true);\n const hasChildren = children != null;\n\n // Register in body registry BEFORE the provider's loadScene useEffect fires.\n useLayoutEffect(() => {\n const definition: SceneObject = {\n name,\n type,\n size,\n position,\n rgba,\n mass,\n freejoint,\n friction,\n solref,\n solimp,\n condim,\n };\n bodyRegistryRef.current.set(name, { definition, hasCustomChildren: hasChildren });\n if (hasChildren) {\n hiddenBodiesRef.current.add(name);\n }\n\n return () => {\n bodyRegistryRef.current.delete(name);\n hiddenBodiesRef.current.delete(name);\n if (!initialLoadRef.current) {\n requestBodyReload();\n }\n };\n }, [name, type, size, position, rgba, mass, freejoint, friction, solref, solimp, condim, hasChildren, bodyRegistryRef, hiddenBodiesRef, requestBodyReload]);\n\n // Resolve body ID once the scene is ready\n useEffect(() => {\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, name);\n initialLoadRef.current = false;\n }, [status, name, mjModelRef]);\n\n // Sync group transform to body pose each frame (only when children are provided)\n useFrame(() => {\n if (!hasChildren) return;\n const data = mjDataRef.current;\n const id = bodyIdRef.current;\n const group = groupRef.current;\n if (!data || id < 0 || !group) return;\n\n const i3 = id * 3;\n const i4 = id * 4;\n group.position.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n group.quaternion.set(\n data.xquat[i4 + 1],\n data.xquat[i4 + 2],\n data.xquat[i4 + 3],\n data.xquat[i4],\n );\n });\n\n if (!hasChildren) return null;\n\n return <group ref={groupRef}>{children}</group>;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { PivotControls } from '@react-three/drei';\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { IkGizmoProps } from '../types';\n\n// Preallocated temps to avoid GC pressure in useFrame\nconst _mat4 = new THREE.Matrix4();\nconst _pos = new THREE.Vector3();\nconst _quat = new THREE.Quaternion();\nconst _scale = new THREE.Vector3(1, 1, 1);\n\n/**\n * IkGizmo — drei PivotControls that tracks a MuJoCo site.\n *\n * Requires a `controller` from `useIkController()`.\n *\n * Props:\n * - `controller` — IkContextValue from `useIkController()`.\n * - `siteName` — MuJoCo site to track. Defaults to the controller's configured site.\n * - `scale` — Gizmo handle scale. Default: 0.18.\n * - `onDrag` — Custom drag callback `(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({ controller, siteName, scale = 0.18, onDrag }: IkGizmoProps) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const { ikTargetRef, siteIdRef, ikEnabledRef, setIkEnabled } = controller;\n\n const wrapperRef = useRef<THREE.Group>(null);\n const pivotRef = useRef<THREE.Group>(null);\n const draggingRef = useRef(false);\n const localSiteIdRef = useRef(-1);\n const { controls } = useThree();\n\n // Resolve the site ID from siteName (only when an explicit siteName override is given)\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready' || !siteName) {\n localSiteIdRef.current = -1;\n return;\n }\n localSiteIdRef.current = findSiteByName(model, siteName);\n }, [siteName, status, mjModelRef]);\n\n // Every frame: sync the visual wrapper to the tracked site (when not dragging)\n useFrame(() => {\n const data = mjDataRef.current;\n const sid = siteName ? localSiteIdRef.current : siteIdRef.current;\n if (!data || sid < 0 || !wrapperRef.current) return;\n\n if (!draggingRef.current) {\n const p = data.site_xpos;\n const m = data.site_xmat;\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n // Position wrapper at the site\n wrapperRef.current.position.set(p[i3], p[i3 + 1], p[i3 + 2]);\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n wrapperRef.current.quaternion.setFromRotationMatrix(_mat4);\n\n // Reset any accumulated drag delta so handles stay at wrapper origin\n if (pivotRef.current) {\n pivotRef.current.matrix.identity();\n }\n }\n });\n\n // Don't render until the model is loaded (avoids gizmo at origin)\n if (status !== 'ready') return null;\n\n return (\n <group 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 { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getContact, withContacts } from '../types';\n\nconst _dummy = new THREE.Object3D();\n\ninterface ContactMarkersProps {\n /** Maximum contacts to render. Default: 100. */\n maxContacts?: number;\n /** Sphere radius. Default: 0.008. */\n radius?: number;\n /** Color. Default: '#22d3ee'. */\n color?: string;\n /** Show markers. Default: true. */\n visible?: boolean;\n}\n\nexport function ContactMarkers({\n maxContacts = 100,\n radius = 0.008,\n color = '#22d3ee',\n visible = true,\n ...groupProps\n}: ContactMarkersProps & Omit<ThreeElements['group'], 'ref' | 'visible'> = {}) {\n const { mjDataRef, status } = useMujocoContext();\n const meshRef = useRef<THREE.InstancedMesh>(null);\n\n useFrame(() => {\n const mesh = meshRef.current;\n const data = mjDataRef.current;\n if (!mesh || !data || !visible) {\n if (mesh) mesh.count = 0;\n return;\n }\n\n const ncon = data.ncon;\n const count = Math.min(ncon, maxContacts);\n\n let resolvedCount = count;\n withContacts(data, (contactArray) => {\n for (let i = 0; i < count; i++) {\n const c = getContact(contactArray, i);\n if (!c) {\n resolvedCount = i;\n return;\n }\n _dummy.position.set(c.pos[0], c.pos[1], c.pos[2]);\n _dummy.updateMatrix();\n mesh.setMatrixAt(i, _dummy.matrix);\n }\n });\n\n mesh.count = resolvedCount;\n mesh.instanceMatrix.needsUpdate = true;\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group {...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 { useMujocoContext, 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 } = useMujocoContext();\n const { gl, camera, scene, controls } = useThree();\n\n const draggingRef = useRef(false);\n const bodyIdRef = useRef(-1);\n const grabDistanceRef = useRef(0);\n const localHitRef = useRef(new THREE.Vector3());\n const grabWorldRef = useRef(new THREE.Vector3());\n const mouseWorldRef = useRef(new THREE.Vector3());\n\n // Arrow helper for visual feedback (managed imperatively)\n const arrowRef = useRef<THREE.ArrowHelper | null>(null);\n const groupRef = useRef<THREE.Group>(null);\n\n useEffect(() => {\n if (!showArrow || !groupRef.current) return;\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 1, 0),\n new THREE.Vector3(),\n 0.1,\n 0xff4444,\n );\n arrow.visible = false;\n // Make arrow semi-transparent\n (arrow.line.material as THREE.LineBasicMaterial).transparent = true;\n (arrow.line.material as THREE.LineBasicMaterial).opacity = 0.6;\n (arrow.cone.material as THREE.MeshBasicMaterial).transparent = true;\n (arrow.cone.material as THREE.MeshBasicMaterial).opacity = 0.6;\n groupRef.current.add(arrow);\n arrowRef.current = arrow;\n return () => {\n if (groupRef.current) groupRef.current.remove(arrow);\n arrow.dispose();\n arrowRef.current = null;\n };\n }, [showArrow]);\n\n // Pointer events on the canvas\n useEffect(() => {\n const canvas = gl.domElement;\n\n const onPointerDown = (evt: PointerEvent) => {\n if (evt.button !== 0) return; // left click only\n if (!evt.ctrlKey && !evt.metaKey) return; // require Ctrl/Cmd+click\n const rect = canvas.getBoundingClientRect();\n _mouse.set(\n ((evt.clientX - rect.left) / rect.width) * 2 - 1,\n -((evt.clientY - rect.top) / rect.height) * 2 + 1,\n );\n _raycaster.setFromCamera(_mouse, camera);\n\n const hits = _raycaster.intersectObjects(scene.children, true);\n for (const hit of hits) {\n let obj: THREE.Object3D | null = hit.object;\n while (obj && obj.userData.bodyID === undefined && obj.parent) {\n obj = obj.parent;\n }\n const bid = obj?.userData.bodyID;\n if (bid !== undefined && bid > 0) {\n bodyIdRef.current = bid;\n draggingRef.current = true;\n grabDistanceRef.current = hit.distance;\n\n // Store hit point in body-local coords\n const data = mjDataRef.current;\n if (data) {\n const i3 = bid * 3;\n const i4 = bid * 4;\n _bodyPos.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n // MuJoCo xquat is [w,x,y,z]; THREE wants (x,y,z,w)\n _bodyQuat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n // World hit → body-local: inverse(bodyRot) * (hitWorld - bodyPos)\n localHitRef.current.copy(hit.point).sub(_bodyPos);\n localHitRef.current.applyQuaternion(_bodyQuat.clone().invert());\n }\n\n mouseWorldRef.current.copy(hit.point);\n grabWorldRef.current.copy(hit.point);\n\n // Disable orbit controls during drag\n if (controls) (controls as unknown as { enabled: boolean }).enabled = false;\n break;\n }\n }\n };\n\n const onPointerMove = (evt: PointerEvent) => {\n if (!draggingRef.current) return;\n // Safety: if no buttons are pressed, the pointerup was missed\n if (evt.buttons === 0) {\n draggingRef.current = false;\n bodyIdRef.current = -1;\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n return;\n }\n const rect = canvas.getBoundingClientRect();\n _mouse.set(\n ((evt.clientX - rect.left) / rect.width) * 2 - 1,\n -((evt.clientY - rect.top) / rect.height) * 2 + 1,\n );\n _raycaster.setFromCamera(_mouse, camera);\n // Project mouse ray to the same grab distance\n mouseWorldRef.current.copy(_raycaster.ray.origin)\n .addScaledVector(_raycaster.ray.direction, grabDistanceRef.current);\n };\n\n const onPointerUp = () => {\n if (!draggingRef.current) return;\n draggingRef.current = false;\n bodyIdRef.current = -1;\n if (controls) (controls as unknown as { enabled: boolean }).enabled = true;\n };\n\n canvas.addEventListener('pointerdown', onPointerDown);\n canvas.addEventListener('pointermove', onPointerMove);\n // Listen on window so we catch releases even if pointer leaves the canvas\n window.addEventListener('pointerup', onPointerUp);\n window.addEventListener('pointercancel', onPointerUp);\n return () => {\n canvas.removeEventListener('pointerdown', onPointerDown);\n canvas.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onPointerUp);\n window.removeEventListener('pointercancel', onPointerUp);\n };\n }, [gl, camera, scene, controls, mjDataRef]);\n\n // Apply spring force each physics frame\n useBeforePhysicsStep((model, data) => {\n if (!draggingRef.current || bodyIdRef.current <= 0) return;\n\n const bid = bodyIdRef.current;\n const mujoco = mujocoRef.current;\n\n // Reconstruct grab point world position from body's current pose\n const i3 = bid * 3;\n const i4 = bid * 4;\n _bodyPos.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n _bodyQuat.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n _worldHit.copy(localHitRef.current);\n _worldHit.applyQuaternion(_bodyQuat);\n _worldHit.add(_bodyPos);\n grabWorldRef.current.copy(_worldHit);\n\n // Compute spring force: F = (mouseWorld - grabWorld) * body_mass * stiffness\n const mass = model.body_mass[bid];\n const s = stiffness * mass;\n _force[0] = (mouseWorldRef.current.x - _worldHit.x) * s;\n _force[1] = (mouseWorldRef.current.y - _worldHit.y) * s;\n _force[2] = (mouseWorldRef.current.z - _worldHit.z) * s;\n\n _point[0] = _worldHit.x;\n _point[1] = _worldHit.y;\n _point[2] = _worldHit.z;\n\n _torque[0] = 0; _torque[1] = 0; _torque[2] = 0;\n\n mujoco.mj_applyFT(model, data, _force, _torque, _point, bid, data.qfrc_applied);\n });\n\n // Update arrow visual\n useFrame(() => {\n const arrow = arrowRef.current;\n if (!arrow) return;\n\n if (draggingRef.current && bodyIdRef.current > 0) {\n arrow.visible = true;\n const dir = _bodyPos.copy(mouseWorldRef.current).sub(grabWorldRef.current);\n const len = dir.length();\n if (len > 0.001) {\n dir.normalize();\n arrow.position.copy(grabWorldRef.current);\n arrow.setDirection(dir);\n arrow.setLength(len, Math.min(len * 0.2, 0.05), Math.min(len * 0.1, 0.03));\n }\n } else {\n arrow.visible = false;\n }\n });\n\n if (status !== 'ready') return null;\n\n return <group {...groupProps} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSceneLights — hook form of SceneLights (spec 6.3)\n *\n * Auto-creates Three.js lights from MJCF <light> elements.\n */\n\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\nexport function useSceneLights(intensity = 1.0) {\n const { mjModelRef, status } = useMujocoContext();\n const { scene } = useThree();\n const lightsRef = useRef<THREE.Light[]>([]);\n const targetsRef = useRef<THREE.Object3D[]>([]);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n\n // Clean up previous lights\n for (const light of lightsRef.current) {\n scene.remove(light);\n light.dispose();\n }\n for (const t of targetsRef.current) scene.remove(t);\n lightsRef.current = [];\n targetsRef.current = [];\n\n const nlight = model.nlight ?? 0;\n if (nlight === 0) return;\n\n 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 { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { getContact, withContacts } 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 } = useMujocoContext();\n const { scene } = useThree();\n const groupRef = useRef<THREE.Group>(null);\n\n // Build static debug geometry when model loads\n const debugGeometry = useMemo(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return null;\n\n const geoms: THREE.Object3D[] = [];\n const sites: THREE.Object3D[] = [];\n const joints: THREE.Object3D[] = [];\n const 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 withContacts(data, (contactArray) => {\n for (let i = 0; i < Math.min(ncon, MAX_CONTACT_ARROWS); i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n _contactPos.set(c.pos[0], c.pos[1], c.pos[2]);\n _contactNormal.set(c.frame[0], c.frame[1], c.frame[2]);\n const force = Math.abs(c.dist) * 100;\n const length = Math.min(force * 0.01, 0.1);\n if (length > 0.001 && arrowIdx < pool.length) {\n const arrow = pool[arrowIdx];\n arrow.position.copy(_contactPos);\n arrow.setDirection(_contactNormal);\n arrow.setLength(length, length * 0.3, length * 0.15);\n arrow.visible = true;\n arrowIdx++;\n }\n }\n });\n\n // Hide unused arrows\n for (let i = arrowIdx; i < pool.length; i++) {\n pool[i].visible = false;\n }\n });\n\n if (status !== 'ready') return null;\n\n return (\n <group {...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 may not be available in all MuJoCo WASM builds.\n * Tendons use a default color and width.\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\nconst DEFAULT_TENDON_COLOR = new THREE.Color(0.3, 0.3, 0.8);\nconst DEFAULT_TENDON_WIDTH = 0.002;\n\n// Preallocated temp vector to avoid per-frame allocations\nconst _tmpVec = new THREE.Vector3();\n\nexport function TendonRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n const curvesRef = useRef<THREE.CatmullRomCurve3[]>([]);\n const materialRef = useRef<THREE.MeshStandardMaterial | null>(null);\n\n // Build tendon meshes once when model loads\n useEffect(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const group = groupRef.current;\n if (!model || !data || !group) return;\n\n const ntendon = model.ntendon ?? 0;\n if (ntendon === 0) return;\n\n // Shared material for all tendons\n const material = new THREE.MeshStandardMaterial({\n color: DEFAULT_TENDON_COLOR,\n roughness: 0.6,\n metalness: 0.1,\n });\n materialRef.current = material;\n\n const meshes: THREE.Mesh[] = [];\n const curves: THREE.CatmullRomCurve3[] = [];\n\n for (let t = 0; t < ntendon; t++) {\n const wrapNum = model.ten_wrapnum[t];\n if (wrapNum < 2) {\n meshes.push(null!);\n curves.push(null!);\n continue;\n }\n\n // Initial dummy points — will be overwritten in useFrame\n const points = Array.from({ length: wrapNum }, () => new THREE.Vector3());\n const curve = new THREE.CatmullRomCurve3(points, false);\n const segments = Math.max(wrapNum * 2, 4);\n const geometry = new THREE.TubeGeometry(curve, segments, DEFAULT_TENDON_WIDTH, 6, false);\n const mesh = new THREE.Mesh(geometry, material);\n mesh.frustumCulled = false;\n group.add(mesh);\n meshes.push(mesh);\n curves.push(curve);\n }\n\n meshesRef.current = meshes;\n curvesRef.current = curves;\n\n return () => {\n for (const mesh of meshes) {\n if (!mesh) continue;\n group.remove(mesh);\n mesh.geometry.dispose();\n }\n material.dispose();\n meshesRef.current = [];\n curvesRef.current = [];\n materialRef.current = null;\n };\n }, [status, mjModelRef, mjDataRef]);\n\n // Update curve control points and rebuild geometry each frame\n useFrame(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const ntendon = model.ntendon ?? 0;\n const meshes = meshesRef.current;\n const curves = curvesRef.current;\n\n for (let t = 0; t < ntendon; t++) {\n const mesh = meshes[t];\n const curve = curves[t];\n if (!mesh || !curve) continue;\n\n const wrapAdr = model.ten_wrapadr[t];\n const wrapNum = model.ten_wrapnum[t];\n\n // Update existing control points in-place\n let validCount = 0;\n for (let w = 0; w < wrapNum; w++) {\n const idx = (wrapAdr + w) * 3;\n if (data.wrap_xpos && idx + 2 < data.wrap_xpos.length) {\n const x = data.wrap_xpos[idx];\n const y = data.wrap_xpos[idx + 1];\n const z = data.wrap_xpos[idx + 2];\n if (x !== 0 || y !== 0 || z !== 0) {\n if (validCount < curve.points.length) {\n curve.points[validCount].set(x, y, z);\n }\n validCount++;\n }\n }\n }\n\n if (validCount < 2) {\n mesh.visible = false;\n continue;\n }\n\n // Trim or pad points array to match valid count\n if (curve.points.length !== validCount) {\n curve.points.length = validCount;\n while (curve.points.length < validCount) {\n curve.points.push(new THREE.Vector3());\n }\n }\n\n // Rebuild geometry from updated curve\n mesh.geometry.dispose();\n mesh.geometry = new THREE.TubeGeometry(\n curve, Math.max(validCount * 2, 4), DEFAULT_TENDON_WIDTH, 6, false\n );\n mesh.visible = true;\n }\n });\n\n if (status !== 'ready') return null;\n return <group {...props} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * FlexRenderer — render deformable flex bodies (spec 6.4)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\n\n/**\n * Renders MuJoCo flex (deformable) bodies as dynamic meshes.\n * Vertices are updated every frame from flexvert_xpos.\n */\nexport function FlexRenderer(props: Omit<ThreeElements['group'], 'ref'>) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n\n // Build flex meshes once when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group || status !== 'ready') return;\n\n const nflex = model.nflex ?? 0;\n if (nflex === 0) return;\n\n for (let f = 0; f < nflex; f++) {\n const vertAdr = model.flex_vertadr[f];\n const vertNum = model.flex_vertnum[f];\n\n if (vertNum === 0) continue;\n\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(vertNum * 3);\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n // Note: flex_faceadr/flex_facenum/flex_face may not be available in all MuJoCo WASM builds.\n // Without face data we render as a point cloud. If future WASM versions expose\n // face arrays, index-based triangle rendering can be added here.\n\n geometry.computeVertexNormals();\n\n let color = new THREE.Color(0.5, 0.5, 0.5);\n if (model.flex_rgba) {\n color = new THREE.Color(\n model.flex_rgba[4 * f],\n model.flex_rgba[4 * f + 1],\n model.flex_rgba[4 * f + 2],\n );\n }\n\n const material = new THREE.MeshStandardMaterial({\n color,\n roughness: 0.7,\n side: THREE.DoubleSide,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.userData.flexId = f;\n mesh.userData.vertAdr = vertAdr;\n mesh.userData.vertNum = vertNum;\n group.add(mesh);\n meshesRef.current.push(mesh);\n }\n\n return () => {\n for (const mesh of meshesRef.current) {\n group.remove(mesh);\n mesh.geometry.dispose();\n (mesh.material as THREE.Material).dispose();\n }\n meshesRef.current = [];\n };\n }, [status, mjModelRef]);\n\n // Update vertex positions every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !data.flexvert_xpos) return;\n\n for (const mesh of meshesRef.current) {\n const vertAdr = mesh.userData.vertAdr;\n const vertNum = mesh.userData.vertNum;\n const posAttr = mesh.geometry.getAttribute('position') as THREE.BufferAttribute;\n if (!posAttr) continue;\n\n for (let v = 0; v < vertNum; v++) {\n const srcIdx = (vertAdr + v) * 3;\n posAttr.setXYZ(v, data.flexvert_xpos[srcIdx], data.flexvert_xpos[srcIdx + 1], data.flexvert_xpos[srcIdx + 2]);\n }\n posAttr.needsUpdate = true;\n mesh.geometry.computeVertexNormals();\n }\n });\n\n if (status !== 'ready') return null;\n return <group {...props} ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } from '@react-three/fiber';\nimport type { ThreeElements } from '@react-three/fiber';\nimport { useMemo, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport { GeomBuilder } from '../rendering/GeomBuilder';\nimport type { GeomInfo, MujocoModel } from '../types';\n\nexport interface InstancedGeomRendererProps extends Omit<ThreeElements['group'], 'ref'> {\n /** Only render geoms from this MuJoCo geom group. */\n geomGroup?: number;\n /** Predicate for selecting geoms. */\n filter?: (geom: GeomInfo) => boolean;\n /** Optional material override for every instanced batch. */\n material?: THREE.Material;\n /** Hide or show the instanced batches. */\n visible?: boolean;\n castShadow?: boolean;\n receiveShadow?: boolean;\n}\n\ninterface GeomBatch {\n key: string;\n geomIds: number[];\n geometry: THREE.BufferGeometry;\n material: THREE.Material;\n}\n\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\nconst _matrix = new THREE.Matrix4();\n\nfunction getGeomInfo(model: MujocoModel, geomId: number): GeomInfo {\n const size = model.geom_size.subarray(geomId * 3, geomId * 3 + 3);\n const type = model.geom_type[geomId];\n return {\n id: geomId,\n name: getName(model, model.name_geomadr[geomId]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `type-${type}`,\n size: [size[0], size[1], size[2]],\n bodyId: model.geom_bodyid[geomId],\n };\n}\n\nfunction geomSignature(model: MujocoModel, geomId: number): string {\n const type = model.geom_type[geomId];\n const size = Array.from(model.geom_size.subarray(geomId * 3, geomId * 3 + 3)).join(',');\n const mat = model.geom_matid[geomId];\n const data = model.geom_dataid[geomId];\n const rgba = Array.from(model.geom_rgba.subarray(geomId * 4, geomId * 4 + 4)).join(',');\n return [type, size, mat, data, rgba].join('|');\n}\n\nfunction firstMesh(object: THREE.Object3D): THREE.Mesh | null {\n if (object instanceof THREE.Mesh) return object;\n let mesh: THREE.Mesh | null = null;\n object.traverse((child) => {\n if (!mesh && child instanceof THREE.Mesh) mesh = child;\n });\n return mesh;\n}\n\nexport function InstancedGeomRenderer({\n geomGroup,\n filter,\n material,\n visible = true,\n castShadow = true,\n receiveShadow = true,\n ...groupProps\n}: InstancedGeomRendererProps = {}) {\n const { mjModelRef, mjDataRef, mujocoRef, status } = useMujocoContext();\n const meshRefs = useRef<(THREE.InstancedMesh | null)[]>([]);\n\n const batches = useMemo<GeomBatch[]>(() => {\n if (status !== 'ready') return [];\n const model = mjModelRef.current;\n if (!model) return [];\n\n const builder = new GeomBuilder(mujocoRef.current);\n const grouped = new Map<string, number[]>();\n\n for (let geomId = 0; geomId < model.ngeom; geomId++) {\n if (model.geom_group[geomId] === 3) continue;\n if (geomGroup !== undefined && model.geom_group[geomId] !== geomGroup) continue;\n const info = getGeomInfo(model, geomId);\n if (filter && !filter(info)) continue;\n const key = geomSignature(model, geomId);\n const ids = grouped.get(key);\n if (ids) ids.push(geomId);\n else grouped.set(key, [geomId]);\n }\n\n const next: GeomBatch[] = [];\n for (const [key, geomIds] of grouped) {\n if (geomIds.length < 2) continue;\n const object = builder.create(model, geomIds[0]);\n if (!object) continue;\n const mesh = firstMesh(object);\n if (!mesh) continue;\n const sourceMaterial = Array.isArray(mesh.material) ? mesh.material[0] : mesh.material;\n next.push({\n key,\n geomIds,\n geometry: mesh.geometry.clone(),\n material: material ?? sourceMaterial.clone(),\n });\n }\n\n return next;\n }, [filter, geomGroup, material, mjModelRef, mujocoRef, status]);\n\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !visible) return;\n\n batches.forEach((batch, batchIndex) => {\n const mesh = meshRefs.current[batchIndex];\n if (!mesh) return;\n batch.geomIds.forEach((geomId, instanceId) => {\n const p = geomId * 3;\n const r = geomId * 9;\n _matrix.set(\n data.geom_xmat[r], data.geom_xmat[r + 1], data.geom_xmat[r + 2], data.geom_xpos[p],\n data.geom_xmat[r + 3], data.geom_xmat[r + 4], data.geom_xmat[r + 5], data.geom_xpos[p + 1],\n data.geom_xmat[r + 6], data.geom_xmat[r + 7], data.geom_xmat[r + 8], data.geom_xpos[p + 2],\n 0, 0, 0, 1\n );\n mesh.setMatrixAt(instanceId, _matrix);\n });\n mesh.count = batch.geomIds.length;\n mesh.instanceMatrix.needsUpdate = true;\n });\n });\n\n if (status !== 'ready' || batches.length === 0) return null;\n\n return (\n <group {...groupProps} visible={visible}>\n {batches.map((batch, index) => (\n <instancedMesh\n key={batch.key}\n ref={(mesh) => { meshRefs.current[index] = mesh; }}\n args={[batch.geometry, batch.material, batch.geomIds.length]}\n castShadow={castShadow}\n receiveShadow={receiveShadow}\n frustumCulled={false}\n />\n ))}\n </group>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useContacts — structured contact query hook (spec 2.4)\n * useContactEvents — contact enter/exit events (spec 2.5)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName, getName } from '../core/SceneLoader';\nimport { getContact, withContacts } from '../types';\nimport type { Bodies, ContactInfo, MujocoModel } from '../types';\n\n// Cache geom names per model to avoid cross-model id collisions.\nconst geomNameCacheByModel = new WeakMap<MujocoModel, Map<number, string>>();\n\nfunction getGeomNameCached(model: MujocoModel, geomId: number): string {\n let perModel = geomNameCacheByModel.get(model);\n if (!perModel) {\n perModel = new Map<number, string>();\n geomNameCacheByModel.set(model, perModel);\n }\n\n let name = perModel.get(geomId);\n if (name === undefined) {\n name = getName(model, model.name_geomadr[geomId]);\n perModel.set(geomId, name);\n }\n return name;\n}\n\n/**\n * Track contacts for a specific body (or all contacts if no body specified).\n * Calls the callback every physics frame with current contact list.\n * Reads `data.ncon` first to avoid allocating for zero contacts.\n */\nexport function useContacts(\n bodyName?: Bodies,\n callback?: (contacts: ContactInfo[]) => void,\n): React.RefObject<ContactInfo[]> {\n const { mjModelRef, status } = useMujocoContext();\n const contactsRef = useRef<ContactInfo[]>([]);\n const bodyIdRef = useRef(-1);\n const bodyResolvedRef = useRef(false);\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n if (!bodyName) {\n bodyIdRef.current = -1;\n bodyResolvedRef.current = true;\n return;\n }\n bodyResolvedRef.current = false;\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, bodyName);\n bodyResolvedRef.current = true;\n }, [bodyName, status, mjModelRef]);\n\n useAfterPhysicsStep((model, data) => {\n // Resolve body id lazily once model exists, to avoid missing the first ready frame.\n if (bodyName && !bodyResolvedRef.current) {\n bodyIdRef.current = findBodyByName(model, bodyName);\n bodyResolvedRef.current = true;\n }\n\n const ncon = data.ncon;\n if (ncon === 0) {\n if (contactsRef.current.length > 0) contactsRef.current = [];\n callbackRef.current?.([]);\n return;\n }\n\n const contacts: ContactInfo[] = [];\n const filterBody = bodyIdRef.current;\n\n withContacts(data, (contactArray) => {\n for (let i = 0; i < ncon; i++) {\n const c = getContact(contactArray, i);\n if (!c) break;\n // Filter by body if specified\n if (filterBody >= 0) {\n const b1 = model.geom_bodyid[c.geom1];\n const b2 = model.geom_bodyid[c.geom2];\n if (b1 !== filterBody && b2 !== filterBody) continue;\n }\n contacts.push({\n geom1: c.geom1,\n geom1Name: getGeomNameCached(model, c.geom1),\n geom2: c.geom2,\n geom2Name: getGeomNameCached(model, c.geom2),\n pos: [c.pos[0], c.pos[1], c.pos[2]],\n depth: c.dist,\n });\n }\n });\n contactsRef.current = contacts;\n callbackRef.current?.(contacts);\n });\n\n return contactsRef;\n}\n\n/**\n * Contact enter/exit events for a specific body (spec 2.5).\n * Tracks which geom pairs are in contact frame-to-frame and fires\n * onEnter/onExit callbacks on transitions.\n */\nexport function useContactEvents(\n bodyName: Bodies,\n handlers: {\n onEnter?: (info: ContactInfo) => void;\n onExit?: (info: ContactInfo) => void;\n },\n) {\n const prevPairsRef = useRef(new Set<string>());\n const onEnterRef = useRef(handlers.onEnter);\n const onExitRef = useRef(handlers.onExit);\n onEnterRef.current = handlers.onEnter;\n onExitRef.current = handlers.onExit;\n\n const prevContactMapRef = useRef(new Map<string, ContactInfo>());\n\n const onContacts = useCallback((contacts: ContactInfo[]) => {\n const currentPairs = new Set<string>();\n const currentMap = new Map<string, ContactInfo>();\n\n for (const c of contacts) {\n const key = `${Math.min(c.geom1, c.geom2)}_${Math.max(c.geom1, c.geom2)}`;\n currentPairs.add(key);\n currentMap.set(key, c);\n }\n\n // New contacts (enter)\n for (const key of currentPairs) {\n if (!prevPairsRef.current.has(key)) {\n onEnterRef.current?.(currentMap.get(key)!);\n }\n }\n\n // Lost contacts (exit)\n for (const key of prevPairsRef.current) {\n if (!currentPairs.has(key)) {\n const prev = prevContactMapRef.current.get(key);\n if (prev) onExitRef.current?.(prev);\n }\n }\n\n prevPairsRef.current = currentPairs;\n prevContactMapRef.current = currentMap;\n }, []);\n\n useContacts(bodyName, onContacts);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * ContactListener — component form of contact events (spec 2.5)\n */\n\nimport { useContactEvents } from '../hooks/useContacts';\nimport type { ContactListenerProps } from '../types';\n\n/**\n * Component form of useContactEvents.\n * Fires onContactEnter/onContactExit callbacks when contacts change.\n */\nexport function ContactListener({\n body,\n onContactEnter,\n onContactExit,\n}: ContactListenerProps) {\n useContactEvents(body, {\n onEnter: onContactEnter,\n onExit: onContactExit,\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryPlayer — trajectory playback/scrubbing (spec 13.2)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport type { PlaybackState, TrajectoryFrame, TrajectoryInput } from '../types';\n\nexport interface TrajectoryPlayerOptions {\n fps?: number;\n speed?: number;\n loop?: boolean;\n mode?: 'kinematic' | 'physics';\n onComplete?: () => void;\n onStateChange?: (state: PlaybackState) => void;\n}\n\n/** Check if input is TrajectoryFrame[] (vs number[][]) */\nfunction isTrajectoryFrames(input: TrajectoryInput): input is TrajectoryFrame[] {\n return input.length > 0 && typeof (input[0] as TrajectoryFrame).time === 'number'\n && 'qpos' in (input[0] as TrajectoryFrame);\n}\n\n/** Extract qpos as plain number array from a frame */\nfunction getQpos(input: TrajectoryInput, idx: number): ArrayLike<number> | null {\n const item = input[idx];\n if (!item) return null;\n if (Array.isArray(item)) return item;\n return (item as TrajectoryFrame).qpos;\n}\n\n/** Extract ctrl values from a TrajectoryFrame, if available */\nfunction getCtrl(input: TrajectoryInput, idx: number): ArrayLike<number> | null {\n const item = input[idx];\n if (!item || Array.isArray(item)) return null;\n return (item as TrajectoryFrame).ctrl ?? null;\n}\n\n/**\n * Play back a trajectory, overriding simulation state.\n *\n * Accepts either `TrajectoryFrame[]` (from useTrajectoryRecorder) or\n * `number[][]` (raw qpos arrays).\n *\n * In `kinematic` mode (default), the simulation is paused and qpos is\n * set directly each frame with mj_forward for rendering.\n *\n * In `physics` mode, the simulation keeps running and ctrl values from\n * the trajectory are applied each physics step via useBeforePhysicsStep.\n */\nexport function useTrajectoryPlayer(\n trajectory: TrajectoryInput,\n options: TrajectoryPlayerOptions = {},\n) {\n const { mjModelRef, mjDataRef, mujocoRef, pausedRef } = useMujocoContext();\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const stateRef = useRef<PlaybackState>('idle');\n const frameRef = useRef(0);\n const lastFrameTimeRef = useRef(0);\n const speedRef = useRef(options.speed ?? 1.0);\n const wasPausedRef = useRef(false);\n\n // Stable ref to trajectory to avoid stale closures in useBeforePhysicsStep\n const trajectoryRef = useRef(trajectory);\n trajectoryRef.current = trajectory;\n\n const setState = useCallback((next: PlaybackState) => {\n if (stateRef.current === next) return;\n stateRef.current = next;\n optionsRef.current.onStateChange?.(next);\n }, []);\n\n const play = useCallback(() => {\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n const mode = optionsRef.current.mode ?? 'kinematic';\n\n if (stateRef.current === 'completed') {\n frameRef.current = 0;\n }\n\n if (mode === 'kinematic') {\n wasPausedRef.current = pausedRef.current;\n pausedRef.current = true;\n }\n\n lastFrameTimeRef.current = performance.now();\n setState('playing');\n }, [pausedRef, setState]);\n\n const pause = useCallback(() => {\n if (stateRef.current !== 'playing') return;\n setState('paused');\n }, [setState]);\n\n const seek = useCallback((frameIdx: number) => {\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n frameRef.current = Math.max(0, Math.min(frameIdx, traj.length - 1));\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = getQpos(traj, frameRef.current);\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n }, [mjModelRef, mjDataRef, mujocoRef]);\n\n const reset = useCallback(() => {\n const mode = optionsRef.current.mode ?? 'kinematic';\n if (mode === 'kinematic' && stateRef.current !== 'idle') {\n pausedRef.current = wasPausedRef.current;\n }\n frameRef.current = 0;\n setState('idle');\n }, [pausedRef, setState]);\n\n const setSpeed = useCallback((s: number) => {\n speedRef.current = s;\n }, []);\n\n const complete = useCallback(() => {\n const mode = optionsRef.current.mode ?? 'kinematic';\n if (mode === 'kinematic') {\n pausedRef.current = wasPausedRef.current;\n }\n setState('completed');\n optionsRef.current.onComplete?.();\n }, [pausedRef, setState]);\n\n // --- Kinematic mode: drive qpos directly from useFrame ---\n useFrame(() => {\n if (stateRef.current !== 'playing') return;\n if ((optionsRef.current.mode ?? 'kinematic') !== 'kinematic') return;\n\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n const now = performance.now();\n const fps = optionsRef.current.fps ?? 30;\n const frameInterval = 1000 / (fps * speedRef.current);\n const elapsed = now - lastFrameTimeRef.current;\n\n if (elapsed < frameInterval) return;\n lastFrameTimeRef.current = now;\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = getQpos(traj, frameRef.current);\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n\n frameRef.current++;\n if (frameRef.current >= traj.length) {\n if (optionsRef.current.loop) {\n frameRef.current = 0;\n } else {\n complete();\n }\n }\n });\n\n // --- Physics mode: set ctrl values each physics step ---\n useBeforePhysicsStep((model, data) => {\n if (stateRef.current !== 'playing') return;\n if ((optionsRef.current.mode ?? 'kinematic') !== 'physics') return;\n\n const traj = trajectoryRef.current;\n if (traj.length === 0) return;\n\n // Advance frame based on sim time vs trajectory time\n const fps = optionsRef.current.fps ?? 30;\n const targetFrame = Math.floor(data.time * fps * speedRef.current);\n frameRef.current = Math.min(targetFrame, traj.length - 1);\n\n // Apply ctrl from trajectory\n const ctrl = getCtrl(traj, frameRef.current);\n if (ctrl) {\n for (let i = 0; i < Math.min(ctrl.length, model.nu); i++) {\n data.ctrl[i] = ctrl[i];\n }\n }\n\n // Check completion\n if (frameRef.current >= traj.length - 1) {\n if (optionsRef.current.loop) {\n // Reset sim time to restart\n data.time = 0;\n frameRef.current = 0;\n } else {\n complete();\n }\n }\n });\n\n return {\n play,\n pause,\n seek,\n reset,\n setSpeed,\n get state() { return stateRef.current; },\n get frame() { return frameRef.current; },\n get playing() { return stateRef.current === 'playing'; },\n get totalFrames() { return trajectory.length; },\n get progress() { return trajectory.length > 1 ? frameRef.current / (trajectory.length - 1) : 0; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TrajectoryPlayer — component form of trajectory playback (spec 13.2)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useTrajectoryPlayer } from '../hooks/useTrajectoryPlayer';\nimport type { TrajectoryPlayerProps } from '../types';\n\n/**\n * Component wrapper for useTrajectoryPlayer.\n * Provides declarative trajectory playback controlled via props.\n */\nexport function TrajectoryPlayer({\n trajectory,\n fps = 30,\n speed = 1.0,\n loop = false,\n playing = false,\n mode = 'kinematic',\n onFrame,\n onComplete,\n onStateChange,\n}: TrajectoryPlayerProps) {\n const player = useTrajectoryPlayer(trajectory, {\n fps,\n speed,\n loop,\n mode,\n onComplete,\n onStateChange,\n });\n const onFrameRef = useRef(onFrame);\n onFrameRef.current = onFrame;\n const lastReportedFrameRef = useRef(-1);\n\n useEffect(() => {\n player.setSpeed(speed);\n }, [speed, player]);\n\n useEffect(() => {\n if (playing) {\n player.play();\n } else {\n player.pause();\n }\n }, [playing, player]);\n\n useFrame(() => {\n if (!onFrameRef.current) return;\n const currentFrame = player.frame;\n if (currentFrame !== lastReportedFrameRef.current && player.playing) {\n lastReportedFrameRef.current = currentFrame;\n onFrameRef.current(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 { useMujocoContext } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { ActuatorInfo } from '../types';\n\n/**\n * Returns a stable array of actuator metadata for building control UIs.\n * Computed once when the model loads. Consumer reads/writes data.ctrl[id] directly.\n */\nexport function useActuators(): ActuatorInfo[] {\n const { mjModelRef, status } = useMujocoContext();\n\n return useMemo(() => {\n if (status !== 'ready') return [];\n const model = mjModelRef.current;\n if (!model) return [];\n\n const actuators: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const name = getName(model, model.name_actuatoradr[i]);\n const lo = model.actuator_ctrlrange[i * 2];\n const hi = model.actuator_ctrlrange[i * 2 + 1];\n const hasRange = lo < hi;\n const range: [number, number] = hasRange\n ? [lo, hi]\n : [-Infinity, Infinity];\n actuators.push({ id: i, name, range });\n }\n return actuators;\n }, [status, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { Sites, SitePositionResult } from '../types';\n\n// Preallocated temp for rotation matrix extraction\nconst _mat4 = new THREE.Matrix4();\n\n/**\n * Returns reactive refs for a MuJoCo site's world position and orientation.\n * Refs are updated every frame without triggering React re-renders.\n */\nexport function useSitePosition(siteName: Sites): SitePositionResult {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const siteIdRef = useRef(-1);\n const positionRef = useRef(new THREE.Vector3());\n const quaternionRef = useRef(new THREE.Quaternion());\n\n // Resolve site ID when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n siteIdRef.current = -1;\n return;\n }\n siteIdRef.current = findSiteByName(model, siteName);\n }, [siteName, status, mjModelRef]);\n\n // Update refs every frame\n useFrame(() => {\n const data = mjDataRef.current;\n const sid = siteIdRef.current;\n if (!data || sid < 0) return;\n\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n positionRef.current.set(\n data.site_xpos[i3],\n data.site_xpos[i3 + 1],\n data.site_xpos[i3 + 2]\n );\n\n const m = data.site_xmat;\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n quaternionRef.current.setFromRotationMatrix(_mat4);\n });\n\n return { position: positionRef, quaternion: quaternionRef };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useBeforePhysicsStep } from '../core/MujocoSimProvider';\n\n/**\n * Applies gravity compensation each physics frame by adding qfrc_bias\n * (gravity + Coriolis forces) to qfrc_applied for each DOF.\n *\n * The provider zeros qfrc_applied at the start of each frame, so this\n * hook (and DragInteraction) compose correctly — both add to a clean slate.\n */\nexport function useGravityCompensation(enabled = true): void {\n useBeforePhysicsStep((model, data) => {\n if (!enabled) return;\n for (let i = 0; i < model.nv; i++) {\n data.qfrc_applied[i] += data.qfrc_bias[i];\n }\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useSensor / useSensors — MuJoCo sensor access hooks (spec 2.1)\n */\n\nimport { useEffect, useRef, useMemo } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { Sensors, SensorHandle, SensorInfo } from '../types';\n\n/**\n * Access a single MuJoCo sensor by name. Returns a `SensorHandle` with\n * `read()`, `dim`, and `name`. The backing array is updated every physics\n * frame without causing React re-renders.\n */\nexport function useSensor(name: Sensors): SensorHandle {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const sensorIdRef = useRef(-1);\n const sensorAdrRef = useRef(0);\n const sensorDimRef = useRef(0);\n const valueRef = useRef<Float64Array>(new Float64Array(0));\n\n // Resolve sensor ID once model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n for (let i = 0; i < model.nsensor; i++) {\n if (getName(model, model.name_sensoradr[i]) === name) {\n sensorIdRef.current = i;\n sensorAdrRef.current = model.sensor_adr[i];\n sensorDimRef.current = model.sensor_dim[i];\n valueRef.current = new Float64Array(model.sensor_dim[i]);\n return;\n }\n }\n sensorIdRef.current = -1;\n }, [name, status, mjModelRef]);\n\n // Update every frame after physics step\n useAfterPhysicsStep((_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 useMemo<SensorHandle>(() => ({\n read() {\n return valueRef.current;\n },\n get dim() {\n return sensorDimRef.current;\n },\n name,\n }), [name]);\n}\n\n/**\n * Enumerate all sensors in the loaded MuJoCo model.\n * Returns a stable array recomputed only when the model changes.\n */\nexport function useSensors(): SensorInfo[] {\n const { mjModelRef, status } = useMujocoContext();\n\n return useMemo(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return [];\n const SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'jointpos', 9: 'jointvel', 10: 'tendonpos', 11: 'tendonvel',\n 12: 'actuatorpos', 13: 'actuatorvel', 14: 'actuatorfrc',\n };\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, [mjModelRef, status]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useJointState — per-joint position/velocity access (spec 2.3)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { Joints, 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: Joints): JointStateResult {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const jointIdRef = useRef(-1);\n const qposAdrRef = useRef(0);\n const dofAdrRef = useRef(0);\n const qposDimRef = useRef(1);\n const dofDimRef = useRef(1);\n const 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 { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { Bodies, BodyStateResult } from '../types';\n\n/**\n * Track a MuJoCo body's world position, quaternion, and velocities.\n * All values are ref-based — updated every physics frame without re-renders.\n */\nexport function useBodyState(name: Bodies): BodyStateResult {\n const { mjModelRef, status } = useMujocoContext();\n const bodyIdRef = useRef(-1);\n const position = useRef(new THREE.Vector3());\n const quaternion = useRef(new THREE.Quaternion());\n const linearVelocity = useRef(new THREE.Vector3());\n const angularVelocity = useRef(new THREE.Vector3());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n bodyIdRef.current = findBodyByName(model, name);\n }, [name, status, mjModelRef]);\n\n useAfterPhysicsStep((_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 — handle-based read/write access to a named actuator's ctrl value (spec 3.1)\n */\n\nimport { useEffect, useRef, useMemo } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport type { Actuators, CtrlHandle } from '../types';\n\n/**\n * Access a single actuator's control value by name.\n *\n * Returns a `CtrlHandle` with `read()` and `write()` methods that\n * operate directly on `data.ctrl` without causing React re-renders.\n */\nexport function useCtrl(name: Actuators): CtrlHandle {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const actuatorIdRef = useRef(-1);\n const rangeRef = useRef<[number, number]>([0, 0]);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n const id = findActuatorByName(model, name);\n actuatorIdRef.current = id;\n if (id >= 0) {\n rangeRef.current = [\n model.actuator_ctrlrange[id * 2],\n model.actuator_ctrlrange[id * 2 + 1],\n ];\n }\n }, [name, status, mjModelRef]);\n\n return useMemo<CtrlHandle>(() => ({\n read() {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return 0;\n return data.ctrl[actuatorIdRef.current];\n },\n write(value: number) {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return;\n data.ctrl[actuatorIdRef.current] = value;\n },\n name,\n get range(): [number, number] {\n return rangeRef.current;\n },\n }), [name, mjDataRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useKeyboardTeleop — keyboard teleoperation hook (spec 12.1)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\nimport type { KeyboardTeleopConfig } from '../types';\n\n/**\n * Map keyboard keys to actuator commands.\n *\n * Supports three binding modes:\n * - `delta`: Add delta to actuator value while key is held\n * - `toggle`: Toggle between two values on key press\n * - `set`: Set actuator to a fixed value while key is held\n */\nexport function useKeyboardTeleop(config: KeyboardTeleopConfig) {\n const { mjModelRef, mjDataRef, status } = useMujocoContext();\n const pressedRef = useRef(new Set<string>());\n const toggleStateRef = useRef(new Map<string, boolean>());\n const enabledRef = useRef(config.enabled ?? true);\n enabledRef.current = config.enabled ?? true;\n\n // Resolve actuator IDs\n const bindingsRef = useRef(config.bindings);\n bindingsRef.current = config.bindings;\n\n // Actuator ID cache\n const actuatorCacheRef = useRef(new Map<string, number>());\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n const cache = new Map<string, number>();\n for (const binding of Object.values(config.bindings)) {\n if (!cache.has(binding.actuator)) {\n cache.set(binding.actuator, findActuatorByName(model, binding.actuator));\n }\n }\n actuatorCacheRef.current = cache;\n }, [config.bindings, status, mjModelRef]);\n\n // Key event listeners\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (!enabledRef.current) return;\n const key = e.key.toLowerCase();\n if (bindingsRef.current[key]) {\n pressedRef.current.add(key);\n // Handle toggle on keydown\n const binding = bindingsRef.current[key];\n if (binding.toggle) {\n const current = toggleStateRef.current.get(key) ?? false;\n toggleStateRef.current.set(key, !current);\n }\n }\n };\n const onKeyUp = (e: KeyboardEvent) => {\n pressedRef.current.delete(e.key.toLowerCase());\n };\n window.addEventListener('keydown', onKeyDown);\n window.addEventListener('keyup', onKeyUp);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('keyup', onKeyUp);\n };\n }, []);\n\n // Apply bindings each physics frame\n useBeforePhysicsStep((_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 { useMujocoContext, 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 } = useMujocoContext();\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\nimport { useMemo, useRef } from 'react';\nimport { useMujocoContext } from '../core/MujocoSimProvider';\nimport { buildObservation } from '../core/ObservationBuilder';\nimport type { ObservationConfig, ObservationHandle, ObservationResult } from '../types';\n\nconst EMPTY_OBSERVATION: ObservationResult = {\n values: new Float32Array(0),\n layout: [],\n};\n\n/**\n * Live observation reader for policy loops and telemetry.\n *\n * The handle is stable; call `read()` inside callbacks to sample the latest\n * MuJoCo model/data state without forcing React renders.\n */\nexport function useObservation(config: ObservationConfig): ObservationHandle {\n const { mjModelRef, mjDataRef } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n\n return useMemo(() => ({\n read() {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return EMPTY_OBSERVATION;\n return buildObservation(model, data, configRef.current);\n },\n readValues() {\n return this.read().values;\n },\n }), [mjDataRef, mjModelRef]);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryRecorder — trajectory recording hook (spec 13.1)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useMujocoContext, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport type { TrajectoryFrame } from '../types';\n\ninterface RecorderOptions {\n fields?: ('qpos' | 'qvel' | 'ctrl' | 'sensordata')[];\n}\n\n/**\n * Record simulation trajectories for analysis, replay, or training data.\n */\nexport function useTrajectoryRecorder(options: RecorderOptions = {}) {\n const { mjModelRef } = useMujocoContext();\n const recordingRef = useRef(false);\n const framesRef = useRef<TrajectoryFrame[]>([]);\n const fields = options.fields ?? ['qpos'];\n\n useAfterPhysicsStep((_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 { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\n\ninterface GamepadConfig {\n /** Map gamepad axis index to actuator name. */\n axes?: Record<number, string>;\n /** Map gamepad button index to actuator name. */\n buttons?: Record<number, string>;\n /** Axis deadzone. Default: 0.1. */\n deadzone?: number;\n /** Scale factor for axis values. Default: 1.0. */\n scale?: number;\n /** Gamepad index. Default: 0 (first connected). */\n gamepadIndex?: number;\n enabled?: boolean;\n}\n\n/**\n * Map gamepad axes and buttons to actuator controls.\n * Axes map their -1..1 value (scaled) to the actuator.\n * Buttons map their 0..1 pressed value to the actuator.\n */\nexport function useGamepad(config: GamepadConfig) {\n const { mjModelRef, status } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n\n // Cache actuator IDs\n const axisCacheRef = useRef(new Map<number, number>());\n const buttonCacheRef = useRef(new Map<number, number>());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n axisCacheRef.current.clear();\n buttonCacheRef.current.clear();\n for (const [idx, name] of Object.entries(config.axes ?? {})) {\n axisCacheRef.current.set(Number(idx), findActuatorByName(model, name));\n }\n for (const [idx, name] of Object.entries(config.buttons ?? {})) {\n buttonCacheRef.current.set(Number(idx), findActuatorByName(model, name));\n }\n }, [config.axes, config.buttons, status, mjModelRef]);\n\n useBeforePhysicsStep((_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 { useMujocoContext, useBeforePhysicsStep } from '../core/MujocoSimProvider';\n\ninterface CtrlNoiseConfig {\n /** Exponential filter rate (0-1). Higher = faster noise changes. Default: 0.01. */\n rate?: number;\n /** Standard deviation of Gaussian noise. Default: 0.05. */\n std?: number;\n /** Enable/disable. Default: true. */\n enabled?: boolean;\n}\n\n/**\n * Apply Gaussian noise with exponential filtering to all ctrl values.\n * Useful for robustness testing and domain randomization.\n *\n * noise[i] = (1 - rate) * noise[i] + rate * N(0, std)\n * data.ctrl[i] += noise[i]\n */\nexport function useCtrlNoise(config: CtrlNoiseConfig = {}) {\n const { mjModelRef } = useMujocoContext();\n const configRef = useRef(config);\n configRef.current = config;\n const noiseRef = useRef<Float64Array | null>(null);\n\n useBeforePhysicsStep((_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"]}