@react-three/drei 9.7.0 → 9.8.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
@@ -56,6 +56,7 @@ The `native` route of the library **does not** export `Html` or `Loader`. The de
56
56
  <ul>
57
57
  <li><a href="#image">Image</a></li>
58
58
  <li><a href="#text">Text</a></li>
59
+ <li><a href="#text3d">Text3D</a></li>
59
60
  <li><a href="#line">Line</a></li>
60
61
  <li><a href="#quadraticbezierline">QuadraticBezierLine</a></li>
61
62
  <li><a href="#cubicbezierline">CubicBezierLine</a></li>
@@ -471,6 +472,23 @@ Text will suspend while loading the font data, but in order to completely avoid
471
472
  </Text>
472
473
  ```
473
474
 
475
+ #### Text3D
476
+
477
+ [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/abstractions-text3d--text-3-d-st) ![](https://img.shields.io/badge/-suspense-brightgreen)
478
+
479
+ Render 3D text using ThreeJS's `TextGeometry`.
480
+
481
+ Text3D will suspend while loading the font data, you can also load the font yourself before passing it in. Text3D requires fonts in JSON format generated through (typeface.json)[http://gero3.github.io/facetype.js/] either as a path to a JSON files or a JSON object.
482
+
483
+ ```jsx
484
+ <Text3D font={fontUrl} {...textOptions}>
485
+ Hello world!
486
+ <meshNormalMaterial />
487
+ </Text3D>
488
+ ```
489
+
490
+ You can use any material. `textOptions` are options you'd pass to the `TextGeometry` constructor. Find more information about available options [here](https://threejs.org/docs/index.html?q=textg#examples/en/geometries/TextGeometry).
491
+
474
492
  #### Line
475
493
 
476
494
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/abstractions-line--basic-line)
@@ -1469,6 +1487,19 @@ const props = useTexture({
1469
1487
  return <meshStandardMaterial {...props} />
1470
1488
  ```
1471
1489
 
1490
+ Use the `onLoad` callback to set propeties on loaded textures.
1491
+
1492
+ ```jsx
1493
+ const texture = useTexture(url, (texture) => {
1494
+ texture.wrapS = texture.wrapT = THREE.RepeatWrapping
1495
+ })
1496
+
1497
+ const [texture1, texture2] = useTexture([texture1, texture2], ([texture1, texture2]) => {
1498
+ texture1.wrapS = texture1.wrapT = THREE.RepeatWrapping
1499
+ texture2.wrapS = texture2.wrapT = THREE.RepeatWrapping
1500
+ })
1501
+ ```
1502
+
1472
1503
  #### useKTX2
1473
1504
 
1474
1505
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/loaders-ktx2--use-ktx-2-scene-st)
@@ -1770,7 +1801,7 @@ return (
1770
1801
  <a href="https://codesandbox.io/s/0z8i2c"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/0z8i2c/screenshot.png" alt="Demo"/></a>
1771
1802
  </p>
1772
1803
 
1773
- This component allows you to render a live scene into a texture which you can then apply to a material. The contents of it run inside a portal and are separate from the rest of the canvas, therefore you can have events in there, events, environment maps, etc.
1804
+ This component allows you to render a live scene into a texture which you can then apply to a material. The contents of it run inside a portal and are separate from the rest of the canvas, therefore you can have events in there, environment maps, etc.
1774
1805
 
1775
1806
  ```tsx
1776
1807
  <RenderTexture
@@ -1778,8 +1809,10 @@ This component allows you to render a live scene into a texture which you can th
1778
1809
  width?: number
1779
1810
  /** Optional height of the texture, defaults to viewport bounds */
1780
1811
  height?: number
1812
+ /** Optional render priority, defaults to 0 */
1813
+ renderPriority?: number
1781
1814
  /** Optional event priority, defaults to 0 */
1782
- priority?: number
1815
+ eventPriority?: number
1783
1816
  /** Optional frame count, defaults to Infinity. If you set it to 1, it would only render a single frame, etc */
1784
1817
  frames?: number
1785
1818
  /** Children will be rendered into a portal */
@@ -1791,7 +1824,7 @@ This component allows you to render a live scene into a texture which you can th
1791
1824
  <mesh>
1792
1825
  <planeGeometry />
1793
1826
  <meshStandardMaterial>
1794
- <RenderTexture attach="map" encoding={THREE.sRGBEncoding}>
1827
+ <RenderTexture attach="map">
1795
1828
  <mesh />
1796
1829
  ```
1797
1830
 
package/core/Image.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),n=require("@react-three/fiber"),a=require("./shaderMaterial.cjs.js"),o=require("./useTexture.cjs.js");function c(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)}require("nanoid");var s=c(e),l=i(r),u=i(t);const f=a.shaderMaterial({color:new u.Color("white"),scale:[1,1],imageBounds:[1,1],map:null,zoom:1,grayscale:0,opacity:1},"\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 uniform float opacity;\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, opacity), grayscale);\n \n #include <tonemapping_fragment>\n #include <encodings_fragment>\n }\n"),m=l.forwardRef((({children:e,color:r,segments:t=1,scale:a=1,zoom:o=1,grayscale:c=0,opacity:i=1,texture:u,toneMapped:m,transparent:v,...d},g)=>{n.extend({ImageMaterial:f});const p=n.useThree((e=>e.gl)),y=Array.isArray(a)?[a[0],a[1]]:[a,a],x=[u.image.width,u.image.height];return l.createElement("mesh",s.default({ref:g,scale:a},d),l.createElement("planeGeometry",{args:[1,1,t,t]}),l.createElement("imageMaterial",{color:r,map:u,"map-encoding":p.outputEncoding,zoom:o,grayscale:c,opacity:i,scale:y,imageBounds:x,toneMapped:m,transparent:v}),e)})),v=l.forwardRef((({url:e,...r},t)=>{const n=o.useTexture(e);return l.createElement(m,s.default({},r,{texture:n,ref:t}))})),d=l.forwardRef((({url:e,...r},t)=>l.createElement(m,s.default({},r,{ref:t})))),g=l.forwardRef(((e,r)=>{if(e.url)return l.createElement(v,s.default({},e,{ref:r}));if(e.texture)return l.createElement(d,s.default({},e,{ref:r}));throw new Error("<Image /> requires a url or texture")}));exports.Image=g;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),n=require("@react-three/fiber"),a=require("./shaderMaterial.cjs.js"),o=require("./useTexture.cjs.js");function c(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 s=c(e),l=i(r),u=i(t);const f=a.shaderMaterial({color:new u.Color("white"),scale:[1,1],imageBounds:[1,1],map:null,zoom:1,grayscale:0,opacity:1},"\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 uniform float opacity;\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, opacity), grayscale);\n \n #include <tonemapping_fragment>\n #include <encodings_fragment>\n }\n"),m=l.forwardRef((({children:e,color:r,segments:t=1,scale:a=1,zoom:o=1,grayscale:c=0,opacity:i=1,texture:u,toneMapped:m,transparent:v,...d},g)=>{n.extend({ImageMaterial:f});const p=n.useThree((e=>e.gl)),y=Array.isArray(a)?[a[0],a[1]]:[a,a],x=[u.image.width,u.image.height];return l.createElement("mesh",s.default({ref:g,scale:a},d),l.createElement("planeGeometry",{args:[1,1,t,t]}),l.createElement("imageMaterial",{color:r,map:u,"map-encoding":p.outputEncoding,zoom:o,grayscale:c,opacity:i,scale:y,imageBounds:x,toneMapped:m,transparent:v}),e)})),v=l.forwardRef((({url:e,...r},t)=>{const n=o.useTexture(e);return l.createElement(m,s.default({},r,{texture:n,ref:t}))})),d=l.forwardRef((({url:e,...r},t)=>l.createElement(m,s.default({},r,{ref:t})))),g=l.forwardRef(((e,r)=>{if(e.url)return l.createElement(v,s.default({},e,{ref:r}));if(e.texture)return l.createElement(d,s.default({},e,{ref:r}));throw new Error("<Image /> requires a url or texture")}));exports.Image=g;
@@ -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 c(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 i=u(e),s=c(r),l=c(t);function o({frames:e,children:r,fbo:t}){let a=0;return n.useFrame((r=>{(e===1/0||a<e)&&(r.gl.setRenderTarget(t),r.gl.render(r.scene,r.camera),r.gl.setRenderTarget(null),a++)})),l.createElement(l.Fragment,null,r)}exports.RenderTexture=function({children:e,width:r,height:t,priority:u=0,frames:c=1/0,...f}){const{size:d,viewport:m}=n.useThree(),p=a.useFBO((r||d.width)*m.dpr,(t||d.height)*m.dpr,{samples:8}),[b]=l.useState((()=>new s.Scene)),v=l.useCallback(((e,r,t)=>{var n,a;let u=null==(n=p.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[c]=t.raycaster.intersectObject(u);if(!c)return!1;const i=c.uv;r.raycaster.setFromCamera(r.pointer.set(2*i.x-1,2*i.y-1),r.camera)}),[]);return l.createElement(l.Fragment,null,n.createPortal(l.createElement(o,{frames:c,fbo:p},e),b,{events:{compute:v,priority:u}}),l.createElement("primitive",i.default({object:p.texture},f)))};
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),o=i(r),s=i(t);const l=s.forwardRef((({children:e,width:r,height:t,renderPriority:u=0,eventPriority:i=0,frames:l=1/0,...d},m)=>{const{size:p,viewport:b}=n.useThree(),v=a.useFBO((r||p.width)*b.dpr,(t||p.height)*b.dpr,{samples:8}),[y]=s.useState((()=>new o.Scene)),g=s.useCallback(((e,r,t)=>{var n,a;let u=null==(n=v.texture)?void 0:n.__r3f.parent;for(;u&&!(u instanceof o.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;r.raycaster.setFromCamera(r.pointer.set(2*c.x-1,2*c.y-1),r.camera)}),[]);return s.useImperativeHandle(m,(()=>v.texture),[v]),s.createElement(s.Fragment,null,n.createPortal(s.createElement(f,{renderPriority:u,frames:l,fbo:v},e),y,{events:{compute:g,priority:i}}),s.createElement("primitive",c.default({object:v.texture},d)))}));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),s.createElement(s.Fragment,null,t)}exports.RenderTexture=l;
@@ -1,9 +1,10 @@
1
- /// <reference types="react" />
2
- export declare function RenderTexture({ children, width, height, priority, frames, ...props }: {
3
- [x: string]: any;
4
- children: any;
5
- width: any;
6
- height: any;
7
- priority?: number | undefined;
1
+ import * as THREE from 'three';
2
+ import * as React from 'react';
3
+ export declare const RenderTexture: React.ForwardRefExoticComponent<THREE.Texture & {
4
+ width?: number | undefined;
5
+ height?: number | undefined;
6
+ renderPriority?: number | undefined;
7
+ eventPriority?: number | undefined;
8
8
  frames?: number | undefined;
9
- }): JSX.Element;
9
+ children: React.ReactNode;
10
+ } & React.RefAttributes<unknown>>;
@@ -4,14 +4,15 @@ import * as React from 'react';
4
4
  import { useThree, createPortal, useFrame } from '@react-three/fiber';
5
5
  import { useFBO } from './useFBO.js';
6
6
 
7
- function RenderTexture({
7
+ const RenderTexture = /*#__PURE__*/React.forwardRef(({
8
8
  children,
9
9
  width,
10
10
  height,
11
- priority = 0,
11
+ renderPriority = 0,
12
+ eventPriority = 0,
12
13
  frames = Infinity,
13
14
  ...props
14
- }) {
15
+ }, forwardRef) => {
15
16
  const {
16
17
  size,
17
18
  viewport
@@ -32,28 +33,36 @@ function RenderTexture({
32
33
  parent = parent.__r3f.parent;
33
34
  }
34
35
 
35
- if (!parent) return false;
36
- if (!previous.raycaster.camera) previous.events.compute(event, previous, (_previous$previousRoo = previous.previousRoot) == null ? void 0 : _previous$previousRoo.getState());
36
+ if (!parent) return false; // First we call the previous state-onion-layers compute, this is what makes it possible to nest portals
37
+
38
+ if (!previous.raycaster.camera) previous.events.compute(event, previous, (_previous$previousRoo = previous.previousRoot) == null ? void 0 : _previous$previousRoo.getState()); // We run a quick check against the parent, if it isn't hit there's no need to raycast at all
39
+
37
40
  const [intersection] = previous.raycaster.intersectObject(parent);
38
- if (!intersection) return false;
41
+ if (!intersection) return false; // We take that hits uv coords, set up this layers raycaster, et voilà, we have raycasting on arbitrary surfaces
42
+
39
43
  const uv = intersection.uv;
40
44
  state.raycaster.setFromCamera(state.pointer.set(uv.x * 2 - 1, uv.y * 2 - 1), state.camera);
41
45
  }, []);
46
+ React.useImperativeHandle(forwardRef, () => fbo.texture, [fbo]);
42
47
  return /*#__PURE__*/React.createElement(React.Fragment, null, createPortal( /*#__PURE__*/React.createElement(Container, {
48
+ renderPriority: renderPriority,
43
49
  frames: frames,
44
50
  fbo: fbo
45
51
  }, children), vScene, {
46
52
  events: {
47
53
  compute,
48
- priority
54
+ priority: eventPriority
49
55
  }
50
56
  }), /*#__PURE__*/React.createElement("primitive", _extends({
51
57
  object: fbo.texture
52
58
  }, props)));
53
- }
59
+ }); // The container component has to be separate, it can not be inlined because "useFrame(state" when run inside createPortal will return
60
+ // the portals own state which includes user-land overrides (custom cameras etc), but if it is executed in <RenderTexture>'s render function
61
+ // it would return the default state.
54
62
 
55
63
  function Container({
56
64
  frames,
65
+ renderPriority,
57
66
  children,
58
67
  fbo
59
68
  }) {
@@ -65,7 +74,7 @@ function Container({
65
74
  state.gl.setRenderTarget(null);
66
75
  count++;
67
76
  }
68
- });
77
+ }, renderPriority);
69
78
  return /*#__PURE__*/React.createElement(React.Fragment, null, children);
70
79
  }
71
80
 
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),o=require("@react-three/fiber"),i=require("./shaderMaterial.cjs.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function n(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("nanoid");var s=a(e),l=n(t),c=n(r);const u=i.shaderMaterial({time:0,pixelRatio:1},"#define GLSLIFY 1\nuniform float pixelRatio;uniform float time;attribute float size;attribute float speed;attribute float opacity;attribute vec3 noise;attribute vec3 color;varying vec3 vColor;varying float vOpacity;void main(){vec4 modelPosition=modelMatrix*vec4(position,1.0);modelPosition.y+=sin(time*speed+modelPosition.x*noise.x*100.0)*0.2;modelPosition.z+=cos(time*speed+modelPosition.x*noise.y*100.0)*0.2;modelPosition.x+=cos(time*speed+modelPosition.x*noise.z*100.0)*0.2;vec4 viewPosition=viewMatrix*modelPosition;vec4 projectionPostion=projectionMatrix*viewPosition;gl_Position=projectionPostion;gl_PointSize=size*25.*pixelRatio;gl_PointSize*=(1.0/-viewPosition.z);vColor=color;vOpacity=opacity;}","#define GLSLIFY 1\nvarying vec3 vColor;varying float vOpacity;void main(){float distanceToCenter=distance(gl_PointCoord,vec2(0.5));float strength=0.05/distanceToCenter-0.1;gl_FragColor=vec4(vColor,strength*vOpacity);}"),f=e=>e&&e.constructor===Float32Array,m=e=>e instanceof c.Vector2||e instanceof c.Vector3||e instanceof c.Vector4,d=e=>Array.isArray(e)?e:m(e)?e.toArray():[e,e,e];function p(e,t,r){return l.useMemo((()=>{if(void 0!==t){if(f(t))return t;if(t instanceof c.Color){const r=Array.from({length:3*e},(()=>{return[(e=t).r,e.g,e.b];var e})).flat();return Float32Array.from(r)}if(m(t)||Array.isArray(t)){const r=Array.from({length:3*e},(()=>d(t))).flat();return Float32Array.from(r)}return Float32Array.from({length:e},(()=>t))}return Float32Array.from({length:e},r)}),[t])}const v=l.forwardRef((({noise:e=1,count:t=100,speed:r=1,opacity:i=1,scale:a=1,size:n,color:m,...v},b)=>{l.useMemo((()=>o.extend({SparklesMaterial:u})),[]);const y=l.useRef(),g=o.useThree((e=>e.viewport.dpr)),h=l.useMemo((()=>Float32Array.from(Array.from({length:t},(()=>d(a).map(c.MathUtils.randFloatSpread))).flat())),[t,a]),A=p(t,n,Math.random),P=p(t,i),x=p(t,r),M=p(3*t,e),j=p(void 0===m?3*t:t,f(m)?m:new c.Color(m),(()=>1));return o.useFrame((e=>y.current.uniforms.time.value=e.clock.elapsedTime)),l.createElement("points",s.default({key:`particle-${t}-${JSON.stringify(a)}`},v,{ref:b}),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attach:"attributes-position",args:[h,3]}),l.createElement("bufferAttribute",{attach:"attributes-size",args:[A,1]}),l.createElement("bufferAttribute",{attach:"attributes-opacity",args:[P,1]}),l.createElement("bufferAttribute",{attach:"attributes-speed",args:[x,1]}),l.createElement("bufferAttribute",{attach:"attributes-color",args:[j,3]}),l.createElement("bufferAttribute",{attach:"attributes-noise",args:[M,3]})),l.createElement("sparklesMaterial",{ref:y,transparent:!0,pixelRatio:g,depthWrite:!1}))}));exports.Sparkles=v;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),o=require("@react-three/fiber"),i=require("./shaderMaterial.cjs.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function n(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=a(e),l=n(t),c=n(r);const u=i.shaderMaterial({time:0,pixelRatio:1},"#define GLSLIFY 1\nuniform float pixelRatio;uniform float time;attribute float size;attribute float speed;attribute float opacity;attribute vec3 noise;attribute vec3 color;varying vec3 vColor;varying float vOpacity;void main(){vec4 modelPosition=modelMatrix*vec4(position,1.0);modelPosition.y+=sin(time*speed+modelPosition.x*noise.x*100.0)*0.2;modelPosition.z+=cos(time*speed+modelPosition.x*noise.y*100.0)*0.2;modelPosition.x+=cos(time*speed+modelPosition.x*noise.z*100.0)*0.2;vec4 viewPosition=viewMatrix*modelPosition;vec4 projectionPostion=projectionMatrix*viewPosition;gl_Position=projectionPostion;gl_PointSize=size*25.*pixelRatio;gl_PointSize*=(1.0/-viewPosition.z);vColor=color;vOpacity=opacity;}","#define GLSLIFY 1\nvarying vec3 vColor;varying float vOpacity;void main(){float distanceToCenter=distance(gl_PointCoord,vec2(0.5));float strength=0.05/distanceToCenter-0.1;gl_FragColor=vec4(vColor,strength*vOpacity);}"),f=e=>e&&e.constructor===Float32Array,m=e=>e instanceof c.Vector2||e instanceof c.Vector3||e instanceof c.Vector4,d=e=>Array.isArray(e)?e:m(e)?e.toArray():[e,e,e];function p(e,t,r){return l.useMemo((()=>{if(void 0!==t){if(f(t))return t;if(t instanceof c.Color){const r=Array.from({length:3*e},(()=>{return[(e=t).r,e.g,e.b];var e})).flat();return Float32Array.from(r)}if(m(t)||Array.isArray(t)){const r=Array.from({length:3*e},(()=>d(t))).flat();return Float32Array.from(r)}return Float32Array.from({length:e},(()=>t))}return Float32Array.from({length:e},r)}),[t])}const v=l.forwardRef((({noise:e=1,count:t=100,speed:r=1,opacity:i=1,scale:a=1,size:n,color:m,...v},b)=>{l.useMemo((()=>o.extend({SparklesMaterial:u})),[]);const y=l.useRef(),g=o.useThree((e=>e.viewport.dpr)),h=l.useMemo((()=>Float32Array.from(Array.from({length:t},(()=>d(a).map(c.MathUtils.randFloatSpread))).flat())),[t,a]),A=p(t,n,Math.random),P=p(t,i),x=p(t,r),M=p(3*t,e),j=p(void 0===m?3*t:t,f(m)?m:new c.Color(m),(()=>1));return o.useFrame((e=>y.current.uniforms.time.value=e.clock.elapsedTime)),l.createElement("points",s.default({key:`particle-${t}-${JSON.stringify(a)}`},v,{ref:b}),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attach:"attributes-position",args:[h,3]}),l.createElement("bufferAttribute",{attach:"attributes-size",args:[A,1]}),l.createElement("bufferAttribute",{attach:"attributes-opacity",args:[P,1]}),l.createElement("bufferAttribute",{attach:"attributes-speed",args:[x,1]}),l.createElement("bufferAttribute",{attach:"attributes-color",args:[j,3]}),l.createElement("bufferAttribute",{attach:"attributes-noise",args:[M,3]})),l.createElement("sparklesMaterial",{ref:y,transparent:!0,pixelRatio:g,depthWrite:!1}))}));exports.Sparkles=v;
@@ -0,0 +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"),o=require("three-stdlib");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 u=a(e),f=s(t);const l=["string","number"],c=f.forwardRef((({font:e,loader:n,size:a=1,height:s=.2,bevelThickness:u=.1,bevelSize:c=.01,bevelEnabled:i=!1,bevelOffset:d=0,curveSegments:b=8,children:m},v)=>{f.useMemo((()=>{r.extend({RenamedTextGeometry:o.TextGeometry})}),[]);const h=f.useMemo((()=>n.parse(e)),[e]),p=t.useMemo((()=>({font:h,size:a,height:s,bevelThickness:u,bevelSize:c,bevelEnabled:i,bevelOffset:d,curveSegments:b})),[h,a,s,u,c,i,d,b]),y=t.useMemo((()=>(e=>{let t="";return f.Children.map(e,(e=>{l.includes(typeof e)&&(t+=e+"")})),t})(m)),[m]),g=f.useMemo((()=>[y,p]),[y,p]);return f.createElement("mesh",{ref:v},f.createElement("renamedTextGeometry",{args:g}),m)})),i=f.forwardRef((({font:e,loader:t,...r},o)=>{const a=n.suspend((async()=>await(await fetch(e)).json()),[e]);return f.createElement(c,u.default({ref:o},r,{font:a,loader:t}))})),d=f.forwardRef(((e,t)=>{const r=f.useMemo((()=>new o.FontLoader),[]);return"string"==typeof e.font?f.createElement(i,u.default({ref:t},e,{loader:r})):f.createElement(c,u.default({ref:t},e,{loader:r}))}));exports.Text3D=d;
@@ -0,0 +1,34 @@
1
+ import * as React from 'react';
2
+ import * as THREE from 'three';
3
+ import { Node } from '@react-three/fiber';
4
+ import { TextGeometryParameters } from 'three-stdlib';
5
+ declare global {
6
+ namespace JSX {
7
+ interface IntrinsicElements {
8
+ renamedTextGeometry: Node<any, any>;
9
+ }
10
+ }
11
+ }
12
+ declare type Glyph = {
13
+ _cachedOutline: string[];
14
+ ha: number;
15
+ o: string;
16
+ };
17
+ declare type FontData = {
18
+ boundingBox: {
19
+ yMax: number;
20
+ yMin: number;
21
+ };
22
+ familyName: string;
23
+ glyphs: {
24
+ [k: string]: Glyph;
25
+ };
26
+ resolution: number;
27
+ underlineThickness: number;
28
+ };
29
+ export declare const Text3D: React.ForwardRefExoticComponent<{
30
+ font: FontData | string;
31
+ } & Omit<TextGeometryParameters, "font"> & {
32
+ children?: React.ReactNode;
33
+ } & React.RefAttributes<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
34
+ export {};
package/core/Text3D.js ADDED
@@ -0,0 +1,100 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as React from 'react';
3
+ import { useMemo } from 'react';
4
+ import { extend } from '@react-three/fiber';
5
+ import { suspend } from 'suspend-react';
6
+ import { FontLoader, TextGeometry } from 'three-stdlib';
7
+
8
+ const types = ['string', 'number'];
9
+
10
+ const getTextFromChildren = children => {
11
+ let label = '';
12
+ React.Children.map(children, child => {
13
+ if (types.includes(typeof child)) {
14
+ label += child + '';
15
+ }
16
+ });
17
+ return label;
18
+ };
19
+
20
+ const Text3DBase = /*#__PURE__*/React.forwardRef(({
21
+ font,
22
+ loader,
23
+ size = 1,
24
+ height = 0.2,
25
+ bevelThickness = 0.1,
26
+ bevelSize = 0.01,
27
+ bevelEnabled = false,
28
+ bevelOffset = 0,
29
+ curveSegments = 8,
30
+ children
31
+ }, ref) => {
32
+ React.useMemo(() => {
33
+ extend({
34
+ RenamedTextGeometry: TextGeometry
35
+ });
36
+ }, []);
37
+
38
+ const _font = React.useMemo(() => loader.parse(font), [font]);
39
+
40
+ const opts = useMemo(() => {
41
+ return {
42
+ font: _font,
43
+ size,
44
+ height,
45
+ bevelThickness,
46
+ bevelSize,
47
+ bevelEnabled,
48
+ bevelOffset,
49
+ curveSegments
50
+ };
51
+ }, [_font, size, height, bevelThickness, bevelSize, bevelEnabled, bevelOffset, curveSegments]);
52
+ /**
53
+ * We need the `children` in the deps because we
54
+ * need to be able to do `<Text3d>{state}</Text3d>`.
55
+ */
56
+
57
+ const txt = useMemo(() => getTextFromChildren(children), [children]);
58
+ const args = React.useMemo(() => [txt, opts], [txt, opts]);
59
+ return /*#__PURE__*/React.createElement("mesh", {
60
+ ref: ref
61
+ }, /*#__PURE__*/React.createElement("renamedTextGeometry", {
62
+ args: args
63
+ }), children);
64
+ });
65
+ const Text3DSuspend = /*#__PURE__*/React.forwardRef(({
66
+ font,
67
+ loader,
68
+ ...props
69
+ }, ref) => {
70
+ const _font = suspend(async () => {
71
+ const json = await (await fetch(font)).json();
72
+ return json;
73
+ }, [font]);
74
+
75
+ return /*#__PURE__*/React.createElement(Text3DBase, _extends({
76
+ ref: ref
77
+ }, props, {
78
+ font: _font,
79
+ loader: loader
80
+ }));
81
+ });
82
+ const Text3D = /*#__PURE__*/React.forwardRef((props, ref) => {
83
+ const loader = React.useMemo(() => new FontLoader(), []);
84
+
85
+ if (typeof props.font === 'string') {
86
+ return /*#__PURE__*/React.createElement(Text3DSuspend, _extends({
87
+ ref: ref
88
+ }, props, {
89
+ loader: loader
90
+ }));
91
+ } else {
92
+ return /*#__PURE__*/React.createElement(Text3DBase, _extends({
93
+ ref: ref
94
+ }, props, {
95
+ loader: loader
96
+ }));
97
+ }
98
+ });
99
+
100
+ export { Text3D };
package/core/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./Billboard.cjs.js"),r=require("./QuadraticBezierLine.cjs.js"),s=require("./CubicBezierLine.cjs.js"),t=require("./Line.cjs.js"),o=require("./PositionalAudio.cjs.js"),i=require("./Text.cjs.js"),u=require("./Effects.cjs.js"),a=require("./GradientTexture.cjs.js"),n=require("./Image.cjs.js"),j=require("./Edges.cjs.js"),p=require("./Trail.cjs.js"),c=require("./Sampler.cjs.js"),x=require("./ComputedAttribute.cjs.js"),l=require("./Clone.cjs.js"),q=require("./OrthographicCamera.cjs.js"),d=require("./PerspectiveCamera.cjs.js"),m=require("./CubeCamera.cjs.js"),C=require("./DeviceOrientationControls.cjs.js"),h=require("./FlyControls.cjs.js"),b=require("./MapControls.cjs.js"),S=require("./OrbitControls.cjs.js"),B=require("./TrackballControls.cjs.js"),P=require("./ArcballControls.cjs.js"),T=require("./TransformControls.cjs.js"),M=require("./PointerLockControls.cjs.js"),f=require("./FirstPersonControls.cjs.js"),g=require("./GizmoHelper.cjs.js"),v=require("./GizmoViewcube.cjs.js"),E=require("./GizmoViewport.cjs.js"),L=require("./useCubeTexture.cjs.js"),A=require("./useFBX.cjs.js"),k=require("./useGLTF.cjs.js"),G=require("./useProgress.cjs.js"),D=require("./useTexture.cjs.js"),F=require("./useKTX2.cjs.js"),O=require("./Stats.cjs.js"),w=require("./useDepthBuffer.cjs.js"),z=require("./useAspect.cjs.js"),I=require("./useCamera.cjs.js"),R=require("./useDetectGPU.cjs.js"),y=require("./useHelper.cjs.js"),H=require("./useBVH.cjs.js"),V=require("./useContextBridge.cjs.js"),Q=require("./useAnimations.cjs.js"),X=require("./useFBO.cjs.js"),K=require("./useIntersect.cjs.js"),W=require("./useBoxProjectedEnv.cjs.js"),N=require("./CurveModifier.cjs.js"),U=require("./MeshDistortMaterial.cjs.js"),_=require("./MeshWobbleMaterial.cjs.js"),J=require("./MeshReflectorMaterial.cjs.js"),Y=require("./PointMaterial.cjs.js"),Z=require("./shaderMaterial.cjs.js"),$=require("./softShadows.cjs.js"),ee=require("./shapes.cjs.js"),re=require("./RoundedBox.cjs.js"),se=require("./ScreenQuad.cjs.js"),te=require("./Center.cjs.js"),oe=require("./Bounds.cjs.js"),ie=require("./CameraShake.cjs.js"),ue=require("./Float.cjs.js"),ae=require("./Stage.cjs.js"),ne=require("./Backdrop.cjs.js"),je=require("./Shadow.cjs.js"),pe=require("./ContactShadows.cjs.js"),ce=require("./Reflector.cjs.js"),xe=require("./SpotLight.cjs.js"),le=require("./Environment.cjs.js"),qe=require("./Lightformer.cjs.js"),de=require("./Sky.cjs.js"),me=require("./Stars.cjs.js"),Ce=require("./Cloud.cjs.js"),he=require("./Sparkles.cjs.js"),be=require("./useMatcapTexture.cjs.js"),Se=require("./useNormalTexture.cjs.js"),Be=require("./Points.cjs.js"),Pe=require("./Instances.cjs.js"),Te=require("./Segments.cjs.js"),Me=require("./Detailed.cjs.js"),fe=require("./Preload.cjs.js"),ge=require("./BakeShadows.cjs.js"),ve=require("./meshBounds.cjs.js"),Ee=require("./AdaptiveDpr.cjs.js"),Le=require("./AdaptiveEvents.cjs.js"),Ae=require("./RenderTexture.cjs.js");require("@babel/runtime/helpers/extends"),require("react"),require("@react-three/fiber"),require("react-merge-refs"),require("three"),require("three-stdlib"),require("troika-three-text"),require("suspend-react"),require("nanoid"),require("meshline"),require("lodash.pick"),require("lodash.omit"),require("zustand"),require("stats.js"),require("../helpers/useEffectfulState.cjs.js"),require("detect-gpu"),require("three-mesh-bvh"),require("../materials/BlurPass.cjs.js"),require("../materials/ConvolutionMaterial.cjs.js"),require("../materials/MeshReflectorMaterial.cjs.js"),require("../helpers/environment-assets.cjs.js"),require("../materials/SpotLightMaterial.cjs.js"),require("../helpers/Position.cjs.js"),require("react-composer"),exports.Billboard=e.Billboard,exports.QuadraticBezierLine=r.QuadraticBezierLine,exports.CubicBezierLine=s.CubicBezierLine,exports.Line=t.Line,exports.PositionalAudio=o.PositionalAudio,exports.Text=i.Text,exports.Effects=u.Effects,exports.isWebGL2Available=u.isWebGL2Available,exports.GradientTexture=a.GradientTexture,exports.Image=n.Image,exports.Edges=j.Edges,exports.Trail=p.Trail,exports.useTrail=p.useTrail,exports.Sampler=c.Sampler,exports.ComputedAttribute=x.ComputedAttribute,exports.Clone=l.Clone,exports.OrthographicCamera=q.OrthographicCamera,exports.PerspectiveCamera=d.PerspectiveCamera,exports.CubeCamera=m.CubeCamera,exports.DeviceOrientationControls=C.DeviceOrientationControls,exports.FlyControls=h.FlyControls,exports.MapControls=b.MapControls,exports.OrbitControls=S.OrbitControls,exports.TrackballControls=B.TrackballControls,exports.ArcballControls=P.ArcballControls,exports.TransformControls=T.TransformControls,exports.PointerLockControls=M.PointerLockControls,exports.FirstPersonControls=f.FirstPersonControls,exports.GizmoHelper=g.GizmoHelper,exports.useGizmoContext=g.useGizmoContext,exports.GizmoViewcube=v.GizmoViewcube,exports.GizmoViewport=E.GizmoViewport,exports.useCubeTexture=L.useCubeTexture,exports.useFBX=A.useFBX,exports.useGLTF=k.useGLTF,exports.useProgress=G.useProgress,exports.IsObject=D.IsObject,exports.useTexture=D.useTexture,exports.useKTX2=F.useKTX2,exports.Stats=O.Stats,exports.useDepthBuffer=w.useDepthBuffer,exports.useAspect=z.useAspect,exports.useCamera=I.useCamera,exports.useDetectGPU=R.useDetectGPU,exports.useHelper=y.useHelper,exports.useBVH=H.useBVH,exports.useContextBridge=V.useContextBridge,exports.useAnimations=Q.useAnimations,exports.useFBO=X.useFBO,exports.useIntersect=K.useIntersect,exports.useBoxProjectedEnv=W.useBoxProjectedEnv,exports.CurveModifier=N.CurveModifier,exports.MeshDistortMaterial=U.MeshDistortMaterial,exports.MeshWobbleMaterial=_.MeshWobbleMaterial,exports.MeshReflectorMaterial=J.MeshReflectorMaterial,exports.PointMaterial=Y.PointMaterial,exports.PointMaterialImpl=Y.PointMaterialImpl,exports.shaderMaterial=Z.shaderMaterial,exports.softShadows=$.softShadows,exports.Box=ee.Box,exports.Circle=ee.Circle,exports.Cone=ee.Cone,exports.Cylinder=ee.Cylinder,exports.Dodecahedron=ee.Dodecahedron,exports.Extrude=ee.Extrude,exports.Icosahedron=ee.Icosahedron,exports.Lathe=ee.Lathe,exports.Octahedron=ee.Octahedron,exports.Plane=ee.Plane,exports.Polyhedron=ee.Polyhedron,exports.Ring=ee.Ring,exports.Sphere=ee.Sphere,exports.Tetrahedron=ee.Tetrahedron,exports.Torus=ee.Torus,exports.TorusKnot=ee.TorusKnot,exports.Tube=ee.Tube,exports.RoundedBox=re.RoundedBox,exports.ScreenQuad=se.ScreenQuad,exports.Center=te.Center,exports.Bounds=oe.Bounds,exports.useBounds=oe.useBounds,exports.CameraShake=ie.CameraShake,exports.Float=ue.Float,exports.Stage=ae.Stage,exports.Backdrop=ne.Backdrop,exports.Shadow=je.Shadow,exports.ContactShadows=pe.ContactShadows,exports.Reflector=ce.Reflector,exports.SpotLight=xe.SpotLight,exports.Environment=le.Environment,exports.EnvironmentCube=le.EnvironmentCube,exports.EnvironmentMap=le.EnvironmentMap,exports.EnvironmentPortal=le.EnvironmentPortal,exports.useEnvironment=le.useEnvironment,exports.Lightformer=qe.Lightformer,exports.Sky=de.Sky,exports.calcPosFromAngles=de.calcPosFromAngles,exports.Stars=me.Stars,exports.Cloud=Ce.Cloud,exports.Sparkles=he.Sparkles,exports.useMatcapTexture=be.useMatcapTexture,exports.useNormalTexture=Se.useNormalTexture,exports.Point=Be.Point,exports.Points=Be.Points,exports.PointsBuffer=Be.PointsBuffer,exports.Instance=Pe.Instance,exports.Instances=Pe.Instances,exports.Merged=Pe.Merged,exports.Segment=Te.Segment,exports.SegmentObject=Te.SegmentObject,exports.Segments=Te.Segments,exports.Detailed=Me.Detailed,exports.Preload=fe.Preload,exports.BakeShadows=ge.BakeShadows,exports.meshBounds=ve.meshBounds,exports.AdaptiveDpr=Ee.AdaptiveDpr,exports.AdaptiveEvents=Le.AdaptiveEvents,exports.RenderTexture=Ae.RenderTexture;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./Billboard.cjs.js"),r=require("./QuadraticBezierLine.cjs.js"),s=require("./CubicBezierLine.cjs.js"),t=require("./Line.cjs.js"),o=require("./PositionalAudio.cjs.js"),i=require("./Text.cjs.js"),u=require("./Text3D.cjs.js"),a=require("./Effects.cjs.js"),n=require("./GradientTexture.cjs.js"),j=require("./Image.cjs.js"),p=require("./Edges.cjs.js"),c=require("./Trail.cjs.js"),x=require("./Sampler.cjs.js"),l=require("./ComputedAttribute.cjs.js"),q=require("./Clone.cjs.js"),d=require("./OrthographicCamera.cjs.js"),m=require("./PerspectiveCamera.cjs.js"),C=require("./CubeCamera.cjs.js"),h=require("./DeviceOrientationControls.cjs.js"),b=require("./FlyControls.cjs.js"),S=require("./MapControls.cjs.js"),B=require("./OrbitControls.cjs.js"),T=require("./TrackballControls.cjs.js"),P=require("./ArcballControls.cjs.js"),M=require("./TransformControls.cjs.js"),f=require("./PointerLockControls.cjs.js"),g=require("./FirstPersonControls.cjs.js"),v=require("./GizmoHelper.cjs.js"),E=require("./GizmoViewcube.cjs.js"),L=require("./GizmoViewport.cjs.js"),A=require("./useCubeTexture.cjs.js"),k=require("./useFBX.cjs.js"),D=require("./useGLTF.cjs.js"),G=require("./useProgress.cjs.js"),F=require("./useTexture.cjs.js"),O=require("./useKTX2.cjs.js"),w=require("./Stats.cjs.js"),z=require("./useDepthBuffer.cjs.js"),I=require("./useAspect.cjs.js"),R=require("./useCamera.cjs.js"),y=require("./useDetectGPU.cjs.js"),H=require("./useHelper.cjs.js"),V=require("./useBVH.cjs.js"),Q=require("./useContextBridge.cjs.js"),X=require("./useAnimations.cjs.js"),K=require("./useFBO.cjs.js"),W=require("./useIntersect.cjs.js"),N=require("./useBoxProjectedEnv.cjs.js"),U=require("./CurveModifier.cjs.js"),_=require("./MeshDistortMaterial.cjs.js"),J=require("./MeshWobbleMaterial.cjs.js"),Y=require("./MeshReflectorMaterial.cjs.js"),Z=require("./PointMaterial.cjs.js"),$=require("./shaderMaterial.cjs.js"),ee=require("./softShadows.cjs.js"),re=require("./shapes.cjs.js"),se=require("./RoundedBox.cjs.js"),te=require("./ScreenQuad.cjs.js"),oe=require("./Center.cjs.js"),ie=require("./Bounds.cjs.js"),ue=require("./CameraShake.cjs.js"),ae=require("./Float.cjs.js"),ne=require("./Stage.cjs.js"),je=require("./Backdrop.cjs.js"),pe=require("./Shadow.cjs.js"),ce=require("./ContactShadows.cjs.js"),xe=require("./Reflector.cjs.js"),le=require("./SpotLight.cjs.js"),qe=require("./Environment.cjs.js"),de=require("./Lightformer.cjs.js"),me=require("./Sky.cjs.js"),Ce=require("./Stars.cjs.js"),he=require("./Cloud.cjs.js"),be=require("./Sparkles.cjs.js"),Se=require("./useMatcapTexture.cjs.js"),Be=require("./useNormalTexture.cjs.js"),Te=require("./Points.cjs.js"),Pe=require("./Instances.cjs.js"),Me=require("./Segments.cjs.js"),fe=require("./Detailed.cjs.js"),ge=require("./Preload.cjs.js"),ve=require("./BakeShadows.cjs.js"),Ee=require("./meshBounds.cjs.js"),Le=require("./AdaptiveDpr.cjs.js"),Ae=require("./AdaptiveEvents.cjs.js"),ke=require("./RenderTexture.cjs.js");require("@babel/runtime/helpers/extends"),require("react"),require("@react-three/fiber"),require("react-merge-refs"),require("three"),require("three-stdlib"),require("troika-three-text"),require("suspend-react"),require("meshline"),require("lodash.pick"),require("lodash.omit"),require("zustand"),require("stats.js"),require("../helpers/useEffectfulState.cjs.js"),require("detect-gpu"),require("three-mesh-bvh"),require("../materials/BlurPass.cjs.js"),require("../materials/ConvolutionMaterial.cjs.js"),require("../materials/MeshReflectorMaterial.cjs.js"),require("../helpers/environment-assets.cjs.js"),require("../materials/SpotLightMaterial.cjs.js"),require("../helpers/Position.cjs.js"),require("react-composer"),exports.Billboard=e.Billboard,exports.QuadraticBezierLine=r.QuadraticBezierLine,exports.CubicBezierLine=s.CubicBezierLine,exports.Line=t.Line,exports.PositionalAudio=o.PositionalAudio,exports.Text=i.Text,exports.Text3D=u.Text3D,exports.Effects=a.Effects,exports.isWebGL2Available=a.isWebGL2Available,exports.GradientTexture=n.GradientTexture,exports.Image=j.Image,exports.Edges=p.Edges,exports.Trail=c.Trail,exports.useTrail=c.useTrail,exports.Sampler=x.Sampler,exports.ComputedAttribute=l.ComputedAttribute,exports.Clone=q.Clone,exports.OrthographicCamera=d.OrthographicCamera,exports.PerspectiveCamera=m.PerspectiveCamera,exports.CubeCamera=C.CubeCamera,exports.DeviceOrientationControls=h.DeviceOrientationControls,exports.FlyControls=b.FlyControls,exports.MapControls=S.MapControls,exports.OrbitControls=B.OrbitControls,exports.TrackballControls=T.TrackballControls,exports.ArcballControls=P.ArcballControls,exports.TransformControls=M.TransformControls,exports.PointerLockControls=f.PointerLockControls,exports.FirstPersonControls=g.FirstPersonControls,exports.GizmoHelper=v.GizmoHelper,exports.useGizmoContext=v.useGizmoContext,exports.GizmoViewcube=E.GizmoViewcube,exports.GizmoViewport=L.GizmoViewport,exports.useCubeTexture=A.useCubeTexture,exports.useFBX=k.useFBX,exports.useGLTF=D.useGLTF,exports.useProgress=G.useProgress,exports.IsObject=F.IsObject,exports.useTexture=F.useTexture,exports.useKTX2=O.useKTX2,exports.Stats=w.Stats,exports.useDepthBuffer=z.useDepthBuffer,exports.useAspect=I.useAspect,exports.useCamera=R.useCamera,exports.useDetectGPU=y.useDetectGPU,exports.useHelper=H.useHelper,exports.useBVH=V.useBVH,exports.useContextBridge=Q.useContextBridge,exports.useAnimations=X.useAnimations,exports.useFBO=K.useFBO,exports.useIntersect=W.useIntersect,exports.useBoxProjectedEnv=N.useBoxProjectedEnv,exports.CurveModifier=U.CurveModifier,exports.MeshDistortMaterial=_.MeshDistortMaterial,exports.MeshWobbleMaterial=J.MeshWobbleMaterial,exports.MeshReflectorMaterial=Y.MeshReflectorMaterial,exports.PointMaterial=Z.PointMaterial,exports.PointMaterialImpl=Z.PointMaterialImpl,exports.shaderMaterial=$.shaderMaterial,exports.softShadows=ee.softShadows,exports.Box=re.Box,exports.Circle=re.Circle,exports.Cone=re.Cone,exports.Cylinder=re.Cylinder,exports.Dodecahedron=re.Dodecahedron,exports.Extrude=re.Extrude,exports.Icosahedron=re.Icosahedron,exports.Lathe=re.Lathe,exports.Octahedron=re.Octahedron,exports.Plane=re.Plane,exports.Polyhedron=re.Polyhedron,exports.Ring=re.Ring,exports.Sphere=re.Sphere,exports.Tetrahedron=re.Tetrahedron,exports.Torus=re.Torus,exports.TorusKnot=re.TorusKnot,exports.Tube=re.Tube,exports.RoundedBox=se.RoundedBox,exports.ScreenQuad=te.ScreenQuad,exports.Center=oe.Center,exports.Bounds=ie.Bounds,exports.useBounds=ie.useBounds,exports.CameraShake=ue.CameraShake,exports.Float=ae.Float,exports.Stage=ne.Stage,exports.Backdrop=je.Backdrop,exports.Shadow=pe.Shadow,exports.ContactShadows=ce.ContactShadows,exports.Reflector=xe.Reflector,exports.SpotLight=le.SpotLight,exports.Environment=qe.Environment,exports.EnvironmentCube=qe.EnvironmentCube,exports.EnvironmentMap=qe.EnvironmentMap,exports.EnvironmentPortal=qe.EnvironmentPortal,exports.useEnvironment=qe.useEnvironment,exports.Lightformer=de.Lightformer,exports.Sky=me.Sky,exports.calcPosFromAngles=me.calcPosFromAngles,exports.Stars=Ce.Stars,exports.Cloud=he.Cloud,exports.Sparkles=be.Sparkles,exports.useMatcapTexture=Se.useMatcapTexture,exports.useNormalTexture=Be.useNormalTexture,exports.Point=Te.Point,exports.Points=Te.Points,exports.PointsBuffer=Te.PointsBuffer,exports.Instance=Pe.Instance,exports.Instances=Pe.Instances,exports.Merged=Pe.Merged,exports.Segment=Me.Segment,exports.SegmentObject=Me.SegmentObject,exports.Segments=Me.Segments,exports.Detailed=fe.Detailed,exports.Preload=ge.Preload,exports.BakeShadows=ve.BakeShadows,exports.meshBounds=Ee.meshBounds,exports.AdaptiveDpr=Le.AdaptiveDpr,exports.AdaptiveEvents=Ae.AdaptiveEvents,exports.RenderTexture=ke.RenderTexture;
package/core/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export * from './CubicBezierLine';
4
4
  export * from './Line';
5
5
  export * from './PositionalAudio';
6
6
  export * from './Text';
7
+ export * from './Text3D';
7
8
  export * from './Effects';
8
9
  export * from './GradientTexture';
9
10
  export * from './Image';
package/core/index.js CHANGED
@@ -4,6 +4,7 @@ export { CubicBezierLine } from './CubicBezierLine.js';
4
4
  export { Line } from './Line.js';
5
5
  export { PositionalAudio } from './PositionalAudio.js';
6
6
  export { Text } from './Text.js';
7
+ export { Text3D } from './Text3D.js';
7
8
  export { Effects, isWebGL2Available } from './Effects.js';
8
9
  export { GradientTexture } from './GradientTexture.js';
9
10
  export { Image } from './Image.js';
@@ -91,7 +92,6 @@ import 'three';
91
92
  import 'three-stdlib';
92
93
  import 'troika-three-text';
93
94
  import 'suspend-react';
94
- import 'nanoid';
95
95
  import 'meshline';
96
96
  import 'lodash.pick';
97
97
  import 'lodash.omit';
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("nanoid");function t(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 n=t(e);exports.shaderMaterial=function(e,t,i,s){const u=class extends n.ShaderMaterial{constructor(){const r=Object.entries(e);super({uniforms:r.reduce(((e,[r,t])=>({...e,...n.UniformsUtils.clone({[r]:{value:t}})})),{}),vertexShader:t,fragmentShader:i}),this.key="",r.forEach((([e])=>Object.defineProperty(this,e,{get:()=>this.uniforms[e].value,set:r=>this.uniforms[e].value=r}))),s&&s(this)}};return u.key=r.nanoid(),u};
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"));exports.shaderMaterial=function(e,r,n,s){const i=class extends t.ShaderMaterial{constructor(){const i=Object.entries(e);super({uniforms:i.reduce(((e,[r,n])=>({...e,...t.UniformsUtils.clone({[r]:{value:n}})})),{}),vertexShader:r,fragmentShader:n}),this.key="",i.forEach((([e])=>Object.defineProperty(this,e,{get:()=>this.uniforms[e].value,set:t=>this.uniforms[e].value=t}))),s&&s(this)}};return i.key=t.MathUtils.generateUUID(),i};
@@ -1,5 +1,4 @@
1
1
  import * as THREE from 'three';
2
- import { nanoid } from 'nanoid';
3
2
 
4
3
  function shaderMaterial(uniforms, vertexShader, fragmentShader, onInit) {
5
4
  const material = class material extends THREE.ShaderMaterial {
@@ -30,7 +29,7 @@ function shaderMaterial(uniforms, vertexShader, fragmentShader, onInit) {
30
29
  }
31
30
 
32
31
  };
33
- material.key = nanoid();
32
+ material.key = THREE.MathUtils.generateUUID();
34
33
  return material;
35
34
  }
36
35
 
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./useTexture.cjs.js"),r=require("suspend-react");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 s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("three"),require("@react-three/fiber");var u=s(e);exports.useMatcapTexture=function(e=0,s=1024){const n=r.suspend((()=>fetch("https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/matcaps.json").then((e=>e.json()))),["matcapList"]),c=n[0],a=u.useMemo((()=>Object.keys(n).length),[]),i=`${u.useMemo((()=>"string"==typeof e?e:"number"==typeof e?n[e]:null),[e])||c}${function(e){switch(e){case 64:return"-64px";case 128:return"-128px";case 256:return"-256px";case 512:return"-512px";default:return""}}(s)}.png`,p=`https://rawcdn.githack.com/emmelleppi/matcaps/9b36ccaaf0a24881a39062d05566c9e92be4aa0d/${s}/${i}`;return[t.useTexture(p),p,a]};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("./useTexture.cjs.js"),r=require("suspend-react");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 s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("three"),require("@react-three/fiber");var u=s(e);exports.useMatcapTexture=function(e=0,s=1024,n){const c=r.suspend((()=>fetch("https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/matcaps.json").then((e=>e.json()))),["matcapList"]),a=c[0],i=u.useMemo((()=>Object.keys(c).length),[]),p=`${u.useMemo((()=>"string"==typeof e?e:"number"==typeof e?c[e]:null),[e])||a}${function(e){switch(e){case 64:return"-64px";case 128:return"-128px";case 256:return"-256px";case 512:return"-512px";default:return""}}(s)}.png`,o=`https://rawcdn.githack.com/emmelleppi/matcaps/9b36ccaaf0a24881a39062d05566c9e92be4aa0d/${s}/${p}`;return[t.useTexture(o,n),o,i]};
@@ -1 +1,2 @@
1
- export declare function useMatcapTexture(id?: number | string, format?: number): [THREE.Texture, string, number];
1
+ import { Texture } from 'three';
2
+ export declare function useMatcapTexture(id?: number | string, format?: number, onLoad?: (texture: Texture | Texture[]) => void): [THREE.Texture, string, number];
@@ -23,7 +23,7 @@ function getFormatString(format) {
23
23
 
24
24
  const LIST_URL = 'https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/matcaps.json';
25
25
  const MATCAP_ROOT = 'https://rawcdn.githack.com/emmelleppi/matcaps/9b36ccaaf0a24881a39062d05566c9e92be4aa0d';
26
- function useMatcapTexture(id = 0, format = 1024) {
26
+ function useMatcapTexture(id = 0, format = 1024, onLoad) {
27
27
  const matcapList = suspend(() => fetch(LIST_URL).then(res => res.json()), ['matcapList']);
28
28
  const DEFAULT_MATCAP = matcapList[0];
29
29
  const numTot = React.useMemo(() => Object.keys(matcapList).length, []);
@@ -38,7 +38,7 @@ function useMatcapTexture(id = 0, format = 1024) {
38
38
  }, [id]);
39
39
  const fileName = `${fileHash || DEFAULT_MATCAP}${getFormatString(format)}.png`;
40
40
  const url = `${MATCAP_ROOT}/${format}/${fileName}`;
41
- const matcapTexture = useTexture(url);
41
+ const matcapTexture = useTexture(url, onLoad);
42
42
  return [matcapTexture, url, numTot];
43
43
  }
44
44
 
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("./useTexture.cjs.js"),t=require("three"),s=require("suspend-react");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 s=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,s.get?s:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("@react-three/fiber");var a=n(e);exports.useNormalTexture=function(e=0,n={}){const{repeat:o=[1,1],anisotropy:u=1,offset:c=[0,0]}=n,i=s.suspend((()=>fetch("https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/normals/normals.json").then((e=>e.json()))),["normalsList"]),f=a.useMemo((()=>Object.keys(i).length),[]),p=i[0],d=`https://rawcdn.githack.com/pmndrs/drei-assets/7a3104997e1576f83472829815b00880d88b32fb/normals/${i[e]||p}`,l=r.useTexture(d);return a.useLayoutEffect((()=>{l&&(l.wrapS=l.wrapT=t.RepeatWrapping,l.repeat=new t.Vector2(o[0],o[1]),l.offset=new t.Vector2(c[0],c[1]),l.anisotropy=u)}),[l,u,o,c]),[l,d,f]};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("./useTexture.cjs.js"),t=require("three"),s=require("suspend-react");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 s=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,s.get?s:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("@react-three/fiber");var a=n(e);exports.useNormalTexture=function(e=0,n={},o){const{repeat:u=[1,1],anisotropy:c=1,offset:i=[0,0]}=n,f=s.suspend((()=>fetch("https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/normals/normals.json").then((e=>e.json()))),["normalsList"]),p=a.useMemo((()=>Object.keys(f).length),[]),d=f[0],l=`https://rawcdn.githack.com/pmndrs/drei-assets/7a3104997e1576f83472829815b00880d88b32fb/normals/${f[e]||d}`,b=r.useTexture(l,o);return a.useLayoutEffect((()=>{b&&(b.wrapS=b.wrapT=t.RepeatWrapping,b.repeat=new t.Vector2(u[0],u[1]),b.offset=new t.Vector2(i[0],i[1]),b.anisotropy=c)}),[b,c,u,i]),[b,l,p]};
@@ -4,5 +4,5 @@ declare type Settings = {
4
4
  anisotropy?: number;
5
5
  offset?: number[];
6
6
  };
7
- export declare function useNormalTexture(id?: number, settings?: Settings): [Texture, string, number];
7
+ export declare function useNormalTexture(id?: number, settings?: Settings, onLoad?: (texture: Texture | Texture[]) => void): [Texture, string, number];
8
8
  export {};
@@ -5,7 +5,7 @@ import { suspend } from 'suspend-react';
5
5
 
6
6
  const NORMAL_ROOT = 'https://rawcdn.githack.com/pmndrs/drei-assets/7a3104997e1576f83472829815b00880d88b32fb';
7
7
  const LIST_URL = 'https://cdn.jsdelivr.net/gh/pmndrs/drei-assets@master/normals/normals.json';
8
- function useNormalTexture(id = 0, settings = {}) {
8
+ function useNormalTexture(id = 0, settings = {}, onLoad) {
9
9
  const {
10
10
  repeat = [1, 1],
11
11
  anisotropy = 1,
@@ -16,7 +16,7 @@ function useNormalTexture(id = 0, settings = {}) {
16
16
  const DEFAULT_NORMAL = normalsList[0];
17
17
  const imageName = normalsList[id] || DEFAULT_NORMAL;
18
18
  const url = `${NORMAL_ROOT}/normals/${imageName}`;
19
- const normalTexture = useTexture(url);
19
+ const normalTexture = useTexture(url, onLoad);
20
20
  React.useLayoutEffect(() => {
21
21
  if (!normalTexture) return;
22
22
  normalTexture.wrapS = normalTexture.wrapT = RepeatWrapping;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("@react-three/fiber"),t=require("react");const a=e=>e===Object(e)&&!Array.isArray(e)&&"function"!=typeof e;function s(s){const u=r.useThree((e=>e.gl)),o=r.useLoader(e.TextureLoader,a(s)?Object.values(s):s);if(t.useEffect((()=>{(Array.isArray(o)?o:[o]).forEach(u.initTexture)}),[u,o]),a(s)){const e=Object.keys(s),r={};return e.forEach((t=>Object.assign(r,{[t]:o[e.indexOf(t)]}))),r}return o}s.preload=t=>r.useLoader.preload(e.TextureLoader,t),s.clear=t=>r.useLoader.clear(e.TextureLoader,t),exports.IsObject=a,exports.useTexture=s;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("@react-three/fiber"),t=require("react");const u=e=>e===Object(e)&&!Array.isArray(e)&&"function"!=typeof e;function a(a,s){const o=r.useThree((e=>e.gl)),c=r.useLoader(e.TextureLoader,u(a)?Object.values(a):a);if(t.useLayoutEffect((()=>{null==s||s(c)}),[s]),t.useEffect((()=>{(Array.isArray(c)?c:[c]).forEach(o.initTexture)}),[o,c]),u(a)){const e=Object.keys(a),r={};return e.forEach((t=>Object.assign(r,{[t]:c[e.indexOf(t)]}))),r}return c}a.preload=t=>r.useLoader.preload(e.TextureLoader,t),a.clear=t=>r.useLoader.clear(e.TextureLoader,t),exports.IsObject=u,exports.useTexture=a;
@@ -1,6 +1,6 @@
1
1
  import { Texture } from 'three';
2
2
  export declare const IsObject: (url: any) => url is Record<string, string>;
3
- export declare function useTexture<Url extends string[] | string | Record<string, string>>(input: Url): Url extends any[] ? Texture[] : Url extends object ? {
3
+ export declare function useTexture<Url extends string[] | string | Record<string, string>>(input: Url, onLoad?: (texture: Texture | Texture[]) => void): Url extends any[] ? Texture[] : Url extends object ? {
4
4
  [key in keyof Url]: Texture;
5
5
  } : Texture;
6
6
  export declare namespace useTexture {
@@ -1,11 +1,14 @@
1
1
  import { TextureLoader } from 'three';
2
2
  import { useThree, useLoader } from '@react-three/fiber';
3
- import { useEffect } from 'react';
3
+ import { useLayoutEffect, useEffect } from 'react';
4
4
 
5
5
  const IsObject = url => url === Object(url) && !Array.isArray(url) && typeof url !== 'function';
6
- function useTexture(input) {
6
+ function useTexture(input, onLoad) {
7
7
  const gl = useThree(state => state.gl);
8
- const textures = useLoader(TextureLoader, IsObject(input) ? Object.values(input) : input); // https://github.com/mrdoob/three.js/issues/22696
8
+ const textures = useLoader(TextureLoader, IsObject(input) ? Object.values(input) : input);
9
+ useLayoutEffect(() => {
10
+ onLoad == null ? void 0 : onLoad(textures);
11
+ }, [onLoad]); // https://github.com/mrdoob/three.js/issues/22696
9
12
  // Upload the texture to the GPU immediately instead of waiting for the first render
10
13
 
11
14
  useEffect(() => {