@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 +70 -2
- package/core/CameraControls.cjs.js +1 -1
- package/core/CameraControls.d.ts +1 -1
- package/core/CameraControls.js +20 -3
- package/core/CubeCamera.d.ts +1 -1
- package/index.cjs.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -675,7 +675,73 @@ type FaceControlsApi = THREE.EventDispatcher & {
|
|
|
675
675
|
}
|
|
676
676
|
```
|
|
677
677
|
|
|
678
|
-
|
|
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.); //
|
|
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
|
|
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;
|
package/core/CameraControls.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
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';
|
package/core/CameraControls.js
CHANGED
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
import _extends from '@babel/runtime/helpers/esm/extends';
|
|
2
|
-
import
|
|
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
|
-
|
|
62
|
+
useEffect(() => {
|
|
46
63
|
const callback = e => {
|
|
47
64
|
invalidate();
|
|
48
65
|
if (regress) performance.regress();
|
package/core/CubeCamera.d.ts
CHANGED
|
@@ -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;
|