@react-three/drei 7.21.0 → 7.22.2

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber");function a(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var o=a(e),n=a(t);const c=e=>e&&e.isOrthographicCamera,i=o.createContext(null);exports.Bounds=function({children:e,damping:t=6,fit:a,clip:s,margin:m=1.2,eps:u=.01}){const f=o.useRef(null),x=r.useThree((e=>e.camera)),p=r.useThree((e=>e.controls)),l=r.useThree((e=>e.invalidate));function z(e,t){return Math.abs(e.x-t.x)<u&&Math.abs(e.y-t.y)<u&&Math.abs(e.z-t.z)<u}function h(e,t,r,a){e.x=n.MathUtils.damp(e.x,t.x,r,a),e.y=n.MathUtils.damp(e.y,t.y,r,a),e.z=n.MathUtils.damp(e.z,t.z,r,a)}const[y]=o.useState((()=>({animating:!1,focus:new n.Vector3,camera:new n.Vector3,zoom:1}))),[d]=o.useState((()=>({focus:new n.Vector3,camera:new n.Vector3,zoom:1}))),M=o.useMemo((()=>{const e=new n.Box3;function r(){const t=e.getSize(new n.Vector3),r=e.getCenter(new n.Vector3),a=Math.max(t.x,t.y,t.z),o=c(x)?4*a:a/(2*Math.atan(Math.PI*x.fov/360)),i=c(x)?4*a:o/x.aspect;return{size:t,center:r,distance:m*Math.max(o,i)}}return{getSize:r,refresh(t){return e.setFromObject(t||f.current),this},clip(){const{distance:e}=r();return p&&(p.maxDistance=10*e),x.near=e/100,x.far=100*e,x.updateProjectionMatrix(),p&&p.update(),this},fit(){y.camera.copy(x.position),p&&y.focus.copy(p.target);const{center:a,distance:o}=r(),i=a.clone().sub(x.position).normalize().multiplyScalar(o);if(d.camera.copy(a).sub(i),d.focus.copy(a),c(x)){y.zoom=x.zoom;let r=0,o=0;const c=[new n.Vector3(e.min.x,e.min.y,e.min.z),new n.Vector3(e.min.x,e.max.y,e.min.z),new n.Vector3(e.min.x,e.min.y,e.max.z),new n.Vector3(e.min.x,e.max.y,e.max.z),new n.Vector3(e.max.x,e.max.y,e.max.z),new n.Vector3(e.max.x,e.max.y,e.min.z),new n.Vector3(e.max.x,e.min.y,e.max.z),new n.Vector3(e.max.x,e.min.y,e.min.z)];a.applyMatrix4(x.matrixWorldInverse);for(const e of c)e.applyMatrix4(x.matrixWorldInverse),r=Math.max(r,Math.abs(e.y-a.y)),o=Math.max(o,Math.abs(e.x-a.x));r*=2,o*=2;const i=(x.top-x.bottom)/r,s=(x.right-x.left)/o;d.zoom=Math.min(i,s)/m,t||(x.zoom=d.zoom,x.updateProjectionMatrix())}return t?y.animating=!0:(x.position.copy(d.camera),x.lookAt(d.focus),p&&(p.target.copy(d.focus),p.update()),l()),this}}}),[x,p,m,t,l]);return o.useLayoutEffect((()=>{if(M.refresh(),a&&M.fit(),s&&M.clip(),p){const e=e=>y.animating=!1;return p.addEventListener("start",e),()=>p.removeEventListener("start",e)}}),[M,a,p]),r.useFrame(((e,r)=>{if(y.animating){if(h(y.focus,d.focus,t,r),h(y.camera,d.camera,t,r),y.zoom=n.MathUtils.damp(y.zoom,d.zoom,t,r),x.position.copy(y.camera),c(x)&&(x.zoom=y.zoom,x.updateProjectionMatrix()),p?(p.target.copy(y.focus),p.update()):x.lookAt(y.focus),l(),c(x)&&!(Math.abs(y.zoom-d.zoom)<u))return;if(!c(x)&&!z(y.camera,d.camera))return;if(p&&!z(y.focus,d.focus))return;y.animating=!1}})),o.createElement("group",{ref:f},o.createElement(i.Provider,{value:M},e))},exports.useBounds=function(){return o.useContext(i)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber");function o(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 a=o(e),n=o(t);const c=e=>e&&e.isOrthographicCamera,i=a.createContext(null);exports.Bounds=function({children:e,damping:t=6,fit:o,clip:s,margin:m=1.2,eps:u=.01}){const f=a.useRef(null),x=r.useThree((e=>e.camera)),p=r.useThree((e=>e.controls)),l=r.useThree((e=>e.invalidate));function y(e,t){return Math.abs(e.x-t.x)<u&&Math.abs(e.y-t.y)<u&&Math.abs(e.z-t.z)<u}function z(e,t,r,o){e.x=n.MathUtils.damp(e.x,t.x,r,o),e.y=n.MathUtils.damp(e.y,t.y,r,o),e.z=n.MathUtils.damp(e.z,t.z,r,o)}const[h]=a.useState((()=>({animating:!1,focus:new n.Vector3,camera:new n.Vector3,zoom:1}))),[d]=a.useState((()=>({focus:new n.Vector3,camera:new n.Vector3,zoom:1}))),M=a.useMemo((()=>{const e=new n.Box3;function r(){const t=e.getSize(new n.Vector3),r=e.getCenter(new n.Vector3),o=Math.max(t.x,t.y,t.z),a=c(x)?4*o:o/(2*Math.atan(Math.PI*x.fov/360)),i=c(x)?4*o:a/x.aspect;return{size:t,center:r,distance:m*Math.max(a,i)}}return{getSize:r,refresh(t){var r;if((r=t)&&r.isObject3D?e.setFromObject(t):(e=>e&&e.isBox3)(t)?e.copy(t):e.setFromObject(f.current),e.isEmpty()){const t=x.position.length()||10;e.setFromCenterAndSize(new n.Vector3,new n.Vector3(t,t,t))}return this},clip(){const{distance:e}=r();return p&&(p.maxDistance=10*e),x.near=e/100,x.far=100*e,x.updateProjectionMatrix(),p&&p.update(),this},fit(){h.camera.copy(x.position),p&&h.focus.copy(p.target);const{center:o,distance:a}=r(),i=o.clone().sub(x.position).normalize().multiplyScalar(a);if(d.camera.copy(o).sub(i),d.focus.copy(o),c(x)){h.zoom=x.zoom;let r=0,a=0;const c=[new n.Vector3(e.min.x,e.min.y,e.min.z),new n.Vector3(e.min.x,e.max.y,e.min.z),new n.Vector3(e.min.x,e.min.y,e.max.z),new n.Vector3(e.min.x,e.max.y,e.max.z),new n.Vector3(e.max.x,e.max.y,e.max.z),new n.Vector3(e.max.x,e.max.y,e.min.z),new n.Vector3(e.max.x,e.min.y,e.max.z),new n.Vector3(e.max.x,e.min.y,e.min.z)];o.applyMatrix4(x.matrixWorldInverse);for(const e of c)e.applyMatrix4(x.matrixWorldInverse),r=Math.max(r,Math.abs(e.y-o.y)),a=Math.max(a,Math.abs(e.x-o.x));r*=2,a*=2;const i=(x.top-x.bottom)/r,s=(x.right-x.left)/a;d.zoom=Math.min(i,s)/m,t||(x.zoom=d.zoom,x.updateProjectionMatrix())}return t?h.animating=!0:(x.position.copy(d.camera),x.lookAt(d.focus),p&&(p.target.copy(d.focus),p.update()),l()),this}}}),[x,p,m,t,l]);return a.useLayoutEffect((()=>{if(M.refresh(),o&&M.fit(),s&&M.clip(),p){const e=e=>h.animating=!1;return p.addEventListener("start",e),()=>p.removeEventListener("start",e)}}),[M,o,p]),r.useFrame(((e,r)=>{if(h.animating){if(z(h.focus,d.focus,t,r),z(h.camera,d.camera,t,r),h.zoom=n.MathUtils.damp(h.zoom,d.zoom,t,r),x.position.copy(h.camera),c(x)&&(x.zoom=h.zoom,x.updateProjectionMatrix()),p?(p.target.copy(h.focus),p.update()):x.lookAt(h.focus),l(),c(x)&&!(Math.abs(h.zoom-d.zoom)<u))return;if(!c(x)&&!y(h.camera,d.camera))return;if(p&&!y(h.focus,d.focus))return;h.animating=!1}})),a.createElement("group",{ref:f},a.createElement(i.Provider,{value:M},e))},exports.useBounds=function(){return a.useContext(i)};
package/core/Bounds.js CHANGED
@@ -4,6 +4,10 @@ import { useThree, useFrame } from '@react-three/fiber';
4
4
 
5
5
  const isOrthographic = def => def && def.isOrthographicCamera;
6
6
 
7
+ const isObject3D = def => def && def.isObject3D;
8
+
9
+ const isBox3 = def => def && def.isBox3;
10
+
7
11
  const context = /*#__PURE__*/React.createContext(null);
8
12
  function Bounds({
9
13
  children,
@@ -61,7 +65,13 @@ function Bounds({
61
65
  getSize,
62
66
 
63
67
  refresh(object) {
64
- box.setFromObject(object || ref.current);
68
+ if (isObject3D(object)) box.setFromObject(object);else if (isBox3(object)) box.copy(object);else box.setFromObject(ref.current);
69
+
70
+ if (box.isEmpty()) {
71
+ const max = camera.position.length() || 10;
72
+ box.setFromCenterAndSize(new THREE.Vector3(), new THREE.Vector3(max, max, max));
73
+ }
74
+
65
75
  return this;
66
76
  },
67
77
 
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),a=require("./GizmoHelper.cjs.js");function o(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 a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("@react-three/fiber"),require("./OrthographicCamera.cjs.js"),require("react-merge-refs"),require("./useCamera.cjs.js");var l=o(e),i=n(t);function c({color:e,rotation:t}){return i.createElement("group",{rotation:t},i.createElement("mesh",{position:[.4,0,0]},i.createElement("boxGeometry",{args:[.8,.05,.05]}),i.createElement("meshBasicMaterial",{color:e,toneMapped:!1})))}function s({onClick:e,font:t,disabled:a,arcStyle:o,label:n,labelColor:c,...s}){const u=i.useMemo((()=>{const e=document.createElement("canvas");e.width=64,e.height=64;const a=e.getContext("2d");return a.beginPath(),a.arc(32,32,16,0,2*Math.PI),a.closePath(),a.fillStyle=o,a.fill(),n&&(a.font=t,a.textAlign="center",a.fillStyle=c,a.fillText(n,32,41)),new r.CanvasTexture(e)}),[o,n,c,t]),[f,p]=i.useState(!1),m=(n?1:.75)*(f?1.2:1);return i.createElement("sprite",l.default({scale:m,onPointerOver:a?void 0:e=>{e.stopPropagation(),p(!0)},onPointerOut:a?void 0:e||(e=>{e.stopPropagation(),p(!1)})},s),i.createElement("spriteMaterial",{map:u,alphaTest:.3,opacity:n?1:.75,toneMapped:!1}))}exports.GizmoViewport=({hideNegativeAxes:e,disabled:t,font:r="18px Inter var, Arial, sans-serif",axisColors:o=["#ff3653","#0adb50","#2c8fdf"],labelColor:n="#000",onClick:u,...f})=>{const[p,m,d]=o,{tweenCamera:b,raycast:E}=a.useGizmoContext(),h={font:r,disabled:t,labelColor:n,raycast:E,onClick:u,onPointerDown:t?void 0:e=>{b(e.object.position),e.stopPropagation()}};return i.createElement("group",l.default({scale:40},f),i.createElement(c,{color:p,rotation:[0,0,0]}),i.createElement(c,{color:m,rotation:[0,0,Math.PI/2]}),i.createElement(c,{color:d,rotation:[0,-Math.PI/2,0]}),i.createElement(s,l.default({arcStyle:p,position:[1,0,0],label:"X"},h)),i.createElement(s,l.default({arcStyle:m,position:[0,1,0],label:"Y"},h)),i.createElement(s,l.default({arcStyle:d,position:[0,0,1],label:"Z"},h)),!e&&i.createElement(i.Fragment,null,i.createElement(s,l.default({arcStyle:p,position:[-1,0,0]},h)),i.createElement(s,l.default({arcStyle:m,position:[0,-1,0]},h)),i.createElement(s,l.default({arcStyle:d,position:[0,0,-1]},h))),i.createElement("ambientLight",{intensity:.5}),i.createElement("pointLight",{position:[10,10,10],intensity:.5}))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),a=require("./GizmoHelper.cjs.js");function o(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 a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("@react-three/fiber"),require("./OrthographicCamera.cjs.js"),require("react-merge-refs"),require("./useCamera.cjs.js");var l=o(e),i=n(t);function c({color:e,rotation:t}){return i.createElement("group",{rotation:t},i.createElement("mesh",{position:[.4,0,0]},i.createElement("boxGeometry",{args:[.8,.05,.05]}),i.createElement("meshBasicMaterial",{color:e,toneMapped:!1})))}function s({onClick:e,font:t,disabled:a,arcStyle:o,label:n,labelColor:c,axisHeadScale:s=1,...u}){const f=i.useMemo((()=>{const e=document.createElement("canvas");e.width=64,e.height=64;const a=e.getContext("2d");return a.beginPath(),a.arc(32,32,16,0,2*Math.PI),a.closePath(),a.fillStyle=o,a.fill(),n&&(a.font=t,a.textAlign="center",a.fillStyle=c,a.fillText(n,32,41)),new r.CanvasTexture(e)}),[o,n,c,t]),[d,m]=i.useState(!1),p=(n?1:.75)*(d?1.2:1)*s;return i.createElement("sprite",l.default({scale:p,onPointerOver:a?void 0:e=>{e.stopPropagation(),m(!0)},onPointerOut:a?void 0:e||(e=>{e.stopPropagation(),m(!1)})},u),i.createElement("spriteMaterial",{map:f,alphaTest:.3,opacity:n?1:.75,toneMapped:!1}))}exports.GizmoViewport=({hideNegativeAxes:e,hideAxisHeads:t,disabled:r,font:o="18px Inter var, Arial, sans-serif",axisColors:n=["#ff3653","#0adb50","#2c8fdf"],axisHeadScale:u=1,labels:f=["X","Y","Z"],labelColor:d="#000",onClick:m,...p})=>{const[b,E,h]=n,{tweenCamera:g,raycast:y}=a.useGizmoContext(),x={font:o,disabled:r,labelColor:d,raycast:y,onClick:m,axisHeadScale:u,onPointerDown:r?void 0:e=>{g(e.object.position),e.stopPropagation()}};return i.createElement("group",l.default({scale:40},p),i.createElement(c,{color:b,rotation:[0,0,0]}),i.createElement(c,{color:E,rotation:[0,0,Math.PI/2]}),i.createElement(c,{color:h,rotation:[0,-Math.PI/2,0]}),!t&&i.createElement(i.Fragment,null,i.createElement(s,l.default({arcStyle:b,position:[1,0,0],label:f[0]},x)),i.createElement(s,l.default({arcStyle:E,position:[0,1,0],label:f[1]},x)),i.createElement(s,l.default({arcStyle:h,position:[0,0,1],label:f[2]},x)),!e&&i.createElement(i.Fragment,null,i.createElement(s,l.default({arcStyle:b,position:[-1,0,0]},x)),i.createElement(s,l.default({arcStyle:E,position:[0,-1,0]},x)),i.createElement(s,l.default({arcStyle:h,position:[0,0,-1]},x)))),i.createElement("ambientLight",{intensity:.5}),i.createElement("pointLight",{position:[10,10,10],intensity:.5}))};
@@ -2,11 +2,14 @@
2
2
  import { Event } from 'three';
3
3
  declare type GizmoViewportProps = JSX.IntrinsicElements['group'] & {
4
4
  axisColors?: [string, string, string];
5
+ labels?: [string, string, string];
6
+ axisHeadScale?: number;
5
7
  labelColor?: string;
6
8
  hideNegativeAxes?: boolean;
9
+ hideAxisHeads?: boolean;
7
10
  disabled?: boolean;
8
11
  font?: string;
9
12
  onClick?: (e: Event) => null;
10
13
  };
11
- export declare const GizmoViewport: ({ hideNegativeAxes, disabled, font, axisColors, labelColor, onClick, ...props }: GizmoViewportProps) => JSX.Element;
14
+ export declare const GizmoViewport: ({ hideNegativeAxes, hideAxisHeads, disabled, font, axisColors, axisHeadScale, labels, labelColor, onClick, ...props }: GizmoViewportProps) => JSX.Element;
12
15
  export {};
@@ -26,6 +26,7 @@ function AxisHead({
26
26
  arcStyle,
27
27
  label,
28
28
  labelColor,
29
+ axisHeadScale = 1,
29
30
  ...props
30
31
  }) {
31
32
  const texture = React.useMemo(() => {
@@ -49,7 +50,7 @@ function AxisHead({
49
50
  return new CanvasTexture(canvas);
50
51
  }, [arcStyle, label, labelColor, font]);
51
52
  const [active, setActive] = React.useState(false);
52
- const scale = (label ? 1 : 0.75) * (active ? 1.2 : 1);
53
+ const scale = (label ? 1 : 0.75) * (active ? 1.2 : 1) * axisHeadScale;
53
54
 
54
55
  const handlePointerOver = e => {
55
56
  e.stopPropagation();
@@ -75,9 +76,12 @@ function AxisHead({
75
76
 
76
77
  const GizmoViewport = ({
77
78
  hideNegativeAxes,
79
+ hideAxisHeads,
78
80
  disabled,
79
81
  font = '18px Inter var, Arial, sans-serif',
80
82
  axisColors = ['#ff3653', '#0adb50', '#2c8fdf'],
83
+ axisHeadScale = 1,
84
+ labels = ['X', 'Y', 'Z'],
81
85
  labelColor = '#000',
82
86
  onClick,
83
87
  ...props
@@ -93,6 +97,7 @@ const GizmoViewport = ({
93
97
  labelColor,
94
98
  raycast,
95
99
  onClick,
100
+ axisHeadScale,
96
101
  onPointerDown: !disabled ? e => {
97
102
  tweenCamera(e.object.position);
98
103
  e.stopPropagation();
@@ -109,18 +114,18 @@ const GizmoViewport = ({
109
114
  }), /*#__PURE__*/React.createElement(Axis, {
110
115
  color: colorZ,
111
116
  rotation: [0, -Math.PI / 2, 0]
112
- }), /*#__PURE__*/React.createElement(AxisHead, _extends({
117
+ }), !hideAxisHeads && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(AxisHead, _extends({
113
118
  arcStyle: colorX,
114
119
  position: [1, 0, 0],
115
- label: "X"
120
+ label: labels[0]
116
121
  }, axisHeadProps)), /*#__PURE__*/React.createElement(AxisHead, _extends({
117
122
  arcStyle: colorY,
118
123
  position: [0, 1, 0],
119
- label: "Y"
124
+ label: labels[1]
120
125
  }, axisHeadProps)), /*#__PURE__*/React.createElement(AxisHead, _extends({
121
126
  arcStyle: colorZ,
122
127
  position: [0, 0, 1],
123
- label: "Z"
128
+ label: labels[2]
124
129
  }, axisHeadProps)), !hideNegativeAxes && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(AxisHead, _extends({
125
130
  arcStyle: colorX,
126
131
  position: [-1, 0, 0]
@@ -130,7 +135,7 @@ const GizmoViewport = ({
130
135
  }, axisHeadProps)), /*#__PURE__*/React.createElement(AxisHead, _extends({
131
136
  arcStyle: colorZ,
132
137
  position: [0, 0, -1]
133
- }, axisHeadProps))), /*#__PURE__*/React.createElement("ambientLight", {
138
+ }, axisHeadProps)))), /*#__PURE__*/React.createElement("ambientLight", {
134
139
  intensity: 0.5
135
140
  }), /*#__PURE__*/React.createElement("pointLight", {
136
141
  position: [10, 10, 10],
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),n=require("@react-three/fiber"),a=require("react-merge-refs"),u=require("../helpers/Position.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var c=o(e),s=i(t),l=i(r),f=o(a);let d,b;const m=l.createContext(null),p=new s.Matrix4,y=new s.Vector3,g=new s.Color,h=l.forwardRef((({children:e,range:t,limit:r=1e3,...a},u)=>{const o=l.useRef(null),[i,h]=l.useState([]),[[x,j]]=l.useState((()=>[new Float32Array(3*r),new Float32Array([...new Array(3*r)].map((()=>1)))]));l.useLayoutEffect((()=>{o.current.geometry.drawRange.count=Math.min(r,void 0!==t?t:r,i.length)}),[i,t]),l.useEffect((()=>{o.current.geometry.attributes.position.needsUpdate=!0})),n.useFrame((()=>{for(o.current.updateMatrix(),o.current.updateMatrixWorld(),p.copy(o.current.matrixWorld).invert(),d=0;d<i.length;d++)b=i[d].current,b.getWorldPosition(y).applyMatrix4(p),y.x===x[3*d]&&y.y===x[3*d+1]&&y.z===x[3*d+2]||(y.toArray(x,3*d),o.current.geometry.attributes.position.needsUpdate=!0,b.matrixWorldNeedsUpdate=!0),b.color.equals(g.fromArray(j,3*d))||(b.color.toArray(j,3*d),o.current.geometry.attributes.color.needsUpdate=!0)}));const v=l.useMemo((()=>{const e={};for(d=0;d<i.length;d++){var t;Object.assign(e,null==(t=i[d].current)?void 0:t.__r3f.handlers)}return Object.keys(e).reduce(((e,t)=>({...e,[t]:e=>{var r,n,a;const u=null==(r=i[e.index])?void 0:r.current;return null==u||null==(n=u.__r3f)||null==(a=n.handlers)?void 0:a[t]({...e,object:u})}})),{})}),[e,i]),w=l.useMemo((()=>({subscribe:e=>(h((t=>[...t,e])),()=>h((t=>t.filter((t=>t.current!==e.current)))))})),[]);return l.createElement("points",c.default({matrixAutoUpdate:!1,ref:f.default([u,o])},v,a),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attachObject:["attributes","position"],count:x.length/3,array:x,itemSize:3,usage:s.DynamicDrawUsage}),l.createElement("bufferAttribute",{attachObject:["attributes","color"],count:j.length/3,array:j,itemSize:3,usage:s.DynamicDrawUsage})),l.createElement(m.Provider,{value:w},e))})),x=l.forwardRef((({children:e,...t},r)=>{l.useMemo((()=>n.extend({Position:u.Position})),[]);const a=l.useRef(),{subscribe:o}=l.useContext(m);return l.useLayoutEffect((()=>o(a)),[]),l.createElement("position",c.default({ref:f.default([r,a])},t),e)}));exports.Point=x,exports.Points=h;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),a=require("@react-three/fiber"),n=require("react-merge-refs"),u=require("../helpers/Position.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),c=i(t),l=i(r),f=o(n);let d,m;const b=l.createContext(null),y=new c.Matrix4,g=new c.Vector3,p=new c.Color,h=l.forwardRef((({children:e,range:t,limit:r=1e3,...n},u)=>{const o=l.useRef(null),[i,h]=l.useState([]),[[j,x,E]]=l.useState((()=>[new Float32Array(3*r),Float32Array.from({length:3*r},(()=>1)),Float32Array.from({length:r},(()=>1))]));l.useLayoutEffect((()=>{o.current.geometry.drawRange.count=Math.min(r,void 0!==t?t:r,i.length)}),[i,t]),l.useEffect((()=>{o.current.geometry.attributes.position.needsUpdate=!0})),a.useFrame((()=>{for(o.current.updateMatrix(),o.current.updateMatrixWorld(),y.copy(o.current.matrixWorld).invert(),d=0;d<i.length;d++)m=i[d].current,m.getWorldPosition(g).applyMatrix4(y),g.x===j[3*d]&&g.y===j[3*d+1]&&g.z===j[3*d+2]||(g.toArray(j,3*d),o.current.geometry.attributes.position.needsUpdate=!0,m.matrixWorldNeedsUpdate=!0),m.color.equals(p.fromArray(x,3*d))||(m.color.toArray(x,3*d),o.current.geometry.attributes.color.needsUpdate=!0),m.size!==E[d]&&(E.set([m.size],d),o.current.geometry.attributes.size.needsUpdate=!0)}));const w=l.useMemo((()=>{const e={};for(d=0;d<i.length;d++){var t;Object.assign(e,null==(t=i[d].current)?void 0:t.__r3f.handlers)}return Object.keys(e).reduce(((e,t)=>({...e,[t]:e=>{var r,a,n;const u=null==(r=i[e.index])?void 0:r.current;return null==u||null==(a=u.__r3f)||null==(n=a.handlers)?void 0:n[t]({...e,object:u})}})),{})}),[e,i]),U=l.useMemo((()=>({subscribe:e=>(h((t=>[...t,e])),()=>h((t=>t.filter((t=>t.current!==e.current)))))})),[]);return l.createElement("points",s.default({matrixAutoUpdate:!1,ref:f.default([u,o])},w,n),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attachObject:["attributes","position"],count:j.length/3,array:j,itemSize:3,usage:c.DynamicDrawUsage}),l.createElement("bufferAttribute",{attachObject:["attributes","color"],count:x.length/3,array:x,itemSize:3,usage:c.DynamicDrawUsage}),l.createElement("bufferAttribute",{attachObject:["attributes","size"],count:E.length,array:E,itemSize:1,usage:c.DynamicDrawUsage})),l.createElement(b.Provider,{value:U},e))})),j=l.forwardRef((({children:e,...t},r)=>{l.useMemo((()=>a.extend({Position:u.Position})),[]);const n=l.useRef(),{subscribe:o}=l.useContext(b);return l.useLayoutEffect((()=>o(n)),[]),l.createElement("position",s.default({ref:f.default([r,n])},t),e)})),x=l.forwardRef((({children:e,positions:t,colors:r,sizes:n,stride:u=3,...o},i)=>{const d=l.useRef(null);return a.useFrame((()=>{const e=d.current.geometry.attributes;e.position.needsUpdate=!0,r&&(e.color.needsUpdate=!0),n&&(e.size.needsUpdate=!0)})),l.createElement("points",s.default({matrixAutoUpdate:!1,ref:f.default([i,d])},o),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attachObject:["attributes","position"],count:t.length/u,array:t,itemSize:u,usage:c.DynamicDrawUsage}),r&&l.createElement("bufferAttribute",{attachObject:["attributes","color"],count:r.length/u,array:r,itemSize:3,usage:c.DynamicDrawUsage}),n&&l.createElement("bufferAttribute",{attachObject:["attributes","size"],count:n.length/u,array:n,itemSize:1,usage:c.DynamicDrawUsage})),e)})),E=l.forwardRef(((e,t)=>e.positions instanceof Float32Array?l.createElement(x,s.default({},e,{ref:t})):l.createElement(h,s.default({},e,{ref:t}))));exports.Point=j,exports.Points=E,exports.PointsBuffer=x;
package/core/Points.d.ts CHANGED
@@ -1,26 +1,16 @@
1
1
  import * as THREE from 'three';
2
2
  import * as React from 'react';
3
- declare const Points: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").Node<THREE.Points<THREE.BufferGeometry, THREE.Material | THREE.Material[]>, typeof THREE.Points>, import("@react-three/fiber").NonFunctionKeys<{
4
- position?: import("@react-three/fiber").Vector3 | undefined;
5
- up?: import("@react-three/fiber").Vector3 | undefined;
6
- scale?: import("@react-three/fiber").Vector3 | undefined;
7
- rotation?: import("@react-three/fiber").Euler | undefined;
8
- matrix?: import("@react-three/fiber").Matrix4 | undefined;
9
- quaternion?: import("@react-three/fiber").Quaternion | undefined;
10
- layers?: import("@react-three/fiber").Layers | undefined;
11
- dispose?: (() => void) | null | undefined;
12
- }>> & {
13
- position?: import("@react-three/fiber").Vector3 | undefined;
14
- up?: import("@react-three/fiber").Vector3 | undefined;
15
- scale?: import("@react-three/fiber").Vector3 | undefined;
16
- rotation?: import("@react-three/fiber").Euler | undefined;
17
- matrix?: import("@react-three/fiber").Matrix4 | undefined;
18
- quaternion?: import("@react-three/fiber").Quaternion | undefined;
19
- layers?: import("@react-three/fiber").Layers | undefined;
20
- dispose?: (() => void) | null | undefined;
21
- } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
22
- range?: number | undefined;
23
- limit?: number | undefined;
24
- }, "visible" | "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "range" | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "updateMorphTargets" | "isPoints" | "limit"> & React.RefAttributes<THREE.Points<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
25
- declare const Point: React.ForwardRefExoticComponent<React.RefAttributes<unknown>>;
26
- export { Points, Point };
3
+ declare type PointsInstancesProps = JSX.IntrinsicElements['points'] & {
4
+ range?: number;
5
+ limit?: number;
6
+ };
7
+ export declare const Point: React.ForwardRefExoticComponent<React.RefAttributes<unknown>>;
8
+ declare type PointsBuffersProps = Omit<JSX.IntrinsicElements['points'], 'position'> & {
9
+ positions: Float32Array;
10
+ colors?: Float32Array;
11
+ sizes?: Float32Array;
12
+ stride?: 2 | 3;
13
+ };
14
+ export declare const PointsBuffer: React.ForwardRefExoticComponent<Pick<PointsBuffersProps, "visible" | "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "updateMorphTargets" | "colors" | "isPoints" | "positions" | "sizes" | "stride"> & React.RefAttributes<THREE.Points<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
15
+ export declare const Points: React.ForwardRefExoticComponent<Pick<PointsInstancesProps | PointsBuffersProps, "visible" | "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "onClick" | "onContextMenu" | "onDoubleClick" | "onPointerDown" | "onPointerMove" | "onPointerUp" | "onPointerCancel" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOut" | "onWheel" | "onPointerMissed" | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "updateMorphTargets" | "isPoints"> & React.RefAttributes<THREE.Points<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
16
+ export {};
package/core/Points.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import * as THREE from 'three';
3
3
  import * as React from 'react';
4
- import { useFrame, extend } from '@react-three/fiber';
4
+ import { extend, useFrame } from '@react-three/fiber';
5
5
  import mergeRefs from 'react-merge-refs';
6
6
  import { Position } from '../helpers/Position.js';
7
7
 
@@ -10,7 +10,11 @@ const context = /*#__PURE__*/React.createContext(null);
10
10
  const parentMatrix = new THREE.Matrix4();
11
11
  const position = new THREE.Vector3();
12
12
  const color = new THREE.Color();
13
- const Points = /*#__PURE__*/React.forwardRef(({
13
+ /**
14
+ * Instance implementation, relies on react + context to update the attributes based on the children of this component
15
+ */
16
+
17
+ const PointsInstances = /*#__PURE__*/React.forwardRef(({
14
18
  children,
15
19
  range,
16
20
  limit = 1000,
@@ -18,7 +22,11 @@ const Points = /*#__PURE__*/React.forwardRef(({
18
22
  }, ref) => {
19
23
  const parentRef = React.useRef(null);
20
24
  const [refs, setRefs] = React.useState([]);
21
- const [[positions, colors]] = React.useState(() => [new Float32Array(limit * 3), new Float32Array([...new Array(limit * 3)].map(() => 1))]);
25
+ const [[positions, colors, sizes]] = React.useState(() => [new Float32Array(limit * 3), Float32Array.from({
26
+ length: limit * 3
27
+ }, () => 1), Float32Array.from({
28
+ length: limit
29
+ }, () => 1)]);
22
30
  React.useLayoutEffect(() => {
23
31
  parentRef.current.geometry.drawRange.count = Math.min(limit, range !== undefined ? range : limit, refs.length);
24
32
  }, [refs, range]);
@@ -45,6 +53,11 @@ const Points = /*#__PURE__*/React.forwardRef(({
45
53
  positionRef.color.toArray(colors, i * 3);
46
54
  parentRef.current.geometry.attributes.color.needsUpdate = true;
47
55
  }
56
+
57
+ if (positionRef.size !== sizes[i]) {
58
+ sizes.set([positionRef.size], i);
59
+ parentRef.current.geometry.attributes.size.needsUpdate = true;
60
+ }
48
61
  }
49
62
  });
50
63
  const events = React.useMemo(() => {
@@ -88,6 +101,12 @@ const Points = /*#__PURE__*/React.forwardRef(({
88
101
  array: colors,
89
102
  itemSize: 3,
90
103
  usage: THREE.DynamicDrawUsage
104
+ }), /*#__PURE__*/React.createElement("bufferAttribute", {
105
+ attachObject: ['attributes', 'size'],
106
+ count: sizes.length,
107
+ array: sizes,
108
+ itemSize: 1,
109
+ usage: THREE.DynamicDrawUsage
91
110
  })), /*#__PURE__*/React.createElement(context.Provider, {
92
111
  value: api
93
112
  }, children));
@@ -108,5 +127,64 @@ const Point = /*#__PURE__*/React.forwardRef(({
108
127
  ref: mergeRefs([ref, group])
109
128
  }, props), children);
110
129
  });
130
+ /**
131
+ * Buffer implementation, relies on complete buffers of the correct number, leaves it to the user to update them
132
+ */
133
+
134
+ const PointsBuffer = /*#__PURE__*/React.forwardRef(({
135
+ children,
136
+ positions,
137
+ colors,
138
+ sizes,
139
+ stride = 3,
140
+ ...props
141
+ }, forwardedRef) => {
142
+ const pointsRef = React.useRef(null);
143
+ useFrame(() => {
144
+ const attr = pointsRef.current.geometry.attributes;
145
+ attr.position.needsUpdate = true;
146
+
147
+ if (colors) {
148
+ attr.color.needsUpdate = true;
149
+ }
150
+
151
+ if (sizes) {
152
+ attr.size.needsUpdate = true;
153
+ }
154
+ });
155
+ return /*#__PURE__*/React.createElement("points", _extends({
156
+ matrixAutoUpdate: false,
157
+ ref: mergeRefs([forwardedRef, pointsRef])
158
+ }, props), /*#__PURE__*/React.createElement("bufferGeometry", null, /*#__PURE__*/React.createElement("bufferAttribute", {
159
+ attachObject: ['attributes', 'position'],
160
+ count: positions.length / stride,
161
+ array: positions,
162
+ itemSize: stride,
163
+ usage: THREE.DynamicDrawUsage
164
+ }), colors && /*#__PURE__*/React.createElement("bufferAttribute", {
165
+ attachObject: ['attributes', 'color'],
166
+ count: colors.length / stride,
167
+ array: colors,
168
+ itemSize: 3,
169
+ usage: THREE.DynamicDrawUsage
170
+ }), sizes && /*#__PURE__*/React.createElement("bufferAttribute", {
171
+ attachObject: ['attributes', 'size'],
172
+ count: sizes.length / stride,
173
+ array: sizes,
174
+ itemSize: 1,
175
+ usage: THREE.DynamicDrawUsage
176
+ })), children);
177
+ });
178
+ const Points = /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
179
+ if (props.positions instanceof Float32Array) {
180
+ return /*#__PURE__*/React.createElement(PointsBuffer, _extends({}, props, {
181
+ ref: forwardedRef
182
+ }));
183
+ }
184
+
185
+ return /*#__PURE__*/React.createElement(PointsInstances, _extends({}, props, {
186
+ ref: forwardedRef
187
+ }));
188
+ });
111
189
 
112
- export { Point, Points };
190
+ export { Point, Points, PointsBuffer };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),a=require("@react-three/fiber"),n=require("../materials/SpotLightMaterial.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var u=o(e),l=i(t);const s=new r.Vector3,c=l.forwardRef((({depthBuffer:e,color:t="white",distance:o=5,angle:i=.15,attenuation:c=5,anglePower:f=5,...m},p)=>{const h=l.useRef(null),d=a.useThree((e=>e.size)),g=a.useThree((e=>e.camera)),v=a.useThree((e=>e.viewport.dpr)),[b]=l.useState((()=>new n.SpotLightMaterial));a.useFrame((()=>{b.uniforms.spotPosition.value.copy(h.current.getWorldPosition(s)),h.current.lookAt(h.current.parent.target.position)}));const w=l.useMemo((()=>{const e=new r.CylinderGeometry(.1,7*i,o,128,64,!0);return e.applyMatrix4((new r.Matrix4).makeTranslation(0,-o/2,0)),e.applyMatrix4((new r.Matrix4).makeRotationX(-Math.PI/2)),e}),[i,o]);return l.createElement("spotLight",u.default({ref:p,angle:i,color:t,distance:o},m),l.createElement("mesh",{ref:h,geometry:w},l.createElement("primitive",{object:b,attach:"material","uniforms-lightColor-value":t,"uniforms-attenuation-value":c,"uniforms-anglePower-value":f,"uniforms-depth-value":e,"uniforms-cameraNear-value":g.near,"uniforms-cameraFar-value":g.far,"uniforms-resolution-value":e?[d.width*v,d.height*v]:[0,0]})))}));exports.SpotLight=c;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),a=require("@react-three/fiber"),n=require("../materials/SpotLightMaterial.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var u=o(e),l=i(t);const s=new r.Vector3,c=l.forwardRef((({depthBuffer:e,color:t="white",distance:o=5,angle:i=.15,attenuation:c=5,anglePower:f=5,...m},p)=>{const h=l.useRef(null),d=a.useThree((e=>e.size)),g=a.useThree((e=>e.camera)),v=a.useThree((e=>e.viewport.dpr)),[b]=l.useState((()=>new n.SpotLightMaterial));a.useFrame((()=>{b.uniforms.spotPosition.value.copy(h.current.getWorldPosition(s)),h.current.lookAt(h.current.parent.target.getWorldPosition(s))}));const w=l.useMemo((()=>{const e=new r.CylinderGeometry(.1,7*i,o,128,64,!0);return e.applyMatrix4((new r.Matrix4).makeTranslation(0,-o/2,0)),e.applyMatrix4((new r.Matrix4).makeRotationX(-Math.PI/2)),e}),[i,o]);return l.createElement("spotLight",u.default({ref:p,angle:i,color:t,distance:o},m),l.createElement("mesh",{ref:h,geometry:w},l.createElement("primitive",{object:b,attach:"material","uniforms-lightColor-value":t,"uniforms-attenuation-value":c,"uniforms-anglePower-value":f,"uniforms-depth-value":e,"uniforms-cameraNear-value":g.near,"uniforms-cameraFar-value":g.far,"uniforms-resolution-value":e?[d.width*v,d.height*v]:[0,0]})))}));exports.SpotLight=c;
package/core/SpotLight.js CHANGED
@@ -21,7 +21,7 @@ const SpotLight = /*#__PURE__*/React.forwardRef(({
21
21
  const [material] = React.useState(() => new SpotLightMaterial());
22
22
  useFrame(() => {
23
23
  material.uniforms.spotPosition.value.copy(mesh.current.getWorldPosition(vec));
24
- mesh.current.lookAt(mesh.current.parent.target.position);
24
+ mesh.current.lookAt(mesh.current.parent.target.getWorldPosition(vec));
25
25
  });
26
26
  const geom = React.useMemo(() => {
27
27
  const geometry = new CylinderGeometry(0.1, angle * 7, distance, 128, 64, true);
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("./Cloud.cjs.js"),s=require("./QuadraticBezierLine.cjs.js"),t=require("./CubicBezierLine.cjs.js"),o=require("./Line.cjs.js"),i=require("./PositionalAudio.cjs.js"),u=require("./Text.cjs.js"),a=require("./Environment.cjs.js"),c=require("./Effects.cjs.js"),j=require("./GradientTexture.cjs.js"),p=require("./Image.cjs.js"),n=require("./OrthographicCamera.cjs.js"),l=require("./PerspectiveCamera.cjs.js"),x=require("./CameraShake.cjs.js"),q=require("./CubeCamera.cjs.js"),d=require("./DeviceOrientationControls.cjs.js"),h=require("./FlyControls.cjs.js"),C=require("./MapControls.cjs.js"),m=require("./OrbitControls.cjs.js"),S=require("./TrackballControls.cjs.js"),b=require("./ArcballControls.cjs.js"),B=require("./TransformControls.cjs.js"),P=require("./PointerLockControls.cjs.js"),f=require("./FirstPersonControls.cjs.js"),T=require("./GizmoHelper.cjs.js"),g=require("./GizmoViewcube.cjs.js"),M=require("./GizmoViewport.cjs.js"),v=require("./useCubeTexture.cjs.js"),D=require("./useFBX.cjs.js"),L=require("./useGLTF.cjs.js"),A=require("./useProgress.cjs.js"),G=require("./useTexture.cjs.js"),w=require("./Reflector.cjs.js"),z=require("./Shadow.cjs.js"),k=require("./Stats.cjs.js"),F=require("./Center.cjs.js"),I=require("./Bounds.cjs.js"),O=require("./DepthBuffer.cjs.js"),E=require("./useDepthBuffer.cjs.js"),y=require("./useAspect.cjs.js"),H=require("./useCamera.cjs.js"),R=require("./useDetectGPU.cjs.js"),V=require("./useHelper.cjs.js"),Q=require("./useBVH.cjs.js"),W=require("./useContextBridge.cjs.js"),N=require("./useAnimations.cjs.js"),U=require("./useFBO.cjs.js"),X=require("./useIntersect.cjs.js"),K=require("./useSimplification.cjs.js"),_=require("./useTessellation.cjs.js"),J=require("./useEdgeSplit.cjs.js"),Y=require("./CurveModifier.cjs.js"),Z=require("./MeshDistortMaterial.cjs.js"),$=require("./MeshWobbleMaterial.cjs.js"),ee=require("./PointMaterial.cjs.js"),re=require("./shaderMaterial.cjs.js"),se=require("./Sky.cjs.js"),te=require("./softShadows.cjs.js"),oe=require("./Stars.cjs.js"),ie=require("./ContactShadows.cjs.js"),ue=require("./SpotLight.cjs.js"),ae=require("./shapes.cjs.js"),ce=require("./RoundedBox.cjs.js"),je=require("./ScreenQuad.cjs.js"),pe=require("./useMatcapTexture.cjs.js"),ne=require("./useNormalTexture.cjs.js"),le=require("./Stage.cjs.js"),xe=require("./Points.cjs.js"),qe=require("./Instances.cjs.js"),de=require("./Segments.cjs.js"),he=require("./Detailed.cjs.js"),Ce=require("./Preload.cjs.js"),me=require("./BakeShadows.cjs.js"),Se=require("./meshBounds.cjs.js"),be=require("./AdaptiveDpr.cjs.js"),Be=require("./AdaptiveEvents.cjs.js");require("@babel/runtime/helpers/extends"),require("react"),require("@react-three/fiber"),require("react-merge-refs"),require("../assets/cloud.base64.cjs.js"),require("three"),require("three-stdlib"),require("troika-three-text"),require("use-asset"),require("../helpers/environment-assets.cjs.js"),require("lodash.omit"),require("lodash.pick"),require("zustand"),require("../materials/MeshReflectorMaterial.cjs.js"),require("three/examples/js/libs/stats.min"),require("../helpers/useEffectfulState.cjs.js"),require("detect-gpu"),require("three-mesh-bvh"),require("../materials/SpotLightMaterial.cjs.js"),require("../helpers/matcap-assets.cjs.js"),require("../helpers/normal-assets.cjs.js"),require("../helpers/Position.cjs.js"),require("react-composer"),exports.Billboard=e.Billboard,exports.Cloud=r.Cloud,exports.QuadraticBezierLine=s.QuadraticBezierLine,exports.CubicBezierLine=t.CubicBezierLine,exports.Line=o.Line,exports.PositionalAudio=i.PositionalAudio,exports.Text=u.Text,exports.Environment=a.Environment,exports.Effects=c.Effects,exports.isWebGL2Available=c.isWebGL2Available,exports.GradientTexture=j.GradientTexture,exports.Image=p.Image,exports.OrthographicCamera=n.OrthographicCamera,exports.PerspectiveCamera=l.PerspectiveCamera,exports.CameraShake=x.CameraShake,exports.CubeCamera=q.CubeCamera,exports.DeviceOrientationControls=d.DeviceOrientationControls,exports.FlyControls=h.FlyControls,exports.MapControls=C.MapControls,exports.OrbitControls=m.OrbitControls,exports.TrackballControls=S.TrackballControls,exports.ArcballControls=b.ArcballControls,exports.TransformControls=B.TransformControls,exports.PointerLockControls=P.PointerLockControls,exports.FirstPersonControls=f.FirstPersonControls,exports.GizmoHelper=T.GizmoHelper,exports.useGizmoContext=T.useGizmoContext,exports.GizmoViewcube=g.GizmoViewcube,exports.GizmoViewport=M.GizmoViewport,exports.useCubeTexture=v.useCubeTexture,exports.useFBX=D.useFBX,exports.useGLTF=L.useGLTF,exports.useProgress=A.useProgress,exports.IsObject=G.IsObject,exports.useTexture=G.useTexture,exports.Reflector=w.Reflector,exports.Shadow=z.Shadow,exports.Stats=k.Stats,exports.Center=F.Center,exports.Bounds=I.Bounds,exports.useBounds=I.useBounds,exports.DepthBuffer=O.DepthBuffer,exports.useDepthBuffer=E.useDepthBuffer,exports.useAspect=y.useAspect,exports.useCamera=H.useCamera,exports.useDetectGPU=R.useDetectGPU,exports.useHelper=V.useHelper,exports.useBVH=Q.useBVH,exports.useContextBridge=W.useContextBridge,exports.useAnimations=N.useAnimations,exports.useFBO=U.useFBO,exports.useIntersect=X.useIntersect,exports.useSimplification=K.useSimplification,exports.useTessellation=_.useTessellation,exports.useEdgeSplit=J.useEdgeSplit,exports.CurveModifier=Y.CurveModifier,exports.MeshDistortMaterial=Z.MeshDistortMaterial,exports.MeshWobbleMaterial=$.MeshWobbleMaterial,exports.PointMaterial=ee.PointMaterial,exports.PointMaterialImpl=ee.PointMaterialImpl,exports.shaderMaterial=re.shaderMaterial,exports.Sky=se.Sky,exports.calcPosFromAngles=se.calcPosFromAngles,exports.softShadows=te.softShadows,exports.Stars=oe.Stars,exports.ContactShadows=ie.ContactShadows,exports.SpotLight=ue.SpotLight,exports.Box=ae.Box,exports.Circle=ae.Circle,exports.Cone=ae.Cone,exports.Cylinder=ae.Cylinder,exports.Dodecahedron=ae.Dodecahedron,exports.Extrude=ae.Extrude,exports.Icosahedron=ae.Icosahedron,exports.Lathe=ae.Lathe,exports.Octahedron=ae.Octahedron,exports.Parametric=ae.Parametric,exports.Plane=ae.Plane,exports.Polyhedron=ae.Polyhedron,exports.Ring=ae.Ring,exports.Sphere=ae.Sphere,exports.Tetrahedron=ae.Tetrahedron,exports.Torus=ae.Torus,exports.TorusKnot=ae.TorusKnot,exports.Tube=ae.Tube,exports.RoundedBox=ce.RoundedBox,exports.ScreenQuad=je.ScreenQuad,exports.useMatcapTexture=pe.useMatcapTexture,exports.useNormalTexture=ne.useNormalTexture,exports.Stage=le.Stage,exports.Point=xe.Point,exports.Points=xe.Points,exports.Instance=qe.Instance,exports.Instances=qe.Instances,exports.Merged=qe.Merged,exports.Segment=de.Segment,exports.Segments=de.Segments,exports.Detailed=he.Detailed,exports.Preload=Ce.Preload,exports.BakeShadows=me.BakeShadows,exports.meshBounds=Se.meshBounds,exports.AdaptiveDpr=be.AdaptiveDpr,exports.AdaptiveEvents=Be.AdaptiveEvents;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./Billboard.cjs.js"),r=require("./Cloud.cjs.js"),s=require("./QuadraticBezierLine.cjs.js"),t=require("./CubicBezierLine.cjs.js"),o=require("./Line.cjs.js"),i=require("./PositionalAudio.cjs.js"),u=require("./Text.cjs.js"),a=require("./Environment.cjs.js"),c=require("./Effects.cjs.js"),j=require("./GradientTexture.cjs.js"),p=require("./Image.cjs.js"),n=require("./OrthographicCamera.cjs.js"),l=require("./PerspectiveCamera.cjs.js"),x=require("./CameraShake.cjs.js"),q=require("./CubeCamera.cjs.js"),d=require("./DeviceOrientationControls.cjs.js"),h=require("./FlyControls.cjs.js"),C=require("./MapControls.cjs.js"),m=require("./OrbitControls.cjs.js"),S=require("./TrackballControls.cjs.js"),b=require("./ArcballControls.cjs.js"),B=require("./TransformControls.cjs.js"),f=require("./PointerLockControls.cjs.js"),P=require("./FirstPersonControls.cjs.js"),T=require("./GizmoHelper.cjs.js"),g=require("./GizmoViewcube.cjs.js"),M=require("./GizmoViewport.cjs.js"),v=require("./useCubeTexture.cjs.js"),D=require("./useFBX.cjs.js"),L=require("./useGLTF.cjs.js"),A=require("./useProgress.cjs.js"),G=require("./useTexture.cjs.js"),w=require("./Reflector.cjs.js"),z=require("./Shadow.cjs.js"),k=require("./Stats.cjs.js"),F=require("./Center.cjs.js"),I=require("./Bounds.cjs.js"),O=require("./DepthBuffer.cjs.js"),E=require("./useDepthBuffer.cjs.js"),y=require("./useAspect.cjs.js"),H=require("./useCamera.cjs.js"),R=require("./useDetectGPU.cjs.js"),V=require("./useHelper.cjs.js"),Q=require("./useBVH.cjs.js"),W=require("./useContextBridge.cjs.js"),N=require("./useAnimations.cjs.js"),U=require("./useFBO.cjs.js"),X=require("./useIntersect.cjs.js"),K=require("./useSimplification.cjs.js"),_=require("./useTessellation.cjs.js"),J=require("./useEdgeSplit.cjs.js"),Y=require("./CurveModifier.cjs.js"),Z=require("./MeshDistortMaterial.cjs.js"),$=require("./MeshWobbleMaterial.cjs.js"),ee=require("./PointMaterial.cjs.js"),re=require("./shaderMaterial.cjs.js"),se=require("./Sky.cjs.js"),te=require("./softShadows.cjs.js"),oe=require("./Stars.cjs.js"),ie=require("./ContactShadows.cjs.js"),ue=require("./SpotLight.cjs.js"),ae=require("./shapes.cjs.js"),ce=require("./RoundedBox.cjs.js"),je=require("./ScreenQuad.cjs.js"),pe=require("./useMatcapTexture.cjs.js"),ne=require("./useNormalTexture.cjs.js"),le=require("./Stage.cjs.js"),xe=require("./Points.cjs.js"),qe=require("./Instances.cjs.js"),de=require("./Segments.cjs.js"),he=require("./Detailed.cjs.js"),Ce=require("./Preload.cjs.js"),me=require("./BakeShadows.cjs.js"),Se=require("./meshBounds.cjs.js"),be=require("./AdaptiveDpr.cjs.js"),Be=require("./AdaptiveEvents.cjs.js");require("@babel/runtime/helpers/extends"),require("react"),require("@react-three/fiber"),require("react-merge-refs"),require("../assets/cloud.base64.cjs.js"),require("three"),require("three-stdlib"),require("troika-three-text"),require("use-asset"),require("../helpers/environment-assets.cjs.js"),require("lodash.omit"),require("lodash.pick"),require("zustand"),require("../materials/MeshReflectorMaterial.cjs.js"),require("three/examples/js/libs/stats.min"),require("../helpers/useEffectfulState.cjs.js"),require("detect-gpu"),require("three-mesh-bvh"),require("../materials/SpotLightMaterial.cjs.js"),require("../helpers/matcap-assets.cjs.js"),require("../helpers/normal-assets.cjs.js"),require("../helpers/Position.cjs.js"),require("react-composer"),exports.Billboard=e.Billboard,exports.Cloud=r.Cloud,exports.QuadraticBezierLine=s.QuadraticBezierLine,exports.CubicBezierLine=t.CubicBezierLine,exports.Line=o.Line,exports.PositionalAudio=i.PositionalAudio,exports.Text=u.Text,exports.Environment=a.Environment,exports.Effects=c.Effects,exports.isWebGL2Available=c.isWebGL2Available,exports.GradientTexture=j.GradientTexture,exports.Image=p.Image,exports.OrthographicCamera=n.OrthographicCamera,exports.PerspectiveCamera=l.PerspectiveCamera,exports.CameraShake=x.CameraShake,exports.CubeCamera=q.CubeCamera,exports.DeviceOrientationControls=d.DeviceOrientationControls,exports.FlyControls=h.FlyControls,exports.MapControls=C.MapControls,exports.OrbitControls=m.OrbitControls,exports.TrackballControls=S.TrackballControls,exports.ArcballControls=b.ArcballControls,exports.TransformControls=B.TransformControls,exports.PointerLockControls=f.PointerLockControls,exports.FirstPersonControls=P.FirstPersonControls,exports.GizmoHelper=T.GizmoHelper,exports.useGizmoContext=T.useGizmoContext,exports.GizmoViewcube=g.GizmoViewcube,exports.GizmoViewport=M.GizmoViewport,exports.useCubeTexture=v.useCubeTexture,exports.useFBX=D.useFBX,exports.useGLTF=L.useGLTF,exports.useProgress=A.useProgress,exports.IsObject=G.IsObject,exports.useTexture=G.useTexture,exports.Reflector=w.Reflector,exports.Shadow=z.Shadow,exports.Stats=k.Stats,exports.Center=F.Center,exports.Bounds=I.Bounds,exports.useBounds=I.useBounds,exports.DepthBuffer=O.DepthBuffer,exports.useDepthBuffer=E.useDepthBuffer,exports.useAspect=y.useAspect,exports.useCamera=H.useCamera,exports.useDetectGPU=R.useDetectGPU,exports.useHelper=V.useHelper,exports.useBVH=Q.useBVH,exports.useContextBridge=W.useContextBridge,exports.useAnimations=N.useAnimations,exports.useFBO=U.useFBO,exports.useIntersect=X.useIntersect,exports.useSimplification=K.useSimplification,exports.useTessellation=_.useTessellation,exports.useEdgeSplit=J.useEdgeSplit,exports.CurveModifier=Y.CurveModifier,exports.MeshDistortMaterial=Z.MeshDistortMaterial,exports.MeshWobbleMaterial=$.MeshWobbleMaterial,exports.PointMaterial=ee.PointMaterial,exports.PointMaterialImpl=ee.PointMaterialImpl,exports.shaderMaterial=re.shaderMaterial,exports.Sky=se.Sky,exports.calcPosFromAngles=se.calcPosFromAngles,exports.softShadows=te.softShadows,exports.Stars=oe.Stars,exports.ContactShadows=ie.ContactShadows,exports.SpotLight=ue.SpotLight,exports.Box=ae.Box,exports.Circle=ae.Circle,exports.Cone=ae.Cone,exports.Cylinder=ae.Cylinder,exports.Dodecahedron=ae.Dodecahedron,exports.Extrude=ae.Extrude,exports.Icosahedron=ae.Icosahedron,exports.Lathe=ae.Lathe,exports.Octahedron=ae.Octahedron,exports.Parametric=ae.Parametric,exports.Plane=ae.Plane,exports.Polyhedron=ae.Polyhedron,exports.Ring=ae.Ring,exports.Sphere=ae.Sphere,exports.Tetrahedron=ae.Tetrahedron,exports.Torus=ae.Torus,exports.TorusKnot=ae.TorusKnot,exports.Tube=ae.Tube,exports.RoundedBox=ce.RoundedBox,exports.ScreenQuad=je.ScreenQuad,exports.useMatcapTexture=pe.useMatcapTexture,exports.useNormalTexture=ne.useNormalTexture,exports.Stage=le.Stage,exports.Point=xe.Point,exports.Points=xe.Points,exports.PointsBuffer=xe.PointsBuffer,exports.Instance=qe.Instance,exports.Instances=qe.Instances,exports.Merged=qe.Merged,exports.Segment=de.Segment,exports.Segments=de.Segments,exports.Detailed=he.Detailed,exports.Preload=Ce.Preload,exports.BakeShadows=me.BakeShadows,exports.meshBounds=Se.meshBounds,exports.AdaptiveDpr=be.AdaptiveDpr,exports.AdaptiveEvents=Be.AdaptiveEvents;
package/core/index.js CHANGED
@@ -65,7 +65,7 @@ export { ScreenQuad } from './ScreenQuad.js';
65
65
  export { useMatcapTexture } from './useMatcapTexture.js';
66
66
  export { useNormalTexture } from './useNormalTexture.js';
67
67
  export { Stage } from './Stage.js';
68
- export { Point, Points } from './Points.js';
68
+ export { Point, Points, PointsBuffer } from './Points.js';
69
69
  export { Instance, Instances, Merged } from './Instances.js';
70
70
  export { Segment, Segments } from './Segments.js';
71
71
  export { Detailed } from './Detailed.js';
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber"),u=require("./useFBO.cjs.js");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 u=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,u.get?u:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var s=n(r);exports.useDepthBuffer=function(r=256){const n=t.useThree((e=>e.viewport.dpr)),{width:c,height:i}=t.useThree((e=>e.size)),o=r||c*n,a=r||i*n,f=s.useMemo((()=>{const r=new e.DepthTexture(o,a);return r.format=e.DepthFormat,r.type=e.UnsignedShortType,{depthTexture:r}}),[o,a]),p=u.useFBO(o,a,f);return t.useFrame((e=>{e.gl.setRenderTarget(p),e.gl.render(e.scene,e.camera),e.gl.setRenderTarget(null)})),p.depthTexture};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber"),u=require("./useFBO.cjs.js");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 u=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,u.get?u:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var s=n(r);exports.useDepthBuffer=function({size:r=256,frames:n=1/0}={}){const c=t.useThree((e=>e.viewport.dpr)),{width:i,height:o}=t.useThree((e=>e.size)),a=r||i*c,f=r||o*c,p=s.useMemo((()=>{const r=new e.DepthTexture(a,f);return r.format=e.DepthFormat,r.type=e.UnsignedShortType,{depthTexture:r}}),[a,f]);let d=0;const h=u.useFBO(a,f,p);return t.useFrame((e=>{(n===1/0||d<n)&&(e.gl.setRenderTarget(h),e.gl.render(e.scene,e.camera),e.gl.setRenderTarget(null),d++)})),h.depthTexture};
@@ -1,3 +1,6 @@
1
1
  import { DepthTexture } from 'three';
2
- declare function useDepthBuffer(size?: number): DepthTexture;
2
+ declare function useDepthBuffer({ size, frames }?: {
3
+ size?: number;
4
+ frames?: number;
5
+ }): DepthTexture;
3
6
  export { useDepthBuffer };
@@ -3,7 +3,10 @@ import * as React from 'react';
3
3
  import { useThree, useFrame } from '@react-three/fiber';
4
4
  import { useFBO } from './useFBO.js';
5
5
 
6
- function useDepthBuffer(size = 256) {
6
+ function useDepthBuffer({
7
+ size = 256,
8
+ frames = Infinity
9
+ } = {}) {
7
10
  const dpr = useThree(state => state.viewport.dpr);
8
11
  const {
9
12
  width,
@@ -19,11 +22,15 @@ function useDepthBuffer(size = 256) {
19
22
  depthTexture
20
23
  };
21
24
  }, [w, h]);
25
+ let count = 0;
22
26
  const depthFBO = useFBO(w, h, depthConfig);
23
27
  useFrame(state => {
24
- state.gl.setRenderTarget(depthFBO);
25
- state.gl.render(state.scene, state.camera);
26
- state.gl.setRenderTarget(null);
28
+ if (frames === Infinity || count < frames) {
29
+ state.gl.setRenderTarget(depthFBO);
30
+ state.gl.render(state.scene, state.camera);
31
+ state.gl.setRenderTarget(null);
32
+ count++;
33
+ }
27
34
  });
28
35
  return depthFBO.depthTexture;
29
36
  }
@@ -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("../helpers/normal-assets.cjs.js");function a(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 n=a(e);const o=s.normalsList[0];exports.useNormalTexture=function(e=0,a={}){const{repeat:c=[1,1],anisotropy:u=1,offset:f=[0,0]}=a,i=n.useMemo((()=>Object.keys(s.normalsList).length),[]),p=`https://rawcdn.githack.com/emmelleppi/normal-maps/f24c810fc1d86b5b1e5dfea914b668f70b5f2923/normals/${s.normalsList[e]||o}`,l=r.useTexture(p);return n.useEffect((()=>{l&&(l.wrapS=l.wrapT=t.RepeatWrapping,l.repeat=new t.Vector2(c[0],c[1]),l.offset=new t.Vector2(f[0],f[1]),l.anisotropy=u)}),[l,u,c,f]),[l,p,i]};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("./useTexture.cjs.js"),t=require("three"),s=require("../helpers/normal-assets.cjs.js");function a(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 o=a(e);const n=s.normalsList[0];exports.useNormalTexture=function(e=0,a={}){const{repeat:u=[1,1],anisotropy:c=1,offset:f=[0,0]}=a,i=o.useMemo((()=>Object.keys(s.normalsList).length),[]),p=`https://rawcdn.githack.com/emmelleppi/normal-maps/f24c810fc1d86b5b1e5dfea914b668f70b5f2923/normals/${s.normalsList[e]||n}`,l=r.useTexture(p);return o.useLayoutEffect((()=>{l&&(l.wrapS=l.wrapT=t.RepeatWrapping,l.repeat=new t.Vector2(u[0],u[1]),l.offset=new t.Vector2(f[0],f[1]),l.anisotropy=c)}),[l,c,u,f]),[l,p,i]};
@@ -15,7 +15,7 @@ function useNormalTexture(id = 0, settings = {}) {
15
15
  const imageName = normalsList[id] || DEFAULT_NORMAL;
16
16
  const url = `${NORMAL_ROOT}/normals/${imageName}`;
17
17
  const normalTexture = useTexture(url);
18
- React.useEffect(() => {
18
+ React.useLayoutEffect(() => {
19
19
  if (!normalTexture) return;
20
20
  normalTexture.wrapS = normalTexture.wrapT = RepeatWrapping;
21
21
  normalTexture.repeat = new Vector2(repeat[0], repeat[1]);
@@ -5,7 +5,7 @@ import { useEffect } from 'react';
5
5
  const IsObject = url => url === Object(url) && !Array.isArray(url) && typeof url !== 'function';
6
6
  function useTexture(input) {
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/2269
8
+ const textures = useLoader(TextureLoader, IsObject(input) ? Object.values(input) : input); // https://github.com/mrdoob/three.js/issues/22696
9
9
  // Upload the texture to the GPU immediately instead of waiting for the first render
10
10
 
11
11
  useEffect(() => {