@react-three/drei 8.7.2 → 8.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -249,6 +249,10 @@ PointerLockControls additionally supports a `selector` prop, which enables the b
249
249
 
250
250
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/controls-transformcontrols--transform-controls-story)
251
251
 
252
+ <p>
253
+ <a href="https://codesandbox.io/s/btsbj"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/btsbj/screenshot.png" alt="Tranform controls"/></a>
254
+ </p>
255
+
252
256
  An abstraction around [THREE.TransformControls](https://threejs.org/docs/index.html?q=transfor#examples/en/controls/TransformControls).
253
257
 
254
258
  You can wrap objects which then receive a transform gizmo.
@@ -277,13 +281,13 @@ If you are using other controls (Orbit, Trackball, etc), you will notice how the
277
281
 
278
282
  ![](https://img.shields.io/badge/-Dom only-red)
279
283
 
280
- <p align="center">
281
- <a href="https://codesandbox.io/s/l4klb"><img width="16%" src="https://codesandbox.io/api/v1/sandboxes/l4klb/screenshot.png" alt="Horizontal tiles"/></a>
282
- <a href="https://codesandbox.io/s/4m0d0"><img width="16%" src="https://codesandbox.io/api/v1/sandboxes/4m0d0/screenshot.png" alt="M1 scroll"/></a>
283
- <a href="https://codesandbox.io/s/gsm1y"><img width="16%" src="https://codesandbox.io/api/v1/sandboxes/gsm1y/screenshot.png" alt="useIntersect"/></a>
284
- <a href="https://codesandbox.io/s/x8gvs"><img width="16%" src="https://codesandbox.io/api/v1/sandboxes/x8gvs/screenshot.png" alt="Infinite scroll"/></a>
285
- <a href="https://codesandbox.io/s/yjhzv"><img width="16%" src="https://codesandbox.io/api/v1/sandboxes/yjhzv/screenshot.png" alt="Vertical scroll"/></a>
286
- <a href="https://codesandbox.io/s/4jr4p"><img width="16%" src="https://codesandbox.io/api/v1/sandboxes/4jr4p/screenshot.png" alt="GLTF and useScroll"/></a>
284
+ <p>
285
+ <a href="https://codesandbox.io/s/l4klb"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/l4klb/screenshot.png" alt="Horizontal tiles"/></a>
286
+ <a href="https://codesandbox.io/s/4m0d0"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/4m0d0/screenshot.png" alt="M1 scroll"/></a>
287
+ <a href="https://codesandbox.io/s/gsm1y"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/gsm1y/screenshot.png" alt="useIntersect"/></a>
288
+ <a href="https://codesandbox.io/s/x8gvs"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/x8gvs/screenshot.png" alt="Infinite scroll"/></a>
289
+ <a href="https://codesandbox.io/s/yjhzv"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/yjhzv/screenshot.png" alt="Vertical scroll"/></a>
290
+ <a href="https://codesandbox.io/s/4jr4p"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/4jr4p/screenshot.png" alt="GLTF and useScroll"/></a>
287
291
  </p>
288
292
 
289
293
  Scroll controls create a HTML scroll container in front of the canvas. Everything you drop into the `<Scroll>` component will be affected.
@@ -343,6 +347,11 @@ function Foo(props) {
343
347
 
344
348
  ![](https://img.shields.io/badge/-Dom only-red)
345
349
 
350
+ <p>
351
+ <a href="https://codesandbox.io/s/kheke"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/kheke/screenshot.png" alt="Journey stage 1"/></a>
352
+ <a href="https://codesandbox.io/s/qyz5r"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/qyz5r/screenshot.png" alt="Watch"/></a>
353
+ </p>
354
+
346
355
  Semi-OrbitControls with spring-physics, polar zoom and snap-back, for presentational purposes. These controls do not turn the camera but will spin their contents. They will not suddenly come to rest when they reach limits like OrbitControls do, but rather smoothly anticipate stopping position.
347
356
 
348
357
  ```jsx
@@ -398,6 +407,13 @@ A triangle that fills the screen, ideal for full-screen fragment shader work (ra
398
407
 
399
408
  #### Image
400
409
 
410
+ <p>
411
+ <a href="https://codesandbox.io/s/l4klb"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/l4klb/screenshot.png" alt="Horizontal tiles"/></a>
412
+ <a href="https://codesandbox.io/s/gsm1y"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/gsm1y/screenshot.png" alt="useIntersect"/></a>
413
+ <a href="https://codesandbox.io/s/x8gvs"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/x8gvs/screenshot.png" alt="Infinite scroll"/></a>
414
+ <a href="https://codesandbox.io/s/yjhzv"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/yjhzv/screenshot.png" alt="Vertical scroll"/></a>
415
+ </p>
416
+
401
417
  A shader-based image component with auto-cover (similar to css/background: cover).
402
418
 
403
419
  ```jsx
@@ -415,6 +431,10 @@ function Foo() {
415
431
 
416
432
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/abstractions-text--text-st)
417
433
 
434
+ <p>
435
+ <a href="https://codesandbox.io/s/yup2o"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/yup2o/screenshot.png" alt="Demo"/></a>
436
+ </p>
437
+
418
438
  Hi-quality text rendering w/ signed distance fields (SDF) and antialiasing, using [troika-3d-text](https://github.com/protectwise/troika/tree/master/packages/troika-3d-text). All of troikas props are valid!
419
439
 
420
440
  ```jsx
@@ -445,6 +465,10 @@ Renders a THREE.Line2.
445
465
 
446
466
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/abstractions-line--quadratic-bezier)
447
467
 
468
+ <p>
469
+ <a href="https://codesandbox.io/s/2ij9u"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/2ij9u/screenshot.png" alt="Demo"/></a>
470
+ </p>
471
+
448
472
  Renders a THREE.Line2 using THREE.QuadraticBezierCurve3 for interpolation.
449
473
 
450
474
  ```jsx
@@ -499,6 +523,10 @@ Renders a THREE.Line2 using THREE.CubicBezierCurve3 for interpolation.
499
523
 
500
524
  #### PositionalAudio
501
525
 
526
+ <p>
527
+ <a href="https://codesandbox.io/s/gkfhr"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/gkfhr/screenshot.png" alt="Demo"/></a>
528
+ </p>
529
+
502
530
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/abstractions-positionalaudio--positional-audio-scene-st) ![](https://img.shields.io/badge/-suspense-brightgreen)
503
531
 
504
532
  A wrapper around [THREE.PositionalAudio](https://threejs.org/docs/index.html#api/en/audio/PositionalAudio). Add this to groups or meshes to tie them to a sound that plays when the camera comes near.
@@ -564,12 +592,16 @@ Abstraction around threes own [EffectComposer](https://threejs.org/docs/index.ht
564
592
 
565
593
  #### GradientTexture
566
594
 
595
+ <p>
596
+ <a href="https://codesandbox.io/s/l03yb"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/l03yb/screenshot.png" alt="Demo"/></a>
597
+ </p>
598
+
567
599
  A declarative THREE.Texture which attaches to "map" by default. You can use this to create gradient backgrounds.
568
600
 
569
601
  ```jsx
570
602
  <mesh>
571
603
  <planeGeometry />
572
- <meshBasicMaterial depthWrite={false}>
604
+ <meshBasicMaterial>
573
605
  <GradientTexture
574
606
  stops={[0, 1]} // As many stops as you want
575
607
  colors={['aquamarine', 'hotpink']} // Colors need to match the number of stops
@@ -581,6 +613,10 @@ A declarative THREE.Texture which attaches to "map" by default. You can use this
581
613
 
582
614
  #### Edges
583
615
 
616
+ <p>
617
+ <a href="https://codesandbox.io/s/ny3p4"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/ny3p4/screenshot.png" alt="Demo"/></a>
618
+ </p>
619
+
584
620
  Abstracts [THREE.EdgesGeometry](https://threejs.org/docs/index.html?q=EdgesGeometry#api/en/geometries/EdgesGeometry). It pulls the geometry automatically from its parent, optionally you can ungroup it and give it a `geometry` prop. You can give it children, for instance a custom material.
585
621
 
586
622
  ```jsx
@@ -599,6 +635,10 @@ Abstracts [THREE.EdgesGeometry](https://threejs.org/docs/index.html?q=EdgesGeome
599
635
 
600
636
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/abstractions-useanimations--use-animations-st)
601
637
 
638
+ <p>
639
+ <a href="https://codesandbox.io/s/pecl6"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/pecl6/screenshot.png" alt="Demo"/></a>
640
+ </p>
641
+
602
642
  A hook that abstracts [AnimationMixer](https://threejs.org/docs/index.html#api/en/animation/AnimationMixer).
603
643
 
604
644
  ```jsx
@@ -625,6 +665,11 @@ return <primitive object={scene} />
625
665
 
626
666
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/shaders-meshreflectormaterial--reflector-st)
627
667
 
668
+ <p>
669
+ <a href="https://codesandbox.io/s/lx2h8"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/lx2h8/screenshot.png" alt="Demo"/></a>
670
+ <a href="https://codesandbox.io/s/l900i"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/l900i/screenshot.png" alt="Demo"/></a>
671
+ </p>
672
+
628
673
  Easily add reflections and/or blur to any mesh. It takes surface roughness into account for a more realistic effect. This material extends from [THREE.MeshStandardMaterial](https://threejs.org/docs/index.html?q=meshsta#api/en/materials/MeshStandardMaterial) and accepts all its props.
629
674
 
630
675
  ```jsx
@@ -671,6 +716,10 @@ This material makes your geometry wobble and wave around. It was taken from the
671
716
 
672
717
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/shaders-meshdistortmaterial--mesh-distort-material-st)
673
718
 
719
+ <p>
720
+ <a href="https://codesandbox.io/s/l03yb"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/l03yb/screenshot.png" alt="Demo"/></a>
721
+ </p>
722
+
674
723
  This material makes your geometry distort following simplex noise.
675
724
 
676
725
  ```jsx
@@ -694,6 +743,10 @@ An antialiased round dot that always keeps the same size.
694
743
 
695
744
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/shaders-softshadows--soft-shadows-st)
696
745
 
746
+ <p>
747
+ <a href="https://codesandbox.io/s/dh2jc"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/dh2jc/screenshot.png" alt="Demo"/></a>
748
+ </p>
749
+
697
750
  Injects [percent closer soft shadows (pcss)](https://threejs.org/examples/?q=pcss#webgl_shadowmap_pcss) into threes shader chunk.
698
751
 
699
752
  ```jsx
@@ -710,6 +763,10 @@ softShadows({
710
763
 
711
764
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/shaders-shadermaterial--shader-material-story)
712
765
 
766
+ <p>
767
+ <a href="https://codesandbox.io/s/ni6v4"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/ni6v4/screenshot.png" alt="Demo"/></a>
768
+ </p>
769
+
713
770
  Creates a THREE.ShaderMaterial for you with easier handling of uniforms, which are also automatically declared as setter/getters on the object.
714
771
 
715
772
  ```jsx
@@ -804,6 +861,12 @@ function Scene() {
804
861
 
805
862
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/misc-html--html-st) ![](https://img.shields.io/badge/-Dom only-red)
806
863
 
864
+ <p>
865
+ <a href="https://codesandbox.io/s/qyz5r"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/qyz5r/screenshot.png" alt="Demo"/></a>
866
+ <a href="https://codesandbox.io/s/9keg6"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/9keg6/screenshot.png" alt="Demo"/></a>
867
+ <a href="https://codesandbox.io/s/6oei7"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/6oei7/screenshot.png" alt="Demo"/></a>
868
+ </p>
869
+
807
870
  Allows you to tie HTML content to any object of your scene. It will be projected to the objects whereabouts automatically.
808
871
 
809
872
  ```jsx
@@ -857,6 +920,10 @@ const [hidden, set] = useState()
857
920
 
858
921
  ![](https://img.shields.io/badge/-Dom only-red)
859
922
 
923
+ <p>
924
+ <a href="https://codesandbox.io/s/ls503"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/ls503/screenshot.png" alt="Demo"/></a>
925
+ </p>
926
+
860
927
  This component allows you to cycle through all objects underneath the cursor with optional visual feedback. This can be useful for non-trivial selection, CAD data, housing, everything that has layers. It does this by changing the raycasters filter function and then refreshing the raycaster.
861
928
 
862
929
  For this to work properly your event handler have to call `event.stopPropagation()`, for instance in `onPointerOver` or `onClick`, only one element can be selective for cycling to make sense.
@@ -874,6 +941,10 @@ For this to work properly your event handler have to call `event.stopPropagation
874
941
 
875
942
  ![](https://img.shields.io/badge/-Dom only-red)
876
943
 
944
+ <p>
945
+ <a href="https://codesandbox.io/s/ny3p4"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/ny3p4/screenshot.png" alt="Demo"/></a>
946
+ </p>
947
+
877
948
  This component allows you to select/unselect objects by clicking on them. It keeps track of the currently selected objects and can select multiple objects (with the shift key). Nested components can request the current selection (which is always an array) with the `useSelect` hook. With the `box` prop it will let you shift-box-select objects by holding and draging the cursor over multiple objects. Optionally you can filter the selected items as well as define in which shape they are stored by defining the `filter` prop.
878
949
 
879
950
  ```jsx
@@ -944,6 +1015,10 @@ The rendertarget is automatically disposed when unmounted.
944
1015
 
945
1016
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/misc-usecamera--use-camera-st)
946
1017
 
1018
+ <p>
1019
+ <a href="https://codesandbox.io/s/py4db"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/py4db/screenshot.png" alt="Demo"/></a>
1020
+ </p>
1021
+
947
1022
  A hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).
948
1023
 
949
1024
  ```jsx
@@ -1015,6 +1090,10 @@ return (
1015
1090
 
1016
1091
  #### useIntersect
1017
1092
 
1093
+ <p>
1094
+ <a href="https://codesandbox.io/s/gsm1y"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/gsm1y/screenshot.png" alt="Demo"/></a>
1095
+ </p>
1096
+
1018
1097
  A very cheap frustum check that gives you a reference you can observe in order to know if the object has entered the view or is outside of it. This relies on [THREE.Object3D.onBeforeRender](https://threejs.org/docs/index.html?q=obj#api/en/core/Object3D.onBeforeRender) so it only works on objects that are effectively rendered, like meshes, lines, sprites. It won't work on groups, object3d's, bones, etc.
1019
1098
 
1020
1099
  ```jsx
@@ -1028,6 +1107,10 @@ return <mesh ref={ref} />
1028
1107
 
1029
1108
  ![](https://img.shields.io/badge/-Dom only-red)
1030
1109
 
1110
+ <p>
1111
+ <a href="https://codesandbox.io/s/0buje"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/0buje/screenshot.png" alt="Demo"/></a>
1112
+ </p>
1113
+
1031
1114
  A quick and easy loading overlay component that you can drop on top of your canvas. It's intended to "hide" the whole app, so if you have multiple suspense wrappers in your application, you should use multiple loaders. It will show an animated loadingbar and a percentage.
1032
1115
 
1033
1116
  ```jsx
@@ -1156,6 +1239,11 @@ const envMap = useCubeTexture(['px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png',
1156
1239
 
1157
1240
  #### Instances
1158
1241
 
1242
+ <p>
1243
+ <a href="https://codesandbox.io/s/h8o2d"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/h8o2d/screenshot.png" alt="Demo"/></a>
1244
+ <a href="https://codesandbox.io/s/i6t0j"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/i6t0j/screenshot.png" alt="Demo"/></a>
1245
+ </p>
1246
+
1159
1247
  A wrapper around [THREE.InstancedMesh](https://threejs.org/docs/index.html?q=instan#api/en/objects/InstancedMesh). This allows you to define hundreds of thousands of objects in a single draw call, but declaratively!
1160
1248
 
1161
1249
  ```jsx
@@ -1199,6 +1287,10 @@ You can define events on them!
1199
1287
 
1200
1288
  #### Merged
1201
1289
 
1290
+ <p>
1291
+ <a href="https://codesandbox.io/s/l900i"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/l900i/screenshot.png" alt="Demo"/></a>
1292
+ </p>
1293
+
1202
1294
  This creates instances for existing meshes and allows you to use them cheaply in the same scene graph. Each type will cost you exactly one draw call, no matter how many you use. `meshes` has to be a collection of pre-existing THREE.Mesh objects.
1203
1295
 
1204
1296
  ```jsx
@@ -1310,6 +1402,10 @@ useFrame(() => {
1310
1402
 
1311
1403
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/abstractions-detailed--detailed-st)
1312
1404
 
1405
+ <p>
1406
+ <a href="https://codesandbox.io/s/12nmp"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/12nmp/screenshot.png" alt="Demo"/></a>
1407
+ </p>
1408
+
1313
1409
  A wrapper around [THREE.LOD](https://threejs.org/docs/index.html#api/en/objects/LOD) (Level of detail).
1314
1410
 
1315
1411
  ```jsx
@@ -1399,6 +1495,10 @@ Calculates a boundary box and centers its children accordingly. `alignTop` makes
1399
1495
 
1400
1496
  #### Bounds
1401
1497
 
1498
+ <p>
1499
+ <a href="https://codesandbox.io/s/rz2g0"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/rz2g0/screenshot.png" alt="Demo"/></a>
1500
+ </p>
1501
+
1402
1502
  Calculates a boundary box and centers the camera accordingly. If you are using controls, make sure to pass them the `makeDefault` prop. `fit` fits the current view on first render. `clip` sets the cameras near/far planes.
1403
1503
 
1404
1504
  ```jsx
@@ -1427,6 +1527,11 @@ function Foo() {
1427
1527
 
1428
1528
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/staging-camerashake--camera-shake-story)
1429
1529
 
1530
+ <p>
1531
+ <a href="https://codesandbox.io/s/t4l0f"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/t4l0f/screenshot.png" alt="Demo"/></a>
1532
+ <a href="https://codesandbox.io/s/0ycwe"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/0ycwe/screenshot.png" alt="Demo"/></a>
1533
+ </p>
1534
+
1430
1535
  A component for applying a configurable camera shake effect. Currently only supports rotational camera shake. Pass a ref to recieve the `ShakeController` API.
1431
1536
 
1432
1537
  If you use shake in combination with controls make sure to set the `makeDefault` prop on your controls, in that case you do not have to pass them via the `controls` prop.
@@ -1457,6 +1562,10 @@ interface ShakeController {
1457
1562
 
1458
1563
  #### Float
1459
1564
 
1565
+ <p>
1566
+ <a href="https://codesandbox.io/s/2ij9u"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/2ij9u/screenshot.png" alt="Demo"/></a>
1567
+ </p>
1568
+
1460
1569
  This component makes its contents float or hover.
1461
1570
 
1462
1571
  ```js
@@ -1485,6 +1594,10 @@ Make sure to set the `makeDefault` prop on your controls, in that case you do no
1485
1594
 
1486
1595
  #### Backdrop
1487
1596
 
1597
+ <p>
1598
+ <a href="https://codesandbox.io/s/8yfnd"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/8yfnd/screenshot.png" alt="Demo"/></a>
1599
+ </p>
1600
+
1488
1601
  A curved plane, like a studio backdrop. This is for presentational purposes, to break up light and shadows more interestingly.
1489
1602
 
1490
1603
  ```jsx
@@ -1515,6 +1628,10 @@ A cheap canvas-texture-based circular gradient.
1515
1628
 
1516
1629
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/staging-contactshadows--contact-shadow-st)
1517
1630
 
1631
+ <p>
1632
+ <a href="https://codesandbox.io/s/qxjoj"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/qxjoj/screenshot.png" alt="Demo"/></a>
1633
+ </p>
1634
+
1518
1635
  A [contact shadow](https://threejs.org/examples/?q=con#webgl_shadow_contact) implementation, facing upwards (positive Y) by default. `scale` can be a positive number or a 2D array `[x: number, y: number]`.
1519
1636
 
1520
1637
  ```jsx
@@ -1529,6 +1646,11 @@ Since this is a rather expensive effect you can limit the amount of frames it re
1529
1646
 
1530
1647
  #### SpotLight
1531
1648
 
1649
+ <p>
1650
+ <a href="https://codesandbox.io/s/tx1pq"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/tx1pq/screenshot.png" alt="Demo"/></a>
1651
+ <a href="https://codesandbox.io/s/wdzv4"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/wdzv4/screenshot.png" alt="Demo"/></a>
1652
+ </p>
1653
+
1532
1654
  A Volumetric spotlight.
1533
1655
 
1534
1656
  ```jsx
@@ -1552,6 +1674,10 @@ function Foo() {
1552
1674
 
1553
1675
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/staging-environment--environment-story)
1554
1676
 
1677
+ <p>
1678
+ <a href="https://codesandbox.io/s/t4l0f"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/t4l0f/screenshot.png" alt="Demo"/></a>
1679
+ </p>
1680
+
1555
1681
  Sets up a global cubemap, which affects the default `scene.environment`, and optionally `scene.background`, unless a custom scene has been passed. A selection of [presets](src/helpers/environment-assets.ts) from [HDRI Haven](https://hdrihaven.com/) are available for convenience. If you pass an array of files it will use THREE.CubeTextureLoader.
1556
1682
 
1557
1683
  ```jsx
@@ -1574,6 +1700,10 @@ If you provide a single string it will use THREE.RGBELoader.
1574
1700
 
1575
1701
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/staging-sky--sky-st)
1576
1702
 
1703
+ <p>
1704
+ <a href="https://codesandbox.io/s/vkgi6"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/vkgi6/screenshot.png" alt="Demo"/></a>
1705
+ </p>
1706
+
1577
1707
  Adds a [sky](https://threejs.org/examples/webgl_shaders_sky.html) to your scene.
1578
1708
 
1579
1709
  ```jsx
@@ -1594,6 +1724,10 @@ Adds a blinking shader-based starfield to your scene.
1594
1724
 
1595
1725
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/staging-cloud--cloud-st) ![](https://img.shields.io/badge/-suspense-brightgreen)
1596
1726
 
1727
+ <p>
1728
+ <a href="https://codesandbox.io/s/mbfzf"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/mbfzf/screenshot.png" alt="Demo"/></a>
1729
+ </p>
1730
+
1597
1731
  Particle based cloud.
1598
1732
 
1599
1733
  ```jsx
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),a=require("@react-three/fiber"),n=require("three-stdlib");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var i=u(e),s=o(r),l=o(t);const c=s.forwardRef((({scale:e,frames:r=1/0,opacity:t=1,width:u=1,height:o=1,blur:c=1,far:d=10,resolution:f=256,...h},m)=>{const p=a.useThree((({scene:e})=>e)),g=a.useThree((({gl:e})=>e)),b=s.useRef();u*=Array.isArray(e)?e[0]:e||1,o*=Array.isArray(e)?e[1]:e||1;const[M,y,v,w,T,x,R]=s.useMemo((()=>{const e=new l.WebGLRenderTarget(f,f),r=new l.WebGLRenderTarget(f,f);r.texture.generateMipmaps=e.texture.generateMipmaps=!1;const t=new l.PlaneBufferGeometry(u,o).rotateX(Math.PI/2),a=new l.Mesh(t),i=new l.MeshDepthMaterial;i.depthTest=i.depthWrite=!1,i.onBeforeCompile=e=>e.fragmentShader=e.fragmentShader.replace("1.0 - fragCoordZ ), opacity );","0.0 ), ( 1.0 - fragCoordZ ) * 1.0 );");const s=new l.ShaderMaterial(n.HorizontalBlurShader),c=new l.ShaderMaterial(n.VerticalBlurShader);return c.depthTest=s.depthTest=!1,[e,t,i,a,s,c,r]}),[f,u,o,e]);let j=0;return a.useFrame((()=>{if(b.current&&(r===1/0||j<r)){const e=p.background;p.background=null,p.overrideMaterial=v,g.setRenderTarget(M),g.render(p,b.current),p.overrideMaterial=null,w.material=T,w.material.uniforms.tDiffuse.value=M.texture,T.uniforms.h.value=c/256,g.setRenderTarget(R),g.render(w,b.current),w.material=x,w.material.uniforms.tDiffuse.value=R.texture,x.uniforms.v.value=c/256,g.setRenderTarget(M),g.render(w,b.current),g.setRenderTarget(null),p.background=e,j++}})),s.createElement("group",i.default({"rotation-x":Math.PI/2},h,{ref:m}),s.createElement("mesh",{geometry:y,scale:[1,-1,1],rotation:[-Math.PI/2,0,0]},s.createElement("meshBasicMaterial",{map:M.texture,transparent:!0,opacity:t})),s.createElement("orthographicCamera",{ref:b,args:[-u/2,u/2,o/2,-o/2,0,d]}))}));exports.ContactShadows=c;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),a=require("@react-three/fiber"),n=require("three-stdlib");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var i=u(e),s=o(r),l=o(t);const c=s.forwardRef((({scale:e,frames:r=1/0,opacity:t=1,width:u=1,height:o=1,blur:c=1,far:d=10,resolution:f=256,smooth:h=!0,...m},p)=>{const g=a.useThree((({scene:e})=>e)),b=a.useThree((({gl:e})=>e)),M=s.useRef(null);u*=Array.isArray(e)?e[0]:e||1,o*=Array.isArray(e)?e[1]:e||1;const[v,y,w,T,x,R,j]=s.useMemo((()=>{const e=new l.WebGLRenderTarget(f,f),r=new l.WebGLRenderTarget(f,f);r.texture.generateMipmaps=e.texture.generateMipmaps=!1;const t=new l.PlaneBufferGeometry(u,o).rotateX(Math.PI/2),a=new l.Mesh(t),i=new l.MeshDepthMaterial;i.depthTest=i.depthWrite=!1,i.onBeforeCompile=e=>e.fragmentShader=e.fragmentShader.replace("1.0 - fragCoordZ ), opacity );","0.0 ), ( 1.0 - fragCoordZ ) * 1.0 );");const s=new l.ShaderMaterial(n.HorizontalBlurShader),c=new l.ShaderMaterial(n.VerticalBlurShader);return c.depthTest=s.depthTest=!1,[e,t,i,a,s,c,r]}),[f,u,o,e]),O=s.useCallback((e=>{T.visible=!0,T.material=x,x.uniforms.tDiffuse.value=v.texture,x.uniforms.h.value=1*e/256,b.setRenderTarget(j),b.render(T,M.current),T.material=R,R.uniforms.tDiffuse.value=j.texture,R.uniforms.v.value=1*e/256,b.setRenderTarget(v),b.render(T,M.current),T.visible=!1}),[]);let P=0;return a.useFrame((()=>{if(M.current&&(r===1/0||P<r)){const e=g.background;g.background=null,g.overrideMaterial=w,b.setRenderTarget(v),b.render(g,M.current),g.overrideMaterial=null,O(c),h&&O(.4*c),b.setRenderTarget(null),g.background=e,P++}})),s.createElement("group",i.default({"rotation-x":Math.PI/2},m,{ref:p}),s.createElement("mesh",{geometry:y,scale:[1,-1,1],rotation:[-Math.PI/2,0,0]},s.createElement("meshBasicMaterial",{map:v.texture,transparent:!0,opacity:t})),s.createElement("orthographicCamera",{ref:M,args:[-u/2,u/2,o/2,-o/2,0,d]}))}));exports.ContactShadows=c;
@@ -5,7 +5,8 @@ export declare const ContactShadows: React.ForwardRefExoticComponent<Pick<Omit<i
5
5
  height?: number | undefined;
6
6
  blur?: number | undefined;
7
7
  far?: number | undefined;
8
+ smooth?: boolean | undefined;
8
9
  resolution?: number | undefined;
9
10
  frames?: number | undefined;
10
11
  scale?: number | [x: number, y: number] | undefined;
11
- }, "visible" | "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "isGroup" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "blur" | "height" | "opacity" | "width" | "resolution" | "far" | "frames"> & React.RefAttributes<unknown>>;
12
+ }, "visible" | "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "isGroup" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "smooth" | "blur" | "height" | "opacity" | "width" | "resolution" | "far" | "frames"> & React.RefAttributes<unknown>>;
@@ -13,6 +13,7 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
13
13
  blur = 1,
14
14
  far = 10,
15
15
  resolution = 256,
16
+ smooth = true,
16
17
  ...props
17
18
  }, ref) => {
18
19
  const scene = useThree(({
@@ -21,7 +22,7 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
21
22
  const gl = useThree(({
22
23
  gl
23
24
  }) => gl);
24
- const shadowCamera = React.useRef();
25
+ const shadowCamera = React.useRef(null);
25
26
  width = width * (Array.isArray(scale) ? scale[0] : scale || 1);
26
27
  height = height * (Array.isArray(scale) ? scale[1] : scale || 1);
27
28
  const [renderTarget, planeGeometry, depthMaterial, blurPlane, horizontalBlurMaterial, verticalBlurMaterial, renderTargetBlur] = React.useMemo(() => {
@@ -40,6 +41,20 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
40
41
  verticalBlurMaterial.depthTest = horizontalBlurMaterial.depthTest = false;
41
42
  return [renderTarget, planeGeometry, depthMaterial, blurPlane, horizontalBlurMaterial, verticalBlurMaterial, renderTargetBlur];
42
43
  }, [resolution, width, height, scale]);
44
+ const blurShadows = React.useCallback(blur => {
45
+ blurPlane.visible = true;
46
+ blurPlane.material = horizontalBlurMaterial;
47
+ horizontalBlurMaterial.uniforms.tDiffuse.value = renderTarget.texture;
48
+ horizontalBlurMaterial.uniforms.h.value = blur * 1 / 256;
49
+ gl.setRenderTarget(renderTargetBlur);
50
+ gl.render(blurPlane, shadowCamera.current);
51
+ blurPlane.material = verticalBlurMaterial;
52
+ verticalBlurMaterial.uniforms.tDiffuse.value = renderTargetBlur.texture;
53
+ verticalBlurMaterial.uniforms.v.value = blur * 1 / 256;
54
+ gl.setRenderTarget(renderTarget);
55
+ gl.render(blurPlane, shadowCamera.current);
56
+ blurPlane.visible = false;
57
+ }, []);
43
58
  let count = 0;
44
59
  useFrame(() => {
45
60
  if (shadowCamera.current && (frames === Infinity || count < frames)) {
@@ -49,16 +64,8 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
49
64
  gl.setRenderTarget(renderTarget);
50
65
  gl.render(scene, shadowCamera.current);
51
66
  scene.overrideMaterial = null;
52
- blurPlane.material = horizontalBlurMaterial;
53
- blurPlane.material.uniforms.tDiffuse.value = renderTarget.texture;
54
- horizontalBlurMaterial.uniforms.h.value = blur / 256;
55
- gl.setRenderTarget(renderTargetBlur);
56
- gl.render(blurPlane, shadowCamera.current);
57
- blurPlane.material = verticalBlurMaterial;
58
- blurPlane.material.uniforms.tDiffuse.value = renderTargetBlur.texture;
59
- verticalBlurMaterial.uniforms.v.value = blur / 256;
60
- gl.setRenderTarget(renderTarget);
61
- gl.render(blurPlane, shadowCamera.current);
67
+ blurShadows(blur);
68
+ if (smooth) blurShadows(blur * 0.4);
62
69
  gl.setRenderTarget(null);
63
70
  scene.background = initialBackground;
64
71
  count++;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber");function n(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var u=n(r);exports.CubeCamera=function({children:r,fog:n,frames:a=1/0,resolution:i=256,near:c=1,far:o=1e3,...f}){const s=u.useRef(),[l,g]=u.useState(),b=t.useThree((({scene:e})=>e)),m=t.useThree((({gl:e})=>e)),d=u.useMemo((()=>new e.WebGLCubeRenderTarget(i,{minFilter:e.LinearFilter,magFilter:e.LinearFilter,format:e.RGBFormat,encoding:m.outputEncoding})),[i]);let p=0;return t.useFrame((()=>{if(l&&s.current&&(a===1/0||p<a)){s.current.traverse((e=>e.visible=!1));const e=b.fog;b.fog=n||e,l.update(m,b),b.fog=e,s.current.traverse((e=>e.visible=!0)),p++}})),u.createElement("group",f,u.createElement("cubeCamera",{ref:g,args:[c,o,d]}),u.createElement("group",{ref:s},r(d.texture)))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber");function n(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var u=n(r);exports.CubeCamera=function({children:r,fog:n,frames:a=1/0,resolution:i=256,near:c=1,far:o=1e3,...s}){const f=u.useRef(),[l,g]=u.useState(),b=t.useThree((({scene:e})=>e)),d=t.useThree((({gl:e})=>e)),m=u.useMemo((()=>new e.WebGLCubeRenderTarget(i,{minFilter:e.LinearFilter,magFilter:e.LinearFilter,encoding:d.outputEncoding})),[i]);let p=0;return t.useFrame((()=>{if(l&&f.current&&(a===1/0||p<a)){f.current.traverse((e=>e.visible=!1));const e=b.fog;b.fog=n||e,l.update(d,b),b.fog=e,f.current.traverse((e=>e.visible=!0)),p++}})),u.createElement("group",s,u.createElement("cubeCamera",{ref:g,args:[c,o,m]}),u.createElement("group",{ref:f},r(m.texture)))};
@@ -1,4 +1,4 @@
1
- import { WebGLCubeRenderTarget, LinearFilter, RGBFormat } from 'three';
1
+ import { WebGLCubeRenderTarget, LinearFilter } from 'three';
2
2
  import * as React from 'react';
3
3
  import { useThree, useFrame } from '@react-three/fiber';
4
4
 
@@ -22,7 +22,6 @@ function CubeCamera({
22
22
  const fbo = React.useMemo(() => new WebGLCubeRenderTarget(resolution, {
23
23
  minFilter: LinearFilter,
24
24
  magFilter: LinearFilter,
25
- format: RGBFormat,
26
25
  encoding: gl.outputEncoding
27
26
  }), [resolution]);
28
27
  let count = 0;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var c=n(e),u=o(t),a=o(r);exports.GradientTexture=function({stops:e,colors:t,size:r=2048,...n}){const o=a.useMemo((()=>{const n=document.createElement("canvas"),o=n.getContext("2d");n.width=16,n.height=r;const c=o.createLinearGradient(0,0,0,r);let a=e.length;for(;a--;)c.addColorStop(e[a],t[a]);o.fillStyle=c,o.fillRect(0,0,16,r);const i=new u.Texture(n);return i.needsUpdate=!0,i}),[e]);return a.useEffect((()=>()=>{o.dispose()}),[o]),a.createElement("primitive",c.default({object:o,attach:"map"},n))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),n=require("@react-three/fiber");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var c=o(e),i=u(t),a=u(r);exports.GradientTexture=function({stops:e,colors:t,size:r=1024,...o}){const u=n.useThree((e=>e.gl)),l=a.useMemo((()=>{const n=document.createElement("canvas"),o=n.getContext("2d");n.width=16,n.height=r;const u=o.createLinearGradient(0,0,0,r);let c=e.length;for(;c--;)u.addColorStop(e[c],t[c]);o.fillStyle=u,o.fillRect(0,0,16,r);const a=new i.Texture(n);return a.needsUpdate=!0,a}),[e]);return a.useEffect((()=>()=>{l.dispose()}),[l]),a.createElement("primitive",c.default({object:l,attach:"map",encoding:u.outputEncoding},o))};
@@ -1,13 +1,15 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import * as THREE from 'three';
3
3
  import * as React from 'react';
4
+ import { useThree } from '@react-three/fiber';
4
5
 
5
6
  function GradientTexture({
6
7
  stops,
7
8
  colors,
8
- size = 2048,
9
+ size = 1024,
9
10
  ...props
10
11
  }) {
12
+ const gl = useThree(state => state.gl);
11
13
  const texture = React.useMemo(() => {
12
14
  const canvas = document.createElement('canvas');
13
15
  const context = canvas.getContext('2d');
@@ -29,7 +31,8 @@ function GradientTexture({
29
31
  React.useEffect(() => () => void texture.dispose(), [texture]);
30
32
  return /*#__PURE__*/React.createElement("primitive", _extends({
31
33
  object: texture,
32
- attach: "map"
34
+ attach: "map",
35
+ encoding: gl.outputEncoding
33
36
  }, props));
34
37
  }
35
38
 
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),a=require("@react-three/fiber"),n=require("react-merge-refs"),i=require("../materials/BlurPass.cjs.js"),o=require("../materials/MeshReflectorMaterial.cjs.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function l(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("../materials/ConvolutionMaterial.cjs.js");var u=s(e),d=l(t),c=s(n);a.extend({MeshReflectorMaterialImpl:o.MeshReflectorMaterial});const p=d.forwardRef((({mixBlur:e=0,mixStrength:t=1,resolution:n=256,blur:o=[0,0],minDepthThreshold:s=.9,maxDepthThreshold:l=1,depthScale:p=0,depthToBlurRatioBias:m=.25,mirror:h=0,debug:f=0,distortion:x=1,mixContrast:M=1,distortionMap:T,...S},b)=>{const y=a.useThree((({gl:e})=>e)),w=a.useThree((({camera:e})=>e)),g=a.useThree((({scene:e})=>e)),R=(o=Array.isArray(o)?o:[o,o])[0]+o[1]>0,v=d.useRef(null),[j]=d.useState((()=>new r.Plane)),[B]=d.useState((()=>new r.Vector3)),[D]=d.useState((()=>new r.Vector3)),[_]=d.useState((()=>new r.Vector3)),[P]=d.useState((()=>new r.Matrix4)),[U]=d.useState((()=>new r.Vector3(0,0,-1))),[E]=d.useState((()=>new r.Vector4)),[O]=d.useState((()=>new r.Vector3)),[F]=d.useState((()=>new r.Vector3)),[V]=d.useState((()=>new r.Vector4)),[W]=d.useState((()=>new r.Matrix4)),[q]=d.useState((()=>new r.PerspectiveCamera)),I=d.useCallback((()=>{var e;const t=v.current.parent||(null==(e=v.current)?void 0:e.__r3f.parent);if(!t)return;if(D.setFromMatrixPosition(t.matrixWorld),_.setFromMatrixPosition(w.matrixWorld),P.extractRotation(t.matrixWorld),B.set(0,0,1),B.applyMatrix4(P),O.subVectors(D,_),O.dot(B)>0)return;O.reflect(B).negate(),O.add(D),P.extractRotation(w.matrixWorld),U.set(0,0,-1),U.applyMatrix4(P),U.add(_),F.subVectors(D,U),F.reflect(B).negate(),F.add(D),q.position.copy(O),q.up.set(0,1,0),q.up.applyMatrix4(P),q.up.reflect(B),q.lookAt(F),q.far=w.far,q.updateMatrixWorld(),q.projectionMatrix.copy(w.projectionMatrix),W.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),W.multiply(q.projectionMatrix),W.multiply(q.matrixWorldInverse),W.multiply(t.matrixWorld),j.setFromNormalAndCoplanarPoint(B,D),j.applyMatrix4(q.matrixWorldInverse),E.set(j.normal.x,j.normal.y,j.normal.z,j.constant);const r=q.projectionMatrix;V.x=(Math.sign(E.x)+r.elements[8])/r.elements[0],V.y=(Math.sign(E.y)+r.elements[9])/r.elements[5],V.z=-1,V.w=(1+r.elements[10])/r.elements[14],E.multiplyScalar(2/E.dot(V)),r.elements[2]=E.x,r.elements[6]=E.y,r.elements[10]=E.z+1,r.elements[14]=E.w}),[w]),[C,k,L,z]=d.useMemo((()=>{const a={minFilter:r.LinearFilter,magFilter:r.LinearFilter,format:r.RGBFormat,encoding:y.outputEncoding},u=new r.WebGLRenderTarget(n,n,a);u.depthBuffer=!0,u.depthTexture=new r.DepthTexture(n,n),u.depthTexture.format=r.DepthFormat,u.depthTexture.type=r.UnsignedShortType;const d=new r.WebGLRenderTarget(n,n,a);return[u,d,new i.BlurPass({gl:y,resolution:n,width:o[0],height:o[1],minDepthThreshold:s,maxDepthThreshold:l,depthScale:p,depthToBlurRatioBias:m}),{mirror:h,textureMatrix:W,mixBlur:e,tDiffuse:u.texture,tDepth:u.depthTexture,tDiffuseBlur:d.texture,hasBlur:R,mixStrength:t,minDepthThreshold:s,maxDepthThreshold:l,depthScale:p,depthToBlurRatioBias:m,transparent:!0,debug:f,distortion:x,distortionMap:T,mixContrast:M,"defines-USE_BLUR":R?"":void 0,"defines-USE_DEPTH":p>0?"":void 0,"defines-USE_DISTORTION":T?"":void 0}]}),[y,o,W,n,h,R,e,t,s,l,p,m,f,x,T,M]);return a.useFrame((()=>{var e;const t=v.current.parent||(null==(e=v.current)?void 0:e.__r3f.parent);if(!t)return;t.visible=!1;const r=y.xr.enabled,a=y.shadowMap.autoUpdate;I(),y.xr.enabled=!1,y.shadowMap.autoUpdate=!1,y.setRenderTarget(C),y.state.buffers.depth.setMask(!0),y.autoClear||y.clear(),y.render(g,q),R&&L.render(y,C,k),y.xr.enabled=r,y.shadowMap.autoUpdate=a,t.visible=!0,y.setRenderTarget(null)})),d.createElement("meshReflectorMaterialImpl",u.default({attach:"material",key:"key"+z["defines-USE_BLUR"]+z["defines-USE_DEPTH"]+z["defines-USE_DISTORTION"],ref:c.default([v,b])},z,S))}));exports.MeshReflectorMaterial=p;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),a=require("@react-three/fiber"),n=require("react-merge-refs"),i=require("../materials/BlurPass.cjs.js"),o=require("../materials/MeshReflectorMaterial.cjs.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function l(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("../materials/ConvolutionMaterial.cjs.js");var u=s(e),d=l(t),c=s(n);a.extend({MeshReflectorMaterialImpl:o.MeshReflectorMaterial});const p=d.forwardRef((({mixBlur:e=0,mixStrength:t=1,resolution:n=256,blur:o=[0,0],minDepthThreshold:s=.9,maxDepthThreshold:l=1,depthScale:p=0,depthToBlurRatioBias:m=.25,mirror:h=0,debug:f=0,distortion:x=1,mixContrast:M=1,distortionMap:T,...S},b)=>{const y=a.useThree((({gl:e})=>e)),w=a.useThree((({camera:e})=>e)),g=a.useThree((({scene:e})=>e)),R=(o=Array.isArray(o)?o:[o,o])[0]+o[1]>0,v=d.useRef(null),[j]=d.useState((()=>new r.Plane)),[D]=d.useState((()=>new r.Vector3)),[B]=d.useState((()=>new r.Vector3)),[_]=d.useState((()=>new r.Vector3)),[P]=d.useState((()=>new r.Matrix4)),[U]=d.useState((()=>new r.Vector3(0,0,-1))),[E]=d.useState((()=>new r.Vector4)),[O]=d.useState((()=>new r.Vector3)),[V]=d.useState((()=>new r.Vector3)),[W]=d.useState((()=>new r.Vector4)),[F]=d.useState((()=>new r.Matrix4)),[q]=d.useState((()=>new r.PerspectiveCamera)),I=d.useCallback((()=>{var e;const t=v.current.parent||(null==(e=v.current)?void 0:e.__r3f.parent);if(!t)return;if(B.setFromMatrixPosition(t.matrixWorld),_.setFromMatrixPosition(w.matrixWorld),P.extractRotation(t.matrixWorld),D.set(0,0,1),D.applyMatrix4(P),O.subVectors(B,_),O.dot(D)>0)return;O.reflect(D).negate(),O.add(B),P.extractRotation(w.matrixWorld),U.set(0,0,-1),U.applyMatrix4(P),U.add(_),V.subVectors(B,U),V.reflect(D).negate(),V.add(B),q.position.copy(O),q.up.set(0,1,0),q.up.applyMatrix4(P),q.up.reflect(D),q.lookAt(V),q.far=w.far,q.updateMatrixWorld(),q.projectionMatrix.copy(w.projectionMatrix),F.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),F.multiply(q.projectionMatrix),F.multiply(q.matrixWorldInverse),F.multiply(t.matrixWorld),j.setFromNormalAndCoplanarPoint(D,B),j.applyMatrix4(q.matrixWorldInverse),E.set(j.normal.x,j.normal.y,j.normal.z,j.constant);const r=q.projectionMatrix;W.x=(Math.sign(E.x)+r.elements[8])/r.elements[0],W.y=(Math.sign(E.y)+r.elements[9])/r.elements[5],W.z=-1,W.w=(1+r.elements[10])/r.elements[14],E.multiplyScalar(2/E.dot(W)),r.elements[2]=E.x,r.elements[6]=E.y,r.elements[10]=E.z+1,r.elements[14]=E.w}),[w]),[C,k,L,z]=d.useMemo((()=>{const a={minFilter:r.LinearFilter,magFilter:r.LinearFilter,encoding:y.outputEncoding},u=new r.WebGLRenderTarget(n,n,a);u.depthBuffer=!0,u.depthTexture=new r.DepthTexture(n,n),u.depthTexture.format=r.DepthFormat,u.depthTexture.type=r.UnsignedShortType;const d=new r.WebGLRenderTarget(n,n,a);return[u,d,new i.BlurPass({gl:y,resolution:n,width:o[0],height:o[1],minDepthThreshold:s,maxDepthThreshold:l,depthScale:p,depthToBlurRatioBias:m}),{mirror:h,textureMatrix:F,mixBlur:e,tDiffuse:u.texture,tDepth:u.depthTexture,tDiffuseBlur:d.texture,hasBlur:R,mixStrength:t,minDepthThreshold:s,maxDepthThreshold:l,depthScale:p,depthToBlurRatioBias:m,transparent:!0,debug:f,distortion:x,distortionMap:T,mixContrast:M,"defines-USE_BLUR":R?"":void 0,"defines-USE_DEPTH":p>0?"":void 0,"defines-USE_DISTORTION":T?"":void 0}]}),[y,o,F,n,h,R,e,t,s,l,p,m,f,x,T,M]);return a.useFrame((()=>{var e;const t=v.current.parent||(null==(e=v.current)?void 0:e.__r3f.parent);if(!t)return;t.visible=!1;const r=y.xr.enabled,a=y.shadowMap.autoUpdate;I(),y.xr.enabled=!1,y.shadowMap.autoUpdate=!1,y.setRenderTarget(C),y.state.buffers.depth.setMask(!0),y.autoClear||y.clear(),y.render(g,q),R&&L.render(y,C,k),y.xr.enabled=r,y.shadowMap.autoUpdate=a,t.visible=!0,y.setRenderTarget(null)})),d.createElement("meshReflectorMaterialImpl",u.default({attach:"material",key:"key"+z["defines-USE_BLUR"]+z["defines-USE_DEPTH"]+z["defines-USE_DISTORTION"],ref:c.default([v,b])},z,S))}));exports.MeshReflectorMaterial=p;
@@ -1,6 +1,6 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import * as React from 'react';
3
- import { Plane, Vector3, Matrix4, Vector4, PerspectiveCamera, LinearFilter, RGBFormat, WebGLRenderTarget, DepthTexture, DepthFormat, UnsignedShortType } from 'three';
3
+ import { Plane, Vector3, Matrix4, Vector4, PerspectiveCamera, LinearFilter, WebGLRenderTarget, DepthTexture, DepthFormat, UnsignedShortType } from 'three';
4
4
  import { extend, useThree, useFrame } from '@react-three/fiber';
5
5
  import mergeRefs from 'react-merge-refs';
6
6
  import { BlurPass } from '../materials/BlurPass.js';
@@ -108,7 +108,6 @@ const MeshReflectorMaterial = /*#__PURE__*/React.forwardRef(({
108
108
  const parameters = {
109
109
  minFilter: LinearFilter,
110
110
  magFilter: LinearFilter,
111
- format: RGBFormat,
112
111
  encoding: gl.outputEncoding
113
112
  };
114
113
  const fbo1 = new WebGLRenderTarget(resolution, resolution, parameters);
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),a=require("@react-three/fiber"),n=require("react-merge-refs"),o=require("../materials/BlurPass.cjs.js"),i=require("../materials/MeshReflectorMaterial.cjs.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function l(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("../materials/ConvolutionMaterial.cjs.js");var u=s(e),d=l(t),c=s(n);a.extend({MeshReflectorMaterial:i.MeshReflectorMaterial});const p=d.forwardRef((({mixBlur:e=0,mixStrength:t=.5,resolution:n=256,blur:i=[0,0],args:s=[1,1],minDepthThreshold:l=.9,maxDepthThreshold:p=1,depthScale:m=0,depthToBlurRatioBias:h=.25,mirror:f=0,children:x,debug:M=0,distortion:b=1,mixContrast:w=1,distortionMap:g,...T},y)=>{d.useEffect((()=>{console.warn("Reflector has been deprecated and will be removed next major. Replace it with <MeshReflectorMaterial />!")}),[]);const R=a.useThree((({gl:e})=>e)),S=a.useThree((({camera:e})=>e)),j=a.useThree((({scene:e})=>e)),B=(i=Array.isArray(i)?i:[i,i])[0]+i[1]>0,v=d.useRef(null),[D]=d.useState((()=>new r.Plane)),[P]=d.useState((()=>new r.Vector3)),[E]=d.useState((()=>new r.Vector3)),[F]=d.useState((()=>new r.Vector3)),[V]=d.useState((()=>new r.Matrix4)),[W]=d.useState((()=>new r.Vector3(0,0,-1))),[O]=d.useState((()=>new r.Vector4)),[q]=d.useState((()=>new r.Vector3)),[U]=d.useState((()=>new r.Vector3)),[C]=d.useState((()=>new r.Vector4)),[_]=d.useState((()=>new r.Matrix4)),[L]=d.useState((()=>new r.PerspectiveCamera)),k=d.useCallback((()=>{if(E.setFromMatrixPosition(v.current.matrixWorld),F.setFromMatrixPosition(S.matrixWorld),V.extractRotation(v.current.matrixWorld),P.set(0,0,1),P.applyMatrix4(V),q.subVectors(E,F),q.dot(P)>0)return;q.reflect(P).negate(),q.add(E),V.extractRotation(S.matrixWorld),W.set(0,0,-1),W.applyMatrix4(V),W.add(F),U.subVectors(E,W),U.reflect(P).negate(),U.add(E),L.position.copy(q),L.up.set(0,1,0),L.up.applyMatrix4(V),L.up.reflect(P),L.lookAt(U),L.far=S.far,L.updateMatrixWorld(),L.projectionMatrix.copy(S.projectionMatrix),_.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),_.multiply(L.projectionMatrix),_.multiply(L.matrixWorldInverse),_.multiply(v.current.matrixWorld),D.setFromNormalAndCoplanarPoint(P,E),D.applyMatrix4(L.matrixWorldInverse),O.set(D.normal.x,D.normal.y,D.normal.z,D.constant);const e=L.projectionMatrix;C.x=(Math.sign(O.x)+e.elements[8])/e.elements[0],C.y=(Math.sign(O.y)+e.elements[9])/e.elements[5],C.z=-1,C.w=(1+e.elements[10])/e.elements[14],O.multiplyScalar(2/O.dot(C)),e.elements[2]=O.x,e.elements[6]=O.y,e.elements[10]=O.z+1,e.elements[14]=O.w}),[]),[z,A,G,I]=d.useMemo((()=>{const a={minFilter:r.LinearFilter,magFilter:r.LinearFilter,format:r.RGBFormat,encoding:R.outputEncoding},s=new r.WebGLRenderTarget(n,n,a);s.depthBuffer=!0,s.depthTexture=new r.DepthTexture(n,n),s.depthTexture.format=r.DepthFormat,s.depthTexture.type=r.UnsignedShortType;const u=new r.WebGLRenderTarget(n,n,a);return[s,u,new o.BlurPass({gl:R,resolution:n,width:i[0],height:i[1],minDepthThreshold:l,maxDepthThreshold:p,depthScale:m,depthToBlurRatioBias:h}),{mirror:f,textureMatrix:_,mixBlur:e,tDiffuse:s.texture,tDepth:s.depthTexture,tDiffuseBlur:u.texture,hasBlur:B,mixStrength:t,minDepthThreshold:l,maxDepthThreshold:p,depthScale:m,depthToBlurRatioBias:h,transparent:!0,debug:M,distortion:b,distortionMap:g,mixContrast:w,"defines-USE_BLUR":B?"":void 0,"defines-USE_DEPTH":m>0?"":void 0,"defines-USE_DISTORTION":g?"":void 0}]}),[R,i,_,n,f,B,e,t,l,p,m,h,M,b,g,w]);return a.useFrame((()=>{if(null==v||!v.current)return;v.current.visible=!1;const e=R.xr.enabled,t=R.shadowMap.autoUpdate;k(),R.xr.enabled=!1,R.shadowMap.autoUpdate=!1,R.setRenderTarget(z),R.state.buffers.depth.setMask(!0),R.autoClear||R.clear(),R.render(j,L),B&&G.render(R,z,A),R.xr.enabled=e,R.shadowMap.autoUpdate=t,v.current.visible=!0,R.setRenderTarget(null)})),d.createElement("mesh",u.default({ref:c.default([v,y])},T),d.createElement("planeBufferGeometry",{args:s}),x?x("meshReflectorMaterial",I):d.createElement("meshReflectorMaterial",I))}));exports.Reflector=p;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),a=require("@react-three/fiber"),n=require("react-merge-refs"),o=require("../materials/BlurPass.cjs.js"),i=require("../materials/MeshReflectorMaterial.cjs.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function l(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("../materials/ConvolutionMaterial.cjs.js");var u=s(e),d=l(t),c=s(n);a.extend({MeshReflectorMaterial:i.MeshReflectorMaterial});const p=d.forwardRef((({mixBlur:e=0,mixStrength:t=.5,resolution:n=256,blur:i=[0,0],args:s=[1,1],minDepthThreshold:l=.9,maxDepthThreshold:p=1,depthScale:m=0,depthToBlurRatioBias:h=.25,mirror:f=0,children:x,debug:M=0,distortion:b=1,mixContrast:w=1,distortionMap:g,...T},y)=>{d.useEffect((()=>{console.warn("Reflector has been deprecated and will be removed next major. Replace it with <MeshReflectorMaterial />!")}),[]);const S=a.useThree((({gl:e})=>e)),R=a.useThree((({camera:e})=>e)),j=a.useThree((({scene:e})=>e)),v=(i=Array.isArray(i)?i:[i,i])[0]+i[1]>0,B=d.useRef(null),[D]=d.useState((()=>new r.Plane)),[P]=d.useState((()=>new r.Vector3)),[E]=d.useState((()=>new r.Vector3)),[V]=d.useState((()=>new r.Vector3)),[W]=d.useState((()=>new r.Matrix4)),[F]=d.useState((()=>new r.Vector3(0,0,-1))),[O]=d.useState((()=>new r.Vector4)),[q]=d.useState((()=>new r.Vector3)),[U]=d.useState((()=>new r.Vector3)),[C]=d.useState((()=>new r.Vector4)),[_]=d.useState((()=>new r.Matrix4)),[L]=d.useState((()=>new r.PerspectiveCamera)),k=d.useCallback((()=>{if(E.setFromMatrixPosition(B.current.matrixWorld),V.setFromMatrixPosition(R.matrixWorld),W.extractRotation(B.current.matrixWorld),P.set(0,0,1),P.applyMatrix4(W),q.subVectors(E,V),q.dot(P)>0)return;q.reflect(P).negate(),q.add(E),W.extractRotation(R.matrixWorld),F.set(0,0,-1),F.applyMatrix4(W),F.add(V),U.subVectors(E,F),U.reflect(P).negate(),U.add(E),L.position.copy(q),L.up.set(0,1,0),L.up.applyMatrix4(W),L.up.reflect(P),L.lookAt(U),L.far=R.far,L.updateMatrixWorld(),L.projectionMatrix.copy(R.projectionMatrix),_.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),_.multiply(L.projectionMatrix),_.multiply(L.matrixWorldInverse),_.multiply(B.current.matrixWorld),D.setFromNormalAndCoplanarPoint(P,E),D.applyMatrix4(L.matrixWorldInverse),O.set(D.normal.x,D.normal.y,D.normal.z,D.constant);const e=L.projectionMatrix;C.x=(Math.sign(O.x)+e.elements[8])/e.elements[0],C.y=(Math.sign(O.y)+e.elements[9])/e.elements[5],C.z=-1,C.w=(1+e.elements[10])/e.elements[14],O.multiplyScalar(2/O.dot(C)),e.elements[2]=O.x,e.elements[6]=O.y,e.elements[10]=O.z+1,e.elements[14]=O.w}),[]),[z,A,I,G]=d.useMemo((()=>{const a={minFilter:r.LinearFilter,magFilter:r.LinearFilter,encoding:S.outputEncoding},s=new r.WebGLRenderTarget(n,n,a);s.depthBuffer=!0,s.depthTexture=new r.DepthTexture(n,n),s.depthTexture.format=r.DepthFormat,s.depthTexture.type=r.UnsignedShortType;const u=new r.WebGLRenderTarget(n,n,a);return[s,u,new o.BlurPass({gl:S,resolution:n,width:i[0],height:i[1],minDepthThreshold:l,maxDepthThreshold:p,depthScale:m,depthToBlurRatioBias:h}),{mirror:f,textureMatrix:_,mixBlur:e,tDiffuse:s.texture,tDepth:s.depthTexture,tDiffuseBlur:u.texture,hasBlur:v,mixStrength:t,minDepthThreshold:l,maxDepthThreshold:p,depthScale:m,depthToBlurRatioBias:h,transparent:!0,debug:M,distortion:b,distortionMap:g,mixContrast:w,"defines-USE_BLUR":v?"":void 0,"defines-USE_DEPTH":m>0?"":void 0,"defines-USE_DISTORTION":g?"":void 0}]}),[S,i,_,n,f,v,e,t,l,p,m,h,M,b,g,w]);return a.useFrame((()=>{if(null==B||!B.current)return;B.current.visible=!1;const e=S.xr.enabled,t=S.shadowMap.autoUpdate;k(),S.xr.enabled=!1,S.shadowMap.autoUpdate=!1,S.setRenderTarget(z),S.state.buffers.depth.setMask(!0),S.autoClear||S.clear(),S.render(j,L),v&&I.render(S,z,A),S.xr.enabled=e,S.shadowMap.autoUpdate=t,B.current.visible=!0,S.setRenderTarget(null)})),d.createElement("mesh",u.default({ref:c.default([B,y])},T),d.createElement("planeBufferGeometry",{args:s}),x?x("meshReflectorMaterial",G):d.createElement("meshReflectorMaterial",G))}));exports.Reflector=p;
package/core/Reflector.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import * as React from 'react';
3
- import { Plane, Vector3, Matrix4, Vector4, PerspectiveCamera, LinearFilter, RGBFormat, WebGLRenderTarget, DepthTexture, DepthFormat, UnsignedShortType } from 'three';
3
+ import { Plane, Vector3, Matrix4, Vector4, PerspectiveCamera, LinearFilter, WebGLRenderTarget, DepthTexture, DepthFormat, UnsignedShortType } from 'three';
4
4
  import { extend, useThree, useFrame } from '@react-three/fiber';
5
5
  import mergeRefs from 'react-merge-refs';
6
6
  import { BlurPass } from '../materials/BlurPass.js';
@@ -108,7 +108,6 @@ const Reflector = /*#__PURE__*/React.forwardRef(({
108
108
  const parameters = {
109
109
  minFilter: LinearFilter,
110
110
  magFilter: LinearFilter,
111
- format: RGBFormat,
112
111
  encoding: gl.outputEncoding
113
112
  };
114
113
  const fbo1 = new WebGLRenderTarget(resolution, resolution, parameters);
@@ -1 +1 @@
1
- "use strict";function e(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("three"));const r=new t.Matrix4,n=new t.Matrix4,i=[],s=new t.Mesh;class o extends t.Group{constructor(){super(),this.color=new t.Color("white"),this.instance={current:void 0},this.instanceKey={current:void 0}}get geometry(){var e;return null==(e=this.instance.current)?void 0:e.geometry}raycast(e,t){const o=this.instance.current;if(!o)return;if(!o.geometry||!o.material)return;s.geometry=o.geometry;const c=o.matrixWorld;let a=o.userData.instances.indexOf(this.instanceKey);if(-1!==a){o.getMatrixAt(a,r),n.multiplyMatrices(c,r),s.matrixWorld=n,s.raycast(e,i);for(let e=0,r=i.length;e<r;e++){const r=i[e];r.instanceId=a,r.object=this,t.push(r)}i.length=0}}}exports.Position=o;
1
+ "use strict";function e(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("three"));const r=new t.Matrix4,n=new t.Matrix4,i=[],s=new t.Mesh;class o extends t.Group{constructor(){super(),this.color=new t.Color("white"),this.instance={current:void 0},this.instanceKey={current:void 0}}get geometry(){var e;return null==(e=this.instance.current)?void 0:e.geometry}raycast(e,t){const o=this.instance.current;if(!o)return;if(!o.geometry||!o.material)return;s.geometry=o.geometry;const c=o.matrixWorld;let a=o.userData.instances.indexOf(this.instanceKey);if(!(-1===a||a>o.count)){o.getMatrixAt(a,r),n.multiplyMatrices(c,r),s.matrixWorld=n,s.raycast(e,i);for(let e=0,r=i.length;e<r;e++){const r=i[e];r.instanceId=a,r.object=this,t.push(r)}i.length=0}}}exports.Position=o;
@@ -34,8 +34,9 @@ class Position extends THREE.Group {
34
34
  if (!parent.geometry || !parent.material) return;
35
35
  _mesh.geometry = parent.geometry;
36
36
  const matrixWorld = parent.matrixWorld;
37
- let instanceId = parent.userData.instances.indexOf(this.instanceKey);
38
- if (instanceId === -1) return; // calculate the world matrix for each instance
37
+ let instanceId = parent.userData.instances.indexOf(this.instanceKey); // If the instance wasn't found or exceeds the parents draw range, bail out
38
+
39
+ if (instanceId === -1 || instanceId > parent.count) return; // calculate the world matrix for each instance
39
40
 
40
41
  parent.getMatrixAt(instanceId, _instanceLocalMatrix);
41
42
 
package/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("react-dom"),n=require("three"),o=require("@react-three/fiber"),a=require("zustand"),s=require("react-merge-refs"),i=require("@react-spring/three"),l=require("@use-gesture/react"),u=require("three-stdlib"),c=require("zustand/shallow"),d=require("troika-three-text"),m=require("lodash.omit"),f=require("lodash.pick"),p=require("stats.js"),h=require("detect-gpu"),v=require("use-asset"),g=require("three-mesh-bvh"),x=require("react-composer");function y(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function w(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var E=y(e),b=w(t),M=w(r),S=w(n),T=y(a),R=y(s),C=y(c),L=y(m),_=y(f),P=y(p),D=y(x);const z=new n.Vector3,B=new n.Vector3,U=new n.Vector3;function A(e,t,r){const n=z.setFromMatrixPosition(e.matrixWorld);n.project(t);const o=r.width/2,a=r.height/2;return[n.x*o+o,-n.y*a+a]}const F=e=>Math.abs(e)<1e-10?0:e;function k(e,t,r=""){let n="matrix3d(";for(let r=0;16!==r;r++)n+=F(t[r]*e.elements[r])+(15!==r?",":")");return r+n}const j=(V=[1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1],e=>k(e,V));var V;const I=(e,t)=>{return k(e,[1/(r=t),1/r,1/r,1,-1/r,-1/r,-1/r,-1,1/r,1/r,1/r,1,1,1,1,1],"translate(-50%,-50%)");var r},O=b.forwardRef((({children:e,eps:t=.001,style:r,className:a,prepend:s,center:i,fullscreen:l,portal:u,distanceFactor:c,sprite:d=!1,transform:m=!1,occlude:f,onOcclude:p,zIndexRange:h=[16777271,0],calculatePosition:v=A,as:g="div",wrapperClass:x,pointerEvents:y="auto",...w},S)=>{var T;const R=o.useThree((({gl:e})=>e)),C=o.useThree((({camera:e})=>e)),L=o.useThree((({scene:e})=>e)),_=o.useThree((({size:e})=>e)),P=o.useThree((({raycaster:e})=>e)),[D]=b.useState((()=>document.createElement(g))),k=b.useRef(null),V=b.useRef(0),O=b.useRef([0,0]),G=b.useRef(null),W=b.useRef(null),N=null!==(T=null==u?void 0:u.current)&&void 0!==T?T:R.domElement.parentNode;b.useEffect((()=>{if(k.current){if(L.updateMatrixWorld(),m)D.style.cssText="position:absolute;top:0;left:0;pointer-events:none;overflow:hidden;";else{const e=v(k.current,C,_);D.style.cssText=`position:absolute;top:0;left:0;transform:translate3d(${e[0]}px,${e[1]}px,0);transform-origin:0 0;`}return N&&(s?N.prepend(D):N.appendChild(D)),()=>{N&&N.removeChild(D),M.unmountComponentAtNode(D)}}}),[N,m]),b.useLayoutEffect((()=>{x&&(D.className=x)}),[x]);const H=b.useMemo((()=>m?{position:"absolute",top:0,left:0,width:_.width,height:_.height,transformStyle:"preserve-3d",pointerEvents:"none"}:{position:"absolute",transform:i?"translate3d(-50%,-50%,0)":"none",...l&&{top:-_.height/2,left:-_.width/2,width:_.width,height:_.height},...r}),[r,i,l,_,m]),$=b.useMemo((()=>({position:"absolute",pointerEvents:y})),[y]);b.useLayoutEffect((()=>{m?M.render(b.createElement("div",{ref:G,style:H},b.createElement("div",{ref:W,style:$},b.createElement("div",{ref:S,className:a,style:r,children:e}))),D):M.render(b.createElement("div",{ref:S,style:H,className:a,children:e}),D)}));const q=b.useRef(!0);return o.useFrame((()=>{if(k.current){C.updateMatrixWorld(),k.current.updateWorldMatrix(!0,!1);const e=m?O.current:v(k.current,C,_);if(m||Math.abs(V.current-C.zoom)>t||Math.abs(O.current[0]-e[0])>t||Math.abs(O.current[1]-e[1])>t){const t=function(e,t){const r=z.setFromMatrixPosition(e.matrixWorld),n=B.setFromMatrixPosition(t.matrixWorld),o=r.sub(n),a=t.getWorldDirection(U);return o.angleTo(a)>Math.PI/2}(k.current,C);let r=!1;"boolean"==typeof f?!0===f&&(r=[L]):Array.isArray(f)&&(r=f.map((e=>e.current)));const o=q.current;if(r){const e=function(e,t,r,n){const o=z.setFromMatrixPosition(e.matrixWorld),a=o.clone();a.project(t),r.setFromCamera(a,t);const s=r.intersectObjects(n,!0);if(s.length){const e=s[0].distance;return o.distanceTo(r.ray.origin)<e}return!0}(k.current,C,P,r);q.current=e&&!t}else q.current=!t;if(o!==q.current&&(p?p(!q.current):D.style.display=q.current?"block":"none"),D.style.zIndex=`${function(e,t,r){if(t instanceof n.PerspectiveCamera||t instanceof n.OrthographicCamera){const n=z.setFromMatrixPosition(e.matrixWorld),o=B.setFromMatrixPosition(t.matrixWorld),a=n.distanceTo(o),s=(r[1]-r[0])/(t.far-t.near),i=r[1]-s*t.far;return Math.round(s*a+i)}}(k.current,C,h)}`,m){const[e,t]=[_.width/2,_.height/2],r=C.projectionMatrix.elements[5]*t,{isOrthographicCamera:n,top:o,left:a,bottom:s,right:i}=C,l=j(C.matrixWorldInverse),u=n?`scale(${r})translate(${F(-(i+a)/2)}px,${F((o+s)/2)}px)`:`translateZ(${r}px)`;let m=k.current.matrixWorld;d&&(m=C.matrixWorldInverse.clone().transpose().copyPosition(m).scale(k.current.scale),m.elements[3]=m.elements[7]=m.elements[11]=0,m.elements[15]=1),D.style.width=_.width+"px",D.style.height=_.height+"px",D.style.perspective=n?"":`${r}px`,G.current&&W.current&&(G.current.style.transform=`${u}${l}translate(${e}px,${t}px)`,W.current.style.transform=I(m,1/((c||10)/400)))}else{const t=void 0===c?1:function(e,t){if(t instanceof n.OrthographicCamera)return t.zoom;if(t instanceof n.PerspectiveCamera){const r=z.setFromMatrixPosition(e.matrixWorld),n=B.setFromMatrixPosition(t.matrixWorld),o=t.fov*Math.PI/180,a=r.distanceTo(n);return 1/(2*Math.tan(o/2)*a)}return 1}(k.current,C)*c;D.style.transform=`translate3d(${e[0]}px,${e[1]}px,0) scale(${t})`}O.current=e,V.current=C.zoom}}})),b.createElement("group",E.default({},w,{ref:k}))}));let G=0;const W=T.default((e=>(n.DefaultLoadingManager.onStart=(t,r,n)=>{e({active:!0,item:t,loaded:r,total:n,progress:(r-G)/(n-G)*100})},n.DefaultLoadingManager.onLoad=()=>{e({active:!1})},n.DefaultLoadingManager.onError=t=>e((e=>({errors:[...e.errors,t]}))),n.DefaultLoadingManager.onProgress=(t,r,n)=>{r===n&&(G=n),e({active:!0,item:t,loaded:r,total:n,progress:(r-G)/(n-G)*100||100})},{errors:[],active:!1,progress:0,item:"",loaded:0,total:0}))),N=e=>`Loading ${e.toFixed(2)}%`;const H={container:{position:"absolute",top:0,left:0,width:"100%",height:"100%",background:"#171717",display:"flex",alignItems:"center",justifyContent:"center",transition:"opacity 300ms ease",zIndex:1e3},inner:{width:100,height:3,background:"#272727",textAlign:"center"},bar:{height:3,width:"100%",background:"white",transition:"transform 200ms",transformOrigin:"left center"},data:{display:"inline-block",position:"relative",fontVariantNumeric:"tabular-nums",marginTop:"0.8em",color:"#f0f0f0",fontSize:"0.6em",fontFamily:'-apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", "Helvetica Neue", Helvetica, Arial, Roboto, Ubuntu, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',whiteSpace:"nowrap"}},$=b.createContext(null);function q(){return b.useContext($)}const X=b.forwardRef((({children:e},t)=>{const r=b.useRef(null),n=q(),{width:a,height:s}=o.useThree((e=>e.viewport));return o.useFrame((()=>{r.current.position.x=n.horizontal?-a*(n.pages-1)*n.offset:0,r.current.position.y=n.horizontal?0:s*(n.pages-1)*n.offset})),b.createElement("group",{ref:R.default([t,r])},e)})),Z=b.forwardRef((({children:e,style:t,...r},n)=>{const a=q(),s=b.useRef(null),{width:i,height:l}=o.useThree((e=>e.size)),u=b.useContext(o.context);return o.useFrame((()=>{a.delta>a.eps&&(s.current.style.transform=`translate3d(${a.horizontal?-i*(a.pages-1)*a.offset:0}px,${a.horizontal?0:l*(a.pages-1)*-a.offset}px,0)`)})),M.render(b.createElement("div",E.default({ref:R.default([n,s]),style:{...t,position:"absolute",top:0,left:0,willChange:"transform"}},r),b.createElement($.Provider,{value:a},b.createElement(o.context.Provider,{value:u},e))),a.fixed),null})),Y=b.forwardRef((({html:e,...t},r)=>{const n=e?Z:X;return b.createElement(n,E.default({ref:r},t))}));const K=b.createContext([]);const Q=b.forwardRef((function({follow:e=!0,lockX:t=!1,lockY:r=!1,lockZ:n=!1,...a},s){const i=b.useRef();return o.useFrame((({camera:o})=>{if(!e||!i.current)return;const a=i.current.rotation.clone();i.current.quaternion.copy(o.quaternion),t&&(i.current.rotation.x=a.x),r&&(i.current.rotation.y=a.y),n&&(i.current.rotation.z=a.z)})),b.createElement("group",E.default({ref:R.default([i,s])},a))})),J=b.forwardRef((function({points:e,color:t="black",vertexColors:r,lineWidth:o,dashed:a,...s},i){const[l]=b.useState((()=>new u.Line2)),[c]=b.useState((()=>new u.LineMaterial)),[d]=b.useState((()=>new n.Vector2(512,512))),m=b.useMemo((()=>{const t=new u.LineGeometry,o=e.map((e=>e instanceof n.Vector3?e.toArray():e));if(t.setPositions(o.flat()),r){const e=r.map((e=>e instanceof n.Color?e.toArray():e));t.setColors(e.flat())}return t}),[e,r]);return b.useLayoutEffect((()=>{l.computeLineDistances()}),[e,l]),b.useLayoutEffect((()=>{a?c.defines.USE_DASH="":delete c.defines.USE_DASH,c.needsUpdate=!0}),[a,c]),b.useEffect((()=>()=>m.dispose()),[m]),b.createElement("primitive",E.default({object:l,ref:i},s),b.createElement("primitive",{object:m,attach:"geometry"}),b.createElement("primitive",E.default({object:c,attach:"material",color:t,vertexColors:Boolean(r),resolution:d,linewidth:o,dashed:a},s)))})),ee=new n.Vector3,te=b.forwardRef((function({start:e=[0,0,0],end:t=[0,0,0],mid:r,segments:o=20,...a},s){const i=b.useRef(null),[l]=b.useState((()=>new n.QuadraticBezierCurve3(void 0,void 0,void 0))),u=b.useCallback(((e,t,r,o=20)=>(e instanceof n.Vector3?l.v0.copy(e):l.v0.set(...e),t instanceof n.Vector3?l.v2.copy(t):l.v2.set(...t),r instanceof n.Vector3?l.v1.copy(r):l.v1.copy(l.v0.clone().add(l.v2.clone().sub(l.v0)).add(ee.set(0,l.v0.y-l.v2.y,0))),l.getPoints(o))),[]);b.useLayoutEffect((()=>{i.current.setPoints=(e,t,r)=>{const n=u(e,t,r);i.current.geometry&&i.current.geometry.setPositions(n.map((e=>e.toArray())).flat())}}),[]);const c=b.useMemo((()=>u(e,t,r,o)),[e,t,r,o]);return b.createElement(J,E.default({ref:R.default([i,s]),points:c},a))})),re=b.forwardRef((function({start:e,end:t,midA:r,midB:o,segments:a=20,...s},i){const l=b.useMemo((()=>{const s=e instanceof n.Vector3?e:new n.Vector3(...e),i=t instanceof n.Vector3?t:new n.Vector3(...t),l=r instanceof n.Vector3?r:new n.Vector3(...r),u=o instanceof n.Vector3?o:new n.Vector3(...o);return new n.CubicBezierCurve3(s,l,u,i).getPoints(a)}),[e,t,r,o,a]);return b.createElement(J,E.default({ref:i,points:l},s))})),ne=b.forwardRef((({url:e,distance:t=1,loop:r=!0,autoplay:a,...s},i)=>{const l=b.useRef(),u=o.useThree((({camera:e})=>e)),[c]=b.useState((()=>new n.AudioListener)),d=o.useLoader(n.AudioLoader,e);return b.useEffect((()=>{const e=l.current;e&&(e.setBuffer(d),e.setRefDistance(t),e.setLoop(r),a&&!e.isPlaying&&e.play())}),[d,u,t,r]),b.useEffect((()=>{const e=l.current;return u.add(c),()=>{u.remove(c),e&&(e.isPlaying&&e.stop(),e.source&&e.source._connected&&e.disconnect())}}),[]),b.createElement("positionalAudio",E.default({ref:R.default([l,i]),args:[c]},s))})),oe=b.forwardRef((({anchorX:e="center",anchorY:t="middle",children:r,onSync:n,...a},s)=>{const i=o.useThree((({invalidate:e})=>e)),[l]=b.useState((()=>new d.Text)),[u,c]=b.useMemo((()=>{const e=[];let t="";return b.Children.forEach(r,(r=>{"string"==typeof r||"number"==typeof r?t+=r:e.push(r)})),[e,t]}),[r]);return b.useLayoutEffect((()=>{l.sync((()=>{i(),n&&n(l)}))})),b.useEffect((()=>()=>l.dispose()),[l]),b.createElement("primitive",E.default({object:l,ref:s,text:c,anchorX:e,anchorY:t},a),u)}));o.extend({EffectComposer:u.EffectComposer,RenderPass:u.RenderPass,ShaderPass:u.ShaderPass});const ae=()=>{try{var e=document.createElement("canvas");return!(!window.WebGL2RenderingContext||!e.getContext("webgl2"))}catch(e){return!1}},se=b.forwardRef((({children:e,multisamping:t=8,renderIndex:r=1,disableGamma:a=!1,disableRenderPass:s=!1,...i},l)=>{const c=b.useRef(),d=o.useThree((({scene:e})=>e)),m=o.useThree((({camera:e})=>e)),f=o.useThree((({gl:e})=>e)),p=o.useThree((({size:e})=>e)),[h]=b.useState((()=>{if(ae()&&t>0){const e=new n.WebGLMultisampleRenderTarget(p.width,p.height,{format:n.RGBAFormat,encoding:n.sRGBEncoding});return e.samples=8,e}}));return b.useEffect((()=>{var e,t;null==(e=c.current)||e.setSize(p.width,p.height),null==(t=c.current)||t.setPixelRatio(f.getPixelRatio())}),[f,p]),o.useFrame((()=>{var e;return null==(e=c.current)?void 0:e.render()}),r),b.createElement("effectComposer",E.default({ref:R.default([l,c]),args:[f,h]},i),!s&&b.createElement("renderPass",{attachArray:"passes",args:[d,m]}),!a&&b.createElement("shaderPass",{attachArray:"passes",args:[u.GammaCorrectionShader]}),e)}));function ie(e,t,r,n){return class extends S.ShaderMaterial{constructor(){const o=Object.entries(e);super({uniforms:o.reduce(((e,[t,r])=>({...e,...S.UniformsUtils.clone({[t]:{value:r}})})),{}),vertexShader:t,fragmentShader:r}),o.forEach((([e])=>Object.defineProperty(this,e,{get:()=>this.uniforms[e].value,set:t=>this.uniforms[e].value=t}))),n&&n(this)}}}const le=e=>e===Object(e)&&!Array.isArray(e)&&"function"!=typeof e;function ue(e){const r=o.useThree((e=>e.gl)),a=o.useLoader(n.TextureLoader,le(e)?Object.values(e):e);if(t.useEffect((()=>{(Array.isArray(a)?a:[a]).forEach(r.initTexture)}),[r,a]),le(e)){const t=Object.keys(e),r={};return t.forEach((e=>Object.assign(r,{[e]:a[t.indexOf(e)]}))),r}return a}ue.preload=e=>o.useLoader.preload(n.TextureLoader,e),ue.clear=e=>o.useLoader.clear(n.TextureLoader,e);const ce=ie({color:new S.Color("white"),scale:[1,1],imageBounds:[1,1],map:null,zoom:1,grayscale:0},"\n varying vec2 vUv;\n void main() {\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);\n vUv = uv;\n }\n","\n // mostly from https://gist.github.com/statico/df64c5d167362ecf7b34fca0b1459a44\n varying vec2 vUv;\n uniform vec2 scale;\n uniform vec2 imageBounds;\n uniform vec3 color;\n uniform sampler2D map;\n uniform float zoom;\n uniform float grayscale;\n const vec3 luma = vec3(.299, 0.587, 0.114);\n vec4 toGrayscale(vec4 color, float intensity) {\n return vec4(mix(color.rgb, vec3(dot(color.rgb, luma)), intensity), color.a);\n }\n vec2 aspect(vec2 size) {\n return size / min(size.x, size.y);\n }\n void main() {\n vec2 s = aspect(scale);\n vec2 i = aspect(imageBounds);\n float rs = s.x / s.y;\n float ri = i.x / i.y;\n vec2 new = rs < ri ? vec2(i.x * s.y / i.y, s.y) : vec2(s.x, i.y * s.x / i.x);\n vec2 offset = (rs < ri ? vec2((new.x - s.x) / 2.0, 0.0) : vec2(0.0, (new.y - s.y) / 2.0)) / new;\n vec2 uv = vUv * s / new + offset;\n vec2 zUv = (uv - vec2(0.5, 0.5)) / zoom + vec2(0.5, 0.5);\n gl_FragColor = toGrayscale(texture2D(map, zUv) * vec4(color, 1.0), grayscale);\n }\n"),de=b.forwardRef((({children:e,color:t,segments:r=1,scale:n=1,zoom:a=1,grayscale:s=0,url:i,...l},u)=>{o.extend({ImageMaterial:ce});const c=ue(i),d=Array.isArray(n)?[n[0],n[1]]:[n,n],m=[c.image.width,c.image.height];return b.createElement("mesh",E.default({ref:u,scale:n},l),b.createElement("planeGeometry",{args:[1,1,r,r]}),b.createElement("imageMaterial",{color:t,map:c,zoom:a,grayscale:s,scale:d,imageBounds:m}),e)}));const me=b.forwardRef((({makeDefault:e,...t},r)=>{const n=o.useThree((({set:e})=>e)),a=o.useThree((({camera:e})=>e)),s=o.useThree((({size:e})=>e)),i=b.useRef();return b.useLayoutEffect((()=>{i.current&&!t.manual&&i.current.updateProjectionMatrix()}),[s,t]),b.useLayoutEffect((()=>{if(e&&i.current){const e=a;return n((()=>({camera:i.current}))),()=>n((()=>({camera:e})))}}),[a,i,e,n]),b.createElement("orthographicCamera",E.default({left:s.width/-2,right:s.width/2,top:s.height/2,bottom:s.height/-2,ref:R.default([i,r])},t))})),fe=b.forwardRef((({makeDefault:e,...t},r)=>{const n=o.useThree((({set:e})=>e)),a=o.useThree((({camera:e})=>e)),s=o.useThree((({size:e})=>e)),i=b.useRef();return b.useLayoutEffect((()=>{const{current:e}=i;e&&!t.manual&&(e.aspect=s.width/s.height,e.updateProjectionMatrix())}),[s,t]),b.useLayoutEffect((()=>{if(e&&i.current){const e=a;return n((()=>({camera:i.current}))),()=>n((()=>({camera:e})))}}),[a,i,e,n]),b.createElement("perspectiveCamera",E.default({ref:R.default([i,r])},t))}));const pe=b.forwardRef(((e,t)=>{const{camera:r,onChange:n,...a}=e,s=o.useThree((({camera:e})=>e)),i=o.useThree((({invalidate:e})=>e)),l=r||s,[c]=b.useState((()=>new u.DeviceOrientationControls(l)));return b.useEffect((()=>{const e=e=>{i(),n&&n(e)};return null==c||null==c.addEventListener||c.addEventListener("change",e),()=>null==c||null==c.removeEventListener?void 0:c.removeEventListener("change",e)}),[n,c,i]),o.useFrame((()=>null==c?void 0:c.update())),b.useEffect((()=>{const e=c;return null==e||e.connect(),()=>null==e?void 0:e.dispose()}),[c]),c?b.createElement("primitive",E.default({ref:t,dispose:void 0,object:c},a)):null})),he=b.forwardRef(((e,t)=>{const{onChange:r,...n}=e,a=o.useThree((({invalidate:e})=>e)),s=o.useThree((({camera:e})=>e)),i=o.useThree((({gl:e})=>e)),[l]=b.useState((()=>new u.FlyControls(s,i.domElement)));return b.useEffect((()=>{const e=e=>{a(),r&&r(e)};return null==l||null==l.addEventListener||l.addEventListener("change",e),()=>null==l||null==l.removeEventListener?void 0:l.removeEventListener("change",e)}),[r,l,a]),o.useFrame(((e,t)=>null==l?void 0:l.update(t))),l?b.createElement("primitive",E.default({ref:t,dispose:void 0,object:l},n)):null})),ve=b.forwardRef(((e={enableDamping:!0},t)=>{const{camera:r,onChange:n,onStart:a,onEnd:s,...i}=e,l=o.useThree((({invalidate:e})=>e)),c=o.useThree((({camera:e})=>e)),d=o.useThree((({gl:e})=>e.domElement)),m=r||c,f=b.useMemo((()=>new u.MapControls(m)),[m]);return b.useEffect((()=>{f.connect(d);const e=e=>{l(),n&&n(e)};return f.addEventListener("change",e),a&&f.addEventListener("start",a),s&&f.addEventListener("end",s),()=>{f.dispose(),f.removeEventListener("change",e),a&&f.removeEventListener("start",a),s&&f.removeEventListener("end",s)}}),[n,a,s,f,l,d]),o.useFrame((()=>f.update())),b.createElement("primitive",E.default({ref:t,dispose:void 0,object:f,enableDamping:!0},i))})),ge=t.forwardRef((({makeDefault:e,camera:r,regress:n,domElement:a,enableDamping:s=!0,onChange:i,onStart:l,onEnd:c,...d},m)=>{const f=o.useThree((({invalidate:e})=>e)),p=o.useThree((({camera:e})=>e)),h=o.useThree((({gl:e})=>e)),v=o.useThree((({events:e})=>e)),g=o.useThree((({set:e})=>e)),x=o.useThree((({get:e})=>e)),y=o.useThree((({performance:e})=>e)),w=r||p,M=a||("boolean"!=typeof v.connected?v.connected:h.domElement),S=t.useMemo((()=>new u.OrbitControls(w)),[w]);return o.useFrame((()=>{S.enabled&&S.update()})),t.useEffect((()=>{const e=e=>{f(),n&&y.regress(),i&&i(e)};return S.connect(M),S.addEventListener("change",e),l&&S.addEventListener("start",l),c&&S.addEventListener("end",c),()=>{S.removeEventListener("change",e),l&&S.removeEventListener("start",l),c&&S.removeEventListener("end",c),S.dispose()}}),[M,i,l,c,n,S,f]),t.useEffect((()=>{if(e){const e=x().controls;return g({controls:S}),()=>g({controls:e})}}),[e,S]),b.createElement("primitive",E.default({ref:m,object:S,enableDamping:s},d))})),xe=b.forwardRef((({makeDefault:e,camera:t,domElement:r,regress:n,onChange:a,onStart:s,onEnd:i,...l},c)=>{const{invalidate:d,camera:m,gl:f,events:p,set:h,get:v,performance:g,viewport:x}=o.useThree(),y=t||m,w=r||("boolean"!=typeof p.connected?p.connected:f.domElement),M=b.useMemo((()=>new u.TrackballControls(y)),[y]);return o.useFrame((()=>{M.enabled&&M.update()})),b.useEffect((()=>{const e=e=>{d(),n&&g.regress(),a&&a(e)};return M.connect(w),M.addEventListener("change",e),s&&M.addEventListener("start",s),i&&M.addEventListener("end",i),()=>{M.removeEventListener("change",e),s&&M.removeEventListener("start",s),i&&M.removeEventListener("end",i),M.dispose()}}),[w,a,s,i,n,M,d]),b.useEffect((()=>{M.handleResize()}),[x]),b.useEffect((()=>{if(e){const e=v().controls;return h({controls:M}),()=>h({controls:e})}}),[e,M]),b.createElement("primitive",E.default({ref:c,object:M},l))})),ye=t.forwardRef((({camera:e,makeDefault:r,regress:n,domElement:a,onChange:s,onStart:i,onEnd:l,...c},d)=>{const m=o.useThree((({invalidate:e})=>e)),f=o.useThree((({camera:e})=>e)),p=o.useThree((({gl:e})=>e)),h=o.useThree((({events:e})=>e)),v=o.useThree((({set:e})=>e)),g=o.useThree((({get:e})=>e)),x=o.useThree((({performance:e})=>e)),y=e||f,w=a||("boolean"!=typeof h.connected?h.connected:p.domElement),M=t.useMemo((()=>new u.ArcballControls(y)),[y]);return o.useFrame((()=>{M.enabled&&M.update()})),t.useEffect((()=>{const e=e=>{m(),n&&x.regress(),s&&s(e)};return M.connect(w),M.addEventListener("change",e),i&&M.addEventListener("start",i),l&&M.addEventListener("end",l),()=>{M.removeEventListener("change",e),i&&M.removeEventListener("start",i),l&&M.removeEventListener("end",l),M.dispose()}}),[w,s,i,l,n,M,m]),t.useEffect((()=>{if(r){const e=g().controls;return v({controls:M}),()=>v({controls:e})}}),[r,M]),b.createElement("primitive",E.default({ref:d,object:M},c))})),we=b.forwardRef((({children:e,domElement:t,onChange:r,onMouseDown:n,onMouseUp:a,onObjectChange:s,object:i,...l},c)=>{const d=["enabled","axis","mode","translationSnap","rotationSnap","scaleSnap","space","size","showX","showY","showZ"],{camera:m,...f}=l,p=_.default(f,d),h=L.default(f,d),v=o.useThree((e=>e.controls)),g=o.useThree((({gl:e})=>e)),x=o.useThree((({camera:e})=>e)),y=o.useThree((({invalidate:e})=>e)),w=m||x,M=b.useMemo((()=>new u.TransformControls(w,t||g.domElement)),[w,t,g.domElement]),T=b.useRef();return b.useLayoutEffect((()=>{i?null==M||M.attach(i instanceof S.Object3D?i:i.current):null==M||M.attach(T.current)}),[i,e,M]),b.useEffect((()=>{if(v){const e=e=>v.enabled=!e.value;return M.addEventListener("dragging-changed",e),()=>M.removeEventListener("dragging-changed",e)}}),[M,v]),b.useEffect((()=>{const e=e=>{y(),r&&r(e)};return null==M||null==M.addEventListener||M.addEventListener("change",e),n&&(null==M||null==M.addEventListener||M.addEventListener("mouseDown",n)),a&&(null==M||null==M.addEventListener||M.addEventListener("mouseUp",a)),s&&(null==M||null==M.addEventListener||M.addEventListener("objectChange",s)),()=>{null==M||null==M.removeEventListener||M.removeEventListener("change",e),n&&(null==M||null==M.removeEventListener||M.removeEventListener("mouseDown",n)),a&&(null==M||null==M.removeEventListener||M.removeEventListener("mouseUp",a)),s&&(null==M||null==M.removeEventListener||M.removeEventListener("objectChange",s))}}),[r,n,a,s,M,y]),M?b.createElement(b.Fragment,null,b.createElement("primitive",E.default({ref:c,dispose:void 0,object:M},p)),b.createElement("group",E.default({ref:T},h),e)):null})),Ee=b.forwardRef((({selector:e,onChange:t,onLock:r,onUnlock:n,...a},s)=>{const{camera:i,...l}=a,c=o.useThree((({gl:e})=>e)),d=o.useThree((({camera:e})=>e)),m=o.useThree((({invalidate:e})=>e)),f=i||d,[p]=b.useState((()=>new u.PointerLockControls(f,c.domElement)));return b.useEffect((()=>{const e=e=>{m(),t&&t(e)};return null==p||null==p.addEventListener||p.addEventListener("change",e),r&&(null==p||null==p.addEventListener||p.addEventListener("lock",r)),n&&(null==p||null==p.addEventListener||p.addEventListener("unlock",n)),()=>{null==p||null==p.removeEventListener||p.removeEventListener("change",e),r&&(null==p||null==p.addEventListener||p.addEventListener("lock",r)),n&&(null==p||null==p.addEventListener||p.addEventListener("unlock",n))}}),[t,r,n,p,m]),b.useEffect((()=>{const t=()=>null==p?void 0:p.lock(),r=e?Array.from(document.querySelectorAll(e)):[document];return r.forEach((e=>e&&e.addEventListener("click",t))),()=>{r.forEach((e=>e?e.removeEventListener("click",t):void 0))}}),[p,e]),p?b.createElement("primitive",E.default({ref:s,dispose:void 0,object:p},l)):null})),be=b.forwardRef(((e,t)=>{const r=o.useThree((({camera:e})=>e)),n=o.useThree((({gl:e})=>e)),[a]=b.useState((()=>new u.FirstPersonControls(r,n.domElement)));return o.useFrame(((e,t)=>{a.update(t)})),a?b.createElement("primitive",E.default({ref:t,object:a},e)):null}));function Me(e,t){const r=o.useThree((e=>e.mouse)),[a]=b.useState((()=>{const a=new n.Raycaster;return t&&o.applyProps(a,t,{}),function(t,o){a.setFromCamera(r,e instanceof n.Camera?e:e.current);const s=this.constructor.prototype.raycast.bind(this);s&&s(a,o)}}));return a}const Se=b.createContext({}),Te=()=>b.useContext(Se),Re=2*Math.PI,Ce=new n.Object3D,Le=new n.Matrix4,[_e,Pe]=[new n.Quaternion,new n.Quaternion],De=new n.Vector3,ze=new n.Vector3,Be="#f0f0f0",Ue="#999",Ae="black",Fe="black",ke=["Right","Left","Top","Bottom","Front","Back"],je=e=>new n.Vector3(...e).multiplyScalar(.38),Ve=[[1,1,1],[1,1,-1],[1,-1,1],[1,-1,-1],[-1,1,1],[-1,1,-1],[-1,-1,1],[-1,-1,-1]].map(je),Ie=[.25,.25,.25],Oe=[[1,1,0],[1,0,1],[1,0,-1],[1,-1,0],[0,1,1],[0,1,-1],[0,-1,1],[0,-1,-1],[-1,1,0],[-1,0,1],[-1,0,-1],[-1,-1,0]].map(je),Ge=Oe.map((e=>e.toArray().map((e=>0==e?.5:.25)))),We=({hover:e,index:t,font:r="20px Inter var, Arial, sans-serif",faces:a=ke,color:s=Be,hoverColor:i=Ue,textColor:l=Ae,strokeColor:u=Fe,opacity:c=1})=>{const d=o.useThree((e=>e.gl)),m=b.useMemo((()=>{const e=document.createElement("canvas");e.width=128,e.height=128;const o=e.getContext("2d");return o.fillStyle=s,o.fillRect(0,0,e.width,e.height),o.strokeStyle=u,o.strokeRect(0,0,e.width,e.height),o.font=r,o.textAlign="center",o.fillStyle=l,o.fillText(a[t].toUpperCase(),64,76),new n.CanvasTexture(e)}),[t,a,r,s,l,u]);return b.createElement("meshLambertMaterial",{map:m,"map-anisotropy":d.capabilities.getMaxAnisotropy()||1,attachArray:"material",color:e?i:"white",transparent:!0,opacity:c})},Ne=e=>{const{tweenCamera:t,raycast:r}=Te(),[n,o]=b.useState(null);return b.createElement("mesh",{raycast:r,onPointerOut:e=>{e.stopPropagation(),o(null)},onPointerMove:e=>{e.stopPropagation(),o(Math.floor(e.faceIndex/2))},onClick:e.onClick||(e=>{e.stopPropagation(),t(e.face.normal)})},[...Array(6)].map(((t,r)=>b.createElement(We,E.default({key:r,index:r,hover:n===r},e)))),b.createElement("boxGeometry",null))},He=({onClick:e,dimensions:t,position:r,hoverColor:n=Ue})=>{const{tweenCamera:o,raycast:a}=Te(),[s,i]=b.useState(!1);return b.createElement("mesh",{scale:1.01,position:r,raycast:a,onPointerOver:e=>{e.stopPropagation(),i(!0)},onPointerOut:e=>{e.stopPropagation(),i(!1)},onClick:e||(e=>{e.stopPropagation(),o(r)})},b.createElement("meshBasicMaterial",{color:s?n:"white",transparent:!0,opacity:.6,visible:s}),b.createElement("boxGeometry",{args:t}))};function $e({scale:e=[.8,.05,.05],color:t,rotation:r}){return b.createElement("group",{rotation:r},b.createElement("mesh",{position:[.4,0,0]},b.createElement("boxGeometry",{args:e}),b.createElement("meshBasicMaterial",{color:t,toneMapped:!1})))}function qe({onClick:e,font:t,disabled:r,arcStyle:a,label:s,labelColor:i,axisHeadScale:l=1,...u}){const c=o.useThree((e=>e.gl)),d=b.useMemo((()=>{const e=document.createElement("canvas");e.width=64,e.height=64;const r=e.getContext("2d");return r.beginPath(),r.arc(32,32,16,0,2*Math.PI),r.closePath(),r.fillStyle=a,r.fill(),s&&(r.font=t,r.textAlign="center",r.fillStyle=i,r.fillText(s,32,41)),new n.CanvasTexture(e)}),[a,s,i,t]),[m,f]=b.useState(!1),p=(s?1:.75)*(m?1.2:1)*l;return b.createElement("sprite",E.default({scale:p,onPointerOver:r?void 0:e=>{e.stopPropagation(),f(!0)},onPointerOut:r?void 0:e||(e=>{e.stopPropagation(),f(!1)})},u),b.createElement("spriteMaterial",{map:d,"map-anisotropy":c.capabilities.getMaxAnisotropy()||1,alphaTest:.3,opacity:s?1:.75,toneMapped:!1}))}function Xe(e,{path:t}){const[r]=o.useLoader(n.CubeTextureLoader,[e],(e=>e.setPath(t)));return r}function Ze(e){return o.useLoader(u.FBXLoader,e)}Xe.preload=(e,{path:t})=>o.useLoader.preload(n.CubeTextureLoader,[e],(e=>e.setPath(t))),Ze.preload=e=>o.useLoader.preload(u.FBXLoader,e),Ze.clear=e=>o.useLoader.clear(u.FBXLoader,e);let Ye=null;function Ke(e,t,r){return n=>{r&&r(n),e&&(Ye||(Ye=new u.DRACOLoader),Ye.setDecoderPath("string"==typeof e?e:"https://www.gstatic.com/draco/versioned/decoders/1.4.3/"),n.setDRACOLoader(Ye)),t&&n.setMeshoptDecoder("function"==typeof u.MeshoptDecoder?u.MeshoptDecoder():u.MeshoptDecoder)}}function Qe(e,t=!0,r=!0,n){return o.useLoader(u.GLTFLoader,e,Ke(t,r,n))}Qe.preload=(e,t=!0,r=!0,n)=>o.useLoader.preload(u.GLTFLoader,e,Ke(t,r,n)),Qe.clear=e=>o.useLoader.clear(u.GLTFLoader,e);const Je="https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master";function et(e,r=`${Je}/basis/`){const n=o.useThree((e=>e.gl)),a=o.useLoader(u.KTX2Loader,le(e)?Object.values(e):e,(e=>{e.detectSupport(n),e.setTranscoderPath(r)}));if(t.useEffect((()=>{(Array.isArray(a)?a:[a]).forEach(n.initTexture)}),[n,a]),le(e)){const t=Object.keys(e),r={};return t.forEach((e=>Object.assign(r,{[e]:a[t.indexOf(e)]}))),r}return a}function tt(e,t){"function"==typeof e?e(t):null!=e&&(e.current=t)}function rt(e,r,n){const a=o.useThree((({gl:e})=>e)),s=o.useThree((({size:e})=>e)),i=t.useMemo((()=>a.getPixelRatio()),[a]),l="number"==typeof e?e:s.width*i,u="number"==typeof r?r:s.height*i,c=("number"==typeof e?n:e)||{},d=t.useMemo((()=>{const{multisample:e,samples:t,...r}=c;let n;return e&&a.capabilities.isWebGL2?(n=new S.WebGLMultisampleRenderTarget(l,u,r),t&&(n.samples=t)):n=new S.WebGLRenderTarget(l,u,r),n}),[]);return t.useEffect((()=>{d.setSize(l,u)}),[d,l,u]),t.useEffect((()=>()=>d.dispose()),[]),d}et.preload=(e,t=`${Je}/basis/`)=>o.useLoader.preload(u.KTX2Loader,e,(e=>{e.setTranscoderPath(t)})),et.clear=e=>o.useLoader.clear(u.KTX2Loader,e);const nt=b.forwardRef((({children:e,curve:t},r)=>{const[n,o]=b.useState(),a=b.useRef(),s=b.useRef();return b.useImperativeHandle(r,(()=>({moveAlongCurve:e=>{var t;null==(t=s.current)||t.moveAlongCurve(e)}}))),b.useEffect((()=>{!s.current&&a.current&&r&&(s.current=new u.Flow(a.current),o(s.current.object3D))}),[e,r]),b.useEffect((()=>{var e;a.current&&t&&(null==(e=s.current)||e.updateCurve(0,t))}),[t]),n?b.createElement("primitive",{object:n}):b.cloneElement(b.Children.only(e),{ref:a})}));class ot extends n.MeshPhysicalMaterial{constructor(e={}){super(e),this.setValues(e),this._time={value:0},this._distort={value:.4},this._radius={value:1}}onBeforeCompile(e){e.uniforms.time=this._time,e.uniforms.radius=this._radius,e.uniforms.distort=this._distort,e.vertexShader=`\n uniform float time;\n uniform float radius;\n uniform float distort;\n #define GLSLIFY 1\nvec3 mod289(vec3 x){return x-floor(x*(1.0/289.0))*289.0;}vec4 mod289(vec4 x){return x-floor(x*(1.0/289.0))*289.0;}vec4 permute(vec4 x){return mod289(((x*34.0)+1.0)*x);}vec4 taylorInvSqrt(vec4 r){return 1.79284291400159-0.85373472095314*r;}float snoise(vec3 v){const vec2 C=vec2(1.0/6.0,1.0/3.0);const vec4 D=vec4(0.0,0.5,1.0,2.0);vec3 i=floor(v+dot(v,C.yyy));vec3 x0=v-i+dot(i,C.xxx);vec3 g=step(x0.yzx,x0.xyz);vec3 l=1.0-g;vec3 i1=min(g.xyz,l.zxy);vec3 i2=max(g.xyz,l.zxy);vec3 x1=x0-i1+C.xxx;vec3 x2=x0-i2+C.yyy;vec3 x3=x0-D.yyy;i=mod289(i);vec4 p=permute(permute(permute(i.z+vec4(0.0,i1.z,i2.z,1.0))+i.y+vec4(0.0,i1.y,i2.y,1.0))+i.x+vec4(0.0,i1.x,i2.x,1.0));float n_=0.142857142857;vec3 ns=n_*D.wyz-D.xzx;vec4 j=p-49.0*floor(p*ns.z*ns.z);vec4 x_=floor(j*ns.z);vec4 y_=floor(j-7.0*x_);vec4 x=x_*ns.x+ns.yyyy;vec4 y=y_*ns.x+ns.yyyy;vec4 h=1.0-abs(x)-abs(y);vec4 b0=vec4(x.xy,y.xy);vec4 b1=vec4(x.zw,y.zw);vec4 s0=floor(b0)*2.0+1.0;vec4 s1=floor(b1)*2.0+1.0;vec4 sh=-step(h,vec4(0.0));vec4 a0=b0.xzyw+s0.xzyw*sh.xxyy;vec4 a1=b1.xzyw+s1.xzyw*sh.zzww;vec3 p0=vec3(a0.xy,h.x);vec3 p1=vec3(a0.zw,h.y);vec3 p2=vec3(a1.xy,h.z);vec3 p3=vec3(a1.zw,h.w);vec4 norm=taylorInvSqrt(vec4(dot(p0,p0),dot(p1,p1),dot(p2,p2),dot(p3,p3)));p0*=norm.x;p1*=norm.y;p2*=norm.z;p3*=norm.w;vec4 m=max(0.6-vec4(dot(x0,x0),dot(x1,x1),dot(x2,x2),dot(x3,x3)),0.0);m=m*m;return 42.0*dot(m*m,vec4(dot(p0,x0),dot(p1,x1),dot(p2,x2),dot(p3,x3)));}\n ${e.vertexShader}\n `,e.vertexShader=e.vertexShader.replace("#include <begin_vertex>","\n float updateTime = time / 50.0;\n float noise = snoise(vec3(position / 2.0 + updateTime * 5.0));\n vec3 transformed = vec3(position * (noise * pow(distort, 2.0) + radius));\n ")}get time(){return this._time.value}set time(e){this._time.value=e}get distort(){return this._distort.value}set distort(e){this._distort.value=e}get radius(){return this._radius.value}set radius(e){this._radius.value=e}}const at=b.forwardRef((({speed:e=1,...t},r)=>{const[n]=b.useState((()=>new ot));return o.useFrame((t=>n&&(n.time=t.clock.getElapsedTime()*e))),b.createElement("primitive",E.default({dispose:void 0,object:n,ref:r,attach:"material"},t))}));class st extends n.MeshStandardMaterial{constructor(e={}){super(e),this.setValues(e),this._time={value:0},this._factor={value:1}}onBeforeCompile(e){e.uniforms.time=this._time,e.uniforms.factor=this._factor,e.vertexShader=`\n uniform float time;\n uniform float factor;\n ${e.vertexShader}\n `,e.vertexShader=e.vertexShader.replace("#include <begin_vertex>","float theta = sin( time + position.y ) / 2.0 * factor;\n float c = cos( theta );\n float s = sin( theta );\n mat3 m = mat3( c, 0, s, 0, 1, 0, -s, 0, c );\n vec3 transformed = vec3( position ) * m;\n vNormal = vNormal * m;")}get time(){return this._time.value}set time(e){this._time.value=e}get factor(){return this._factor.value}set factor(e){this._factor.value=e}}const it=b.forwardRef((({speed:e=1,...t},r)=>{const[n]=b.useState((()=>new st));return o.useFrame((t=>n&&(n.time=t.clock.getElapsedTime()*e))),b.createElement("primitive",E.default({dispose:void 0,object:n,ref:r,attach:"material"},t))}));class lt extends n.ShaderMaterial{constructor(e=new n.Vector2){super({uniforms:{inputBuffer:new n.Uniform(null),depthBuffer:new n.Uniform(null),resolution:new n.Uniform(new n.Vector2),texelSize:new n.Uniform(new n.Vector2),halfTexelSize:new n.Uniform(new n.Vector2),kernel:new n.Uniform(0),scale:new n.Uniform(1),cameraNear:new n.Uniform(0),cameraFar:new n.Uniform(1),minDepthThreshold:new n.Uniform(0),maxDepthThreshold:new n.Uniform(1),depthScale:new n.Uniform(0),depthToBlurRatioBias:new n.Uniform(.25)},fragmentShader:"#include <common>\n #include <dithering_pars_fragment> \n uniform sampler2D inputBuffer;\n uniform sampler2D depthBuffer;\n uniform float cameraNear;\n uniform float cameraFar;\n uniform float minDepthThreshold;\n uniform float maxDepthThreshold;\n uniform float depthScale;\n uniform float depthToBlurRatioBias;\n varying vec2 vUv;\n varying vec2 vUv0;\n varying vec2 vUv1;\n varying vec2 vUv2;\n varying vec2 vUv3;\n\n void main() {\n float depthFactor = 0.0;\n \n #ifdef USE_DEPTH\n vec4 depth = texture2D(depthBuffer, vUv);\n depthFactor = smoothstep(minDepthThreshold, maxDepthThreshold, 1.0-(depth.r * depth.a));\n depthFactor *= depthScale;\n depthFactor = max(0.0, min(1.0, depthFactor + 0.25));\n #endif\n \n vec4 sum = texture2D(inputBuffer, mix(vUv0, vUv, depthFactor));\n sum += texture2D(inputBuffer, mix(vUv1, vUv, depthFactor));\n sum += texture2D(inputBuffer, mix(vUv2, vUv, depthFactor));\n sum += texture2D(inputBuffer, mix(vUv3, vUv, depthFactor));\n gl_FragColor = sum * 0.25 ;\n\n #include <dithering_fragment>\n }",vertexShader:"uniform vec2 texelSize;\n uniform vec2 halfTexelSize;\n uniform float kernel;\n uniform float scale;\n varying vec2 vUv;\n varying vec2 vUv0;\n varying vec2 vUv1;\n varying vec2 vUv2;\n varying vec2 vUv3;\n\n void main() {\n vec2 uv = position.xy * 0.5 + 0.5;\n vUv = uv;\n\n vec2 dUv = (texelSize * vec2(kernel) + halfTexelSize) * scale;\n vUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\n vUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\n vUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\n vUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\n\n gl_Position = vec4(position.xy, 1.0, 1.0);\n }",blending:n.NoBlending,depthWrite:!1,depthTest:!1}),this.toneMapped=!1,this.setTexelSize(e.x,e.y),this.kernel=new Float32Array([0,1,2,2,3])}setTexelSize(e,t){this.uniforms.texelSize.value.set(e,t),this.uniforms.halfTexelSize.value.set(e,t).multiplyScalar(.5)}setResolution(e){this.uniforms.resolution.value.copy(e)}}class ut{constructor({gl:e,resolution:t,width:r=500,height:o=500,minDepthThreshold:a=0,maxDepthThreshold:s=1,depthScale:i=0,depthToBlurRatioBias:l=.25}){this.renderToScreen=!1,this.renderTargetA=new n.WebGLRenderTarget(t,t,{minFilter:n.LinearFilter,magFilter:n.LinearFilter,stencilBuffer:!1,depthBuffer:!1,encoding:e.outputEncoding}),this.renderTargetB=this.renderTargetA.clone(),this.convolutionMaterial=new lt,this.convolutionMaterial.setTexelSize(1/r,1/o),this.convolutionMaterial.setResolution(new n.Vector2(r,o)),this.scene=new n.Scene,this.camera=new n.Camera,this.convolutionMaterial.uniforms.minDepthThreshold.value=a,this.convolutionMaterial.uniforms.maxDepthThreshold.value=s,this.convolutionMaterial.uniforms.depthScale.value=i,this.convolutionMaterial.uniforms.depthToBlurRatioBias.value=l,this.convolutionMaterial.defines.USE_DEPTH=i>0;const u=new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),c=new Float32Array([0,0,2,0,0,2]),d=new n.BufferGeometry;d.setAttribute("position",new n.BufferAttribute(u,3)),d.setAttribute("uv",new n.BufferAttribute(c,2)),this.screen=new n.Mesh(d,this.convolutionMaterial),this.screen.frustumCulled=!1,this.scene.add(this.screen)}render(e,t,r){const n=this.scene,o=this.camera,a=this.renderTargetA,s=this.renderTargetB;let i=this.convolutionMaterial,l=i.uniforms;l.depthBuffer.value=t.depthTexture;const u=i.kernel;let c,d,m,f=t;for(d=0,m=u.length-1;d<m;++d)c=0==(1&d)?a:s,l.kernel.value=u[d],l.inputBuffer.value=f.texture,e.setRenderTarget(c),e.render(n,o),f=c;l.kernel.value=u[d],l.inputBuffer.value=f.texture,e.setRenderTarget(this.renderToScreen?null:r),e.render(n,o)}}class ct extends n.MeshStandardMaterial{constructor(e={}){super(e),this._debug={value:0},this._tDepth={value:null},this._distortionMap={value:null},this._tDiffuse={value:null},this._tDiffuseBlur={value:null},this._textureMatrix={value:null},this._hasBlur={value:!1},this._mirror={value:0},this._mixBlur={value:0},this._blurStrength={value:.5},this._minDepthThreshold={value:.9},this._maxDepthThreshold={value:1},this._depthScale={value:0},this._depthToBlurRatioBias={value:.25},this._distortion={value:1},this._mixContrast={value:1},this.setValues(e)}onBeforeCompile(e){var t;null!=(t=e.defines)&&t.USE_UV||(e.defines.USE_UV=""),e.uniforms.debug=this._debug,e.uniforms.hasBlur=this._hasBlur,e.uniforms.tDiffuse=this._tDiffuse,e.uniforms.tDepth=this._tDepth,e.uniforms.distortionMap=this._distortionMap,e.uniforms.tDiffuseBlur=this._tDiffuseBlur,e.uniforms.textureMatrix=this._textureMatrix,e.uniforms.mirror=this._mirror,e.uniforms.mixBlur=this._mixBlur,e.uniforms.mixStrength=this._blurStrength,e.uniforms.minDepthThreshold=this._minDepthThreshold,e.uniforms.maxDepthThreshold=this._maxDepthThreshold,e.uniforms.depthScale=this._depthScale,e.uniforms.depthToBlurRatioBias=this._depthToBlurRatioBias,e.uniforms.distortion=this._distortion,e.uniforms.mixContrast=this._mixContrast,e.vertexShader=`\n uniform mat4 textureMatrix;\n varying vec4 my_vUv; \n ${e.vertexShader}`,e.vertexShader=e.vertexShader.replace("#include <project_vertex>","#include <project_vertex>\n my_vUv = textureMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );"),e.fragmentShader=`\n uniform int debug;\n uniform sampler2D tDiffuse;\n uniform sampler2D tDiffuseBlur;\n uniform sampler2D tDepth;\n uniform sampler2D distortionMap;\n uniform float distortion;\n uniform float cameraNear;\n\t\t\t uniform float cameraFar;\n uniform bool hasBlur;\n uniform float mixBlur;\n uniform float mirror;\n uniform float mixStrength;\n uniform float minDepthThreshold;\n uniform float maxDepthThreshold;\n uniform float mixContrast;\n uniform float depthScale;\n uniform float depthToBlurRatioBias;\n varying vec4 my_vUv; \n ${e.fragmentShader}`,e.fragmentShader=e.fragmentShader.replace("#include <emissivemap_fragment>","#include <emissivemap_fragment>\n \n float distortionFactor = 0.0;\n #ifdef USE_DISTORTION\n distortionFactor = texture2D(distortionMap, vUv).r * distortion;\n #endif\n\n vec4 new_vUv = my_vUv;\n new_vUv.x += distortionFactor;\n new_vUv.y += distortionFactor;\n\n vec4 base = texture2DProj(tDiffuse, new_vUv);\n vec4 blur = texture2DProj(tDiffuseBlur, new_vUv);\n \n vec4 merge = base;\n \n #ifdef USE_NORMALMAP\n vec2 normal_uv = vec2(0.0);\n vec4 normalColor = texture2D(normalMap, vUv * normalScale);\n vec3 my_normal = normalize( vec3( normalColor.r * 2.0 - 1.0, normalColor.b, normalColor.g * 2.0 - 1.0 ) );\n vec3 coord = new_vUv.xyz / new_vUv.w;\n normal_uv = coord.xy + coord.z * my_normal.xz * 0.05;\n vec4 base_normal = texture2D(tDiffuse, normal_uv);\n vec4 blur_normal = texture2D(tDiffuseBlur, normal_uv);\n merge = base_normal;\n blur = blur_normal;\n #endif\n\n float depthFactor = 0.0001;\n float blurFactor = 0.0;\n\n #ifdef USE_DEPTH\n vec4 depth = texture2DProj(tDepth, new_vUv);\n depthFactor = smoothstep(minDepthThreshold, maxDepthThreshold, 1.0-(depth.r * depth.a));\n depthFactor *= depthScale;\n depthFactor = max(0.0001, min(1.0, depthFactor));\n\n #ifdef USE_BLUR\n blur = blur * min(1.0, depthFactor + depthToBlurRatioBias);\n merge = merge * min(1.0, depthFactor + 0.5);\n #else\n merge = merge * depthFactor;\n #endif\n \n #endif\n\n float reflectorRoughnessFactor = roughness;\n #ifdef USE_ROUGHNESSMAP\n vec4 reflectorTexelRoughness = texture2D( roughnessMap, vUv );\n reflectorRoughnessFactor *= reflectorTexelRoughness.g;\n #endif\n \n #ifdef USE_BLUR\n blurFactor = min(1.0, mixBlur * reflectorRoughnessFactor);\n merge = mix(merge, blur, blurFactor);\n #endif\n\n vec4 newMerge = vec4(0.0, 0.0, 0.0, 1.0);\n newMerge.r = (merge.r - 0.5) * mixContrast + 0.5;\n newMerge.g = (merge.g - 0.5) * mixContrast + 0.5;\n newMerge.b = (merge.b - 0.5) * mixContrast + 0.5;\n\n diffuseColor.rgb = diffuseColor.rgb * ((1.0 - min(1.0, mirror)) + newMerge.rgb * mixStrength); \n diffuseColor = sRGBToLinear(diffuseColor);\n \n if (debug == 1) {\n diffuseColor = sRGBToLinear(vec4(vec3(depthFactor), 1.0));\n }\n if (debug == 2) {\n diffuseColor = sRGBToLinear(vec4(vec3(blurFactor), 1.0));\n }\n if (debug == 3) {\n diffuseColor = sRGBToLinear(texture2DProj(tDiffuse, new_vUv));\n }\n if (debug == 4) {\n diffuseColor = sRGBToLinear(texture2DProj(tDiffuseBlur, new_vUv));\n }\n ")}get tDiffuse(){return this._tDiffuse.value}set tDiffuse(e){this._tDiffuse.value=e}get tDepth(){return this._tDepth.value}set tDepth(e){this._tDepth.value=e}get distortionMap(){return this._distortionMap.value}set distortionMap(e){this._distortionMap.value=e}get tDiffuseBlur(){return this._tDiffuseBlur.value}set tDiffuseBlur(e){this._tDiffuseBlur.value=e}get textureMatrix(){return this._textureMatrix.value}set textureMatrix(e){this._textureMatrix.value=e}get hasBlur(){return this._hasBlur.value}set hasBlur(e){this._hasBlur.value=e}get mirror(){return this._mirror.value}set mirror(e){this._mirror.value=e}get mixBlur(){return this._mixBlur.value}set mixBlur(e){this._mixBlur.value=e}get mixStrength(){return this._blurStrength.value}set mixStrength(e){this._blurStrength.value=e}get minDepthThreshold(){return this._minDepthThreshold.value}set minDepthThreshold(e){this._minDepthThreshold.value=e}get maxDepthThreshold(){return this._maxDepthThreshold.value}set maxDepthThreshold(e){this._maxDepthThreshold.value=e}get depthScale(){return this._depthScale.value}set depthScale(e){this._depthScale.value=e}get debug(){return this._debug.value}set debug(e){this._debug.value=e}get depthToBlurRatioBias(){return this._depthToBlurRatioBias.value}set depthToBlurRatioBias(e){this._depthToBlurRatioBias.value=e}get distortion(){return this._distortion.value}set distortion(e){this._distortion.value=e}get mixContrast(){return this._mixContrast.value}set mixContrast(e){this._mixContrast.value=e}}o.extend({MeshReflectorMaterialImpl:ct});const dt=b.forwardRef((({mixBlur:e=0,mixStrength:t=1,resolution:r=256,blur:a=[0,0],minDepthThreshold:s=.9,maxDepthThreshold:i=1,depthScale:l=0,depthToBlurRatioBias:u=.25,mirror:c=0,debug:d=0,distortion:m=1,mixContrast:f=1,distortionMap:p,...h},v)=>{const g=o.useThree((({gl:e})=>e)),x=o.useThree((({camera:e})=>e)),y=o.useThree((({scene:e})=>e)),w=(a=Array.isArray(a)?a:[a,a])[0]+a[1]>0,M=b.useRef(null),[S]=b.useState((()=>new n.Plane)),[T]=b.useState((()=>new n.Vector3)),[C]=b.useState((()=>new n.Vector3)),[L]=b.useState((()=>new n.Vector3)),[_]=b.useState((()=>new n.Matrix4)),[P]=b.useState((()=>new n.Vector3(0,0,-1))),[D]=b.useState((()=>new n.Vector4)),[z]=b.useState((()=>new n.Vector3)),[B]=b.useState((()=>new n.Vector3)),[U]=b.useState((()=>new n.Vector4)),[A]=b.useState((()=>new n.Matrix4)),[F]=b.useState((()=>new n.PerspectiveCamera)),k=b.useCallback((()=>{var e;const t=M.current.parent||(null==(e=M.current)?void 0:e.__r3f.parent);if(!t)return;if(C.setFromMatrixPosition(t.matrixWorld),L.setFromMatrixPosition(x.matrixWorld),_.extractRotation(t.matrixWorld),T.set(0,0,1),T.applyMatrix4(_),z.subVectors(C,L),z.dot(T)>0)return;z.reflect(T).negate(),z.add(C),_.extractRotation(x.matrixWorld),P.set(0,0,-1),P.applyMatrix4(_),P.add(L),B.subVectors(C,P),B.reflect(T).negate(),B.add(C),F.position.copy(z),F.up.set(0,1,0),F.up.applyMatrix4(_),F.up.reflect(T),F.lookAt(B),F.far=x.far,F.updateMatrixWorld(),F.projectionMatrix.copy(x.projectionMatrix),A.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),A.multiply(F.projectionMatrix),A.multiply(F.matrixWorldInverse),A.multiply(t.matrixWorld),S.setFromNormalAndCoplanarPoint(T,C),S.applyMatrix4(F.matrixWorldInverse),D.set(S.normal.x,S.normal.y,S.normal.z,S.constant);const r=F.projectionMatrix;U.x=(Math.sign(D.x)+r.elements[8])/r.elements[0],U.y=(Math.sign(D.y)+r.elements[9])/r.elements[5],U.z=-1,U.w=(1+r.elements[10])/r.elements[14],D.multiplyScalar(2/D.dot(U)),r.elements[2]=D.x,r.elements[6]=D.y,r.elements[10]=D.z+1,r.elements[14]=D.w}),[x]),[j,V,I,O]=b.useMemo((()=>{const o={minFilter:n.LinearFilter,magFilter:n.LinearFilter,format:n.RGBFormat,encoding:g.outputEncoding},h=new n.WebGLRenderTarget(r,r,o);h.depthBuffer=!0,h.depthTexture=new n.DepthTexture(r,r),h.depthTexture.format=n.DepthFormat,h.depthTexture.type=n.UnsignedShortType;const v=new n.WebGLRenderTarget(r,r,o);return[h,v,new ut({gl:g,resolution:r,width:a[0],height:a[1],minDepthThreshold:s,maxDepthThreshold:i,depthScale:l,depthToBlurRatioBias:u}),{mirror:c,textureMatrix:A,mixBlur:e,tDiffuse:h.texture,tDepth:h.depthTexture,tDiffuseBlur:v.texture,hasBlur:w,mixStrength:t,minDepthThreshold:s,maxDepthThreshold:i,depthScale:l,depthToBlurRatioBias:u,transparent:!0,debug:d,distortion:m,distortionMap:p,mixContrast:f,"defines-USE_BLUR":w?"":void 0,"defines-USE_DEPTH":l>0?"":void 0,"defines-USE_DISTORTION":p?"":void 0}]}),[g,a,A,r,c,w,e,t,s,i,l,u,d,m,p,f]);return o.useFrame((()=>{var e;const t=M.current.parent||(null==(e=M.current)?void 0:e.__r3f.parent);if(!t)return;t.visible=!1;const r=g.xr.enabled,n=g.shadowMap.autoUpdate;k(),g.xr.enabled=!1,g.shadowMap.autoUpdate=!1,g.setRenderTarget(j),g.state.buffers.depth.setMask(!0),g.autoClear||g.clear(),g.render(y,F),w&&I.render(g,j,V),g.xr.enabled=r,g.shadowMap.autoUpdate=n,t.visible=!0,g.setRenderTarget(null)})),b.createElement("meshReflectorMaterialImpl",E.default({attach:"material",key:"key"+O["defines-USE_BLUR"]+O["defines-USE_DEPTH"]+O["defines-USE_DISTORTION"],ref:R.default([M,v])},O,h))}));class mt extends S.ShaderMaterial{constructor(){super({transparent:!0,uniforms:{size:{value:1}},vertexShader:S.ShaderLib.points.vertexShader,fragmentShader:"\n varying vec3 vColor;\n void main() {\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\n float r = dot(cxy, cxy);\n float delta = fwidth(r);\n vec3 color = vColor;\n #ifdef TONE_MAPPING\n color = toneMapping(color);\n #endif\n gl_FragColor = linearToOutputTexel(vec4(color, 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r)));\n }",vertexColors:!0})}get scale(){return this.uniforms.size.value}set scale(e){this.uniforms.size.value=e}}const ft=b.forwardRef(((e,t)=>{const[r]=b.useState((()=>new mt));return b.createElement("primitive",E.default({object:r,ref:t,attach:"material"},e))}));let pt=!1;function ht(e){const t=e+"BufferGeometry";return b.forwardRef((({args:e,children:r,...n},o)=>b.createElement("mesh",E.default({ref:o},n),b.createElement(t,{attach:"geometry",args:e}),r)))}const vt=ht("box"),gt=ht("circle"),xt=ht("cone"),yt=ht("cylinder"),wt=ht("sphere"),Et=ht("plane"),bt=ht("tube"),Mt=ht("torus"),St=ht("torusKnot"),Tt=ht("tetrahedron"),Rt=ht("ring"),Ct=ht("polyhedron"),Lt=ht("icosahedron"),_t=ht("octahedron"),Pt=ht("dodecahedron"),Dt=ht("extrude"),zt=ht("lathe"),Bt=1e-5;const Ut=b.forwardRef((function({args:[e=1,t=1,r=1]=[],radius:o=.05,smoothness:a=4,children:s,...i},l){const u=b.useMemo((()=>function(e,t,r){const o=new n.Shape,a=r-Bt;return o.absarc(Bt,Bt,Bt,-Math.PI/2,-Math.PI,!0),o.absarc(Bt,t-2*a,Bt,Math.PI,Math.PI/2,!0),o.absarc(e-2*a,t-2*a,Bt,Math.PI/2,0,!0),o.absarc(e-2*a,Bt,Bt,0,-Math.PI/2,!0),o}(e,t,o)),[e,t,o]),c=b.useMemo((()=>({depth:r-2*o,bevelEnabled:!0,bevelSegments:2*a,steps:1,bevelSize:o-Bt,bevelThickness:o,curveSegments:a})),[r,o,a]),d=b.useRef();return b.useLayoutEffect((()=>{d.current&&d.current.center()}),[u,c]),b.createElement("mesh",E.default({ref:l},i),b.createElement("extrudeBufferGeometry",{attach:"geometry",ref:d,args:[u,c]}),s)}));function At(){const e=new S.BufferGeometry,t=new Float32Array([-1,-1,3,-1,-1,3]);return e.setAttribute("position",new S.BufferAttribute(t,2)),e}const Ft=b.forwardRef((function({children:e,...t},r){const n=b.useMemo(At,[]);return b.createElement("mesh",E.default({ref:r,geometry:n,frustumCulled:!1},t),e)})),kt=b.forwardRef((function({children:e,alignTop:t,...r},o){const a=b.useRef(null),s=b.useRef(null);return b.useLayoutEffect((()=>{a.current.position.set(0,0,0),a.current.updateWorldMatrix(!0,!0);const e=(new n.Box3).setFromObject(s.current),r=new n.Vector3,o=new n.Sphere,i=e.max.y-e.min.y;e.getCenter(r),e.getBoundingSphere(o),a.current.position.set(-r.x,-r.y+(t?i/2:0),-r.z)}),[e]),b.createElement("group",E.default({ref:o},r),b.createElement("group",{ref:a},b.createElement("group",{ref:s},e)))})),jt=e=>e&&e.isOrthographicCamera,Vt=b.createContext(null);const It=b.forwardRef((({intensity:e=1,decay:t,decayRate:r=.65,maxYaw:n=.1,maxPitch:a=.1,maxRoll:s=.1,yawFrequency:i=.1,pitchFrequency:l=.1,rollFrequency:c=.1,controls:d},m)=>{const f=o.useThree((e=>e.camera)),p=o.useThree((e=>e.controls)),h=b.useRef(e),v=b.useRef(f.rotation.clone()),[g]=b.useState((()=>new u.SimplexNoise)),[x]=b.useState((()=>new u.SimplexNoise)),[y]=b.useState((()=>new u.SimplexNoise)),w=()=>{(h.current<0||h.current>1)&&(h.current=h.current<0?0:1)};return b.useImperativeHandle(m,(()=>({getIntensity:()=>h.current,setIntensity:e=>{h.current=e,w()}})),[]),b.useEffect((()=>{const e=p||(null==d?void 0:d.current),t=()=>{v.current=f.rotation.clone()};return null==e||e.addEventListener("change",t),()=>{null==e||e.removeEventListener("change",t)}}),[d,p]),o.useFrame((({clock:e},o)=>{const u=Math.pow(h.current,2),d=n*u*g.noise(e.elapsedTime*i,1),m=a*u*x.noise(e.elapsedTime*l,1),p=s*u*y.noise(e.elapsedTime*c,1);f.rotation.set(v.current.x+m,v.current.y+d,v.current.z+p),t&&h.current>0&&(h.current-=r*o,w())})),null}));const Ot={sunset:"venice_sunset_1k.hdr",dawn:"kiara_1_dawn_1k.hdr",night:"dikhololo_night_1k.hdr",warehouse:"empty_warehouse_01_1k.hdr",forest:"forest_slope_1k.hdr",apartment:"lebombo_1k.hdr",studio:"studio_small_03_1k.hdr",city:"potsdamer_platz_1k.hdr",park:"rooitou_park_1k.hdr",lobby:"st_fagans_interior_1k.hdr"};function Gt({background:e=!1,files:t=["/px.png","/nx.png","/py.png","/ny.png","/pz.png","/nz.png"],path:r="",preset:a,scene:s,extensions:i}){if(a){if(!(a in Ot))throw new Error("Preset must be one of: "+Object.keys(Ot).join(", "));t=Ot[a],r="https://rawcdn.githack.com/pmndrs/drei-assets/aa3600359ba664d546d05821bcbca42013587df2/hdri/"}const l=o.useThree((({scene:e})=>e)),c=Array.isArray(t),d=c?n.CubeTextureLoader:u.RGBELoader,m=o.useLoader(d,c?[t]:t,(e=>{e.setPath(r),null==e.setDataType||e.setDataType(n.FloatType),i&&i(e)})),f=c?m[0]:m;return f.mapping=n.EquirectangularReflectionMapping,b.useLayoutEffect((()=>{const t=s?s.background:l.background,r=s?s.environment:l.environment;return s?(s.environment=f,e&&(s.background=f)):(l.environment=f,e&&(l.background=f)),()=>{s?(s.environment=r,s.background=t):(l.environment=r,l.background=t),f.dispose()}}),[f,e,s]),null}const Wt=b.forwardRef((({scale:e,frames:t=1/0,opacity:r=1,width:n=1,height:a=1,blur:s=1,far:i=10,resolution:l=256,...c},d)=>{const m=o.useThree((({scene:e})=>e)),f=o.useThree((({gl:e})=>e)),p=b.useRef();n*=Array.isArray(e)?e[0]:e||1,a*=Array.isArray(e)?e[1]:e||1;const[h,v,g,x,y,w,M]=b.useMemo((()=>{const e=new S.WebGLRenderTarget(l,l),t=new S.WebGLRenderTarget(l,l);t.texture.generateMipmaps=e.texture.generateMipmaps=!1;const r=new S.PlaneBufferGeometry(n,a).rotateX(Math.PI/2),o=new S.Mesh(r),s=new S.MeshDepthMaterial;s.depthTest=s.depthWrite=!1,s.onBeforeCompile=e=>e.fragmentShader=e.fragmentShader.replace("1.0 - fragCoordZ ), opacity );","0.0 ), ( 1.0 - fragCoordZ ) * 1.0 );");const i=new S.ShaderMaterial(u.HorizontalBlurShader),c=new S.ShaderMaterial(u.VerticalBlurShader);return c.depthTest=i.depthTest=!1,[e,r,s,o,i,c,t]}),[l,n,a,e]);let T=0;return o.useFrame((()=>{if(p.current&&(t===1/0||T<t)){const e=m.background;m.background=null,m.overrideMaterial=g,f.setRenderTarget(h),f.render(m,p.current),m.overrideMaterial=null,x.material=y,x.material.uniforms.tDiffuse.value=h.texture,y.uniforms.h.value=s/256,f.setRenderTarget(M),f.render(x,p.current),x.material=w,x.material.uniforms.tDiffuse.value=M.texture,w.uniforms.v.value=s/256,f.setRenderTarget(h),f.render(x,p.current),f.setRenderTarget(null),m.background=e,T++}})),b.createElement("group",E.default({"rotation-x":Math.PI/2},c,{ref:d}),b.createElement("mesh",{geometry:v,scale:[1,-1,1],rotation:[-Math.PI/2,0,0]},b.createElement("meshBasicMaterial",{map:h.texture,transparent:!0,opacity:r})),b.createElement("orthographicCamera",{ref:p,args:[-n/2,n/2,a/2,-a/2,0,i]}))})),Nt={rembrandt:{main:[1,2,1],fill:[-2,-.5,-2]},portrait:{main:[-1,2,.5],fill:[-1,.5,-1.5]},upfront:{main:[0,2,1],fill:[-1,.5,-1.5]},soft:{main:[-2,4,4],fill:[-1,.5,-1.5]}};const Ht=e=>0===e?0:Math.pow(2,10*e-10);const $t=b.forwardRef((({fog:e=!1,colorStop:t=0,color:r="black",opacity:o=.5,...a},s)=>{const i=b.useMemo((()=>{const e=document.createElement("canvas");e.width=128,e.height=128;const o=e.getContext("2d"),a=o.createRadialGradient(e.width/2,e.height/2,0,e.width/2,e.height/2,e.width/2);return a.addColorStop(t,new n.Color(r).getStyle()),a.addColorStop(1,"rgba(0,0,0,0)"),o.fillStyle=a,o.fillRect(0,0,e.width,e.height),e}),[r,t]);return b.createElement("mesh",E.default({ref:s},a),b.createElement("planeBufferGeometry",{attach:"geometry",args:[1,1]}),b.createElement("meshBasicMaterial",{attach:"material",transparent:!0,opacity:o,fog:e},b.createElement("canvasTexture",{attach:"map",args:[i]})))}));o.extend({MeshReflectorMaterial:ct});const qt=b.forwardRef((({mixBlur:e=0,mixStrength:t=.5,resolution:r=256,blur:a=[0,0],args:s=[1,1],minDepthThreshold:i=.9,maxDepthThreshold:l=1,depthScale:u=0,depthToBlurRatioBias:c=.25,mirror:d=0,children:m,debug:f=0,distortion:p=1,mixContrast:h=1,distortionMap:v,...g},x)=>{b.useEffect((()=>{console.warn("Reflector has been deprecated and will be removed next major. Replace it with <MeshReflectorMaterial />!")}),[]);const y=o.useThree((({gl:e})=>e)),w=o.useThree((({camera:e})=>e)),M=o.useThree((({scene:e})=>e)),S=(a=Array.isArray(a)?a:[a,a])[0]+a[1]>0,T=b.useRef(null),[C]=b.useState((()=>new n.Plane)),[L]=b.useState((()=>new n.Vector3)),[_]=b.useState((()=>new n.Vector3)),[P]=b.useState((()=>new n.Vector3)),[D]=b.useState((()=>new n.Matrix4)),[z]=b.useState((()=>new n.Vector3(0,0,-1))),[B]=b.useState((()=>new n.Vector4)),[U]=b.useState((()=>new n.Vector3)),[A]=b.useState((()=>new n.Vector3)),[F]=b.useState((()=>new n.Vector4)),[k]=b.useState((()=>new n.Matrix4)),[j]=b.useState((()=>new n.PerspectiveCamera)),V=b.useCallback((()=>{if(_.setFromMatrixPosition(T.current.matrixWorld),P.setFromMatrixPosition(w.matrixWorld),D.extractRotation(T.current.matrixWorld),L.set(0,0,1),L.applyMatrix4(D),U.subVectors(_,P),U.dot(L)>0)return;U.reflect(L).negate(),U.add(_),D.extractRotation(w.matrixWorld),z.set(0,0,-1),z.applyMatrix4(D),z.add(P),A.subVectors(_,z),A.reflect(L).negate(),A.add(_),j.position.copy(U),j.up.set(0,1,0),j.up.applyMatrix4(D),j.up.reflect(L),j.lookAt(A),j.far=w.far,j.updateMatrixWorld(),j.projectionMatrix.copy(w.projectionMatrix),k.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),k.multiply(j.projectionMatrix),k.multiply(j.matrixWorldInverse),k.multiply(T.current.matrixWorld),C.setFromNormalAndCoplanarPoint(L,_),C.applyMatrix4(j.matrixWorldInverse),B.set(C.normal.x,C.normal.y,C.normal.z,C.constant);const e=j.projectionMatrix;F.x=(Math.sign(B.x)+e.elements[8])/e.elements[0],F.y=(Math.sign(B.y)+e.elements[9])/e.elements[5],F.z=-1,F.w=(1+e.elements[10])/e.elements[14],B.multiplyScalar(2/B.dot(F)),e.elements[2]=B.x,e.elements[6]=B.y,e.elements[10]=B.z+1,e.elements[14]=B.w}),[]),[I,O,G,W]=b.useMemo((()=>{const o={minFilter:n.LinearFilter,magFilter:n.LinearFilter,format:n.RGBFormat,encoding:y.outputEncoding},s=new n.WebGLRenderTarget(r,r,o);s.depthBuffer=!0,s.depthTexture=new n.DepthTexture(r,r),s.depthTexture.format=n.DepthFormat,s.depthTexture.type=n.UnsignedShortType;const m=new n.WebGLRenderTarget(r,r,o);return[s,m,new ut({gl:y,resolution:r,width:a[0],height:a[1],minDepthThreshold:i,maxDepthThreshold:l,depthScale:u,depthToBlurRatioBias:c}),{mirror:d,textureMatrix:k,mixBlur:e,tDiffuse:s.texture,tDepth:s.depthTexture,tDiffuseBlur:m.texture,hasBlur:S,mixStrength:t,minDepthThreshold:i,maxDepthThreshold:l,depthScale:u,depthToBlurRatioBias:c,transparent:!0,debug:f,distortion:p,distortionMap:v,mixContrast:h,"defines-USE_BLUR":S?"":void 0,"defines-USE_DEPTH":u>0?"":void 0,"defines-USE_DISTORTION":v?"":void 0}]}),[y,a,k,r,d,S,e,t,i,l,u,c,f,p,v,h]);return o.useFrame((()=>{if(null==T||!T.current)return;T.current.visible=!1;const e=y.xr.enabled,t=y.shadowMap.autoUpdate;V(),y.xr.enabled=!1,y.shadowMap.autoUpdate=!1,y.setRenderTarget(I),y.state.buffers.depth.setMask(!0),y.autoClear||y.clear(),y.render(M,j),S&&G.render(y,I,O),y.xr.enabled=e,y.shadowMap.autoUpdate=t,T.current.visible=!0,y.setRenderTarget(null)})),b.createElement("mesh",E.default({ref:R.default([T,x])},g),b.createElement("planeBufferGeometry",{args:s}),m?m("meshReflectorMaterial",W):b.createElement("meshReflectorMaterial",W))}));class Xt extends n.ShaderMaterial{constructor(){super({uniforms:{depth:{value:null},opacity:{value:1},attenuation:{value:2.5},anglePower:{value:12},spotPosition:{value:new n.Vector3(0,0,0)},lightColor:{value:new n.Color("white")},cameraNear:{value:0},cameraFar:{value:1},resolution:{value:new n.Vector2(0,0)}},transparent:!0,depthWrite:!1,vertexShader:"\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n varying float vViewZ;\n varying float vIntensity;\n uniform vec3 spotPosition;\n uniform float attenuation; \n\n void main() {\n // compute intensity\n vNormal = normalize( normalMatrix * normal );\n vec4 worldPosition\t= modelMatrix * vec4( position, 1.0 );\n vWorldPosition = worldPosition.xyz;\n vec4 viewPosition = viewMatrix * worldPosition;\n vViewZ = viewPosition.z;\n float intensity\t= distance(worldPosition.xyz, spotPosition) / attenuation;\n intensity\t= 1.0 - clamp(intensity, 0.0, 1.0);\n vIntensity = intensity; \n // set gl_Position\n gl_Position\t= projectionMatrix * viewPosition;\n\n }",fragmentShader:"\n #include <packing>\n\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n uniform vec3 lightColor;\n uniform vec3 spotPosition;\n uniform float attenuation;\n uniform float anglePower;\n uniform sampler2D depth;\n uniform vec2 resolution;\n uniform float cameraNear;\n uniform float cameraFar;\n varying float vViewZ;\n varying float vIntensity;\n uniform float opacity;\n\n float readDepth( sampler2D depthSampler, vec2 coord ) {\n float fragCoordZ = texture2D( depthSampler, coord ).x;\n float viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\n return viewZ;\n }\n\n void main() {\n float d = 1.0;\n bool isSoft = resolution[0] > 0.0 && resolution[1] > 0.0;\n if (isSoft) {\n vec2 sUv = gl_FragCoord.xy / resolution;\n d = readDepth(depth, sUv);\n }\n float intensity = vIntensity;\n vec3 normal\t= vec3(vNormal.x, vNormal.y, abs(vNormal.z));\n float angleIntensity\t= pow( dot(normal, vec3(0.0, 0.0, 1.0)), anglePower );\n intensity\t*= angleIntensity;\n // fades when z is close to sampled depth, meaning the cone is intersecting existing geometry\n if (isSoft) {\n intensity\t*= smoothstep(0., 1., vViewZ - d);\n }\n gl_FragColor = vec4(lightColor, intensity * opacity);\n }"})}}const Zt=new n.Vector3,Yt=b.forwardRef((({opacity:e=1,radiusTop:t,radiusBottom:r,depthBuffer:a,color:s="white",distance:i=5,angle:l=.15,attenuation:u=5,anglePower:c=5,...d},m)=>{const f=b.useRef(null),p=o.useThree((e=>e.size)),h=o.useThree((e=>e.camera)),v=o.useThree((e=>e.viewport.dpr)),[g]=b.useState((()=>new Xt));t=void 0===t?.1:t,r=void 0===r?7*l:r,o.useFrame((()=>{g.uniforms.spotPosition.value.copy(f.current.getWorldPosition(Zt)),f.current.lookAt(f.current.parent.target.getWorldPosition(Zt))}));const x=b.useMemo((()=>{const e=new n.CylinderGeometry(t,r,i,128,64,!0);return e.applyMatrix4((new n.Matrix4).makeTranslation(0,-i/2,0)),e.applyMatrix4((new n.Matrix4).makeRotationX(-Math.PI/2)),e}),[l,i,t,r]);return b.createElement("spotLight",E.default({ref:m,angle:l,color:s,distance:i},d),b.createElement("mesh",{ref:f,geometry:x,raycast:()=>null},b.createElement("primitive",{object:g,attach:"material","uniforms-opacity-value":e,"uniforms-lightColor-value":s,"uniforms-attenuation-value":u,"uniforms-anglePower-value":c,"uniforms-depth-value":a,"uniforms-cameraNear-value":h.near,"uniforms-cameraFar-value":h.far,"uniforms-resolution-value":a?[p.width*v,p.height*v]:[0,0]})))}));function Kt(e,t,r=new n.Vector3){const o=Math.PI*(e-.5),a=2*Math.PI*(t-.5);return r.x=Math.cos(a),r.y=Math.sin(o),r.z=Math.sin(a),r}const Qt=b.forwardRef((({inclination:e=.6,azimuth:t=.1,distance:r=1e3,mieCoefficient:o=.005,mieDirectionalG:a=.8,rayleigh:s=.5,turbidity:i=10,sunPosition:l=Kt(e,t),...c},d)=>{const m=b.useMemo((()=>(new n.Vector3).setScalar(r)),[r]),[f]=b.useState((()=>new u.Sky));return b.createElement("primitive",E.default({dispose:void 0,object:f,ref:d,"material-uniforms-mieCoefficient-value":o,"material-uniforms-mieDirectionalG-value":a,"material-uniforms-rayleigh-value":s,"material-uniforms-sunPosition-value":l,"material-uniforms-turbidity-value":i,scale:m},c))}));class Jt extends n.ShaderMaterial{constructor(){super({uniforms:{time:{value:0},fade:{value:1}},vertexShader:"\n uniform float time;\n attribute float size;\n varying vec3 vColor;\n void main() {\n vColor = color;\n vec4 mvPosition = modelViewMatrix * vec4(position, 0.5);\n gl_PointSize = size * (30.0 / -mvPosition.z) * (3.0 + sin(mvPosition.x + 2.0 * time + 100.0));\n gl_Position = projectionMatrix * mvPosition;\n }",fragmentShader:"\n uniform sampler2D pointTexture;\n uniform float fade;\n varying vec3 vColor;\n void main() {\n float opacity = 1.0;\n if (fade == 1.0) {\n float d = distance(gl_PointCoord, vec2(0.5, 0.5));\n opacity = 1.0 / (1.0 + exp(16.0 * (d - 0.25)));\n }\n gl_FragColor = vec4(vColor, opacity);\n }"})}}const er=e=>(new n.Vector3).setFromSpherical(new n.Spherical(e,Math.acos(1-2*Math.random()),2*Math.random()*Math.PI)),tr=b.forwardRef((({radius:e=100,depth:t=50,count:r=5e3,saturation:a=0,factor:s=4,fade:i=!1},l)=>{const u=b.useRef(),[c,d,m]=b.useMemo((()=>{const o=[],i=[],l=Array.from({length:r},(()=>(.5+.5*Math.random())*s)),u=new n.Color;let c=e+t;const d=t/r;for(let e=0;e<r;e++)c-=d*Math.random(),o.push(...er(c).toArray()),u.setHSL(e/r,a,.9),i.push(u.r,u.g,u.b);return[new Float32Array(o),new Float32Array(i),new Float32Array(l)]}),[r,t,s,e,a]);o.useFrame((e=>u.current&&(u.current.uniforms.time.value=e.clock.getElapsedTime())));const[f]=b.useState((()=>new Jt));return b.createElement("points",{ref:l},b.createElement("bufferGeometry",{attach:"geometry"},b.createElement("bufferAttribute",{attachObject:["attributes","position"],args:[c,3]}),b.createElement("bufferAttribute",{attachObject:["attributes","color"],args:[d,3]}),b.createElement("bufferAttribute",{attachObject:["attributes","size"],args:[m,1]})),b.createElement("primitive",{dispose:void 0,ref:u,object:f,attach:"material",blending:n.AdditiveBlending,"uniforms-fade-value":i,transparent:!0,vertexColors:!0}))}));const rr=new S.Matrix4,nr=new S.Matrix4,or=[],ar=new S.Mesh;class sr extends S.Group{constructor(){super(),this.color=new S.Color("white"),this.instance={current:void 0},this.instanceKey={current:void 0}}get geometry(){var e;return null==(e=this.instance.current)?void 0:e.geometry}raycast(e,t){const r=this.instance.current;if(!r)return;if(!r.geometry||!r.material)return;ar.geometry=r.geometry;const n=r.matrixWorld;let o=r.userData.instances.indexOf(this.instanceKey);if(-1!==o){r.getMatrixAt(o,rr),nr.multiplyMatrices(n,rr),ar.matrixWorld=nr,ar.raycast(e,or);for(let e=0,r=or.length;e<r;e++){const r=or[e];r.instanceId=o,r.object=this,t.push(r)}or.length=0}}}let ir,lr;const ur=b.createContext(null),cr=new S.Matrix4,dr=new S.Vector3,mr=new S.Color,fr=b.forwardRef((({children:e,range:t,limit:r=1e3,...n},a)=>{const s=b.useRef(null),[i,l]=b.useState([]),[[u,c,d]]=b.useState((()=>[new Float32Array(3*r),Float32Array.from({length:3*r},(()=>1)),Float32Array.from({length:r},(()=>1))]));b.useLayoutEffect((()=>{s.current.geometry.drawRange.count=Math.min(r,void 0!==t?t:r,i.length)}),[i,t]),b.useEffect((()=>{s.current.geometry.attributes.position.needsUpdate=!0})),o.useFrame((()=>{for(s.current.updateMatrix(),s.current.updateMatrixWorld(),cr.copy(s.current.matrixWorld).invert(),ir=0;ir<i.length;ir++)lr=i[ir].current,lr.getWorldPosition(dr).applyMatrix4(cr),dr.x===u[3*ir]&&dr.y===u[3*ir+1]&&dr.z===u[3*ir+2]||(dr.toArray(u,3*ir),s.current.geometry.attributes.position.needsUpdate=!0,lr.matrixWorldNeedsUpdate=!0),lr.color.equals(mr.fromArray(c,3*ir))||(lr.color.toArray(c,3*ir),s.current.geometry.attributes.color.needsUpdate=!0),lr.size!==d[ir]&&(d.set([lr.size],ir),s.current.geometry.attributes.size.needsUpdate=!0)}));const m=b.useMemo((()=>{const e={};for(ir=0;ir<i.length;ir++){var t;Object.assign(e,null==(t=i[ir].current)?void 0:t.__r3f.handlers)}return Object.keys(e).reduce(((e,t)=>({...e,[t]:e=>{var r,n,o;const a=null==(r=i[e.index])?void 0:r.current;return null==a||null==(n=a.__r3f)||null==(o=n.handlers)?void 0:o[t]({...e,object:a})}})),{})}),[e,i]),f=b.useMemo((()=>({subscribe:e=>(l((t=>[...t,e])),()=>l((t=>t.filter((t=>t.current!==e.current)))))})),[]);return b.createElement("points",E.default({matrixAutoUpdate:!1,ref:R.default([a,s])},m,n),b.createElement("bufferGeometry",null,b.createElement("bufferAttribute",{attachObject:["attributes","position"],count:u.length/3,array:u,itemSize:3,usage:S.DynamicDrawUsage}),b.createElement("bufferAttribute",{attachObject:["attributes","color"],count:c.length/3,array:c,itemSize:3,usage:S.DynamicDrawUsage}),b.createElement("bufferAttribute",{attachObject:["attributes","size"],count:d.length,array:d,itemSize:1,usage:S.DynamicDrawUsage})),b.createElement(ur.Provider,{value:f},e))})),pr=b.forwardRef((({children:e,...t},r)=>{b.useMemo((()=>o.extend({Position:sr})),[]);const n=b.useRef(),{subscribe:a}=b.useContext(ur);return b.useLayoutEffect((()=>a(n)),[]),b.createElement("position",E.default({ref:R.default([r,n])},t),e)})),hr=b.forwardRef((({children:e,positions:t,colors:r,sizes:n,stride:a=3,...s},i)=>{const l=b.useRef(null);return o.useFrame((()=>{const e=l.current.geometry.attributes;e.position.needsUpdate=!0,r&&(e.color.needsUpdate=!0),n&&(e.size.needsUpdate=!0)})),b.createElement("points",E.default({matrixAutoUpdate:!1,ref:R.default([i,l])},s),b.createElement("bufferGeometry",null,b.createElement("bufferAttribute",{attachObject:["attributes","position"],count:t.length/a,array:t,itemSize:a,usage:S.DynamicDrawUsage}),r&&b.createElement("bufferAttribute",{attachObject:["attributes","color"],count:r.length/a,array:r,itemSize:3,usage:S.DynamicDrawUsage}),n&&b.createElement("bufferAttribute",{attachObject:["attributes","size"],count:n.length/a,array:n,itemSize:1,usage:S.DynamicDrawUsage})),e)})),vr=b.forwardRef(((e,t)=>e.positions instanceof Float32Array?b.createElement(hr,E.default({},e,{ref:t})):b.createElement(fr,E.default({},e,{ref:t}))));let gr,xr;const yr=b.createContext(null),wr=new S.Matrix4,Er=new S.Matrix4,br=new S.Matrix4,Mr=new S.Color,Sr=new S.Vector3,Tr=new S.Quaternion,Rr=new S.Vector3,Cr=b.forwardRef((({context:e,children:t,...r},n)=>{b.useMemo((()=>o.extend({Position:sr})),[]);const a=b.useRef(),{subscribe:s,getParent:i}=b.useContext(e||yr);return b.useLayoutEffect((()=>s(a)),[]),b.createElement("position",E.default({instance:i(),instanceKey:a,ref:R.default([n,a])},r),t)})),Lr=b.forwardRef((({children:e,range:t,limit:r=1e3,frames:n=1/0,...a},s)=>{const[{context:i,instance:l}]=b.useState((()=>{const e=b.createContext(null);return{context:e,instance:b.forwardRef(((t,r)=>b.createElement(Cr,E.default({context:e},t,{ref:r}))))}})),u=b.useRef(null),[c,d]=b.useState([]),[[m,f]]=b.useState((()=>{const e=new Float32Array(16*r);for(gr=0;gr<r;gr++)br.identity().toArray(e,16*gr);return[e,new Float32Array([...new Array(3*r)].map((()=>1)))]}));b.useLayoutEffect((()=>{u.current.count=u.current.instanceMatrix.updateRange.count=u.current.instanceColor.updateRange.count=Math.min(r,void 0!==t?t:r,c.length)}),[c,t]),b.useEffect((()=>{u.current.instanceMatrix.needsUpdate=!0}));let p=0;o.useFrame((()=>{if(n===1/0||p<n){for(u.current.updateMatrix(),u.current.updateMatrixWorld(),wr.copy(u.current.matrixWorld).invert(),gr=0;gr<c.length;gr++)xr=c[gr].current,xr.matrixWorld.decompose(Sr,Tr,Rr),Er.compose(Sr,Tr,Rr).premultiply(wr),Er.equals(br.fromArray(m,16*gr))||(Er.toArray(m,16*gr),u.current.instanceMatrix.needsUpdate=!0),xr.color.equals(Mr.fromArray(f,3*gr))||(xr.color.toArray(f,3*gr),u.current.instanceColor.needsUpdate=!0);p++}}));const h=b.useMemo((()=>({getParent:()=>u,subscribe:e=>(d((t=>[...t,e])),()=>d((t=>t.filter((t=>t.current!==e.current)))))})),[]);return b.createElement("instancedMesh",E.default({userData:{instances:c},matrixAutoUpdate:!1,ref:R.default([s,u]),args:[null,null,0],raycast:()=>null},a),b.createElement("instancedBufferAttribute",{attach:"instanceMatrix",count:m.length/16,array:m,itemSize:16,usage:S.DynamicDrawUsage}),b.createElement("instancedBufferAttribute",{attach:"instanceColor",count:f.length/3,array:f,itemSize:3,usage:S.DynamicDrawUsage}),"function"==typeof e?b.createElement(i.Provider,{value:h},e(l)):b.createElement(yr.Provider,{value:h},e))}));const _r=b.createContext(null),Pr=e=>e instanceof S.Color?e.toArray():e,Dr=e=>e instanceof S.Vector3?e.toArray():e,zr=b.forwardRef(((e,t)=>{const{limit:r=1e3,lineWidth:n=1,children:a,...s}=e,[i,l]=b.useState([]),[c]=b.useState((()=>new u.Line2)),[d]=b.useState((()=>new u.LineMaterial)),[m]=b.useState((()=>new u.LineSegmentsGeometry)),[f]=b.useState((()=>new S.Vector2(512,512))),[p]=b.useState((()=>Array(6*r).fill(0))),[h]=b.useState((()=>Array(6*r).fill(0))),v=b.useMemo((()=>({subscribe:e=>(l((t=>[...t,e])),()=>l((t=>t.filter((t=>t.current!==e.current)))))})),[]);return o.useFrame((()=>{for(let n=0;n<r;n++){var e;const r=null==(e=i[n])?void 0:e.current,o=r?Dr(r.start):[0,0,0],a=r?Dr(r.end):[0,0,0],s=r?Pr(r.color):[1,1,1];for(var t=0;t<3;t++)p[6*n+t]=o[t],p[6*n+t+3]=a[t],h[6*n+t]=s[t],h[6*n+t+3]=s[t]}m.setColors(h),m.setPositions(p),c.computeLineDistances()})),b.createElement("primitive",{object:c,ref:t},b.createElement("primitive",{object:m,attach:"geometry"}),b.createElement("primitive",E.default({object:d,attach:"material",vertexColors:!0,resolution:f,linewidth:n},s)),b.createElement(_r.Provider,{value:v},a))}));class Br{constructor(){this.color=new S.Color("white"),this.start=new S.Vector3(0,0,0),this.end=new S.Vector3(0,0,0)}}const Ur=b.forwardRef(((e,t)=>{const r=b.useContext(_r);if(!r)throw"Segment must used inside Segments component.";const n=b.useRef();return b.useMemo((()=>o.extend({SegmentObject:Br})),[]),b.useLayoutEffect((()=>r.subscribe(n)),[]),b.createElement("segmentObject",E.default({ref:R.default([n,t])},e))})),Ar=b.forwardRef((({children:e,distances:t,...r},n)=>{const a=b.useRef(null);return b.useLayoutEffect((()=>{const{current:e}=a;e.levels.length=0,e.children.forEach(((r,n)=>e.levels.push({object:r,distance:t[n]})))})),o.useFrame((e=>{var t;return null==(t=a.current)?void 0:t.update(e.camera)})),b.createElement("lOD",E.default({ref:R.default([a,n])},r),e)}));const Fr=new n.Matrix4,kr=new n.Ray,jr=new n.Sphere,Vr=new n.Vector3;exports.AdaptiveDpr=function({pixelated:e}){const t=o.useThree((e=>e.gl)),r=o.useThree((e=>e.internal.active)),n=o.useThree((e=>e.performance.current)),a=o.useThree((e=>e.viewport.initialDpr)),s=o.useThree((e=>e.setDpr));return b.useEffect((()=>{const n=t.domElement;return()=>{r&&s(a),e&&n&&(n.style.imageRendering="auto")}}),[]),b.useEffect((()=>{s(n*a),e&&t.domElement&&(t.domElement.style.imageRendering=1===n?"auto":"pixelated")}),[n]),null},exports.AdaptiveEvents=function(){const e=o.useThree((e=>e.get)),t=o.useThree((e=>e.performance.current));return b.useEffect((()=>{const t=e().raycaster.enabled;return()=>{e().raycaster.enabled=t}}),[]),b.useEffect((()=>{e().raycaster.enabled=1===t}),[t]),null},exports.ArcballControls=ye,exports.Backdrop=function({children:e,floor:t=.25,segments:r=20,receiveShadow:n,...o}){const a=b.useRef(null);return b.useLayoutEffect((()=>{let e=0;const n=r/r/2,o=a.current.attributes.position;for(let a=0;a<r+1;a++)for(let s=0;s<r+1;s++)o.setXYZ(e++,a/r-n+(0===a?-t:0),s/r-n,Ht(a/r));o.needsUpdate=!0,a.current.computeVertexNormals()}),[r,t]),b.createElement("group",o,b.createElement("mesh",{receiveShadow:n,rotation:[-Math.PI/2,0,Math.PI/2]},b.createElement("planeGeometry",{ref:a,args:[1,1,r,r]}),e))},exports.BakeShadows=function(){const e=o.useThree((e=>e.gl));return t.useEffect((()=>(e.shadowMap.autoUpdate=!1,e.shadowMap.needsUpdate=!0,()=>{e.shadowMap.autoUpdate=e.shadowMap.needsUpdate=!0})),[e.shadowMap]),null},exports.Billboard=Q,exports.Bounds=function({children:e,damping:t=6,fit:r,clip:n,margin:a=1.2,eps:s=.01,onFit:i}){const l=b.useRef(null),u=o.useThree((e=>e.camera)),c=o.useThree((e=>e.controls)),d=o.useThree((e=>e.invalidate)),m=b.useRef(i);function f(e,t){return Math.abs(e.x-t.x)<s&&Math.abs(e.y-t.y)<s&&Math.abs(e.z-t.z)<s}function p(e,t,r,n){e.x=S.MathUtils.damp(e.x,t.x,r,n),e.y=S.MathUtils.damp(e.y,t.y,r,n),e.z=S.MathUtils.damp(e.z,t.z,r,n)}m.current=i;const[h]=b.useState((()=>({animating:!1,focus:new S.Vector3,camera:new S.Vector3,zoom:1}))),[v]=b.useState((()=>({focus:new S.Vector3,camera:new S.Vector3,zoom:1}))),[g]=b.useState((()=>new S.Box3)),x=b.useMemo((()=>{function e(){const e=g.getSize(new S.Vector3),t=g.getCenter(new S.Vector3),r=Math.max(e.x,e.y,e.z),n=jt(u)?4*r:r/(2*Math.atan(Math.PI*u.fov/360)),o=jt(u)?4*r:n/u.aspect,s=a*Math.max(n,o);return{box:g,size:e,center:t,distance:s}}return{getSize:e,refresh(t){var r;if((r=t)&&r.isObject3D?g.setFromObject(t):(e=>e&&e.isBox3)(t)?g.copy(t):l.current&&g.setFromObject(l.current),g.isEmpty()){const e=u.position.length()||10;g.setFromCenterAndSize(new S.Vector3,new S.Vector3(e,e,e))}if("OrthographicTrackballControls"===(null==c?void 0:c.constructor.name)){const{distance:t}=e(),r=u.position.clone().sub(c.target).normalize().multiplyScalar(t),n=c.target.clone().add(r);u.position.copy(n)}return this},clip(){const{distance:t}=e();return c&&(c.maxDistance=10*t),u.near=t/100,u.far=100*t,u.updateProjectionMatrix(),c&&c.update(),this},fit(){h.camera.copy(u.position),c&&h.focus.copy(c.target);const{center:r,distance:n}=e(),o=r.clone().sub(u.position).normalize().multiplyScalar(n);if(v.camera.copy(r).sub(o),v.focus.copy(r),jt(u)){h.zoom=u.zoom;let e=0,n=0;const o=[new S.Vector3(g.min.x,g.min.y,g.min.z),new S.Vector3(g.min.x,g.max.y,g.min.z),new S.Vector3(g.min.x,g.min.y,g.max.z),new S.Vector3(g.min.x,g.max.y,g.max.z),new S.Vector3(g.max.x,g.max.y,g.max.z),new S.Vector3(g.max.x,g.max.y,g.min.z),new S.Vector3(g.max.x,g.min.y,g.max.z),new S.Vector3(g.max.x,g.min.y,g.min.z)];r.applyMatrix4(u.matrixWorldInverse);for(const t of o)t.applyMatrix4(u.matrixWorldInverse),e=Math.max(e,Math.abs(t.y-r.y)),n=Math.max(n,Math.abs(t.x-r.x));e*=2,n*=2;const s=(u.top-u.bottom)/e,i=(u.right-u.left)/n;v.zoom=Math.min(s,i)/a,t||(u.zoom=v.zoom,u.updateProjectionMatrix())}return t?h.animating=!0:(u.position.copy(v.camera),u.lookAt(v.focus),c&&(c.target.copy(v.focus),c.update()),d()),m.current&&m.current(this.getSize()),this}}}),[g,u,c,a,t,d]);return b.useLayoutEffect((()=>{if(x.refresh(),r&&x.fit(),n&&x.clip(),c){const e=()=>h.animating=!1;return c.addEventListener("start",e),()=>c.removeEventListener("start",e)}}),[n,r,c]),o.useFrame(((e,r)=>{if(h.animating){if(p(h.focus,v.focus,t,r),p(h.camera,v.camera,t,r),h.zoom=S.MathUtils.damp(h.zoom,v.zoom,t,r),u.position.copy(h.camera),jt(u)&&(u.zoom=h.zoom,u.updateProjectionMatrix()),c?(c.target.copy(h.focus),c.update()):u.lookAt(h.focus),d(),jt(u)&&!(Math.abs(h.zoom-v.zoom)<s))return;if(!jt(u)&&!f(h.camera,v.camera))return;if(c&&!f(h.focus,v.focus))return;h.animating=!1}})),b.createElement("group",{ref:l},b.createElement(Vt.Provider,{value:x},e))},exports.Box=vt,exports.CameraShake=It,exports.Center=kt,exports.Circle=gt,exports.Cloud=function({opacity:e=.5,speed:t=.4,width:r=10,depth:n=1.5,segments:a=20,...s}){const i=b.useRef(),l=ue("https://rawcdn.githack.com/pmndrs/drei-assets/9225a9f1fbd449d9411125c2f419b843d0308c9f/cloud.png"),u=b.useMemo((()=>[...new Array(a)].map(((e,n)=>({x:r/2-Math.random()*r,y:r/2-Math.random()*r,scale:.4+Math.sin((n+1)/a*Math.PI)*(10*(.2+Math.random())),density:Math.max(.2,Math.random()),rotation:Math.max(.002,.005*Math.random())*t})))),[r,a,t]);return o.useFrame((e=>{var t;return null==(t=i.current)?void 0:t.children.forEach(((t,r)=>{t.children[0].rotation.z+=u[r].rotation,t.children[0].scale.setScalar(u[r].scale+(1+Math.sin(e.clock.getElapsedTime()/10))/2*r/10)}))})),b.createElement("group",s,b.createElement("group",{position:[0,0,a/2*n],ref:i},u.map((({x:t,y:r,scale:o,density:a},s)=>b.createElement(Q,{key:s,position:[t,r,-s*n]},b.createElement(Et,{scale:o,rotation:[0,0,0]},b.createElement("meshStandardMaterial",{map:l,transparent:!0,opacity:o/6*a*e,depthTest:!1})))))))},exports.Cone=xt,exports.ContactShadows=Wt,exports.CubeCamera=function({children:e,fog:t,frames:r=1/0,resolution:a=256,near:s=1,far:i=1e3,...l}){const u=b.useRef(),[c,d]=b.useState(),m=o.useThree((({scene:e})=>e)),f=o.useThree((({gl:e})=>e)),p=b.useMemo((()=>new n.WebGLCubeRenderTarget(a,{minFilter:n.LinearFilter,magFilter:n.LinearFilter,format:n.RGBFormat,encoding:f.outputEncoding})),[a]);let h=0;return o.useFrame((()=>{if(c&&u.current&&(r===1/0||h<r)){u.current.traverse((e=>e.visible=!1));const e=m.fog;m.fog=t||e,c.update(f,m),m.fog=e,u.current.traverse((e=>e.visible=!0)),h++}})),b.createElement("group",l,b.createElement("cubeCamera",{ref:d,args:[s,i,p]}),b.createElement("group",{ref:u},e(p.texture)))},exports.CubicBezierLine=re,exports.CurveModifier=nt,exports.CycleRaycast=function({onChanged:e,portal:t,preventDefault:r=!0,scroll:n=!0,keyCode:a=9}){const s=b.useRef(0),i=o.useThree((e=>e.raycaster)),l=o.useThree((e=>e.get)),u=o.useThree((e=>e.gl));return b.useEffect((()=>{var o;let c,d=[];const m=i.filter,f=null!==(o=null==t?void 0:t.current)&&void 0!==o?o:u.domElement.parentNode,p=()=>f&&e&&e(d,Math.round(s.current)%d.length);i.filter=(e,t)=>{let r=[...e];r.length===d.length&&d.every((e=>r.map((e=>e.object.uuid)).includes(e.object.uuid)))||(s.current=0,d=r,p()),m&&(r=m(r,t));for(let e=0;e<Math.round(s.current)%r.length;e++){const e=r.shift();r=[...r,e]}return r};const h=e=>{var t,r;s.current=e(s.current),null==(t=l().events.handlers)||t.onPointerCancel(void 0),null==(r=l().events.handlers)||r.onPointerMove(c),p()},v=e=>{(e.keyCode||e.which===a)&&(r&&e.preventDefault(),d.length>1&&h((e=>e+1)))},g=e=>{r&&e.preventDefault();let t=0;e||(e=window.event),e.wheelDelta?t=e.wheelDelta/120:e.detail&&(t=-e.detail/3),d.length>1&&h((e=>Math.abs(e-t)))},x=e=>c=e;return document.addEventListener("pointermove",x,{passive:!0}),n&&document.addEventListener("wheel",g),void 0!==a&&document.addEventListener("keydown",v),()=>{i.filter=m,void 0!==a&&document.removeEventListener("keydown",v),n&&document.removeEventListener("wheel",g),document.removeEventListener("pointermove",x)}}),[u,l,i,r,n,a]),null},exports.Cylinder=yt,exports.Detailed=Ar,exports.DeviceOrientationControls=pe,exports.Dodecahedron=Pt,exports.Edges=function({userData:e,children:t,geometry:r,threshold:n=15,color:o="black",...a}){const s=b.useRef(null);return b.useLayoutEffect((()=>{const e=s.current.parent;if(e){const t=r||e.geometry;t===s.current.userData.currentGeom&&n===s.current.userData.currentThreshold||(s.current.userData.currentGeom=t,s.current.userData.currentThreshold=n,s.current.geometry=new S.EdgesGeometry(t,n))}})),b.createElement("lineSegments",E.default({ref:s,raycast:()=>null},a),t||b.createElement("lineBasicMaterial",{color:o}))},exports.Effects=se,exports.Environment=Gt,exports.Extrude=Dt,exports.FirstPersonControls=be,exports.Float=function({children:e,speed:t=1,rotationIntensity:r=1,floatIntensity:n=1,...a}){const s=b.useRef(null),i=b.useRef(1e4*Math.random());return o.useFrame((e=>{const o=i.current+e.clock.getElapsedTime();s.current.rotation.x=Math.cos(o/4*t)/8*r,s.current.rotation.y=Math.sin(o/4*t)/8*r,s.current.rotation.z=Math.sin(o/4*t)/20*r,s.current.position.y=Math.sin(o/4*t)/10*n})),b.createElement("group",a,b.createElement("group",{ref:s},e))},exports.FlyControls=he,exports.GizmoHelper=({alignment:e="bottom-right",margin:t=[80,80],renderPriority:r=0,onUpdate:a,onTarget:s,children:i})=>{const l=o.useThree((({size:e})=>e)),u=o.useThree((({camera:e})=>e)),c=o.useThree((({controls:e})=>e)),d=o.useThree((({gl:e})=>e)),m=o.useThree((({scene:e})=>e)),f=o.useThree((({invalidate:e})=>e)),p=b.useRef(),h=b.useRef(),v=b.useRef(null),[g]=b.useState((()=>new n.Scene)),x=b.useRef(!1),y=b.useRef(0),w=b.useRef(new n.Vector3(0,0,0));b.useEffect((()=>(m.background&&(p.current=m.background,m.background=null,g.background=p.current),()=>{p.current&&(m.background=p.current)})),[]);o.useFrame(((e,t)=>{var r;v.current&&h.current&&((e=>{if(!x.current)return;if(_e.angleTo(Pe)<.01)return void(x.current=!1);const t=e*Re;_e.rotateTowards(Pe,t),u.position.set(0,0,1).applyQuaternion(_e).multiplyScalar(y.current).add(w.current),u.up.set(0,1,0).applyQuaternion(_e).normalize(),u.quaternion.copy(_e),a?a():c&&c.update(),f()})(t),Le.copy(u.matrix).invert(),null==(r=h.current)||r.quaternion.setFromRotationMatrix(Le),d.autoClear=!1,d.clearDepth(),d.render(g,v.current))}),r);const E={tweenCamera:e=>{x.current=!0,(c||s)&&(w.current=(null==c?void 0:c.target)||(null==s?void 0:s())),y.current=u.position.distanceTo(De),_e.copy(u.quaternion),ze.copy(e).multiplyScalar(y.current).add(De),Ce.lookAt(ze),Pe.copy(Ce.quaternion),f()},raycast:Me(v)},[M,S]=t,T=e.endsWith("-left")?-l.width/2+M:l.width/2-M,R=e.startsWith("top-")?l.height/2-S:-l.height/2+S;return o.createPortal(b.createElement(Se.Provider,{value:E},b.createElement(me,{ref:v,makeDefault:!1,position:[0,0,200]}),b.createElement("group",{ref:h,position:[T,R,0]},i)),g)},exports.GizmoViewcube=e=>b.createElement("group",{scale:[60,60,60]},b.createElement(Ne,e),Oe.map(((t,r)=>b.createElement(He,E.default({key:r,position:t,dimensions:Ge[r]},e)))),Ve.map(((t,r)=>b.createElement(He,E.default({key:r,position:t,dimensions:Ie},e)))),b.createElement("ambientLight",{intensity:.5}),b.createElement("pointLight",{position:[10,10,10],intensity:.5})),exports.GizmoViewport=({hideNegativeAxes:e,hideAxisHeads:t,disabled:r,font:n="18px Inter var, Arial, sans-serif",axisColors:o=["#ff3653","#0adb50","#2c8fdf"],axisHeadScale:a=1,axisScale:s,labels:i=["X","Y","Z"],labelColor:l="#000",onClick:u,...c})=>{const[d,m,f]=o,{tweenCamera:p,raycast:h}=Te(),v={font:n,disabled:r,labelColor:l,raycast:h,onClick:u,axisHeadScale:a,onPointerDown:r?void 0:e=>{p(e.object.position),e.stopPropagation()}};return b.createElement("group",E.default({scale:40},c),b.createElement($e,{color:d,rotation:[0,0,0],scale:s}),b.createElement($e,{color:m,rotation:[0,0,Math.PI/2],scale:s}),b.createElement($e,{color:f,rotation:[0,-Math.PI/2,0],scale:s}),!t&&b.createElement(b.Fragment,null,b.createElement(qe,E.default({arcStyle:d,position:[1,0,0],label:i[0]},v)),b.createElement(qe,E.default({arcStyle:m,position:[0,1,0],label:i[1]},v)),b.createElement(qe,E.default({arcStyle:f,position:[0,0,1],label:i[2]},v)),!e&&b.createElement(b.Fragment,null,b.createElement(qe,E.default({arcStyle:d,position:[-1,0,0]},v)),b.createElement(qe,E.default({arcStyle:m,position:[0,-1,0]},v)),b.createElement(qe,E.default({arcStyle:f,position:[0,0,-1]},v)))),b.createElement("ambientLight",{intensity:.5}),b.createElement("pointLight",{position:[10,10,10],intensity:.5}))},exports.GradientTexture=function({stops:e,colors:t,size:r=2048,...n}){const o=b.useMemo((()=>{const n=document.createElement("canvas"),o=n.getContext("2d");n.width=16,n.height=r;const a=o.createLinearGradient(0,0,0,r);let s=e.length;for(;s--;)a.addColorStop(e[s],t[s]);o.fillStyle=a,o.fillRect(0,0,16,r);const i=new S.Texture(n);return i.needsUpdate=!0,i}),[e]);return b.useEffect((()=>()=>{o.dispose()}),[o]),b.createElement("primitive",E.default({object:o,attach:"map"},n))},exports.Html=O,exports.Icosahedron=Lt,exports.Image=de,exports.Instance=Cr,exports.Instances=Lr,exports.IsObject=le,exports.Lathe=zt,exports.Line=J,exports.Loader=function({containerStyles:e,innerStyles:t,barStyles:r,dataStyles:n,dataInterpolation:o=N,initialState:a=(e=>e)}){const{active:s,progress:i}=W(),l=b.useRef(0),u=b.useRef(0),c=b.useRef(null),[d,m]=b.useState(a(s));b.useEffect((()=>{let e;return s!==d&&(e=setTimeout((()=>m(s)),300)),()=>clearTimeout(e)}),[d,s]);const f=b.useCallback((()=>{c.current&&(l.current+=(i-l.current)/2,(l.current>.95*i||100===i)&&(l.current=i),c.current.innerText=o(l.current),l.current<i&&(u.current=requestAnimationFrame(f)))}),[o,i]);return b.useEffect((()=>(f(),()=>cancelAnimationFrame(u.current))),[f]),d?b.createElement("div",{style:{...H.container,opacity:s?1:0,...e}},b.createElement("div",null,b.createElement("div",{style:{...H.inner,...t}},b.createElement("div",{style:{...H.bar,transform:`scaleX(${i/100})`,...r}}),b.createElement("span",{ref:c,style:{...H.data,...n}})))):null},exports.MapControls=ve,exports.Merged=function({meshes:e,children:t,...r}){const n=Array.isArray(e);if(!n)for(const t of Object.keys(e))e[t].isMesh||delete e[t];return b.createElement(D.default,{components:(n?e:Object.values(e)).map((({geometry:e,material:t})=>b.createElement(Lr,E.default({key:e.uuid,geometry:e,material:t},r))))},(r=>n?t(...r):t(Object.keys(e).filter((t=>e[t].isMesh)).reduce(((e,t,n)=>({...e,[t]:r[n]})),{}))))},exports.MeshDistortMaterial=at,exports.MeshReflectorMaterial=dt,exports.MeshWobbleMaterial=it,exports.Octahedron=_t,exports.OrbitControls=ge,exports.OrthographicCamera=me,exports.PerspectiveCamera=fe,exports.Plane=Et,exports.Point=pr,exports.PointMaterial=ft,exports.PointMaterialImpl=mt,exports.PointerLockControls=Ee,exports.Points=vr,exports.PointsBuffer=hr,exports.Polyhedron=Ct,exports.PositionalAudio=ne,exports.Preload=function({all:e,scene:t,camera:r}){const a=o.useThree((({gl:e})=>e)),s=o.useThree((({camera:e})=>e)),i=o.useThree((({scene:e})=>e));return b.useLayoutEffect((()=>{const o=[];e&&(t||i).traverse((e=>{!1===e.visible&&(o.push(e),e.visible=!0)})),a.compile(t||i,r||s);const l=new n.WebGLCubeRenderTarget(128);new n.CubeCamera(.01,1e5,l).update(a,t||i),l.dispose(),o.forEach((e=>e.visible=!1))}),[]),null},exports.PresentationControls=function({snap:e,global:t,cursor:r=!0,children:a,speed:s=1,rotation:u=[0,0,0],zoom:c=1,polar:d=[0,Math.PI/2],azimuth:m=[-1/0,1/0],config:f={mass:1,tension:170,friction:26}}){const{size:p,gl:h}=o.useThree(),v=b.useMemo((()=>[u[0]+d[0],u[0]+d[1]]),[u[0],d[0],d[1]]),g=b.useMemo((()=>[u[1]+m[0],u[1]+m[1]]),[u[1],m[0],m[1]]),x=b.useMemo((()=>[n.MathUtils.clamp(u[0],...v),n.MathUtils.clamp(u[1],...g),u[2]]),[u[0],u[1],u[2],v,g]),[y,w]=i.useSpring((()=>({scale:1,rotation:x,config:f})));b.useEffect((()=>{w.start({scale:1,rotation:x,config:f})}),[x]),b.useEffect((()=>{t&&r&&(h.domElement.style.cursor="grab")}),[t,r,h.domElement]);const M=l.useGesture({onHover:({last:e})=>{r&&!t&&(h.domElement.style.cursor=e?"auto":"grab")},onDrag:({down:t,delta:[o,a],memo:[i,l]=y.rotation.animation.to||x})=>{r&&(h.domElement.style.cursor=t?"grabbing":"grab"),o=n.MathUtils.clamp(l+o/p.width*Math.PI*s,...g),a=n.MathUtils.clamp(i+a/p.height*Math.PI*s,...v);const u=e&&!t&&"boolean"!=typeof e?e:f;return w.start({scale:t&&a>v[1]/2?c:1,rotation:e&&!t?x:[a,o,0],config:e=>"scale"===e?{...u,friction:3*u.friction}:u}),[a,o]}},{target:t?h.domElement:void 0});return b.createElement(i.a.group,E.default({},null==M?void 0:M(),y),a)},exports.QuadraticBezierLine=te,exports.Reflector=qt,exports.Ring=Rt,exports.RoundedBox=Ut,exports.ScreenQuad=Ft,exports.Scroll=Y,exports.ScrollControls=function({eps:e=1e-5,enabled:t=!0,infinite:r,horizontal:n,pages:a=1,distance:s=1,damping:i=4,style:l={},children:u}){const{gl:c,size:d,invalidate:m,events:f,raycaster:p}=o.useThree(),[h]=b.useState((()=>document.createElement("div"))),[v]=b.useState((()=>document.createElement("div"))),[g]=b.useState((()=>document.createElement("div"))),x=c.domElement.parentNode,y=b.useRef(0),w=b.useMemo((()=>({el:h,eps:e,fill:v,fixed:g,horizontal:n,damping:i,offset:0,delta:0,scroll:y,pages:a,range(e,t,r=0){const n=e-r,o=n+t+2*r;return this.offset<n?0:this.offset>o?1:(this.offset-n)/(o-n)},curve(e,t,r=0){return Math.sin(this.range(e,t,r)*Math.PI)},visible(e,t,r=0){const n=e-r,o=n+t+2*r;return this.offset>=n&&this.offset<=o}})),[e,i,n,a]);b.useEffect((()=>{h.style.position="absolute",h.style.width="100%",h.style.height="100%",h.style[n?"overflowX":"overflowY"]="auto",h.style[n?"overflowY":"overflowX"]="hidden",h.style.top="0px",h.style.left="0px";for(const e in l)h.style[e]=l[e];g.style.position="sticky",g.style.top="0px",g.style.left="0px",g.style.width="100%",g.style.height="100%",g.style.overflow="hidden",h.appendChild(g),v.style.height=n?"100%":a*s*100+"%",v.style.width=n?a*s*100+"%":"100%",v.style.pointerEvents="none",h.appendChild(v),x.appendChild(h),h[n?"scrollLeft":"scrollTop"]=1;const e="boolean"!=typeof f.connected?f.connected:c.domElement;requestAnimationFrame((()=>null==f.connect?void 0:f.connect(h)));const t=p.computeOffsets;return p.computeOffsets=({clientX:e,clientY:t})=>({offsetX:e-x.offsetLeft,offsetY:t-x.offsetTop}),()=>{x.removeChild(h),p.computeOffsets=t,null==f.connect||f.connect(e)}}),[a,s,n,h,v,g,x]),b.useEffect((()=>{const e=d[n?"width":"height"],o=h[n?"scrollWidth":"scrollHeight"],a=o-e;let s=0,i=!0,l=!0;const u=()=>{if(t&&!l&&(m(),s=h[n?"scrollLeft":"scrollTop"],y.current=s/a,r)){if(!i)if(s>=a){const e=1-w.offset;h[n?"scrollLeft":"scrollTop"]=1,y.current=w.offset=-e,i=!0}else if(s<=0){const e=1+w.offset;h[n?"scrollLeft":"scrollTop"]=o,y.current=w.offset=e,i=!0}i&&setTimeout((()=>i=!1),40)}};h.addEventListener("scroll",u,{passive:!0}),requestAnimationFrame((()=>l=!1));const c=e=>h.scrollLeft+=e.deltaY/2;return n&&h.addEventListener("wheel",c,{passive:!0}),()=>{h.removeEventListener("scroll",u),n&&h.removeEventListener("wheel",c)}}),[h,d,r,w,m,n]);let E=0;return o.useFrame(((t,r)=>{w.offset=S.MathUtils.damp(E=w.offset,y.current,i,r),w.delta=S.MathUtils.damp(w.delta,Math.abs(E-w.offset),i,r),w.delta>e&&m()})),b.createElement($.Provider,{value:w},u)},exports.Segment=Ur,exports.Segments=zr,exports.Select=function({box:e,multiple:t,children:r,onChange:n,border:a="1px solid #55aaff",backgroundColor:s="rgba(75, 160, 255, 0.1)",filter:i=(e=>e),...l}){const{camera:c,raycaster:d,gl:m,controls:f,size:p,get:h}=o.useThree(),[v,g]=b.useState(!1),[x,y]=b.useReducer(((e,{object:t,shift:r})=>void 0===t?[]:Array.isArray(t)?t:r?e.includes(t)?e.filter((e=>e!==t)):[t,...e]:e[0]===t?[]:[t]),[]);b.useEffect((()=>{null==n||n(x)}),[x]);const w=b.useCallback((e=>{e.stopPropagation(),y({object:i([e.object])[0],shift:t&&e.shiftKey})}),[]),M=b.useCallback((e=>!v&&y({})),[v]),T=b.useRef(null);return b.useEffect((()=>{if(!e||!t)return;const r=new u.SelectionBox(c,T.current),n=document.createElement("div");n.style.pointerEvents="none",n.style.border=a,n.style.backgroundColor=s,n.style.position="fixed";const o=new S.Vector2,l=new S.Vector2,v=new S.Vector2,g=d.enabled,x=null==f?void 0:f.enabled;let w=!1;function E(e,t){var r;const{offsetX:n,offsetY:o}=null!==(r=null==d.computeOffsets?void 0:d.computeOffsets(e,h()))&&void 0!==r?r:e,{width:a,height:s}=p;t.set(n/a*2-1,-o/s*2+1)}function b(e){e.shiftKey&&(!function(e){var t;f&&(f.enabled=!1),d.enabled=!1,w=!0,null==(t=m.domElement.parentElement)||t.appendChild(n),n.style.left=`${e.clientX}px`,n.style.top=`${e.clientY}px`,n.style.width="0px",n.style.height="0px",o.x=e.clientX,o.y=e.clientY}(e),E(e,r.startPoint))}let M=[];function R(e){if(w){!function(e){v.x=Math.max(o.x,e.clientX),v.y=Math.max(o.y,e.clientY),l.x=Math.min(o.x,e.clientX),l.y=Math.min(o.y,e.clientY),n.style.left=`${l.x}px`,n.style.top=`${l.y}px`,n.style.width=v.x-l.x+"px",n.style.height=v.y-l.y+"px"}(e),E(e,r.endPoint);const t=r.select().sort((e=>e.uuid)).filter((e=>e.isMesh));C.default(t,M)||(M=t,y({object:i(t)}))}}function L(e){var t;w&&w&&(f&&(f.enabled=x),d.enabled=g,w=!1,null==(t=n.parentElement)||t.removeChild(n))}return document.addEventListener("pointerdown",b,{passive:!0}),document.addEventListener("pointermove",R,{passive:!0,capture:!0}),document.addEventListener("pointerup",L,{passive:!0}),()=>{document.removeEventListener("pointerdown",b),document.removeEventListener("pointermove",R),document.removeEventListener("pointerup",L)}}),[p,d,c,f,m]),b.createElement("group",E.default({ref:T,onClick:w,onPointerOver:()=>g(!0),onPointerOut:()=>g(!1),onPointerMissed:M},l),b.createElement(K.Provider,{value:x},r))},exports.Shadow=$t,exports.Sky=Qt,exports.Sphere=wt,exports.SpotLight=Yt,exports.Stage=function({children:e,controls:t,shadows:r=!0,adjustCamera:n=!0,environment:a="city",intensity:s=1,preset:i="rembrandt",shadowBias:l=0,contactShadow:u={blur:2,opacity:.5,position:[0,0,0]},...c}){const d=Nt[i],m=o.useThree((e=>e.camera)),f=o.useThree((e=>e.controls)),p=b.useRef(null),h=b.useRef(null),[{radius:v,width:g,height:x},y]=b.useState({radius:0,width:0,height:0});return b.useLayoutEffect((()=>{p.current.position.set(0,0,0),p.current.updateWorldMatrix(!0,!0);const e=(new S.Box3).setFromObject(h.current),t=new S.Vector3,r=new S.Sphere,n=e.max.y-e.min.y,o=e.max.x-e.min.x;e.getCenter(t),e.getBoundingSphere(r),y({radius:r.radius,width:o,height:n}),p.current.position.set(-t.x,-t.y+n/2,-t.z)}),[e]),b.useLayoutEffect((()=>{if(n){const e=v/(x>g?1.5:2.5);m.position.set(0,.5*v,2.5*v),m.near=.1,m.far=Math.max(5e3,4*v),m.lookAt(0,e,0);const r=f||(null==t?void 0:t.current);r&&(r.target.set(0,e,0),r.update())}}),[f,v,x,g,n]),b.createElement("group",c,b.createElement("group",{ref:p},b.createElement("group",{ref:h},e)),u&&b.createElement(Wt,E.default({width:2*v,height:2*v,far:v/2},u)),a&&b.createElement(Gt,{preset:a}),b.createElement("ambientLight",{intensity:s/3}),b.createElement("spotLight",{penumbra:1,position:[d.main[0]*v,d.main[1]*v,d.main[2]*v],intensity:2*s,castShadow:r,"shadow-bias":l}),b.createElement("pointLight",{position:[d.fill[0]*v,d.fill[1]*v,d.fill[2]*v],intensity:s}))},exports.Stars=tr,exports.Stats=function({showPanel:e=0,className:t,parent:r}){const n=function(e,t=[],r){const[n,o]=b.useState();return b.useLayoutEffect((()=>{const t=e();return o(t),tt(r,t),()=>tt(r,null)}),t),n}((()=>new P.default),[]);return b.useEffect((()=>{if(n){const a=r&&r.current||document.body;n.showPanel(e),null==a||a.appendChild(n.dom),t&&n.dom.classList.add(t);const s=o.addEffect((()=>n.begin())),i=o.addAfterEffect((()=>n.end()));return()=>{null==a||a.removeChild(n.dom),s(),i()}}}),[r,n,t,e]),null},exports.Tetrahedron=Tt,exports.Text=oe,exports.Torus=Mt,exports.TorusKnot=St,exports.TrackballControls=xe,exports.TransformControls=we,exports.Tube=bt,exports.calcPosFromAngles=Kt,exports.isWebGL2Available=ae,exports.meshBounds=function(e,t){const r=this.geometry,n=this.material,o=this.matrixWorld;void 0!==n&&(null===r.boundingSphere&&r.computeBoundingSphere(),jr.copy(r.boundingSphere),jr.applyMatrix4(o),!1!==e.ray.intersectsSphere(jr)&&(Fr.copy(o).invert(),kr.copy(e.ray).applyMatrix4(Fr),null!==r.boundingBox&&null===kr.intersectBox(r.boundingBox,Vr)||t.push({distance:Vr.distanceTo(e.ray.origin),point:Vr.clone(),object:this})))},exports.shaderMaterial=ie,exports.softShadows=e=>{if(!pt){pt=!0;let t=S.ShaderChunk.shadowmap_pars_fragment;t=t.replace("#ifdef USE_SHADOWMAP","#ifdef USE_SHADOWMAP\n"+(({frustum:e=3.75,size:t=.005,near:r=9.5,samples:n=17,rings:o=11}={})=>`#define LIGHT_WORLD_SIZE ${t}\n#define LIGHT_FRUSTUM_WIDTH ${e}\n#define LIGHT_SIZE_UV (LIGHT_WORLD_SIZE / LIGHT_FRUSTUM_WIDTH)\n#define NEAR_PLANE ${r}\n\n#define NUM_SAMPLES ${n}\n#define NUM_RINGS ${o}\n#define BLOCKER_SEARCH_NUM_SAMPLES NUM_SAMPLES\n#define PCF_NUM_SAMPLES NUM_SAMPLES\n\nvec2 poissonDisk[NUM_SAMPLES];\n\nvoid initPoissonSamples(const in vec2 randomSeed) {\n float ANGLE_STEP = PI2 * float(NUM_RINGS) / float(NUM_SAMPLES);\n float INV_NUM_SAMPLES = 1.0 / float(NUM_SAMPLES);\n float angle = rand(randomSeed) * PI2;\n float radius = INV_NUM_SAMPLES;\n float radiusStep = radius;\n for (int i = 0; i < NUM_SAMPLES; i++) {\n poissonDisk[i] = vec2(cos(angle), sin(angle)) * pow(radius, 0.75);\n radius += radiusStep;\n angle += ANGLE_STEP;\n }\n}\n\nfloat penumbraSize(const in float zReceiver, const in float zBlocker) { // Parallel plane estimation\n return (zReceiver - zBlocker) / zBlocker;\n}\n\nfloat findBlocker(sampler2D shadowMap, const in vec2 uv, const in float zReceiver) {\n float searchRadius = LIGHT_SIZE_UV * (zReceiver - NEAR_PLANE) / zReceiver;\n float blockerDepthSum = 0.0;\n int numBlockers = 0;\n for (int i = 0; i < BLOCKER_SEARCH_NUM_SAMPLES; i++) {\n float shadowMapDepth = unpackRGBAToDepth(texture2D(shadowMap, uv + poissonDisk[i] * searchRadius));\n if (shadowMapDepth < zReceiver) {\n blockerDepthSum += shadowMapDepth;\n numBlockers++;\n }\n }\n if (numBlockers == 0) return -1.0;\n return blockerDepthSum / float(numBlockers);\n}\n\nfloat PCF_Filter(sampler2D shadowMap, vec2 uv, float zReceiver, float filterRadius) {\n float sum = 0.0;\n for (int i = 0; i < PCF_NUM_SAMPLES; i++) {\n float depth = unpackRGBAToDepth(texture2D(shadowMap, uv + poissonDisk[ i ] * filterRadius));\n if (zReceiver <= depth) sum += 1.0;\n }\n for (int i = 0; i < PCF_NUM_SAMPLES; i++) {\n float depth = unpackRGBAToDepth(texture2D(shadowMap, uv + -poissonDisk[ i ].yx * filterRadius));\n if (zReceiver <= depth) sum += 1.0;\n }\n return sum / (2.0 * float(PCF_NUM_SAMPLES));\n}\n\nfloat PCSS(sampler2D shadowMap, vec4 coords) {\n vec2 uv = coords.xy;\n float zReceiver = coords.z; // Assumed to be eye-space z in this code\n initPoissonSamples(uv);\n float avgBlockerDepth = findBlocker(shadowMap, uv, zReceiver);\n if (avgBlockerDepth == -1.0) return 1.0;\n float penumbraRatio = penumbraSize(zReceiver, avgBlockerDepth);\n float filterRadius = penumbraRatio * LIGHT_SIZE_UV * NEAR_PLANE / zReceiver;\n return PCF_Filter(shadowMap, uv, zReceiver, filterRadius);\n}`)({...e})),t=t.replace("#if defined( SHADOWMAP_TYPE_PCF )","\nreturn PCSS(shadowMap, shadowCoord);\n#if defined( SHADOWMAP_TYPE_PCF )"),S.ShaderChunk.shadowmap_pars_fragment=t}},exports.useAnimations=function(e,t){const r=b.useRef(),[a]=b.useState((()=>t?t instanceof n.Object3D?{current:t}:t:r)),[s]=b.useState((()=>new n.AnimationMixer(void 0))),i=b.useRef({}),[l]=b.useState((()=>{const t={};return e.forEach((e=>Object.defineProperty(t,e.name,{enumerable:!0,get(){if(a.current)return i.current[e.name]||(i.current[e.name]=s.clipAction(e,a.current))}}))),{ref:a,clips:e,actions:t,names:e.map((e=>e.name)),mixer:s}}));return o.useFrame(((e,t)=>s.update(t))),b.useEffect((()=>{const e=a.current;return()=>{i.current={},Object.values(l.actions).forEach((t=>{e&&s.uncacheAction(t,e)}))}}),[e]),l},exports.useAspect=function(e,t,r=1){const n=o.useThree((e=>e.viewport)),a=t*(n.aspect>e/t?n.width/e:n.height/t);return[e*(n.aspect>e/t?n.width/e:n.height/t)*r,a*r,1]},exports.useBVH=function(e,t){b.useEffect((()=>{if(e.current){e.current.raycast=g.acceleratedRaycast;const r=e.current.geometry;return r.computeBoundsTree=g.computeBoundsTree,r.disposeBoundsTree=g.disposeBoundsTree,r.computeBoundsTree(t),()=>{r.boundsTree&&r.disposeBoundsTree()}}}),[e,t])},exports.useBounds=function(){return b.useContext(Vt)},exports.useCamera=Me,exports.useContextBridge=function(...e){const t=b.useRef([]);return t.current=e.map((e=>b.useContext(e))),b.useMemo((()=>({children:r})=>e.reduceRight(((e,r,n)=>b.createElement(r.Provider,{value:t.current[n],children:e})),r)),[])},exports.useCubeTexture=Xe,exports.useCursor=function(e,t="pointer",r="auto"){b.useEffect((()=>{if(e)return document.body.style.cursor=t,()=>{document.body.style.cursor=r}}),[e])},exports.useDepthBuffer=function({size:e=256,frames:t=1/0}={}){const r=o.useThree((e=>e.viewport.dpr)),{width:a,height:s}=o.useThree((e=>e.size)),i=e||a*r,l=e||s*r,u=b.useMemo((()=>{const e=new n.DepthTexture(i,l);return e.format=n.DepthFormat,e.type=n.UnsignedShortType,{depthTexture:e}}),[i,l]);let c=0;const d=rt(i,l,u);return o.useFrame((e=>{(t===1/0||c<t)&&(e.gl.setRenderTarget(d),e.gl.render(e.scene,e.camera),e.gl.setRenderTarget(null),c++)})),d.depthTexture},exports.useDetectGPU=e=>v.useAsset((()=>h.getGPUTier(e)),"useDetectGPU"),exports.useFBO=rt,exports.useFBX=Ze,exports.useGLTF=Qe,exports.useGizmoContext=Te,exports.useHelper=function(e,t,...r){const n=b.useRef(),a=o.useThree((e=>e.scene));return b.useEffect((()=>(t&&e.current&&(n.current=new t(e.current,...r),n.current&&a.add(n.current)),()=>{n.current&&a.remove(n.current)})),[a,t,e,r]),o.useFrame((()=>{var e;null!=(e=n.current)&&e.update&&n.current.update()})),n},exports.useIntersect=function(e){const t=b.useRef(null),r=b.useRef(!1),n=b.useRef(!1);return b.useEffect((()=>{const a=t.current;if(a){const t=o.addEffect((()=>(r.current=!1,!0))),s=a.onBeforeRender;a.onBeforeRender=()=>r.current=!0;const i=o.addAfterEffect((()=>(r.current!==n.current&&e(n.current=r.current),!0)));return()=>{a.onBeforeRender=s,t(),i()}}}),[]),t},exports.useKTX2=et,exports.useMatcapTexture=function(e=0,t=1024){const r=v.useAsset((()=>new Promise((async e=>{e(await fetch("https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/matcaps.json").then((e=>e.json())))}))),"matcapList"),n=r[0],o=b.useMemo((()=>Object.keys(r).length),[]),a=`https://rawcdn.githack.com/emmelleppi/matcaps/9b36ccaaf0a24881a39062d05566c9e92be4aa0d/${t}/${`${b.useMemo((()=>"string"==typeof e?e:"number"==typeof e?r[e]:null),[e])||n}${function(e){switch(e){case 64:return"-64px";case 128:return"-128px";case 256:return"-256px";case 512:return"-512px";default:return""}}(t)}.png`}`;return[ue(a),a,o]},exports.useNormalTexture=function(e=0,t={}){const{repeat:r=[1,1],anisotropy:o=1,offset:a=[0,0]}=t,s=v.useAsset((()=>new Promise((async e=>{e(await fetch("https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/normals/normals.json").then((e=>e.json())))}))),"normalsList"),i=b.useMemo((()=>Object.keys(s).length),[]),l=s[0],u=`https://rawcdn.githack.com/pmndrs/drei-assets/7a3104997e1576f83472829815b00880d88b32fb/normals/${s[e]||l}`,c=ue(u);return b.useLayoutEffect((()=>{c&&(c.wrapS=c.wrapT=n.RepeatWrapping,c.repeat=new n.Vector2(r[0],r[1]),c.offset=new n.Vector2(a[0],a[1]),c.anisotropy=o)}),[c,o,r,a]),[c,u,i]},exports.useProgress=W,exports.useScroll=q,exports.useSelect=function(){return b.useContext(K)},exports.useTexture=ue;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("react-dom"),n=require("three"),o=require("@react-three/fiber"),a=require("zustand"),s=require("react-merge-refs"),i=require("@react-spring/three"),l=require("@use-gesture/react"),u=require("three-stdlib"),c=require("zustand/shallow"),d=require("troika-three-text"),m=require("lodash.omit"),f=require("lodash.pick"),p=require("stats.js"),h=require("detect-gpu"),v=require("use-asset"),g=require("three-mesh-bvh"),x=require("react-composer");function y(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function w(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var E=y(e),b=w(t),M=w(r),S=w(n),T=y(a),C=y(s),R=y(c),L=y(m),_=y(f),P=y(p),D=y(x);const z=new n.Vector3,B=new n.Vector3,U=new n.Vector3;function A(e,t,r){const n=z.setFromMatrixPosition(e.matrixWorld);n.project(t);const o=r.width/2,a=r.height/2;return[n.x*o+o,-n.y*a+a]}const F=e=>Math.abs(e)<1e-10?0:e;function k(e,t,r=""){let n="matrix3d(";for(let r=0;16!==r;r++)n+=F(t[r]*e.elements[r])+(15!==r?",":")");return r+n}const j=(V=[1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1],e=>k(e,V));var V;const I=(e,t)=>{return k(e,[1/(r=t),1/r,1/r,1,-1/r,-1/r,-1/r,-1,1/r,1/r,1/r,1,1,1,1,1],"translate(-50%,-50%)");var r},O=b.forwardRef((({children:e,eps:t=.001,style:r,className:a,prepend:s,center:i,fullscreen:l,portal:u,distanceFactor:c,sprite:d=!1,transform:m=!1,occlude:f,onOcclude:p,zIndexRange:h=[16777271,0],calculatePosition:v=A,as:g="div",wrapperClass:x,pointerEvents:y="auto",...w},S)=>{var T;const C=o.useThree((({gl:e})=>e)),R=o.useThree((({camera:e})=>e)),L=o.useThree((({scene:e})=>e)),_=o.useThree((({size:e})=>e)),P=o.useThree((({raycaster:e})=>e)),[D]=b.useState((()=>document.createElement(g))),k=b.useRef(null),V=b.useRef(0),O=b.useRef([0,0]),G=b.useRef(null),W=b.useRef(null),N=null!==(T=null==u?void 0:u.current)&&void 0!==T?T:C.domElement.parentNode;b.useEffect((()=>{if(k.current){if(L.updateMatrixWorld(),m)D.style.cssText="position:absolute;top:0;left:0;pointer-events:none;overflow:hidden;";else{const e=v(k.current,R,_);D.style.cssText=`position:absolute;top:0;left:0;transform:translate3d(${e[0]}px,${e[1]}px,0);transform-origin:0 0;`}return N&&(s?N.prepend(D):N.appendChild(D)),()=>{N&&N.removeChild(D),M.unmountComponentAtNode(D)}}}),[N,m]),b.useLayoutEffect((()=>{x&&(D.className=x)}),[x]);const H=b.useMemo((()=>m?{position:"absolute",top:0,left:0,width:_.width,height:_.height,transformStyle:"preserve-3d",pointerEvents:"none"}:{position:"absolute",transform:i?"translate3d(-50%,-50%,0)":"none",...l&&{top:-_.height/2,left:-_.width/2,width:_.width,height:_.height},...r}),[r,i,l,_,m]),$=b.useMemo((()=>({position:"absolute",pointerEvents:y})),[y]);b.useLayoutEffect((()=>{m?M.render(b.createElement("div",{ref:G,style:H},b.createElement("div",{ref:W,style:$},b.createElement("div",{ref:S,className:a,style:r,children:e}))),D):M.render(b.createElement("div",{ref:S,style:H,className:a,children:e}),D)}));const q=b.useRef(!0);return o.useFrame((()=>{if(k.current){R.updateMatrixWorld(),k.current.updateWorldMatrix(!0,!1);const e=m?O.current:v(k.current,R,_);if(m||Math.abs(V.current-R.zoom)>t||Math.abs(O.current[0]-e[0])>t||Math.abs(O.current[1]-e[1])>t){const t=function(e,t){const r=z.setFromMatrixPosition(e.matrixWorld),n=B.setFromMatrixPosition(t.matrixWorld),o=r.sub(n),a=t.getWorldDirection(U);return o.angleTo(a)>Math.PI/2}(k.current,R);let r=!1;"boolean"==typeof f?!0===f&&(r=[L]):Array.isArray(f)&&(r=f.map((e=>e.current)));const o=q.current;if(r){const e=function(e,t,r,n){const o=z.setFromMatrixPosition(e.matrixWorld),a=o.clone();a.project(t),r.setFromCamera(a,t);const s=r.intersectObjects(n,!0);if(s.length){const e=s[0].distance;return o.distanceTo(r.ray.origin)<e}return!0}(k.current,R,P,r);q.current=e&&!t}else q.current=!t;if(o!==q.current&&(p?p(!q.current):D.style.display=q.current?"block":"none"),D.style.zIndex=`${function(e,t,r){if(t instanceof n.PerspectiveCamera||t instanceof n.OrthographicCamera){const n=z.setFromMatrixPosition(e.matrixWorld),o=B.setFromMatrixPosition(t.matrixWorld),a=n.distanceTo(o),s=(r[1]-r[0])/(t.far-t.near),i=r[1]-s*t.far;return Math.round(s*a+i)}}(k.current,R,h)}`,m){const[e,t]=[_.width/2,_.height/2],r=R.projectionMatrix.elements[5]*t,{isOrthographicCamera:n,top:o,left:a,bottom:s,right:i}=R,l=j(R.matrixWorldInverse),u=n?`scale(${r})translate(${F(-(i+a)/2)}px,${F((o+s)/2)}px)`:`translateZ(${r}px)`;let m=k.current.matrixWorld;d&&(m=R.matrixWorldInverse.clone().transpose().copyPosition(m).scale(k.current.scale),m.elements[3]=m.elements[7]=m.elements[11]=0,m.elements[15]=1),D.style.width=_.width+"px",D.style.height=_.height+"px",D.style.perspective=n?"":`${r}px`,G.current&&W.current&&(G.current.style.transform=`${u}${l}translate(${e}px,${t}px)`,W.current.style.transform=I(m,1/((c||10)/400)))}else{const t=void 0===c?1:function(e,t){if(t instanceof n.OrthographicCamera)return t.zoom;if(t instanceof n.PerspectiveCamera){const r=z.setFromMatrixPosition(e.matrixWorld),n=B.setFromMatrixPosition(t.matrixWorld),o=t.fov*Math.PI/180,a=r.distanceTo(n);return 1/(2*Math.tan(o/2)*a)}return 1}(k.current,R)*c;D.style.transform=`translate3d(${e[0]}px,${e[1]}px,0) scale(${t})`}O.current=e,V.current=R.zoom}}})),b.createElement("group",E.default({},w,{ref:k}))}));let G=0;const W=T.default((e=>(n.DefaultLoadingManager.onStart=(t,r,n)=>{e({active:!0,item:t,loaded:r,total:n,progress:(r-G)/(n-G)*100})},n.DefaultLoadingManager.onLoad=()=>{e({active:!1})},n.DefaultLoadingManager.onError=t=>e((e=>({errors:[...e.errors,t]}))),n.DefaultLoadingManager.onProgress=(t,r,n)=>{r===n&&(G=n),e({active:!0,item:t,loaded:r,total:n,progress:(r-G)/(n-G)*100||100})},{errors:[],active:!1,progress:0,item:"",loaded:0,total:0}))),N=e=>`Loading ${e.toFixed(2)}%`;const H={container:{position:"absolute",top:0,left:0,width:"100%",height:"100%",background:"#171717",display:"flex",alignItems:"center",justifyContent:"center",transition:"opacity 300ms ease",zIndex:1e3},inner:{width:100,height:3,background:"#272727",textAlign:"center"},bar:{height:3,width:"100%",background:"white",transition:"transform 200ms",transformOrigin:"left center"},data:{display:"inline-block",position:"relative",fontVariantNumeric:"tabular-nums",marginTop:"0.8em",color:"#f0f0f0",fontSize:"0.6em",fontFamily:'-apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", "Helvetica Neue", Helvetica, Arial, Roboto, Ubuntu, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',whiteSpace:"nowrap"}},$=b.createContext(null);function q(){return b.useContext($)}const X=b.forwardRef((({children:e},t)=>{const r=b.useRef(null),n=q(),{width:a,height:s}=o.useThree((e=>e.viewport));return o.useFrame((()=>{r.current.position.x=n.horizontal?-a*(n.pages-1)*n.offset:0,r.current.position.y=n.horizontal?0:s*(n.pages-1)*n.offset})),b.createElement("group",{ref:C.default([t,r])},e)})),Z=b.forwardRef((({children:e,style:t,...r},n)=>{const a=q(),s=b.useRef(null),{width:i,height:l}=o.useThree((e=>e.size)),u=b.useContext(o.context);return o.useFrame((()=>{a.delta>a.eps&&(s.current.style.transform=`translate3d(${a.horizontal?-i*(a.pages-1)*a.offset:0}px,${a.horizontal?0:l*(a.pages-1)*-a.offset}px,0)`)})),M.render(b.createElement("div",E.default({ref:C.default([n,s]),style:{...t,position:"absolute",top:0,left:0,willChange:"transform"}},r),b.createElement($.Provider,{value:a},b.createElement(o.context.Provider,{value:u},e))),a.fixed),null})),Y=b.forwardRef((({html:e,...t},r)=>{const n=e?Z:X;return b.createElement(n,E.default({ref:r},t))}));const K=b.createContext([]);const Q=b.forwardRef((function({follow:e=!0,lockX:t=!1,lockY:r=!1,lockZ:n=!1,...a},s){const i=b.useRef();return o.useFrame((({camera:o})=>{if(!e||!i.current)return;const a=i.current.rotation.clone();i.current.quaternion.copy(o.quaternion),t&&(i.current.rotation.x=a.x),r&&(i.current.rotation.y=a.y),n&&(i.current.rotation.z=a.z)})),b.createElement("group",E.default({ref:C.default([i,s])},a))})),J=b.forwardRef((function({points:e,color:t="black",vertexColors:r,lineWidth:o,dashed:a,...s},i){const[l]=b.useState((()=>new u.Line2)),[c]=b.useState((()=>new u.LineMaterial)),[d]=b.useState((()=>new n.Vector2(512,512))),m=b.useMemo((()=>{const t=new u.LineGeometry,o=e.map((e=>e instanceof n.Vector3?e.toArray():e));if(t.setPositions(o.flat()),r){const e=r.map((e=>e instanceof n.Color?e.toArray():e));t.setColors(e.flat())}return t}),[e,r]);return b.useLayoutEffect((()=>{l.computeLineDistances()}),[e,l]),b.useLayoutEffect((()=>{a?c.defines.USE_DASH="":delete c.defines.USE_DASH,c.needsUpdate=!0}),[a,c]),b.useEffect((()=>()=>m.dispose()),[m]),b.createElement("primitive",E.default({object:l,ref:i},s),b.createElement("primitive",{object:m,attach:"geometry"}),b.createElement("primitive",E.default({object:c,attach:"material",color:t,vertexColors:Boolean(r),resolution:d,linewidth:o,dashed:a},s)))})),ee=new n.Vector3,te=b.forwardRef((function({start:e=[0,0,0],end:t=[0,0,0],mid:r,segments:o=20,...a},s){const i=b.useRef(null),[l]=b.useState((()=>new n.QuadraticBezierCurve3(void 0,void 0,void 0))),u=b.useCallback(((e,t,r,o=20)=>(e instanceof n.Vector3?l.v0.copy(e):l.v0.set(...e),t instanceof n.Vector3?l.v2.copy(t):l.v2.set(...t),r instanceof n.Vector3?l.v1.copy(r):l.v1.copy(l.v0.clone().add(l.v2.clone().sub(l.v0)).add(ee.set(0,l.v0.y-l.v2.y,0))),l.getPoints(o))),[]);b.useLayoutEffect((()=>{i.current.setPoints=(e,t,r)=>{const n=u(e,t,r);i.current.geometry&&i.current.geometry.setPositions(n.map((e=>e.toArray())).flat())}}),[]);const c=b.useMemo((()=>u(e,t,r,o)),[e,t,r,o]);return b.createElement(J,E.default({ref:C.default([i,s]),points:c},a))})),re=b.forwardRef((function({start:e,end:t,midA:r,midB:o,segments:a=20,...s},i){const l=b.useMemo((()=>{const s=e instanceof n.Vector3?e:new n.Vector3(...e),i=t instanceof n.Vector3?t:new n.Vector3(...t),l=r instanceof n.Vector3?r:new n.Vector3(...r),u=o instanceof n.Vector3?o:new n.Vector3(...o);return new n.CubicBezierCurve3(s,l,u,i).getPoints(a)}),[e,t,r,o,a]);return b.createElement(J,E.default({ref:i,points:l},s))})),ne=b.forwardRef((({url:e,distance:t=1,loop:r=!0,autoplay:a,...s},i)=>{const l=b.useRef(),u=o.useThree((({camera:e})=>e)),[c]=b.useState((()=>new n.AudioListener)),d=o.useLoader(n.AudioLoader,e);return b.useEffect((()=>{const e=l.current;e&&(e.setBuffer(d),e.setRefDistance(t),e.setLoop(r),a&&!e.isPlaying&&e.play())}),[d,u,t,r]),b.useEffect((()=>{const e=l.current;return u.add(c),()=>{u.remove(c),e&&(e.isPlaying&&e.stop(),e.source&&e.source._connected&&e.disconnect())}}),[]),b.createElement("positionalAudio",E.default({ref:C.default([l,i]),args:[c]},s))})),oe=b.forwardRef((({anchorX:e="center",anchorY:t="middle",children:r,onSync:n,...a},s)=>{const i=o.useThree((({invalidate:e})=>e)),[l]=b.useState((()=>new d.Text)),[u,c]=b.useMemo((()=>{const e=[];let t="";return b.Children.forEach(r,(r=>{"string"==typeof r||"number"==typeof r?t+=r:e.push(r)})),[e,t]}),[r]);return b.useLayoutEffect((()=>{l.sync((()=>{i(),n&&n(l)}))})),b.useEffect((()=>()=>l.dispose()),[l]),b.createElement("primitive",E.default({object:l,ref:s,text:c,anchorX:e,anchorY:t},a),u)}));o.extend({EffectComposer:u.EffectComposer,RenderPass:u.RenderPass,ShaderPass:u.ShaderPass});const ae=()=>{try{var e=document.createElement("canvas");return!(!window.WebGL2RenderingContext||!e.getContext("webgl2"))}catch(e){return!1}},se=b.forwardRef((({children:e,multisamping:t=8,renderIndex:r=1,disableGamma:a=!1,disableRenderPass:s=!1,...i},l)=>{const c=b.useRef(),d=o.useThree((({scene:e})=>e)),m=o.useThree((({camera:e})=>e)),f=o.useThree((({gl:e})=>e)),p=o.useThree((({size:e})=>e)),[h]=b.useState((()=>{if(ae()&&t>0){const e=new n.WebGLMultisampleRenderTarget(p.width,p.height,{format:n.RGBAFormat,encoding:n.sRGBEncoding});return e.samples=8,e}}));return b.useEffect((()=>{var e,t;null==(e=c.current)||e.setSize(p.width,p.height),null==(t=c.current)||t.setPixelRatio(f.getPixelRatio())}),[f,p]),o.useFrame((()=>{var e;return null==(e=c.current)?void 0:e.render()}),r),b.createElement("effectComposer",E.default({ref:C.default([l,c]),args:[f,h]},i),!s&&b.createElement("renderPass",{attachArray:"passes",args:[d,m]}),!a&&b.createElement("shaderPass",{attachArray:"passes",args:[u.GammaCorrectionShader]}),e)}));function ie(e,t,r,n){return class extends S.ShaderMaterial{constructor(){const o=Object.entries(e);super({uniforms:o.reduce(((e,[t,r])=>({...e,...S.UniformsUtils.clone({[t]:{value:r}})})),{}),vertexShader:t,fragmentShader:r}),o.forEach((([e])=>Object.defineProperty(this,e,{get:()=>this.uniforms[e].value,set:t=>this.uniforms[e].value=t}))),n&&n(this)}}}const le=e=>e===Object(e)&&!Array.isArray(e)&&"function"!=typeof e;function ue(e){const r=o.useThree((e=>e.gl)),a=o.useLoader(n.TextureLoader,le(e)?Object.values(e):e);if(t.useEffect((()=>{(Array.isArray(a)?a:[a]).forEach(r.initTexture)}),[r,a]),le(e)){const t=Object.keys(e),r={};return t.forEach((e=>Object.assign(r,{[e]:a[t.indexOf(e)]}))),r}return a}ue.preload=e=>o.useLoader.preload(n.TextureLoader,e),ue.clear=e=>o.useLoader.clear(n.TextureLoader,e);const ce=ie({color:new S.Color("white"),scale:[1,1],imageBounds:[1,1],map:null,zoom:1,grayscale:0},"\n varying vec2 vUv;\n void main() {\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);\n vUv = uv;\n }\n","\n // mostly from https://gist.github.com/statico/df64c5d167362ecf7b34fca0b1459a44\n varying vec2 vUv;\n uniform vec2 scale;\n uniform vec2 imageBounds;\n uniform vec3 color;\n uniform sampler2D map;\n uniform float zoom;\n uniform float grayscale;\n const vec3 luma = vec3(.299, 0.587, 0.114);\n vec4 toGrayscale(vec4 color, float intensity) {\n return vec4(mix(color.rgb, vec3(dot(color.rgb, luma)), intensity), color.a);\n }\n vec2 aspect(vec2 size) {\n return size / min(size.x, size.y);\n }\n void main() {\n vec2 s = aspect(scale);\n vec2 i = aspect(imageBounds);\n float rs = s.x / s.y;\n float ri = i.x / i.y;\n vec2 new = rs < ri ? vec2(i.x * s.y / i.y, s.y) : vec2(s.x, i.y * s.x / i.x);\n vec2 offset = (rs < ri ? vec2((new.x - s.x) / 2.0, 0.0) : vec2(0.0, (new.y - s.y) / 2.0)) / new;\n vec2 uv = vUv * s / new + offset;\n vec2 zUv = (uv - vec2(0.5, 0.5)) / zoom + vec2(0.5, 0.5);\n gl_FragColor = toGrayscale(texture2D(map, zUv) * vec4(color, 1.0), grayscale);\n }\n"),de=b.forwardRef((({children:e,color:t,segments:r=1,scale:n=1,zoom:a=1,grayscale:s=0,url:i,...l},u)=>{o.extend({ImageMaterial:ce});const c=ue(i),d=Array.isArray(n)?[n[0],n[1]]:[n,n],m=[c.image.width,c.image.height];return b.createElement("mesh",E.default({ref:u,scale:n},l),b.createElement("planeGeometry",{args:[1,1,r,r]}),b.createElement("imageMaterial",{color:t,map:c,zoom:a,grayscale:s,scale:d,imageBounds:m}),e)}));const me=b.forwardRef((({makeDefault:e,...t},r)=>{const n=o.useThree((({set:e})=>e)),a=o.useThree((({camera:e})=>e)),s=o.useThree((({size:e})=>e)),i=b.useRef();return b.useLayoutEffect((()=>{i.current&&!t.manual&&i.current.updateProjectionMatrix()}),[s,t]),b.useLayoutEffect((()=>{if(e&&i.current){const e=a;return n((()=>({camera:i.current}))),()=>n((()=>({camera:e})))}}),[a,i,e,n]),b.createElement("orthographicCamera",E.default({left:s.width/-2,right:s.width/2,top:s.height/2,bottom:s.height/-2,ref:C.default([i,r])},t))})),fe=b.forwardRef((({makeDefault:e,...t},r)=>{const n=o.useThree((({set:e})=>e)),a=o.useThree((({camera:e})=>e)),s=o.useThree((({size:e})=>e)),i=b.useRef();return b.useLayoutEffect((()=>{const{current:e}=i;e&&!t.manual&&(e.aspect=s.width/s.height,e.updateProjectionMatrix())}),[s,t]),b.useLayoutEffect((()=>{if(e&&i.current){const e=a;return n((()=>({camera:i.current}))),()=>n((()=>({camera:e})))}}),[a,i,e,n]),b.createElement("perspectiveCamera",E.default({ref:C.default([i,r])},t))}));const pe=b.forwardRef(((e,t)=>{const{camera:r,onChange:n,...a}=e,s=o.useThree((({camera:e})=>e)),i=o.useThree((({invalidate:e})=>e)),l=r||s,[c]=b.useState((()=>new u.DeviceOrientationControls(l)));return b.useEffect((()=>{const e=e=>{i(),n&&n(e)};return null==c||null==c.addEventListener||c.addEventListener("change",e),()=>null==c||null==c.removeEventListener?void 0:c.removeEventListener("change",e)}),[n,c,i]),o.useFrame((()=>null==c?void 0:c.update())),b.useEffect((()=>{const e=c;return null==e||e.connect(),()=>null==e?void 0:e.dispose()}),[c]),c?b.createElement("primitive",E.default({ref:t,dispose:void 0,object:c},a)):null})),he=b.forwardRef(((e,t)=>{const{onChange:r,...n}=e,a=o.useThree((({invalidate:e})=>e)),s=o.useThree((({camera:e})=>e)),i=o.useThree((({gl:e})=>e)),[l]=b.useState((()=>new u.FlyControls(s,i.domElement)));return b.useEffect((()=>{const e=e=>{a(),r&&r(e)};return null==l||null==l.addEventListener||l.addEventListener("change",e),()=>null==l||null==l.removeEventListener?void 0:l.removeEventListener("change",e)}),[r,l,a]),o.useFrame(((e,t)=>null==l?void 0:l.update(t))),l?b.createElement("primitive",E.default({ref:t,dispose:void 0,object:l},n)):null})),ve=b.forwardRef(((e={enableDamping:!0},t)=>{const{camera:r,onChange:n,onStart:a,onEnd:s,...i}=e,l=o.useThree((({invalidate:e})=>e)),c=o.useThree((({camera:e})=>e)),d=o.useThree((({gl:e})=>e.domElement)),m=r||c,f=b.useMemo((()=>new u.MapControls(m)),[m]);return b.useEffect((()=>{f.connect(d);const e=e=>{l(),n&&n(e)};return f.addEventListener("change",e),a&&f.addEventListener("start",a),s&&f.addEventListener("end",s),()=>{f.dispose(),f.removeEventListener("change",e),a&&f.removeEventListener("start",a),s&&f.removeEventListener("end",s)}}),[n,a,s,f,l,d]),o.useFrame((()=>f.update())),b.createElement("primitive",E.default({ref:t,dispose:void 0,object:f,enableDamping:!0},i))})),ge=t.forwardRef((({makeDefault:e,camera:r,regress:n,domElement:a,enableDamping:s=!0,onChange:i,onStart:l,onEnd:c,...d},m)=>{const f=o.useThree((({invalidate:e})=>e)),p=o.useThree((({camera:e})=>e)),h=o.useThree((({gl:e})=>e)),v=o.useThree((({events:e})=>e)),g=o.useThree((({set:e})=>e)),x=o.useThree((({get:e})=>e)),y=o.useThree((({performance:e})=>e)),w=r||p,M=a||("boolean"!=typeof v.connected?v.connected:h.domElement),S=t.useMemo((()=>new u.OrbitControls(w)),[w]);return o.useFrame((()=>{S.enabled&&S.update()})),t.useEffect((()=>{const e=e=>{f(),n&&y.regress(),i&&i(e)};return S.connect(M),S.addEventListener("change",e),l&&S.addEventListener("start",l),c&&S.addEventListener("end",c),()=>{S.removeEventListener("change",e),l&&S.removeEventListener("start",l),c&&S.removeEventListener("end",c),S.dispose()}}),[M,i,l,c,n,S,f]),t.useEffect((()=>{if(e){const e=x().controls;return g({controls:S}),()=>g({controls:e})}}),[e,S]),b.createElement("primitive",E.default({ref:m,object:S,enableDamping:s},d))})),xe=b.forwardRef((({makeDefault:e,camera:t,domElement:r,regress:n,onChange:a,onStart:s,onEnd:i,...l},c)=>{const{invalidate:d,camera:m,gl:f,events:p,set:h,get:v,performance:g,viewport:x}=o.useThree(),y=t||m,w=r||("boolean"!=typeof p.connected?p.connected:f.domElement),M=b.useMemo((()=>new u.TrackballControls(y)),[y]);return o.useFrame((()=>{M.enabled&&M.update()})),b.useEffect((()=>{const e=e=>{d(),n&&g.regress(),a&&a(e)};return M.connect(w),M.addEventListener("change",e),s&&M.addEventListener("start",s),i&&M.addEventListener("end",i),()=>{M.removeEventListener("change",e),s&&M.removeEventListener("start",s),i&&M.removeEventListener("end",i),M.dispose()}}),[w,a,s,i,n,M,d]),b.useEffect((()=>{M.handleResize()}),[x]),b.useEffect((()=>{if(e){const e=v().controls;return h({controls:M}),()=>h({controls:e})}}),[e,M]),b.createElement("primitive",E.default({ref:c,object:M},l))})),ye=t.forwardRef((({camera:e,makeDefault:r,regress:n,domElement:a,onChange:s,onStart:i,onEnd:l,...c},d)=>{const m=o.useThree((({invalidate:e})=>e)),f=o.useThree((({camera:e})=>e)),p=o.useThree((({gl:e})=>e)),h=o.useThree((({events:e})=>e)),v=o.useThree((({set:e})=>e)),g=o.useThree((({get:e})=>e)),x=o.useThree((({performance:e})=>e)),y=e||f,w=a||("boolean"!=typeof h.connected?h.connected:p.domElement),M=t.useMemo((()=>new u.ArcballControls(y)),[y]);return o.useFrame((()=>{M.enabled&&M.update()})),t.useEffect((()=>{const e=e=>{m(),n&&x.regress(),s&&s(e)};return M.connect(w),M.addEventListener("change",e),i&&M.addEventListener("start",i),l&&M.addEventListener("end",l),()=>{M.removeEventListener("change",e),i&&M.removeEventListener("start",i),l&&M.removeEventListener("end",l),M.dispose()}}),[w,s,i,l,n,M,m]),t.useEffect((()=>{if(r){const e=g().controls;return v({controls:M}),()=>v({controls:e})}}),[r,M]),b.createElement("primitive",E.default({ref:d,object:M},c))})),we=b.forwardRef((({children:e,domElement:t,onChange:r,onMouseDown:n,onMouseUp:a,onObjectChange:s,object:i,...l},c)=>{const d=["enabled","axis","mode","translationSnap","rotationSnap","scaleSnap","space","size","showX","showY","showZ"],{camera:m,...f}=l,p=_.default(f,d),h=L.default(f,d),v=o.useThree((e=>e.controls)),g=o.useThree((({gl:e})=>e)),x=o.useThree((({camera:e})=>e)),y=o.useThree((({invalidate:e})=>e)),w=m||x,M=b.useMemo((()=>new u.TransformControls(w,t||g.domElement)),[w,t,g.domElement]),T=b.useRef();return b.useLayoutEffect((()=>{i?null==M||M.attach(i instanceof S.Object3D?i:i.current):null==M||M.attach(T.current)}),[i,e,M]),b.useEffect((()=>{if(v){const e=e=>v.enabled=!e.value;return M.addEventListener("dragging-changed",e),()=>M.removeEventListener("dragging-changed",e)}}),[M,v]),b.useEffect((()=>{const e=e=>{y(),r&&r(e)};return null==M||null==M.addEventListener||M.addEventListener("change",e),n&&(null==M||null==M.addEventListener||M.addEventListener("mouseDown",n)),a&&(null==M||null==M.addEventListener||M.addEventListener("mouseUp",a)),s&&(null==M||null==M.addEventListener||M.addEventListener("objectChange",s)),()=>{null==M||null==M.removeEventListener||M.removeEventListener("change",e),n&&(null==M||null==M.removeEventListener||M.removeEventListener("mouseDown",n)),a&&(null==M||null==M.removeEventListener||M.removeEventListener("mouseUp",a)),s&&(null==M||null==M.removeEventListener||M.removeEventListener("objectChange",s))}}),[r,n,a,s,M,y]),M?b.createElement(b.Fragment,null,b.createElement("primitive",E.default({ref:c,dispose:void 0,object:M},p)),b.createElement("group",E.default({ref:T},h),e)):null})),Ee=b.forwardRef((({selector:e,onChange:t,onLock:r,onUnlock:n,...a},s)=>{const{camera:i,...l}=a,c=o.useThree((({gl:e})=>e)),d=o.useThree((({camera:e})=>e)),m=o.useThree((({invalidate:e})=>e)),f=i||d,[p]=b.useState((()=>new u.PointerLockControls(f,c.domElement)));return b.useEffect((()=>{const e=e=>{m(),t&&t(e)};return null==p||null==p.addEventListener||p.addEventListener("change",e),r&&(null==p||null==p.addEventListener||p.addEventListener("lock",r)),n&&(null==p||null==p.addEventListener||p.addEventListener("unlock",n)),()=>{null==p||null==p.removeEventListener||p.removeEventListener("change",e),r&&(null==p||null==p.addEventListener||p.addEventListener("lock",r)),n&&(null==p||null==p.addEventListener||p.addEventListener("unlock",n))}}),[t,r,n,p,m]),b.useEffect((()=>{const t=()=>null==p?void 0:p.lock(),r=e?Array.from(document.querySelectorAll(e)):[document];return r.forEach((e=>e&&e.addEventListener("click",t))),()=>{r.forEach((e=>e?e.removeEventListener("click",t):void 0))}}),[p,e]),p?b.createElement("primitive",E.default({ref:s,dispose:void 0,object:p},l)):null})),be=b.forwardRef(((e,t)=>{const r=o.useThree((({camera:e})=>e)),n=o.useThree((({gl:e})=>e)),[a]=b.useState((()=>new u.FirstPersonControls(r,n.domElement)));return o.useFrame(((e,t)=>{a.update(t)})),a?b.createElement("primitive",E.default({ref:t,object:a},e)):null}));function Me(e,t){const r=o.useThree((e=>e.mouse)),[a]=b.useState((()=>{const a=new n.Raycaster;return t&&o.applyProps(a,t,{}),function(t,o){a.setFromCamera(r,e instanceof n.Camera?e:e.current);const s=this.constructor.prototype.raycast.bind(this);s&&s(a,o)}}));return a}const Se=b.createContext({}),Te=()=>b.useContext(Se),Ce=2*Math.PI,Re=new n.Object3D,Le=new n.Matrix4,[_e,Pe]=[new n.Quaternion,new n.Quaternion],De=new n.Vector3,ze=new n.Vector3,Be="#f0f0f0",Ue="#999",Ae="black",Fe="black",ke=["Right","Left","Top","Bottom","Front","Back"],je=e=>new n.Vector3(...e).multiplyScalar(.38),Ve=[[1,1,1],[1,1,-1],[1,-1,1],[1,-1,-1],[-1,1,1],[-1,1,-1],[-1,-1,1],[-1,-1,-1]].map(je),Ie=[.25,.25,.25],Oe=[[1,1,0],[1,0,1],[1,0,-1],[1,-1,0],[0,1,1],[0,1,-1],[0,-1,1],[0,-1,-1],[-1,1,0],[-1,0,1],[-1,0,-1],[-1,-1,0]].map(je),Ge=Oe.map((e=>e.toArray().map((e=>0==e?.5:.25)))),We=({hover:e,index:t,font:r="20px Inter var, Arial, sans-serif",faces:a=ke,color:s=Be,hoverColor:i=Ue,textColor:l=Ae,strokeColor:u=Fe,opacity:c=1})=>{const d=o.useThree((e=>e.gl)),m=b.useMemo((()=>{const e=document.createElement("canvas");e.width=128,e.height=128;const o=e.getContext("2d");return o.fillStyle=s,o.fillRect(0,0,e.width,e.height),o.strokeStyle=u,o.strokeRect(0,0,e.width,e.height),o.font=r,o.textAlign="center",o.fillStyle=l,o.fillText(a[t].toUpperCase(),64,76),new n.CanvasTexture(e)}),[t,a,r,s,l,u]);return b.createElement("meshLambertMaterial",{map:m,"map-anisotropy":d.capabilities.getMaxAnisotropy()||1,attachArray:"material",color:e?i:"white",transparent:!0,opacity:c})},Ne=e=>{const{tweenCamera:t,raycast:r}=Te(),[n,o]=b.useState(null);return b.createElement("mesh",{raycast:r,onPointerOut:e=>{e.stopPropagation(),o(null)},onPointerMove:e=>{e.stopPropagation(),o(Math.floor(e.faceIndex/2))},onClick:e.onClick||(e=>{e.stopPropagation(),t(e.face.normal)})},[...Array(6)].map(((t,r)=>b.createElement(We,E.default({key:r,index:r,hover:n===r},e)))),b.createElement("boxGeometry",null))},He=({onClick:e,dimensions:t,position:r,hoverColor:n=Ue})=>{const{tweenCamera:o,raycast:a}=Te(),[s,i]=b.useState(!1);return b.createElement("mesh",{scale:1.01,position:r,raycast:a,onPointerOver:e=>{e.stopPropagation(),i(!0)},onPointerOut:e=>{e.stopPropagation(),i(!1)},onClick:e||(e=>{e.stopPropagation(),o(r)})},b.createElement("meshBasicMaterial",{color:s?n:"white",transparent:!0,opacity:.6,visible:s}),b.createElement("boxGeometry",{args:t}))};function $e({scale:e=[.8,.05,.05],color:t,rotation:r}){return b.createElement("group",{rotation:r},b.createElement("mesh",{position:[.4,0,0]},b.createElement("boxGeometry",{args:e}),b.createElement("meshBasicMaterial",{color:t,toneMapped:!1})))}function qe({onClick:e,font:t,disabled:r,arcStyle:a,label:s,labelColor:i,axisHeadScale:l=1,...u}){const c=o.useThree((e=>e.gl)),d=b.useMemo((()=>{const e=document.createElement("canvas");e.width=64,e.height=64;const r=e.getContext("2d");return r.beginPath(),r.arc(32,32,16,0,2*Math.PI),r.closePath(),r.fillStyle=a,r.fill(),s&&(r.font=t,r.textAlign="center",r.fillStyle=i,r.fillText(s,32,41)),new n.CanvasTexture(e)}),[a,s,i,t]),[m,f]=b.useState(!1),p=(s?1:.75)*(m?1.2:1)*l;return b.createElement("sprite",E.default({scale:p,onPointerOver:r?void 0:e=>{e.stopPropagation(),f(!0)},onPointerOut:r?void 0:e||(e=>{e.stopPropagation(),f(!1)})},u),b.createElement("spriteMaterial",{map:d,"map-anisotropy":c.capabilities.getMaxAnisotropy()||1,alphaTest:.3,opacity:s?1:.75,toneMapped:!1}))}function Xe(e,{path:t}){const[r]=o.useLoader(n.CubeTextureLoader,[e],(e=>e.setPath(t)));return r}function Ze(e){return o.useLoader(u.FBXLoader,e)}Xe.preload=(e,{path:t})=>o.useLoader.preload(n.CubeTextureLoader,[e],(e=>e.setPath(t))),Ze.preload=e=>o.useLoader.preload(u.FBXLoader,e),Ze.clear=e=>o.useLoader.clear(u.FBXLoader,e);let Ye=null;function Ke(e,t,r){return n=>{r&&r(n),e&&(Ye||(Ye=new u.DRACOLoader),Ye.setDecoderPath("string"==typeof e?e:"https://www.gstatic.com/draco/versioned/decoders/1.4.3/"),n.setDRACOLoader(Ye)),t&&n.setMeshoptDecoder("function"==typeof u.MeshoptDecoder?u.MeshoptDecoder():u.MeshoptDecoder)}}function Qe(e,t=!0,r=!0,n){return o.useLoader(u.GLTFLoader,e,Ke(t,r,n))}Qe.preload=(e,t=!0,r=!0,n)=>o.useLoader.preload(u.GLTFLoader,e,Ke(t,r,n)),Qe.clear=e=>o.useLoader.clear(u.GLTFLoader,e);const Je="https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master";function et(e,r=`${Je}/basis/`){const n=o.useThree((e=>e.gl)),a=o.useLoader(u.KTX2Loader,le(e)?Object.values(e):e,(e=>{e.detectSupport(n),e.setTranscoderPath(r)}));if(t.useEffect((()=>{(Array.isArray(a)?a:[a]).forEach(n.initTexture)}),[n,a]),le(e)){const t=Object.keys(e),r={};return t.forEach((e=>Object.assign(r,{[e]:a[t.indexOf(e)]}))),r}return a}function tt(e,t){"function"==typeof e?e(t):null!=e&&(e.current=t)}function rt(e,r,n){const a=o.useThree((({gl:e})=>e)),s=o.useThree((({size:e})=>e)),i=t.useMemo((()=>a.getPixelRatio()),[a]),l="number"==typeof e?e:s.width*i,u="number"==typeof r?r:s.height*i,c=("number"==typeof e?n:e)||{},d=t.useMemo((()=>{const{multisample:e,samples:t,...r}=c;let n;return e&&a.capabilities.isWebGL2?(n=new S.WebGLMultisampleRenderTarget(l,u,r),t&&(n.samples=t)):n=new S.WebGLRenderTarget(l,u,r),n}),[]);return t.useEffect((()=>{d.setSize(l,u)}),[d,l,u]),t.useEffect((()=>()=>d.dispose()),[]),d}et.preload=(e,t=`${Je}/basis/`)=>o.useLoader.preload(u.KTX2Loader,e,(e=>{e.setTranscoderPath(t)})),et.clear=e=>o.useLoader.clear(u.KTX2Loader,e);const nt=b.forwardRef((({children:e,curve:t},r)=>{const[n,o]=b.useState(),a=b.useRef(),s=b.useRef();return b.useImperativeHandle(r,(()=>({moveAlongCurve:e=>{var t;null==(t=s.current)||t.moveAlongCurve(e)}}))),b.useEffect((()=>{!s.current&&a.current&&r&&(s.current=new u.Flow(a.current),o(s.current.object3D))}),[e,r]),b.useEffect((()=>{var e;a.current&&t&&(null==(e=s.current)||e.updateCurve(0,t))}),[t]),n?b.createElement("primitive",{object:n}):b.cloneElement(b.Children.only(e),{ref:a})}));class ot extends n.MeshPhysicalMaterial{constructor(e={}){super(e),this.setValues(e),this._time={value:0},this._distort={value:.4},this._radius={value:1}}onBeforeCompile(e){e.uniforms.time=this._time,e.uniforms.radius=this._radius,e.uniforms.distort=this._distort,e.vertexShader=`\n uniform float time;\n uniform float radius;\n uniform float distort;\n #define GLSLIFY 1\nvec3 mod289(vec3 x){return x-floor(x*(1.0/289.0))*289.0;}vec4 mod289(vec4 x){return x-floor(x*(1.0/289.0))*289.0;}vec4 permute(vec4 x){return mod289(((x*34.0)+1.0)*x);}vec4 taylorInvSqrt(vec4 r){return 1.79284291400159-0.85373472095314*r;}float snoise(vec3 v){const vec2 C=vec2(1.0/6.0,1.0/3.0);const vec4 D=vec4(0.0,0.5,1.0,2.0);vec3 i=floor(v+dot(v,C.yyy));vec3 x0=v-i+dot(i,C.xxx);vec3 g=step(x0.yzx,x0.xyz);vec3 l=1.0-g;vec3 i1=min(g.xyz,l.zxy);vec3 i2=max(g.xyz,l.zxy);vec3 x1=x0-i1+C.xxx;vec3 x2=x0-i2+C.yyy;vec3 x3=x0-D.yyy;i=mod289(i);vec4 p=permute(permute(permute(i.z+vec4(0.0,i1.z,i2.z,1.0))+i.y+vec4(0.0,i1.y,i2.y,1.0))+i.x+vec4(0.0,i1.x,i2.x,1.0));float n_=0.142857142857;vec3 ns=n_*D.wyz-D.xzx;vec4 j=p-49.0*floor(p*ns.z*ns.z);vec4 x_=floor(j*ns.z);vec4 y_=floor(j-7.0*x_);vec4 x=x_*ns.x+ns.yyyy;vec4 y=y_*ns.x+ns.yyyy;vec4 h=1.0-abs(x)-abs(y);vec4 b0=vec4(x.xy,y.xy);vec4 b1=vec4(x.zw,y.zw);vec4 s0=floor(b0)*2.0+1.0;vec4 s1=floor(b1)*2.0+1.0;vec4 sh=-step(h,vec4(0.0));vec4 a0=b0.xzyw+s0.xzyw*sh.xxyy;vec4 a1=b1.xzyw+s1.xzyw*sh.zzww;vec3 p0=vec3(a0.xy,h.x);vec3 p1=vec3(a0.zw,h.y);vec3 p2=vec3(a1.xy,h.z);vec3 p3=vec3(a1.zw,h.w);vec4 norm=taylorInvSqrt(vec4(dot(p0,p0),dot(p1,p1),dot(p2,p2),dot(p3,p3)));p0*=norm.x;p1*=norm.y;p2*=norm.z;p3*=norm.w;vec4 m=max(0.6-vec4(dot(x0,x0),dot(x1,x1),dot(x2,x2),dot(x3,x3)),0.0);m=m*m;return 42.0*dot(m*m,vec4(dot(p0,x0),dot(p1,x1),dot(p2,x2),dot(p3,x3)));}\n ${e.vertexShader}\n `,e.vertexShader=e.vertexShader.replace("#include <begin_vertex>","\n float updateTime = time / 50.0;\n float noise = snoise(vec3(position / 2.0 + updateTime * 5.0));\n vec3 transformed = vec3(position * (noise * pow(distort, 2.0) + radius));\n ")}get time(){return this._time.value}set time(e){this._time.value=e}get distort(){return this._distort.value}set distort(e){this._distort.value=e}get radius(){return this._radius.value}set radius(e){this._radius.value=e}}const at=b.forwardRef((({speed:e=1,...t},r)=>{const[n]=b.useState((()=>new ot));return o.useFrame((t=>n&&(n.time=t.clock.getElapsedTime()*e))),b.createElement("primitive",E.default({dispose:void 0,object:n,ref:r,attach:"material"},t))}));class st extends n.MeshStandardMaterial{constructor(e={}){super(e),this.setValues(e),this._time={value:0},this._factor={value:1}}onBeforeCompile(e){e.uniforms.time=this._time,e.uniforms.factor=this._factor,e.vertexShader=`\n uniform float time;\n uniform float factor;\n ${e.vertexShader}\n `,e.vertexShader=e.vertexShader.replace("#include <begin_vertex>","float theta = sin( time + position.y ) / 2.0 * factor;\n float c = cos( theta );\n float s = sin( theta );\n mat3 m = mat3( c, 0, s, 0, 1, 0, -s, 0, c );\n vec3 transformed = vec3( position ) * m;\n vNormal = vNormal * m;")}get time(){return this._time.value}set time(e){this._time.value=e}get factor(){return this._factor.value}set factor(e){this._factor.value=e}}const it=b.forwardRef((({speed:e=1,...t},r)=>{const[n]=b.useState((()=>new st));return o.useFrame((t=>n&&(n.time=t.clock.getElapsedTime()*e))),b.createElement("primitive",E.default({dispose:void 0,object:n,ref:r,attach:"material"},t))}));class lt extends n.ShaderMaterial{constructor(e=new n.Vector2){super({uniforms:{inputBuffer:new n.Uniform(null),depthBuffer:new n.Uniform(null),resolution:new n.Uniform(new n.Vector2),texelSize:new n.Uniform(new n.Vector2),halfTexelSize:new n.Uniform(new n.Vector2),kernel:new n.Uniform(0),scale:new n.Uniform(1),cameraNear:new n.Uniform(0),cameraFar:new n.Uniform(1),minDepthThreshold:new n.Uniform(0),maxDepthThreshold:new n.Uniform(1),depthScale:new n.Uniform(0),depthToBlurRatioBias:new n.Uniform(.25)},fragmentShader:"#include <common>\n #include <dithering_pars_fragment> \n uniform sampler2D inputBuffer;\n uniform sampler2D depthBuffer;\n uniform float cameraNear;\n uniform float cameraFar;\n uniform float minDepthThreshold;\n uniform float maxDepthThreshold;\n uniform float depthScale;\n uniform float depthToBlurRatioBias;\n varying vec2 vUv;\n varying vec2 vUv0;\n varying vec2 vUv1;\n varying vec2 vUv2;\n varying vec2 vUv3;\n\n void main() {\n float depthFactor = 0.0;\n \n #ifdef USE_DEPTH\n vec4 depth = texture2D(depthBuffer, vUv);\n depthFactor = smoothstep(minDepthThreshold, maxDepthThreshold, 1.0-(depth.r * depth.a));\n depthFactor *= depthScale;\n depthFactor = max(0.0, min(1.0, depthFactor + 0.25));\n #endif\n \n vec4 sum = texture2D(inputBuffer, mix(vUv0, vUv, depthFactor));\n sum += texture2D(inputBuffer, mix(vUv1, vUv, depthFactor));\n sum += texture2D(inputBuffer, mix(vUv2, vUv, depthFactor));\n sum += texture2D(inputBuffer, mix(vUv3, vUv, depthFactor));\n gl_FragColor = sum * 0.25 ;\n\n #include <dithering_fragment>\n }",vertexShader:"uniform vec2 texelSize;\n uniform vec2 halfTexelSize;\n uniform float kernel;\n uniform float scale;\n varying vec2 vUv;\n varying vec2 vUv0;\n varying vec2 vUv1;\n varying vec2 vUv2;\n varying vec2 vUv3;\n\n void main() {\n vec2 uv = position.xy * 0.5 + 0.5;\n vUv = uv;\n\n vec2 dUv = (texelSize * vec2(kernel) + halfTexelSize) * scale;\n vUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\n vUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\n vUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\n vUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\n\n gl_Position = vec4(position.xy, 1.0, 1.0);\n }",blending:n.NoBlending,depthWrite:!1,depthTest:!1}),this.toneMapped=!1,this.setTexelSize(e.x,e.y),this.kernel=new Float32Array([0,1,2,2,3])}setTexelSize(e,t){this.uniforms.texelSize.value.set(e,t),this.uniforms.halfTexelSize.value.set(e,t).multiplyScalar(.5)}setResolution(e){this.uniforms.resolution.value.copy(e)}}class ut{constructor({gl:e,resolution:t,width:r=500,height:o=500,minDepthThreshold:a=0,maxDepthThreshold:s=1,depthScale:i=0,depthToBlurRatioBias:l=.25}){this.renderToScreen=!1,this.renderTargetA=new n.WebGLRenderTarget(t,t,{minFilter:n.LinearFilter,magFilter:n.LinearFilter,stencilBuffer:!1,depthBuffer:!1,encoding:e.outputEncoding}),this.renderTargetB=this.renderTargetA.clone(),this.convolutionMaterial=new lt,this.convolutionMaterial.setTexelSize(1/r,1/o),this.convolutionMaterial.setResolution(new n.Vector2(r,o)),this.scene=new n.Scene,this.camera=new n.Camera,this.convolutionMaterial.uniforms.minDepthThreshold.value=a,this.convolutionMaterial.uniforms.maxDepthThreshold.value=s,this.convolutionMaterial.uniforms.depthScale.value=i,this.convolutionMaterial.uniforms.depthToBlurRatioBias.value=l,this.convolutionMaterial.defines.USE_DEPTH=i>0;const u=new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),c=new Float32Array([0,0,2,0,0,2]),d=new n.BufferGeometry;d.setAttribute("position",new n.BufferAttribute(u,3)),d.setAttribute("uv",new n.BufferAttribute(c,2)),this.screen=new n.Mesh(d,this.convolutionMaterial),this.screen.frustumCulled=!1,this.scene.add(this.screen)}render(e,t,r){const n=this.scene,o=this.camera,a=this.renderTargetA,s=this.renderTargetB;let i=this.convolutionMaterial,l=i.uniforms;l.depthBuffer.value=t.depthTexture;const u=i.kernel;let c,d,m,f=t;for(d=0,m=u.length-1;d<m;++d)c=0==(1&d)?a:s,l.kernel.value=u[d],l.inputBuffer.value=f.texture,e.setRenderTarget(c),e.render(n,o),f=c;l.kernel.value=u[d],l.inputBuffer.value=f.texture,e.setRenderTarget(this.renderToScreen?null:r),e.render(n,o)}}class ct extends n.MeshStandardMaterial{constructor(e={}){super(e),this._debug={value:0},this._tDepth={value:null},this._distortionMap={value:null},this._tDiffuse={value:null},this._tDiffuseBlur={value:null},this._textureMatrix={value:null},this._hasBlur={value:!1},this._mirror={value:0},this._mixBlur={value:0},this._blurStrength={value:.5},this._minDepthThreshold={value:.9},this._maxDepthThreshold={value:1},this._depthScale={value:0},this._depthToBlurRatioBias={value:.25},this._distortion={value:1},this._mixContrast={value:1},this.setValues(e)}onBeforeCompile(e){var t;null!=(t=e.defines)&&t.USE_UV||(e.defines.USE_UV=""),e.uniforms.debug=this._debug,e.uniforms.hasBlur=this._hasBlur,e.uniforms.tDiffuse=this._tDiffuse,e.uniforms.tDepth=this._tDepth,e.uniforms.distortionMap=this._distortionMap,e.uniforms.tDiffuseBlur=this._tDiffuseBlur,e.uniforms.textureMatrix=this._textureMatrix,e.uniforms.mirror=this._mirror,e.uniforms.mixBlur=this._mixBlur,e.uniforms.mixStrength=this._blurStrength,e.uniforms.minDepthThreshold=this._minDepthThreshold,e.uniforms.maxDepthThreshold=this._maxDepthThreshold,e.uniforms.depthScale=this._depthScale,e.uniforms.depthToBlurRatioBias=this._depthToBlurRatioBias,e.uniforms.distortion=this._distortion,e.uniforms.mixContrast=this._mixContrast,e.vertexShader=`\n uniform mat4 textureMatrix;\n varying vec4 my_vUv; \n ${e.vertexShader}`,e.vertexShader=e.vertexShader.replace("#include <project_vertex>","#include <project_vertex>\n my_vUv = textureMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );"),e.fragmentShader=`\n uniform int debug;\n uniform sampler2D tDiffuse;\n uniform sampler2D tDiffuseBlur;\n uniform sampler2D tDepth;\n uniform sampler2D distortionMap;\n uniform float distortion;\n uniform float cameraNear;\n\t\t\t uniform float cameraFar;\n uniform bool hasBlur;\n uniform float mixBlur;\n uniform float mirror;\n uniform float mixStrength;\n uniform float minDepthThreshold;\n uniform float maxDepthThreshold;\n uniform float mixContrast;\n uniform float depthScale;\n uniform float depthToBlurRatioBias;\n varying vec4 my_vUv; \n ${e.fragmentShader}`,e.fragmentShader=e.fragmentShader.replace("#include <emissivemap_fragment>","#include <emissivemap_fragment>\n \n float distortionFactor = 0.0;\n #ifdef USE_DISTORTION\n distortionFactor = texture2D(distortionMap, vUv).r * distortion;\n #endif\n\n vec4 new_vUv = my_vUv;\n new_vUv.x += distortionFactor;\n new_vUv.y += distortionFactor;\n\n vec4 base = texture2DProj(tDiffuse, new_vUv);\n vec4 blur = texture2DProj(tDiffuseBlur, new_vUv);\n \n vec4 merge = base;\n \n #ifdef USE_NORMALMAP\n vec2 normal_uv = vec2(0.0);\n vec4 normalColor = texture2D(normalMap, vUv * normalScale);\n vec3 my_normal = normalize( vec3( normalColor.r * 2.0 - 1.0, normalColor.b, normalColor.g * 2.0 - 1.0 ) );\n vec3 coord = new_vUv.xyz / new_vUv.w;\n normal_uv = coord.xy + coord.z * my_normal.xz * 0.05;\n vec4 base_normal = texture2D(tDiffuse, normal_uv);\n vec4 blur_normal = texture2D(tDiffuseBlur, normal_uv);\n merge = base_normal;\n blur = blur_normal;\n #endif\n\n float depthFactor = 0.0001;\n float blurFactor = 0.0;\n\n #ifdef USE_DEPTH\n vec4 depth = texture2DProj(tDepth, new_vUv);\n depthFactor = smoothstep(minDepthThreshold, maxDepthThreshold, 1.0-(depth.r * depth.a));\n depthFactor *= depthScale;\n depthFactor = max(0.0001, min(1.0, depthFactor));\n\n #ifdef USE_BLUR\n blur = blur * min(1.0, depthFactor + depthToBlurRatioBias);\n merge = merge * min(1.0, depthFactor + 0.5);\n #else\n merge = merge * depthFactor;\n #endif\n \n #endif\n\n float reflectorRoughnessFactor = roughness;\n #ifdef USE_ROUGHNESSMAP\n vec4 reflectorTexelRoughness = texture2D( roughnessMap, vUv );\n reflectorRoughnessFactor *= reflectorTexelRoughness.g;\n #endif\n \n #ifdef USE_BLUR\n blurFactor = min(1.0, mixBlur * reflectorRoughnessFactor);\n merge = mix(merge, blur, blurFactor);\n #endif\n\n vec4 newMerge = vec4(0.0, 0.0, 0.0, 1.0);\n newMerge.r = (merge.r - 0.5) * mixContrast + 0.5;\n newMerge.g = (merge.g - 0.5) * mixContrast + 0.5;\n newMerge.b = (merge.b - 0.5) * mixContrast + 0.5;\n\n diffuseColor.rgb = diffuseColor.rgb * ((1.0 - min(1.0, mirror)) + newMerge.rgb * mixStrength); \n diffuseColor = sRGBToLinear(diffuseColor);\n \n if (debug == 1) {\n diffuseColor = sRGBToLinear(vec4(vec3(depthFactor), 1.0));\n }\n if (debug == 2) {\n diffuseColor = sRGBToLinear(vec4(vec3(blurFactor), 1.0));\n }\n if (debug == 3) {\n diffuseColor = sRGBToLinear(texture2DProj(tDiffuse, new_vUv));\n }\n if (debug == 4) {\n diffuseColor = sRGBToLinear(texture2DProj(tDiffuseBlur, new_vUv));\n }\n ")}get tDiffuse(){return this._tDiffuse.value}set tDiffuse(e){this._tDiffuse.value=e}get tDepth(){return this._tDepth.value}set tDepth(e){this._tDepth.value=e}get distortionMap(){return this._distortionMap.value}set distortionMap(e){this._distortionMap.value=e}get tDiffuseBlur(){return this._tDiffuseBlur.value}set tDiffuseBlur(e){this._tDiffuseBlur.value=e}get textureMatrix(){return this._textureMatrix.value}set textureMatrix(e){this._textureMatrix.value=e}get hasBlur(){return this._hasBlur.value}set hasBlur(e){this._hasBlur.value=e}get mirror(){return this._mirror.value}set mirror(e){this._mirror.value=e}get mixBlur(){return this._mixBlur.value}set mixBlur(e){this._mixBlur.value=e}get mixStrength(){return this._blurStrength.value}set mixStrength(e){this._blurStrength.value=e}get minDepthThreshold(){return this._minDepthThreshold.value}set minDepthThreshold(e){this._minDepthThreshold.value=e}get maxDepthThreshold(){return this._maxDepthThreshold.value}set maxDepthThreshold(e){this._maxDepthThreshold.value=e}get depthScale(){return this._depthScale.value}set depthScale(e){this._depthScale.value=e}get debug(){return this._debug.value}set debug(e){this._debug.value=e}get depthToBlurRatioBias(){return this._depthToBlurRatioBias.value}set depthToBlurRatioBias(e){this._depthToBlurRatioBias.value=e}get distortion(){return this._distortion.value}set distortion(e){this._distortion.value=e}get mixContrast(){return this._mixContrast.value}set mixContrast(e){this._mixContrast.value=e}}o.extend({MeshReflectorMaterialImpl:ct});const dt=b.forwardRef((({mixBlur:e=0,mixStrength:t=1,resolution:r=256,blur:a=[0,0],minDepthThreshold:s=.9,maxDepthThreshold:i=1,depthScale:l=0,depthToBlurRatioBias:u=.25,mirror:c=0,debug:d=0,distortion:m=1,mixContrast:f=1,distortionMap:p,...h},v)=>{const g=o.useThree((({gl:e})=>e)),x=o.useThree((({camera:e})=>e)),y=o.useThree((({scene:e})=>e)),w=(a=Array.isArray(a)?a:[a,a])[0]+a[1]>0,M=b.useRef(null),[S]=b.useState((()=>new n.Plane)),[T]=b.useState((()=>new n.Vector3)),[R]=b.useState((()=>new n.Vector3)),[L]=b.useState((()=>new n.Vector3)),[_]=b.useState((()=>new n.Matrix4)),[P]=b.useState((()=>new n.Vector3(0,0,-1))),[D]=b.useState((()=>new n.Vector4)),[z]=b.useState((()=>new n.Vector3)),[B]=b.useState((()=>new n.Vector3)),[U]=b.useState((()=>new n.Vector4)),[A]=b.useState((()=>new n.Matrix4)),[F]=b.useState((()=>new n.PerspectiveCamera)),k=b.useCallback((()=>{var e;const t=M.current.parent||(null==(e=M.current)?void 0:e.__r3f.parent);if(!t)return;if(R.setFromMatrixPosition(t.matrixWorld),L.setFromMatrixPosition(x.matrixWorld),_.extractRotation(t.matrixWorld),T.set(0,0,1),T.applyMatrix4(_),z.subVectors(R,L),z.dot(T)>0)return;z.reflect(T).negate(),z.add(R),_.extractRotation(x.matrixWorld),P.set(0,0,-1),P.applyMatrix4(_),P.add(L),B.subVectors(R,P),B.reflect(T).negate(),B.add(R),F.position.copy(z),F.up.set(0,1,0),F.up.applyMatrix4(_),F.up.reflect(T),F.lookAt(B),F.far=x.far,F.updateMatrixWorld(),F.projectionMatrix.copy(x.projectionMatrix),A.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),A.multiply(F.projectionMatrix),A.multiply(F.matrixWorldInverse),A.multiply(t.matrixWorld),S.setFromNormalAndCoplanarPoint(T,R),S.applyMatrix4(F.matrixWorldInverse),D.set(S.normal.x,S.normal.y,S.normal.z,S.constant);const r=F.projectionMatrix;U.x=(Math.sign(D.x)+r.elements[8])/r.elements[0],U.y=(Math.sign(D.y)+r.elements[9])/r.elements[5],U.z=-1,U.w=(1+r.elements[10])/r.elements[14],D.multiplyScalar(2/D.dot(U)),r.elements[2]=D.x,r.elements[6]=D.y,r.elements[10]=D.z+1,r.elements[14]=D.w}),[x]),[j,V,I,O]=b.useMemo((()=>{const o={minFilter:n.LinearFilter,magFilter:n.LinearFilter,encoding:g.outputEncoding},h=new n.WebGLRenderTarget(r,r,o);h.depthBuffer=!0,h.depthTexture=new n.DepthTexture(r,r),h.depthTexture.format=n.DepthFormat,h.depthTexture.type=n.UnsignedShortType;const v=new n.WebGLRenderTarget(r,r,o);return[h,v,new ut({gl:g,resolution:r,width:a[0],height:a[1],minDepthThreshold:s,maxDepthThreshold:i,depthScale:l,depthToBlurRatioBias:u}),{mirror:c,textureMatrix:A,mixBlur:e,tDiffuse:h.texture,tDepth:h.depthTexture,tDiffuseBlur:v.texture,hasBlur:w,mixStrength:t,minDepthThreshold:s,maxDepthThreshold:i,depthScale:l,depthToBlurRatioBias:u,transparent:!0,debug:d,distortion:m,distortionMap:p,mixContrast:f,"defines-USE_BLUR":w?"":void 0,"defines-USE_DEPTH":l>0?"":void 0,"defines-USE_DISTORTION":p?"":void 0}]}),[g,a,A,r,c,w,e,t,s,i,l,u,d,m,p,f]);return o.useFrame((()=>{var e;const t=M.current.parent||(null==(e=M.current)?void 0:e.__r3f.parent);if(!t)return;t.visible=!1;const r=g.xr.enabled,n=g.shadowMap.autoUpdate;k(),g.xr.enabled=!1,g.shadowMap.autoUpdate=!1,g.setRenderTarget(j),g.state.buffers.depth.setMask(!0),g.autoClear||g.clear(),g.render(y,F),w&&I.render(g,j,V),g.xr.enabled=r,g.shadowMap.autoUpdate=n,t.visible=!0,g.setRenderTarget(null)})),b.createElement("meshReflectorMaterialImpl",E.default({attach:"material",key:"key"+O["defines-USE_BLUR"]+O["defines-USE_DEPTH"]+O["defines-USE_DISTORTION"],ref:C.default([M,v])},O,h))}));class mt extends S.ShaderMaterial{constructor(){super({transparent:!0,uniforms:{size:{value:1}},vertexShader:S.ShaderLib.points.vertexShader,fragmentShader:"\n varying vec3 vColor;\n void main() {\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\n float r = dot(cxy, cxy);\n float delta = fwidth(r);\n vec3 color = vColor;\n #ifdef TONE_MAPPING\n color = toneMapping(color);\n #endif\n gl_FragColor = linearToOutputTexel(vec4(color, 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r)));\n }",vertexColors:!0})}get scale(){return this.uniforms.size.value}set scale(e){this.uniforms.size.value=e}}const ft=b.forwardRef(((e,t)=>{const[r]=b.useState((()=>new mt));return b.createElement("primitive",E.default({object:r,ref:t,attach:"material"},e))}));let pt=!1;function ht(e){const t=e+"BufferGeometry";return b.forwardRef((({args:e,children:r,...n},o)=>b.createElement("mesh",E.default({ref:o},n),b.createElement(t,{attach:"geometry",args:e}),r)))}const vt=ht("box"),gt=ht("circle"),xt=ht("cone"),yt=ht("cylinder"),wt=ht("sphere"),Et=ht("plane"),bt=ht("tube"),Mt=ht("torus"),St=ht("torusKnot"),Tt=ht("tetrahedron"),Ct=ht("ring"),Rt=ht("polyhedron"),Lt=ht("icosahedron"),_t=ht("octahedron"),Pt=ht("dodecahedron"),Dt=ht("extrude"),zt=ht("lathe"),Bt=1e-5;const Ut=b.forwardRef((function({args:[e=1,t=1,r=1]=[],radius:o=.05,smoothness:a=4,children:s,...i},l){const u=b.useMemo((()=>function(e,t,r){const o=new n.Shape,a=r-Bt;return o.absarc(Bt,Bt,Bt,-Math.PI/2,-Math.PI,!0),o.absarc(Bt,t-2*a,Bt,Math.PI,Math.PI/2,!0),o.absarc(e-2*a,t-2*a,Bt,Math.PI/2,0,!0),o.absarc(e-2*a,Bt,Bt,0,-Math.PI/2,!0),o}(e,t,o)),[e,t,o]),c=b.useMemo((()=>({depth:r-2*o,bevelEnabled:!0,bevelSegments:2*a,steps:1,bevelSize:o-Bt,bevelThickness:o,curveSegments:a})),[r,o,a]),d=b.useRef();return b.useLayoutEffect((()=>{d.current&&d.current.center()}),[u,c]),b.createElement("mesh",E.default({ref:l},i),b.createElement("extrudeBufferGeometry",{attach:"geometry",ref:d,args:[u,c]}),s)}));function At(){const e=new S.BufferGeometry,t=new Float32Array([-1,-1,3,-1,-1,3]);return e.setAttribute("position",new S.BufferAttribute(t,2)),e}const Ft=b.forwardRef((function({children:e,...t},r){const n=b.useMemo(At,[]);return b.createElement("mesh",E.default({ref:r,geometry:n,frustumCulled:!1},t),e)})),kt=b.forwardRef((function({children:e,alignTop:t,...r},o){const a=b.useRef(null),s=b.useRef(null);return b.useLayoutEffect((()=>{a.current.position.set(0,0,0),a.current.updateWorldMatrix(!0,!0);const e=(new n.Box3).setFromObject(s.current),r=new n.Vector3,o=new n.Sphere,i=e.max.y-e.min.y;e.getCenter(r),e.getBoundingSphere(o),a.current.position.set(-r.x,-r.y+(t?i/2:0),-r.z)}),[e]),b.createElement("group",E.default({ref:o},r),b.createElement("group",{ref:a},b.createElement("group",{ref:s},e)))})),jt=e=>e&&e.isOrthographicCamera,Vt=b.createContext(null);const It=b.forwardRef((({intensity:e=1,decay:t,decayRate:r=.65,maxYaw:n=.1,maxPitch:a=.1,maxRoll:s=.1,yawFrequency:i=.1,pitchFrequency:l=.1,rollFrequency:c=.1,controls:d},m)=>{const f=o.useThree((e=>e.camera)),p=o.useThree((e=>e.controls)),h=b.useRef(e),v=b.useRef(f.rotation.clone()),[g]=b.useState((()=>new u.SimplexNoise)),[x]=b.useState((()=>new u.SimplexNoise)),[y]=b.useState((()=>new u.SimplexNoise)),w=()=>{(h.current<0||h.current>1)&&(h.current=h.current<0?0:1)};return b.useImperativeHandle(m,(()=>({getIntensity:()=>h.current,setIntensity:e=>{h.current=e,w()}})),[]),b.useEffect((()=>{const e=p||(null==d?void 0:d.current),t=()=>{v.current=f.rotation.clone()};return null==e||e.addEventListener("change",t),()=>{null==e||e.removeEventListener("change",t)}}),[d,p]),o.useFrame((({clock:e},o)=>{const u=Math.pow(h.current,2),d=n*u*g.noise(e.elapsedTime*i,1),m=a*u*x.noise(e.elapsedTime*l,1),p=s*u*y.noise(e.elapsedTime*c,1);f.rotation.set(v.current.x+m,v.current.y+d,v.current.z+p),t&&h.current>0&&(h.current-=r*o,w())})),null}));const Ot={sunset:"venice_sunset_1k.hdr",dawn:"kiara_1_dawn_1k.hdr",night:"dikhololo_night_1k.hdr",warehouse:"empty_warehouse_01_1k.hdr",forest:"forest_slope_1k.hdr",apartment:"lebombo_1k.hdr",studio:"studio_small_03_1k.hdr",city:"potsdamer_platz_1k.hdr",park:"rooitou_park_1k.hdr",lobby:"st_fagans_interior_1k.hdr"};function Gt({background:e=!1,files:t=["/px.png","/nx.png","/py.png","/ny.png","/pz.png","/nz.png"],path:r="",preset:a,scene:s,extensions:i}){if(a){if(!(a in Ot))throw new Error("Preset must be one of: "+Object.keys(Ot).join(", "));t=Ot[a],r="https://rawcdn.githack.com/pmndrs/drei-assets/aa3600359ba664d546d05821bcbca42013587df2/hdri/"}const l=o.useThree((({scene:e})=>e)),c=Array.isArray(t),d=c?n.CubeTextureLoader:u.RGBELoader,m=o.useLoader(d,c?[t]:t,(e=>{e.setPath(r),null==e.setDataType||e.setDataType(n.FloatType),i&&i(e)})),f=c?m[0]:m;return f.mapping=n.EquirectangularReflectionMapping,b.useLayoutEffect((()=>{const t=s?s.background:l.background,r=s?s.environment:l.environment;return s?(s.environment=f,e&&(s.background=f)):(l.environment=f,e&&(l.background=f)),()=>{s?(s.environment=r,s.background=t):(l.environment=r,l.background=t),f.dispose()}}),[f,e,s]),null}const Wt=b.forwardRef((({scale:e,frames:t=1/0,opacity:r=1,width:n=1,height:a=1,blur:s=1,far:i=10,resolution:l=256,smooth:c=!0,...d},m)=>{const f=o.useThree((({scene:e})=>e)),p=o.useThree((({gl:e})=>e)),h=b.useRef(null);n*=Array.isArray(e)?e[0]:e||1,a*=Array.isArray(e)?e[1]:e||1;const[v,g,x,y,w,M,T]=b.useMemo((()=>{const e=new S.WebGLRenderTarget(l,l),t=new S.WebGLRenderTarget(l,l);t.texture.generateMipmaps=e.texture.generateMipmaps=!1;const r=new S.PlaneBufferGeometry(n,a).rotateX(Math.PI/2),o=new S.Mesh(r),s=new S.MeshDepthMaterial;s.depthTest=s.depthWrite=!1,s.onBeforeCompile=e=>e.fragmentShader=e.fragmentShader.replace("1.0 - fragCoordZ ), opacity );","0.0 ), ( 1.0 - fragCoordZ ) * 1.0 );");const i=new S.ShaderMaterial(u.HorizontalBlurShader),c=new S.ShaderMaterial(u.VerticalBlurShader);return c.depthTest=i.depthTest=!1,[e,r,s,o,i,c,t]}),[l,n,a,e]),C=b.useCallback((e=>{y.visible=!0,y.material=w,w.uniforms.tDiffuse.value=v.texture,w.uniforms.h.value=1*e/256,p.setRenderTarget(T),p.render(y,h.current),y.material=M,M.uniforms.tDiffuse.value=T.texture,M.uniforms.v.value=1*e/256,p.setRenderTarget(v),p.render(y,h.current),y.visible=!1}),[]);let R=0;return o.useFrame((()=>{if(h.current&&(t===1/0||R<t)){const e=f.background;f.background=null,f.overrideMaterial=x,p.setRenderTarget(v),p.render(f,h.current),f.overrideMaterial=null,C(s),c&&C(.4*s),p.setRenderTarget(null),f.background=e,R++}})),b.createElement("group",E.default({"rotation-x":Math.PI/2},d,{ref:m}),b.createElement("mesh",{geometry:g,scale:[1,-1,1],rotation:[-Math.PI/2,0,0]},b.createElement("meshBasicMaterial",{map:v.texture,transparent:!0,opacity:r})),b.createElement("orthographicCamera",{ref:h,args:[-n/2,n/2,a/2,-a/2,0,i]}))})),Nt={rembrandt:{main:[1,2,1],fill:[-2,-.5,-2]},portrait:{main:[-1,2,.5],fill:[-1,.5,-1.5]},upfront:{main:[0,2,1],fill:[-1,.5,-1.5]},soft:{main:[-2,4,4],fill:[-1,.5,-1.5]}};const Ht=e=>0===e?0:Math.pow(2,10*e-10);const $t=b.forwardRef((({fog:e=!1,colorStop:t=0,color:r="black",opacity:o=.5,...a},s)=>{const i=b.useMemo((()=>{const e=document.createElement("canvas");e.width=128,e.height=128;const o=e.getContext("2d"),a=o.createRadialGradient(e.width/2,e.height/2,0,e.width/2,e.height/2,e.width/2);return a.addColorStop(t,new n.Color(r).getStyle()),a.addColorStop(1,"rgba(0,0,0,0)"),o.fillStyle=a,o.fillRect(0,0,e.width,e.height),e}),[r,t]);return b.createElement("mesh",E.default({ref:s},a),b.createElement("planeBufferGeometry",{attach:"geometry",args:[1,1]}),b.createElement("meshBasicMaterial",{attach:"material",transparent:!0,opacity:o,fog:e},b.createElement("canvasTexture",{attach:"map",args:[i]})))}));o.extend({MeshReflectorMaterial:ct});const qt=b.forwardRef((({mixBlur:e=0,mixStrength:t=.5,resolution:r=256,blur:a=[0,0],args:s=[1,1],minDepthThreshold:i=.9,maxDepthThreshold:l=1,depthScale:u=0,depthToBlurRatioBias:c=.25,mirror:d=0,children:m,debug:f=0,distortion:p=1,mixContrast:h=1,distortionMap:v,...g},x)=>{b.useEffect((()=>{console.warn("Reflector has been deprecated and will be removed next major. Replace it with <MeshReflectorMaterial />!")}),[]);const y=o.useThree((({gl:e})=>e)),w=o.useThree((({camera:e})=>e)),M=o.useThree((({scene:e})=>e)),S=(a=Array.isArray(a)?a:[a,a])[0]+a[1]>0,T=b.useRef(null),[R]=b.useState((()=>new n.Plane)),[L]=b.useState((()=>new n.Vector3)),[_]=b.useState((()=>new n.Vector3)),[P]=b.useState((()=>new n.Vector3)),[D]=b.useState((()=>new n.Matrix4)),[z]=b.useState((()=>new n.Vector3(0,0,-1))),[B]=b.useState((()=>new n.Vector4)),[U]=b.useState((()=>new n.Vector3)),[A]=b.useState((()=>new n.Vector3)),[F]=b.useState((()=>new n.Vector4)),[k]=b.useState((()=>new n.Matrix4)),[j]=b.useState((()=>new n.PerspectiveCamera)),V=b.useCallback((()=>{if(_.setFromMatrixPosition(T.current.matrixWorld),P.setFromMatrixPosition(w.matrixWorld),D.extractRotation(T.current.matrixWorld),L.set(0,0,1),L.applyMatrix4(D),U.subVectors(_,P),U.dot(L)>0)return;U.reflect(L).negate(),U.add(_),D.extractRotation(w.matrixWorld),z.set(0,0,-1),z.applyMatrix4(D),z.add(P),A.subVectors(_,z),A.reflect(L).negate(),A.add(_),j.position.copy(U),j.up.set(0,1,0),j.up.applyMatrix4(D),j.up.reflect(L),j.lookAt(A),j.far=w.far,j.updateMatrixWorld(),j.projectionMatrix.copy(w.projectionMatrix),k.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),k.multiply(j.projectionMatrix),k.multiply(j.matrixWorldInverse),k.multiply(T.current.matrixWorld),R.setFromNormalAndCoplanarPoint(L,_),R.applyMatrix4(j.matrixWorldInverse),B.set(R.normal.x,R.normal.y,R.normal.z,R.constant);const e=j.projectionMatrix;F.x=(Math.sign(B.x)+e.elements[8])/e.elements[0],F.y=(Math.sign(B.y)+e.elements[9])/e.elements[5],F.z=-1,F.w=(1+e.elements[10])/e.elements[14],B.multiplyScalar(2/B.dot(F)),e.elements[2]=B.x,e.elements[6]=B.y,e.elements[10]=B.z+1,e.elements[14]=B.w}),[]),[I,O,G,W]=b.useMemo((()=>{const o={minFilter:n.LinearFilter,magFilter:n.LinearFilter,encoding:y.outputEncoding},s=new n.WebGLRenderTarget(r,r,o);s.depthBuffer=!0,s.depthTexture=new n.DepthTexture(r,r),s.depthTexture.format=n.DepthFormat,s.depthTexture.type=n.UnsignedShortType;const m=new n.WebGLRenderTarget(r,r,o);return[s,m,new ut({gl:y,resolution:r,width:a[0],height:a[1],minDepthThreshold:i,maxDepthThreshold:l,depthScale:u,depthToBlurRatioBias:c}),{mirror:d,textureMatrix:k,mixBlur:e,tDiffuse:s.texture,tDepth:s.depthTexture,tDiffuseBlur:m.texture,hasBlur:S,mixStrength:t,minDepthThreshold:i,maxDepthThreshold:l,depthScale:u,depthToBlurRatioBias:c,transparent:!0,debug:f,distortion:p,distortionMap:v,mixContrast:h,"defines-USE_BLUR":S?"":void 0,"defines-USE_DEPTH":u>0?"":void 0,"defines-USE_DISTORTION":v?"":void 0}]}),[y,a,k,r,d,S,e,t,i,l,u,c,f,p,v,h]);return o.useFrame((()=>{if(null==T||!T.current)return;T.current.visible=!1;const e=y.xr.enabled,t=y.shadowMap.autoUpdate;V(),y.xr.enabled=!1,y.shadowMap.autoUpdate=!1,y.setRenderTarget(I),y.state.buffers.depth.setMask(!0),y.autoClear||y.clear(),y.render(M,j),S&&G.render(y,I,O),y.xr.enabled=e,y.shadowMap.autoUpdate=t,T.current.visible=!0,y.setRenderTarget(null)})),b.createElement("mesh",E.default({ref:C.default([T,x])},g),b.createElement("planeBufferGeometry",{args:s}),m?m("meshReflectorMaterial",W):b.createElement("meshReflectorMaterial",W))}));class Xt extends n.ShaderMaterial{constructor(){super({uniforms:{depth:{value:null},opacity:{value:1},attenuation:{value:2.5},anglePower:{value:12},spotPosition:{value:new n.Vector3(0,0,0)},lightColor:{value:new n.Color("white")},cameraNear:{value:0},cameraFar:{value:1},resolution:{value:new n.Vector2(0,0)}},transparent:!0,depthWrite:!1,vertexShader:"\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n varying float vViewZ;\n varying float vIntensity;\n uniform vec3 spotPosition;\n uniform float attenuation; \n\n void main() {\n // compute intensity\n vNormal = normalize( normalMatrix * normal );\n vec4 worldPosition\t= modelMatrix * vec4( position, 1.0 );\n vWorldPosition = worldPosition.xyz;\n vec4 viewPosition = viewMatrix * worldPosition;\n vViewZ = viewPosition.z;\n float intensity\t= distance(worldPosition.xyz, spotPosition) / attenuation;\n intensity\t= 1.0 - clamp(intensity, 0.0, 1.0);\n vIntensity = intensity; \n // set gl_Position\n gl_Position\t= projectionMatrix * viewPosition;\n\n }",fragmentShader:"\n #include <packing>\n\n varying vec3 vNormal;\n varying vec3 vWorldPosition;\n uniform vec3 lightColor;\n uniform vec3 spotPosition;\n uniform float attenuation;\n uniform float anglePower;\n uniform sampler2D depth;\n uniform vec2 resolution;\n uniform float cameraNear;\n uniform float cameraFar;\n varying float vViewZ;\n varying float vIntensity;\n uniform float opacity;\n\n float readDepth( sampler2D depthSampler, vec2 coord ) {\n float fragCoordZ = texture2D( depthSampler, coord ).x;\n float viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\n return viewZ;\n }\n\n void main() {\n float d = 1.0;\n bool isSoft = resolution[0] > 0.0 && resolution[1] > 0.0;\n if (isSoft) {\n vec2 sUv = gl_FragCoord.xy / resolution;\n d = readDepth(depth, sUv);\n }\n float intensity = vIntensity;\n vec3 normal\t= vec3(vNormal.x, vNormal.y, abs(vNormal.z));\n float angleIntensity\t= pow( dot(normal, vec3(0.0, 0.0, 1.0)), anglePower );\n intensity\t*= angleIntensity;\n // fades when z is close to sampled depth, meaning the cone is intersecting existing geometry\n if (isSoft) {\n intensity\t*= smoothstep(0., 1., vViewZ - d);\n }\n gl_FragColor = vec4(lightColor, intensity * opacity);\n }"})}}const Zt=new n.Vector3,Yt=b.forwardRef((({opacity:e=1,radiusTop:t,radiusBottom:r,depthBuffer:a,color:s="white",distance:i=5,angle:l=.15,attenuation:u=5,anglePower:c=5,...d},m)=>{const f=b.useRef(null),p=o.useThree((e=>e.size)),h=o.useThree((e=>e.camera)),v=o.useThree((e=>e.viewport.dpr)),[g]=b.useState((()=>new Xt));t=void 0===t?.1:t,r=void 0===r?7*l:r,o.useFrame((()=>{g.uniforms.spotPosition.value.copy(f.current.getWorldPosition(Zt)),f.current.lookAt(f.current.parent.target.getWorldPosition(Zt))}));const x=b.useMemo((()=>{const e=new n.CylinderGeometry(t,r,i,128,64,!0);return e.applyMatrix4((new n.Matrix4).makeTranslation(0,-i/2,0)),e.applyMatrix4((new n.Matrix4).makeRotationX(-Math.PI/2)),e}),[l,i,t,r]);return b.createElement("spotLight",E.default({ref:m,angle:l,color:s,distance:i},d),b.createElement("mesh",{ref:f,geometry:x,raycast:()=>null},b.createElement("primitive",{object:g,attach:"material","uniforms-opacity-value":e,"uniforms-lightColor-value":s,"uniforms-attenuation-value":u,"uniforms-anglePower-value":c,"uniforms-depth-value":a,"uniforms-cameraNear-value":h.near,"uniforms-cameraFar-value":h.far,"uniforms-resolution-value":a?[p.width*v,p.height*v]:[0,0]})))}));function Kt(e,t,r=new n.Vector3){const o=Math.PI*(e-.5),a=2*Math.PI*(t-.5);return r.x=Math.cos(a),r.y=Math.sin(o),r.z=Math.sin(a),r}const Qt=b.forwardRef((({inclination:e=.6,azimuth:t=.1,distance:r=1e3,mieCoefficient:o=.005,mieDirectionalG:a=.8,rayleigh:s=.5,turbidity:i=10,sunPosition:l=Kt(e,t),...c},d)=>{const m=b.useMemo((()=>(new n.Vector3).setScalar(r)),[r]),[f]=b.useState((()=>new u.Sky));return b.createElement("primitive",E.default({dispose:void 0,object:f,ref:d,"material-uniforms-mieCoefficient-value":o,"material-uniforms-mieDirectionalG-value":a,"material-uniforms-rayleigh-value":s,"material-uniforms-sunPosition-value":l,"material-uniforms-turbidity-value":i,scale:m},c))}));class Jt extends n.ShaderMaterial{constructor(){super({uniforms:{time:{value:0},fade:{value:1}},vertexShader:"\n uniform float time;\n attribute float size;\n varying vec3 vColor;\n void main() {\n vColor = color;\n vec4 mvPosition = modelViewMatrix * vec4(position, 0.5);\n gl_PointSize = size * (30.0 / -mvPosition.z) * (3.0 + sin(mvPosition.x + 2.0 * time + 100.0));\n gl_Position = projectionMatrix * mvPosition;\n }",fragmentShader:"\n uniform sampler2D pointTexture;\n uniform float fade;\n varying vec3 vColor;\n void main() {\n float opacity = 1.0;\n if (fade == 1.0) {\n float d = distance(gl_PointCoord, vec2(0.5, 0.5));\n opacity = 1.0 / (1.0 + exp(16.0 * (d - 0.25)));\n }\n gl_FragColor = vec4(vColor, opacity);\n }"})}}const er=e=>(new n.Vector3).setFromSpherical(new n.Spherical(e,Math.acos(1-2*Math.random()),2*Math.random()*Math.PI)),tr=b.forwardRef((({radius:e=100,depth:t=50,count:r=5e3,saturation:a=0,factor:s=4,fade:i=!1},l)=>{const u=b.useRef(),[c,d,m]=b.useMemo((()=>{const o=[],i=[],l=Array.from({length:r},(()=>(.5+.5*Math.random())*s)),u=new n.Color;let c=e+t;const d=t/r;for(let e=0;e<r;e++)c-=d*Math.random(),o.push(...er(c).toArray()),u.setHSL(e/r,a,.9),i.push(u.r,u.g,u.b);return[new Float32Array(o),new Float32Array(i),new Float32Array(l)]}),[r,t,s,e,a]);o.useFrame((e=>u.current&&(u.current.uniforms.time.value=e.clock.getElapsedTime())));const[f]=b.useState((()=>new Jt));return b.createElement("points",{ref:l},b.createElement("bufferGeometry",{attach:"geometry"},b.createElement("bufferAttribute",{attachObject:["attributes","position"],args:[c,3]}),b.createElement("bufferAttribute",{attachObject:["attributes","color"],args:[d,3]}),b.createElement("bufferAttribute",{attachObject:["attributes","size"],args:[m,1]})),b.createElement("primitive",{dispose:void 0,ref:u,object:f,attach:"material",blending:n.AdditiveBlending,"uniforms-fade-value":i,transparent:!0,vertexColors:!0}))}));const rr=new S.Matrix4,nr=new S.Matrix4,or=[],ar=new S.Mesh;class sr extends S.Group{constructor(){super(),this.color=new S.Color("white"),this.instance={current:void 0},this.instanceKey={current:void 0}}get geometry(){var e;return null==(e=this.instance.current)?void 0:e.geometry}raycast(e,t){const r=this.instance.current;if(!r)return;if(!r.geometry||!r.material)return;ar.geometry=r.geometry;const n=r.matrixWorld;let o=r.userData.instances.indexOf(this.instanceKey);if(!(-1===o||o>r.count)){r.getMatrixAt(o,rr),nr.multiplyMatrices(n,rr),ar.matrixWorld=nr,ar.raycast(e,or);for(let e=0,r=or.length;e<r;e++){const r=or[e];r.instanceId=o,r.object=this,t.push(r)}or.length=0}}}let ir,lr;const ur=b.createContext(null),cr=new S.Matrix4,dr=new S.Vector3,mr=new S.Color,fr=b.forwardRef((({children:e,range:t,limit:r=1e3,...n},a)=>{const s=b.useRef(null),[i,l]=b.useState([]),[[u,c,d]]=b.useState((()=>[new Float32Array(3*r),Float32Array.from({length:3*r},(()=>1)),Float32Array.from({length:r},(()=>1))]));b.useLayoutEffect((()=>{s.current.geometry.drawRange.count=Math.min(r,void 0!==t?t:r,i.length)}),[i,t]),b.useEffect((()=>{s.current.geometry.attributes.position.needsUpdate=!0})),o.useFrame((()=>{for(s.current.updateMatrix(),s.current.updateMatrixWorld(),cr.copy(s.current.matrixWorld).invert(),ir=0;ir<i.length;ir++)lr=i[ir].current,lr.getWorldPosition(dr).applyMatrix4(cr),dr.x===u[3*ir]&&dr.y===u[3*ir+1]&&dr.z===u[3*ir+2]||(dr.toArray(u,3*ir),s.current.geometry.attributes.position.needsUpdate=!0,lr.matrixWorldNeedsUpdate=!0),lr.color.equals(mr.fromArray(c,3*ir))||(lr.color.toArray(c,3*ir),s.current.geometry.attributes.color.needsUpdate=!0),lr.size!==d[ir]&&(d.set([lr.size],ir),s.current.geometry.attributes.size.needsUpdate=!0)}));const m=b.useMemo((()=>{const e={};for(ir=0;ir<i.length;ir++){var t;Object.assign(e,null==(t=i[ir].current)?void 0:t.__r3f.handlers)}return Object.keys(e).reduce(((e,t)=>({...e,[t]:e=>{var r,n,o;const a=null==(r=i[e.index])?void 0:r.current;return null==a||null==(n=a.__r3f)||null==(o=n.handlers)?void 0:o[t]({...e,object:a})}})),{})}),[e,i]),f=b.useMemo((()=>({subscribe:e=>(l((t=>[...t,e])),()=>l((t=>t.filter((t=>t.current!==e.current)))))})),[]);return b.createElement("points",E.default({matrixAutoUpdate:!1,ref:C.default([a,s])},m,n),b.createElement("bufferGeometry",null,b.createElement("bufferAttribute",{attachObject:["attributes","position"],count:u.length/3,array:u,itemSize:3,usage:S.DynamicDrawUsage}),b.createElement("bufferAttribute",{attachObject:["attributes","color"],count:c.length/3,array:c,itemSize:3,usage:S.DynamicDrawUsage}),b.createElement("bufferAttribute",{attachObject:["attributes","size"],count:d.length,array:d,itemSize:1,usage:S.DynamicDrawUsage})),b.createElement(ur.Provider,{value:f},e))})),pr=b.forwardRef((({children:e,...t},r)=>{b.useMemo((()=>o.extend({Position:sr})),[]);const n=b.useRef(),{subscribe:a}=b.useContext(ur);return b.useLayoutEffect((()=>a(n)),[]),b.createElement("position",E.default({ref:C.default([r,n])},t),e)})),hr=b.forwardRef((({children:e,positions:t,colors:r,sizes:n,stride:a=3,...s},i)=>{const l=b.useRef(null);return o.useFrame((()=>{const e=l.current.geometry.attributes;e.position.needsUpdate=!0,r&&(e.color.needsUpdate=!0),n&&(e.size.needsUpdate=!0)})),b.createElement("points",E.default({matrixAutoUpdate:!1,ref:C.default([i,l])},s),b.createElement("bufferGeometry",null,b.createElement("bufferAttribute",{attachObject:["attributes","position"],count:t.length/a,array:t,itemSize:a,usage:S.DynamicDrawUsage}),r&&b.createElement("bufferAttribute",{attachObject:["attributes","color"],count:r.length/a,array:r,itemSize:3,usage:S.DynamicDrawUsage}),n&&b.createElement("bufferAttribute",{attachObject:["attributes","size"],count:n.length/a,array:n,itemSize:1,usage:S.DynamicDrawUsage})),e)})),vr=b.forwardRef(((e,t)=>e.positions instanceof Float32Array?b.createElement(hr,E.default({},e,{ref:t})):b.createElement(fr,E.default({},e,{ref:t}))));let gr,xr;const yr=b.createContext(null),wr=new S.Matrix4,Er=new S.Matrix4,br=new S.Matrix4,Mr=new S.Color,Sr=new S.Vector3,Tr=new S.Quaternion,Cr=new S.Vector3,Rr=b.forwardRef((({context:e,children:t,...r},n)=>{b.useMemo((()=>o.extend({Position:sr})),[]);const a=b.useRef(),{subscribe:s,getParent:i}=b.useContext(e||yr);return b.useLayoutEffect((()=>s(a)),[]),b.createElement("position",E.default({instance:i(),instanceKey:a,ref:C.default([n,a])},r),t)})),Lr=b.forwardRef((({children:e,range:t,limit:r=1e3,frames:n=1/0,...a},s)=>{const[{context:i,instance:l}]=b.useState((()=>{const e=b.createContext(null);return{context:e,instance:b.forwardRef(((t,r)=>b.createElement(Rr,E.default({context:e},t,{ref:r}))))}})),u=b.useRef(null),[c,d]=b.useState([]),[[m,f]]=b.useState((()=>{const e=new Float32Array(16*r);for(gr=0;gr<r;gr++)br.identity().toArray(e,16*gr);return[e,new Float32Array([...new Array(3*r)].map((()=>1)))]}));b.useLayoutEffect((()=>{u.current.count=u.current.instanceMatrix.updateRange.count=u.current.instanceColor.updateRange.count=Math.min(r,void 0!==t?t:r,c.length)}),[c,t]),b.useEffect((()=>{u.current.instanceMatrix.needsUpdate=!0}));let p=0;o.useFrame((()=>{if(n===1/0||p<n){for(u.current.updateMatrix(),u.current.updateMatrixWorld(),wr.copy(u.current.matrixWorld).invert(),gr=0;gr<c.length;gr++)xr=c[gr].current,xr.matrixWorld.decompose(Sr,Tr,Cr),Er.compose(Sr,Tr,Cr).premultiply(wr),Er.equals(br.fromArray(m,16*gr))||(Er.toArray(m,16*gr),u.current.instanceMatrix.needsUpdate=!0),xr.color.equals(Mr.fromArray(f,3*gr))||(xr.color.toArray(f,3*gr),u.current.instanceColor.needsUpdate=!0);p++}}));const h=b.useMemo((()=>({getParent:()=>u,subscribe:e=>(d((t=>[...t,e])),()=>d((t=>t.filter((t=>t.current!==e.current)))))})),[]);return b.createElement("instancedMesh",E.default({userData:{instances:c},matrixAutoUpdate:!1,ref:C.default([s,u]),args:[null,null,0],raycast:()=>null},a),b.createElement("instancedBufferAttribute",{attach:"instanceMatrix",count:m.length/16,array:m,itemSize:16,usage:S.DynamicDrawUsage}),b.createElement("instancedBufferAttribute",{attach:"instanceColor",count:f.length/3,array:f,itemSize:3,usage:S.DynamicDrawUsage}),"function"==typeof e?b.createElement(i.Provider,{value:h},e(l)):b.createElement(yr.Provider,{value:h},e))}));const _r=b.createContext(null),Pr=e=>e instanceof S.Color?e.toArray():e,Dr=e=>e instanceof S.Vector3?e.toArray():e,zr=b.forwardRef(((e,t)=>{const{limit:r=1e3,lineWidth:n=1,children:a,...s}=e,[i,l]=b.useState([]),[c]=b.useState((()=>new u.Line2)),[d]=b.useState((()=>new u.LineMaterial)),[m]=b.useState((()=>new u.LineSegmentsGeometry)),[f]=b.useState((()=>new S.Vector2(512,512))),[p]=b.useState((()=>Array(6*r).fill(0))),[h]=b.useState((()=>Array(6*r).fill(0))),v=b.useMemo((()=>({subscribe:e=>(l((t=>[...t,e])),()=>l((t=>t.filter((t=>t.current!==e.current)))))})),[]);return o.useFrame((()=>{for(let n=0;n<r;n++){var e;const r=null==(e=i[n])?void 0:e.current,o=r?Dr(r.start):[0,0,0],a=r?Dr(r.end):[0,0,0],s=r?Pr(r.color):[1,1,1];for(var t=0;t<3;t++)p[6*n+t]=o[t],p[6*n+t+3]=a[t],h[6*n+t]=s[t],h[6*n+t+3]=s[t]}m.setColors(h),m.setPositions(p),c.computeLineDistances()})),b.createElement("primitive",{object:c,ref:t},b.createElement("primitive",{object:m,attach:"geometry"}),b.createElement("primitive",E.default({object:d,attach:"material",vertexColors:!0,resolution:f,linewidth:n},s)),b.createElement(_r.Provider,{value:v},a))}));class Br{constructor(){this.color=new S.Color("white"),this.start=new S.Vector3(0,0,0),this.end=new S.Vector3(0,0,0)}}const Ur=b.forwardRef(((e,t)=>{const r=b.useContext(_r);if(!r)throw"Segment must used inside Segments component.";const n=b.useRef();return b.useMemo((()=>o.extend({SegmentObject:Br})),[]),b.useLayoutEffect((()=>r.subscribe(n)),[]),b.createElement("segmentObject",E.default({ref:C.default([n,t])},e))})),Ar=b.forwardRef((({children:e,distances:t,...r},n)=>{const a=b.useRef(null);return b.useLayoutEffect((()=>{const{current:e}=a;e.levels.length=0,e.children.forEach(((r,n)=>e.levels.push({object:r,distance:t[n]})))})),o.useFrame((e=>{var t;return null==(t=a.current)?void 0:t.update(e.camera)})),b.createElement("lOD",E.default({ref:C.default([a,n])},r),e)}));const Fr=new n.Matrix4,kr=new n.Ray,jr=new n.Sphere,Vr=new n.Vector3;exports.AdaptiveDpr=function({pixelated:e}){const t=o.useThree((e=>e.gl)),r=o.useThree((e=>e.internal.active)),n=o.useThree((e=>e.performance.current)),a=o.useThree((e=>e.viewport.initialDpr)),s=o.useThree((e=>e.setDpr));return b.useEffect((()=>{const n=t.domElement;return()=>{r&&s(a),e&&n&&(n.style.imageRendering="auto")}}),[]),b.useEffect((()=>{s(n*a),e&&t.domElement&&(t.domElement.style.imageRendering=1===n?"auto":"pixelated")}),[n]),null},exports.AdaptiveEvents=function(){const e=o.useThree((e=>e.get)),t=o.useThree((e=>e.performance.current));return b.useEffect((()=>{const t=e().raycaster.enabled;return()=>{e().raycaster.enabled=t}}),[]),b.useEffect((()=>{e().raycaster.enabled=1===t}),[t]),null},exports.ArcballControls=ye,exports.Backdrop=function({children:e,floor:t=.25,segments:r=20,receiveShadow:n,...o}){const a=b.useRef(null);return b.useLayoutEffect((()=>{let e=0;const n=r/r/2,o=a.current.attributes.position;for(let a=0;a<r+1;a++)for(let s=0;s<r+1;s++)o.setXYZ(e++,a/r-n+(0===a?-t:0),s/r-n,Ht(a/r));o.needsUpdate=!0,a.current.computeVertexNormals()}),[r,t]),b.createElement("group",o,b.createElement("mesh",{receiveShadow:n,rotation:[-Math.PI/2,0,Math.PI/2]},b.createElement("planeGeometry",{ref:a,args:[1,1,r,r]}),e))},exports.BakeShadows=function(){const e=o.useThree((e=>e.gl));return t.useEffect((()=>(e.shadowMap.autoUpdate=!1,e.shadowMap.needsUpdate=!0,()=>{e.shadowMap.autoUpdate=e.shadowMap.needsUpdate=!0})),[e.shadowMap]),null},exports.Billboard=Q,exports.Bounds=function({children:e,damping:t=6,fit:r,clip:n,margin:a=1.2,eps:s=.01,onFit:i}){const l=b.useRef(null),u=o.useThree((e=>e.camera)),c=o.useThree((e=>e.controls)),d=o.useThree((e=>e.invalidate)),m=b.useRef(i);function f(e,t){return Math.abs(e.x-t.x)<s&&Math.abs(e.y-t.y)<s&&Math.abs(e.z-t.z)<s}function p(e,t,r,n){e.x=S.MathUtils.damp(e.x,t.x,r,n),e.y=S.MathUtils.damp(e.y,t.y,r,n),e.z=S.MathUtils.damp(e.z,t.z,r,n)}m.current=i;const[h]=b.useState((()=>({animating:!1,focus:new S.Vector3,camera:new S.Vector3,zoom:1}))),[v]=b.useState((()=>({focus:new S.Vector3,camera:new S.Vector3,zoom:1}))),[g]=b.useState((()=>new S.Box3)),x=b.useMemo((()=>{function e(){const e=g.getSize(new S.Vector3),t=g.getCenter(new S.Vector3),r=Math.max(e.x,e.y,e.z),n=jt(u)?4*r:r/(2*Math.atan(Math.PI*u.fov/360)),o=jt(u)?4*r:n/u.aspect,s=a*Math.max(n,o);return{box:g,size:e,center:t,distance:s}}return{getSize:e,refresh(t){var r;if((r=t)&&r.isObject3D?g.setFromObject(t):(e=>e&&e.isBox3)(t)?g.copy(t):l.current&&g.setFromObject(l.current),g.isEmpty()){const e=u.position.length()||10;g.setFromCenterAndSize(new S.Vector3,new S.Vector3(e,e,e))}if("OrthographicTrackballControls"===(null==c?void 0:c.constructor.name)){const{distance:t}=e(),r=u.position.clone().sub(c.target).normalize().multiplyScalar(t),n=c.target.clone().add(r);u.position.copy(n)}return this},clip(){const{distance:t}=e();return c&&(c.maxDistance=10*t),u.near=t/100,u.far=100*t,u.updateProjectionMatrix(),c&&c.update(),this},fit(){h.camera.copy(u.position),c&&h.focus.copy(c.target);const{center:r,distance:n}=e(),o=r.clone().sub(u.position).normalize().multiplyScalar(n);if(v.camera.copy(r).sub(o),v.focus.copy(r),jt(u)){h.zoom=u.zoom;let e=0,n=0;const o=[new S.Vector3(g.min.x,g.min.y,g.min.z),new S.Vector3(g.min.x,g.max.y,g.min.z),new S.Vector3(g.min.x,g.min.y,g.max.z),new S.Vector3(g.min.x,g.max.y,g.max.z),new S.Vector3(g.max.x,g.max.y,g.max.z),new S.Vector3(g.max.x,g.max.y,g.min.z),new S.Vector3(g.max.x,g.min.y,g.max.z),new S.Vector3(g.max.x,g.min.y,g.min.z)];r.applyMatrix4(u.matrixWorldInverse);for(const t of o)t.applyMatrix4(u.matrixWorldInverse),e=Math.max(e,Math.abs(t.y-r.y)),n=Math.max(n,Math.abs(t.x-r.x));e*=2,n*=2;const s=(u.top-u.bottom)/e,i=(u.right-u.left)/n;v.zoom=Math.min(s,i)/a,t||(u.zoom=v.zoom,u.updateProjectionMatrix())}return t?h.animating=!0:(u.position.copy(v.camera),u.lookAt(v.focus),c&&(c.target.copy(v.focus),c.update()),d()),m.current&&m.current(this.getSize()),this}}}),[g,u,c,a,t,d]);return b.useLayoutEffect((()=>{if(x.refresh(),r&&x.fit(),n&&x.clip(),c){const e=()=>h.animating=!1;return c.addEventListener("start",e),()=>c.removeEventListener("start",e)}}),[n,r,c]),o.useFrame(((e,r)=>{if(h.animating){if(p(h.focus,v.focus,t,r),p(h.camera,v.camera,t,r),h.zoom=S.MathUtils.damp(h.zoom,v.zoom,t,r),u.position.copy(h.camera),jt(u)&&(u.zoom=h.zoom,u.updateProjectionMatrix()),c?(c.target.copy(h.focus),c.update()):u.lookAt(h.focus),d(),jt(u)&&!(Math.abs(h.zoom-v.zoom)<s))return;if(!jt(u)&&!f(h.camera,v.camera))return;if(c&&!f(h.focus,v.focus))return;h.animating=!1}})),b.createElement("group",{ref:l},b.createElement(Vt.Provider,{value:x},e))},exports.Box=vt,exports.CameraShake=It,exports.Center=kt,exports.Circle=gt,exports.Cloud=function({opacity:e=.5,speed:t=.4,width:r=10,depth:n=1.5,segments:a=20,...s}){const i=b.useRef(),l=ue("https://rawcdn.githack.com/pmndrs/drei-assets/9225a9f1fbd449d9411125c2f419b843d0308c9f/cloud.png"),u=b.useMemo((()=>[...new Array(a)].map(((e,n)=>({x:r/2-Math.random()*r,y:r/2-Math.random()*r,scale:.4+Math.sin((n+1)/a*Math.PI)*(10*(.2+Math.random())),density:Math.max(.2,Math.random()),rotation:Math.max(.002,.005*Math.random())*t})))),[r,a,t]);return o.useFrame((e=>{var t;return null==(t=i.current)?void 0:t.children.forEach(((t,r)=>{t.children[0].rotation.z+=u[r].rotation,t.children[0].scale.setScalar(u[r].scale+(1+Math.sin(e.clock.getElapsedTime()/10))/2*r/10)}))})),b.createElement("group",s,b.createElement("group",{position:[0,0,a/2*n],ref:i},u.map((({x:t,y:r,scale:o,density:a},s)=>b.createElement(Q,{key:s,position:[t,r,-s*n]},b.createElement(Et,{scale:o,rotation:[0,0,0]},b.createElement("meshStandardMaterial",{map:l,transparent:!0,opacity:o/6*a*e,depthTest:!1})))))))},exports.Cone=xt,exports.ContactShadows=Wt,exports.CubeCamera=function({children:e,fog:t,frames:r=1/0,resolution:a=256,near:s=1,far:i=1e3,...l}){const u=b.useRef(),[c,d]=b.useState(),m=o.useThree((({scene:e})=>e)),f=o.useThree((({gl:e})=>e)),p=b.useMemo((()=>new n.WebGLCubeRenderTarget(a,{minFilter:n.LinearFilter,magFilter:n.LinearFilter,encoding:f.outputEncoding})),[a]);let h=0;return o.useFrame((()=>{if(c&&u.current&&(r===1/0||h<r)){u.current.traverse((e=>e.visible=!1));const e=m.fog;m.fog=t||e,c.update(f,m),m.fog=e,u.current.traverse((e=>e.visible=!0)),h++}})),b.createElement("group",l,b.createElement("cubeCamera",{ref:d,args:[s,i,p]}),b.createElement("group",{ref:u},e(p.texture)))},exports.CubicBezierLine=re,exports.CurveModifier=nt,exports.CycleRaycast=function({onChanged:e,portal:t,preventDefault:r=!0,scroll:n=!0,keyCode:a=9}){const s=b.useRef(0),i=o.useThree((e=>e.raycaster)),l=o.useThree((e=>e.get)),u=o.useThree((e=>e.gl));return b.useEffect((()=>{var o;let c,d=[];const m=i.filter,f=null!==(o=null==t?void 0:t.current)&&void 0!==o?o:u.domElement.parentNode,p=()=>f&&e&&e(d,Math.round(s.current)%d.length);i.filter=(e,t)=>{let r=[...e];r.length===d.length&&d.every((e=>r.map((e=>e.object.uuid)).includes(e.object.uuid)))||(s.current=0,d=r,p()),m&&(r=m(r,t));for(let e=0;e<Math.round(s.current)%r.length;e++){const e=r.shift();r=[...r,e]}return r};const h=e=>{var t,r;s.current=e(s.current),null==(t=l().events.handlers)||t.onPointerCancel(void 0),null==(r=l().events.handlers)||r.onPointerMove(c),p()},v=e=>{(e.keyCode||e.which===a)&&(r&&e.preventDefault(),d.length>1&&h((e=>e+1)))},g=e=>{r&&e.preventDefault();let t=0;e||(e=window.event),e.wheelDelta?t=e.wheelDelta/120:e.detail&&(t=-e.detail/3),d.length>1&&h((e=>Math.abs(e-t)))},x=e=>c=e;return document.addEventListener("pointermove",x,{passive:!0}),n&&document.addEventListener("wheel",g),void 0!==a&&document.addEventListener("keydown",v),()=>{i.filter=m,void 0!==a&&document.removeEventListener("keydown",v),n&&document.removeEventListener("wheel",g),document.removeEventListener("pointermove",x)}}),[u,l,i,r,n,a]),null},exports.Cylinder=yt,exports.Detailed=Ar,exports.DeviceOrientationControls=pe,exports.Dodecahedron=Pt,exports.Edges=function({userData:e,children:t,geometry:r,threshold:n=15,color:o="black",...a}){const s=b.useRef(null);return b.useLayoutEffect((()=>{const e=s.current.parent;if(e){const t=r||e.geometry;t===s.current.userData.currentGeom&&n===s.current.userData.currentThreshold||(s.current.userData.currentGeom=t,s.current.userData.currentThreshold=n,s.current.geometry=new S.EdgesGeometry(t,n))}})),b.createElement("lineSegments",E.default({ref:s,raycast:()=>null},a),t||b.createElement("lineBasicMaterial",{color:o}))},exports.Effects=se,exports.Environment=Gt,exports.Extrude=Dt,exports.FirstPersonControls=be,exports.Float=function({children:e,speed:t=1,rotationIntensity:r=1,floatIntensity:n=1,...a}){const s=b.useRef(null),i=b.useRef(1e4*Math.random());return o.useFrame((e=>{const o=i.current+e.clock.getElapsedTime();s.current.rotation.x=Math.cos(o/4*t)/8*r,s.current.rotation.y=Math.sin(o/4*t)/8*r,s.current.rotation.z=Math.sin(o/4*t)/20*r,s.current.position.y=Math.sin(o/4*t)/10*n})),b.createElement("group",a,b.createElement("group",{ref:s},e))},exports.FlyControls=he,exports.GizmoHelper=({alignment:e="bottom-right",margin:t=[80,80],renderPriority:r=0,onUpdate:a,onTarget:s,children:i})=>{const l=o.useThree((({size:e})=>e)),u=o.useThree((({camera:e})=>e)),c=o.useThree((({controls:e})=>e)),d=o.useThree((({gl:e})=>e)),m=o.useThree((({scene:e})=>e)),f=o.useThree((({invalidate:e})=>e)),p=b.useRef(),h=b.useRef(),v=b.useRef(null),[g]=b.useState((()=>new n.Scene)),x=b.useRef(!1),y=b.useRef(0),w=b.useRef(new n.Vector3(0,0,0));b.useEffect((()=>(m.background&&(p.current=m.background,m.background=null,g.background=p.current),()=>{p.current&&(m.background=p.current)})),[]);o.useFrame(((e,t)=>{var r;v.current&&h.current&&((e=>{if(!x.current)return;if(_e.angleTo(Pe)<.01)return void(x.current=!1);const t=e*Ce;_e.rotateTowards(Pe,t),u.position.set(0,0,1).applyQuaternion(_e).multiplyScalar(y.current).add(w.current),u.up.set(0,1,0).applyQuaternion(_e).normalize(),u.quaternion.copy(_e),a?a():c&&c.update(),f()})(t),Le.copy(u.matrix).invert(),null==(r=h.current)||r.quaternion.setFromRotationMatrix(Le),d.autoClear=!1,d.clearDepth(),d.render(g,v.current))}),r);const E={tweenCamera:e=>{x.current=!0,(c||s)&&(w.current=(null==c?void 0:c.target)||(null==s?void 0:s())),y.current=u.position.distanceTo(De),_e.copy(u.quaternion),ze.copy(e).multiplyScalar(y.current).add(De),Re.lookAt(ze),Pe.copy(Re.quaternion),f()},raycast:Me(v)},[M,S]=t,T=e.endsWith("-left")?-l.width/2+M:l.width/2-M,C=e.startsWith("top-")?l.height/2-S:-l.height/2+S;return o.createPortal(b.createElement(Se.Provider,{value:E},b.createElement(me,{ref:v,makeDefault:!1,position:[0,0,200]}),b.createElement("group",{ref:h,position:[T,C,0]},i)),g)},exports.GizmoViewcube=e=>b.createElement("group",{scale:[60,60,60]},b.createElement(Ne,e),Oe.map(((t,r)=>b.createElement(He,E.default({key:r,position:t,dimensions:Ge[r]},e)))),Ve.map(((t,r)=>b.createElement(He,E.default({key:r,position:t,dimensions:Ie},e)))),b.createElement("ambientLight",{intensity:.5}),b.createElement("pointLight",{position:[10,10,10],intensity:.5})),exports.GizmoViewport=({hideNegativeAxes:e,hideAxisHeads:t,disabled:r,font:n="18px Inter var, Arial, sans-serif",axisColors:o=["#ff3653","#0adb50","#2c8fdf"],axisHeadScale:a=1,axisScale:s,labels:i=["X","Y","Z"],labelColor:l="#000",onClick:u,...c})=>{const[d,m,f]=o,{tweenCamera:p,raycast:h}=Te(),v={font:n,disabled:r,labelColor:l,raycast:h,onClick:u,axisHeadScale:a,onPointerDown:r?void 0:e=>{p(e.object.position),e.stopPropagation()}};return b.createElement("group",E.default({scale:40},c),b.createElement($e,{color:d,rotation:[0,0,0],scale:s}),b.createElement($e,{color:m,rotation:[0,0,Math.PI/2],scale:s}),b.createElement($e,{color:f,rotation:[0,-Math.PI/2,0],scale:s}),!t&&b.createElement(b.Fragment,null,b.createElement(qe,E.default({arcStyle:d,position:[1,0,0],label:i[0]},v)),b.createElement(qe,E.default({arcStyle:m,position:[0,1,0],label:i[1]},v)),b.createElement(qe,E.default({arcStyle:f,position:[0,0,1],label:i[2]},v)),!e&&b.createElement(b.Fragment,null,b.createElement(qe,E.default({arcStyle:d,position:[-1,0,0]},v)),b.createElement(qe,E.default({arcStyle:m,position:[0,-1,0]},v)),b.createElement(qe,E.default({arcStyle:f,position:[0,0,-1]},v)))),b.createElement("ambientLight",{intensity:.5}),b.createElement("pointLight",{position:[10,10,10],intensity:.5}))},exports.GradientTexture=function({stops:e,colors:t,size:r=1024,...n}){const a=o.useThree((e=>e.gl)),s=b.useMemo((()=>{const n=document.createElement("canvas"),o=n.getContext("2d");n.width=16,n.height=r;const a=o.createLinearGradient(0,0,0,r);let s=e.length;for(;s--;)a.addColorStop(e[s],t[s]);o.fillStyle=a,o.fillRect(0,0,16,r);const i=new S.Texture(n);return i.needsUpdate=!0,i}),[e]);return b.useEffect((()=>()=>{s.dispose()}),[s]),b.createElement("primitive",E.default({object:s,attach:"map",encoding:a.outputEncoding},n))},exports.Html=O,exports.Icosahedron=Lt,exports.Image=de,exports.Instance=Rr,exports.Instances=Lr,exports.IsObject=le,exports.Lathe=zt,exports.Line=J,exports.Loader=function({containerStyles:e,innerStyles:t,barStyles:r,dataStyles:n,dataInterpolation:o=N,initialState:a=(e=>e)}){const{active:s,progress:i}=W(),l=b.useRef(0),u=b.useRef(0),c=b.useRef(null),[d,m]=b.useState(a(s));b.useEffect((()=>{let e;return s!==d&&(e=setTimeout((()=>m(s)),300)),()=>clearTimeout(e)}),[d,s]);const f=b.useCallback((()=>{c.current&&(l.current+=(i-l.current)/2,(l.current>.95*i||100===i)&&(l.current=i),c.current.innerText=o(l.current),l.current<i&&(u.current=requestAnimationFrame(f)))}),[o,i]);return b.useEffect((()=>(f(),()=>cancelAnimationFrame(u.current))),[f]),d?b.createElement("div",{style:{...H.container,opacity:s?1:0,...e}},b.createElement("div",null,b.createElement("div",{style:{...H.inner,...t}},b.createElement("div",{style:{...H.bar,transform:`scaleX(${i/100})`,...r}}),b.createElement("span",{ref:c,style:{...H.data,...n}})))):null},exports.MapControls=ve,exports.Merged=function({meshes:e,children:t,...r}){const n=Array.isArray(e);if(!n)for(const t of Object.keys(e))e[t].isMesh||delete e[t];return b.createElement(D.default,{components:(n?e:Object.values(e)).map((({geometry:e,material:t})=>b.createElement(Lr,E.default({key:e.uuid,geometry:e,material:t},r))))},(r=>n?t(...r):t(Object.keys(e).filter((t=>e[t].isMesh)).reduce(((e,t,n)=>({...e,[t]:r[n]})),{}))))},exports.MeshDistortMaterial=at,exports.MeshReflectorMaterial=dt,exports.MeshWobbleMaterial=it,exports.Octahedron=_t,exports.OrbitControls=ge,exports.OrthographicCamera=me,exports.PerspectiveCamera=fe,exports.Plane=Et,exports.Point=pr,exports.PointMaterial=ft,exports.PointMaterialImpl=mt,exports.PointerLockControls=Ee,exports.Points=vr,exports.PointsBuffer=hr,exports.Polyhedron=Rt,exports.PositionalAudio=ne,exports.Preload=function({all:e,scene:t,camera:r}){const a=o.useThree((({gl:e})=>e)),s=o.useThree((({camera:e})=>e)),i=o.useThree((({scene:e})=>e));return b.useLayoutEffect((()=>{const o=[];e&&(t||i).traverse((e=>{!1===e.visible&&(o.push(e),e.visible=!0)})),a.compile(t||i,r||s);const l=new n.WebGLCubeRenderTarget(128);new n.CubeCamera(.01,1e5,l).update(a,t||i),l.dispose(),o.forEach((e=>e.visible=!1))}),[]),null},exports.PresentationControls=function({snap:e,global:t,cursor:r=!0,children:a,speed:s=1,rotation:u=[0,0,0],zoom:c=1,polar:d=[0,Math.PI/2],azimuth:m=[-1/0,1/0],config:f={mass:1,tension:170,friction:26}}){const{size:p,gl:h}=o.useThree(),v=b.useMemo((()=>[u[0]+d[0],u[0]+d[1]]),[u[0],d[0],d[1]]),g=b.useMemo((()=>[u[1]+m[0],u[1]+m[1]]),[u[1],m[0],m[1]]),x=b.useMemo((()=>[n.MathUtils.clamp(u[0],...v),n.MathUtils.clamp(u[1],...g),u[2]]),[u[0],u[1],u[2],v,g]),[y,w]=i.useSpring((()=>({scale:1,rotation:x,config:f})));b.useEffect((()=>{w.start({scale:1,rotation:x,config:f})}),[x]),b.useEffect((()=>{t&&r&&(h.domElement.style.cursor="grab")}),[t,r,h.domElement]);const M=l.useGesture({onHover:({last:e})=>{r&&!t&&(h.domElement.style.cursor=e?"auto":"grab")},onDrag:({down:t,delta:[o,a],memo:[i,l]=y.rotation.animation.to||x})=>{r&&(h.domElement.style.cursor=t?"grabbing":"grab"),o=n.MathUtils.clamp(l+o/p.width*Math.PI*s,...g),a=n.MathUtils.clamp(i+a/p.height*Math.PI*s,...v);const u=e&&!t&&"boolean"!=typeof e?e:f;return w.start({scale:t&&a>v[1]/2?c:1,rotation:e&&!t?x:[a,o,0],config:e=>"scale"===e?{...u,friction:3*u.friction}:u}),[a,o]}},{target:t?h.domElement:void 0});return b.createElement(i.a.group,E.default({},null==M?void 0:M(),y),a)},exports.QuadraticBezierLine=te,exports.Reflector=qt,exports.Ring=Ct,exports.RoundedBox=Ut,exports.ScreenQuad=Ft,exports.Scroll=Y,exports.ScrollControls=function({eps:e=1e-5,enabled:t=!0,infinite:r,horizontal:n,pages:a=1,distance:s=1,damping:i=4,style:l={},children:u}){const{gl:c,size:d,invalidate:m,events:f,raycaster:p}=o.useThree(),[h]=b.useState((()=>document.createElement("div"))),[v]=b.useState((()=>document.createElement("div"))),[g]=b.useState((()=>document.createElement("div"))),x=c.domElement.parentNode,y=b.useRef(0),w=b.useMemo((()=>({el:h,eps:e,fill:v,fixed:g,horizontal:n,damping:i,offset:0,delta:0,scroll:y,pages:a,range(e,t,r=0){const n=e-r,o=n+t+2*r;return this.offset<n?0:this.offset>o?1:(this.offset-n)/(o-n)},curve(e,t,r=0){return Math.sin(this.range(e,t,r)*Math.PI)},visible(e,t,r=0){const n=e-r,o=n+t+2*r;return this.offset>=n&&this.offset<=o}})),[e,i,n,a]);b.useEffect((()=>{h.style.position="absolute",h.style.width="100%",h.style.height="100%",h.style[n?"overflowX":"overflowY"]="auto",h.style[n?"overflowY":"overflowX"]="hidden",h.style.top="0px",h.style.left="0px";for(const e in l)h.style[e]=l[e];g.style.position="sticky",g.style.top="0px",g.style.left="0px",g.style.width="100%",g.style.height="100%",g.style.overflow="hidden",h.appendChild(g),v.style.height=n?"100%":a*s*100+"%",v.style.width=n?a*s*100+"%":"100%",v.style.pointerEvents="none",h.appendChild(v),x.appendChild(h),h[n?"scrollLeft":"scrollTop"]=1;const e="boolean"!=typeof f.connected?f.connected:c.domElement;requestAnimationFrame((()=>null==f.connect?void 0:f.connect(h)));const t=p.computeOffsets;return p.computeOffsets=({clientX:e,clientY:t})=>({offsetX:e-x.offsetLeft,offsetY:t-x.offsetTop}),()=>{x.removeChild(h),p.computeOffsets=t,null==f.connect||f.connect(e)}}),[a,s,n,h,v,g,x]),b.useEffect((()=>{const e=d[n?"width":"height"],o=h[n?"scrollWidth":"scrollHeight"],a=o-e;let s=0,i=!0,l=!0;const u=()=>{if(t&&!l&&(m(),s=h[n?"scrollLeft":"scrollTop"],y.current=s/a,r)){if(!i)if(s>=a){const e=1-w.offset;h[n?"scrollLeft":"scrollTop"]=1,y.current=w.offset=-e,i=!0}else if(s<=0){const e=1+w.offset;h[n?"scrollLeft":"scrollTop"]=o,y.current=w.offset=e,i=!0}i&&setTimeout((()=>i=!1),40)}};h.addEventListener("scroll",u,{passive:!0}),requestAnimationFrame((()=>l=!1));const c=e=>h.scrollLeft+=e.deltaY/2;return n&&h.addEventListener("wheel",c,{passive:!0}),()=>{h.removeEventListener("scroll",u),n&&h.removeEventListener("wheel",c)}}),[h,d,r,w,m,n]);let E=0;return o.useFrame(((t,r)=>{w.offset=S.MathUtils.damp(E=w.offset,y.current,i,r),w.delta=S.MathUtils.damp(w.delta,Math.abs(E-w.offset),i,r),w.delta>e&&m()})),b.createElement($.Provider,{value:w},u)},exports.Segment=Ur,exports.Segments=zr,exports.Select=function({box:e,multiple:t,children:r,onChange:n,border:a="1px solid #55aaff",backgroundColor:s="rgba(75, 160, 255, 0.1)",filter:i=(e=>e),...l}){const{camera:c,raycaster:d,gl:m,controls:f,size:p,get:h}=o.useThree(),[v,g]=b.useState(!1),[x,y]=b.useReducer(((e,{object:t,shift:r})=>void 0===t?[]:Array.isArray(t)?t:r?e.includes(t)?e.filter((e=>e!==t)):[t,...e]:e[0]===t?[]:[t]),[]);b.useEffect((()=>{null==n||n(x)}),[x]);const w=b.useCallback((e=>{e.stopPropagation(),y({object:i([e.object])[0],shift:t&&e.shiftKey})}),[]),M=b.useCallback((e=>!v&&y({})),[v]),T=b.useRef(null);return b.useEffect((()=>{if(!e||!t)return;const r=new u.SelectionBox(c,T.current),n=document.createElement("div");n.style.pointerEvents="none",n.style.border=a,n.style.backgroundColor=s,n.style.position="fixed";const o=new S.Vector2,l=new S.Vector2,v=new S.Vector2,g=d.enabled,x=null==f?void 0:f.enabled;let w=!1;function E(e,t){var r;const{offsetX:n,offsetY:o}=null!==(r=null==d.computeOffsets?void 0:d.computeOffsets(e,h()))&&void 0!==r?r:e,{width:a,height:s}=p;t.set(n/a*2-1,-o/s*2+1)}function b(e){e.shiftKey&&(!function(e){var t;f&&(f.enabled=!1),d.enabled=!1,w=!0,null==(t=m.domElement.parentElement)||t.appendChild(n),n.style.left=`${e.clientX}px`,n.style.top=`${e.clientY}px`,n.style.width="0px",n.style.height="0px",o.x=e.clientX,o.y=e.clientY}(e),E(e,r.startPoint))}let M=[];function C(e){if(w){!function(e){v.x=Math.max(o.x,e.clientX),v.y=Math.max(o.y,e.clientY),l.x=Math.min(o.x,e.clientX),l.y=Math.min(o.y,e.clientY),n.style.left=`${l.x}px`,n.style.top=`${l.y}px`,n.style.width=v.x-l.x+"px",n.style.height=v.y-l.y+"px"}(e),E(e,r.endPoint);const t=r.select().sort((e=>e.uuid)).filter((e=>e.isMesh));R.default(t,M)||(M=t,y({object:i(t)}))}}function L(e){var t;w&&w&&(f&&(f.enabled=x),d.enabled=g,w=!1,null==(t=n.parentElement)||t.removeChild(n))}return document.addEventListener("pointerdown",b,{passive:!0}),document.addEventListener("pointermove",C,{passive:!0,capture:!0}),document.addEventListener("pointerup",L,{passive:!0}),()=>{document.removeEventListener("pointerdown",b),document.removeEventListener("pointermove",C),document.removeEventListener("pointerup",L)}}),[p,d,c,f,m]),b.createElement("group",E.default({ref:T,onClick:w,onPointerOver:()=>g(!0),onPointerOut:()=>g(!1),onPointerMissed:M},l),b.createElement(K.Provider,{value:x},r))},exports.Shadow=$t,exports.Sky=Qt,exports.Sphere=wt,exports.SpotLight=Yt,exports.Stage=function({children:e,controls:t,shadows:r=!0,adjustCamera:n=!0,environment:a="city",intensity:s=1,preset:i="rembrandt",shadowBias:l=0,contactShadow:u={blur:2,opacity:.5,position:[0,0,0]},...c}){const d=Nt[i],m=o.useThree((e=>e.camera)),f=o.useThree((e=>e.controls)),p=b.useRef(null),h=b.useRef(null),[{radius:v,width:g,height:x},y]=b.useState({radius:0,width:0,height:0});return b.useLayoutEffect((()=>{p.current.position.set(0,0,0),p.current.updateWorldMatrix(!0,!0);const e=(new S.Box3).setFromObject(h.current),t=new S.Vector3,r=new S.Sphere,n=e.max.y-e.min.y,o=e.max.x-e.min.x;e.getCenter(t),e.getBoundingSphere(r),y({radius:r.radius,width:o,height:n}),p.current.position.set(-t.x,-t.y+n/2,-t.z)}),[e]),b.useLayoutEffect((()=>{if(n){const e=v/(x>g?1.5:2.5);m.position.set(0,.5*v,2.5*v),m.near=.1,m.far=Math.max(5e3,4*v),m.lookAt(0,e,0);const r=f||(null==t?void 0:t.current);r&&(r.target.set(0,e,0),r.update())}}),[f,v,x,g,n]),b.createElement("group",c,b.createElement("group",{ref:p},b.createElement("group",{ref:h},e)),u&&b.createElement(Wt,E.default({width:2*v,height:2*v,far:v/2},u)),a&&b.createElement(Gt,{preset:a}),b.createElement("ambientLight",{intensity:s/3}),b.createElement("spotLight",{penumbra:1,position:[d.main[0]*v,d.main[1]*v,d.main[2]*v],intensity:2*s,castShadow:r,"shadow-bias":l}),b.createElement("pointLight",{position:[d.fill[0]*v,d.fill[1]*v,d.fill[2]*v],intensity:s}))},exports.Stars=tr,exports.Stats=function({showPanel:e=0,className:t,parent:r}){const n=function(e,t=[],r){const[n,o]=b.useState();return b.useLayoutEffect((()=>{const t=e();return o(t),tt(r,t),()=>tt(r,null)}),t),n}((()=>new P.default),[]);return b.useEffect((()=>{if(n){const a=r&&r.current||document.body;n.showPanel(e),null==a||a.appendChild(n.dom),t&&n.dom.classList.add(t);const s=o.addEffect((()=>n.begin())),i=o.addAfterEffect((()=>n.end()));return()=>{null==a||a.removeChild(n.dom),s(),i()}}}),[r,n,t,e]),null},exports.Tetrahedron=Tt,exports.Text=oe,exports.Torus=Mt,exports.TorusKnot=St,exports.TrackballControls=xe,exports.TransformControls=we,exports.Tube=bt,exports.calcPosFromAngles=Kt,exports.isWebGL2Available=ae,exports.meshBounds=function(e,t){const r=this.geometry,n=this.material,o=this.matrixWorld;void 0!==n&&(null===r.boundingSphere&&r.computeBoundingSphere(),jr.copy(r.boundingSphere),jr.applyMatrix4(o),!1!==e.ray.intersectsSphere(jr)&&(Fr.copy(o).invert(),kr.copy(e.ray).applyMatrix4(Fr),null!==r.boundingBox&&null===kr.intersectBox(r.boundingBox,Vr)||t.push({distance:Vr.distanceTo(e.ray.origin),point:Vr.clone(),object:this})))},exports.shaderMaterial=ie,exports.softShadows=e=>{if(!pt){pt=!0;let t=S.ShaderChunk.shadowmap_pars_fragment;t=t.replace("#ifdef USE_SHADOWMAP","#ifdef USE_SHADOWMAP\n"+(({frustum:e=3.75,size:t=.005,near:r=9.5,samples:n=17,rings:o=11}={})=>`#define LIGHT_WORLD_SIZE ${t}\n#define LIGHT_FRUSTUM_WIDTH ${e}\n#define LIGHT_SIZE_UV (LIGHT_WORLD_SIZE / LIGHT_FRUSTUM_WIDTH)\n#define NEAR_PLANE ${r}\n\n#define NUM_SAMPLES ${n}\n#define NUM_RINGS ${o}\n#define BLOCKER_SEARCH_NUM_SAMPLES NUM_SAMPLES\n#define PCF_NUM_SAMPLES NUM_SAMPLES\n\nvec2 poissonDisk[NUM_SAMPLES];\n\nvoid initPoissonSamples(const in vec2 randomSeed) {\n float ANGLE_STEP = PI2 * float(NUM_RINGS) / float(NUM_SAMPLES);\n float INV_NUM_SAMPLES = 1.0 / float(NUM_SAMPLES);\n float angle = rand(randomSeed) * PI2;\n float radius = INV_NUM_SAMPLES;\n float radiusStep = radius;\n for (int i = 0; i < NUM_SAMPLES; i++) {\n poissonDisk[i] = vec2(cos(angle), sin(angle)) * pow(radius, 0.75);\n radius += radiusStep;\n angle += ANGLE_STEP;\n }\n}\n\nfloat penumbraSize(const in float zReceiver, const in float zBlocker) { // Parallel plane estimation\n return (zReceiver - zBlocker) / zBlocker;\n}\n\nfloat findBlocker(sampler2D shadowMap, const in vec2 uv, const in float zReceiver) {\n float searchRadius = LIGHT_SIZE_UV * (zReceiver - NEAR_PLANE) / zReceiver;\n float blockerDepthSum = 0.0;\n int numBlockers = 0;\n for (int i = 0; i < BLOCKER_SEARCH_NUM_SAMPLES; i++) {\n float shadowMapDepth = unpackRGBAToDepth(texture2D(shadowMap, uv + poissonDisk[i] * searchRadius));\n if (shadowMapDepth < zReceiver) {\n blockerDepthSum += shadowMapDepth;\n numBlockers++;\n }\n }\n if (numBlockers == 0) return -1.0;\n return blockerDepthSum / float(numBlockers);\n}\n\nfloat PCF_Filter(sampler2D shadowMap, vec2 uv, float zReceiver, float filterRadius) {\n float sum = 0.0;\n for (int i = 0; i < PCF_NUM_SAMPLES; i++) {\n float depth = unpackRGBAToDepth(texture2D(shadowMap, uv + poissonDisk[ i ] * filterRadius));\n if (zReceiver <= depth) sum += 1.0;\n }\n for (int i = 0; i < PCF_NUM_SAMPLES; i++) {\n float depth = unpackRGBAToDepth(texture2D(shadowMap, uv + -poissonDisk[ i ].yx * filterRadius));\n if (zReceiver <= depth) sum += 1.0;\n }\n return sum / (2.0 * float(PCF_NUM_SAMPLES));\n}\n\nfloat PCSS(sampler2D shadowMap, vec4 coords) {\n vec2 uv = coords.xy;\n float zReceiver = coords.z; // Assumed to be eye-space z in this code\n initPoissonSamples(uv);\n float avgBlockerDepth = findBlocker(shadowMap, uv, zReceiver);\n if (avgBlockerDepth == -1.0) return 1.0;\n float penumbraRatio = penumbraSize(zReceiver, avgBlockerDepth);\n float filterRadius = penumbraRatio * LIGHT_SIZE_UV * NEAR_PLANE / zReceiver;\n return PCF_Filter(shadowMap, uv, zReceiver, filterRadius);\n}`)({...e})),t=t.replace("#if defined( SHADOWMAP_TYPE_PCF )","\nreturn PCSS(shadowMap, shadowCoord);\n#if defined( SHADOWMAP_TYPE_PCF )"),S.ShaderChunk.shadowmap_pars_fragment=t}},exports.useAnimations=function(e,t){const r=b.useRef(),[a]=b.useState((()=>t?t instanceof n.Object3D?{current:t}:t:r)),[s]=b.useState((()=>new n.AnimationMixer(void 0))),i=b.useRef({}),[l]=b.useState((()=>{const t={};return e.forEach((e=>Object.defineProperty(t,e.name,{enumerable:!0,get(){if(a.current)return i.current[e.name]||(i.current[e.name]=s.clipAction(e,a.current))}}))),{ref:a,clips:e,actions:t,names:e.map((e=>e.name)),mixer:s}}));return o.useFrame(((e,t)=>s.update(t))),b.useEffect((()=>{const e=a.current;return()=>{i.current={},Object.values(l.actions).forEach((t=>{e&&s.uncacheAction(t,e)}))}}),[e]),l},exports.useAspect=function(e,t,r=1){const n=o.useThree((e=>e.viewport)),a=t*(n.aspect>e/t?n.width/e:n.height/t);return[e*(n.aspect>e/t?n.width/e:n.height/t)*r,a*r,1]},exports.useBVH=function(e,t){b.useEffect((()=>{if(e.current){e.current.raycast=g.acceleratedRaycast;const r=e.current.geometry;return r.computeBoundsTree=g.computeBoundsTree,r.disposeBoundsTree=g.disposeBoundsTree,r.computeBoundsTree(t),()=>{r.boundsTree&&r.disposeBoundsTree()}}}),[e,t])},exports.useBounds=function(){return b.useContext(Vt)},exports.useCamera=Me,exports.useContextBridge=function(...e){const t=b.useRef([]);return t.current=e.map((e=>b.useContext(e))),b.useMemo((()=>({children:r})=>e.reduceRight(((e,r,n)=>b.createElement(r.Provider,{value:t.current[n],children:e})),r)),[])},exports.useCubeTexture=Xe,exports.useCursor=function(e,t="pointer",r="auto"){b.useEffect((()=>{if(e)return document.body.style.cursor=t,()=>{document.body.style.cursor=r}}),[e])},exports.useDepthBuffer=function({size:e=256,frames:t=1/0}={}){const r=o.useThree((e=>e.viewport.dpr)),{width:a,height:s}=o.useThree((e=>e.size)),i=e||a*r,l=e||s*r,u=b.useMemo((()=>{const e=new n.DepthTexture(i,l);return e.format=n.DepthFormat,e.type=n.UnsignedShortType,{depthTexture:e}}),[i,l]);let c=0;const d=rt(i,l,u);return o.useFrame((e=>{(t===1/0||c<t)&&(e.gl.setRenderTarget(d),e.gl.render(e.scene,e.camera),e.gl.setRenderTarget(null),c++)})),d.depthTexture},exports.useDetectGPU=e=>v.useAsset((()=>h.getGPUTier(e)),"useDetectGPU"),exports.useFBO=rt,exports.useFBX=Ze,exports.useGLTF=Qe,exports.useGizmoContext=Te,exports.useHelper=function(e,t,...r){const n=b.useRef(),a=o.useThree((e=>e.scene));return b.useEffect((()=>(t&&e.current&&(n.current=new t(e.current,...r),n.current&&a.add(n.current)),()=>{n.current&&a.remove(n.current)})),[a,t,e,r]),o.useFrame((()=>{var e;null!=(e=n.current)&&e.update&&n.current.update()})),n},exports.useIntersect=function(e){const t=b.useRef(null),r=b.useRef(!1),n=b.useRef(!1);return b.useEffect((()=>{const a=t.current;if(a){const t=o.addEffect((()=>(r.current=!1,!0))),s=a.onBeforeRender;a.onBeforeRender=()=>r.current=!0;const i=o.addAfterEffect((()=>(r.current!==n.current&&e(n.current=r.current),!0)));return()=>{a.onBeforeRender=s,t(),i()}}}),[]),t},exports.useKTX2=et,exports.useMatcapTexture=function(e=0,t=1024){const r=v.useAsset((()=>new Promise((async e=>{e(await fetch("https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/matcaps.json").then((e=>e.json())))}))),"matcapList"),n=r[0],o=b.useMemo((()=>Object.keys(r).length),[]),a=`https://rawcdn.githack.com/emmelleppi/matcaps/9b36ccaaf0a24881a39062d05566c9e92be4aa0d/${t}/${`${b.useMemo((()=>"string"==typeof e?e:"number"==typeof e?r[e]:null),[e])||n}${function(e){switch(e){case 64:return"-64px";case 128:return"-128px";case 256:return"-256px";case 512:return"-512px";default:return""}}(t)}.png`}`;return[ue(a),a,o]},exports.useNormalTexture=function(e=0,t={}){const{repeat:r=[1,1],anisotropy:o=1,offset:a=[0,0]}=t,s=v.useAsset((()=>new Promise((async e=>{e(await fetch("https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/normals/normals.json").then((e=>e.json())))}))),"normalsList"),i=b.useMemo((()=>Object.keys(s).length),[]),l=s[0],u=`https://rawcdn.githack.com/pmndrs/drei-assets/7a3104997e1576f83472829815b00880d88b32fb/normals/${s[e]||l}`,c=ue(u);return b.useLayoutEffect((()=>{c&&(c.wrapS=c.wrapT=n.RepeatWrapping,c.repeat=new n.Vector2(r[0],r[1]),c.offset=new n.Vector2(a[0],a[1]),c.anisotropy=o)}),[c,o,r,a]),[c,u,i]},exports.useProgress=W,exports.useScroll=q,exports.useSelect=function(){return b.useContext(K)},exports.useTexture=ue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/drei",
3
- "version": "8.7.2",
3
+ "version": "8.7.6",
4
4
  "private": false,
5
5
  "description": "useful add-ons for react-three-fiber",
6
6
  "keywords": [