@liveroom-tech/react-immersive 1.0.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.
@@ -0,0 +1,672 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ComponentProps, ReactNode, MutableRefObject } from 'react';
3
+ import { CameraControls } from '@react-three/drei';
4
+ import { Object3D, WebGLRenderer, Scene, Camera } from 'three';
5
+ import { XRStore } from '@react-three/xr';
6
+ import { Canvas } from '@react-three/fiber';
7
+ import { PresetsType } from '@react-three/drei/helpers/environment-assets';
8
+
9
+ declare const LIGHT_TYPES: readonly ["none", "directional", "point", "hemisphere"];
10
+ type SceneLightType = (typeof LIGHT_TYPES)[number];
11
+ type SceneLight = {
12
+ id: string;
13
+ type: SceneLightType;
14
+ color: string;
15
+ intensity: number;
16
+ position: [number, number, number];
17
+ attachedToCamera: boolean;
18
+ castShadow: boolean;
19
+ shadowBias: number;
20
+ visible: boolean;
21
+ };
22
+ type SceneLightingConfig = {
23
+ ambient: {
24
+ intensity: number;
25
+ color: string;
26
+ };
27
+ lights: SceneLight[];
28
+ };
29
+ type SceneModelConfig = {
30
+ rotation: [number, number, number];
31
+ showAdvancedRotation: boolean;
32
+ renderer: "pbr" | "matcap";
33
+ shading: "lit" | "unlit" | "normals";
34
+ };
35
+ type SceneCameraConfig = {
36
+ fieldOfView: number;
37
+ showAdvancedSettings: boolean;
38
+ };
39
+ type SceneShadowConfig = {
40
+ enabled: boolean;
41
+ mapSize: number;
42
+ bias: number;
43
+ normalBias: number;
44
+ radius: number;
45
+ };
46
+ declare const ENVIRONMENT_PRESETS: readonly ["apartment", "city", "dawn", "forest", "lobby", "night", "park", "studio", "sunset", "warehouse"];
47
+ type EnvironmentPreset = (typeof ENVIRONMENT_PRESETS)[number];
48
+ type SceneEnvironmentConfig = {
49
+ source: "preset" | "custom";
50
+ preset: EnvironmentPreset;
51
+ customEnvironmentUrl: string;
52
+ intensity: number;
53
+ rotation: number;
54
+ shadowLight: {
55
+ enabled: boolean;
56
+ intensity: number;
57
+ bias: number;
58
+ };
59
+ };
60
+ type SceneWireframeConfig = {
61
+ enabled: boolean;
62
+ color: string;
63
+ opacity: number;
64
+ };
65
+ type SceneBackgroundConfig = {
66
+ enabled: boolean;
67
+ type: "environment" | "image" | "color";
68
+ color: string;
69
+ imageUrl: string;
70
+ };
71
+ type SceneGroundShadowConfig = {
72
+ enabled: boolean;
73
+ mode: "shadowCatcher" | "bakedAO";
74
+ intensity: number;
75
+ borderFade: number;
76
+ height: number;
77
+ size: number;
78
+ };
79
+ declare const ANIMATION_LOOP_MODES: readonly ["repeat", "once"];
80
+ type AnimationLoopMode = (typeof ANIMATION_LOOP_MODES)[number];
81
+ type SceneAnimationClipConfig = {
82
+ sourceName: string;
83
+ displayName: string;
84
+ hidden: boolean;
85
+ loopMode: AnimationLoopMode;
86
+ speed: number;
87
+ };
88
+ type SceneAnimationConfig = {
89
+ clips: SceneAnimationClipConfig[];
90
+ autoplayClip: string | null;
91
+ };
92
+ declare const GLITCH_MODES: readonly ["sporadic", "constantMild", "constantWild"];
93
+ type GlitchModeName = (typeof GLITCH_MODES)[number];
94
+ declare const RAMP_TYPES: readonly ["linear", "radial", "mirroredLinear"];
95
+ type RampTypeName = (typeof RAMP_TYPES)[number];
96
+ declare const KERNEL_SIZE_NAMES: readonly ["verySmall", "small", "medium", "large", "veryLarge", "huge"];
97
+ type KernelSizeName = (typeof KERNEL_SIZE_NAMES)[number];
98
+ type ScenePostProcessingConfig = {
99
+ autofocus: {
100
+ enabled: boolean;
101
+ focusDistance: number;
102
+ focusRange: number;
103
+ focalLength: number;
104
+ bokehScale: number;
105
+ target: [number, number, number];
106
+ mouse: boolean;
107
+ debug: number;
108
+ manual: boolean;
109
+ smoothTime: number;
110
+ };
111
+ toneMapping: {
112
+ enabled: boolean;
113
+ mode: "linear" | "reinhard" | "aces";
114
+ exposure: number;
115
+ resolution: number;
116
+ whitePoint: number;
117
+ middleGrey: number;
118
+ minLuminance: number;
119
+ averageLuminance: number;
120
+ adaptationRate: number;
121
+ };
122
+ brightnessContrast: {
123
+ enabled: boolean;
124
+ brightness: number;
125
+ contrast: number;
126
+ };
127
+ hueSaturation: {
128
+ enabled: boolean;
129
+ hue: number;
130
+ saturation: number;
131
+ };
132
+ colorAverage: {
133
+ enabled: boolean;
134
+ };
135
+ dotScreen: {
136
+ enabled: boolean;
137
+ angle: number;
138
+ scale: number;
139
+ };
140
+ glitch: {
141
+ enabled: boolean;
142
+ mode: GlitchModeName;
143
+ delay: [number, number];
144
+ duration: [number, number];
145
+ strength: [number, number];
146
+ chromaticAberrationOffset: [number, number];
147
+ columns: number;
148
+ ratio: number;
149
+ };
150
+ ssao: {
151
+ enabled: boolean;
152
+ samples: number;
153
+ rings: number;
154
+ intensity: number;
155
+ radius: number;
156
+ bias: number;
157
+ luminanceInfluence: number;
158
+ fade: number;
159
+ minRadiusScale: number;
160
+ worldDistanceThreshold: number;
161
+ worldDistanceFalloff: number;
162
+ worldProximityThreshold: number;
163
+ worldProximityFalloff: number;
164
+ };
165
+ bloom: {
166
+ enabled: boolean;
167
+ intensity: number;
168
+ luminanceThreshold: number;
169
+ luminanceSmoothing: number;
170
+ mipmapBlur: boolean;
171
+ radius: number;
172
+ levels: number;
173
+ };
174
+ godRays: {
175
+ enabled: boolean;
176
+ sunPosition: [number, number, number];
177
+ samples: number;
178
+ density: number;
179
+ decay: number;
180
+ weight: number;
181
+ exposure: number;
182
+ clampMax: number;
183
+ blur: boolean;
184
+ kernelSize: KernelSizeName;
185
+ };
186
+ grid: {
187
+ enabled: boolean;
188
+ scale: number;
189
+ lineWidth: number;
190
+ };
191
+ noise: {
192
+ enabled: boolean;
193
+ opacity: number;
194
+ premultiply: boolean;
195
+ };
196
+ depthOfField: {
197
+ enabled: boolean;
198
+ focusDistance: number;
199
+ focusRange: number;
200
+ focalLength: number;
201
+ bokehScale: number;
202
+ };
203
+ chromaticAberration: {
204
+ enabled: boolean;
205
+ offsetX: number;
206
+ offsetY: number;
207
+ radialModulation: boolean;
208
+ modulationOffset: number;
209
+ };
210
+ lensflare: {
211
+ enabled: boolean;
212
+ lensPosition: [number, number, number];
213
+ smoothTime: number;
214
+ glareSize: number;
215
+ flareSize: number;
216
+ flareSpeed: number;
217
+ flareShape: number;
218
+ animated: boolean;
219
+ anamorphic: boolean;
220
+ colorGain: string;
221
+ haloScale: number;
222
+ secondaryGhosts: boolean;
223
+ aditionalStreaks: boolean;
224
+ ghostScale: number;
225
+ opacity: number;
226
+ starBurst: boolean;
227
+ };
228
+ vignette: {
229
+ enabled: boolean;
230
+ offset: number;
231
+ darkness: number;
232
+ eskil: boolean;
233
+ };
234
+ smaa: {
235
+ enabled: boolean;
236
+ };
237
+ sepia: {
238
+ enabled: boolean;
239
+ intensity: number;
240
+ };
241
+ scanline: {
242
+ enabled: boolean;
243
+ density: number;
244
+ };
245
+ pixelation: {
246
+ enabled: boolean;
247
+ granularity: number;
248
+ };
249
+ outline: {
250
+ enabled: boolean;
251
+ selectionLayer: number;
252
+ edgeStrength: number;
253
+ pulseSpeed: number;
254
+ visibleEdgeColor: string;
255
+ hiddenEdgeColor: string;
256
+ kernelSize: KernelSizeName;
257
+ blur: boolean;
258
+ xRay: boolean;
259
+ };
260
+ selectiveBloom: {
261
+ enabled: boolean;
262
+ selectionLayer: number;
263
+ intensity: number;
264
+ luminanceThreshold: number;
265
+ luminanceSmoothing: number;
266
+ kernelSize: KernelSizeName;
267
+ mipmapBlur: boolean;
268
+ inverted: boolean;
269
+ ignoreBackground: boolean;
270
+ };
271
+ ramp: {
272
+ enabled: boolean;
273
+ rampType: RampTypeName;
274
+ rampStart: [number, number];
275
+ rampEnd: [number, number];
276
+ startColor: string;
277
+ endColor: string;
278
+ rampBias: number;
279
+ rampGain: number;
280
+ rampMask: boolean;
281
+ rampInvert: boolean;
282
+ };
283
+ };
284
+ type SceneAnnotationMarker = {
285
+ id: number;
286
+ worldPosition: [number, number, number];
287
+ localPosition: [number, number, number];
288
+ worldNormal?: [number, number, number];
289
+ anchorNodeName?: string;
290
+ anchorLocalPosition?: [number, number, number];
291
+ title: string;
292
+ description: string;
293
+ };
294
+ type SceneConfig = {
295
+ model: SceneModelConfig;
296
+ camera: SceneCameraConfig;
297
+ lighting: SceneLightingConfig;
298
+ wireframe: SceneWireframeConfig;
299
+ shadows: SceneShadowConfig;
300
+ environment: SceneEnvironmentConfig;
301
+ background: SceneBackgroundConfig;
302
+ groundShadows: SceneGroundShadowConfig;
303
+ postProcessing: ScenePostProcessingConfig;
304
+ animations: SceneAnimationConfig;
305
+ annotations: SceneAnnotationMarker[];
306
+ };
307
+
308
+ type CanvasCamera = ComponentProps<typeof Canvas>["camera"];
309
+
310
+ type RendererCapture = {
311
+ gl: WebGLRenderer;
312
+ scene: Scene;
313
+ camera: Camera;
314
+ invalidate: () => void;
315
+ };
316
+ type Props = {
317
+ children: ReactNode;
318
+ camera?: CanvasCamera;
319
+ backgroundColor?: string;
320
+ shadows?: boolean;
321
+ sceneConfig?: SceneConfig;
322
+ selectedObjectRef?: Object3D | null;
323
+ hoveredObjectRef?: Object3D | null;
324
+ highlightOnHover?: boolean;
325
+ renderMode?: "always" | "demand";
326
+ maxDpr?: number;
327
+ xrStore?: XRStore | null;
328
+ rendererCaptureRef?: MutableRefObject<RendererCapture | null>;
329
+ reduceGpuLoad?: boolean;
330
+ };
331
+ declare function Viewer({ children, camera, backgroundColor, shadows, sceneConfig, selectedObjectRef, hoveredObjectRef, highlightOnHover, renderMode, maxDpr, xrStore, rendererCaptureRef, reduceGpuLoad, }: Props): react_jsx_runtime.JSX.Element;
332
+
333
+ type PerformanceProfile = "auto" | "high" | "low";
334
+
335
+ type MouseControllerPosition = 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right' | 'center' | 'center-bottom' | 'center-top';
336
+
337
+ type ObjectBindingAction = {
338
+ id: "change-color" | "apply-texture" | "toggle-visibility" | string;
339
+ label: string;
340
+ type: "command";
341
+ };
342
+ type ObjectBindingType = "body" | "other" | "glass" | "windshield" | "rear-windshield" | "window" | "sunroof" | "wheel" | "rim" | "tire" | "brake-caliper" | "brake-disc" | "suspension" | "spring" | "shock-absorber" | "axle" | "control-arm" | "interior" | "seat" | "headrest" | "seatbelt" | "dashboard" | "steering-wheel" | "gear-shift" | "center-console" | "armrest" | "door-panel" | "carpet" | "headliner" | "sun-visor" | "pedal" | "instrument-cluster" | "infotainment" | "glove-box" | "engine" | "gearbox" | "radiator" | "battery" | "fuel-tank" | "air-filter" | "intercooler" | "alternator" | "turbo" | "light" | "headlight" | "taillight" | "fog-light" | "indicator" | "daytime-running-light" | "interior-light" | "ambient-light" | "floor" | "floor-tile" | "floor-board" | "floor-mat" | "ceiling" | "ceiling-tile" | "wall" | "wall-tile" | "wall-panel" | "wall-trim" | "baseboard" | "crown-molding" | "column" | "pillar" | "beam" | "arch" | "stairs" | "step" | "railing" | "balustrade" | "window-frame" | "window-sill" | "blind" | "curtain" | "shutter" | "door" | "door-frame" | "door-knob" | "furniture" | "sofa" | "armchair" | "ottoman" | "bed" | "headboard" | "mattress" | "nightstand" | "dresser" | "wardrobe" | "closet" | "shelf" | "bookcase" | "desk" | "office-chair" | "dining-table" | "dining-chair" | "bar-stool" | "bench" | "cabinet" | "sideboard" | "coffee-table" | "side-table" | "tv-stand" | "kitchen-island" | "countertop" | "sink" | "bathtub" | "shower" | "toilet" | "vanity" | "decor" | "rug" | "cushion" | "throw" | "curtain-rod" | "artwork" | "mirror" | "vase" | "plant" | "pot" | "candle" | "frame" | "sculpture" | "clock" | "lamp" | "floor-lamp" | "table-lamp" | "pendant-light" | "chandelier" | "sconce" | "ceiling-fan" | "electronics" | "tv" | "monitor" | "speaker" | "soundbar" | "projector" | "remote" | "console" | "router" | "smart-hub" | "thermostat" | "appliance" | "refrigerator" | "oven" | "microwave" | "dishwasher" | "washing-machine" | "dryer" | "air-conditioner" | "heater" | "ventilation" | "root" | "bone" | "joint" | "socket" | "pivot" | "head" | "face" | "eye" | "eyelid" | "eyebrow" | "mouth" | "teeth" | "tongue" | "ear" | "nose" | "hair" | "beard" | "neck" | "torso" | "chest" | "abdomen" | "back" | "shoulder" | "upper-arm" | "forearm" | "hand" | "finger" | "thumb" | "hip" | "thigh" | "shin" | "foot" | "toe" | "tail" | "wing" | "tentacle" | "clothing" | "hat" | "helmet" | "visor" | "mask" | "goggles" | "glasses" | "jacket" | "shirt" | "pants" | "skirt" | "shoes" | "boots" | "gloves" | "belt" | "watch" | "bag" | "backpack" | "jewelry" | "necklace" | "ring" | "armor" | "chest-plate" | "pauldron" | "gauntlet" | "greave" | "shield" | "weapon" | "blade" | "edge" | "tip" | "guard" | "grip" | "pommel" | "barrel" | "stock" | "scope" | "trigger" | "magazine" | "muzzle" | "gear" | "piston" | "lever" | "valve" | "pump" | "motor" | "rotor" | "blade-prop" | "nozzle" | "pipe" | "tube" | "cable" | "wire" | "connector" | "panel" | "hatch" | "vent" | "antenna" | "sensor" | "camera" | "screen" | "dial" | "button" | "knob" | "switch" | "gauge" | "terrain" | "ground" | "rock" | "cliff" | "water" | "ocean" | "river" | "lake" | "wave" | "foam" | "sky" | "cloud" | "sun" | "moon" | "star" | "fog" | "foliage" | "tree" | "branch" | "leaf" | "grass" | "bush" | "flower" | "soil" | "sand" | "snow" | "ice" | "facade" | "foundation" | "roof-structure" | "chimney" | "balcony" | "porch" | "pathway" | "fence" | "gate" | "wall-exterior";
343
+ type ObjectBindingStatus = "normal" | "hidden" | "selected" | "disabled";
344
+ type ObjectBindingTextureSlot = {
345
+ path: string;
346
+ };
347
+ declare const MATERIAL_SIDES: readonly ["front", "back", "double"];
348
+ type ObjectBindingMaterialSide = (typeof MATERIAL_SIDES)[number];
349
+ declare const MATERIAL_BLENDING_MODES: readonly ["normal", "additive"];
350
+ type ObjectBindingMaterialBlendingMode = (typeof MATERIAL_BLENDING_MODES)[number];
351
+ type ObjectBindingMaterial = {
352
+ texture?: ObjectBindingTextureSlot;
353
+ baseColor?: string;
354
+ metalness?: number;
355
+ metalnessMap?: ObjectBindingTextureSlot;
356
+ roughness?: number;
357
+ roughnessMap?: ObjectBindingTextureSlot;
358
+ emissive?: string;
359
+ emissiveIntensity?: number;
360
+ emissiveMap?: ObjectBindingTextureSlot;
361
+ opacity?: number;
362
+ alphaMap?: ObjectBindingTextureSlot;
363
+ alphaTest?: number;
364
+ alphaHash?: boolean;
365
+ dithering?: boolean;
366
+ blendingMode?: ObjectBindingMaterialBlendingMode;
367
+ side?: ObjectBindingMaterialSide;
368
+ normalMap?: ObjectBindingTextureSlot;
369
+ normalScale?: number;
370
+ flipNormalY?: boolean;
371
+ bumpMap?: ObjectBindingTextureSlot;
372
+ bumpScale?: number;
373
+ aoMap?: ObjectBindingTextureSlot;
374
+ aoMapIntensity?: number;
375
+ displacementMap?: ObjectBindingTextureSlot;
376
+ displacementScale?: number;
377
+ displacementBias?: number;
378
+ clearcoat?: number;
379
+ clearcoatMap?: ObjectBindingTextureSlot;
380
+ clearcoatRoughness?: number;
381
+ clearcoatRoughnessMap?: ObjectBindingTextureSlot;
382
+ clearcoatNormalMap?: ObjectBindingTextureSlot;
383
+ clearcoatNormalScale?: number;
384
+ flipClearcoatNormalY?: boolean;
385
+ sheen?: number;
386
+ sheenColor?: string;
387
+ sheenColorMap?: ObjectBindingTextureSlot;
388
+ sheenRoughness?: number;
389
+ sheenRoughnessMap?: ObjectBindingTextureSlot;
390
+ anisotropy?: number;
391
+ anisotropyRotation?: number;
392
+ anisotropyMap?: ObjectBindingTextureSlot;
393
+ transmission?: number;
394
+ transmissionMap?: ObjectBindingTextureSlot;
395
+ thickness?: number;
396
+ thicknessMap?: ObjectBindingTextureSlot;
397
+ attenuationColor?: string;
398
+ attenuationDistance?: number;
399
+ reflectivity?: number;
400
+ specularIntensity?: number;
401
+ specularIntensityMap?: ObjectBindingTextureSlot;
402
+ specularColor?: string;
403
+ specularColorMap?: ObjectBindingTextureSlot;
404
+ };
405
+ type ObjectBindingCameraState = {
406
+ position?: [number, number, number];
407
+ target?: [number, number, number];
408
+ fov?: number;
409
+ zoom?: number;
410
+ };
411
+ type ObjectBindingStyle = {
412
+ material?: ObjectBindingMaterial;
413
+ };
414
+ type ObjectBinding = {
415
+ id: string;
416
+ type: ObjectBindingType;
417
+ modelObjectId: string;
418
+ label?: string;
419
+ status?: ObjectBindingStatus;
420
+ visible?: boolean;
421
+ selectable?: boolean;
422
+ hoverable?: boolean;
423
+ style?: ObjectBindingStyle;
424
+ actions?: ObjectBindingAction[];
425
+ metrics?: Record<string, number>;
426
+ metadata?: Record<string, unknown>;
427
+ cameraState?: ObjectBindingCameraState;
428
+ };
429
+ type ObjectActionEvent = {
430
+ objectId: string;
431
+ action: ObjectBindingAction;
432
+ binding?: ObjectBinding;
433
+ screenX?: number;
434
+ screenY?: number;
435
+ };
436
+
437
+ type CaptureImageOptions = {
438
+ width?: number;
439
+ height?: number;
440
+ transparent?: boolean;
441
+ };
442
+
443
+ type ViewerCameraState = {
444
+ position: [number, number, number];
445
+ target: [number, number, number];
446
+ fov: number | null;
447
+ zoom: number;
448
+ };
449
+ type HomeCameraState = {
450
+ position: [number, number, number];
451
+ target: [number, number, number];
452
+ };
453
+ type ViewerReadyState = {
454
+ controls: CameraControls;
455
+ scene: Object3D | null;
456
+ objectBindings: Record<string, ObjectBinding>;
457
+ nodeRefs: Record<string, Object3D>;
458
+ homeCameraState: HomeCameraState | null;
459
+ captureImage: (options?: CaptureImageOptions) => Promise<string>;
460
+ };
461
+ type ViewerCameraProps = {
462
+ cameraState: ViewerCameraState | null;
463
+ resetView: () => Promise<boolean>;
464
+ focusObject: (objectId: string) => Promise<boolean>;
465
+ fitScene: () => Promise<boolean>;
466
+ setCameraTarget: (target: [number, number, number], enableTransition?: boolean) => Promise<boolean>;
467
+ setCameraState: (state: ViewerCameraState, enableTransition?: boolean) => Promise<boolean>;
468
+ handleCameraChange: (camera: Camera, controls: CameraControls) => void;
469
+ handleViewerReady: (viewer: ViewerReadyState) => void;
470
+ };
471
+ declare function useViewerCamera(): ViewerCameraProps;
472
+
473
+ type AnimationClipInfo = {
474
+ sourceName: string;
475
+ duration: number;
476
+ };
477
+ type AnimationPlaybackState = {
478
+ currentClip: string | null;
479
+ isPlaying: boolean;
480
+ speed: number;
481
+ time: number;
482
+ duration: number;
483
+ };
484
+ type AnimationControls = {
485
+ clips: string[];
486
+ clipDetails?: AnimationClipInfo[];
487
+ play: (clipName: string) => void;
488
+ pause: () => void;
489
+ stop: () => void;
490
+ setSpeed: (speed: number) => void;
491
+ seek?: (time: number) => void;
492
+ getState?: () => AnimationPlaybackState;
493
+ subscribe?: (listener: (state: AnimationPlaybackState) => void) => () => void;
494
+ };
495
+ type ViewerAnimationsProps = {
496
+ clips: string[];
497
+ clipDetails: AnimationClipInfo[];
498
+ currentClip: string | null;
499
+ isPlaying: boolean;
500
+ speed: number;
501
+ time: number;
502
+ duration: number;
503
+ play: (clipName: string) => void;
504
+ pause: () => void;
505
+ stop: () => void;
506
+ setSpeed: (speed: number) => void;
507
+ seek: (time: number) => void;
508
+ handleAnimationsReady: (controls: AnimationControls) => void;
509
+ };
510
+ declare function useViewerAnimations(): ViewerAnimationsProps;
511
+
512
+ type ViewerCamera = React.ComponentProps<typeof Viewer>["camera"];
513
+ type AnnotationMarker = SceneAnnotationMarker & {
514
+ markerId?: string;
515
+ };
516
+ type CustomObjectBindingDataPanelProps = {
517
+ isOpen: boolean;
518
+ selectedObject: ObjectBinding | null;
519
+ currentAction: ObjectActionEvent | null;
520
+ onClose: () => void;
521
+ onAction: (event: ObjectActionEvent) => void;
522
+ };
523
+ type CustomSceneObjectsPanelProps = {
524
+ objectBindings: Record<string, ObjectBinding>;
525
+ onAction?: (event: ObjectActionEvent) => void;
526
+ onFocus?: (binding: ObjectBinding) => void;
527
+ onHover?: (binding: ObjectBinding | null) => void;
528
+ };
529
+ type ModelViewerProps = {
530
+ modelUrl: string;
531
+ licenseKey: string;
532
+ objectBindings: Record<string, ObjectBinding>;
533
+ selectedObject?: ObjectBinding | null;
534
+ panelHoveredObject?: ObjectBinding | null;
535
+ onObjectBindingsChange?: (next: Record<string, ObjectBinding>) => void;
536
+ onObjectSelect?: (binding: ObjectBinding | null) => void;
537
+ onObjectHover?: (binding: ObjectBinding | null) => void;
538
+ onModelLoaded?: (scene: Object3D) => void;
539
+ onLoadError?: (error: unknown) => void;
540
+ onAction?: (event: ObjectActionEvent) => void;
541
+ onHiddenObjectsChange?: (next: Record<string, boolean>) => void;
542
+ onCameraChange?: (camera: Camera, controls: CameraControls) => void;
543
+ onViewerReady?: (viewer: ViewerReadyState) => void;
544
+ onTextureUpload?: (file: File, objectId: string) => Promise<string>;
545
+ onAnimationsReady?: (controls: AnimationControls) => void;
546
+ onAnnotationsChange?: (annotations: AnnotationMarker[]) => void;
547
+ activeAnnotation?: AnnotationMarker | null;
548
+ onActiveAnnotationChange?: (annotation: AnnotationMarker | null) => void;
549
+ lights?: ReactNode;
550
+ camera?: ViewerCamera;
551
+ backgroundColor?: string;
552
+ shadows?: boolean;
553
+ showObjectBindingDataPanel?: boolean;
554
+ customObjectBindingDataPanel?: (props: CustomObjectBindingDataPanelProps) => ReactNode;
555
+ customSceneObjectsPanel?: (props: CustomSceneObjectsPanelProps) => ReactNode;
556
+ showSceneObjectsPanel?: boolean;
557
+ showDownloadButton?: boolean;
558
+ downloadFilename?: string;
559
+ showResetButton?: boolean;
560
+ showDownloadButtons?: boolean;
561
+ showLoadingOverlay?: boolean;
562
+ showMouseController?: boolean;
563
+ mouseControllerPosition?: MouseControllerPosition;
564
+ mouseControllerOpacity?: number;
565
+ moveSensitivity?: number;
566
+ zoomSensitivity?: number;
567
+ sceneConfig?: SceneConfig;
568
+ disableZoom?: boolean;
569
+ zoomOnSelected?: boolean;
570
+ highlightOnHover?: boolean;
571
+ onAutoFit?: () => Promise<boolean>;
572
+ refitOnResize?: boolean;
573
+ renderMode?: "always" | "demand";
574
+ maxDpr?: number;
575
+ performanceProfile?: PerformanceProfile;
576
+ dracoDecoderPath?: string | false;
577
+ ktx2TranscoderPath?: string | false;
578
+ meshopt?: boolean;
579
+ showMeasureTools?: boolean;
580
+ measurementUnit?: string;
581
+ enableXR?: boolean;
582
+ usdzUrl?: string;
583
+ showAnnotationNavigation?: boolean;
584
+ };
585
+ declare function ModelViewer({ modelUrl, licenseKey, objectBindings, selectedObject, panelHoveredObject, onObjectBindingsChange, onObjectSelect, onObjectHover, onModelLoaded, onLoadError, onAction, onHiddenObjectsChange, onCameraChange, onViewerReady, onTextureUpload, onAnimationsReady, onAnnotationsChange, activeAnnotation: controlledActiveAnnotation, onActiveAnnotationChange, lights, camera, backgroundColor, shadows, showObjectBindingDataPanel, customObjectBindingDataPanel, customSceneObjectsPanel, showSceneObjectsPanel, showDownloadButton, downloadFilename, showResetButton, showDownloadButtons, showLoadingOverlay, showMouseController, mouseControllerPosition, mouseControllerOpacity, moveSensitivity, zoomSensitivity, sceneConfig, disableZoom, zoomOnSelected, highlightOnHover, onAutoFit, refitOnResize, renderMode, maxDpr, performanceProfile, dracoDecoderPath, ktx2TranscoderPath, meshopt, showMeasureTools, measurementUnit, enableXR, usdzUrl, showAnnotationNavigation, }: ModelViewerProps): react_jsx_runtime.JSX.Element;
586
+
587
+ declare function BindingBuilder({ licenseKey }: {
588
+ licenseKey: string;
589
+ }): react_jsx_runtime.JSX.Element;
590
+
591
+ type SimpleModelViewerProps = {
592
+ modelUrl: string;
593
+ backgroundColor?: string;
594
+ showSceneObjectsPanel?: boolean;
595
+ showSceneSettingsPanel?: boolean;
596
+ enableModelUpload?: boolean;
597
+ zoomOnSelected?: boolean;
598
+ highlightOnHover?: boolean;
599
+ showLoadingOverlay?: boolean;
600
+ refitOnResize?: boolean;
601
+ backgroundEnabled?: boolean;
602
+ autoRotate?: boolean;
603
+ envPreset?: PresetsType;
604
+ exposure?: number;
605
+ ambientIntensity?: number;
606
+ ambientColor?: string;
607
+ directionalIntensity?: number;
608
+ directionalColor?: string;
609
+ onModelLoaded?: (scene: Object3D) => void;
610
+ onLoadError?: (error: unknown) => void;
611
+ };
612
+ declare function SimpleModelViewer({ modelUrl, backgroundColor, showSceneObjectsPanel, showSceneSettingsPanel, enableModelUpload, zoomOnSelected, highlightOnHover, showLoadingOverlay, refitOnResize, backgroundEnabled, autoRotate, envPreset, exposure, ambientIntensity, ambientColor, directionalIntensity, directionalColor, onModelLoaded, onLoadError, }: SimpleModelViewerProps): react_jsx_runtime.JSX.Element;
613
+
614
+ type ViewerSelectionProps = {
615
+ selectedObjectBinding: ObjectBinding | null;
616
+ setSelectedObjectBinding: (binding: ObjectBinding | null) => void;
617
+ handleObjectSelect: (binding: ObjectBinding | null) => void;
618
+ clearSelection: () => void;
619
+ };
620
+ declare function useViewerSelection(initialSelectedObjectBinding?: ObjectBinding | null): ViewerSelectionProps;
621
+
622
+ declare function useObjectBinding(objectBindings: Record<string, ObjectBinding>, objectId: string | null | undefined): ObjectBinding | null;
623
+
624
+ declare function useObjectBindingIds(objectBindings: Record<string, ObjectBinding>): string[];
625
+
626
+ type HiddenObjectsState = Record<string, boolean>;
627
+ type ObjectVisibilityProps = {
628
+ hiddenObjects: HiddenObjectsState;
629
+ hiddenObjectIds: string[];
630
+ hideObject: (objectId: string) => void;
631
+ showObject: (objectId: string) => void;
632
+ toggleObjectVisibility: (objectId: string) => void;
633
+ isObjectHidden: (objectId: string) => boolean;
634
+ clearHiddenObjects: () => void;
635
+ };
636
+ declare function useObjectVisibility(objectBindings: Record<string, ObjectBinding>, onObjectBindingsChange: (next: Record<string, ObjectBinding>) => void): ObjectVisibilityProps;
637
+
638
+ type ViewerHoverProps = {
639
+ hoveredObjectBinding: ObjectBinding | null;
640
+ handleHoveredObject: (binding: ObjectBinding | null) => void;
641
+ };
642
+ declare function useViewerHover(): ViewerHoverProps;
643
+
644
+ type ViewerModelBounds = {
645
+ min: [number, number, number];
646
+ max: [number, number, number];
647
+ center: [number, number, number];
648
+ size: [number, number, number];
649
+ };
650
+ type ViewerModelProps = {
651
+ isLoading: boolean;
652
+ isReady: boolean;
653
+ error: unknown;
654
+ bounds: ViewerModelBounds | null;
655
+ objectCount: number;
656
+ handleModelLoaded: (scene: Object3D) => void;
657
+ handleLoadError: (error: unknown) => void;
658
+ resetModelState: () => void;
659
+ };
660
+ declare function useViewerModel(): ViewerModelProps;
661
+
662
+ type ViewerActionsOptions = {
663
+ onAction?: (event: ObjectActionEvent) => void;
664
+ onObjectBindingsChange?: (next: Record<string, ObjectBinding>) => void;
665
+ };
666
+ type ViewerActionsProps = {
667
+ getActionsForObject: (objectId: string) => ObjectBindingAction[];
668
+ runAction: (objectId: string, actionId: string) => ObjectActionEvent | null;
669
+ };
670
+ declare function useViewerActions(objectBindings: Record<string, ObjectBinding>, options?: ViewerActionsOptions): ViewerActionsProps;
671
+
672
+ export { type AnimationClipInfo, type AnimationControls, type AnimationLoopMode, type AnimationPlaybackState, BindingBuilder, type CaptureImageOptions, type CustomObjectBindingDataPanelProps, type CustomSceneObjectsPanelProps, type HiddenObjectsState, type HomeCameraState, MATERIAL_BLENDING_MODES, MATERIAL_SIDES, ModelViewer, type ModelViewerProps, type ObjectActionEvent, type ObjectBinding, type ObjectBindingAction, type ObjectBindingMaterial, type ObjectBindingMaterialBlendingMode, type ObjectBindingMaterialSide, type ObjectBindingTextureSlot, type ObjectVisibilityProps, type SceneAnimationClipConfig, type SceneAnimationConfig, type SceneConfig, SimpleModelViewer, type SimpleModelViewerProps, type ViewerActionsOptions, type ViewerActionsProps, type ViewerAnimationsProps, type ViewerCameraProps, type ViewerCameraState, type ViewerModelBounds, type ViewerModelProps, type ViewerReadyState, type ViewerSelectionProps, useObjectBinding, useObjectBindingIds, useObjectVisibility, useViewerActions, useViewerAnimations, useViewerCamera, useViewerHover, useViewerModel, useViewerSelection };