@react-three/drei 9.75.0 → 9.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -675,7 +675,73 @@ type FaceControlsApi = THREE.EventDispatcher & {
675
675
  }
676
676
  ```
677
677
 
678
- > **Note** <br>`FaceControls` uses [`requestVideoFrameCallback`](https://caniuse.com/mdn-api_htmlvideoelement_requestvideoframecallback), you may need [a polyfill](https://github.com/ThaUnknown/rvfc-polyfill) (for Firefox).
678
+ ##### FaceControls events
679
+
680
+ Two `THREE.Event`s are dispatched on FaceControls ref object:
681
+
682
+ - `{ type: "stream", stream: MediaStream }` -- when webcam's `.getUserMedia()` stream begins
683
+ - `{ type: "videoFrame", texture: THREE.VideoTexture, time: number }` -- each time a new video frame is sent to the compositor (thanks to rVFC)
684
+
685
+ > **Note** <br>rVFC
686
+ >
687
+ > Internally, `FaceControls` uses [`requestVideoFrameCallback`](https://caniuse.com/mdn-api_htmlvideoelement_requestvideoframecallback), you may need [a polyfill](https://github.com/ThaUnknown/rvfc-polyfill) (for Firefox).
688
+
689
+ ##### FaceControls[manualDetect]
690
+
691
+ By default, `detect` is called on each `"videoFrame"`. You can disable this by `manualDetect` and call `detect` yourself.
692
+
693
+ For example:
694
+
695
+ ```jsx
696
+ const controls = useThree((state) => state.controls)
697
+
698
+ const onVideoFrame = useCallback((event) => {
699
+ controls.detect(event.texture.source.data, event.time)
700
+ }, [controls])
701
+
702
+ <FaceControls makeDefault
703
+ manualDetect
704
+ onVideoFrame={onVideoFrame}
705
+ />
706
+ ```
707
+
708
+ ##### FaceControls[manualUpdate]
709
+
710
+ By default, `update` is called each rAF `useFrame` frame, with damping. You can disable this by `manualUpdate` and update the camera yourself.
711
+
712
+ For example:
713
+
714
+ ```jsx
715
+ const controls = useThree((state) => state.controls)
716
+
717
+ const [current] = useState(() => new THREE.Object3D())
718
+
719
+ useFrame((_, delta) => {
720
+ const target = controls?.computeTarget()
721
+
722
+ if (target) {
723
+ //
724
+ // A. Define your own damping
725
+ //
726
+
727
+ const eps = 1e-9
728
+ easing.damp3(current.position, target.position, .25, delta, undefined, undefined, eps)
729
+ easing.dampE(current.rotation, target.rotation, .25, delta, undefined, undefined, eps)
730
+ camera.position.copy(current.position)
731
+ camera.rotation.copy(current.rotation)
732
+
733
+ //
734
+ // B. Or maybe with no damping at all?
735
+ //
736
+
737
+ // controls.update(delta, target)
738
+ // camera.position.copy(target.position)
739
+ // camera.rotation.copy(target.rotation)
740
+ }
741
+ })
742
+
743
+ <FaceControls makeDefault manualUpdate />
744
+ ```
679
745
 
680
746
  # Gizmos
681
747
 
@@ -3388,6 +3454,8 @@ const stencil = useMask(1, true)
3388
3454
  #### MeshPortalMaterial
3389
3455
 
3390
3456
  <p>
3457
+ <a href="https://codesandbox.io/s/9m4tpc"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/9m4tpc/screenshot.png" alt="Demo"/></a>
3458
+ <a href="https://codesandbox.io/s/drc6qg"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/drc6qg/screenshot.png" alt="Demo"/></a>
3391
3459
  <a href="https://codesandbox.io/s/ik11ln"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/ik11ln/screenshot.png" alt="Demo"/></a>
3392
3460
  </p>
3393
3461
 
@@ -4019,7 +4087,7 @@ Treat the output of the shader like an alpha map where `1` is opaque and `0` is
4019
4087
 
4020
4088
  ```glsl
4021
4089
  gl_FragColor = vec4(vec3(1.), 1.); // Opaque
4022
- gl_FragColor = vec4(vec3(0.), 1.); // Transparnet
4090
+ gl_FragColor = vec4(vec3(0.), 1.); // Transparent
4023
4091
  ```
4024
4092
 
4025
4093
  #### Environment
@@ -1 +1 @@
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"),o=require("camera-controls");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function a(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 u=s(e),c=a(t),i=a(r),d=s(o);const l=r.forwardRef(((e,t)=>{r.useMemo((()=>{d.default.install({THREE:c}),n.extend({CameraControlsImpl:d.default})}),[]);const{camera:o,domElement:s,makeDefault:a,onStart:l,onEnd:f,onChange:v,regress:m,...E}=e,p=n.useThree((e=>e.camera)),b=n.useThree((e=>e.gl)),h=n.useThree((e=>e.invalidate)),L=n.useThree((e=>e.events)),T=n.useThree((e=>e.setEvents)),g=n.useThree((e=>e.set)),j=n.useThree((e=>e.get)),O=n.useThree((e=>e.performance)),q=o||p,w=s||L.connected||b.domElement,y=r.useMemo((()=>new d.default(q)),[q]);return n.useFrame(((e,t)=>{y.enabled&&y.update(t)}),-1),r.useEffect((()=>(y.connect(w),()=>{y.disconnect()})),[w,y]),i.useEffect((()=>{const e=e=>{h(),m&&O.regress(),v&&v(e)},t=e=>{l&&l(e)},r=e=>{f&&f(e)};return y.addEventListener("update",e),y.addEventListener("controlstart",t),y.addEventListener("controlend",r),y.addEventListener("control",e),y.addEventListener("transitionstart",e),y.addEventListener("wake",e),()=>{y.removeEventListener("update",e),y.removeEventListener("controlstart",t),y.removeEventListener("controlend",r),y.removeEventListener("control",e),y.removeEventListener("transitionstart",e),y.removeEventListener("wake",e)}}),[y,l,f,h,T,m,v]),r.useEffect((()=>{if(a){const e=j().controls;return g({controls:y}),()=>g({controls:e})}}),[a,y]),i.createElement("primitive",u.default({ref:t,object:y},E))}));exports.CameraControls=l;
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"),o=require("camera-controls");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(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=a(e),u=s(r),i=a(o);const l=r.forwardRef(((e,o)=>{r.useMemo((()=>{const e={Box3:t.Box3,MathUtils:{clamp:t.MathUtils.clamp},Matrix4:t.Matrix4,Quaternion:t.Quaternion,Raycaster:t.Raycaster,Sphere:t.Sphere,Spherical:t.Spherical,Vector2:t.Vector2,Vector3:t.Vector3,Vector4:t.Vector4};i.default.install({THREE:e}),n.extend({CameraControlsImpl:i.default})}),[]);const{camera:a,domElement:s,makeDefault:l,onStart:d,onEnd:f,onChange:m,regress:v,...E}=e,p=n.useThree((e=>e.camera)),h=n.useThree((e=>e.gl)),b=n.useThree((e=>e.invalidate)),L=n.useThree((e=>e.events)),T=n.useThree((e=>e.setEvents)),g=n.useThree((e=>e.set)),j=n.useThree((e=>e.get)),x=n.useThree((e=>e.performance)),M=a||p,y=s||L.connected||h.domElement,O=r.useMemo((()=>new i.default(M)),[M]);return n.useFrame(((e,t)=>{O.enabled&&O.update(t)}),-1),r.useEffect((()=>(O.connect(y),()=>{O.disconnect()})),[y,O]),r.useEffect((()=>{const e=e=>{b(),v&&x.regress(),m&&m(e)},t=e=>{d&&d(e)},r=e=>{f&&f(e)};return O.addEventListener("update",e),O.addEventListener("controlstart",t),O.addEventListener("controlend",r),O.addEventListener("control",e),O.addEventListener("transitionstart",e),O.addEventListener("wake",e),()=>{O.removeEventListener("update",e),O.removeEventListener("controlstart",t),O.removeEventListener("controlend",r),O.removeEventListener("control",e),O.removeEventListener("transitionstart",e),O.removeEventListener("wake",e)}}),[O,d,f,b,T,v,m]),r.useEffect((()=>{if(l){const e=j().controls;return g({controls:O}),()=>g({controls:e})}}),[l,O]),u.createElement("primitive",c.default({ref:o,object:O},E))}));exports.CameraControls=l;
@@ -1,4 +1,4 @@
1
- import type { PerspectiveCamera, OrthographicCamera } from 'three';
1
+ import { OrthographicCamera, PerspectiveCamera } from 'three';
2
2
  import * as React from 'react';
3
3
  import { ReactThreeFiber } from '@react-three/fiber';
4
4
  import CameraControlsImpl from 'camera-controls';
@@ -1,14 +1,31 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
- import * as THREE from 'three';
2
+ import { Box3, MathUtils, Matrix4, Quaternion, Raycaster, Sphere, Spherical, Vector2, Vector3, Vector4 } from 'three';
3
3
  import * as React from 'react';
4
4
  import { forwardRef, useMemo, useEffect } from 'react';
5
5
  import { extend, useThree, useFrame } from '@react-three/fiber';
6
6
  import CameraControlsImpl from 'camera-controls';
7
7
 
8
8
  const CameraControls = /*#__PURE__*/forwardRef((props, ref) => {
9
+ // useMemo is used here instead of useEffect, otherwise the useMemo below runs first and throws
9
10
  useMemo(() => {
11
+ // to allow for tree shaking, we only import the subset of THREE that is used by camera-controls
12
+ // see https://github.com/yomotsu/camera-controls#important
13
+ const subsetOfTHREE = {
14
+ Box3,
15
+ MathUtils: {
16
+ clamp: MathUtils.clamp
17
+ },
18
+ Matrix4,
19
+ Quaternion,
20
+ Raycaster,
21
+ Sphere,
22
+ Spherical,
23
+ Vector2,
24
+ Vector3,
25
+ Vector4
26
+ };
10
27
  CameraControlsImpl.install({
11
- THREE
28
+ THREE: subsetOfTHREE
12
29
  });
13
30
  extend({
14
31
  CameraControlsImpl
@@ -42,7 +59,7 @@ const CameraControls = /*#__PURE__*/forwardRef((props, ref) => {
42
59
  controls.connect(explDomElement);
43
60
  return () => void controls.disconnect();
44
61
  }, [explDomElement, controls]);
45
- React.useEffect(() => {
62
+ useEffect(() => {
46
63
  const callback = e => {
47
64
  invalidate();
48
65
  if (regress) performance.regress();
@@ -1,7 +1,7 @@
1
1
  import { Texture } from 'three';
2
2
  import * as React from 'react';
3
3
  import { CubeCameraOptions } from './useCubeCamera';
4
- declare type Props = JSX.IntrinsicElements['group'] & {
4
+ declare type Props = Omit<JSX.IntrinsicElements['group'], 'children'> & {
5
5
  children: (tex: Texture) => React.ReactNode;
6
6
  frames?: number;
7
7
  } & CubeCameraOptions;