@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 +36 -3
- package/core/Image.cjs.js +1 -1
- package/core/RenderTexture.cjs.js +1 -1
- package/core/RenderTexture.d.ts +9 -8
- package/core/RenderTexture.js +18 -9
- package/core/Sparkles.cjs.js +1 -1
- package/core/Text3D.cjs.js +1 -0
- package/core/Text3D.d.ts +34 -0
- package/core/Text3D.js +100 -0
- package/core/index.cjs.js +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.js +1 -1
- package/core/shaderMaterial.cjs.js +1 -1
- package/core/shaderMaterial.js +1 -2
- package/core/useMatcapTexture.cjs.js +1 -1
- package/core/useMatcapTexture.d.ts +2 -1
- package/core/useMatcapTexture.js +2 -2
- package/core/useNormalTexture.cjs.js +1 -1
- package/core/useNormalTexture.d.ts +1 -1
- package/core/useNormalTexture.js +2 -2
- package/core/useTexture.cjs.js +1 -1
- package/core/useTexture.d.ts +1 -1
- package/core/useTexture.js +6 -3
- package/index.cjs.js +1 -1
- package/index.js +1 -0
- package/native/index.cjs.js +1 -1
- package/native/index.js +1 -1
- package/package.json +1 -3
- package/web/index.cjs.js +1 -1
- package/web/index.js +1 -1
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://drei.vercel.app/?path=/story/abstractions-text3d--text-3-d-st) 
|
|
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://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://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,
|
|
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
|
-
|
|
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"
|
|
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)}
|
|
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
|
|
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;
|
package/core/RenderTexture.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
} & React.RefAttributes<unknown>>;
|
package/core/RenderTexture.js
CHANGED
|
@@ -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
|
-
|
|
7
|
+
const RenderTexture = /*#__PURE__*/React.forwardRef(({
|
|
8
8
|
children,
|
|
9
9
|
width,
|
|
10
10
|
height,
|
|
11
|
-
|
|
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
|
-
|
|
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
|
|
package/core/Sparkles.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("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)}
|
|
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;
|
package/core/Text3D.d.ts
ADDED
|
@@ -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("./
|
|
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
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";
|
|
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};
|
package/core/shaderMaterial.js
CHANGED
|
@@ -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 =
|
|
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
|
|
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
|
-
|
|
1
|
+
import { Texture } from 'three';
|
|
2
|
+
export declare function useMatcapTexture(id?: number | string, format?: number, onLoad?: (texture: Texture | Texture[]) => void): [THREE.Texture, string, number];
|
package/core/useMatcapTexture.js
CHANGED
|
@@ -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:
|
|
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 {};
|
package/core/useNormalTexture.js
CHANGED
|
@@ -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;
|
package/core/useTexture.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("@react-three/fiber"),t=require("react");const
|
|
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;
|
package/core/useTexture.d.ts
CHANGED
|
@@ -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 {
|
package/core/useTexture.js
CHANGED
|
@@ -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);
|
|
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(() => {
|