mujoco-react 10.6.0 → 10.8.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.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { M as MujocoContextValue, a as MujocoCanvasProps, b as MujocoSimAPI, S as SceneConfig, R as ReadyCallbackInput, c as StepCallbackInput, d as SelectionCallbackInput, e as MujocoModule, f as MujocoRenderOptions, P as PhysicsStepCallback, g as MujocoModel, h as MujocoData, C as ControlGroupInfo, A as ActuatedJointInfo, i as ControlGroupSelector, O as ObservationConfig, j as ObservationResult, I as IkConfig, k as IkContextValue, B as BodyProps, l as IkGizmoProps, D as DragInteractionProps, m as SceneLightsProps, n as ScenarioLightingProps, o as SplatEnvironmentProps, V as VisualScenarioEffectsProps, p as VisualScenarioConfig, q as SplatRendererKind, r as PairedSplatEnvironmentConfig, s as SplatFormat, t as SplatCollisionProxyConfig, u as SplatEnvironmentReadiness, v as SplatCollisionPrimitive, w as SplatEnvironmentReadinessStatus, x as SplatSceneConfigInput, y as SplatSceneConfigState, z as VisualScenarioExecutionContextInput, E as VisualScenarioExecutionContext, F as ScenarioLightingPreset, G as SplatEnvironmentMetadataInput, H as SplatEnvironmentMetadata, J as SplatSceneInput, K as CameraFrameCaptureOptions, L as DebugProps, N as GeomInfo, Q as ContactListenerProps, T as TrajectoryPlayerProps, U as ActuatorInfo, W as Sites, X as SitePositionResult, Y as Sensors, Z as SensorHandle, _ as SensorInfo, $ as Joints, a0 as ScalarJointStateResult, a1 as ArrayJointStateResult, a2 as JointStateOptions, a3 as JointStateResult, a4 as Bodies, a5 as BodyStateResult, a6 as Geoms, a7 as Actuators, a8 as CtrlHandle, a9 as ContactInfo, aa as KeyboardTeleopConfig, ab as KeyboardIkTargetConfig, ac as PolicyConfig, ad as PolicyAPI, ae as RemotePolicyConfig, af as RemotePolicyAPI, ag as ObservationHandle, ah as ObservationOutput, ai as TrajectoryInput, aj as TrajectoryStateChangeInput, ak as PlaybackState, al as TrajectoryFrame, am as FrameCaptureOptions, an as FrameCaptureResult, ao as FrameCaptureBlobResult, ap as FrameCaptureAPI, aq as CameraFrameCaptureAPI, ar as Cameras, as as CameraFrameSequenceCamera, at as CameraFrameCaptureSource, au as CameraFrameSequenceOptions, av as CameraFrameSequenceResult, aw as PolicyCameraFrameStream, ax as PolicyCameraFrameCaptureOptions, ay as PolicyCameraFrameCaptureResult, az as FrameCaptureStatus, aA as PolicyCameraFrameCaptureAPI, aB as CameraFrameCaptureTensorOptions, aC as CameraFrameTensorResult, aD as CameraFrameSequenceRecorderAPI, aE as ImagePointCoordinateSpace, aF as ImagePointProjectionOptions, aG as ImagePointProjectionResult, aH as PolicyVector } from './types-Dvtm4I0o.js';
3
- export { aI as BodyInfo, aJ as CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY, aK as CAMERA_FRAME_CAPTURE_RENDER_USER_DATA_KEY, aL as CAPTURE_EXCLUDE_KEY, aM as CameraFrameCaptureBlobResult, aN as CameraFrameCaptureQuaternion, aO as CameraFrameCaptureResult, aP as CameraFrameCaptureSession, aQ as CameraFrameCaptureVector3, aR as CameraFramePixelsResult, aS as CameraFrameSequenceCameraSummary, aT as CameraFrameSequenceFrame, aU as CameraFrameSequenceSampleInput, aV as CameraFrameSequenceStepInput, aW as CameraInfo, aX as ControlJointInfo, aY as DebugVirtualCamera, aZ as FrameCaptureTarget, a_ as FrameCaptureTargetRef, a$ as IKSolveFn, b0 as IkGizmoDragInput, b1 as IkSolveInput, b2 as JointInfo, b3 as JointStateKind, b4 as KeyBinding, b5 as KeyboardIkTargetAction, b6 as KeyboardIkTargetBinding, b7 as Keyframes, b8 as ModelActuators, b9 as ModelBodies, ba as ModelCameras, bb as ModelGeoms, bc as ModelJoints, bd as ModelKeyframes, be as ModelOptions, bf as ModelResource, bg as ModelResources, bh as ModelSensors, bi as ModelSites, bj as Models, bk as MujocoContact, bl as MujocoContactArray, bm as MujocoFrameCaptureOptions, bn as ObservationLayoutItem, bo as PhysicsConfig, bp as PhysicsStepInput, bq as PolicyActionChunk, br as PolicyActionInput, bs as PolicyImageTensorLayout, bt as PolicyImageTensorOptions, bu as PolicyImageTensorPixelOptions, bv as PolicyImageTensorRange, bw as PolicyImageTensorResult, bx as PolicyImageTensorSourceOrigin, by as PolicyInferenceInput, bz as PolicyInferenceOutput, bA as PolicyInferenceResult, bB as PolicyObservationInput, bC as RayHit, bD as Register, bE as RegisteredModelMap, bF as RemotePolicyRequestInfo, bG as RemotePolicyRequestInput, bH as RemotePolicyResponseInfo, bI as RemotePolicyStatus, bJ as ResetCallbackInput, bK as ResolvedScenarioCameraConfig, bL as ResolvedScenarioMaterialConfig, bM as ResourceSelector, bN as ScenarioCameraConfig, bO as ScenarioMaterialConfig, bP as SceneMarker, bQ as SceneObject, bR as SensorResult, bS as SiteInfo, bT as SplatAssetConfig, bU as SplatScenarioConfig, bV as StateSnapshot, bW as TrajectoryData, bX as TrajectoryFrameCallbackInput, bY as VisualScenarioMaterialFilterInput, bZ as XmlPatch, b_ as captureCameraFrame, b$ as captureCameraFrameBlob, c0 as captureCameraFrameTensor, c1 as createCameraFrameCaptureSession, c2 as dataUrlToPolicyImageTensor, c3 as getContact, c4 as imageDataToPolicyImageTensor, c5 as pixelsToPolicyImageTensor, c6 as registerModelResources, c7 as renderCameraFrameToCanvas } from './types-Dvtm4I0o.js';
2
+ import { M as MujocoContextValue, a as MujocoCanvasProps, b as MujocoSimAPI, S as SceneConfig, R as ReadyCallbackInput, c as StepCallbackInput, d as SelectionCallbackInput, e as MujocoModule, f as MujocoRenderOptions, P as PhysicsStepCallback, g as MujocoModel, h as MujocoData, C as ControlGroupInfo, A as ActuatedJointInfo, i as ControlGroupSelector, O as ObservationConfig, j as ObservationResult, I as IkConfig, k as IkContextValue, B as BodyProps, l as IkGizmoProps, D as DragInteractionProps, m as SceneLightsProps, n as ScenarioLightingProps, o as SplatEnvironmentProps, V as VisualScenarioEffectsProps, p as VisualScenarioConfig, q as SplatRendererKind, r as PairedSplatEnvironmentConfig, s as SplatFormat, t as SplatCollisionProxyConfig, u as SplatEnvironmentReadiness, v as SplatCollisionPrimitive, w as SplatEnvironmentReadinessStatus, x as SplatSceneConfigInput, y as SplatSceneConfigState, z as VisualScenarioExecutionContextInput, E as VisualScenarioExecutionContext, F as ScenarioLightingPreset, G as SplatEnvironmentMetadataInput, H as SplatEnvironmentMetadata, J as SplatSceneInput, K as CameraFrameCaptureOptions, L as DebugProps, N as GeomInfo, Q as ContactListenerProps, T as TrajectoryPlayerProps, U as ActuatorInfo, W as Sites, X as SitePositionResult, Y as Sensors, Z as SensorHandle, _ as SensorInfo, $ as Joints, a0 as ScalarJointStateResult, a1 as ArrayJointStateResult, a2 as JointStateOptions, a3 as JointStateResult, a4 as Bodies, a5 as BodyStateResult, a6 as Geoms, a7 as Actuators, a8 as CtrlHandle, a9 as ContactInfo, aa as KeyboardTeleopConfig, ab as KeyboardIkTargetConfig, ac as PolicyConfig, ad as PolicyAPI, ae as RemotePolicyConfig, af as RemotePolicyAPI, ag as ObservationHandle, ah as ObservationOutput, ai as TrajectoryInput, aj as TrajectoryStateChangeInput, ak as PlaybackState, al as TrajectoryFrame, am as FrameCaptureOptions, an as FrameCaptureResult, ao as FrameCaptureBlobResult, ap as FrameCaptureAPI, aq as CameraFrameCaptureAPI, ar as Cameras, as as CameraFrameSequenceCamera, at as CameraFrameCaptureSource, au as CameraFrameSequenceOptions, av as CameraFrameSequenceResult, aw as PolicyCameraFrameStream, ax as PolicyCameraFrameCaptureOptions, ay as PolicyCameraFrameCaptureResult, az as FrameCaptureStatus, aA as PolicyCameraFrameCaptureAPI, aB as CameraFrameCaptureTensorOptions, aC as CameraFrameTensorResult, aD as CameraFrameSequenceRecorderAPI, aE as ImagePointCoordinateSpace, aF as ImagePointProjectionOptions, aG as ImagePointProjectionResult, aH as PolicyVector } from './types-Bu8Aki_j.js';
3
+ export { aI as BodyInfo, aJ as CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY, aK as CAMERA_FRAME_CAPTURE_RENDER_USER_DATA_KEY, aL as CAPTURE_EXCLUDE_KEY, aM as CameraFrameCaptureBlobResult, aN as CameraFrameCaptureQuaternion, aO as CameraFrameCaptureResult, aP as CameraFrameCaptureSession, aQ as CameraFrameCaptureVector3, aR as CameraFramePixelsResult, aS as CameraFrameSequenceCameraSummary, aT as CameraFrameSequenceFrame, aU as CameraFrameSequenceSampleInput, aV as CameraFrameSequenceStepInput, aW as CameraInfo, aX as ControlJointInfo, aY as DebugVirtualCamera, aZ as FrameCaptureTarget, a_ as FrameCaptureTargetRef, a$ as IKSolveFn, b0 as IkGizmoDragInput, b1 as IkSolveInput, b2 as JointInfo, b3 as JointStateKind, b4 as KeyBinding, b5 as KeyboardIkTargetAction, b6 as KeyboardIkTargetBinding, b7 as Keyframes, b8 as ModelActuators, b9 as ModelBodies, ba as ModelCameras, bb as ModelGeoms, bc as ModelJoints, bd as ModelKeyframes, be as ModelOptions, bf as ModelResource, bg as ModelResources, bh as ModelSensors, bi as ModelSites, bj as Models, bk as MujocoContact, bl as MujocoContactArray, bm as MujocoFrameCaptureOptions, bn as ObservationLayoutItem, bo as PhysicsConfig, bp as PhysicsStepInput, bq as PolicyActionChunk, br as PolicyActionInput, bs as PolicyImageTensorLayout, bt as PolicyImageTensorOptions, bu as PolicyImageTensorPixelOptions, bv as PolicyImageTensorRange, bw as PolicyImageTensorResult, bx as PolicyImageTensorSourceOrigin, by as PolicyInferenceInput, bz as PolicyInferenceOutput, bA as PolicyInferenceResult, bB as PolicyObservationInput, bC as RayHit, bD as Register, bE as RegisteredModelMap, bF as RemotePolicyRequestInfo, bG as RemotePolicyRequestInput, bH as RemotePolicyResponseInfo, bI as RemotePolicyStatus, bJ as ResetCallbackInput, bK as ResolvedScenarioCameraConfig, bL as ResolvedScenarioMaterialConfig, bM as ResourceSelector, bN as ScenarioCameraConfig, bO as ScenarioMaterialConfig, bP as SceneMarker, bQ as SceneObject, bR as SensorResult, bS as SiteInfo, bT as SplatAssetConfig, bU as SplatScenarioConfig, bV as StateSnapshot, bW as TrajectoryData, bX as TrajectoryFrameCallbackInput, bY as VisualScenarioMaterialFilterInput, bZ as XmlPatch, b_ as captureCameraFrame, b$ as captureCameraFrameBlob, c0 as captureCameraFrameTensor, c1 as createCameraFrameCaptureSession, c2 as dataUrlToPolicyImageTensor, c3 as getContact, c4 as imageDataToPolicyImageTensor, c5 as pixelsToPolicyImageTensor, c6 as registerModelResources, c7 as renderCameraFrameToCanvas } from './types-Bu8Aki_j.js';
4
4
  import * as React$1 from 'react';
5
5
  import { CSSProperties, RefObject } from 'react';
6
6
  import * as THREE from 'three';
@@ -144,9 +144,10 @@ interface MujocoSimProviderProps {
144
144
  speed?: number;
145
145
  interpolate?: boolean;
146
146
  renderOptions?: MujocoRenderOptions;
147
+ hiddenBodies?: readonly string[];
147
148
  children: React.ReactNode;
148
149
  }
149
- declare function MujocoSimProvider({ mujoco, config, apiRef: externalApiRef, onReady, onError, onStep, onSelection, gravity, timestep, substeps, paused, speed, interpolate, renderOptions, children, }: MujocoSimProviderProps): react_jsx_runtime.JSX.Element;
150
+ declare function MujocoSimProvider({ mujoco, config, apiRef: externalApiRef, onReady, onError, onStep, onSelection, gravity, timestep, substeps, paused, speed, interpolate, renderOptions, hiddenBodies, children, }: MujocoSimProviderProps): react_jsx_runtime.JSX.Element;
150
151
 
151
152
  /**
152
153
  * @license
@@ -795,6 +796,9 @@ declare function useControlWriter(options: ControlWriterOptions): ControlWriterH
795
796
  * positional arrays, no `as const`, no owner bookkeeping.
796
797
  */
797
798
 
799
+ type StringKeyOf<T> = Extract<keyof T, string>;
800
+ type ControlDefinitionMap = Record<string, Actuators>;
801
+ type ControlValues<K extends string> = Partial<Record<K, number>>;
798
802
  /**
799
803
  * A typed description of a set of actuators, keyed by name. Create it once with
800
804
  * {@link controlGroup} and reuse it across controllers and scripts; the key
@@ -810,6 +814,12 @@ interface ControlGroup<K extends Actuators = Actuators> {
810
814
  * no `as const` required (the `const` type parameter captures them).
811
815
  */
812
816
  declare function controlGroup<const T extends readonly Actuators[]>(names: T): ControlGroup<T[number]>;
817
+ interface DefinedControls<TControls extends ControlDefinitionMap = ControlDefinitionMap> {
818
+ readonly controls: TControls;
819
+ readonly aliases: readonly StringKeyOf<TControls>[];
820
+ readonly keys: readonly TControls[StringKeyOf<TControls>][];
821
+ }
822
+ declare function defineControls<const TControls extends ControlDefinitionMap>(controls: TControls): DefinedControls<TControls>;
813
823
  interface ControlGroupSetOptions {
814
824
  /** Write even when another control writer owns one of these actuators. */
815
825
  force?: boolean;
@@ -817,8 +827,14 @@ interface ControlGroupSetOptions {
817
827
  interface ControlGroupHandle<K extends string> {
818
828
  /** The cooperative-ownership identity used for conflict detection. */
819
829
  owner: string;
830
+ /** Set a single actuator by name. Returns false if blocked by a conflict. */
831
+ set(name: K, value: number, options?: ControlGroupSetOptions): boolean;
820
832
  /** Set one or more actuators by name. Returns false if blocked by a conflict. */
821
- set(values: Partial<Record<K, number>>, options?: ControlGroupSetOptions): boolean;
833
+ patch(values: ControlValues<K>, options?: ControlGroupSetOptions): boolean;
834
+ /** Write values in the same order as the declared control group. */
835
+ write(values: ArrayLike<number>, options?: ControlGroupSetOptions): boolean;
836
+ /** Read one actuator value by name. */
837
+ get(name: K): number;
822
838
  /** Read the current control value of every actuator in the group, by name. */
823
839
  read(): Record<K, number>;
824
840
  /** Whether this group can currently write (no unresolved conflicts). */
@@ -827,10 +843,31 @@ interface ControlGroupHandle<K extends string> {
827
843
  release(): void;
828
844
  }
829
845
  type UseControlGroupOptions = Omit<ControlWriterOptions, 'owner' | 'selector'> & {
830
- /** Override the auto-generated owner id (useful for readable conflict logs). */
846
+ /** Human-readable conflict label. */
847
+ label?: string;
848
+ /** Override the generated conflict owner id. Prefer `label` for normal use. */
831
849
  owner?: string;
832
850
  };
851
+ interface ControlsHandle<TControls extends ControlDefinitionMap> {
852
+ /** The cooperative-ownership identity used for conflict detection. */
853
+ owner: string;
854
+ /** Set one alias by name. Returns false if blocked by a conflict. */
855
+ set(name: StringKeyOf<TControls>, value: number, options?: ControlGroupSetOptions): boolean;
856
+ /** Set one or more aliases by name. Returns false if blocked by a conflict. */
857
+ patch(values: ControlValues<StringKeyOf<TControls>>, options?: ControlGroupSetOptions): boolean;
858
+ /** Write values in the same order as the `defineControls()` object. */
859
+ write(values: ArrayLike<number>, options?: ControlGroupSetOptions): boolean;
860
+ /** Read one alias value by name. */
861
+ get(name: StringKeyOf<TControls>): number;
862
+ /** Read every alias value. */
863
+ read(): Record<StringKeyOf<TControls>, number>;
864
+ /** Whether this group can currently write (no unresolved conflicts). */
865
+ canWrite(): boolean;
866
+ /** Release this group's actuator ownership. */
867
+ release(): void;
868
+ }
833
869
  declare function useControlGroup<K extends Actuators>(group: ControlGroup<K>, options?: UseControlGroupOptions): ControlGroupHandle<K>;
870
+ declare function useControls<TControls extends ControlDefinitionMap>(definition: DefinedControls<TControls>, options?: UseControlGroupOptions): ControlsHandle<TControls>;
834
871
 
835
872
  /**
836
873
  * @license
@@ -1595,4 +1632,4 @@ interface CameraAnimationAPI {
1595
1632
  */
1596
1633
  declare function useCameraAnimation(): CameraAnimationAPI;
1597
1634
 
1598
- export { ActuatedJointInfo, ActuatorInfo, Actuators, type ApplyPolicyActionToControlsOptions, type ApplyPolicyActionToControlsResult, ArrayJointStateResult, Bodies, Body, BodyProps, BodyStateResult, type CameraAnimationAPI, CameraFrameCaptureAPI, CameraFrameCaptureOptions, CameraFrameCaptureSource, CameraFrameCaptureTensorOptions, type CameraFrameMountSelector, CameraFrameSequenceCamera, CameraFrameSequenceOptions, CameraFrameSequenceRecorderAPI, CameraFrameSequenceResult, CameraFrameTensorResult, type CameraStreamOptions, CameraView, type CameraViewProps, type CameraViewportOptions, Cameras, type ContactHistoryEntry, type ContactHistoryHandle, type ContactHistoryOptions, ContactInfo, ContactListener, ContactListenerProps, ContactMarkers, type ControlGroup, type ControlGroupHandle, ControlGroupInfo, ControlGroupSelector, type ControlGroupSetOptions, type ControlWriterConflict, type ControlWriterHandle, type ControlWriterOptions, type ControlWriterWriteOptions, type ControllerComponent, type ControllerOptions, type CreateMountedCameraFrameSequenceManifestOptions, type CreateMountedCameraFrameSequencePlanOptions, type CreatePolicyCameraFrameCapturePlanOptions, CtrlHandle, Debug, DebugProps, DragInteraction, DragInteractionProps, FlexRenderer, FrameCaptureAPI, FrameCaptureBlobResult, FrameCaptureOptions, FrameCaptureResult, FrameCaptureStatus, GenericIK, type GenericIKOptions, GeomInfo, Geoms, IkConfig, IkContextValue, IkGizmo, IkGizmoProps, ImagePointCoordinateSpace, ImagePointProjectionOptions, ImagePointProjectionResult, InstancedGeomRenderer, JointStateOptions, JointStateResult, Joints, KeyboardIkTargetConfig, KeyboardTeleopConfig, type MountedCameraFrameCaptureSource, type MountedCameraFrameSequenceCameraOptions, type MountedCameraFrameSequenceDefaults, type MountedCameraFrameSequenceManifest, MountedCameraFrameSequenceManifestStatus, type MountedCameraFrameSequencePlan, type MountedCameraFrameSequencePlanOptions, type MountedCameraFrameSequenceReadiness, MountedCameraFrameSequenceReadinessStatus, type MountedCameraFrameSequenceRecordOptions, type MountedCameraFrameSequenceRecordResult, type MountedCameraFrameSequenceRecorderTarget, type MountedCameraFrameSequenceSourceReadiness, type MountedCameraFrameSequenceStreamSummary, type MountedCameraFrameSourceSuggestion, MountedCameraFrameSourceSuggestionMatch, type MountedCameraSequencePlanOptions, type MountedCameraSequenceReadiness, type MountedCameraSequenceRecordOptions, type MountedCameraSequenceRecordResult, type MountedCameraSequenceRecorderAPI, type MountedPolicyCameraFrameCaptureAPI, type MountedPolicyCameraFrameCaptureOptions, type MountedPolicyCameraTensorOptions, MujocoCanvas, MujocoCanvasProps, MujocoContextValue, MujocoData, type MujocoLoader, type MujocoLoaderOptions, MujocoModel, MujocoModule, MujocoPhysics, type MujocoPhysicsProps, MujocoProvider, type MujocoProviderProps, MujocoSimAPI, MujocoSimProvider, type MujocoWasmVariant, type NamedCameraFrameResource, type NamedObservationField, type NamedObservationHandle, type NamedObservationInput, type NamedObservationLayoutItem, type NamedObservationMissing, type NamedObservationOptions, type NamedObservationResult, ObservationConfig, ObservationHandle, ObservationOutput, ObservationResult, PairedSplatEnvironmentConfig, PhysicsStepCallback, PlaybackState, PolicyAPI, PolicyCameraFrameCaptureAPI, PolicyCameraFrameCaptureOptions, type PolicyCameraFrameCapturePlan, PolicyCameraFrameCaptureResult, type PolicyCameraFrameCaptureTarget, type PolicyCameraFramePlanTarget, PolicyCameraFrameStream, type PolicyCameraFrameStreamOptions, type PolicyCameraTensorStream, type PolicyCameraTensorsAPI, type PolicyCameraTensorsOptions, type PolicyCameraTensorsResult, PolicyConfig, PolicyVector, type PoseReadout, type PoseResourceKind, ReadyCallbackInput, RemotePolicyAPI, RemotePolicyConfig, type ResolveMountedCameraFrameSourceOptions, type ResolvedMountedCameraFrameSource, ScalarJointStateResult, ScenarioLighting, ScenarioLightingPreset, ScenarioLightingProps, SceneConfig, SceneLights, SceneLightsProps, SelectionCallbackInput, SensorHandle, SensorInfo, Sensors, SitePositionResult, Sites, SplatCollisionPrimitive, SplatCollisionProxyConfig, type SplatCollisionProxyGeomPreview, type SplatCollisionProxyGeomsState, SplatCollisionProxyPreview, type SplatCollisionProxyPreviewProps, type SplatCollisionProxyPreviewStatus, type SplatCollisionProxyPreviewVector3, SplatEnvironment, SplatEnvironmentMetadata, SplatEnvironmentMetadataInput, SplatEnvironmentProps, SplatEnvironmentReadiness, SplatEnvironmentReadinessStatus, SplatFormat, SplatRendererKind, SplatSceneConfigInput, SplatSceneConfigState, SplatSceneInput, StepCallbackInput, TendonRenderer, TrajectoryFrame, TrajectoryInput, TrajectoryPlayer, TrajectoryPlayerProps, TrajectoryStateChangeInput, type UseControlGroupOptions, type UseSplatCollisionProxyGeomsOptions, VisualScenarioConfig, VisualScenarioEffects, VisualScenarioEffectsProps, VisualScenarioExecutionContext, VisualScenarioExecutionContextInput, applyPolicyActionToControls, bodyPositionField, buildObservation, canFetchSplatCollisionProxyXml, captureFrame, captureFrameBlob, capturePolicyCameraFrames, capturePolicyCameraFramesFromMountedStreams, clampPolicyActionValue, controlGroup, createContiguousControlGroup, createController, createControllerHook, createMountedCameraFrameSequenceManifest, createMountedCameraFrameSequencePlan, createMountedCameraFrameSequencePlanFromApi, createMountedCameraFrameSequenceReadiness, createMountedCameraFrameSourceSuggestions, createNamedObservationBuilder, createPairedSplatEnvironment, createPolicyCameraFrameCapturePlan, createPolicyCameraFrameCapturePlanFromApi, createSparkSplatViewerUrl, createSplatEnvironmentUserData, createSplatSceneConfig, createVisualScenarioExecutionContext, ctrlField, fetchSplatCollisionProxyXml, findActuatorByName, findBodyByName, findGeomByName, findJointByName, findKeyframeByName, findSensorByName, findSiteByName, findTendonByName, geomPositionField, getActuatedJoints, getCameraFrameCaptureSourceTarget, getControlMap, getMountedCameraFrameCaptureSource, getName, getScenarioBackground, getScenarioCameraPosition, getSplatEnvironmentReadiness, imagePointToNdc, isMountedCameraFrameCaptureSource, loadScene, parseSplatCollisionProxyGeoms, projectImagePointTo3D, qposField, qvelField, readNamedObservation, recordMountedCameraFrameSequence, resolveControlGroup, resolveMountedCameraFrameSource, sitePositionField, useActuators, useAfterPhysicsStep, useBeforePhysicsStep, useBodyMeshes, useBodyPose, useBodyState, useCameraAnimation, useCameraFrameCapture, useCameraSequenceRecorder, useCameraStream, useCameraViewport, useContactEvents, useContactHistory, useContacts, useControlGroup, useControlWriter, useCtrl, useCtrlNoise, useFrameCapture, useGamepad, useGeomPose, useGravityCompensation, useIkController, useJointState, useKeyboardIkTarget, useKeyboardTeleop, useMountedCameraSequenceRecorder, useMujoco, useMujocoWasm, useNamedObservation, useObservation, usePolicy, usePolicyCameraFrames, usePolicyCameraFramesFromMountedStreams, usePolicyCameraTensors, usePolicyCameraTensorsFromMountedStreams, useRemotePolicy, useSceneLights, useSelectionHighlight, useSensor, useSensors, useSitePose, useSitePosition, useSplatCollisionProxyGeoms, useSplatEnvironment, useSplatSceneConfig, useTrajectoryPlayer, useTrajectoryRecorder, useVideoRecorder, useVisualScenarioEffects, useVisualScenarioExecutionContext, withSplatEnvironment };
1635
+ export { ActuatedJointInfo, ActuatorInfo, Actuators, type ApplyPolicyActionToControlsOptions, type ApplyPolicyActionToControlsResult, ArrayJointStateResult, Bodies, Body, BodyProps, BodyStateResult, type CameraAnimationAPI, CameraFrameCaptureAPI, CameraFrameCaptureOptions, CameraFrameCaptureSource, CameraFrameCaptureTensorOptions, type CameraFrameMountSelector, CameraFrameSequenceCamera, CameraFrameSequenceOptions, CameraFrameSequenceRecorderAPI, CameraFrameSequenceResult, CameraFrameTensorResult, type CameraStreamOptions, CameraView, type CameraViewProps, type CameraViewportOptions, Cameras, type ContactHistoryEntry, type ContactHistoryHandle, type ContactHistoryOptions, ContactInfo, ContactListener, ContactListenerProps, ContactMarkers, type ControlGroup, type ControlGroupHandle, ControlGroupInfo, ControlGroupSelector, type ControlGroupSetOptions, type ControlWriterConflict, type ControlWriterHandle, type ControlWriterOptions, type ControlWriterWriteOptions, type ControllerComponent, type ControllerOptions, type ControlsHandle, type CreateMountedCameraFrameSequenceManifestOptions, type CreateMountedCameraFrameSequencePlanOptions, type CreatePolicyCameraFrameCapturePlanOptions, CtrlHandle, Debug, DebugProps, type DefinedControls, DragInteraction, DragInteractionProps, FlexRenderer, FrameCaptureAPI, FrameCaptureBlobResult, FrameCaptureOptions, FrameCaptureResult, FrameCaptureStatus, GenericIK, type GenericIKOptions, GeomInfo, Geoms, IkConfig, IkContextValue, IkGizmo, IkGizmoProps, ImagePointCoordinateSpace, ImagePointProjectionOptions, ImagePointProjectionResult, InstancedGeomRenderer, JointStateOptions, JointStateResult, Joints, KeyboardIkTargetConfig, KeyboardTeleopConfig, type MountedCameraFrameCaptureSource, type MountedCameraFrameSequenceCameraOptions, type MountedCameraFrameSequenceDefaults, type MountedCameraFrameSequenceManifest, MountedCameraFrameSequenceManifestStatus, type MountedCameraFrameSequencePlan, type MountedCameraFrameSequencePlanOptions, type MountedCameraFrameSequenceReadiness, MountedCameraFrameSequenceReadinessStatus, type MountedCameraFrameSequenceRecordOptions, type MountedCameraFrameSequenceRecordResult, type MountedCameraFrameSequenceRecorderTarget, type MountedCameraFrameSequenceSourceReadiness, type MountedCameraFrameSequenceStreamSummary, type MountedCameraFrameSourceSuggestion, MountedCameraFrameSourceSuggestionMatch, type MountedCameraSequencePlanOptions, type MountedCameraSequenceReadiness, type MountedCameraSequenceRecordOptions, type MountedCameraSequenceRecordResult, type MountedCameraSequenceRecorderAPI, type MountedPolicyCameraFrameCaptureAPI, type MountedPolicyCameraFrameCaptureOptions, type MountedPolicyCameraTensorOptions, MujocoCanvas, MujocoCanvasProps, MujocoContextValue, MujocoData, type MujocoLoader, type MujocoLoaderOptions, MujocoModel, MujocoModule, MujocoPhysics, type MujocoPhysicsProps, MujocoProvider, type MujocoProviderProps, MujocoSimAPI, MujocoSimProvider, type MujocoWasmVariant, type NamedCameraFrameResource, type NamedObservationField, type NamedObservationHandle, type NamedObservationInput, type NamedObservationLayoutItem, type NamedObservationMissing, type NamedObservationOptions, type NamedObservationResult, ObservationConfig, ObservationHandle, ObservationOutput, ObservationResult, PairedSplatEnvironmentConfig, PhysicsStepCallback, PlaybackState, PolicyAPI, PolicyCameraFrameCaptureAPI, PolicyCameraFrameCaptureOptions, type PolicyCameraFrameCapturePlan, PolicyCameraFrameCaptureResult, type PolicyCameraFrameCaptureTarget, type PolicyCameraFramePlanTarget, PolicyCameraFrameStream, type PolicyCameraFrameStreamOptions, type PolicyCameraTensorStream, type PolicyCameraTensorsAPI, type PolicyCameraTensorsOptions, type PolicyCameraTensorsResult, PolicyConfig, PolicyVector, type PoseReadout, type PoseResourceKind, ReadyCallbackInput, RemotePolicyAPI, RemotePolicyConfig, type ResolveMountedCameraFrameSourceOptions, type ResolvedMountedCameraFrameSource, ScalarJointStateResult, ScenarioLighting, ScenarioLightingPreset, ScenarioLightingProps, SceneConfig, SceneLights, SceneLightsProps, SelectionCallbackInput, SensorHandle, SensorInfo, Sensors, SitePositionResult, Sites, SplatCollisionPrimitive, SplatCollisionProxyConfig, type SplatCollisionProxyGeomPreview, type SplatCollisionProxyGeomsState, SplatCollisionProxyPreview, type SplatCollisionProxyPreviewProps, type SplatCollisionProxyPreviewStatus, type SplatCollisionProxyPreviewVector3, SplatEnvironment, SplatEnvironmentMetadata, SplatEnvironmentMetadataInput, SplatEnvironmentProps, SplatEnvironmentReadiness, SplatEnvironmentReadinessStatus, SplatFormat, SplatRendererKind, SplatSceneConfigInput, SplatSceneConfigState, SplatSceneInput, StepCallbackInput, TendonRenderer, TrajectoryFrame, TrajectoryInput, TrajectoryPlayer, TrajectoryPlayerProps, TrajectoryStateChangeInput, type UseControlGroupOptions, type UseSplatCollisionProxyGeomsOptions, VisualScenarioConfig, VisualScenarioEffects, VisualScenarioEffectsProps, VisualScenarioExecutionContext, VisualScenarioExecutionContextInput, applyPolicyActionToControls, bodyPositionField, buildObservation, canFetchSplatCollisionProxyXml, captureFrame, captureFrameBlob, capturePolicyCameraFrames, capturePolicyCameraFramesFromMountedStreams, clampPolicyActionValue, controlGroup, createContiguousControlGroup, createController, createControllerHook, createMountedCameraFrameSequenceManifest, createMountedCameraFrameSequencePlan, createMountedCameraFrameSequencePlanFromApi, createMountedCameraFrameSequenceReadiness, createMountedCameraFrameSourceSuggestions, createNamedObservationBuilder, createPairedSplatEnvironment, createPolicyCameraFrameCapturePlan, createPolicyCameraFrameCapturePlanFromApi, createSparkSplatViewerUrl, createSplatEnvironmentUserData, createSplatSceneConfig, createVisualScenarioExecutionContext, ctrlField, defineControls, fetchSplatCollisionProxyXml, findActuatorByName, findBodyByName, findGeomByName, findJointByName, findKeyframeByName, findSensorByName, findSiteByName, findTendonByName, geomPositionField, getActuatedJoints, getCameraFrameCaptureSourceTarget, getControlMap, getMountedCameraFrameCaptureSource, getName, getScenarioBackground, getScenarioCameraPosition, getSplatEnvironmentReadiness, imagePointToNdc, isMountedCameraFrameCaptureSource, loadScene, parseSplatCollisionProxyGeoms, projectImagePointTo3D, qposField, qvelField, readNamedObservation, recordMountedCameraFrameSequence, resolveControlGroup, resolveMountedCameraFrameSource, sitePositionField, useActuators, useAfterPhysicsStep, useBeforePhysicsStep, useBodyMeshes, useBodyPose, useBodyState, useCameraAnimation, useCameraFrameCapture, useCameraSequenceRecorder, useCameraStream, useCameraViewport, useContactEvents, useContactHistory, useContacts, useControlGroup, useControlWriter, useControls, useCtrl, useCtrlNoise, useFrameCapture, useGamepad, useGeomPose, useGravityCompensation, useIkController, useJointState, useKeyboardIkTarget, useKeyboardTeleop, useMountedCameraSequenceRecorder, useMujoco, useMujocoWasm, useNamedObservation, useObservation, usePolicy, usePolicyCameraFrames, usePolicyCameraFramesFromMountedStreams, usePolicyCameraTensors, usePolicyCameraTensorsFromMountedStreams, useRemotePolicy, useSceneLights, useSelectionHighlight, useSensor, useSensors, useSitePose, useSitePosition, useSplatCollisionProxyGeoms, useSplatEnvironment, useSplatSceneConfig, useTrajectoryPlayer, useTrajectoryRecorder, useVideoRecorder, useVisualScenarioEffects, useVisualScenarioExecutionContext, withSplatEnvironment };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { withContacts, getContact, captureCameraFrame, captureCameraFrameBlob, createCameraFrameCaptureSession, CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY, CAPTURE_EXCLUDE_KEY, createCaptureCamera, prepareCaptureCamera } from './chunk-EN55TTGH.js';
2
- export { CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY, CAMERA_FRAME_CAPTURE_RENDER_USER_DATA_KEY, CAPTURE_EXCLUDE_KEY, ModelActuators, ModelBodies, ModelCameras, ModelGeoms, ModelJoints, ModelKeyframes, ModelResources, ModelSensors, ModelSites, ScenarioLighting, SplatEnvironment, SplatEnvironmentReadinessStatus, VisualScenarioEffects, captureCameraFrame, captureCameraFrameBlob, captureCameraFrameTensor, createCameraFrameCaptureSession, createPairedSplatEnvironment, createSparkSplatViewerUrl, createSplatEnvironmentUserData, createSplatSceneConfig, createVisualScenarioExecutionContext, dataUrlToPolicyImageTensor, getContact, getScenarioBackground, getScenarioCameraPosition, getSplatEnvironmentReadiness, imageDataToPolicyImageTensor, pixelsToPolicyImageTensor, registerModelResources, renderCameraFrameToCanvas, useSplatEnvironment, useSplatSceneConfig, useVisualScenarioEffects, useVisualScenarioExecutionContext, withSplatEnvironment } from './chunk-EN55TTGH.js';
1
+ import { withContacts, getContact, captureCameraFrame, captureCameraFrameBlob, createCameraFrameCaptureSession, CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY, CAPTURE_EXCLUDE_KEY, createCaptureCamera, prepareCaptureCamera } from './chunk-5WFYM73E.js';
2
+ export { CAMERA_FRAME_CAPTURE_PRE_RENDER_USER_DATA_KEY, CAMERA_FRAME_CAPTURE_RENDER_USER_DATA_KEY, CAPTURE_EXCLUDE_KEY, ModelActuators, ModelBodies, ModelCameras, ModelGeoms, ModelJoints, ModelKeyframes, ModelResources, ModelSensors, ModelSites, ScenarioLighting, SplatEnvironment, SplatEnvironmentReadinessStatus, VisualScenarioEffects, captureCameraFrame, captureCameraFrameBlob, captureCameraFrameTensor, createCameraFrameCaptureSession, createPairedSplatEnvironment, createSparkSplatViewerUrl, createSplatEnvironmentUserData, createSplatSceneConfig, createVisualScenarioExecutionContext, dataUrlToPolicyImageTensor, getContact, getScenarioBackground, getScenarioCameraPosition, getSplatEnvironmentReadiness, imageDataToPolicyImageTensor, pixelsToPolicyImageTensor, registerModelResources, renderCameraFrameToCanvas, useSplatEnvironment, useSplatSceneConfig, useVisualScenarioEffects, useVisualScenarioExecutionContext, withSplatEnvironment } from './chunk-5WFYM73E.js';
3
3
  import loadMujoco from '@mujoco/mujoco';
4
4
  import defaultMujocoWasmUrl from '@mujoco/mujoco/mujoco.wasm?url';
5
5
  import { createContext, forwardRef, useRef, useEffect, useContext, useState, useCallback, useMemo, useLayoutEffect, useId } from 'react';
@@ -1001,14 +1001,34 @@ var GeomBuilder = class {
1001
1001
  const vNum = mjModel.mesh_vertnum[mId];
1002
1002
  const fAdr = mjModel.mesh_faceadr[mId];
1003
1003
  const fNum = mjModel.mesh_facenum[mId];
1004
- geo = new THREE11.BufferGeometry();
1005
- geo.setAttribute("position", new THREE11.Float32BufferAttribute(mjModel.mesh_vert.subarray(vAdr * 3, (vAdr + vNum) * 3), 3));
1006
- geo.setIndex(Array.from(mjModel.mesh_face.subarray(fAdr * 3, (fAdr + fNum) * 3)));
1007
- const smoothingTolerance = this.getMeshNormalSmoothingTolerance();
1008
- if (smoothingTolerance !== null) {
1009
- geo = mergeVertices(geo, smoothingTolerance);
1004
+ const tAdr = mjModel.mesh_texcoordadr?.[mId] ?? -1;
1005
+ if (map && tAdr >= 0 && mjModel.mesh_texcoord && mjModel.mesh_facetexcoord) {
1006
+ const corners = fNum * 3;
1007
+ const positions = new Float32Array(corners * 3);
1008
+ const uvs = new Float32Array(corners * 2);
1009
+ for (let c = 0; c < corners; c++) {
1010
+ const v = vAdr + mjModel.mesh_face[fAdr * 3 + c];
1011
+ positions[c * 3] = mjModel.mesh_vert[v * 3];
1012
+ positions[c * 3 + 1] = mjModel.mesh_vert[v * 3 + 1];
1013
+ positions[c * 3 + 2] = mjModel.mesh_vert[v * 3 + 2];
1014
+ const t = tAdr + mjModel.mesh_facetexcoord[fAdr * 3 + c];
1015
+ uvs[c * 2] = mjModel.mesh_texcoord[t * 2];
1016
+ uvs[c * 2 + 1] = 1 - mjModel.mesh_texcoord[t * 2 + 1];
1017
+ }
1018
+ geo = new THREE11.BufferGeometry();
1019
+ geo.setAttribute("position", new THREE11.Float32BufferAttribute(positions, 3));
1020
+ geo.setAttribute("uv", new THREE11.Float32BufferAttribute(uvs, 2));
1021
+ geo.computeVertexNormals();
1022
+ } else {
1023
+ geo = new THREE11.BufferGeometry();
1024
+ geo.setAttribute("position", new THREE11.Float32BufferAttribute(mjModel.mesh_vert.subarray(vAdr * 3, (vAdr + vNum) * 3), 3));
1025
+ geo.setIndex(Array.from(mjModel.mesh_face.subarray(fAdr * 3, (fAdr + fNum) * 3)));
1026
+ const smoothingTolerance = this.getMeshNormalSmoothingTolerance();
1027
+ if (smoothingTolerance !== null) {
1028
+ geo = mergeVertices(geo, smoothingTolerance);
1029
+ }
1030
+ geo.computeVertexNormals();
1010
1031
  }
1011
- geo.computeVertexNormals();
1012
1032
  }
1013
1033
  if (geo) {
1014
1034
  const isPlane = type === getVal(MG.mjGEOM_PLANE);
@@ -1051,6 +1071,7 @@ function SceneRenderer({ renderOptions, ...props }) {
1051
1071
  mujocoRef,
1052
1072
  onSelectionRef,
1053
1073
  hiddenBodiesRef,
1074
+ hiddenBodiesVersion,
1054
1075
  interpolateRef,
1055
1076
  interpolationStateRef,
1056
1077
  status
@@ -1059,6 +1080,7 @@ function SceneRenderer({ renderOptions, ...props }) {
1059
1080
  const bodyRefs = useRef([]);
1060
1081
  const prevModelRef = useRef(null);
1061
1082
  const prevRenderOptionsKeyRef = useRef(null);
1083
+ const prevHiddenVersionRef = useRef(null);
1062
1084
  const renderOptionsKey = getRenderOptionsKey(renderOptions);
1063
1085
  const geomBuilder = useMemo(() => {
1064
1086
  if (status !== "ready") return null;
@@ -1069,11 +1091,12 @@ function SceneRenderer({ renderOptions, ...props }) {
1069
1091
  const model = mjModelRef.current;
1070
1092
  const group = groupRef.current;
1071
1093
  if (!model || !group) return;
1072
- if (prevModelRef.current === model && prevRenderOptionsKeyRef.current === renderOptionsKey) {
1094
+ if (prevModelRef.current === model && prevRenderOptionsKeyRef.current === renderOptionsKey && prevHiddenVersionRef.current === hiddenBodiesVersion) {
1073
1095
  return;
1074
1096
  }
1075
1097
  prevModelRef.current = model;
1076
1098
  prevRenderOptionsKeyRef.current = renderOptionsKey;
1099
+ prevHiddenVersionRef.current = hiddenBodiesVersion;
1077
1100
  while (group.children.length > 0) {
1078
1101
  group.remove(group.children[0]);
1079
1102
  }
@@ -1094,7 +1117,7 @@ function SceneRenderer({ renderOptions, ...props }) {
1094
1117
  refs.push(bodyGroup);
1095
1118
  }
1096
1119
  bodyRefs.current = refs;
1097
- }, [status, geomBuilder, mjModelRef, renderOptionsKey]);
1120
+ }, [status, geomBuilder, mjModelRef, renderOptionsKey, hiddenBodiesRef, hiddenBodiesVersion]);
1098
1121
  const syncBodiesToData = useCallback(() => {
1099
1122
  const data = mjDataRef.current;
1100
1123
  if (!data) return;
@@ -2275,6 +2298,7 @@ function MujocoSimProvider({
2275
2298
  speed,
2276
2299
  interpolate,
2277
2300
  renderOptions,
2301
+ hiddenBodies,
2278
2302
  children
2279
2303
  }) {
2280
2304
  const { gl, camera, scene } = useThree();
@@ -2308,6 +2332,8 @@ function MujocoSimProvider({
2308
2332
  const errorRef = useRef(null);
2309
2333
  const bodyRegistryRef = useRef(/* @__PURE__ */ new Map());
2310
2334
  const hiddenBodiesRef = useRef(/* @__PURE__ */ new Set());
2335
+ const providedHiddenBodiesRef = useRef(new Set(hiddenBodies ?? []));
2336
+ const [hiddenBodiesVersion, setHiddenBodiesVersion] = useState(0);
2311
2337
  const bodyReloadTimerRef = useRef(null);
2312
2338
  configRef.current = config;
2313
2339
  mujocoRef.current = mujoco;
@@ -2329,15 +2355,37 @@ function MujocoSimProvider({
2329
2355
  if (!model?.opt) return;
2330
2356
  model.opt.timestep = timestep;
2331
2357
  }, [timestep]);
2358
+ const hiddenBodiesKey = (hiddenBodies ?? []).join("\0");
2359
+ useEffect(() => {
2360
+ const next = new Set(hiddenBodies ?? []);
2361
+ const prev = providedHiddenBodiesRef.current;
2362
+ let unchanged = next.size === prev.size;
2363
+ if (unchanged) {
2364
+ for (const name of next) {
2365
+ if (!prev.has(name)) {
2366
+ unchanged = false;
2367
+ break;
2368
+ }
2369
+ }
2370
+ }
2371
+ if (unchanged) return;
2372
+ providedHiddenBodiesRef.current = next;
2373
+ recomputeHiddenBodies();
2374
+ setHiddenBodiesVersion((v) => v + 1);
2375
+ }, [hiddenBodiesKey]);
2376
+ function recomputeHiddenBodies() {
2377
+ hiddenBodiesRef.current.clear();
2378
+ for (const [name, entry] of bodyRegistryRef.current) {
2379
+ if (entry.hasCustomChildren) hiddenBodiesRef.current.add(name);
2380
+ }
2381
+ for (const name of providedHiddenBodiesRef.current) hiddenBodiesRef.current.add(name);
2382
+ }
2332
2383
  function buildMergedConfig(baseConfig) {
2384
+ recomputeHiddenBodies();
2333
2385
  if (bodyRegistryRef.current.size === 0) return baseConfig;
2334
2386
  const registeredNames = new Set(bodyRegistryRef.current.keys());
2335
2387
  const baseObjects = (baseConfig.sceneObjects ?? []).filter((o) => !registeredNames.has(o.name));
2336
2388
  const registeredBodies = Array.from(bodyRegistryRef.current.values()).map((e) => e.definition);
2337
- hiddenBodiesRef.current.clear();
2338
- for (const [name, entry] of bodyRegistryRef.current) {
2339
- if (entry.hasCustomChildren) hiddenBodiesRef.current.add(name);
2340
- }
2341
2389
  return { ...baseConfig, sceneObjects: [...baseObjects, ...registeredBodies] };
2342
2390
  }
2343
2391
  useEffect(() => {
@@ -3555,10 +3603,11 @@ function MujocoSimProvider({
3555
3603
  errorRef,
3556
3604
  bodyRegistryRef,
3557
3605
  hiddenBodiesRef,
3606
+ hiddenBodiesVersion,
3558
3607
  requestBodyReload,
3559
3608
  status
3560
3609
  }),
3561
- [api, status, requestBodyReload]
3610
+ [api, status, requestBodyReload, hiddenBodiesVersion]
3562
3611
  );
3563
3612
  return /* @__PURE__ */ jsxs(MujocoSimContext.Provider, { value: contextValue, children: [
3564
3613
  /* @__PURE__ */ jsx(SceneRenderer, { renderOptions }),
@@ -3580,6 +3629,7 @@ var MujocoCanvas = forwardRef(
3580
3629
  speed,
3581
3630
  interpolate,
3582
3631
  renderOptions,
3632
+ hiddenBodies,
3583
3633
  loadingFallback,
3584
3634
  children,
3585
3635
  ...canvasProps
@@ -3615,6 +3665,7 @@ var MujocoCanvas = forwardRef(
3615
3665
  speed,
3616
3666
  interpolate,
3617
3667
  renderOptions,
3668
+ hiddenBodies,
3618
3669
  children
3619
3670
  }
3620
3671
  ) });
@@ -4058,7 +4109,16 @@ var useIkController = createControllerHook(
4058
4109
  const ikTargetRef = useRef(new THREE11.Group());
4059
4110
  const siteIdRef = useRef(-1);
4060
4111
  const controlGroupRef = useRef(null);
4061
- const genericIkRef = useRef(new GenericIK(mujocoRef.current));
4112
+ const genericIkRef = useRef(null);
4113
+ const genericIkModuleRef = useRef(null);
4114
+ const getGenericIk = useCallback(() => {
4115
+ const module = mujocoRef.current;
4116
+ if (!genericIkRef.current || genericIkModuleRef.current !== module) {
4117
+ genericIkRef.current = new GenericIK(module);
4118
+ genericIkModuleRef.current = module;
4119
+ }
4120
+ return genericIkRef.current;
4121
+ }, [mujocoRef]);
4062
4122
  const firstIkEnableRef = useRef(true);
4063
4123
  const needsInitialSync = useRef(true);
4064
4124
  const gizmoAnimRef = useRef({
@@ -4109,7 +4169,7 @@ var useIkController = createControllerHook(
4109
4169
  const data = mjDataRef.current;
4110
4170
  const controlGroup2 = controlGroupRef.current;
4111
4171
  if (!model || !data || !controlGroup2 || siteIdRef.current === -1) return null;
4112
- return genericIkRef.current.solve(
4172
+ return getGenericIk().solve(
4113
4173
  model,
4114
4174
  data,
4115
4175
  siteIdRef.current,
@@ -4128,7 +4188,7 @@ var useIkController = createControllerHook(
4128
4188
  }
4129
4189
  );
4130
4190
  },
4131
- [config, mjModelRef, mjDataRef]
4191
+ [config, mjModelRef, mjDataRef, getGenericIk]
4132
4192
  );
4133
4193
  const ikSolveFnRef = useRef(ikSolveFn);
4134
4194
  ikSolveFnRef.current = ikSolveFn;
@@ -6759,19 +6819,35 @@ function useControlWriter(options) {
6759
6819
  }
6760
6820
 
6761
6821
  // src/hooks/useControlGroup.ts
6822
+ function objectKeys(value) {
6823
+ return Object.keys(value);
6824
+ }
6825
+ function singleControlValue(name, value) {
6826
+ const values = {};
6827
+ values[name] = value;
6828
+ return values;
6829
+ }
6762
6830
  function controlGroup(names) {
6763
6831
  return { keys: names };
6764
6832
  }
6833
+ function defineControls(controls) {
6834
+ const aliases = objectKeys(controls);
6835
+ return {
6836
+ controls,
6837
+ aliases,
6838
+ keys: aliases.map((alias) => controls[alias])
6839
+ };
6840
+ }
6765
6841
  function useControlGroup(group, options = {}) {
6766
6842
  const generatedOwner = useId();
6767
- const owner = options.owner ?? `control-group:${generatedOwner}`;
6843
+ const owner = options.owner ?? options.label ?? `control-group:${generatedOwner}`;
6768
6844
  const { mjModelRef, mjDataRef, status } = useMujocoContext();
6769
6845
  const names = group.keys;
6770
6846
  const namesRef = useRef(names);
6771
6847
  namesRef.current = names;
6772
6848
  const namesKey = names.join("\0");
6773
6849
  const selector = useMemo(
6774
- () => ({ actuators: [...names] }),
6850
+ () => ({ actuators: names }),
6775
6851
  // eslint-disable-next-line react-hooks/exhaustive-deps
6776
6852
  [namesKey]
6777
6853
  );
@@ -6791,15 +6867,15 @@ function useControlGroup(group, options = {}) {
6791
6867
  return id;
6792
6868
  });
6793
6869
  }, [mjModelRef, status, namesKey]);
6794
- const set = useCallback(
6870
+ const patch = useCallback(
6795
6871
  (values, setOptions = {}) => {
6796
6872
  const data = mjDataRef.current;
6797
6873
  if (!data) return false;
6798
6874
  if (!setOptions.force && !canWrite()) return false;
6799
6875
  const groupNames = namesRef.current;
6800
6876
  const indices = indicesRef.current;
6801
- for (let i = 0; i < groupNames.length; i += 1) {
6802
- const value = values[groupNames[i]];
6877
+ for (const [i, name] of groupNames.entries()) {
6878
+ const value = values[name];
6803
6879
  if (value === void 0) continue;
6804
6880
  const adr = indices[i];
6805
6881
  if (adr >= 0) data.ctrl[adr] = value;
@@ -6808,20 +6884,87 @@ function useControlGroup(group, options = {}) {
6808
6884
  },
6809
6885
  [canWrite, mjDataRef]
6810
6886
  );
6887
+ const write = useCallback(
6888
+ (values, setOptions = {}) => {
6889
+ const data = mjDataRef.current;
6890
+ if (!data) return false;
6891
+ if (!setOptions.force && !canWrite()) return false;
6892
+ const groupNames = namesRef.current;
6893
+ const indices = indicesRef.current;
6894
+ for (let i = 0; i < Math.min(groupNames.length, values.length); i += 1) {
6895
+ const adr = indices[i];
6896
+ if (adr >= 0) data.ctrl[adr] = values[i];
6897
+ }
6898
+ return true;
6899
+ },
6900
+ [canWrite, mjDataRef]
6901
+ );
6902
+ const set = useCallback(
6903
+ (name, value, setOptions) => patch(singleControlValue(name, value), setOptions),
6904
+ [patch]
6905
+ );
6811
6906
  const read = useCallback(() => {
6812
6907
  const data = mjDataRef.current;
6813
6908
  const groupNames = namesRef.current;
6814
6909
  const indices = indicesRef.current;
6815
6910
  const result = {};
6816
- for (let i = 0; i < groupNames.length; i += 1) {
6911
+ for (const [i, name] of groupNames.entries()) {
6817
6912
  const adr = indices[i];
6818
- result[groupNames[i]] = data && adr >= 0 ? data.ctrl[adr] ?? 0 : 0;
6913
+ result[name] = data && adr >= 0 ? data.ctrl[adr] ?? 0 : 0;
6819
6914
  }
6820
6915
  return result;
6821
6916
  }, [mjDataRef]);
6917
+ const get = useCallback((name) => read()[name], [read]);
6822
6918
  return useMemo(
6823
- () => ({ owner, set, read, canWrite, release }),
6824
- [owner, set, read, canWrite, release]
6919
+ () => ({ owner, set, patch, write, get, read, canWrite, release }),
6920
+ [owner, set, patch, write, get, read, canWrite, release]
6921
+ );
6922
+ }
6923
+ function useControls(definition, options = {}) {
6924
+ const group = useControlGroup(controlGroup(definition.keys), options);
6925
+ const controlsRef = useRef(definition.controls);
6926
+ const aliasesRef = useRef(definition.aliases);
6927
+ controlsRef.current = definition.controls;
6928
+ aliasesRef.current = definition.aliases;
6929
+ const set = useCallback(
6930
+ (name, value, setOptions) => group.set(controlsRef.current[name], value, setOptions),
6931
+ [group]
6932
+ );
6933
+ const patch = useCallback(
6934
+ (values, setOptions) => {
6935
+ const next = {};
6936
+ for (const alias of aliasesRef.current) {
6937
+ const value = values[alias];
6938
+ if (value !== void 0) next[controlsRef.current[alias]] = value;
6939
+ }
6940
+ return group.patch(next, setOptions);
6941
+ },
6942
+ [group]
6943
+ );
6944
+ const get = useCallback(
6945
+ (name) => group.get(controlsRef.current[name]),
6946
+ [group]
6947
+ );
6948
+ const read = useCallback(() => {
6949
+ const values = group.read();
6950
+ const result = {};
6951
+ for (const alias of aliasesRef.current) {
6952
+ result[alias] = values[controlsRef.current[alias]] ?? 0;
6953
+ }
6954
+ return result;
6955
+ }, [group]);
6956
+ return useMemo(
6957
+ () => ({
6958
+ owner: group.owner,
6959
+ set,
6960
+ patch,
6961
+ write: group.write,
6962
+ get,
6963
+ read,
6964
+ canWrite: group.canWrite,
6965
+ release: group.release
6966
+ }),
6967
+ [group, set, patch, get, read]
6825
6968
  );
6826
6969
  }
6827
6970
  var geomNameCacheByModel2 = /* @__PURE__ */ new WeakMap();
@@ -8846,6 +8989,6 @@ function useCameraAnimation() {
8846
8989
  * useCameraAnimation — composable camera animation hook.
8847
8990
  */
8848
8991
 
8849
- export { Body, CameraView, ContactListener, ContactMarkers, Debug, DragInteraction, FlexRenderer, GenericIK, IkGizmo, InstancedGeomRenderer, MountedCameraFrameSequenceManifestStatus, MountedCameraFrameSequenceReadinessStatus, MountedCameraFrameSourceSuggestionMatch, MujocoCanvas, MujocoPhysics, MujocoProvider, MujocoSimProvider, SceneLights, SplatCollisionProxyPreview, TendonRenderer, TrajectoryPlayer, applyPolicyActionToControls, bodyPositionField, buildObservation, canFetchSplatCollisionProxyXml, captureFrame, captureFrameBlob, capturePolicyCameraFrames, capturePolicyCameraFramesFromMountedStreams, clampPolicyActionValue, controlGroup, createContiguousControlGroup, createController, createControllerHook, createMountedCameraFrameSequenceManifest, createMountedCameraFrameSequencePlan, createMountedCameraFrameSequencePlanFromApi, createMountedCameraFrameSequenceReadiness, createMountedCameraFrameSourceSuggestions, createNamedObservationBuilder, createPolicyCameraFrameCapturePlan, createPolicyCameraFrameCapturePlanFromApi, ctrlField, fetchSplatCollisionProxyXml, findActuatorByName, findBodyByName, findGeomByName, findJointByName, findKeyframeByName, findSensorByName, findSiteByName, findTendonByName, geomPositionField, getActuatedJoints, getCameraFrameCaptureSourceTarget, getControlMap, getMountedCameraFrameCaptureSource, getName, imagePointToNdc, isMountedCameraFrameCaptureSource, loadScene, parseSplatCollisionProxyGeoms, projectImagePointTo3D, qposField, qvelField, readNamedObservation, recordMountedCameraFrameSequence, resolveControlGroup, resolveMountedCameraFrameSource, sitePositionField, useActuators, useAfterPhysicsStep, useBeforePhysicsStep, useBodyMeshes, useBodyPose, useBodyState, useCameraAnimation, useCameraFrameCapture, useCameraSequenceRecorder, useCameraStream, useCameraViewport, useContactEvents, useContactHistory, useContacts, useControlGroup, useControlWriter, useCtrl, useCtrlNoise, useFrameCapture, useGamepad, useGeomPose, useGravityCompensation, useIkController, useJointState, useKeyboardIkTarget, useKeyboardTeleop, useMountedCameraSequenceRecorder, useMujoco, useMujocoWasm, useNamedObservation, useObservation, usePolicy, usePolicyCameraFrames, usePolicyCameraFramesFromMountedStreams, usePolicyCameraTensors, usePolicyCameraTensorsFromMountedStreams, useRemotePolicy, useSceneLights, useSelectionHighlight, useSensor, useSensors, useSitePose, useSitePosition, useSplatCollisionProxyGeoms, useTrajectoryPlayer, useTrajectoryRecorder, useVideoRecorder };
8992
+ export { Body, CameraView, ContactListener, ContactMarkers, Debug, DragInteraction, FlexRenderer, GenericIK, IkGizmo, InstancedGeomRenderer, MountedCameraFrameSequenceManifestStatus, MountedCameraFrameSequenceReadinessStatus, MountedCameraFrameSourceSuggestionMatch, MujocoCanvas, MujocoPhysics, MujocoProvider, MujocoSimProvider, SceneLights, SplatCollisionProxyPreview, TendonRenderer, TrajectoryPlayer, applyPolicyActionToControls, bodyPositionField, buildObservation, canFetchSplatCollisionProxyXml, captureFrame, captureFrameBlob, capturePolicyCameraFrames, capturePolicyCameraFramesFromMountedStreams, clampPolicyActionValue, controlGroup, createContiguousControlGroup, createController, createControllerHook, createMountedCameraFrameSequenceManifest, createMountedCameraFrameSequencePlan, createMountedCameraFrameSequencePlanFromApi, createMountedCameraFrameSequenceReadiness, createMountedCameraFrameSourceSuggestions, createNamedObservationBuilder, createPolicyCameraFrameCapturePlan, createPolicyCameraFrameCapturePlanFromApi, ctrlField, defineControls, fetchSplatCollisionProxyXml, findActuatorByName, findBodyByName, findGeomByName, findJointByName, findKeyframeByName, findSensorByName, findSiteByName, findTendonByName, geomPositionField, getActuatedJoints, getCameraFrameCaptureSourceTarget, getControlMap, getMountedCameraFrameCaptureSource, getName, imagePointToNdc, isMountedCameraFrameCaptureSource, loadScene, parseSplatCollisionProxyGeoms, projectImagePointTo3D, qposField, qvelField, readNamedObservation, recordMountedCameraFrameSequence, resolveControlGroup, resolveMountedCameraFrameSource, sitePositionField, useActuators, useAfterPhysicsStep, useBeforePhysicsStep, useBodyMeshes, useBodyPose, useBodyState, useCameraAnimation, useCameraFrameCapture, useCameraSequenceRecorder, useCameraStream, useCameraViewport, useContactEvents, useContactHistory, useContacts, useControlGroup, useControlWriter, useControls, useCtrl, useCtrlNoise, useFrameCapture, useGamepad, useGeomPose, useGravityCompensation, useIkController, useJointState, useKeyboardIkTarget, useKeyboardTeleop, useMountedCameraSequenceRecorder, useMujoco, useMujocoWasm, useNamedObservation, useObservation, usePolicy, usePolicyCameraFrames, usePolicyCameraFramesFromMountedStreams, usePolicyCameraTensors, usePolicyCameraTensorsFromMountedStreams, useRemotePolicy, useSceneLights, useSelectionHighlight, useSensor, useSensors, useSitePose, useSitePosition, useSplatCollisionProxyGeoms, useTrajectoryPlayer, useTrajectoryRecorder, useVideoRecorder };
8850
8993
  //# sourceMappingURL=index.js.map
8851
8994
  //# sourceMappingURL=index.js.map