mujoco-react 0.1.0 → 0.2.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/core/GenericIK.ts","../src/core/SceneLoader.ts","../src/core/MujocoSimProvider.tsx","../src/core/MujocoCanvas.tsx","../src/rendering/CapsuleGeometry.ts","../src/rendering/Reflector.ts","../src/rendering/GeomBuilder.ts","../src/components/SceneRenderer.tsx","../src/components/IkGizmo.tsx","../src/components/ContactMarkers.tsx","../src/components/DragInteraction.tsx","../src/components/SceneLights.tsx","../src/components/Debug.tsx","../src/components/TendonRenderer.tsx","../src/components/FlexRenderer.tsx","../src/hooks/useContacts.ts","../src/components/ContactListener.tsx","../src/hooks/useTrajectoryPlayer.ts","../src/components/TrajectoryPlayer.tsx","../src/components/SelectionHighlight.tsx","../src/hooks/useActuators.ts","../src/hooks/useSitePosition.ts","../src/hooks/useGravityCompensation.ts","../src/hooks/useSensor.ts","../src/hooks/useJointState.ts","../src/hooks/useBodyState.ts","../src/hooks/useCtrl.ts","../src/hooks/useKeyboardTeleop.ts","../src/hooks/usePolicy.ts","../src/hooks/useTrajectoryRecorder.ts","../src/hooks/useGamepad.ts","../src/hooks/useVideoRecorder.ts","../src/hooks/useCtrlNoise.ts"],"names":["s","tmp","createContext","useContext","useRef","useEffect","useState","jsx","MujocoCanvas","THREE2","THREE3","THREE4","useMemo","THREE5","useFrame","THREE6","useThree","THREE7","THREE8","THREE9","THREE10","jsxs","THREE11","THREE12","useCallback","THREE13","_mat4","THREE14","SENSOR_TYPE_NAMES","THREE15"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport loadMujoco from 'mujoco-js';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport { MujocoModule, MujocoContextValue } from '../types';\n\nconst MujocoContext = createContext<MujocoContextValue>({\n mujoco: null,\n status: 'loading',\n error: null,\n});\n\n/**\n * Hook to access the MuJoCo WASM module.\n */\nexport function useMujoco(): MujocoContextValue {\n return useContext(MujocoContext);\n}\n\ninterface MujocoProviderProps {\n wasmUrl?: string;\n children: React.ReactNode;\n onError?: (error: Error) => void;\n}\n\n/**\n * MujocoProvider — WASM / module lifecycle.\n * Loads the MuJoCo WASM module on mount and provides it to children via context.\n */\nexport function MujocoProvider({ wasmUrl, children, onError }: MujocoProviderProps) {\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n const [error, setError] = useState<string | null>(null);\n const moduleRef = useRef<MujocoModule | null>(null);\n const isMounted = useRef(true);\n\n useEffect(() => {\n isMounted.current = true;\n\n loadMujoco({\n ...(wasmUrl ? { locateFile: (path: string) => path.endsWith('.wasm') ? wasmUrl : path } : {}),\n printErr: (text: string) => {\n if (text.includes('Aborted') && isMounted.current) {\n setError('Simulation crashed. Reload page.');\n setStatus('error');\n }\n },\n })\n .then((inst: unknown) => {\n if (isMounted.current) {\n moduleRef.current = inst as MujocoModule;\n setStatus('ready');\n }\n })\n .catch((err: Error) => {\n if (isMounted.current) {\n const msg = err.message || 'Failed to init spatial simulation';\n setError(msg);\n setStatus('error');\n onError?.(new Error(msg));\n }\n });\n\n return () => {\n isMounted.current = false;\n };\n }, [wasmUrl]);\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 * as THREE from 'three';\nimport { MujocoModule, MujocoModel, MujocoData } from '../types';\n\nexport interface GenericIKOptions {\n maxIterations: number;\n damping: number;\n tolerance: number;\n epsilon: number;\n posWeight: number;\n rotWeight: number;\n}\n\nconst DEFAULTS: GenericIKOptions = {\n maxIterations: 50,\n damping: 0.01,\n tolerance: 1e-3,\n epsilon: 1e-6,\n posWeight: 1.0,\n rotWeight: 0.3,\n};\n\n/**\n * Generic Damped Least-Squares IK solver.\n * Uses finite-difference Jacobian via MuJoCo's mj_forward.\n * Works for any MuJoCo model — no robot-specific parameters.\n */\nexport class GenericIK {\n private mujoco: MujocoModule;\n\n constructor(mujoco: MujocoModule) {\n this.mujoco = mujoco;\n }\n\n /**\n * Solve IK for a target 6-DOF pose.\n * @param model MuJoCo model\n * @param data MuJoCo data (qpos will be temporarily modified, then restored)\n * @param siteId Index of the end-effector site to control\n * @param numJoints Number of arm joints (assumes qpos[0..numJoints-1])\n * @param targetPos Target position in world frame\n * @param targetQuat Target orientation in world frame\n * @param currentQ Current joint angles (length = numJoints)\n * @param opts Optional solver parameters\n * @returns Joint angles array, or null if solver diverged\n */\n solve(\n model: MujocoModel,\n data: MujocoData,\n siteId: number,\n numJoints: number,\n targetPos: THREE.Vector3,\n targetQuat: THREE.Quaternion,\n currentQ: number[],\n opts?: Partial<GenericIKOptions>\n ): number[] | null {\n const o = { ...DEFAULTS, ...opts };\n const n = numJoints;\n\n // Save full qpos so we can restore after solving\n const savedQpos = new Float64Array(data.qpos.length);\n savedQpos.set(data.qpos);\n\n // Build target rotation matrix (3x3 row-major)\n const R_target = quatToMat3(targetQuat);\n\n // Working joint angles — start from current configuration\n const q = new Float64Array(n);\n for (let i = 0; i < n; i++) q[i] = currentQ[i];\n\n // Pre-allocate work arrays\n const J = new Float64Array(6 * n); // 6×n Jacobian (row-major)\n const JJt = new Float64Array(36); // 6×6\n const rhs = new Float64Array(6); // right-hand side\n const x = new Float64Array(6); // solve result\n const dq = new Float64Array(n); // joint update\n const baseSitePos = new Float64Array(3);\n const baseSiteMat = new Float64Array(9);\n const pertSitePos = new Float64Array(3);\n const pertSiteMat = new Float64Array(9);\n\n let bestQ: number[] | null = null;\n let bestErr = Infinity;\n\n for (let iter = 0; iter < o.maxIterations; iter++) {\n // Set joints and run FK\n for (let i = 0; i < n; i++) data.qpos[i] = q[i];\n this.mujoco.mj_forward(model, data);\n\n // Read current site pose\n const sp = data.site_xpos;\n const sm = data.site_xmat;\n const off3 = siteId * 3;\n const off9 = siteId * 9;\n for (let i = 0; i < 3; i++) baseSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) baseSiteMat[i] = sm[off9 + i];\n\n // Compute 6D error\n const posErr0 = targetPos.x - baseSitePos[0];\n const posErr1 = targetPos.y - baseSitePos[1];\n const posErr2 = targetPos.z - baseSitePos[2];\n const rotErr = orientationError(baseSiteMat, R_target);\n\n const error = [\n posErr0 * o.posWeight,\n posErr1 * o.posWeight,\n posErr2 * o.posWeight,\n rotErr[0] * o.rotWeight,\n rotErr[1] * o.rotWeight,\n rotErr[2] * o.rotWeight,\n ];\n\n const errNorm = Math.sqrt(\n error[0] * error[0] + error[1] * error[1] + error[2] * error[2] +\n error[3] * error[3] + error[4] * error[4] + error[5] * error[5]\n );\n\n // Track best solution\n if (errNorm < bestErr) {\n bestErr = errNorm;\n bestQ = Array.from(q);\n }\n\n // Converged\n if (errNorm < o.tolerance) break;\n\n // Compute Jacobian via finite differences\n for (let j = 0; j < n; j++) {\n const saved = data.qpos[j];\n data.qpos[j] = q[j] + o.epsilon;\n this.mujoco.mj_forward(model, data);\n\n for (let i = 0; i < 3; i++) pertSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) pertSiteMat[i] = sm[off9 + i];\n\n // Position Jacobian columns (rows 0-2)\n J[0 * n + j] = ((pertSitePos[0] - baseSitePos[0]) / o.epsilon) * o.posWeight;\n J[1 * n + j] = ((pertSitePos[1] - baseSitePos[1]) / o.epsilon) * o.posWeight;\n J[2 * n + j] = ((pertSitePos[2] - baseSitePos[2]) / o.epsilon) * o.posWeight;\n\n // Orientation Jacobian columns (rows 3-5)\n // δR = R_perturbed * R_base^T, then extract angular velocity\n const dRot = angularDelta(baseSiteMat, pertSiteMat);\n J[3 * n + j] = (dRot[0] / o.epsilon) * o.rotWeight;\n J[4 * n + j] = (dRot[1] / o.epsilon) * o.rotWeight;\n J[5 * n + j] = (dRot[2] / o.epsilon) * o.rotWeight;\n\n // Restore joint\n data.qpos[j] = saved;\n }\n\n // Restore base FK state for next iteration\n for (let i = 0; i < n; i++) data.qpos[i] = q[i];\n\n // Damped least squares: Δq = Jᵀ (J Jᵀ + λI)⁻¹ error\n // 1. Compute JJᵀ (6×6)\n for (let r = 0; r < 6; r++) {\n for (let c = 0; c < 6; c++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += J[r * n + k] * J[c * n + k];\n }\n JJt[r * 6 + c] = sum + (r === c ? o.damping : 0);\n }\n }\n\n // 2. Solve (JJᵀ + λI) x = error\n for (let i = 0; i < 6; i++) rhs[i] = error[i];\n solve6x6(JJt, rhs, x);\n\n // 3. Δq = Jᵀ x\n for (let j = 0; j < n; j++) {\n let sum = 0;\n for (let r = 0; r < 6; r++) {\n sum += J[r * n + j] * x[r];\n }\n dq[j] = sum;\n }\n\n // Update joints\n for (let i = 0; i < n; i++) q[i] += dq[i];\n }\n\n // Restore original qpos\n data.qpos.set(savedQpos);\n this.mujoco.mj_forward(model, data);\n\n return bestQ;\n }\n}\n\n// --- Math utilities ---\n\n/** Convert THREE.Quaternion to 3x3 rotation matrix (row-major Float64Array) */\nfunction quatToMat3(q: THREE.Quaternion): Float64Array {\n const m = new Float64Array(9);\n const x = q.x, y = q.y, z = q.z, w = q.w;\n const xx = x * x, yy = y * y, zz = z * z;\n const xy = x * y, xz = x * z, yz = y * z;\n const wx = w * x, wy = w * y, wz = w * z;\n m[0] = 1 - 2 * (yy + zz); m[1] = 2 * (xy - wz); m[2] = 2 * (xz + wy);\n m[3] = 2 * (xy + wz); m[4] = 1 - 2 * (xx + zz); m[5] = 2 * (yz - wx);\n m[6] = 2 * (xz - wy); m[7] = 2 * (yz + wx); m[8] = 1 - 2 * (xx + yy);\n return m;\n}\n\n/**\n * Compute orientation error between current and target rotation matrices.\n * Returns the axis-angle vector (log map of R_target * R_current^T).\n * Uses the small-angle approximation: error ≈ 0.5 * [R32-R23, R13-R31, R21-R12]\n * where R = R_target * R_current^T.\n */\nfunction orientationError(R_cur: Float64Array, R_tgt: Float64Array): [number, number, number] {\n // R_err = R_tgt * R_cur^T (both row-major 3x3)\n // R_err[i][j] = sum_k R_tgt[i][k] * R_cur[j][k] (note: transposing R_cur)\n const Re = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_tgt[i * 3 + k] * R_cur[j * 3 + k];\n }\n Re[i * 3 + j] = s;\n }\n }\n\n // Extract axis-angle from rotation matrix\n // For better accuracy than small-angle approx, use full log map\n const trace = Re[0] + Re[4] + Re[8];\n const cosAngle = Math.max(-1, Math.min(1, (trace - 1) * 0.5));\n const angle = Math.acos(cosAngle);\n\n // Near zero rotation — use small-angle approximation\n if (angle < 1e-6) {\n return [0, 0, 0];\n }\n\n // Near π — degenerate, use small-angle approx of the skew-symmetric part\n if (angle > Math.PI - 1e-6) {\n return [\n 0.5 * (Re[7] - Re[5]),\n 0.5 * (Re[2] - Re[6]),\n 0.5 * (Re[3] - Re[1]),\n ];\n }\n\n // General case: axis = skew(R_err) / (2 sin(angle)), scaled by angle\n const s = angle / (2 * Math.sin(angle));\n return [\n s * (Re[7] - Re[5]),\n s * (Re[2] - Re[6]),\n s * (Re[3] - Re[1]),\n ];\n}\n\n/**\n * Compute angular velocity vector from R_base to R_perturbed.\n * Returns the axis-angle of R_perturbed * R_base^T.\n * (Small angle: the rotation caused by the perturbation.)\n */\nfunction angularDelta(R_base: Float64Array, R_pert: Float64Array): [number, number, number] {\n // δR = R_pert * R_base^T\n // Small angle approx: ω ≈ 0.5 * [δR[7]-δR[5], δR[2]-δR[6], δR[3]-δR[1]]\n // This is fine because the perturbation epsilon is tiny.\n const dR = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_pert[i * 3 + k] * R_base[j * 3 + k];\n }\n dR[i * 3 + j] = s;\n }\n }\n return [\n 0.5 * (dR[7] - dR[5]),\n 0.5 * (dR[2] - dR[6]),\n 0.5 * (dR[3] - dR[1]),\n ];\n}\n\n/**\n * Solve 6×6 linear system Ax = b via Gaussian elimination with partial pivoting.\n * Modifies A and b in place. Result written to x.\n */\nfunction solve6x6(A: Float64Array, b: Float64Array, x: Float64Array): void {\n const N = 6;\n // Work on copies to avoid destroying originals needed elsewhere\n const a = new Float64Array(A);\n const r = new Float64Array(b);\n\n // Forward elimination with partial pivoting\n for (let col = 0; col < N; col++) {\n // Find pivot\n let maxVal = Math.abs(a[col * N + col]);\n let maxRow = col;\n for (let row = col + 1; row < N; row++) {\n const val = Math.abs(a[row * N + col]);\n if (val > maxVal) { maxVal = val; maxRow = row; }\n }\n\n // Swap rows\n if (maxRow !== col) {\n for (let k = 0; k < N; k++) {\n const tmp = a[col * N + k]; a[col * N + k] = a[maxRow * N + k]; a[maxRow * N + k] = tmp;\n }\n const tmp = r[col]; r[col] = r[maxRow]; r[maxRow] = tmp;\n }\n\n const pivot = a[col * N + col];\n if (Math.abs(pivot) < 1e-12) {\n // Singular — return zeros\n x.fill(0);\n return;\n }\n\n // Eliminate below\n for (let row = col + 1; row < N; row++) {\n const factor = a[row * N + col] / pivot;\n for (let k = col; k < N; k++) {\n a[row * N + k] -= factor * a[col * N + k];\n }\n r[row] -= factor * r[col];\n }\n }\n\n // Back substitution\n for (let row = N - 1; row >= 0; row--) {\n let sum = r[row];\n for (let k = row + 1; k < N; k++) {\n sum -= a[row * N + k] * x[k];\n }\n x[row] = sum / a[row * N + row];\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MujocoData, MujocoModel, MujocoModule } from '../types';\nimport { SceneConfig, SceneObject, XmlPatch } from '../types';\n\n/**\n * Reads a null-terminated C string from MuJoCo's WASM memory.\n */\nexport function getName(mjModel: MujocoModel, address: number): string {\n let name = '';\n let idx = address;\n let safety = 0;\n while (mjModel.names[idx] !== 0 && safety < 100) {\n name += String.fromCharCode(mjModel.names[idx++]);\n safety++;\n }\n return name;\n}\n\n/**\n * Find a site by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSiteByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsite; i++) {\n if (getName(mjModel, mjModel.name_siteadr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find an actuator by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findActuatorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nu; i++) {\n if (getName(mjModel, mjModel.name_actuatoradr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find a keyframe by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findKeyframeByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nkey; i++) {\n if (getName(mjModel, mjModel.name_keyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a body by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findBodyByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nbody; i++) {\n if (getName(mjModel, mjModel.name_bodyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a joint by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findJointByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.njnt; i++) {\n if (getName(mjModel, mjModel.name_jntadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a geom by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findGeomByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.ngeom; i++) {\n if (getName(mjModel, mjModel.name_geomadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a sensor by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSensorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsensor; i++) {\n if (getName(mjModel, mjModel.name_sensoradr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a tendon by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findTendonByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < (mjModel.ntendon ?? 0); i++) {\n if (getName(mjModel, mjModel.name_tendonadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Convert a SceneObject config to MuJoCo XML.\n */\nfunction sceneObjectToXml(obj: SceneObject): string {\n const joint = obj.freejoint ? '<freejoint/>' : '';\n const pos = obj.position.map((v) => v.toFixed(3)).join(' ');\n const size = obj.size.map((v) => v.toFixed(3)).join(' ');\n const rgba = obj.rgba.join(' ');\n const mass = obj.mass ? ` mass=\"${obj.mass}\"` : '';\n const friction = obj.friction ? ` friction=\"${obj.friction}\"` : '';\n const solref = obj.solref ? ` solref=\"${obj.solref}\"` : '';\n const solimp = obj.solimp ? ` solimp=\"${obj.solimp}\"` : '';\n const condim = obj.condim ? ` condim=\"${obj.condim}\"` : '';\n // Always set contype/conaffinity=1 so objects collide regardless of model defaults\n return `<body name=\"${obj.name}\" pos=\"${pos}\">${joint}<geom type=\"${obj.type}\" size=\"${size}\" rgba=\"${rgba}\" contype=\"1\" conaffinity=\"1\"${mass}${friction}${solref}${solimp}${condim}/></body>`;\n}\n\ninterface LoadResult {\n mjModel: MujocoModel;\n mjData: MujocoData;\n siteId: number;\n gripperId: number;\n}\n\n/**\n * Config-driven scene loader — replaces the old RobotLoader + patchSingleRobot approach.\n */\nexport async function loadScene(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n // 1. Clean up virtual filesystem\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const baseUrl =\n config.baseUrl ||\n `https://raw.githubusercontent.com/google-deepmind/mujoco_menagerie/main/${config.robotId}/`;\n\n const downloaded = new Set<string>();\n const queue: string[] = [config.sceneFile];\n const parser = new DOMParser();\n\n // 2. Download all model files\n while (queue.length > 0) {\n const fname = queue.shift()!;\n if (downloaded.has(fname)) continue;\n downloaded.add(fname);\n\n onProgress?.(`Downloading ${fname}...`);\n\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n continue;\n }\n\n // Create virtual directory structure\n const dirParts = fname.split('/');\n dirParts.pop();\n let currentPath = '/working';\n for (const part of dirParts) {\n currentPath += '/' + part;\n try { mujoco.FS.mkdir(currentPath); } catch { /* ignore */ }\n }\n\n if (fname.endsWith('.xml')) {\n let text = await res.text();\n\n // 3. Apply XML patches from config\n for (const patch of config.xmlPatches ?? []) {\n if (fname.endsWith(patch.target) || fname === patch.target) {\n if (patch.replace) {\n text = text.replace(patch.replace[0], patch.replace[1]);\n }\n if (patch.inject && patch.injectAfter) {\n const idx = text.indexOf(patch.injectAfter);\n if (idx !== -1) {\n // Find the end of the opening tag (next '>') after the match\n const tagEnd = text.indexOf('>', idx + patch.injectAfter.length);\n if (tagEnd !== -1) {\n text = text.slice(0, tagEnd + 1) + patch.inject + text.slice(tagEnd + 1);\n }\n }\n }\n }\n }\n\n // 4. Inject scene objects into the scene file\n if (fname === config.sceneFile && config.sceneObjects?.length) {\n const xml = config.sceneObjects.map((obj) => sceneObjectToXml(obj)).join('');\n text = text.replace('</worldbody>', xml + '</worldbody>');\n }\n\n mujoco.FS.writeFile(`/working/${fname}`, text);\n scanDependencies(text, fname, parser, downloaded, queue);\n } else {\n const buffer = new Uint8Array(await res.arrayBuffer());\n mujoco.FS.writeFile(`/working/${fname}`, buffer);\n }\n }\n\n // 5. Load model\n onProgress?.('Loading model...');\n const mjModel = mujoco.MjModel.loadFromXML(`/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n\n // 6. Find TCP site and gripper actuator\n const siteId = findSiteByName(mjModel, config.tcpSiteName ?? 'tcp');\n const gripperId = findActuatorByName(mjModel, config.gripperActuatorName ?? 'gripper');\n\n // 7. Set initial pose\n if (config.homeJoints) {\n for (let i = 0; i < config.homeJoints.length; i++) {\n mjData.ctrl[i] = config.homeJoints[i];\n if (mjModel.actuator_trnid[2 * i + 1] === 1) {\n const jointId = mjModel.actuator_trnid[2 * i];\n if (jointId >= 0 && jointId < mjModel.njnt) {\n const qposAdr = mjModel.jnt_qposadr[jointId];\n mjData.qpos[qposAdr] = config.homeJoints[i];\n }\n }\n }\n }\n\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData, siteId, gripperId };\n}\n\n/**\n * Scan XML for file dependencies (meshes, textures, includes).\n */\nfunction scanDependencies(\n xmlString: string,\n currentFile: string,\n parser: DOMParser,\n downloaded: Set<string>,\n queue: string[]\n) {\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\n\n const compiler = xmlDoc.querySelector('compiler');\n const meshDir = compiler?.getAttribute('meshdir') || '';\n const textureDir = compiler?.getAttribute('texturedir') || '';\n const currentDir = currentFile.includes('/')\n ? currentFile.substring(0, currentFile.lastIndexOf('/') + 1)\n : '';\n\n xmlDoc.querySelectorAll('[file]').forEach((el) => {\n const fileAttr = el.getAttribute('file');\n if (!fileAttr) return;\n\n let prefix = '';\n if (el.tagName.toLowerCase() === 'mesh') {\n prefix = meshDir ? meshDir + '/' : '';\n } else if (['texture', 'hfield'].includes(el.tagName.toLowerCase())) {\n prefix = textureDir ? textureDir + '/' : '';\n }\n\n let fullPath = (currentDir + prefix + fileAttr).replace(/\\/\\//g, '/');\n const parts = fullPath.split('/');\n const norm: string[] = [];\n for (const p of parts) {\n if (p === '..') norm.pop();\n else if (p !== '.') norm.push(p);\n }\n fullPath = norm.join('/');\n\n if (!downloaded.has(fullPath)) queue.push(fullPath);\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, 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 } from '../types';\nimport { GenericIK } from './GenericIK';\nimport {\n ActuatorInfo,\n BodyInfo,\n ContactInfo,\n GeomInfo,\n IKSolveFn,\n JointInfo,\n ModelOptions,\n MujocoSimAPI,\n PhysicsStepCallback,\n RayHit,\n SceneConfig,\n SensorInfo,\n SiteInfo,\n StateSnapshot,\n} from '../types';\nimport {\n loadScene,\n findKeyframeByName,\n findBodyByName,\n findGeomByName,\n findSensorByName,\n findActuatorByName,\n getName,\n} from './SceneLoader';\n\n// ---- Joint type names ----\nconst JOINT_TYPE_NAMES = ['free', 'ball', 'slide', 'hinge'];\n// ---- Geom type names ----\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\n// ---- Sensor type names (subset — MuJoCo has many) ----\n// Sensor type names matching mjtSensor enum in mujoco WASM (mujoco-js 0.0.7)\nconst SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'camprojection', 9: 'jointpos', 10: 'jointvel', 11: 'tendonpos',\n 12: 'tendonvel', 13: 'actuatorpos', 14: 'actuatorvel', 15: 'actuatorfrc',\n 16: 'jointactfrc', 17: 'tendonactfrc', 18: 'ballquat', 19: 'ballangvel',\n 20: 'jointlimitpos', 21: 'jointlimitvel', 22: 'jointlimitfrc',\n 23: 'tendonlimitpos', 24: 'tendonlimitvel', 25: 'tendonlimitfrc',\n 26: 'framepos', 27: 'framequat', 28: 'framexaxis', 29: 'frameyaxis',\n 30: 'framezaxis', 31: 'framelinvel', 32: 'frameangvel',\n 33: 'framelinacc', 34: 'frameangacc', 35: 'subtreecom',\n 36: 'subtreelinvel', 37: 'subtreeangmom', 38: 'insidesite',\n 39: 'geomdist', 40: 'geomnormal', 41: 'geomfromto',\n 42: 'contact', 43: 'e_potential', 44: 'e_kinetic',\n 45: 'clock', 46: 'tactile', 47: 'plugin', 48: 'user',\n};\n\n// Preallocated force/torque temps for applyForce/applyTorque\nconst _applyForce = new Float64Array(3);\nconst _applyTorque = new Float64Array(3);\nconst _applyPoint = new Float64Array(3);\nconst _rayPnt = new Float64Array(3);\nconst _rayVec = new Float64Array(3);\nconst _rayGeomId = new Int32Array(1);\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 siteIdRef: React.RefObject<number>;\n gripperIdRef: React.RefObject<number>;\n ikEnabledRef: React.RefObject<boolean>;\n ikCalculatingRef: React.RefObject<boolean>;\n pausedRef: React.RefObject<boolean>;\n speedRef: React.RefObject<number>;\n substepsRef: React.RefObject<number>;\n ikTargetRef: React.RefObject<THREE.Group>;\n genericIkRef: React.RefObject<GenericIK>;\n ikSolveFnRef: React.RefObject<IKSolveFn>;\n firstIkEnableRef: React.RefObject<boolean>;\n gizmoAnimRef: React.RefObject<{\n active: boolean;\n startPos: THREE.Vector3;\n endPos: THREE.Vector3;\n startRot: THREE.Quaternion;\n endRot: THREE.Quaternion;\n startTime: number;\n duration: number;\n }>;\n cameraAnimRef: React.RefObject<{\n active: boolean;\n startPos: THREE.Vector3;\n endPos: THREE.Vector3;\n startRot: THREE.Quaternion;\n endRot: THREE.Quaternion;\n startTarget: THREE.Vector3;\n endTarget: THREE.Vector3;\n startTime: number;\n duration: number;\n resolve: (() => void) | null;\n }>;\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 status: 'loading' | 'ready' | 'error';\n}\n\nconst MujocoSimContext = createContext<MujocoSimContextValue | null>(null);\n\nexport function useMujocoSim(): MujocoSimContextValue {\n const ctx = useContext(MujocoSimContext);\n if (!ctx)\n throw new Error('useMujocoSim must be used inside <MujocoSimProvider>');\n return ctx;\n}\n\nexport function useBeforePhysicsStep(callback: PhysicsStepCallback) {\n const { beforeStepCallbacks } = useMujocoSim();\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 } = useMujocoSim();\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 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 (spec 1.1)\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 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 siteIdRef = useRef(-1);\n const gripperIdRef = useRef(-1);\n const ikEnabledRef = useRef(false);\n const ikCalculatingRef = useRef(false);\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 firstIkEnableRef = useRef(true);\n const stepsToRunRef = useRef(0); // for single-step mode (spec 1.2)\n\n // Interpolation state (spec 11.1)\n const prevXposRef = useRef<Float64Array | null>(null);\n const prevXquatRef = useRef<Float64Array | null>(null);\n const interpAlphaRef = 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\n configRef.current = config;\n\n // Sync declarative props to refs\n useEffect(() => { pausedRef.current = paused ?? false; }, [paused]);\n useEffect(() => { speedRef.current = speed ?? 1; }, [speed]);\n useEffect(() => { substepsRef.current = substeps ?? 1; }, [substeps]);\n useEffect(() => { interpolateRef.current = interpolate ?? false; }, [interpolate]);\n\n // Sync gravity prop (spec 1.1)\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 (spec 1.1)\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 const ikTargetRef = useRef<THREE.Group>(new THREE.Group());\n const genericIkRef = useRef<GenericIK>(new GenericIK(mujoco));\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 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 const orbitTargetRef = useRef(new THREE.Vector3(0, 0, 0));\n\n // --- Helper: sync gizmo to actual MuJoCo site position ---\n const syncGizmoToSite = useCallback((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 const m = new THREE.Matrix4().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(m);\n }, []);\n\n // IK solve function\n const ikSolveFn = useCallback(\n (pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || siteIdRef.current === -1) return null;\n return genericIkRef.current.solve(\n model, data, siteIdRef.current,\n configRef.current.numArmJoints ?? 7,\n pos, quat, currentQ\n );\n },\n []\n );\n const ikSolveFnRef = useRef<IKSolveFn>(ikSolveFn);\n ikSolveFnRef.current = ikSolveFn;\n\n // --- Load scene on mount ---\n useEffect(() => {\n let disposed = false;\n\n (async () => {\n try {\n const result = await loadScene(mujoco, config);\n if (disposed) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n siteIdRef.current = result.siteId;\n gripperIdRef.current = result.gripperId;\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 if (ikTargetRef.current) {\n syncGizmoToSite(result.mjData, result.siteId, ikTargetRef.current);\n }\n\n setStatus('ready');\n } catch (e: unknown) {\n if (!disposed) {\n setStatus('error');\n onError?.(e instanceof Error ? e : new Error(String(e)));\n }\n }\n })();\n\n return () => {\n disposed = true;\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n };\n }, [mujoco, config]);\n\n // Fire onReady when status changes to ready\n useEffect(() => {\n if (status === 'ready' && onReady) {\n onReady(apiRef.current);\n }\n }, [status]);\n\n // --- Physics step (priority -1) ---\n useFrame((state) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n // Gizmo animation\n const ga = gizmoAnimRef.current;\n const target = ikTargetRef.current;\n if (ga.active && target) {\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 // Camera animation\n const ca = cameraAnimRef.current;\n if (ca.active) {\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 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 const orbitControls = state.controls as { target?: THREE.Vector3 };\n if (orbitControls?.target) {\n orbitControls.target.copy(orbitTargetRef.current);\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 // Check single-step mode (spec 1.2)\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 // IK\n if (ikEnabledRef.current && target) {\n ikCalculatingRef.current = true;\n const numArm = configRef.current.numArmJoints ?? 7;\n const currentQ: number[] = [];\n for (let i = 0; i < numArm; i++) currentQ.push(data.qpos[i]);\n const solution = ikSolveFnRef.current(target.position, target.quaternion, currentQ);\n if (solution) {\n for (let i = 0; i < numArm; i++) data.ctrl[i] = solution[i];\n }\n } else {\n ikCalculatingRef.current = false;\n }\n\n // Step physics with substeps (spec 1.1)\n const numSubsteps = substepsRef.current;\n if (stepsToRunRef.current > 0) {\n // Single-step mode (spec 1.2)\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 frameTime = (1.0 / 60.0) * speedRef.current;\n while (data.time - startSimTime < frameTime) {\n for (let s = 0; s < numSubsteps; s++) {\n mujoco.mj_step(model, data);\n }\n }\n }\n\n // After-step callbacks\n for (const cb of afterStepCallbacks.current) {\n cb(model, data);\n }\n\n onStepRef.current?.(data.time);\n }, -1);\n\n // --- API Methods ---\n\n const reset = useCallback(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n gizmoAnimRef.current.active = false;\n mujoco.mj_resetData(model, data);\n\n const homeJoints = configRef.current.homeJoints;\n if (homeJoints) {\n for (let i = 0; i < homeJoints.length; i++) {\n data.ctrl[i] = homeJoints[i];\n if (model.actuator_trnid[2 * i + 1] === 1) {\n const jointId = model.actuator_trnid[2 * i];\n if (jointId >= 0 && jointId < model.njnt) {\n const qposAdr = model.jnt_qposadr[jointId];\n data.qpos[qposAdr] = homeJoints[i];\n }\n }\n }\n }\n\n configRef.current.onReset?.(model, data);\n mujoco.mj_forward(model, data);\n\n if (ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n firstIkEnableRef.current = true;\n ikEnabledRef.current = false;\n }, [mujoco, syncGizmoToSite]);\n\n const setIkEnabled = useCallback((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 }, [syncGizmoToSite]);\n\n const syncTargetToSite = useCallback(() => {\n const data = mjDataRef.current;\n const target = ikTargetRef.current;\n if (data && target) syncGizmoToSite(data, siteIdRef.current, target);\n }, [syncGizmoToSite]);\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(new THREE.Euler(Math.PI, 0, 0));\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 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 // spec 1.1: declarative pause\n const setPaused = useCallback((p: boolean) => {\n pausedRef.current = p;\n }, []);\n\n // spec 1.2: single-step mode\n const step = useCallback((n = 1) => {\n stepsToRunRef.current = n;\n }, []);\n\n // spec 1.3: simulation time access\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 // spec 4.1: state snapshot save/restore\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 // spec 4.3: qpos/qvel direct set/get\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 // spec 3.1: ctrl set/get\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 // Single actuator by name\n const id = findActuatorByName(model, nameOrValues);\n if (id >= 0 && value !== undefined) data.ctrl[id] = value;\n } else {\n // Batch: { name: value, ... }\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 // spec 8.1: force/torque API\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 // spec 2.1: sensor data\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 // spec 2.4: contacts\n const getContacts = useCallback((): ContactInfo[] => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return [];\n const contacts: ContactInfo[] = [];\n const ncon = data.ncon;\n for (let i = 0; i < ncon; i++) {\n try {\n const c = (data.contact as { get(i: number): { geom1: number; geom2: number; pos: Float64Array; dist: number } }).get(i);\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 } catch {\n break; // WASM contact access can fail\n }\n }\n return contacts;\n }, []);\n\n // spec 5.1: model introspection\n const getBodies = useCallback((): BodyInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: BodyInfo[] = [];\n for (let i = 0; i < model.nbody; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_bodyadr[i]),\n mass: model.body_mass[i],\n parentId: model.body_parentid[i],\n });\n }\n return result;\n }, []);\n\n const getJoints = useCallback((): JointInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: JointInfo[] = [];\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const limited = model.jnt_limited ? model.jnt_limited[i] !== 0 : false;\n result.push({\n id: i,\n name: getName(model, model.name_jntadr[i]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range: [model.jnt_range[2 * i], model.jnt_range[2 * i + 1]],\n limited,\n bodyId: model.jnt_bodyid[i],\n qposAdr: model.jnt_qposadr[i],\n dofAdr: model.jnt_dofadr[i],\n });\n }\n return result;\n }, []);\n\n const getGeoms = useCallback((): GeomInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: GeomInfo[] = [];\n for (let i = 0; i < model.ngeom; i++) {\n const type = model.geom_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_geomadr[i]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `unknown(${type})`,\n size: [model.geom_size[3 * i], model.geom_size[3 * i + 1], model.geom_size[3 * i + 2]],\n bodyId: model.geom_bodyid[i],\n });\n }\n return result;\n }, []);\n\n const getSites = useCallback((): SiteInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SiteInfo[] = [];\n for (let i = 0; i < model.nsite; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_siteadr[i]),\n bodyId: model.site_bodyid ? model.site_bodyid[i] : -1,\n });\n }\n return result;\n }, []);\n\n const getActuatorsApi = useCallback((): ActuatorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const hasRange = model.actuator_ctrlrange[2 * i] < model.actuator_ctrlrange[2 * i + 1];\n result.push({\n id: i,\n name: getName(model, model.name_actuatoradr[i]),\n range: hasRange\n ? [model.actuator_ctrlrange[2 * i], model.actuator_ctrlrange[2 * i + 1]]\n : [-Infinity, Infinity],\n });\n }\n return result;\n }, []);\n\n const getSensors = useCallback((): SensorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, []);\n\n // spec 5.3: model options\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 // spec 7.1: physics raycast\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; // mj_ray may not be available in all WASM builds\n }\n }, [mujoco]);\n\n // spec 4.2: keyframe improvements\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 // Also restore qvel if available (spec 4.2)\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 if (ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n }, [mujoco, syncGizmoToSite]);\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 // spec 9.1: runtime model swap\n const loadSceneApi = useCallback(async (newConfig: SceneConfig): Promise<void> => {\n try {\n // Clean up current model\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n setStatus('loading');\n\n const result = await loadScene(mujoco, newConfig);\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n siteIdRef.current = result.siteId;\n gripperIdRef.current = result.gripperId;\n configRef.current = newConfig;\n\n if (ikTargetRef.current) {\n syncGizmoToSite(result.mjData, result.siteId, ikTargetRef.current);\n }\n setStatus('ready');\n } catch (e) {\n setStatus('error');\n throw e;\n }\n }, [mujoco, syncGizmoToSite]);\n\n const getGizmoStats = useCallback((): { 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 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 const ndc = new THREE.Vector2(x * 2 - 1, -(y * 2 - 1));\n const raycaster = new THREE.Raycaster();\n raycaster.setFromCamera(ndc, 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 = raycaster.intersectObjects(objects);\n if (hits.length > 0) {\n const hitObj = hits[0].object;\n // Find geomId from the hit object's userData\n const geomId = hitObj.userData.geomID !== undefined ? hitObj.userData.geomID : -1;\n // Walk up to find bodyId\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 (spec 10.3) ---\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 const getCameraState = useCallback((): { position: THREE.Vector3; target: THREE.Vector3 } => {\n return { position: camera.position.clone(), target: orbitTargetRef.current.clone() };\n }, [camera]);\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 // --- Assemble API ---\n const api = useMemo<MujocoSimAPI>(\n () => ({\n get status() { return status; },\n config,\n reset,\n setSpeed,\n togglePause,\n setPaused,\n step,\n getTime,\n getTimestep,\n applyKeyframe,\n saveState,\n restoreState,\n setQpos,\n setQvel,\n getQpos,\n getQvel,\n setCtrl,\n getCtrl,\n applyForce,\n applyTorque: applyTorqueApi,\n setExternalForce,\n applyGeneralizedForce,\n getSensorData,\n getContacts,\n getBodies,\n getJoints,\n getGeoms,\n getSites,\n getActuators: getActuatorsApi,\n getSensors,\n getModelOption,\n setGravity,\n setTimestep: setTimestepApi,\n raycast,\n getKeyframeNames,\n getKeyframeCount,\n loadScene: loadSceneApi,\n setIkEnabled,\n moveTarget,\n syncTargetToSite,\n solveIK,\n getGizmoStats,\n getCanvasSnapshot,\n project2DTo3D,\n getCameraState,\n moveCameraTo,\n setBodyMass,\n setGeomFriction,\n setGeomSize,\n mjModelRef,\n mjDataRef,\n }),\n [\n status, config, reset, setSpeed, togglePause, setPaused, step,\n getTime, getTimestep, applyKeyframe, saveState, restoreState,\n setQpos, setQvel, getQpos, getQvel, setCtrl, getCtrl,\n applyForce, applyTorqueApi, setExternalForce, applyGeneralizedForce,\n getSensorData, getContacts, getBodies, getJoints, getGeoms, getSites,\n getActuatorsApi, getSensors, getModelOption, setGravity, setTimestepApi,\n raycast, getKeyframeNames, getKeyframeCount, loadSceneApi,\n setIkEnabled, moveTarget, syncTargetToSite, solveIK, getGizmoStats,\n getCanvasSnapshot, project2DTo3D, getCameraState, moveCameraTo,\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 siteIdRef,\n gripperIdRef,\n ikEnabledRef,\n ikCalculatingRef,\n pausedRef,\n speedRef,\n substepsRef,\n ikTargetRef,\n genericIkRef,\n ikSolveFnRef,\n firstIkEnableRef,\n gizmoAnimRef,\n cameraAnimRef,\n onSelectionRef,\n beforeStepCallbacks,\n afterStepCallbacks,\n status,\n }),\n [api, status]\n );\n\n return (\n <MujocoSimContext.Provider value={contextValue}>\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 { useMujoco } from './MujocoProvider';\nimport { MujocoSimProvider } from './MujocoSimProvider';\nimport { MujocoCanvasProps } 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 */\nexport const MujocoCanvas = forwardRef<HTMLCanvasElement, MujocoCanvasProps>(\n function MujocoCanvas(\n {\n config,\n onReady,\n onError,\n onStep,\n onSelection,\n // Declarative physics config (spec 1.1)\n gravity,\n timestep,\n substeps,\n paused,\n speed,\n interpolate,\n gravityCompensation,\n mjcfLights,\n children,\n ...canvasProps\n },\n ref\n ) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujoco();\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 ref={ref} {...canvasProps}>\n <MujocoSimProvider\n mujoco={mujoco}\n config={config}\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\n\nimport * as THREE from 'three';\n\ninterface InternalBufferGeometry extends THREE.BufferGeometry {\n type: string;\n}\n\n/**\n * CapsuleGeometry\n * Custom geometry for capsule shape.\n */\nexport class CapsuleGeometry extends THREE.BufferGeometry {\n parameters: { radius: number; length: number; capSegments: number; radialSegments: number; };\n\n constructor(radius = 1, length = 1, capSegments = 4, radialSegments = 8) {\n super();\n (this as unknown as InternalBufferGeometry).type = 'CapsuleGeometry';\n this.parameters = { radius, length, capSegments, radialSegments };\n const path = new THREE.Path();\n path.absarc(0, -length / 2, radius, Math.PI * 1.5, 0, false);\n path.absarc(0, length / 2, radius, 0, Math.PI * 0.5, false);\n const latheGeometry = new THREE.LatheGeometry(path.getPoints(capSegments), radialSegments);\n \n const self = this as THREE.BufferGeometry;\n self.setIndex(latheGeometry.getIndex());\n self.setAttribute('position', latheGeometry.getAttribute('position'));\n self.setAttribute('normal', latheGeometry.getAttribute('normal'));\n self.setAttribute('uv', latheGeometry.getAttribute('uv'));\n }\n}","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\n\n/**\n * Options for configuring the Reflector.\n */\nexport interface ReflectorOptions {\n color?: THREE.ColorRepresentation;\n textureWidth?: number;\n textureHeight?: number;\n clipBias?: number;\n multisample?: number;\n texture?: THREE.Texture;\n mixStrength?: number; // How strong the reflection is (0.0 - 1.0)\n}\n\ninterface ReflectorMesh extends THREE.Mesh {\n type: string;\n material: THREE.MeshPhysicalMaterial;\n // tslint:disable-next-line:no-any\n onBeforeRender: (renderer: any, scene: any, camera: any) => void;\n}\n\n/**\n * Reflector\n * Creates a reflective surface.\n */\nexport class Reflector extends THREE.Mesh {\n isReflector = true;\n camera: THREE.PerspectiveCamera;\n private reflectorPlane = new THREE.Plane();\n private normal = new THREE.Vector3();\n private reflectorWorldPosition = new THREE.Vector3();\n private cameraWorldPosition = new THREE.Vector3();\n private rotationMatrix = new THREE.Matrix4();\n private lookAtPosition = new THREE.Vector3(0, 0, -1);\n private clipPlane = new THREE.Vector4();\n private view = new THREE.Vector3();\n private target = new THREE.Vector3();\n private q = new THREE.Vector4();\n private textureMatrix = new THREE.Matrix4();\n private virtualCamera: THREE.PerspectiveCamera;\n private renderTarget: THREE.WebGLRenderTarget;\n\n constructor(geometry: THREE.BufferGeometry, options: ReflectorOptions = {}) {\n super(geometry);\n\n (this as unknown as ReflectorMesh).type = 'Reflector';\n this.camera = new THREE.PerspectiveCamera();\n\n const color = (options.color !== undefined) ? new THREE.Color(options.color) : new THREE.Color(0x7F7F7F);\n const textureWidth = options.textureWidth || 512;\n const textureHeight = options.textureHeight || 512;\n const clipBias = options.clipBias || 0;\n const multisample = (options.multisample !== undefined) ? options.multisample : 4;\n const blendTexture = options.texture || undefined;\n const mixStrength = (options.mixStrength !== undefined) ? options.mixStrength : 0.25; \n\n this.virtualCamera = this.camera;\n\n this.renderTarget = new THREE.WebGLRenderTarget(textureWidth, textureHeight, { \n samples: multisample, \n type: THREE.HalfFloatType \n });\n\n (this as unknown as ReflectorMesh).material = new THREE.MeshPhysicalMaterial({\n map: blendTexture,\n color,\n roughness: 0.5, \n metalness: 0.1, \n });\n\n (this as unknown as ReflectorMesh).material.onBeforeCompile = (shader) => {\n shader.uniforms.tDiffuse = { value: this.renderTarget.texture };\n shader.uniforms.textureMatrix = { value: this.textureMatrix };\n shader.uniforms.mixStrength = { value: mixStrength };\n\n // Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n const bodyStart = shader.vertexShader.indexOf('void main() {');\n shader.vertexShader =\n 'uniform mat4 textureMatrix;\\n' +\n 'varying vec4 vUvReflection;\\n' +\n shader.vertexShader.slice(0, bodyStart) +\n shader.vertexShader.slice(bodyStart, -1) +\n ' vUvReflection = textureMatrix * vec4( position, 1.0 );\\n' +\n '}';\n\n // Fragment Shader: Mix reflection with base material\n const fragmentBodyStart = shader.fragmentShader.indexOf('void main() {');\n shader.fragmentShader =\n 'uniform sampler2D tDiffuse;\\n' +\n 'uniform float mixStrength;\\n' +\n 'varying vec4 vUvReflection;\\n' +\n shader.fragmentShader.slice(0, fragmentBodyStart) +\n shader.fragmentShader.slice(fragmentBodyStart, -1) +\n ' vec4 reflectionColor = texture2DProj( tDiffuse, vUvReflection );\\n' +\n ' gl_FragColor = vec4( mix( gl_FragColor.rgb, reflectionColor.rgb, mixStrength ), gl_FragColor.a );\\n' +\n '}';\n };\n\n (this as THREE.Object3D).receiveShadow = true;\n\n (this as unknown as ReflectorMesh).onBeforeRender = (renderer: THREE.WebGLRenderer, scene: THREE.Scene, camera: THREE.Camera) => {\n this.reflectorWorldPosition.setFromMatrixPosition((this as THREE.Object3D).matrixWorld);\n this.cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld);\n\n this.rotationMatrix.extractRotation((this as THREE.Object3D).matrixWorld);\n\n this.normal.set(0, 0, 1);\n this.normal.applyMatrix4(this.rotationMatrix);\n\n this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition);\n\n // Avoid rendering when reflector is facing away\n if (this.view.dot(this.normal) > 0) return;\n\n this.view.reflect(this.normal).negate();\n this.view.add(this.reflectorWorldPosition);\n\n this.rotationMatrix.extractRotation(camera.matrixWorld);\n\n this.lookAtPosition.set(0, 0, -1);\n this.lookAtPosition.applyMatrix4(this.rotationMatrix);\n this.lookAtPosition.add(this.cameraWorldPosition);\n\n this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition);\n this.target.reflect(this.normal).negate();\n this.target.add(this.reflectorWorldPosition);\n\n this.virtualCamera.position.copy(this.view);\n this.virtualCamera.up.set(0, 1, 0);\n this.virtualCamera.up.applyMatrix4(this.rotationMatrix);\n this.virtualCamera.up.reflect(this.normal);\n this.virtualCamera.lookAt(this.target);\n\n this.virtualCamera.far = (camera as THREE.PerspectiveCamera).far; \n\n this.virtualCamera.updateMatrixWorld();\n this.virtualCamera.projectionMatrix.copy((camera as THREE.PerspectiveCamera).projectionMatrix);\n\n // Update the texture matrix\n this.textureMatrix.set(\n 0.5, 0.0, 0.0, 0.5,\n 0.0, 0.5, 0.0, 0.5,\n 0.0, 0.0, 0.5, 0.5,\n 0.0, 0.0, 0.0, 1.0\n );\n this.textureMatrix.multiply(this.virtualCamera.projectionMatrix);\n this.textureMatrix.multiply(this.virtualCamera.matrixWorldInverse);\n this.textureMatrix.multiply((this as THREE.Object3D).matrixWorld);\n\n // Now update projection matrix with new clip plane\n this.reflectorPlane.setFromNormalAndCoplanarPoint(this.normal, this.reflectorWorldPosition);\n this.reflectorPlane.applyMatrix4(this.virtualCamera.matrixWorldInverse);\n\n this.clipPlane.set(this.reflectorPlane.normal.x, this.reflectorPlane.normal.y, this.reflectorPlane.normal.z, this.reflectorPlane.constant);\n\n const projectionMatrix = this.virtualCamera.projectionMatrix;\n\n this.q.x = (Math.sign(this.clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];\n this.q.y = (Math.sign(this.clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];\n this.q.z = -1.0;\n this.q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];\n\n // Calculate the scaled plane vector\n this.clipPlane.multiplyScalar(2.0 / this.clipPlane.dot(this.q));\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = this.clipPlane.x;\n projectionMatrix.elements[6] = this.clipPlane.y;\n projectionMatrix.elements[10] = this.clipPlane.z + 1.0 - clipBias;\n projectionMatrix.elements[14] = this.clipPlane.w;\n\n // Render\n (this as THREE.Object3D).visible = false;\n\n const currentRenderTarget = renderer.getRenderTarget();\n const currentXrEnabled = renderer.xr.enabled;\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\n renderer.xr.enabled = false; \n renderer.shadowMap.autoUpdate = false; \n\n renderer.setRenderTarget(this.renderTarget);\n\n renderer.state.buffers.depth.setMask(true); \n\n if (renderer.autoClear === false) renderer.clear();\n renderer.render(scene, this.virtualCamera);\n\n renderer.xr.enabled = currentXrEnabled;\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\n renderer.setRenderTarget(currentRenderTarget);\n\n // Restore viewport\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const viewport = (camera as any).viewport;\n if (viewport !== undefined) {\n renderer.state.viewport(viewport);\n }\n\n (this as THREE.Object3D).visible = true;\n };\n }\n\n getRenderTarget() {\n return this.renderTarget;\n }\n\n dispose() {\n this.renderTarget.dispose();\n const mesh = this as THREE.Mesh;\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((m) => m.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n}","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\nimport { CapsuleGeometry } from './CapsuleGeometry';\nimport { Reflector } from './Reflector';\nimport { MujocoModel, MujocoModule } from '../types';\n\n/**\n * GeomBuilder\n * RESPONSIBILITY: Manufacturing visual objects.\n * \n * This class knows how to read a single MuJoCo 'geom' (collision shape) definition\n * and build the corresponding Three.js Mesh for it.\n * It handles all the different shape types (Box, Sphere, Cylinder, generic Mesh, etc.).\n */\nexport class GeomBuilder {\n private mujoco: MujocoModule; \n\n constructor(mujoco: MujocoModule) {\n this.mujoco = mujoco;\n }\n\n /**\n * Creates a Three.js Object3D (usually a Mesh) for a specific geometry in the MuJoCo model.\n * Returns null if the geometry shouldn't be rendered (e.g., invisible collision triggers).\n */\n create(mjModel: MujocoModel, g: number): THREE.Object3D | null {\n // 1. Check if this geom is meant to be visible\n // Group 3 in MuJoCo is conventionally used for invisible 'helper' geoms.\n if (mjModel.geom_group[g] === 3) return null;\n\n // 2. Read raw data from MuJoCo's WASM memory arrays\n const type = mjModel.geom_type[g];\n const size = mjModel.geom_size.subarray(g * 3, g * 3 + 3); // [x, y, z] size parameters\n const pos = mjModel.geom_pos.subarray(g * 3, g * 3 + 3); // [x, y, z] local position\n const quat = mjModel.geom_quat.subarray(g * 4, g * 4 + 4); // [w, x, y, z] local rotation\n\n // 3. Determine material color\n // Sometimes color is on the geom itself, sometimes it uses a shared material definition.\n const matId = mjModel.geom_matid[g];\n const color = new THREE.Color(0xffffff);\n let opacity = 1.0;\n\n if (matId >= 0) {\n // Use shared material\n const rgba = mjModel.mat_rgba.subarray(matId * 4, matId * 4 + 4);\n color.setRGB(rgba[0], rgba[1], rgba[2]);\n opacity = rgba[3];\n } else {\n // Use geom-specific color\n const rgba = mjModel.geom_rgba.subarray(g * 4, g * 4 + 4);\n color.setRGB(rgba[0], rgba[1], rgba[2]);\n opacity = rgba[3];\n }\n\n // 4. Build the Geometry based on type\n const MG = this.mujoco.mjtGeom; // Short alias for MuJoCo Geometry Types enum\n let geo: THREE.BufferGeometry | null = null;\n\n // The '.value ?? MG.XYZ' pattern handles slightly different versions of the mujoco-js bindings.\n const getVal = (v: unknown) => (v as { value: number })?.value ?? v;\n\n if (type === getVal(MG.mjGEOM_PLANE)) {\n // Planes are infinite in MuJoCo, but we need a finite mesh for Three.js. \n // Fallback reduced to 5m to match grid as requested.\n geo = new THREE.PlaneGeometry(size[0] * 2 || 5, size[1] * 2 || 5);\n } else if (type === getVal(MG.mjGEOM_SPHERE)) {\n geo = new THREE.SphereGeometry(size[0], 24, 24);\n } else if (type === getVal(MG.mjGEOM_CAPSULE)) {\n // Capsules in MuJoCo are Z-axis aligned by default.\n // Our custom CapsuleGeometry might need rotation to match.\n geo = new CapsuleGeometry(size[0], size[1] * 2, 24, 12);\n geo.rotateX(Math.PI / 2); \n } else if (type === getVal(MG.mjGEOM_BOX)) {\n // MuJoCo defines box size as \"half-extents\" (center to edge). Three.js uses full width.\n geo = new THREE.BoxGeometry(size[0] * 2, size[1] * 2, size[2] * 2);\n } else if (type === getVal(MG.mjGEOM_CYLINDER)) {\n geo = new THREE.CylinderGeometry(size[0], size[0], size[1] * 2, 24);\n geo.rotateX(Math.PI / 2);\n } else if (type === getVal(MG.mjGEOM_MESH)) {\n // Arbitrary 3D meshes (like the robot parts).\n // We must read the vertex and face data directly from MuJoCo's buffers.\n const mId = mjModel.geom_dataid[g];\n const vAdr = mjModel.mesh_vertadr[mId];\n const vNum = mjModel.mesh_vertnum[mId];\n const fAdr = mjModel.mesh_faceadr[mId];\n const fNum = mjModel.mesh_facenum[mId];\n\n geo = new THREE.BufferGeometry();\n // 'position' attribute = vertices\n geo.setAttribute('position', new THREE.Float32BufferAttribute(mjModel.mesh_vert.subarray(vAdr * 3, (vAdr + vNum) * 3), 3));\n // 'index' = faces (triangles connecting vertices)\n geo.setIndex(Array.from(mjModel.mesh_face.subarray(fAdr * 3, (fAdr + fNum) * 3)));\n geo.computeVertexNormals(); // Auto-calculate smooth lighting normals\n }\n\n // 5. Construct the final Mesh\n if (geo) {\n let mesh;\n // Special handling for the floor plane to make it shiny\n if (type === getVal(MG.mjGEOM_PLANE)) {\n mesh = new Reflector(geo, {\n clipBias: 0.003,\n textureWidth: 1024, textureHeight: 1024,\n color,\n mixStrength: 0.25\n });\n } else {\n // Standard physical material for everything else\n mesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({\n color,\n transparent: opacity < 1,\n opacity,\n roughness: 0.6,\n metalness: 0.2\n }));\n // Enable shadows\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n }\n\n // Apply the local position offset and rotation specified in the MJCF XML\n mesh.position.set(pos[0], pos[1], pos[2]);\n // MuJoCo quaternions are [w, x, y, z], Three.js are [x, y, z, w]\n mesh.quaternion.set(quat[1], quat[2], quat[3], quat[0]);\n\n // Tag the mesh with its MuJoCo body and geom IDs for interaction (picking/dragging)\n mesh.userData.bodyID = mjModel.geom_bodyid[g];\n mesh.userData.geomID = g;\n\n return mesh;\n }\n\n return null;\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } 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 { useMujocoSim } from '../core/MujocoSimProvider';\n\n/**\n * SceneRenderer — creates and syncs MuJoCo body meshes every frame.\n * Replaces RenderSystem.initScene() + RenderSystem.update() body loop.\n */\nexport function SceneRenderer() {\n const { mjModelRef, mjDataRef, mujocoRef, onSelectionRef, status } = useMujocoSim();\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 return new GeomBuilder(mujocoRef.current);\n }, [mujocoRef.current]);\n\n // Build body groups when model loads\n useEffect(() => {\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group) return;\n\n // Skip if model hasn't changed\n if (prevModelRef.current === model) return;\n prevModelRef.current = model;\n\n // Clear previous bodies\n while (group.children.length > 0) {\n group.remove(group.children[0]);\n }\n\n // Create body groups with geometry\n const refs: (THREE.Group | null)[] = [];\n for (let i = 0; i < model.nbody; i++) {\n const bodyGroup = new THREE.Group();\n bodyGroup.userData.bodyID = i;\n\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === i) {\n const mesh = geomBuilder.create(model, g);\n if (mesh) bodyGroup.add(mesh);\n }\n }\n\n group.add(bodyGroup);\n refs.push(bodyGroup);\n }\n bodyRefs.current = refs;\n }, [status, geomBuilder, mjModelRef]);\n\n // Sync body positions from mjData every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data) return;\n const bodies = bodyRefs.current;\n for (let i = 0; i < bodies.length; i++) {\n const ref = bodies[i];\n if (!ref) continue;\n ref.position.set(\n data.xpos[i * 3],\n data.xpos[i * 3 + 1],\n data.xpos[i * 3 + 2]\n );\n ref.quaternion.set(\n data.xquat[i * 4 + 1],\n data.xquat[i * 4 + 2],\n data.xquat[i * 4 + 3],\n data.xquat[i * 4]\n );\n }\n });\n\n return (\n <group\n ref={groupRef}\n 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 if (obj && obj.userData.bodyID !== undefined && obj.userData.bodyID > 0) {\n const model = mjModelRef.current;\n if (model && onSelectionRef.current) {\n const name = getName(model, model.name_bodyadr[obj.userData.bodyID]);\n onSelectionRef.current(obj.userData.bodyID, name);\n }\n }\n }}\n />\n );\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 { useMujocoSim } 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 * Props:\n * - `siteName` — MuJoCo site to track. Defaults to `SceneConfig.tcpSiteName`.\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 provider's IK target.\n * When provided, the consumer handles what happens during drag.\n *\n * Multiple gizmos can be rendered — each tracks its own site.\n * Zero gizmos is fine — programmatic IK control works via the provider API.\n *\n * Uses a tiny invisible mesh as child instead of axesHelper — PivotControls\n * computes an anchor offset from children's bounding box, and axesHelper's\n * (0→0.15) bounds would shift the handles away from the TCP origin.\n */\nexport function IkGizmo({ siteName, scale = 0.18, onDrag }: IkGizmoProps) {\n const {\n ikTargetRef, mjModelRef, mjDataRef, siteIdRef,\n api, ikEnabledRef, status,\n } = useMujocoSim();\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 (or fall back to provider's tcpSiteName)\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n localSiteIdRef.current = -1;\n return;\n }\n if (siteName) {\n localSiteIdRef.current = findSiteByName(model, siteName);\n } else {\n // Default: use the provider's siteIdRef (from SceneConfig.tcpSiteName)\n localSiteIdRef.current = siteIdRef.current;\n }\n }, [siteName, status, mjModelRef, siteIdRef]);\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 = localSiteIdRef.current;\n if (!data || sid < 0 || !wrapperRef.current) return;\n\n if (!draggingRef.current) {\n const p = data.site_xpos;\n const m = data.site_xmat;\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n // Position wrapper at the site\n wrapperRef.current.position.set(p[i3], p[i3 + 1], p[i3 + 2]);\n // MuJoCo site_xmat is row-major 3x3; THREE.Matrix4.set() is row-major\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n wrapperRef.current.quaternion.setFromRotationMatrix(_mat4);\n\n // Reset any accumulated drag delta so handles stay at wrapper origin\n if (pivotRef.current) {\n pivotRef.current.matrix.identity();\n }\n }\n });\n\n // Don't render until the model is loaded (avoids gizmo at origin)\n if (status !== 'ready') return null;\n\n return (\n <group ref={wrapperRef}>\n <PivotControls\n ref={pivotRef}\n autoTransform\n scale={scale}\n fixed={false}\n depthTest={false}\n disableScaling\n onDragStart={() => {\n draggingRef.current = true;\n if (!onDrag) {\n // Default: enable IK so the robot follows\n if (!ikEnabledRef.current) api.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 provider's 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 * as THREE from 'three';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\n\nconst _dummy = new THREE.Object3D();\n\ninterface ContactMarkersProps {\n /** Maximum contacts to render. Default: 100. */\n maxContacts?: number;\n /** Sphere radius. Default: 0.005. */\n radius?: number;\n /** Color. Default: '#4f46e5'. */\n color?: string;\n /** Show markers. Default: true. */\n visible?: boolean;\n}\n\nexport function ContactMarkers({\n maxContacts = 100,\n radius = 0.005,\n color = '#4f46e5',\n visible = true,\n}: ContactMarkersProps = {}) {\n const { mjDataRef, status } = useMujocoSim();\n const meshRef = useRef<THREE.InstancedMesh>(null);\n\n useFrame(() => {\n const mesh = meshRef.current;\n const data = mjDataRef.current;\n if (!mesh || !data || !visible) {\n if (mesh) mesh.count = 0;\n return;\n }\n\n const ncon = data.ncon;\n const count = Math.min(ncon, maxContacts);\n\n for (let i = 0; i < count; i++) {\n try {\n const c = (data.contact as { get(i: number): { pos: Float64Array } | undefined }).get(i);\n if (!c) break;\n _dummy.position.set(c.pos[0], c.pos[1], c.pos[2]);\n _dummy.updateMatrix();\n mesh.setMatrixAt(i, _dummy.matrix);\n } catch {\n // Contact access failed — stop here\n mesh.count = i;\n mesh.instanceMatrix.needsUpdate = true;\n return;\n }\n }\n\n mesh.count = count;\n mesh.instanceMatrix.needsUpdate = true;\n });\n\n if (status !== 'ready') return null;\n\n return (\n <instancedMesh ref={meshRef} args={[undefined, undefined, maxContacts]}>\n <sphereGeometry args={[radius, 8, 8]} />\n <meshStandardMaterial\n color={color}\n emissive={color}\n emissiveIntensity={0.3}\n roughness={0.5}\n />\n </instancedMesh>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoSim, 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}: DragInteractionProps) {\n const { mjDataRef, mujocoRef, mjModelRef, status } = useMujocoSim();\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 = mouseWorldRef.current.clone().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 ref={groupRef} />;\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 { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\nimport type { SceneLightsProps } from '../types';\n\nexport function SceneLights({ intensity = 1.0 }: SceneLightsProps) {\n const { mjModelRef, status } = useMujocoSim();\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 // Check if light is active\n const active = model.light_active ? model.light_active[i] : 1;\n if (!active) continue;\n\n // light_type: 0 = directional, 1 = spot (no light_directional in WASM)\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 // Read intensity from model if available, otherwise use prop\n const mjIntensity = model.light_intensity ? model.light_intensity[i] : 1.0;\n const finalIntensity = intensity * mjIntensity;\n\n // Read diffuse color\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 // Read position and direction\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 // Spot light\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]; // linear\n const att2 = model.light_attenuation[3 * i + 2]; // quadratic\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 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 * as THREE from 'three';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\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/**\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}: DebugProps) {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\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\n if (showSites) {\n for (let i = 0; i < model.nsite; i++) {\n const geometry = new THREE.OctahedronGeometry(0.01);\n const mat = new THREE.MeshBasicMaterial({ color: 0xff00ff, transparent: true, opacity: 0.7 });\n const mesh = new THREE.Mesh(geometry, mat);\n mesh.userData.siteId = i;\n sites.push(mesh);\n }\n }\n\n // Joint axes\n if (showJoints) {\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const color = JOINT_COLORS[type] ?? 0xffffff;\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 0, 1), new THREE.Vector3(),\n 0.05, color, 0.01, 0.005\n );\n arrow.userData.jointId = i;\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 // 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 mesh.position.add(new THREE.Vector3(gp[3 * gid], gp[3 * gid + 1], gp[3 * gid + 2])\n .applyQuaternion(mesh.quaternion));\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 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\n const contactGroupRef = useRef<THREE.Group>(null);\n const contactArrowsRef = useRef<THREE.ArrowHelper[]>([]);\n\n useFrame(() => {\n if (!showContacts) return;\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const group = contactGroupRef.current;\n if (!model || !data || !group) return;\n\n // Remove old arrows\n for (const arrow of contactArrowsRef.current) {\n group.remove(arrow);\n arrow.dispose();\n }\n contactArrowsRef.current = [];\n\n const ncon = data.ncon;\n for (let i = 0; i < Math.min(ncon, 50); i++) {\n try {\n const c = (data.contact as { get(i: number): { pos: Float64Array; frame: Float64Array; dist: number } }).get(i);\n const pos = new THREE.Vector3(c.pos[0], c.pos[1], c.pos[2]);\n const normal = new THREE.Vector3(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) {\n const arrow = new THREE.ArrowHelper(normal, pos, length, 0xff4444, length * 0.3, length * 0.15);\n group.add(arrow);\n contactArrowsRef.current.push(arrow);\n }\n } catch {\n break;\n }\n }\n });\n\n if (status !== 'ready') return null;\n\n return (\n <>\n <group ref={groupRef} />\n {showContacts && <group ref={contactGroupRef} />}\n </>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TendonRenderer — render tendons as tube geometries (spec 6.4)\n *\n * WASM fields used: model.ntendon, model.ten_wrapadr, model.ten_wrapnum\n * data.wrap_xpos, data.ten_wrapadr (runtime)\n *\n * Note: ten_rgba and ten_width are NOT available in mujoco-js 0.0.7.\n * Tendons use a default color and width.\n */\n\nimport { useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\n\nconst DEFAULT_TENDON_COLOR = new THREE.Color(0.3, 0.3, 0.8);\nconst DEFAULT_TENDON_WIDTH = 0.002;\n\nexport function TendonRenderer() {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n\n useFrame(() => {\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 // Clean up old meshes\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 for (let t = 0; t < ntendon; t++) {\n const wrapAdr = model.ten_wrapadr[t];\n const wrapNum = model.ten_wrapnum[t];\n if (wrapNum < 2) continue;\n\n // Get wrap path points from data\n const points: THREE.Vector3[] = [];\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 // Skip zero points (uninitialized wrap points)\n if (x !== 0 || y !== 0 || z !== 0) {\n points.push(new THREE.Vector3(x, y, z));\n }\n }\n }\n\n if (points.length < 2) continue;\n\n const curve = new THREE.CatmullRomCurve3(points, false);\n const geometry = new THREE.TubeGeometry(\n curve, Math.max(points.length * 2, 4), DEFAULT_TENDON_WIDTH, 6, false\n );\n\n const material = new THREE.MeshStandardMaterial({\n color: DEFAULT_TENDON_COLOR,\n roughness: 0.6,\n metalness: 0.1,\n });\n const mesh = new THREE.Mesh(geometry, material);\n group.add(mesh);\n meshesRef.current.push(mesh);\n }\n });\n\n if (status !== 'ready') return null;\n return <group 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 * as THREE from 'three';\nimport { useMujocoSim } 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() {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n\n // Build flex meshes once when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group || status !== 'ready') return;\n\n const nflex = model.nflex ?? 0;\n if (nflex === 0) return;\n\n for (let f = 0; f < nflex; f++) {\n const vertAdr = model.flex_vertadr[f];\n const vertNum = model.flex_vertnum[f];\n\n if (vertNum === 0) continue;\n\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(vertNum * 3);\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n // Note: flex_faceadr/flex_facenum/flex_face are NOT available in mujoco-js WASM.\n // Without face data we render as a point cloud. If future WASM versions expose\n // face arrays, index-based triangle rendering can be added here.\n\n geometry.computeVertexNormals();\n\n let color = new THREE.Color(0.5, 0.5, 0.5);\n if (model.flex_rgba) {\n color = new THREE.Color(\n model.flex_rgba[4 * f],\n model.flex_rgba[4 * f + 1],\n model.flex_rgba[4 * f + 2],\n );\n }\n\n const material = new THREE.MeshStandardMaterial({\n color,\n roughness: 0.7,\n side: THREE.DoubleSide,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.userData.flexId = f;\n mesh.userData.vertAdr = vertAdr;\n mesh.userData.vertNum = vertNum;\n group.add(mesh);\n meshesRef.current.push(mesh);\n }\n\n return () => {\n for (const mesh of meshesRef.current) {\n group.remove(mesh);\n mesh.geometry.dispose();\n (mesh.material as THREE.Material).dispose();\n }\n meshesRef.current = [];\n };\n }, [status, mjModelRef]);\n\n // Update vertex positions every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !data.flexvert_xpos) return;\n\n for (const mesh of meshesRef.current) {\n const vertAdr = mesh.userData.vertAdr;\n const vertNum = mesh.userData.vertNum;\n const posAttr = mesh.geometry.getAttribute('position') as THREE.BufferAttribute;\n if (!posAttr) continue;\n\n for (let v = 0; v < vertNum; v++) {\n const srcIdx = (vertAdr + v) * 3;\n posAttr.setXYZ(v, data.flexvert_xpos[srcIdx], data.flexvert_xpos[srcIdx + 1], data.flexvert_xpos[srcIdx + 2]);\n }\n posAttr.needsUpdate = true;\n mesh.geometry.computeVertexNormals();\n }\n });\n\n if (status !== 'ready') return null;\n return <group ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useContacts — structured contact query hook (spec 2.4)\n * useContactEvents — contact enter/exit events (spec 2.5)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujocoSim, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName, getName } from '../core/SceneLoader';\nimport type { ContactInfo } from '../types';\n\n/**\n * Track contacts for a specific body (or all contacts if no body specified).\n * Calls the callback every physics frame with current contact list.\n * Reads `data.ncon` first to avoid allocating for zero contacts.\n */\nexport function useContacts(\n bodyName?: string,\n callback?: (contacts: ContactInfo[]) => void,\n): React.RefObject<ContactInfo[]> {\n const { mjModelRef } = useMujocoSim();\n const contactsRef = useRef<ContactInfo[]>([]);\n const bodyIdRef = useRef(-1);\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n if (!bodyName) { bodyIdRef.current = -1; return; }\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, bodyName);\n }, [bodyName, mjModelRef]);\n\n useAfterPhysicsStep((model, data) => {\n const ncon = data.ncon;\n if (ncon === 0) {\n if (contactsRef.current.length > 0) contactsRef.current = [];\n callbackRef.current?.([]);\n return;\n }\n\n const contacts: ContactInfo[] = [];\n const filterBody = bodyIdRef.current;\n\n for (let i = 0; i < ncon; i++) {\n try {\n const c = (data.contact as { get(i: number): { geom1: number; geom2: number; pos: Float64Array; dist: number } }).get(i);\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: 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 } catch {\n break;\n }\n }\n contactsRef.current = contacts;\n callbackRef.current?.(contacts);\n });\n\n return contactsRef;\n}\n\n/**\n * Contact enter/exit events for a specific body (spec 2.5).\n * Tracks which geom pairs are in contact frame-to-frame and fires\n * onEnter/onExit callbacks on transitions.\n */\nexport function useContactEvents(\n bodyName: string,\n handlers: {\n onEnter?: (info: ContactInfo) => void;\n onExit?: (info: ContactInfo) => void;\n },\n) {\n const prevPairsRef = useRef(new Set<string>());\n const onEnterRef = useRef(handlers.onEnter);\n const onExitRef = useRef(handlers.onExit);\n onEnterRef.current = handlers.onEnter;\n onExitRef.current = handlers.onExit;\n\n const prevContactMapRef = useRef(new Map<string, ContactInfo>());\n\n const onContacts = useCallback((contacts: ContactInfo[]) => {\n const currentPairs = new Set<string>();\n const currentMap = new Map<string, ContactInfo>();\n\n for (const c of contacts) {\n const key = `${Math.min(c.geom1, c.geom2)}_${Math.max(c.geom1, c.geom2)}`;\n currentPairs.add(key);\n currentMap.set(key, c);\n }\n\n // New contacts (enter)\n for (const key of currentPairs) {\n if (!prevPairsRef.current.has(key)) {\n onEnterRef.current?.(currentMap.get(key)!);\n }\n }\n\n // Lost contacts (exit)\n for (const key of prevPairsRef.current) {\n if (!currentPairs.has(key)) {\n const prev = prevContactMapRef.current.get(key);\n if (prev) onExitRef.current?.(prev);\n }\n }\n\n prevPairsRef.current = currentPairs;\n prevContactMapRef.current = currentMap;\n }, []);\n\n useContacts(bodyName, onContacts);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * ContactListener — component form of contact events (spec 2.5)\n */\n\nimport { useContactEvents } from '../hooks/useContacts';\nimport type { ContactListenerProps } from '../types';\n\n/**\n * Component form of useContactEvents.\n * Fires onContactEnter/onContactExit callbacks when contacts change.\n */\nexport function ContactListener({\n body,\n onContactEnter,\n onContactExit,\n}: ContactListenerProps) {\n useContactEvents(body, {\n onEnter: onContactEnter,\n onExit: onContactExit,\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryPlayer — trajectory playback/scrubbing (spec 13.2)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\n\ninterface TrajectoryPlayerOptions {\n fps?: number;\n loop?: boolean;\n}\n\n/**\n * Play back a sequence of qpos frames, overriding simulation state.\n *\n * When playing, the simulation is effectively paused and qpos is set\n * from the trajectory each render frame at the specified FPS.\n */\nexport function useTrajectoryPlayer(\n trajectory: number[][],\n options: TrajectoryPlayerOptions = {},\n) {\n const { mjModelRef, mjDataRef, mujocoRef, pausedRef } = useMujocoSim();\n const fps = options.fps ?? 30;\n const loop = options.loop ?? false;\n\n const playingRef = useRef(false);\n const frameRef = useRef(0);\n const lastFrameTimeRef = useRef(0);\n\n const play = useCallback(() => {\n playingRef.current = true;\n pausedRef.current = true; // Pause sim during playback\n lastFrameTimeRef.current = performance.now();\n }, [pausedRef]);\n\n const pause = useCallback(() => {\n playingRef.current = false;\n }, []);\n\n const seek = useCallback((frameIdx: number) => {\n frameRef.current = Math.max(0, Math.min(frameIdx, trajectory.length - 1));\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || !trajectory[frameRef.current]) return;\n const qpos = trajectory[frameRef.current];\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n }, [trajectory, mjModelRef, mjDataRef, mujocoRef]);\n\n const reset = useCallback(() => {\n frameRef.current = 0;\n playingRef.current = false;\n pausedRef.current = false;\n }, [pausedRef]);\n\n useFrame(() => {\n if (!playingRef.current || trajectory.length === 0) return;\n\n const now = performance.now();\n const elapsed = now - lastFrameTimeRef.current;\n const frameInterval = 1000 / fps;\n\n if (elapsed < frameInterval) return;\n lastFrameTimeRef.current = now;\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = trajectory[frameRef.current];\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n\n frameRef.current++;\n if (frameRef.current >= trajectory.length) {\n if (loop) {\n frameRef.current = 0;\n } else {\n playingRef.current = false;\n pausedRef.current = false;\n }\n }\n });\n\n return {\n play,\n pause,\n seek,\n reset,\n get frame() { return frameRef.current; },\n get playing() { return playingRef.current; },\n get totalFrames() { return trajectory.length; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TrajectoryPlayer — component form of trajectory playback (spec 13.2)\n */\n\nimport { useEffect } from 'react';\nimport { useTrajectoryPlayer } from '../hooks/useTrajectoryPlayer';\nimport type { TrajectoryPlayerProps } from '../types';\n\n/**\n * Component wrapper for useTrajectoryPlayer.\n * Provides declarative trajectory playback controlled via props.\n */\nexport function TrajectoryPlayer({\n trajectory,\n fps = 30,\n loop = false,\n playing = false,\n onFrame,\n}: TrajectoryPlayerProps) {\n const player = useTrajectoryPlayer(trajectory, { fps, loop });\n\n useEffect(() => {\n if (playing) {\n player.play();\n } else {\n player.pause();\n }\n }, [playing]);\n\n useEffect(() => {\n if (onFrame) {\n // Poll frame changes (lightweight, no extra useFrame needed)\n const interval = setInterval(() => {\n if (player.playing) onFrame(player.frame);\n }, 1000 / fps);\n return () => clearInterval(interval);\n }\n }, [onFrame, fps]);\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * SelectionHighlight — highlight a selected body with emissive color (spec 6.5)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useThree } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport type { SelectionHighlightProps } from '../types';\n\n/**\n * Applies emissive highlight to all meshes belonging to a body.\n * Restores original emissive when bodyId changes or component unmounts.\n */\nexport function SelectionHighlight({\n bodyId,\n color = '#ff4444',\n emissiveIntensity = 0.3,\n}: SelectionHighlightProps) {\n const { scene } = useThree();\n const prevMeshesRef = useRef<{ mesh: THREE.Mesh; originalEmissive: THREE.Color; originalIntensity: number }[]>([]);\n\n useEffect(() => {\n // Restore previous highlights\n for (const entry of prevMeshesRef.current) {\n const mat = entry.mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n mat.emissive.copy(entry.originalEmissive);\n mat.emissiveIntensity = entry.originalIntensity;\n }\n }\n prevMeshesRef.current = [];\n\n if (bodyId === null || bodyId < 0) return;\n\n // Find all meshes belonging to this body\n const highlightColor = new THREE.Color(color);\n scene.traverse((obj) => {\n if (obj.userData.bodyID === bodyId && (obj as THREE.Mesh).isMesh) {\n const mesh = obj as THREE.Mesh;\n const mat = mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n prevMeshesRef.current.push({\n mesh,\n originalEmissive: mat.emissive.clone(),\n originalIntensity: mat.emissiveIntensity ?? 0,\n });\n mat.emissive.copy(highlightColor);\n mat.emissiveIntensity = emissiveIntensity;\n }\n }\n });\n\n return () => {\n for (const entry of prevMeshesRef.current) {\n const mat = entry.mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n mat.emissive.copy(entry.originalEmissive);\n mat.emissiveIntensity = entry.originalIntensity;\n }\n }\n prevMeshesRef.current = [];\n };\n }, [bodyId, color, emissiveIntensity, scene]);\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo } from 'react';\nimport { useMujocoSim } 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 } = useMujocoSim();\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 { useMujocoSim } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { SitePositionResult } from '../types';\n\n// Preallocated temp for rotation matrix extraction\nconst _mat4 = new THREE.Matrix4();\n\n/**\n * Returns reactive refs for a MuJoCo site's world position and orientation.\n * Refs are updated every frame without triggering React re-renders.\n */\nexport function useSitePosition(siteName: string): SitePositionResult {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\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 { useMujocoSim, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { SensorInfo, SensorResult } from '../types';\n\n/**\n * Access a single MuJoCo sensor by name. Returns a ref-based value\n * updated every physics frame without causing React re-renders.\n */\nexport function useSensor(name: string): SensorResult {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\n const sensorIdRef = useRef(-1);\n const sensorAdrRef = useRef(0);\n const sensorDimRef = useRef(0);\n const valueRef = useRef<Float64Array>(new Float64Array(0));\n\n // Resolve sensor ID once model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n for (let i = 0; i < model.nsensor; i++) {\n if (getName(model, model.name_sensoradr[i]) === name) {\n sensorIdRef.current = i;\n sensorAdrRef.current = model.sensor_adr[i];\n sensorDimRef.current = model.sensor_dim[i];\n valueRef.current = new Float64Array(model.sensor_dim[i]);\n return;\n }\n }\n sensorIdRef.current = -1;\n }, [name, status, mjModelRef]);\n\n // Update every frame after physics step\n useAfterPhysicsStep((_model, data) => {\n if (sensorIdRef.current < 0) return;\n const adr = sensorAdrRef.current;\n const dim = sensorDimRef.current;\n for (let i = 0; i < dim; i++) {\n valueRef.current[i] = data.sensordata[adr + i];\n }\n });\n\n return { value: valueRef, size: sensorDimRef.current };\n}\n\n/**\n * Enumerate all sensors in the loaded MuJoCo model.\n * Returns a stable array recomputed only when the model changes.\n */\nexport function useSensors(): SensorInfo[] {\n const { mjModelRef, status } = useMujocoSim();\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 { useMujocoSim, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { JointStateResult } from '../types';\n\n/**\n * Track a MuJoCo joint's position and velocity by name.\n * Values are updated every physics frame via refs (no re-renders).\n *\n * For hinge/slide joints, position/velocity are scalar (stored as Float64Array of length 1).\n * For ball joints, position is quat (4), velocity is angular vel (3).\n * For free joints, position is pos+quat (7), velocity is lin+ang vel (6).\n */\nexport function useJointState(name: string): JointStateResult {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\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\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 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 positionRef.current = new Float64Array(data.qpos.subarray(qa, qa + qposDimRef.current));\n velocityRef.current = new Float64Array(data.qvel.subarray(da, da + dofDimRef.current));\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 { useMujocoSim, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { BodyStateResult } from '../types';\n\n/**\n * Track a MuJoCo body's world position, quaternion, and velocities.\n * All values are ref-based — updated every physics frame without re-renders.\n */\nexport function useBodyState(name: string): BodyStateResult {\n const { mjModelRef, status } = useMujocoSim();\n const bodyIdRef = useRef(-1);\n const position = useRef(new THREE.Vector3());\n const quaternion = useRef(new THREE.Quaternion());\n const linearVelocity = useRef(new THREE.Vector3());\n const angularVelocity = useRef(new THREE.Vector3());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n bodyIdRef.current = findBodyByName(model, name);\n }, [name, status, mjModelRef]);\n\n useAfterPhysicsStep((_model, data) => {\n const bid = bodyIdRef.current;\n if (bid < 0) return;\n\n // Position from xpos (3 per body)\n const i3 = bid * 3;\n position.current.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n\n // Quaternion from xquat (4 per body, MuJoCo order: w,x,y,z)\n const i4 = bid * 4;\n quaternion.current.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n\n // Velocity from cvel (6 per body: [angular(3), linear(3)])\n if (data.cvel) {\n const i6 = bid * 6;\n angularVelocity.current.set(data.cvel[i6], data.cvel[i6 + 1], data.cvel[i6 + 2]);\n linearVelocity.current.set(data.cvel[i6 + 3], data.cvel[i6 + 4], data.cvel[i6 + 5]);\n }\n });\n\n return { position, quaternion, linearVelocity, angularVelocity };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useCtrl — clean read/write access to a named actuator's ctrl value (spec 3.1)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\n\n/**\n * Access a single actuator's control value by name.\n *\n * Returns [currentValue, setValue]:\n * - `currentValue` is a ref updated every frame (no re-renders).\n * - `setValue` writes directly to `data.ctrl[actuatorId]`.\n */\nexport function useCtrl(name: string): [React.RefObject<number>, (value: number) => void] {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\n const actuatorIdRef = useRef(-1);\n const valueRef = useRef(0);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n actuatorIdRef.current = findActuatorByName(model, name);\n }, [name, status, mjModelRef]);\n\n // Read current value each frame (via afterStep would be ideal but\n // useCtrl is primarily for writing; reading can use the ref)\n const setValue = useCallback((value: number) => {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return;\n data.ctrl[actuatorIdRef.current] = value;\n valueRef.current = value;\n }, [mjDataRef]);\n\n return [valueRef, setValue];\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useKeyboardTeleop — keyboard teleoperation hook (spec 12.1)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoSim, 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 } = useMujocoSim();\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 { useMujocoSim, 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 } = useMujocoSim();\n const lastActionTimeRef = useRef(0);\n const lastActionRef = useRef<Float32Array | Float64Array | number[] | null>(null);\n const isRunningRef = useRef(true);\n const configRef = useRef(config);\n configRef.current = config;\n\n useBeforePhysicsStep((model, data) => {\n if (!isRunningRef.current) return;\n\n const cfg = configRef.current;\n const dt = model.opt?.timestep ?? 0.002;\n const interval = 1.0 / cfg.frequency;\n\n // Check if it's time for a new action\n if (data.time - lastActionTimeRef.current >= interval) {\n // Build observation\n const obs = cfg.onObservation(model, data);\n\n // Apply action (consumer does inference inline or uses cached result)\n cfg.onAction(obs, model, data);\n\n lastActionTimeRef.current = data.time;\n lastActionRef.current = obs;\n }\n });\n\n return {\n get isRunning() { return isRunningRef.current; },\n start: () => { isRunningRef.current = true; },\n stop: () => { isRunningRef.current = false; },\n get lastObservation() { return lastActionRef.current; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryRecorder — trajectory recording hook (spec 13.1)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useMujocoSim, 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 } = useMujocoSim();\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 { useMujocoSim, 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 } = useMujocoSim();\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 { useMujocoSim, 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 } = useMujocoSim();\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"]}
1
+ {"version":3,"sources":["../src/core/MujocoProvider.tsx","../src/core/GenericIK.ts","../src/core/SceneLoader.ts","../src/core/MujocoSimProvider.tsx","../src/core/MujocoCanvas.tsx","../src/rendering/CapsuleGeometry.ts","../src/rendering/Reflector.ts","../src/rendering/GeomBuilder.ts","../src/components/SceneRenderer.tsx","../src/components/IkGizmo.tsx","../src/components/ContactMarkers.tsx","../src/components/DragInteraction.tsx","../src/components/SceneLights.tsx","../src/components/Debug.tsx","../src/components/TendonRenderer.tsx","../src/components/FlexRenderer.tsx","../src/hooks/useContacts.ts","../src/components/ContactListener.tsx","../src/hooks/useTrajectoryPlayer.ts","../src/components/TrajectoryPlayer.tsx","../src/components/SelectionHighlight.tsx","../src/hooks/useActuators.ts","../src/hooks/useSitePosition.ts","../src/hooks/useGravityCompensation.ts","../src/hooks/useSensor.ts","../src/hooks/useJointState.ts","../src/hooks/useBodyState.ts","../src/hooks/useCtrl.ts","../src/hooks/useKeyboardTeleop.ts","../src/hooks/usePolicy.ts","../src/hooks/useTrajectoryRecorder.ts","../src/hooks/useGamepad.ts","../src/hooks/useVideoRecorder.ts","../src/hooks/useCtrlNoise.ts"],"names":["s","tmp","createContext","useContext","useRef","useEffect","useState","api","jsx","MujocoCanvas","THREE2","THREE3","THREE4","useMemo","THREE5","useFrame","THREE6","useThree","THREE7","THREE8","THREE9","THREE10","jsxs","THREE11","THREE12","useCallback","THREE13","_mat4","THREE14","SENSOR_TYPE_NAMES","THREE15"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport loadMujoco from 'mujoco-js';\nimport { createContext, useContext, useEffect, useRef, useState } from 'react';\nimport { MujocoModule, MujocoContextValue } from '../types';\n\nconst MujocoContext = createContext<MujocoContextValue>({\n mujoco: null,\n status: 'loading',\n error: null,\n});\n\n/**\n * Hook to access the MuJoCo WASM module.\n */\nexport function useMujoco(): MujocoContextValue {\n return useContext(MujocoContext);\n}\n\ninterface MujocoProviderProps {\n wasmUrl?: string;\n children: React.ReactNode;\n onError?: (error: Error) => void;\n}\n\n/**\n * MujocoProvider — WASM / module lifecycle.\n * Loads the MuJoCo WASM module on mount and provides it to children via context.\n */\nexport function MujocoProvider({ wasmUrl, children, onError }: MujocoProviderProps) {\n const [status, setStatus] = useState<'loading' | 'ready' | 'error'>('loading');\n const [error, setError] = useState<string | null>(null);\n const moduleRef = useRef<MujocoModule | null>(null);\n const isMounted = useRef(true);\n\n useEffect(() => {\n isMounted.current = true;\n\n loadMujoco({\n ...(wasmUrl ? { locateFile: (path: string) => path.endsWith('.wasm') ? wasmUrl : path } : {}),\n printErr: (text: string) => {\n if (text.includes('Aborted') && isMounted.current) {\n setError('Simulation crashed. Reload page.');\n setStatus('error');\n }\n },\n })\n .then((inst: unknown) => {\n if (isMounted.current) {\n moduleRef.current = inst as MujocoModule;\n setStatus('ready');\n }\n })\n .catch((err: Error) => {\n if (isMounted.current) {\n const msg = err.message || 'Failed to init spatial simulation';\n setError(msg);\n setStatus('error');\n onError?.(new Error(msg));\n }\n });\n\n return () => {\n isMounted.current = false;\n };\n }, [wasmUrl]);\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 * as THREE from 'three';\nimport { MujocoModule, MujocoModel, MujocoData } from '../types';\n\nexport interface GenericIKOptions {\n maxIterations: number;\n damping: number;\n tolerance: number;\n epsilon: number;\n posWeight: number;\n rotWeight: number;\n}\n\nconst DEFAULTS: GenericIKOptions = {\n maxIterations: 50,\n damping: 0.01,\n tolerance: 1e-3,\n epsilon: 1e-6,\n posWeight: 1.0,\n rotWeight: 0.3,\n};\n\n/**\n * Generic Damped Least-Squares IK solver.\n * Uses finite-difference Jacobian via MuJoCo's mj_forward.\n * Works for any MuJoCo model — no robot-specific parameters.\n */\nexport class GenericIK {\n private mujoco: MujocoModule;\n\n constructor(mujoco: MujocoModule) {\n this.mujoco = mujoco;\n }\n\n /**\n * Solve IK for a target 6-DOF pose.\n * @param model MuJoCo model\n * @param data MuJoCo data (qpos will be temporarily modified, then restored)\n * @param siteId Index of the end-effector site to control\n * @param numJoints Number of arm joints (assumes qpos[0..numJoints-1])\n * @param targetPos Target position in world frame\n * @param targetQuat Target orientation in world frame\n * @param currentQ Current joint angles (length = numJoints)\n * @param opts Optional solver parameters\n * @returns Joint angles array, or null if solver diverged\n */\n solve(\n model: MujocoModel,\n data: MujocoData,\n siteId: number,\n numJoints: number,\n targetPos: THREE.Vector3,\n targetQuat: THREE.Quaternion,\n currentQ: number[],\n opts?: Partial<GenericIKOptions>\n ): number[] | null {\n const o = { ...DEFAULTS, ...opts };\n const n = numJoints;\n\n // Save full qpos so we can restore after solving\n const savedQpos = new Float64Array(data.qpos.length);\n savedQpos.set(data.qpos);\n\n // Build target rotation matrix (3x3 row-major)\n const R_target = quatToMat3(targetQuat);\n\n // Working joint angles — start from current configuration\n const q = new Float64Array(n);\n for (let i = 0; i < n; i++) q[i] = currentQ[i];\n\n // Pre-allocate work arrays\n const J = new Float64Array(6 * n); // 6×n Jacobian (row-major)\n const JJt = new Float64Array(36); // 6×6\n const rhs = new Float64Array(6); // right-hand side\n const x = new Float64Array(6); // solve result\n const dq = new Float64Array(n); // joint update\n const baseSitePos = new Float64Array(3);\n const baseSiteMat = new Float64Array(9);\n const pertSitePos = new Float64Array(3);\n const pertSiteMat = new Float64Array(9);\n\n let bestQ: number[] | null = null;\n let bestErr = Infinity;\n\n for (let iter = 0; iter < o.maxIterations; iter++) {\n // Set joints and run FK\n for (let i = 0; i < n; i++) data.qpos[i] = q[i];\n this.mujoco.mj_forward(model, data);\n\n // Read current site pose\n const sp = data.site_xpos;\n const sm = data.site_xmat;\n const off3 = siteId * 3;\n const off9 = siteId * 9;\n for (let i = 0; i < 3; i++) baseSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) baseSiteMat[i] = sm[off9 + i];\n\n // Compute 6D error\n const posErr0 = targetPos.x - baseSitePos[0];\n const posErr1 = targetPos.y - baseSitePos[1];\n const posErr2 = targetPos.z - baseSitePos[2];\n const rotErr = orientationError(baseSiteMat, R_target);\n\n const error = [\n posErr0 * o.posWeight,\n posErr1 * o.posWeight,\n posErr2 * o.posWeight,\n rotErr[0] * o.rotWeight,\n rotErr[1] * o.rotWeight,\n rotErr[2] * o.rotWeight,\n ];\n\n const errNorm = Math.sqrt(\n error[0] * error[0] + error[1] * error[1] + error[2] * error[2] +\n error[3] * error[3] + error[4] * error[4] + error[5] * error[5]\n );\n\n // Track best solution\n if (errNorm < bestErr) {\n bestErr = errNorm;\n bestQ = Array.from(q);\n }\n\n // Converged\n if (errNorm < o.tolerance) break;\n\n // Compute Jacobian via finite differences\n for (let j = 0; j < n; j++) {\n const saved = data.qpos[j];\n data.qpos[j] = q[j] + o.epsilon;\n this.mujoco.mj_forward(model, data);\n\n for (let i = 0; i < 3; i++) pertSitePos[i] = sp[off3 + i];\n for (let i = 0; i < 9; i++) pertSiteMat[i] = sm[off9 + i];\n\n // Position Jacobian columns (rows 0-2)\n J[0 * n + j] = ((pertSitePos[0] - baseSitePos[0]) / o.epsilon) * o.posWeight;\n J[1 * n + j] = ((pertSitePos[1] - baseSitePos[1]) / o.epsilon) * o.posWeight;\n J[2 * n + j] = ((pertSitePos[2] - baseSitePos[2]) / o.epsilon) * o.posWeight;\n\n // Orientation Jacobian columns (rows 3-5)\n // δR = R_perturbed * R_base^T, then extract angular velocity\n const dRot = angularDelta(baseSiteMat, pertSiteMat);\n J[3 * n + j] = (dRot[0] / o.epsilon) * o.rotWeight;\n J[4 * n + j] = (dRot[1] / o.epsilon) * o.rotWeight;\n J[5 * n + j] = (dRot[2] / o.epsilon) * o.rotWeight;\n\n // Restore joint\n data.qpos[j] = saved;\n }\n\n // Restore base FK state for next iteration\n for (let i = 0; i < n; i++) data.qpos[i] = q[i];\n\n // Damped least squares: Δq = Jᵀ (J Jᵀ + λI)⁻¹ error\n // 1. Compute JJᵀ (6×6)\n for (let r = 0; r < 6; r++) {\n for (let c = 0; c < 6; c++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += J[r * n + k] * J[c * n + k];\n }\n JJt[r * 6 + c] = sum + (r === c ? o.damping : 0);\n }\n }\n\n // 2. Solve (JJᵀ + λI) x = error\n for (let i = 0; i < 6; i++) rhs[i] = error[i];\n solve6x6(JJt, rhs, x);\n\n // 3. Δq = Jᵀ x\n for (let j = 0; j < n; j++) {\n let sum = 0;\n for (let r = 0; r < 6; r++) {\n sum += J[r * n + j] * x[r];\n }\n dq[j] = sum;\n }\n\n // Update joints\n for (let i = 0; i < n; i++) q[i] += dq[i];\n }\n\n // Restore original qpos\n data.qpos.set(savedQpos);\n this.mujoco.mj_forward(model, data);\n\n return bestQ;\n }\n}\n\n// --- Math utilities ---\n\n/** Convert THREE.Quaternion to 3x3 rotation matrix (row-major Float64Array) */\nfunction quatToMat3(q: THREE.Quaternion): Float64Array {\n const m = new Float64Array(9);\n const x = q.x, y = q.y, z = q.z, w = q.w;\n const xx = x * x, yy = y * y, zz = z * z;\n const xy = x * y, xz = x * z, yz = y * z;\n const wx = w * x, wy = w * y, wz = w * z;\n m[0] = 1 - 2 * (yy + zz); m[1] = 2 * (xy - wz); m[2] = 2 * (xz + wy);\n m[3] = 2 * (xy + wz); m[4] = 1 - 2 * (xx + zz); m[5] = 2 * (yz - wx);\n m[6] = 2 * (xz - wy); m[7] = 2 * (yz + wx); m[8] = 1 - 2 * (xx + yy);\n return m;\n}\n\n/**\n * Compute orientation error between current and target rotation matrices.\n * Returns the axis-angle vector (log map of R_target * R_current^T).\n * Uses the small-angle approximation: error ≈ 0.5 * [R32-R23, R13-R31, R21-R12]\n * where R = R_target * R_current^T.\n */\nfunction orientationError(R_cur: Float64Array, R_tgt: Float64Array): [number, number, number] {\n // R_err = R_tgt * R_cur^T (both row-major 3x3)\n // R_err[i][j] = sum_k R_tgt[i][k] * R_cur[j][k] (note: transposing R_cur)\n const Re = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_tgt[i * 3 + k] * R_cur[j * 3 + k];\n }\n Re[i * 3 + j] = s;\n }\n }\n\n // Extract axis-angle from rotation matrix\n // For better accuracy than small-angle approx, use full log map\n const trace = Re[0] + Re[4] + Re[8];\n const cosAngle = Math.max(-1, Math.min(1, (trace - 1) * 0.5));\n const angle = Math.acos(cosAngle);\n\n // Near zero rotation — use small-angle approximation\n if (angle < 1e-6) {\n return [0, 0, 0];\n }\n\n // Near π — degenerate, use small-angle approx of the skew-symmetric part\n if (angle > Math.PI - 1e-6) {\n return [\n 0.5 * (Re[7] - Re[5]),\n 0.5 * (Re[2] - Re[6]),\n 0.5 * (Re[3] - Re[1]),\n ];\n }\n\n // General case: axis = skew(R_err) / (2 sin(angle)), scaled by angle\n const s = angle / (2 * Math.sin(angle));\n return [\n s * (Re[7] - Re[5]),\n s * (Re[2] - Re[6]),\n s * (Re[3] - Re[1]),\n ];\n}\n\n/**\n * Compute angular velocity vector from R_base to R_perturbed.\n * Returns the axis-angle of R_perturbed * R_base^T.\n * (Small angle: the rotation caused by the perturbation.)\n */\nfunction angularDelta(R_base: Float64Array, R_pert: Float64Array): [number, number, number] {\n // δR = R_pert * R_base^T\n // Small angle approx: ω ≈ 0.5 * [δR[7]-δR[5], δR[2]-δR[6], δR[3]-δR[1]]\n // This is fine because the perturbation epsilon is tiny.\n const dR = new Float64Array(9);\n for (let i = 0; i < 3; i++) {\n for (let j = 0; j < 3; j++) {\n let s = 0;\n for (let k = 0; k < 3; k++) {\n s += R_pert[i * 3 + k] * R_base[j * 3 + k];\n }\n dR[i * 3 + j] = s;\n }\n }\n return [\n 0.5 * (dR[7] - dR[5]),\n 0.5 * (dR[2] - dR[6]),\n 0.5 * (dR[3] - dR[1]),\n ];\n}\n\n/**\n * Solve 6×6 linear system Ax = b via Gaussian elimination with partial pivoting.\n * Modifies A and b in place. Result written to x.\n */\nfunction solve6x6(A: Float64Array, b: Float64Array, x: Float64Array): void {\n const N = 6;\n // Work on copies to avoid destroying originals needed elsewhere\n const a = new Float64Array(A);\n const r = new Float64Array(b);\n\n // Forward elimination with partial pivoting\n for (let col = 0; col < N; col++) {\n // Find pivot\n let maxVal = Math.abs(a[col * N + col]);\n let maxRow = col;\n for (let row = col + 1; row < N; row++) {\n const val = Math.abs(a[row * N + col]);\n if (val > maxVal) { maxVal = val; maxRow = row; }\n }\n\n // Swap rows\n if (maxRow !== col) {\n for (let k = 0; k < N; k++) {\n const tmp = a[col * N + k]; a[col * N + k] = a[maxRow * N + k]; a[maxRow * N + k] = tmp;\n }\n const tmp = r[col]; r[col] = r[maxRow]; r[maxRow] = tmp;\n }\n\n const pivot = a[col * N + col];\n if (Math.abs(pivot) < 1e-12) {\n // Singular — return zeros\n x.fill(0);\n return;\n }\n\n // Eliminate below\n for (let row = col + 1; row < N; row++) {\n const factor = a[row * N + col] / pivot;\n for (let k = col; k < N; k++) {\n a[row * N + k] -= factor * a[col * N + k];\n }\n r[row] -= factor * r[col];\n }\n }\n\n // Back substitution\n for (let row = N - 1; row >= 0; row--) {\n let sum = r[row];\n for (let k = row + 1; k < N; k++) {\n sum -= a[row * N + k] * x[k];\n }\n x[row] = sum / a[row * N + row];\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MujocoData, MujocoModel, MujocoModule } from '../types';\nimport { SceneConfig, SceneObject, XmlPatch } from '../types';\n\n/**\n * Reads a null-terminated C string from MuJoCo's WASM memory.\n */\nexport function getName(mjModel: MujocoModel, address: number): string {\n let name = '';\n let idx = address;\n let safety = 0;\n while (mjModel.names[idx] !== 0 && safety < 100) {\n name += String.fromCharCode(mjModel.names[idx++]);\n safety++;\n }\n return name;\n}\n\n/**\n * Find a site by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSiteByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsite; i++) {\n if (getName(mjModel, mjModel.name_siteadr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find an actuator by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findActuatorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nu; i++) {\n if (getName(mjModel, mjModel.name_actuatoradr[i]).includes(name)) return i;\n }\n return -1;\n}\n\n/**\n * Find a keyframe by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findKeyframeByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nkey; i++) {\n if (getName(mjModel, mjModel.name_keyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a body by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findBodyByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nbody; i++) {\n if (getName(mjModel, mjModel.name_bodyadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a joint by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findJointByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.njnt; i++) {\n if (getName(mjModel, mjModel.name_jntadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a geom by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findGeomByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.ngeom; i++) {\n if (getName(mjModel, mjModel.name_geomadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a sensor by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findSensorByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < mjModel.nsensor; i++) {\n if (getName(mjModel, mjModel.name_sensoradr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Find a tendon by name in the MuJoCo model. Returns -1 if not found.\n */\nexport function findTendonByName(mjModel: MujocoModel, name: string): number {\n for (let i = 0; i < (mjModel.ntendon ?? 0); i++) {\n if (getName(mjModel, mjModel.name_tendonadr[i]) === name) return i;\n }\n return -1;\n}\n\n/**\n * Convert a SceneObject config to MuJoCo XML.\n */\nfunction sceneObjectToXml(obj: SceneObject): string {\n const joint = obj.freejoint ? '<freejoint/>' : '';\n const pos = obj.position.map((v) => v.toFixed(3)).join(' ');\n const size = obj.size.map((v) => v.toFixed(3)).join(' ');\n const rgba = obj.rgba.join(' ');\n const mass = obj.mass ? ` mass=\"${obj.mass}\"` : '';\n const friction = obj.friction ? ` friction=\"${obj.friction}\"` : '';\n const solref = obj.solref ? ` solref=\"${obj.solref}\"` : '';\n const solimp = obj.solimp ? ` solimp=\"${obj.solimp}\"` : '';\n const condim = obj.condim ? ` condim=\"${obj.condim}\"` : '';\n // Always set contype/conaffinity=1 so objects collide regardless of model defaults\n return `<body name=\"${obj.name}\" pos=\"${pos}\">${joint}<geom type=\"${obj.type}\" size=\"${size}\" rgba=\"${rgba}\" contype=\"1\" conaffinity=\"1\"${mass}${friction}${solref}${solimp}${condim}/></body>`;\n}\n\ninterface LoadResult {\n mjModel: MujocoModel;\n mjData: MujocoData;\n siteId: number;\n gripperId: number;\n}\n\n/**\n * Config-driven scene loader — replaces the old RobotLoader + patchSingleRobot approach.\n */\nexport async function loadScene(\n mujoco: MujocoModule,\n config: SceneConfig,\n onProgress?: (msg: string) => void\n): Promise<LoadResult> {\n // 1. Clean up virtual filesystem\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n try { mujoco.FS.mkdir('/working'); } catch { /* ignore */ }\n\n const baseUrl =\n config.baseUrl ||\n `https://raw.githubusercontent.com/google-deepmind/mujoco_menagerie/main/${config.robotId}/`;\n\n const downloaded = new Set<string>();\n const queue: string[] = [config.sceneFile];\n const parser = new DOMParser();\n\n // 2. Download all model files\n while (queue.length > 0) {\n const fname = queue.shift()!;\n if (downloaded.has(fname)) continue;\n downloaded.add(fname);\n\n onProgress?.(`Downloading ${fname}...`);\n\n const res = await fetch(baseUrl + fname);\n if (!res.ok) {\n console.warn(`Failed to fetch ${fname}: ${res.status} ${res.statusText}`);\n continue;\n }\n\n // Create virtual directory structure\n const dirParts = fname.split('/');\n dirParts.pop();\n let currentPath = '/working';\n for (const part of dirParts) {\n currentPath += '/' + part;\n try { mujoco.FS.mkdir(currentPath); } catch { /* ignore */ }\n }\n\n if (fname.endsWith('.xml')) {\n let text = await res.text();\n\n // 3. Apply XML patches from config\n for (const patch of config.xmlPatches ?? []) {\n if (fname.endsWith(patch.target) || fname === patch.target) {\n if (patch.replace) {\n text = text.replace(patch.replace[0], patch.replace[1]);\n }\n if (patch.inject && patch.injectAfter) {\n const idx = text.indexOf(patch.injectAfter);\n if (idx !== -1) {\n // Find the end of the opening tag (next '>') after the match\n const tagEnd = text.indexOf('>', idx + patch.injectAfter.length);\n if (tagEnd !== -1) {\n text = text.slice(0, tagEnd + 1) + patch.inject + text.slice(tagEnd + 1);\n }\n }\n }\n }\n }\n\n // 4. Inject scene objects into the scene file\n if (fname === config.sceneFile && config.sceneObjects?.length) {\n const xml = config.sceneObjects.map((obj) => sceneObjectToXml(obj)).join('');\n text = text.replace('</worldbody>', xml + '</worldbody>');\n }\n\n mujoco.FS.writeFile(`/working/${fname}`, text);\n scanDependencies(text, fname, parser, downloaded, queue);\n } else {\n const buffer = new Uint8Array(await res.arrayBuffer());\n mujoco.FS.writeFile(`/working/${fname}`, buffer);\n }\n }\n\n // 5. Load model\n onProgress?.('Loading model...');\n const mjModel = mujoco.MjModel.loadFromXML(`/working/${config.sceneFile}`);\n const mjData = new mujoco.MjData(mjModel);\n\n // 6. Find TCP site and gripper actuator\n const siteId = findSiteByName(mjModel, config.tcpSiteName ?? 'tcp');\n const gripperId = findActuatorByName(mjModel, config.gripperActuatorName ?? 'gripper');\n\n // 7. Set initial pose\n if (config.homeJoints) {\n for (let i = 0; i < config.homeJoints.length; i++) {\n mjData.ctrl[i] = config.homeJoints[i];\n if (mjModel.actuator_trnid[2 * i + 1] === 1) {\n const jointId = mjModel.actuator_trnid[2 * i];\n if (jointId >= 0 && jointId < mjModel.njnt) {\n const qposAdr = mjModel.jnt_qposadr[jointId];\n mjData.qpos[qposAdr] = config.homeJoints[i];\n }\n }\n }\n }\n\n mujoco.mj_forward(mjModel, mjData);\n\n return { mjModel, mjData, siteId, gripperId };\n}\n\n/**\n * Scan XML for file dependencies (meshes, textures, includes).\n */\nfunction scanDependencies(\n xmlString: string,\n currentFile: string,\n parser: DOMParser,\n downloaded: Set<string>,\n queue: string[]\n) {\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\n\n const compiler = xmlDoc.querySelector('compiler');\n const meshDir = compiler?.getAttribute('meshdir') || '';\n const textureDir = compiler?.getAttribute('texturedir') || '';\n const currentDir = currentFile.includes('/')\n ? currentFile.substring(0, currentFile.lastIndexOf('/') + 1)\n : '';\n\n xmlDoc.querySelectorAll('[file]').forEach((el) => {\n const fileAttr = el.getAttribute('file');\n if (!fileAttr) return;\n\n let prefix = '';\n if (el.tagName.toLowerCase() === 'mesh') {\n prefix = meshDir ? meshDir + '/' : '';\n } else if (['texture', 'hfield'].includes(el.tagName.toLowerCase())) {\n prefix = textureDir ? textureDir + '/' : '';\n }\n\n let fullPath = (currentDir + prefix + fileAttr).replace(/\\/\\//g, '/');\n const parts = fullPath.split('/');\n const norm: string[] = [];\n for (const p of parts) {\n if (p === '..') norm.pop();\n else if (p !== '.') norm.push(p);\n }\n fullPath = norm.join('/');\n\n if (!downloaded.has(fullPath)) queue.push(fullPath);\n });\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, 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 } from '../types';\nimport { GenericIK } from './GenericIK';\nimport {\n ActuatorInfo,\n BodyInfo,\n ContactInfo,\n GeomInfo,\n IKSolveFn,\n JointInfo,\n ModelOptions,\n MujocoSimAPI,\n PhysicsStepCallback,\n RayHit,\n SceneConfig,\n SensorInfo,\n SiteInfo,\n StateSnapshot,\n} from '../types';\nimport {\n loadScene,\n findKeyframeByName,\n findBodyByName,\n findGeomByName,\n findSensorByName,\n findActuatorByName,\n getName,\n} from './SceneLoader';\n\n// ---- Joint type names ----\nconst JOINT_TYPE_NAMES = ['free', 'ball', 'slide', 'hinge'];\n// ---- Geom type names ----\nconst GEOM_TYPE_NAMES = ['plane', 'hfield', 'sphere', 'capsule', 'ellipsoid', 'cylinder', 'box', 'mesh'];\n// ---- Sensor type names (subset — MuJoCo has many) ----\n// Sensor type names matching mjtSensor enum in mujoco WASM (mujoco-js 0.0.7)\nconst SENSOR_TYPE_NAMES: Record<number, string> = {\n 0: 'touch', 1: 'accelerometer', 2: 'velocimeter', 3: 'gyro',\n 4: 'force', 5: 'torque', 6: 'magnetometer', 7: 'rangefinder',\n 8: 'camprojection', 9: 'jointpos', 10: 'jointvel', 11: 'tendonpos',\n 12: 'tendonvel', 13: 'actuatorpos', 14: 'actuatorvel', 15: 'actuatorfrc',\n 16: 'jointactfrc', 17: 'tendonactfrc', 18: 'ballquat', 19: 'ballangvel',\n 20: 'jointlimitpos', 21: 'jointlimitvel', 22: 'jointlimitfrc',\n 23: 'tendonlimitpos', 24: 'tendonlimitvel', 25: 'tendonlimitfrc',\n 26: 'framepos', 27: 'framequat', 28: 'framexaxis', 29: 'frameyaxis',\n 30: 'framezaxis', 31: 'framelinvel', 32: 'frameangvel',\n 33: 'framelinacc', 34: 'frameangacc', 35: 'subtreecom',\n 36: 'subtreelinvel', 37: 'subtreeangmom', 38: 'insidesite',\n 39: 'geomdist', 40: 'geomnormal', 41: 'geomfromto',\n 42: 'contact', 43: 'e_potential', 44: 'e_kinetic',\n 45: 'clock', 46: 'tactile', 47: 'plugin', 48: 'user',\n};\n\n// Preallocated force/torque temps for applyForce/applyTorque\nconst _applyForce = new Float64Array(3);\nconst _applyTorque = new Float64Array(3);\nconst _applyPoint = new Float64Array(3);\nconst _rayPnt = new Float64Array(3);\nconst _rayVec = new Float64Array(3);\nconst _rayGeomId = new Int32Array(1);\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 siteIdRef: React.RefObject<number>;\n gripperIdRef: React.RefObject<number>;\n ikEnabledRef: React.RefObject<boolean>;\n ikCalculatingRef: React.RefObject<boolean>;\n pausedRef: React.RefObject<boolean>;\n speedRef: React.RefObject<number>;\n substepsRef: React.RefObject<number>;\n ikTargetRef: React.RefObject<THREE.Group>;\n genericIkRef: React.RefObject<GenericIK>;\n ikSolveFnRef: React.RefObject<IKSolveFn>;\n firstIkEnableRef: React.RefObject<boolean>;\n gizmoAnimRef: React.RefObject<{\n active: boolean;\n startPos: THREE.Vector3;\n endPos: THREE.Vector3;\n startRot: THREE.Quaternion;\n endRot: THREE.Quaternion;\n startTime: number;\n duration: number;\n }>;\n cameraAnimRef: React.RefObject<{\n active: boolean;\n startPos: THREE.Vector3;\n endPos: THREE.Vector3;\n startRot: THREE.Quaternion;\n endRot: THREE.Quaternion;\n startTarget: THREE.Vector3;\n endTarget: THREE.Vector3;\n startTime: number;\n duration: number;\n resolve: (() => void) | null;\n }>;\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 status: 'loading' | 'ready' | 'error';\n}\n\nconst MujocoSimContext = createContext<MujocoSimContextValue | null>(null);\n\nexport function useMujocoSim(): MujocoSimContextValue {\n const ctx = useContext(MujocoSimContext);\n if (!ctx)\n throw new Error('useMujocoSim must be used inside <MujocoSimProvider>');\n return ctx;\n}\n\nexport function useBeforePhysicsStep(callback: PhysicsStepCallback) {\n const { beforeStepCallbacks } = useMujocoSim();\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 } = useMujocoSim();\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 (spec 1.1)\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 siteIdRef = useRef(-1);\n const gripperIdRef = useRef(-1);\n const ikEnabledRef = useRef(false);\n const ikCalculatingRef = useRef(false);\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 firstIkEnableRef = useRef(true);\n const stepsToRunRef = useRef(0); // for single-step mode (spec 1.2)\n\n // Interpolation state (spec 11.1)\n const prevXposRef = useRef<Float64Array | null>(null);\n const prevXquatRef = useRef<Float64Array | null>(null);\n const interpAlphaRef = 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\n configRef.current = config;\n\n // Sync declarative props to refs\n useEffect(() => { pausedRef.current = paused ?? false; }, [paused]);\n useEffect(() => { speedRef.current = speed ?? 1; }, [speed]);\n useEffect(() => { substepsRef.current = substeps ?? 1; }, [substeps]);\n useEffect(() => { interpolateRef.current = interpolate ?? false; }, [interpolate]);\n\n // Sync gravity prop (spec 1.1)\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 (spec 1.1)\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 const ikTargetRef = useRef<THREE.Group>(new THREE.Group());\n const genericIkRef = useRef<GenericIK>(new GenericIK(mujoco));\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 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 const orbitTargetRef = useRef(new THREE.Vector3(0, 0, 0));\n\n // --- Helper: sync gizmo to actual MuJoCo site position ---\n const syncGizmoToSite = useCallback((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 const m = new THREE.Matrix4().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(m);\n }, []);\n\n // IK solve function\n const ikSolveFn = useCallback(\n (pos: THREE.Vector3, quat: THREE.Quaternion, currentQ: number[]): number[] | null => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || siteIdRef.current === -1) return null;\n return genericIkRef.current.solve(\n model, data, siteIdRef.current,\n configRef.current.numArmJoints ?? 7,\n pos, quat, currentQ\n );\n },\n []\n );\n const ikSolveFnRef = useRef<IKSolveFn>(ikSolveFn);\n ikSolveFnRef.current = ikSolveFn;\n\n // --- Load scene on mount ---\n useEffect(() => {\n let disposed = false;\n\n (async () => {\n try {\n const result = await loadScene(mujoco, config);\n if (disposed) {\n result.mjModel.delete();\n result.mjData.delete();\n return;\n }\n\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n siteIdRef.current = result.siteId;\n gripperIdRef.current = result.gripperId;\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 if (ikTargetRef.current) {\n syncGizmoToSite(result.mjData, result.siteId, ikTargetRef.current);\n }\n\n setStatus('ready');\n } catch (e: unknown) {\n if (!disposed) {\n setStatus('error');\n onError?.(e instanceof Error ? e : new Error(String(e)));\n }\n }\n })();\n\n return () => {\n disposed = true;\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n try { mujoco.FS.unmount('/working'); } catch { /* ignore */ }\n };\n }, [mujoco, config]);\n\n // Fire onReady and assign external ref when status changes to ready\n useEffect(() => {\n if (status === 'ready') {\n const api = apiRef.current;\n if (onReady) onReady(api);\n // Assign the forwarded ref\n if (externalApiRef) {\n if (typeof externalApiRef === 'function') {\n externalApiRef(api);\n } else {\n (externalApiRef as React.MutableRefObject<MujocoSimAPI | null>).current = api;\n }\n }\n }\n }, [status]);\n\n // --- Physics step (priority -1) ---\n useFrame((state) => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n // Gizmo animation\n const ga = gizmoAnimRef.current;\n const target = ikTargetRef.current;\n if (ga.active && target) {\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 // Camera animation\n const ca = cameraAnimRef.current;\n if (ca.active) {\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 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 const orbitControls = state.controls as { target?: THREE.Vector3 };\n if (orbitControls?.target) {\n orbitControls.target.copy(orbitTargetRef.current);\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 // Check single-step mode (spec 1.2)\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 // IK\n if (ikEnabledRef.current && target) {\n ikCalculatingRef.current = true;\n const numArm = configRef.current.numArmJoints ?? 7;\n const currentQ: number[] = [];\n for (let i = 0; i < numArm; i++) currentQ.push(data.qpos[i]);\n const solution = ikSolveFnRef.current(target.position, target.quaternion, currentQ);\n if (solution) {\n for (let i = 0; i < numArm; i++) data.ctrl[i] = solution[i];\n }\n } else {\n ikCalculatingRef.current = false;\n }\n\n // Step physics with substeps (spec 1.1)\n const numSubsteps = substepsRef.current;\n if (stepsToRunRef.current > 0) {\n // Single-step mode (spec 1.2)\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 frameTime = (1.0 / 60.0) * speedRef.current;\n while (data.time - startSimTime < frameTime) {\n for (let s = 0; s < numSubsteps; s++) {\n mujoco.mj_step(model, data);\n }\n }\n }\n\n // After-step callbacks\n for (const cb of afterStepCallbacks.current) {\n cb(model, data);\n }\n\n onStepRef.current?.(data.time);\n }, -1);\n\n // --- API Methods ---\n\n const reset = useCallback(() => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n gizmoAnimRef.current.active = false;\n mujoco.mj_resetData(model, data);\n\n const homeJoints = configRef.current.homeJoints;\n if (homeJoints) {\n for (let i = 0; i < homeJoints.length; i++) {\n data.ctrl[i] = homeJoints[i];\n if (model.actuator_trnid[2 * i + 1] === 1) {\n const jointId = model.actuator_trnid[2 * i];\n if (jointId >= 0 && jointId < model.njnt) {\n const qposAdr = model.jnt_qposadr[jointId];\n data.qpos[qposAdr] = homeJoints[i];\n }\n }\n }\n }\n\n configRef.current.onReset?.(model, data);\n mujoco.mj_forward(model, data);\n\n if (ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n firstIkEnableRef.current = true;\n ikEnabledRef.current = false;\n }, [mujoco, syncGizmoToSite]);\n\n const setIkEnabled = useCallback((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 }, [syncGizmoToSite]);\n\n const syncTargetToSite = useCallback(() => {\n const data = mjDataRef.current;\n const target = ikTargetRef.current;\n if (data && target) syncGizmoToSite(data, siteIdRef.current, target);\n }, [syncGizmoToSite]);\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(new THREE.Euler(Math.PI, 0, 0));\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 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 // spec 1.1: declarative pause\n const setPaused = useCallback((p: boolean) => {\n pausedRef.current = p;\n }, []);\n\n // spec 1.2: single-step mode\n const step = useCallback((n = 1) => {\n stepsToRunRef.current = n;\n }, []);\n\n // spec 1.3: simulation time access\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 // spec 4.1: state snapshot save/restore\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 // spec 4.3: qpos/qvel direct set/get\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 // spec 3.1: ctrl set/get\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 // Single actuator by name\n const id = findActuatorByName(model, nameOrValues);\n if (id >= 0 && value !== undefined) data.ctrl[id] = value;\n } else {\n // Batch: { name: value, ... }\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 // spec 8.1: force/torque API\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 // spec 2.1: sensor data\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 // spec 2.4: contacts\n const getContacts = useCallback((): ContactInfo[] => {\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return [];\n const contacts: ContactInfo[] = [];\n const ncon = data.ncon;\n for (let i = 0; i < ncon; i++) {\n try {\n const c = (data.contact as { get(i: number): { geom1: number; geom2: number; pos: Float64Array; dist: number } }).get(i);\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 } catch {\n break; // WASM contact access can fail\n }\n }\n return contacts;\n }, []);\n\n // spec 5.1: model introspection\n const getBodies = useCallback((): BodyInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: BodyInfo[] = [];\n for (let i = 0; i < model.nbody; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_bodyadr[i]),\n mass: model.body_mass[i],\n parentId: model.body_parentid[i],\n });\n }\n return result;\n }, []);\n\n const getJoints = useCallback((): JointInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: JointInfo[] = [];\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const limited = model.jnt_limited ? model.jnt_limited[i] !== 0 : false;\n result.push({\n id: i,\n name: getName(model, model.name_jntadr[i]),\n type,\n typeName: JOINT_TYPE_NAMES[type] ?? `unknown(${type})`,\n range: [model.jnt_range[2 * i], model.jnt_range[2 * i + 1]],\n limited,\n bodyId: model.jnt_bodyid[i],\n qposAdr: model.jnt_qposadr[i],\n dofAdr: model.jnt_dofadr[i],\n });\n }\n return result;\n }, []);\n\n const getGeoms = useCallback((): GeomInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: GeomInfo[] = [];\n for (let i = 0; i < model.ngeom; i++) {\n const type = model.geom_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_geomadr[i]),\n type,\n typeName: GEOM_TYPE_NAMES[type] ?? `unknown(${type})`,\n size: [model.geom_size[3 * i], model.geom_size[3 * i + 1], model.geom_size[3 * i + 2]],\n bodyId: model.geom_bodyid[i],\n });\n }\n return result;\n }, []);\n\n const getSites = useCallback((): SiteInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SiteInfo[] = [];\n for (let i = 0; i < model.nsite; i++) {\n result.push({\n id: i,\n name: getName(model, model.name_siteadr[i]),\n bodyId: model.site_bodyid ? model.site_bodyid[i] : -1,\n });\n }\n return result;\n }, []);\n\n const getActuatorsApi = useCallback((): ActuatorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: ActuatorInfo[] = [];\n for (let i = 0; i < model.nu; i++) {\n const hasRange = model.actuator_ctrlrange[2 * i] < model.actuator_ctrlrange[2 * i + 1];\n result.push({\n id: i,\n name: getName(model, model.name_actuatoradr[i]),\n range: hasRange\n ? [model.actuator_ctrlrange[2 * i], model.actuator_ctrlrange[2 * i + 1]]\n : [-Infinity, Infinity],\n });\n }\n return result;\n }, []);\n\n const getSensors = useCallback((): SensorInfo[] => {\n const model = mjModelRef.current;\n if (!model) return [];\n const result: SensorInfo[] = [];\n for (let i = 0; i < model.nsensor; i++) {\n const type = model.sensor_type[i];\n result.push({\n id: i,\n name: getName(model, model.name_sensoradr[i]),\n type,\n typeName: SENSOR_TYPE_NAMES[type] ?? `unknown(${type})`,\n dim: model.sensor_dim[i],\n adr: model.sensor_adr[i],\n });\n }\n return result;\n }, []);\n\n // spec 5.3: model options\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 // spec 7.1: physics raycast\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; // mj_ray may not be available in all WASM builds\n }\n }, [mujoco]);\n\n // spec 4.2: keyframe improvements\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 // Also restore qvel if available (spec 4.2)\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 if (ikTargetRef.current) {\n syncGizmoToSite(data, siteIdRef.current, ikTargetRef.current);\n }\n }, [mujoco, syncGizmoToSite]);\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 // spec 9.1: runtime model swap\n const loadSceneApi = useCallback(async (newConfig: SceneConfig): Promise<void> => {\n try {\n // Clean up current model\n mjModelRef.current?.delete();\n mjDataRef.current?.delete();\n mjModelRef.current = null;\n mjDataRef.current = null;\n setStatus('loading');\n\n const result = await loadScene(mujoco, newConfig);\n mjModelRef.current = result.mjModel;\n mjDataRef.current = result.mjData;\n siteIdRef.current = result.siteId;\n gripperIdRef.current = result.gripperId;\n configRef.current = newConfig;\n\n if (ikTargetRef.current) {\n syncGizmoToSite(result.mjData, result.siteId, ikTargetRef.current);\n }\n setStatus('ready');\n } catch (e) {\n setStatus('error');\n throw e;\n }\n }, [mujoco, syncGizmoToSite]);\n\n const getGizmoStats = useCallback((): { 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 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 const ndc = new THREE.Vector2(x * 2 - 1, -(y * 2 - 1));\n const raycaster = new THREE.Raycaster();\n raycaster.setFromCamera(ndc, 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 = raycaster.intersectObjects(objects);\n if (hits.length > 0) {\n const hitObj = hits[0].object;\n // Find geomId from the hit object's userData\n const geomId = hitObj.userData.geomID !== undefined ? hitObj.userData.geomID : -1;\n // Walk up to find bodyId\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 (spec 10.3) ---\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 const getCameraState = useCallback((): { position: THREE.Vector3; target: THREE.Vector3 } => {\n return { position: camera.position.clone(), target: orbitTargetRef.current.clone() };\n }, [camera]);\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 // --- Assemble API ---\n const api = useMemo<MujocoSimAPI>(\n () => ({\n get status() { return status; },\n config,\n reset,\n setSpeed,\n togglePause,\n setPaused,\n step,\n getTime,\n getTimestep,\n applyKeyframe,\n saveState,\n restoreState,\n setQpos,\n setQvel,\n getQpos,\n getQvel,\n setCtrl,\n getCtrl,\n applyForce,\n applyTorque: applyTorqueApi,\n setExternalForce,\n applyGeneralizedForce,\n getSensorData,\n getContacts,\n getBodies,\n getJoints,\n getGeoms,\n getSites,\n getActuators: getActuatorsApi,\n getSensors,\n getModelOption,\n setGravity,\n setTimestep: setTimestepApi,\n raycast,\n getKeyframeNames,\n getKeyframeCount,\n loadScene: loadSceneApi,\n setIkEnabled,\n moveTarget,\n syncTargetToSite,\n solveIK,\n getGizmoStats,\n getCanvasSnapshot,\n project2DTo3D,\n getCameraState,\n moveCameraTo,\n setBodyMass,\n setGeomFriction,\n setGeomSize,\n mjModelRef,\n mjDataRef,\n }),\n [\n status, config, reset, setSpeed, togglePause, setPaused, step,\n getTime, getTimestep, applyKeyframe, saveState, restoreState,\n setQpos, setQvel, getQpos, getQvel, setCtrl, getCtrl,\n applyForce, applyTorqueApi, setExternalForce, applyGeneralizedForce,\n getSensorData, getContacts, getBodies, getJoints, getGeoms, getSites,\n getActuatorsApi, getSensors, getModelOption, setGravity, setTimestepApi,\n raycast, getKeyframeNames, getKeyframeCount, loadSceneApi,\n setIkEnabled, moveTarget, syncTargetToSite, solveIK, getGizmoStats,\n getCanvasSnapshot, project2DTo3D, getCameraState, moveCameraTo,\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 siteIdRef,\n gripperIdRef,\n ikEnabledRef,\n ikCalculatingRef,\n pausedRef,\n speedRef,\n substepsRef,\n ikTargetRef,\n genericIkRef,\n ikSolveFnRef,\n firstIkEnableRef,\n gizmoAnimRef,\n cameraAnimRef,\n onSelectionRef,\n beforeStepCallbacks,\n afterStepCallbacks,\n status,\n }),\n [api, status]\n );\n\n return (\n <MujocoSimContext.Provider value={contextValue}>\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 { useMujoco } 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 (spec 1.1)\n gravity,\n timestep,\n substeps,\n paused,\n speed,\n interpolate,\n gravityCompensation,\n mjcfLights,\n children,\n ...canvasProps\n },\n ref\n ) {\n const { mujoco, status: wasmStatus, error: wasmError } = useMujoco();\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\n\nimport * as THREE from 'three';\n\ninterface InternalBufferGeometry extends THREE.BufferGeometry {\n type: string;\n}\n\n/**\n * CapsuleGeometry\n * Custom geometry for capsule shape.\n */\nexport class CapsuleGeometry extends THREE.BufferGeometry {\n parameters: { radius: number; length: number; capSegments: number; radialSegments: number; };\n\n constructor(radius = 1, length = 1, capSegments = 4, radialSegments = 8) {\n super();\n (this as unknown as InternalBufferGeometry).type = 'CapsuleGeometry';\n this.parameters = { radius, length, capSegments, radialSegments };\n const path = new THREE.Path();\n path.absarc(0, -length / 2, radius, Math.PI * 1.5, 0, false);\n path.absarc(0, length / 2, radius, 0, Math.PI * 0.5, false);\n const latheGeometry = new THREE.LatheGeometry(path.getPoints(capSegments), radialSegments);\n \n const self = this as THREE.BufferGeometry;\n self.setIndex(latheGeometry.getIndex());\n self.setAttribute('position', latheGeometry.getAttribute('position'));\n self.setAttribute('normal', latheGeometry.getAttribute('normal'));\n self.setAttribute('uv', latheGeometry.getAttribute('uv'));\n }\n}","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\n\n/**\n * Options for configuring the Reflector.\n */\nexport interface ReflectorOptions {\n color?: THREE.ColorRepresentation;\n textureWidth?: number;\n textureHeight?: number;\n clipBias?: number;\n multisample?: number;\n texture?: THREE.Texture;\n mixStrength?: number; // How strong the reflection is (0.0 - 1.0)\n}\n\ninterface ReflectorMesh extends THREE.Mesh {\n type: string;\n material: THREE.MeshPhysicalMaterial;\n // tslint:disable-next-line:no-any\n onBeforeRender: (renderer: any, scene: any, camera: any) => void;\n}\n\n/**\n * Reflector\n * Creates a reflective surface.\n */\nexport class Reflector extends THREE.Mesh {\n isReflector = true;\n camera: THREE.PerspectiveCamera;\n private reflectorPlane = new THREE.Plane();\n private normal = new THREE.Vector3();\n private reflectorWorldPosition = new THREE.Vector3();\n private cameraWorldPosition = new THREE.Vector3();\n private rotationMatrix = new THREE.Matrix4();\n private lookAtPosition = new THREE.Vector3(0, 0, -1);\n private clipPlane = new THREE.Vector4();\n private view = new THREE.Vector3();\n private target = new THREE.Vector3();\n private q = new THREE.Vector4();\n private textureMatrix = new THREE.Matrix4();\n private virtualCamera: THREE.PerspectiveCamera;\n private renderTarget: THREE.WebGLRenderTarget;\n\n constructor(geometry: THREE.BufferGeometry, options: ReflectorOptions = {}) {\n super(geometry);\n\n (this as unknown as ReflectorMesh).type = 'Reflector';\n this.camera = new THREE.PerspectiveCamera();\n\n const color = (options.color !== undefined) ? new THREE.Color(options.color) : new THREE.Color(0x7F7F7F);\n const textureWidth = options.textureWidth || 512;\n const textureHeight = options.textureHeight || 512;\n const clipBias = options.clipBias || 0;\n const multisample = (options.multisample !== undefined) ? options.multisample : 4;\n const blendTexture = options.texture || undefined;\n const mixStrength = (options.mixStrength !== undefined) ? options.mixStrength : 0.25; \n\n this.virtualCamera = this.camera;\n\n this.renderTarget = new THREE.WebGLRenderTarget(textureWidth, textureHeight, { \n samples: multisample, \n type: THREE.HalfFloatType \n });\n\n (this as unknown as ReflectorMesh).material = new THREE.MeshPhysicalMaterial({\n map: blendTexture,\n color,\n roughness: 0.5, \n metalness: 0.1, \n });\n\n (this as unknown as ReflectorMesh).material.onBeforeCompile = (shader) => {\n shader.uniforms.tDiffuse = { value: this.renderTarget.texture };\n shader.uniforms.textureMatrix = { value: this.textureMatrix };\n shader.uniforms.mixStrength = { value: mixStrength };\n\n // Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n const bodyStart = shader.vertexShader.indexOf('void main() {');\n shader.vertexShader =\n 'uniform mat4 textureMatrix;\\n' +\n 'varying vec4 vUvReflection;\\n' +\n shader.vertexShader.slice(0, bodyStart) +\n shader.vertexShader.slice(bodyStart, -1) +\n ' vUvReflection = textureMatrix * vec4( position, 1.0 );\\n' +\n '}';\n\n // Fragment Shader: Mix reflection with base material\n const fragmentBodyStart = shader.fragmentShader.indexOf('void main() {');\n shader.fragmentShader =\n 'uniform sampler2D tDiffuse;\\n' +\n 'uniform float mixStrength;\\n' +\n 'varying vec4 vUvReflection;\\n' +\n shader.fragmentShader.slice(0, fragmentBodyStart) +\n shader.fragmentShader.slice(fragmentBodyStart, -1) +\n ' vec4 reflectionColor = texture2DProj( tDiffuse, vUvReflection );\\n' +\n ' gl_FragColor = vec4( mix( gl_FragColor.rgb, reflectionColor.rgb, mixStrength ), gl_FragColor.a );\\n' +\n '}';\n };\n\n (this as THREE.Object3D).receiveShadow = true;\n\n (this as unknown as ReflectorMesh).onBeforeRender = (renderer: THREE.WebGLRenderer, scene: THREE.Scene, camera: THREE.Camera) => {\n this.reflectorWorldPosition.setFromMatrixPosition((this as THREE.Object3D).matrixWorld);\n this.cameraWorldPosition.setFromMatrixPosition(camera.matrixWorld);\n\n this.rotationMatrix.extractRotation((this as THREE.Object3D).matrixWorld);\n\n this.normal.set(0, 0, 1);\n this.normal.applyMatrix4(this.rotationMatrix);\n\n this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition);\n\n // Avoid rendering when reflector is facing away\n if (this.view.dot(this.normal) > 0) return;\n\n this.view.reflect(this.normal).negate();\n this.view.add(this.reflectorWorldPosition);\n\n this.rotationMatrix.extractRotation(camera.matrixWorld);\n\n this.lookAtPosition.set(0, 0, -1);\n this.lookAtPosition.applyMatrix4(this.rotationMatrix);\n this.lookAtPosition.add(this.cameraWorldPosition);\n\n this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition);\n this.target.reflect(this.normal).negate();\n this.target.add(this.reflectorWorldPosition);\n\n this.virtualCamera.position.copy(this.view);\n this.virtualCamera.up.set(0, 1, 0);\n this.virtualCamera.up.applyMatrix4(this.rotationMatrix);\n this.virtualCamera.up.reflect(this.normal);\n this.virtualCamera.lookAt(this.target);\n\n this.virtualCamera.far = (camera as THREE.PerspectiveCamera).far; \n\n this.virtualCamera.updateMatrixWorld();\n this.virtualCamera.projectionMatrix.copy((camera as THREE.PerspectiveCamera).projectionMatrix);\n\n // Update the texture matrix\n this.textureMatrix.set(\n 0.5, 0.0, 0.0, 0.5,\n 0.0, 0.5, 0.0, 0.5,\n 0.0, 0.0, 0.5, 0.5,\n 0.0, 0.0, 0.0, 1.0\n );\n this.textureMatrix.multiply(this.virtualCamera.projectionMatrix);\n this.textureMatrix.multiply(this.virtualCamera.matrixWorldInverse);\n this.textureMatrix.multiply((this as THREE.Object3D).matrixWorld);\n\n // Now update projection matrix with new clip plane\n this.reflectorPlane.setFromNormalAndCoplanarPoint(this.normal, this.reflectorWorldPosition);\n this.reflectorPlane.applyMatrix4(this.virtualCamera.matrixWorldInverse);\n\n this.clipPlane.set(this.reflectorPlane.normal.x, this.reflectorPlane.normal.y, this.reflectorPlane.normal.z, this.reflectorPlane.constant);\n\n const projectionMatrix = this.virtualCamera.projectionMatrix;\n\n this.q.x = (Math.sign(this.clipPlane.x) + projectionMatrix.elements[8]) / projectionMatrix.elements[0];\n this.q.y = (Math.sign(this.clipPlane.y) + projectionMatrix.elements[9]) / projectionMatrix.elements[5];\n this.q.z = -1.0;\n this.q.w = (1.0 + projectionMatrix.elements[10]) / projectionMatrix.elements[14];\n\n // Calculate the scaled plane vector\n this.clipPlane.multiplyScalar(2.0 / this.clipPlane.dot(this.q));\n\n // Replacing the third row of the projection matrix\n projectionMatrix.elements[2] = this.clipPlane.x;\n projectionMatrix.elements[6] = this.clipPlane.y;\n projectionMatrix.elements[10] = this.clipPlane.z + 1.0 - clipBias;\n projectionMatrix.elements[14] = this.clipPlane.w;\n\n // Render\n (this as THREE.Object3D).visible = false;\n\n const currentRenderTarget = renderer.getRenderTarget();\n const currentXrEnabled = renderer.xr.enabled;\n const currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\n renderer.xr.enabled = false; \n renderer.shadowMap.autoUpdate = false; \n\n renderer.setRenderTarget(this.renderTarget);\n\n renderer.state.buffers.depth.setMask(true); \n\n if (renderer.autoClear === false) renderer.clear();\n renderer.render(scene, this.virtualCamera);\n\n renderer.xr.enabled = currentXrEnabled;\n renderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\n renderer.setRenderTarget(currentRenderTarget);\n\n // Restore viewport\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const viewport = (camera as any).viewport;\n if (viewport !== undefined) {\n renderer.state.viewport(viewport);\n }\n\n (this as THREE.Object3D).visible = true;\n };\n }\n\n getRenderTarget() {\n return this.renderTarget;\n }\n\n dispose() {\n this.renderTarget.dispose();\n const mesh = this as THREE.Mesh;\n if (Array.isArray(mesh.material)) {\n mesh.material.forEach((m) => m.dispose());\n } else {\n mesh.material.dispose();\n }\n }\n}","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\n\nimport * as THREE from 'three';\nimport { CapsuleGeometry } from './CapsuleGeometry';\nimport { Reflector } from './Reflector';\nimport { MujocoModel, MujocoModule } from '../types';\n\n/**\n * GeomBuilder\n * RESPONSIBILITY: Manufacturing visual objects.\n * \n * This class knows how to read a single MuJoCo 'geom' (collision shape) definition\n * and build the corresponding Three.js Mesh for it.\n * It handles all the different shape types (Box, Sphere, Cylinder, generic Mesh, etc.).\n */\nexport class GeomBuilder {\n private mujoco: MujocoModule; \n\n constructor(mujoco: MujocoModule) {\n this.mujoco = mujoco;\n }\n\n /**\n * Creates a Three.js Object3D (usually a Mesh) for a specific geometry in the MuJoCo model.\n * Returns null if the geometry shouldn't be rendered (e.g., invisible collision triggers).\n */\n create(mjModel: MujocoModel, g: number): THREE.Object3D | null {\n // 1. Check if this geom is meant to be visible\n // Group 3 in MuJoCo is conventionally used for invisible 'helper' geoms.\n if (mjModel.geom_group[g] === 3) return null;\n\n // 2. Read raw data from MuJoCo's WASM memory arrays\n const type = mjModel.geom_type[g];\n const size = mjModel.geom_size.subarray(g * 3, g * 3 + 3); // [x, y, z] size parameters\n const pos = mjModel.geom_pos.subarray(g * 3, g * 3 + 3); // [x, y, z] local position\n const quat = mjModel.geom_quat.subarray(g * 4, g * 4 + 4); // [w, x, y, z] local rotation\n\n // 3. Determine material color\n // Sometimes color is on the geom itself, sometimes it uses a shared material definition.\n const matId = mjModel.geom_matid[g];\n const color = new THREE.Color(0xffffff);\n let opacity = 1.0;\n\n if (matId >= 0) {\n // Use shared material\n const rgba = mjModel.mat_rgba.subarray(matId * 4, matId * 4 + 4);\n color.setRGB(rgba[0], rgba[1], rgba[2]);\n opacity = rgba[3];\n } else {\n // Use geom-specific color\n const rgba = mjModel.geom_rgba.subarray(g * 4, g * 4 + 4);\n color.setRGB(rgba[0], rgba[1], rgba[2]);\n opacity = rgba[3];\n }\n\n // 4. Build the Geometry based on type\n const MG = this.mujoco.mjtGeom; // Short alias for MuJoCo Geometry Types enum\n let geo: THREE.BufferGeometry | null = null;\n\n // The '.value ?? MG.XYZ' pattern handles slightly different versions of the mujoco-js bindings.\n const getVal = (v: unknown) => (v as { value: number })?.value ?? v;\n\n if (type === getVal(MG.mjGEOM_PLANE)) {\n // Planes are infinite in MuJoCo, but we need a finite mesh for Three.js. \n // Fallback reduced to 5m to match grid as requested.\n geo = new THREE.PlaneGeometry(size[0] * 2 || 5, size[1] * 2 || 5);\n } else if (type === getVal(MG.mjGEOM_SPHERE)) {\n geo = new THREE.SphereGeometry(size[0], 24, 24);\n } else if (type === getVal(MG.mjGEOM_CAPSULE)) {\n // Capsules in MuJoCo are Z-axis aligned by default.\n // Our custom CapsuleGeometry might need rotation to match.\n geo = new CapsuleGeometry(size[0], size[1] * 2, 24, 12);\n geo.rotateX(Math.PI / 2); \n } else if (type === getVal(MG.mjGEOM_BOX)) {\n // MuJoCo defines box size as \"half-extents\" (center to edge). Three.js uses full width.\n geo = new THREE.BoxGeometry(size[0] * 2, size[1] * 2, size[2] * 2);\n } else if (type === getVal(MG.mjGEOM_CYLINDER)) {\n geo = new THREE.CylinderGeometry(size[0], size[0], size[1] * 2, 24);\n geo.rotateX(Math.PI / 2);\n } else if (type === getVal(MG.mjGEOM_MESH)) {\n // Arbitrary 3D meshes (like the robot parts).\n // We must read the vertex and face data directly from MuJoCo's buffers.\n const mId = mjModel.geom_dataid[g];\n const vAdr = mjModel.mesh_vertadr[mId];\n const vNum = mjModel.mesh_vertnum[mId];\n const fAdr = mjModel.mesh_faceadr[mId];\n const fNum = mjModel.mesh_facenum[mId];\n\n geo = new THREE.BufferGeometry();\n // 'position' attribute = vertices\n geo.setAttribute('position', new THREE.Float32BufferAttribute(mjModel.mesh_vert.subarray(vAdr * 3, (vAdr + vNum) * 3), 3));\n // 'index' = faces (triangles connecting vertices)\n geo.setIndex(Array.from(mjModel.mesh_face.subarray(fAdr * 3, (fAdr + fNum) * 3)));\n geo.computeVertexNormals(); // Auto-calculate smooth lighting normals\n }\n\n // 5. Construct the final Mesh\n if (geo) {\n let mesh;\n // Special handling for the floor plane to make it shiny\n if (type === getVal(MG.mjGEOM_PLANE)) {\n mesh = new Reflector(geo, {\n clipBias: 0.003,\n textureWidth: 1024, textureHeight: 1024,\n color,\n mixStrength: 0.25\n });\n } else {\n // Standard physical material for everything else\n mesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({\n color,\n transparent: opacity < 1,\n opacity,\n roughness: 0.6,\n metalness: 0.2\n }));\n // Enable shadows\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n }\n\n // Apply the local position offset and rotation specified in the MJCF XML\n mesh.position.set(pos[0], pos[1], pos[2]);\n // MuJoCo quaternions are [w, x, y, z], Three.js are [x, y, z, w]\n mesh.quaternion.set(quat[1], quat[2], quat[3], quat[0]);\n\n // Tag the mesh with its MuJoCo body and geom IDs for interaction (picking/dragging)\n mesh.userData.bodyID = mjModel.geom_bodyid[g];\n mesh.userData.geomID = g;\n\n return mesh;\n }\n\n return null;\n }\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame } 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 { useMujocoSim } from '../core/MujocoSimProvider';\n\n/**\n * SceneRenderer — creates and syncs MuJoCo body meshes every frame.\n * Replaces RenderSystem.initScene() + RenderSystem.update() body loop.\n */\nexport function SceneRenderer() {\n const { mjModelRef, mjDataRef, mujocoRef, onSelectionRef, status } = useMujocoSim();\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 return new GeomBuilder(mujocoRef.current);\n }, [mujocoRef.current]);\n\n // Build body groups when model loads\n useEffect(() => {\n if (status !== 'ready') return;\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group) return;\n\n // Skip if model hasn't changed\n if (prevModelRef.current === model) return;\n prevModelRef.current = model;\n\n // Clear previous bodies\n while (group.children.length > 0) {\n group.remove(group.children[0]);\n }\n\n // Create body groups with geometry\n const refs: (THREE.Group | null)[] = [];\n for (let i = 0; i < model.nbody; i++) {\n const bodyGroup = new THREE.Group();\n bodyGroup.userData.bodyID = i;\n\n for (let g = 0; g < model.ngeom; g++) {\n if (model.geom_bodyid[g] === i) {\n const mesh = geomBuilder.create(model, g);\n if (mesh) bodyGroup.add(mesh);\n }\n }\n\n group.add(bodyGroup);\n refs.push(bodyGroup);\n }\n bodyRefs.current = refs;\n }, [status, geomBuilder, mjModelRef]);\n\n // Sync body positions from mjData every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data) return;\n const bodies = bodyRefs.current;\n for (let i = 0; i < bodies.length; i++) {\n const ref = bodies[i];\n if (!ref) continue;\n ref.position.set(\n data.xpos[i * 3],\n data.xpos[i * 3 + 1],\n data.xpos[i * 3 + 2]\n );\n ref.quaternion.set(\n data.xquat[i * 4 + 1],\n data.xquat[i * 4 + 2],\n data.xquat[i * 4 + 3],\n data.xquat[i * 4]\n );\n }\n });\n\n return (\n <group\n ref={groupRef}\n 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 if (obj && obj.userData.bodyID !== undefined && obj.userData.bodyID > 0) {\n const model = mjModelRef.current;\n if (model && onSelectionRef.current) {\n const name = getName(model, model.name_bodyadr[obj.userData.bodyID]);\n onSelectionRef.current(obj.userData.bodyID, name);\n }\n }\n }}\n />\n );\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 { useMujocoSim } 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 * Props:\n * - `siteName` — MuJoCo site to track. Defaults to `SceneConfig.tcpSiteName`.\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 provider's IK target.\n * When provided, the consumer handles what happens during drag.\n *\n * Multiple gizmos can be rendered — each tracks its own site.\n * Zero gizmos is fine — programmatic IK control works via the provider API.\n *\n * Uses a tiny invisible mesh as child instead of axesHelper — PivotControls\n * computes an anchor offset from children's bounding box, and axesHelper's\n * (0→0.15) bounds would shift the handles away from the TCP origin.\n */\nexport function IkGizmo({ siteName, scale = 0.18, onDrag }: IkGizmoProps) {\n const {\n ikTargetRef, mjModelRef, mjDataRef, siteIdRef,\n api, ikEnabledRef, status,\n } = useMujocoSim();\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 (or fall back to provider's tcpSiteName)\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') {\n localSiteIdRef.current = -1;\n return;\n }\n if (siteName) {\n localSiteIdRef.current = findSiteByName(model, siteName);\n } else {\n // Default: use the provider's siteIdRef (from SceneConfig.tcpSiteName)\n localSiteIdRef.current = siteIdRef.current;\n }\n }, [siteName, status, mjModelRef, siteIdRef]);\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 = localSiteIdRef.current;\n if (!data || sid < 0 || !wrapperRef.current) return;\n\n if (!draggingRef.current) {\n const p = data.site_xpos;\n const m = data.site_xmat;\n const i3 = sid * 3;\n const i9 = sid * 9;\n\n // Position wrapper at the site\n wrapperRef.current.position.set(p[i3], p[i3 + 1], p[i3 + 2]);\n // MuJoCo site_xmat is row-major 3x3; THREE.Matrix4.set() is row-major\n _mat4.set(\n m[i9], m[i9 + 1], m[i9 + 2], 0,\n m[i9 + 3], m[i9 + 4], m[i9 + 5], 0,\n m[i9 + 6], m[i9 + 7], m[i9 + 8], 0,\n 0, 0, 0, 1,\n );\n wrapperRef.current.quaternion.setFromRotationMatrix(_mat4);\n\n // Reset any accumulated drag delta so handles stay at wrapper origin\n if (pivotRef.current) {\n pivotRef.current.matrix.identity();\n }\n }\n });\n\n // Don't render until the model is loaded (avoids gizmo at origin)\n if (status !== 'ready') return null;\n\n return (\n <group ref={wrapperRef}>\n <PivotControls\n ref={pivotRef}\n autoTransform\n scale={scale}\n fixed={false}\n depthTest={false}\n disableScaling\n onDragStart={() => {\n draggingRef.current = true;\n if (!onDrag) {\n // Default: enable IK so the robot follows\n if (!ikEnabledRef.current) api.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 provider's 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 * as THREE from 'three';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\n\nconst _dummy = new THREE.Object3D();\n\ninterface ContactMarkersProps {\n /** Maximum contacts to render. Default: 100. */\n maxContacts?: number;\n /** Sphere radius. Default: 0.005. */\n radius?: number;\n /** Color. Default: '#4f46e5'. */\n color?: string;\n /** Show markers. Default: true. */\n visible?: boolean;\n}\n\nexport function ContactMarkers({\n maxContacts = 100,\n radius = 0.005,\n color = '#4f46e5',\n visible = true,\n}: ContactMarkersProps = {}) {\n const { mjDataRef, status } = useMujocoSim();\n const meshRef = useRef<THREE.InstancedMesh>(null);\n\n useFrame(() => {\n const mesh = meshRef.current;\n const data = mjDataRef.current;\n if (!mesh || !data || !visible) {\n if (mesh) mesh.count = 0;\n return;\n }\n\n const ncon = data.ncon;\n const count = Math.min(ncon, maxContacts);\n\n for (let i = 0; i < count; i++) {\n try {\n const c = (data.contact as { get(i: number): { pos: Float64Array } | undefined }).get(i);\n if (!c) break;\n _dummy.position.set(c.pos[0], c.pos[1], c.pos[2]);\n _dummy.updateMatrix();\n mesh.setMatrixAt(i, _dummy.matrix);\n } catch {\n // Contact access failed — stop here\n mesh.count = i;\n mesh.instanceMatrix.needsUpdate = true;\n return;\n }\n }\n\n mesh.count = count;\n mesh.instanceMatrix.needsUpdate = true;\n });\n\n if (status !== 'ready') return null;\n\n return (\n <instancedMesh ref={meshRef} args={[undefined, undefined, maxContacts]}>\n <sphereGeometry args={[radius, 8, 8]} />\n <meshStandardMaterial\n color={color}\n emissive={color}\n emissiveIntensity={0.3}\n roughness={0.5}\n />\n </instancedMesh>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useFrame, useThree } from '@react-three/fiber';\nimport { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useMujocoSim, 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}: DragInteractionProps) {\n const { mjDataRef, mujocoRef, mjModelRef, status } = useMujocoSim();\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 = mouseWorldRef.current.clone().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 ref={groupRef} />;\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 { useEffect, useRef } from 'react';\nimport * as THREE from 'three';\nimport { useThree } from '@react-three/fiber';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\nimport type { SceneLightsProps } from '../types';\n\nexport function SceneLights({ intensity = 1.0 }: SceneLightsProps) {\n const { mjModelRef, status } = useMujocoSim();\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 // Check if light is active\n const active = model.light_active ? model.light_active[i] : 1;\n if (!active) continue;\n\n // light_type: 0 = directional, 1 = spot (no light_directional in WASM)\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 // Read intensity from model if available, otherwise use prop\n const mjIntensity = model.light_intensity ? model.light_intensity[i] : 1.0;\n const finalIntensity = intensity * mjIntensity;\n\n // Read diffuse color\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 // Read position and direction\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 // Spot light\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]; // linear\n const att2 = model.light_attenuation[3 * i + 2]; // quadratic\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 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 * as THREE from 'three';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\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/**\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}: DebugProps) {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\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\n if (showSites) {\n for (let i = 0; i < model.nsite; i++) {\n const geometry = new THREE.OctahedronGeometry(0.01);\n const mat = new THREE.MeshBasicMaterial({ color: 0xff00ff, transparent: true, opacity: 0.7 });\n const mesh = new THREE.Mesh(geometry, mat);\n mesh.userData.siteId = i;\n sites.push(mesh);\n }\n }\n\n // Joint axes\n if (showJoints) {\n for (let i = 0; i < model.njnt; i++) {\n const type = model.jnt_type[i];\n const color = JOINT_COLORS[type] ?? 0xffffff;\n const arrow = new THREE.ArrowHelper(\n new THREE.Vector3(0, 0, 1), new THREE.Vector3(),\n 0.05, color, 0.01, 0.005\n );\n arrow.userData.jointId = i;\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 // 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 mesh.position.add(new THREE.Vector3(gp[3 * gid], gp[3 * gid + 1], gp[3 * gid + 2])\n .applyQuaternion(mesh.quaternion));\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 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\n const contactGroupRef = useRef<THREE.Group>(null);\n const contactArrowsRef = useRef<THREE.ArrowHelper[]>([]);\n\n useFrame(() => {\n if (!showContacts) return;\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n const group = contactGroupRef.current;\n if (!model || !data || !group) return;\n\n // Remove old arrows\n for (const arrow of contactArrowsRef.current) {\n group.remove(arrow);\n arrow.dispose();\n }\n contactArrowsRef.current = [];\n\n const ncon = data.ncon;\n for (let i = 0; i < Math.min(ncon, 50); i++) {\n try {\n const c = (data.contact as { get(i: number): { pos: Float64Array; frame: Float64Array; dist: number } }).get(i);\n const pos = new THREE.Vector3(c.pos[0], c.pos[1], c.pos[2]);\n const normal = new THREE.Vector3(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) {\n const arrow = new THREE.ArrowHelper(normal, pos, length, 0xff4444, length * 0.3, length * 0.15);\n group.add(arrow);\n contactArrowsRef.current.push(arrow);\n }\n } catch {\n break;\n }\n }\n });\n\n if (status !== 'ready') return null;\n\n return (\n <>\n <group ref={groupRef} />\n {showContacts && <group ref={contactGroupRef} />}\n </>\n );\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TendonRenderer — render tendons as tube geometries (spec 6.4)\n *\n * WASM fields used: model.ntendon, model.ten_wrapadr, model.ten_wrapnum\n * data.wrap_xpos, data.ten_wrapadr (runtime)\n *\n * Note: ten_rgba and ten_width are NOT available in mujoco-js 0.0.7.\n * Tendons use a default color and width.\n */\n\nimport { useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\n\nconst DEFAULT_TENDON_COLOR = new THREE.Color(0.3, 0.3, 0.8);\nconst DEFAULT_TENDON_WIDTH = 0.002;\n\nexport function TendonRenderer() {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n\n useFrame(() => {\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 // Clean up old meshes\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 for (let t = 0; t < ntendon; t++) {\n const wrapAdr = model.ten_wrapadr[t];\n const wrapNum = model.ten_wrapnum[t];\n if (wrapNum < 2) continue;\n\n // Get wrap path points from data\n const points: THREE.Vector3[] = [];\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 // Skip zero points (uninitialized wrap points)\n if (x !== 0 || y !== 0 || z !== 0) {\n points.push(new THREE.Vector3(x, y, z));\n }\n }\n }\n\n if (points.length < 2) continue;\n\n const curve = new THREE.CatmullRomCurve3(points, false);\n const geometry = new THREE.TubeGeometry(\n curve, Math.max(points.length * 2, 4), DEFAULT_TENDON_WIDTH, 6, false\n );\n\n const material = new THREE.MeshStandardMaterial({\n color: DEFAULT_TENDON_COLOR,\n roughness: 0.6,\n metalness: 0.1,\n });\n const mesh = new THREE.Mesh(geometry, material);\n group.add(mesh);\n meshesRef.current.push(mesh);\n }\n });\n\n if (status !== 'ready') return null;\n return <group 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 * as THREE from 'three';\nimport { useMujocoSim } 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() {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\n const groupRef = useRef<THREE.Group>(null);\n const meshesRef = useRef<THREE.Mesh[]>([]);\n\n // Build flex meshes once when model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n const group = groupRef.current;\n if (!model || !group || status !== 'ready') return;\n\n const nflex = model.nflex ?? 0;\n if (nflex === 0) return;\n\n for (let f = 0; f < nflex; f++) {\n const vertAdr = model.flex_vertadr[f];\n const vertNum = model.flex_vertnum[f];\n\n if (vertNum === 0) continue;\n\n const geometry = new THREE.BufferGeometry();\n const positions = new Float32Array(vertNum * 3);\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n\n // Note: flex_faceadr/flex_facenum/flex_face are NOT available in mujoco-js WASM.\n // Without face data we render as a point cloud. If future WASM versions expose\n // face arrays, index-based triangle rendering can be added here.\n\n geometry.computeVertexNormals();\n\n let color = new THREE.Color(0.5, 0.5, 0.5);\n if (model.flex_rgba) {\n color = new THREE.Color(\n model.flex_rgba[4 * f],\n model.flex_rgba[4 * f + 1],\n model.flex_rgba[4 * f + 2],\n );\n }\n\n const material = new THREE.MeshStandardMaterial({\n color,\n roughness: 0.7,\n side: THREE.DoubleSide,\n });\n\n const mesh = new THREE.Mesh(geometry, material);\n mesh.userData.flexId = f;\n mesh.userData.vertAdr = vertAdr;\n mesh.userData.vertNum = vertNum;\n group.add(mesh);\n meshesRef.current.push(mesh);\n }\n\n return () => {\n for (const mesh of meshesRef.current) {\n group.remove(mesh);\n mesh.geometry.dispose();\n (mesh.material as THREE.Material).dispose();\n }\n meshesRef.current = [];\n };\n }, [status, mjModelRef]);\n\n // Update vertex positions every frame\n useFrame(() => {\n const data = mjDataRef.current;\n if (!data || !data.flexvert_xpos) return;\n\n for (const mesh of meshesRef.current) {\n const vertAdr = mesh.userData.vertAdr;\n const vertNum = mesh.userData.vertNum;\n const posAttr = mesh.geometry.getAttribute('position') as THREE.BufferAttribute;\n if (!posAttr) continue;\n\n for (let v = 0; v < vertNum; v++) {\n const srcIdx = (vertAdr + v) * 3;\n posAttr.setXYZ(v, data.flexvert_xpos[srcIdx], data.flexvert_xpos[srcIdx + 1], data.flexvert_xpos[srcIdx + 2]);\n }\n posAttr.needsUpdate = true;\n mesh.geometry.computeVertexNormals();\n }\n });\n\n if (status !== 'ready') return null;\n return <group ref={groupRef} />;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useContacts — structured contact query hook (spec 2.4)\n * useContactEvents — contact enter/exit events (spec 2.5)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujocoSim, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName, getName } from '../core/SceneLoader';\nimport type { ContactInfo } from '../types';\n\n/**\n * Track contacts for a specific body (or all contacts if no body specified).\n * Calls the callback every physics frame with current contact list.\n * Reads `data.ncon` first to avoid allocating for zero contacts.\n */\nexport function useContacts(\n bodyName?: string,\n callback?: (contacts: ContactInfo[]) => void,\n): React.RefObject<ContactInfo[]> {\n const { mjModelRef } = useMujocoSim();\n const contactsRef = useRef<ContactInfo[]>([]);\n const bodyIdRef = useRef(-1);\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n if (!bodyName) { bodyIdRef.current = -1; return; }\n const model = mjModelRef.current;\n if (!model) return;\n bodyIdRef.current = findBodyByName(model, bodyName);\n }, [bodyName, mjModelRef]);\n\n useAfterPhysicsStep((model, data) => {\n const ncon = data.ncon;\n if (ncon === 0) {\n if (contactsRef.current.length > 0) contactsRef.current = [];\n callbackRef.current?.([]);\n return;\n }\n\n const contacts: ContactInfo[] = [];\n const filterBody = bodyIdRef.current;\n\n for (let i = 0; i < ncon; i++) {\n try {\n const c = (data.contact as { get(i: number): { geom1: number; geom2: number; pos: Float64Array; dist: number } }).get(i);\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: 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 } catch {\n break;\n }\n }\n contactsRef.current = contacts;\n callbackRef.current?.(contacts);\n });\n\n return contactsRef;\n}\n\n/**\n * Contact enter/exit events for a specific body (spec 2.5).\n * Tracks which geom pairs are in contact frame-to-frame and fires\n * onEnter/onExit callbacks on transitions.\n */\nexport function useContactEvents(\n bodyName: string,\n handlers: {\n onEnter?: (info: ContactInfo) => void;\n onExit?: (info: ContactInfo) => void;\n },\n) {\n const prevPairsRef = useRef(new Set<string>());\n const onEnterRef = useRef(handlers.onEnter);\n const onExitRef = useRef(handlers.onExit);\n onEnterRef.current = handlers.onEnter;\n onExitRef.current = handlers.onExit;\n\n const prevContactMapRef = useRef(new Map<string, ContactInfo>());\n\n const onContacts = useCallback((contacts: ContactInfo[]) => {\n const currentPairs = new Set<string>();\n const currentMap = new Map<string, ContactInfo>();\n\n for (const c of contacts) {\n const key = `${Math.min(c.geom1, c.geom2)}_${Math.max(c.geom1, c.geom2)}`;\n currentPairs.add(key);\n currentMap.set(key, c);\n }\n\n // New contacts (enter)\n for (const key of currentPairs) {\n if (!prevPairsRef.current.has(key)) {\n onEnterRef.current?.(currentMap.get(key)!);\n }\n }\n\n // Lost contacts (exit)\n for (const key of prevPairsRef.current) {\n if (!currentPairs.has(key)) {\n const prev = prevContactMapRef.current.get(key);\n if (prev) onExitRef.current?.(prev);\n }\n }\n\n prevPairsRef.current = currentPairs;\n prevContactMapRef.current = currentMap;\n }, []);\n\n useContacts(bodyName, onContacts);\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * ContactListener — component form of contact events (spec 2.5)\n */\n\nimport { useContactEvents } from '../hooks/useContacts';\nimport type { ContactListenerProps } from '../types';\n\n/**\n * Component form of useContactEvents.\n * Fires onContactEnter/onContactExit callbacks when contacts change.\n */\nexport function ContactListener({\n body,\n onContactEnter,\n onContactExit,\n}: ContactListenerProps) {\n useContactEvents(body, {\n onEnter: onContactEnter,\n onExit: onContactExit,\n });\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryPlayer — trajectory playback/scrubbing (spec 13.2)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useFrame } from '@react-three/fiber';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\n\ninterface TrajectoryPlayerOptions {\n fps?: number;\n loop?: boolean;\n}\n\n/**\n * Play back a sequence of qpos frames, overriding simulation state.\n *\n * When playing, the simulation is effectively paused and qpos is set\n * from the trajectory each render frame at the specified FPS.\n */\nexport function useTrajectoryPlayer(\n trajectory: number[][],\n options: TrajectoryPlayerOptions = {},\n) {\n const { mjModelRef, mjDataRef, mujocoRef, pausedRef } = useMujocoSim();\n const fps = options.fps ?? 30;\n const loop = options.loop ?? false;\n\n const playingRef = useRef(false);\n const frameRef = useRef(0);\n const lastFrameTimeRef = useRef(0);\n\n const play = useCallback(() => {\n playingRef.current = true;\n pausedRef.current = true; // Pause sim during playback\n lastFrameTimeRef.current = performance.now();\n }, [pausedRef]);\n\n const pause = useCallback(() => {\n playingRef.current = false;\n }, []);\n\n const seek = useCallback((frameIdx: number) => {\n frameRef.current = Math.max(0, Math.min(frameIdx, trajectory.length - 1));\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data || !trajectory[frameRef.current]) return;\n const qpos = trajectory[frameRef.current];\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n }, [trajectory, mjModelRef, mjDataRef, mujocoRef]);\n\n const reset = useCallback(() => {\n frameRef.current = 0;\n playingRef.current = false;\n pausedRef.current = false;\n }, [pausedRef]);\n\n useFrame(() => {\n if (!playingRef.current || trajectory.length === 0) return;\n\n const now = performance.now();\n const elapsed = now - lastFrameTimeRef.current;\n const frameInterval = 1000 / fps;\n\n if (elapsed < frameInterval) return;\n lastFrameTimeRef.current = now;\n\n const model = mjModelRef.current;\n const data = mjDataRef.current;\n if (!model || !data) return;\n\n const qpos = trajectory[frameRef.current];\n if (!qpos) return;\n\n for (let i = 0; i < Math.min(qpos.length, model.nq); i++) {\n data.qpos[i] = qpos[i];\n }\n mujocoRef.current.mj_forward(model, data);\n\n frameRef.current++;\n if (frameRef.current >= trajectory.length) {\n if (loop) {\n frameRef.current = 0;\n } else {\n playingRef.current = false;\n pausedRef.current = false;\n }\n }\n });\n\n return {\n play,\n pause,\n seek,\n reset,\n get frame() { return frameRef.current; },\n get playing() { return playingRef.current; },\n get totalFrames() { return trajectory.length; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * TrajectoryPlayer — component form of trajectory playback (spec 13.2)\n */\n\nimport { useEffect } from 'react';\nimport { useTrajectoryPlayer } from '../hooks/useTrajectoryPlayer';\nimport type { TrajectoryPlayerProps } from '../types';\n\n/**\n * Component wrapper for useTrajectoryPlayer.\n * Provides declarative trajectory playback controlled via props.\n */\nexport function TrajectoryPlayer({\n trajectory,\n fps = 30,\n loop = false,\n playing = false,\n onFrame,\n}: TrajectoryPlayerProps) {\n const player = useTrajectoryPlayer(trajectory, { fps, loop });\n\n useEffect(() => {\n if (playing) {\n player.play();\n } else {\n player.pause();\n }\n }, [playing]);\n\n useEffect(() => {\n if (onFrame) {\n // Poll frame changes (lightweight, no extra useFrame needed)\n const interval = setInterval(() => {\n if (player.playing) onFrame(player.frame);\n }, 1000 / fps);\n return () => clearInterval(interval);\n }\n }, [onFrame, fps]);\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * SelectionHighlight — highlight a selected body with emissive color (spec 6.5)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useThree } from '@react-three/fiber';\nimport * as THREE from 'three';\nimport type { SelectionHighlightProps } from '../types';\n\n/**\n * Applies emissive highlight to all meshes belonging to a body.\n * Restores original emissive when bodyId changes or component unmounts.\n */\nexport function SelectionHighlight({\n bodyId,\n color = '#ff4444',\n emissiveIntensity = 0.3,\n}: SelectionHighlightProps) {\n const { scene } = useThree();\n const prevMeshesRef = useRef<{ mesh: THREE.Mesh; originalEmissive: THREE.Color; originalIntensity: number }[]>([]);\n\n useEffect(() => {\n // Restore previous highlights\n for (const entry of prevMeshesRef.current) {\n const mat = entry.mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n mat.emissive.copy(entry.originalEmissive);\n mat.emissiveIntensity = entry.originalIntensity;\n }\n }\n prevMeshesRef.current = [];\n\n if (bodyId === null || bodyId < 0) return;\n\n // Find all meshes belonging to this body\n const highlightColor = new THREE.Color(color);\n scene.traverse((obj) => {\n if (obj.userData.bodyID === bodyId && (obj as THREE.Mesh).isMesh) {\n const mesh = obj as THREE.Mesh;\n const mat = mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n prevMeshesRef.current.push({\n mesh,\n originalEmissive: mat.emissive.clone(),\n originalIntensity: mat.emissiveIntensity ?? 0,\n });\n mat.emissive.copy(highlightColor);\n mat.emissiveIntensity = emissiveIntensity;\n }\n }\n });\n\n return () => {\n for (const entry of prevMeshesRef.current) {\n const mat = entry.mesh.material as THREE.MeshStandardMaterial;\n if (mat.emissive) {\n mat.emissive.copy(entry.originalEmissive);\n mat.emissiveIntensity = entry.originalIntensity;\n }\n }\n prevMeshesRef.current = [];\n };\n }, [bodyId, color, emissiveIntensity, scene]);\n\n return null;\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { useMemo } from 'react';\nimport { useMujocoSim } 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 } = useMujocoSim();\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 { useMujocoSim } from '../core/MujocoSimProvider';\nimport { findSiteByName } from '../core/SceneLoader';\nimport type { SitePositionResult } from '../types';\n\n// Preallocated temp for rotation matrix extraction\nconst _mat4 = new THREE.Matrix4();\n\n/**\n * Returns reactive refs for a MuJoCo site's world position and orientation.\n * Refs are updated every frame without triggering React re-renders.\n */\nexport function useSitePosition(siteName: string): SitePositionResult {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\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 { useMujocoSim, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { SensorInfo, SensorResult } from '../types';\n\n/**\n * Access a single MuJoCo sensor by name. Returns a ref-based value\n * updated every physics frame without causing React re-renders.\n */\nexport function useSensor(name: string): SensorResult {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\n const sensorIdRef = useRef(-1);\n const sensorAdrRef = useRef(0);\n const sensorDimRef = useRef(0);\n const valueRef = useRef<Float64Array>(new Float64Array(0));\n\n // Resolve sensor ID once model is ready\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n for (let i = 0; i < model.nsensor; i++) {\n if (getName(model, model.name_sensoradr[i]) === name) {\n sensorIdRef.current = i;\n sensorAdrRef.current = model.sensor_adr[i];\n sensorDimRef.current = model.sensor_dim[i];\n valueRef.current = new Float64Array(model.sensor_dim[i]);\n return;\n }\n }\n sensorIdRef.current = -1;\n }, [name, status, mjModelRef]);\n\n // Update every frame after physics step\n useAfterPhysicsStep((_model, data) => {\n if (sensorIdRef.current < 0) return;\n const adr = sensorAdrRef.current;\n const dim = sensorDimRef.current;\n for (let i = 0; i < dim; i++) {\n valueRef.current[i] = data.sensordata[adr + i];\n }\n });\n\n return { value: valueRef, size: sensorDimRef.current };\n}\n\n/**\n * Enumerate all sensors in the loaded MuJoCo model.\n * Returns a stable array recomputed only when the model changes.\n */\nexport function useSensors(): SensorInfo[] {\n const { mjModelRef, status } = useMujocoSim();\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 { useMujocoSim, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { getName } from '../core/SceneLoader';\nimport type { JointStateResult } from '../types';\n\n/**\n * Track a MuJoCo joint's position and velocity by name.\n * Values are updated every physics frame via refs (no re-renders).\n *\n * For hinge/slide joints, position/velocity are scalar (stored as Float64Array of length 1).\n * For ball joints, position is quat (4), velocity is angular vel (3).\n * For free joints, position is pos+quat (7), velocity is lin+ang vel (6).\n */\nexport function useJointState(name: string): JointStateResult {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\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\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 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 positionRef.current = new Float64Array(data.qpos.subarray(qa, qa + qposDimRef.current));\n velocityRef.current = new Float64Array(data.qvel.subarray(da, da + dofDimRef.current));\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 { useMujocoSim, useAfterPhysicsStep } from '../core/MujocoSimProvider';\nimport { findBodyByName } from '../core/SceneLoader';\nimport type { BodyStateResult } from '../types';\n\n/**\n * Track a MuJoCo body's world position, quaternion, and velocities.\n * All values are ref-based — updated every physics frame without re-renders.\n */\nexport function useBodyState(name: string): BodyStateResult {\n const { mjModelRef, status } = useMujocoSim();\n const bodyIdRef = useRef(-1);\n const position = useRef(new THREE.Vector3());\n const quaternion = useRef(new THREE.Quaternion());\n const linearVelocity = useRef(new THREE.Vector3());\n const angularVelocity = useRef(new THREE.Vector3());\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n bodyIdRef.current = findBodyByName(model, name);\n }, [name, status, mjModelRef]);\n\n useAfterPhysicsStep((_model, data) => {\n const bid = bodyIdRef.current;\n if (bid < 0) return;\n\n // Position from xpos (3 per body)\n const i3 = bid * 3;\n position.current.set(data.xpos[i3], data.xpos[i3 + 1], data.xpos[i3 + 2]);\n\n // Quaternion from xquat (4 per body, MuJoCo order: w,x,y,z)\n const i4 = bid * 4;\n quaternion.current.set(\n data.xquat[i4 + 1], data.xquat[i4 + 2],\n data.xquat[i4 + 3], data.xquat[i4]\n );\n\n // Velocity from cvel (6 per body: [angular(3), linear(3)])\n if (data.cvel) {\n const i6 = bid * 6;\n angularVelocity.current.set(data.cvel[i6], data.cvel[i6 + 1], data.cvel[i6 + 2]);\n linearVelocity.current.set(data.cvel[i6 + 3], data.cvel[i6 + 4], data.cvel[i6 + 5]);\n }\n });\n\n return { position, quaternion, linearVelocity, angularVelocity };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useCtrl — clean read/write access to a named actuator's ctrl value (spec 3.1)\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useMujocoSim } from '../core/MujocoSimProvider';\nimport { findActuatorByName } from '../core/SceneLoader';\n\n/**\n * Access a single actuator's control value by name.\n *\n * Returns [currentValue, setValue]:\n * - `currentValue` is a ref updated every frame (no re-renders).\n * - `setValue` writes directly to `data.ctrl[actuatorId]`.\n */\nexport function useCtrl(name: string): [React.RefObject<number>, (value: number) => void] {\n const { mjModelRef, mjDataRef, status } = useMujocoSim();\n const actuatorIdRef = useRef(-1);\n const valueRef = useRef(0);\n\n useEffect(() => {\n const model = mjModelRef.current;\n if (!model || status !== 'ready') return;\n actuatorIdRef.current = findActuatorByName(model, name);\n }, [name, status, mjModelRef]);\n\n // Read current value each frame (via afterStep would be ideal but\n // useCtrl is primarily for writing; reading can use the ref)\n const setValue = useCallback((value: number) => {\n const data = mjDataRef.current;\n if (!data || actuatorIdRef.current < 0) return;\n data.ctrl[actuatorIdRef.current] = value;\n valueRef.current = value;\n }, [mjDataRef]);\n\n return [valueRef, setValue];\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useKeyboardTeleop — keyboard teleoperation hook (spec 12.1)\n */\n\nimport { useEffect, useRef } from 'react';\nimport { useMujocoSim, 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 } = useMujocoSim();\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 { useMujocoSim, 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 } = useMujocoSim();\n const lastActionTimeRef = useRef(0);\n const lastActionRef = useRef<Float32Array | Float64Array | number[] | null>(null);\n const isRunningRef = useRef(true);\n const configRef = useRef(config);\n configRef.current = config;\n\n useBeforePhysicsStep((model, data) => {\n if (!isRunningRef.current) return;\n\n const cfg = configRef.current;\n const dt = model.opt?.timestep ?? 0.002;\n const interval = 1.0 / cfg.frequency;\n\n // Check if it's time for a new action\n if (data.time - lastActionTimeRef.current >= interval) {\n // Build observation\n const obs = cfg.onObservation(model, data);\n\n // Apply action (consumer does inference inline or uses cached result)\n cfg.onAction(obs, model, data);\n\n lastActionTimeRef.current = data.time;\n lastActionRef.current = obs;\n }\n });\n\n return {\n get isRunning() { return isRunningRef.current; },\n start: () => { isRunningRef.current = true; },\n stop: () => { isRunningRef.current = false; },\n get lastObservation() { return lastActionRef.current; },\n };\n}\n","/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n *\n * useTrajectoryRecorder — trajectory recording hook (spec 13.1)\n */\n\nimport { useCallback, useRef } from 'react';\nimport { useMujocoSim, 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 } = useMujocoSim();\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 { useMujocoSim, 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 } = useMujocoSim();\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 { useMujocoSim, 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 } = useMujocoSim();\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"]}