@react-three/drei 9.56.10 → 9.56.12

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
@@ -999,10 +999,10 @@ You can align the text using the `<Center>` component.
999
999
  </Center>
1000
1000
  ```
1001
1001
 
1002
- It adds two properties that do not exist in the original `TextGeometry`, `lineHeight` and `letterSpacing`. The former a factor that is `1` by default, the latter is in threejs units and `0` by default.
1002
+ It adds three properties that do not exist in the original `TextGeometry`, `lineHeight`, `letterSpacing` and smooth. LetterSpacing is a factor that is `1` by default. LineHeight is in threejs units and `0` by default. Smooth merges vertices with a tolerance and calls computeVertexNormals.
1003
1003
 
1004
1004
  ```jsx
1005
- <Text3D lineHeight={0.5} letterSpacing={-0.025}>{`hello\nworld`}</Text3D>
1005
+ <Text3D smooth={1} lineHeight={0.5} letterSpacing={-0.025}>{`hello\nworld`}</Text3D>
1006
1006
  ```
1007
1007
 
1008
1008
  #### Effects
@@ -2804,6 +2804,8 @@ This component allows you to render a live scene into a texture which you can th
2804
2804
  eventPriority?: number
2805
2805
  /** Optional frame count, defaults to Infinity. If you set it to 1, it would only render a single frame, etc */
2806
2806
  frames?: number
2807
+ /** Optional event compute, defaults to undefined */
2808
+ compute?: (event: any, state: any, previous: any) => false | undefined
2807
2809
  /** Children will be rendered into a portal */
2808
2810
  children: React.ReactNode
2809
2811
  />
@@ -3384,6 +3386,7 @@ function Foo() {
3384
3386
  ```
3385
3387
 
3386
3388
  #### SpotLightShadows
3389
+
3387
3390
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/staging-spotlight--spotlight-shadows-st)
3388
3391
 
3389
3392
  <p>
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),t=require("react"),n=require("@react-three/fiber"),a=require("./useFBO.cjs.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(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 c=u(e),s=i(r),o=i(t);const l=o.forwardRef((({children:e,width:r,height:t,samples:u=8,renderPriority:i=0,eventPriority:l=0,frames:d=1/0,...m},p)=>{const{size:b,viewport:v}=n.useThree(),y=a.useFBO((r||b.width)*v.dpr,(t||b.height)*v.dpr,{samples:u}),[g]=o.useState((()=>new s.Scene)),h=o.useCallback(((e,r,t)=>{var n,a;let u=null==(n=y.texture)?void 0:n.__r3f.parent;for(;u&&!(u instanceof s.Object3D);)u=u.__r3f.parent;if(!u)return!1;t.raycaster.camera||t.events.compute(e,t,null==(a=t.previousRoot)?void 0:a.getState());const[i]=t.raycaster.intersectObject(u);if(!i)return!1;const c=i.uv;if(!c)return!1;r.raycaster.setFromCamera(r.pointer.set(2*c.x-1,2*c.y-1),r.camera)}),[]);return o.useImperativeHandle(p,(()=>y.texture),[y]),o.createElement(o.Fragment,null,n.createPortal(o.createElement(f,{renderPriority:i,frames:d,fbo:y},e),g,{events:{compute:h,priority:l}}),o.createElement("primitive",c.default({object:y.texture},m)))}));function f({frames:e,renderPriority:r,children:t,fbo:a}){let u=0;return n.useFrame((r=>{(e===1/0||u<e)&&(r.gl.setRenderTarget(a),r.gl.render(r.scene,r.camera),r.gl.setRenderTarget(null),u++)}),r),o.createElement(o.Fragment,null,t)}exports.RenderTexture=l;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),t=require("react"),n=require("@react-three/fiber"),a=require("./useFBO.cjs.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(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 c=u(e),s=i(r),o=i(t);const l=o.forwardRef((({children:e,compute:r,width:t,height:u,samples:i=8,renderPriority:l=0,eventPriority:d=0,frames:m=1/0,...p},b)=>{const{size:v,viewport:y}=n.useThree(),g=a.useFBO((t||v.width)*y.dpr,(u||v.height)*y.dpr,{samples:i}),[h]=o.useState((()=>new s.Scene)),j=o.useCallback(((e,r,t)=>{var n,a;let u=null==(n=g.texture)?void 0:n.__r3f.parent;for(;u&&!(u instanceof s.Object3D);)u=u.__r3f.parent;if(!u)return!1;t.raycaster.camera||t.events.compute(e,t,null==(a=t.previousRoot)?void 0:a.getState());const[i]=t.raycaster.intersectObject(u);if(!i)return!1;const c=i.uv;if(!c)return!1;r.raycaster.setFromCamera(r.pointer.set(2*c.x-1,2*c.y-1),r.camera)}),[]);return o.useImperativeHandle(b,(()=>g.texture),[g]),o.createElement(o.Fragment,null,n.createPortal(o.createElement(f,{renderPriority:l,frames:m,fbo:g},e),h,{events:{compute:r||j,priority:d}}),o.createElement("primitive",c.default({object:g.texture},p)))}));function f({frames:e,renderPriority:r,children:t,fbo:a}){let u=0;return n.useFrame((r=>{(e===1/0||u<e)&&(r.gl.setRenderTarget(a),r.gl.render(r.scene,r.camera),r.gl.setRenderTarget(null),u++)}),r),o.createElement(o.Fragment,null,t)}exports.RenderTexture=l;
@@ -7,5 +7,6 @@ export declare const RenderTexture: React.ForwardRefExoticComponent<Pick<import(
7
7
  renderPriority?: number | undefined;
8
8
  eventPriority?: number | undefined;
9
9
  frames?: number | undefined;
10
+ compute?: ((event: any, state: any, previous: any) => false | undefined) | undefined;
10
11
  children: React.ReactNode;
11
- }, "attach" | "args" | "children" | "key" | "onUpdate" | "rotation" | "matrix" | "dispose" | "type" | "id" | "uuid" | "name" | "matrixAutoUpdate" | "userData" | "updateMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "center" | "source" | "repeat" | "image" | "needsUpdate" | "version" | "offset" | "width" | "height" | "sourceFile" | "mipmaps" | "mapping" | "wrapS" | "wrapT" | "magFilter" | "minFilter" | "anisotropy" | "format" | "internalFormat" | "generateMipmaps" | "premultiplyAlpha" | "flipY" | "unpackAlignment" | "encoding" | "isRenderTargetTexture" | "needsPMREMUpdate" | "isTexture" | "transformUv" | "samples" | "frames" | "renderPriority" | "eventPriority"> & React.RefAttributes<unknown>>;
12
+ }, "attach" | "args" | "children" | "key" | "onUpdate" | "rotation" | "matrix" | "dispose" | "type" | "id" | "uuid" | "name" | "matrixAutoUpdate" | "userData" | "updateMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "center" | "source" | "repeat" | "image" | "needsUpdate" | "version" | "offset" | "width" | "height" | "sourceFile" | "mipmaps" | "mapping" | "wrapS" | "wrapT" | "magFilter" | "minFilter" | "anisotropy" | "format" | "internalFormat" | "generateMipmaps" | "premultiplyAlpha" | "flipY" | "unpackAlignment" | "encoding" | "isRenderTargetTexture" | "needsPMREMUpdate" | "isTexture" | "transformUv" | "compute" | "samples" | "frames" | "renderPriority" | "eventPriority"> & React.RefAttributes<unknown>>;
@@ -6,6 +6,7 @@ import { useFBO } from './useFBO.js';
6
6
 
7
7
  const RenderTexture = /*#__PURE__*/React.forwardRef(({
8
8
  children,
9
+ compute,
9
10
  width,
10
11
  height,
11
12
  samples = 8,
@@ -22,7 +23,7 @@ const RenderTexture = /*#__PURE__*/React.forwardRef(({
22
23
  samples
23
24
  });
24
25
  const [vScene] = React.useState(() => new THREE.Scene());
25
- const compute = React.useCallback((event, state, previous) => {
26
+ const uvCompute = React.useCallback((event, state, previous) => {
26
27
  var _fbo$texture, _previous$previousRoo;
27
28
 
28
29
  // Since this is only a texture it does not have an easy way to obtain the parent, which we
@@ -52,7 +53,7 @@ const RenderTexture = /*#__PURE__*/React.forwardRef(({
52
53
  fbo: fbo
53
54
  }, children), vScene, {
54
55
  events: {
55
- compute,
56
+ compute: compute || uvCompute,
56
57
  priority: eventPriority
57
58
  }
58
59
  }), /*#__PURE__*/React.createElement("primitive", _extends({
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("@react-three/fiber"),n=require("suspend-react"),s=require("three-stdlib");function i(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 l=i(e),a=u(t);const c=["string","number"],o=a.forwardRef((({font:e,letterSpacing:i=0,lineHeight:u=1,size:o=1,height:f=.2,bevelThickness:b=.1,bevelSize:d=.01,bevelEnabled:m=!1,bevelOffset:h=0,bevelSegments:v=4,curveSegments:g=8,children:p,...y},O)=>{a.useMemo((()=>r.extend({RenamedTextGeometry:s.TextGeometry})),[]);const j=n.suspend((async()=>{let t="string"==typeof e?await(await fetch(e)).json():e;return(new s.FontLoader).parse(t)}),[e]),x=t.useMemo((()=>({font:j,size:o,height:f,bevelThickness:b,bevelSize:d,bevelEnabled:m,bevelSegments:v,bevelOffset:h,curveSegments:g,letterSpacing:i,lineHeight:u})),[j,o,f,b,d,m,v,h,g,i,u]),[S,...E]=t.useMemo((()=>(e=>{let t="";const r=[];return a.Children.forEach(e,(e=>{c.includes(typeof e)?t+=e+"":r.push(e)})),[t,...r]})(p)),[p]),M=a.useMemo((()=>[S,x]),[S,x]);return a.createElement("mesh",l.default({},y,{ref:O}),a.createElement("renamedTextGeometry",{args:M}),E)}));exports.Text3D=o;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("@react-three/fiber"),n=require("suspend-react"),s=require("three-stdlib");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(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 o=u(e),c=i(t);const l=["string","number"],a=c.forwardRef((({font:e,letterSpacing:u=0,lineHeight:i=1,size:a=1,height:f=.2,bevelThickness:m=.1,bevelSize:b=.01,bevelEnabled:d=!1,bevelOffset:g=0,bevelSegments:h=4,curveSegments:p=8,smooth:v,children:y,...x},O)=>{c.useMemo((()=>r.extend({RenamedTextGeometry:s.TextGeometry})),[]);const j=c.useRef(null),S=n.suspend((async()=>{let t="string"==typeof e?await(await fetch(e)).json():e;return(new s.FontLoader).parse(t)}),[e]),E=t.useMemo((()=>({font:S,size:a,height:f,bevelThickness:m,bevelSize:b,bevelEnabled:d,bevelSegments:h,bevelOffset:g,curveSegments:p,letterSpacing:u,lineHeight:i})),[S,a,f,m,b,d,h,g,p,u,i]),[M,...T]=t.useMemo((()=>(e=>{let t="";const r=[];return c.Children.forEach(e,(e=>{l.includes(typeof e)?t+=e+"":r.push(e)})),[t,...r]})(y)),[y]),q=c.useMemo((()=>[M,E]),[M,E]);return c.useLayoutEffect((()=>{v&&(j.current.geometry=s.mergeVertices(j.current.geometry,v),j.current.geometry.computeVertexNormals())}),[q,v]),c.useImperativeHandle(O,(()=>j.current),[]),c.createElement("mesh",o.default({},x,{ref:j}),c.createElement("renamedTextGeometry",{args:q}),T)}));exports.Text3D=a;
package/core/Text3D.d.ts CHANGED
@@ -29,6 +29,7 @@ declare type FontData = {
29
29
  export declare const Text3D: React.ForwardRefExoticComponent<Pick<React.PropsWithChildren<{
30
30
  font: FontData | string;
31
31
  bevelSegments?: number | undefined;
32
+ smooth?: number | undefined;
32
33
  } & Omit<TextGeometryParameters, "font"> & Omit<import("@react-three/fiber").ExtendedColors<import("@react-three/fiber").Overwrite<Partial<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>, import("@react-three/fiber").NodeProps<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>, typeof THREE.Mesh>>>, import("@react-three/fiber").NonFunctionKeys<{
33
34
  position?: import("@react-three/fiber").Vector3 | undefined;
34
35
  up?: import("@react-three/fiber").Vector3 | undefined;
@@ -50,5 +51,5 @@ export declare const Text3D: React.ForwardRefExoticComponent<Pick<React.PropsWit
50
51
  } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
51
52
  letterSpacing?: number | undefined;
52
53
  lineHeight?: number | undefined;
53
- }>, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "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 | "material" | "geometry" | "size" | "font" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "height" | "letterSpacing" | "lineHeight" | "bevelEnabled" | "bevelOffset" | "bevelSize" | "bevelThickness" | "curveSegments" | "bevelSegments"> & React.RefAttributes<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
54
+ }>, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "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 | "material" | "geometry" | "size" | "font" | "smooth" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "height" | "letterSpacing" | "lineHeight" | "bevelEnabled" | "bevelOffset" | "bevelSize" | "bevelThickness" | "curveSegments" | "bevelSegments"> & React.RefAttributes<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
54
55
  export {};
package/core/Text3D.js CHANGED
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import { useMemo } from 'react';
4
4
  import { extend } from '@react-three/fiber';
5
5
  import { suspend } from 'suspend-react';
6
- import { TextGeometry, FontLoader } from 'three-stdlib';
6
+ import { TextGeometry, FontLoader, mergeVertices } from 'three-stdlib';
7
7
 
8
8
  const types = ['string', 'number'];
9
9
 
@@ -28,12 +28,14 @@ const Text3D = /*#__PURE__*/React.forwardRef(({
28
28
  bevelOffset = 0,
29
29
  bevelSegments = 4,
30
30
  curveSegments = 8,
31
+ smooth,
31
32
  children,
32
33
  ...props
33
- }, ref) => {
34
+ }, fref) => {
34
35
  React.useMemo(() => extend({
35
36
  RenamedTextGeometry: TextGeometry
36
37
  }), []);
38
+ const ref = React.useRef(null);
37
39
  const font = suspend(async () => {
38
40
  let data = typeof _font === 'string' ? await (await fetch(_font)).json() : _font;
39
41
  let loader = new FontLoader();
@@ -61,6 +63,13 @@ const Text3D = /*#__PURE__*/React.forwardRef(({
61
63
 
62
64
  const [label, ...rest] = useMemo(() => getTextFromChildren(children), [children]);
63
65
  const args = React.useMemo(() => [label, opts], [label, opts]);
66
+ React.useLayoutEffect(() => {
67
+ if (smooth) {
68
+ ref.current.geometry = mergeVertices(ref.current.geometry, smooth);
69
+ ref.current.geometry.computeVertexNormals();
70
+ }
71
+ }, [args, smooth]);
72
+ React.useImperativeHandle(fref, () => ref.current, []);
64
73
  return /*#__PURE__*/React.createElement("mesh", _extends({}, props, {
65
74
  ref: ref
66
75
  }), /*#__PURE__*/React.createElement("renamedTextGeometry", {