@react-three/drei 7.20.4 → 7.20.5

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("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),n=require("@react-three/fiber"),o=require("three-stdlib");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}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 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 i=s(e),c=a(t),u=a(r);const l=u.createContext(null),f=e=>e instanceof c.Vector3?e.toArray():e,d=u.forwardRef(((e,t)=>{const{limit:r=1e3,lineWidth:s=1,children:a,...d}=e,[m,b]=u.useState([]),[g]=u.useState((()=>new o.Line2)),[h]=u.useState((()=>new o.LineMaterial)),[p]=u.useState((()=>new o.LineSegmentsGeometry)),[v]=u.useState((()=>new c.Vector2(512,512))),[j]=u.useState((()=>Array(r).fill(0))),[y]=u.useState((()=>Array(r).fill(1))),S=u.useMemo((()=>({subscribe:e=>(b((t=>[...t,e])),()=>b((t=>t.filter((t=>t.current!==e.current)))))})),[]);return n.useFrame((()=>{j.length=6*m.length,y.length=6*m.length,m.forEach(((e,t)=>{const r=e.current;if(r){const e=f(r.start),s=f(r.end),a=(o=r.color)instanceof c.Color?o.toArray():o;for(var n=0;n<3;n++)j[6*t+n]=e[n],j[6*t+n+3]=s[n],y[6*t+n]=a[n],y[6*t+n+3]=a[n]}var o})),p.setColors(y),p.setPositions(j),g.computeLineDistances()})),u.createElement("primitive",{object:g,ref:t},u.createElement("primitive",{object:p,attach:"geometry"}),u.createElement("primitive",i.default({object:h,attach:"material",vertexColors:!0,resolution:v,linewidth:s},d)),u.createElement(l.Provider,{value:S},a))})),m=u.forwardRef(((e,t)=>{const{start:r,end:n,color:o}=e,s=u.useContext(l);if(!s)throw"Segment must used inside Segments component.";const a=u.useRef({start:[0,0,0],end:[0,0,0],color:[1,1,1]});return u.useLayoutEffect((()=>s.subscribe(t||a)),[]),u.useLayoutEffect((()=>{var e=t||a;r&&Object.assign(e.current,{start:r}),n&&Object.assign(e.current,{end:n}),o&&Object.assign(e.current,{color:o})}),[r,n,o]),null}));exports.Segment=m,exports.Segments=d;
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-merge-refs"),o=require("@react-three/fiber"),i=require("three-stdlib");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}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 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=s(e),u=a(t),l=a(r),f=s(n);const m=l.createContext(null),d=e=>e instanceof u.Vector3?e.toArray():e,b=l.forwardRef(((e,t)=>{const{limit:r=1e3,lineWidth:n=1,children:s,...a}=e,[f,b]=l.useState([]),[h]=l.useState((()=>new i.Line2)),[v]=l.useState((()=>new i.LineMaterial)),[p]=l.useState((()=>new i.LineSegmentsGeometry)),[w]=l.useState((()=>new u.Vector2(512,512))),[S]=l.useState((()=>Array(6*r).fill(0))),[g]=l.useState((()=>Array(6*r).fill(0))),j=l.useMemo((()=>({subscribe:e=>(b((t=>[...t,e])),()=>b((t=>t.filter((t=>t.current!==e.current)))))})),[]);return o.useFrame((()=>{for(let o=0;o<r;o++){var e;const r=null==(e=f[o])?void 0:e.current,i=r?d(r.start):[0,0,0],s=r?d(r.end):[0,0,0],a=r?(n=r.color)instanceof u.Color?n.toArray():n:[1,1,1];for(var t=0;t<3;t++)S[6*o+t]=i[t],S[6*o+t+3]=s[t],g[6*o+t]=a[t],g[6*o+t+3]=a[t]}var n;p.setColors(g),p.setPositions(S),h.computeLineDistances()})),l.createElement("primitive",{object:h,ref:t},l.createElement("primitive",{object:p,attach:"geometry"}),l.createElement("primitive",c.default({object:v,attach:"material",vertexColors:!0,resolution:w,linewidth:n},a)),l.createElement(m.Provider,{value:j},s))}));class h{constructor(){this.color=new u.Color("white"),this.start=new u.Vector3(0,0,0),this.end=new u.Vector3(0,0,0)}}const v=l.forwardRef(((e,t)=>{const r=l.useContext(m);if(!r)throw"Segment must used inside Segments component.";const n=l.useRef();return l.useMemo((()=>o.extend({SegmentObject:h})),[]),l.useLayoutEffect((()=>r.subscribe(n)),[]),l.createElement("segmentObject",c.default({ref:f.default([n,t])},e))}));exports.Segment=v,exports.Segments=b;
@@ -1,5 +1,6 @@
1
1
  import * as THREE from 'three';
2
2
  import * as React from 'react';
3
+ import { ReactThreeFiber } from '@react-three/fiber';
3
4
  import { Line2 } from 'three-stdlib';
4
5
  declare type SegmentsProps = {
5
6
  limit?: number;
@@ -7,10 +8,24 @@ declare type SegmentsProps = {
7
8
  children: React.ReactNode;
8
9
  };
9
10
  declare type Segment = {
10
- start: THREE.Vector3 | [number, number, number];
11
- end: THREE.Vector3 | [number, number, number];
12
- color?: THREE.Color | [number, number, number];
11
+ start: THREE.Vector3;
12
+ end: THREE.Vector3;
13
+ color?: THREE.Color;
13
14
  };
15
+ declare type SegmentProps = JSX.IntrinsicElements['segmentObject'] & Segment;
14
16
  declare const Segments: React.ForwardRefExoticComponent<SegmentsProps & React.RefAttributes<Line2>>;
15
- declare const Segment: React.ForwardRefExoticComponent<Segment & React.RefAttributes<Segment>>;
17
+ declare global {
18
+ namespace JSX {
19
+ interface IntrinsicElements {
20
+ segmentObject: ReactThreeFiber.Object3DNode<SegmentObject, typeof SegmentObject>;
21
+ }
22
+ }
23
+ }
24
+ declare class SegmentObject {
25
+ color: THREE.Color;
26
+ start: THREE.Vector3;
27
+ end: THREE.Vector3;
28
+ constructor();
29
+ }
30
+ declare const Segment: React.ForwardRefExoticComponent<Pick<SegmentProps, "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "color" | "onClick" | "onContextMenu" | "onDoubleClick" | "onPointerDown" | "onPointerMove" | "onPointerUp" | "onPointerCancel" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOut" | "onWheel" | "onPointerMissed" | "end" | "start"> & React.RefAttributes<Segment>>;
16
31
  export { Segments, Segment };
package/core/Segments.js CHANGED
@@ -1,7 +1,8 @@
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 } from '@react-three/fiber';
4
+ import mergeRefs from 'react-merge-refs';
5
+ import { useFrame, extend } from '@react-three/fiber';
5
6
  import { Line2, LineMaterial, LineSegmentsGeometry } from 'three-stdlib';
6
7
 
7
8
  const context = /*#__PURE__*/React.createContext(null);
@@ -22,8 +23,8 @@ const Segments = /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
22
23
  const [material] = React.useState(() => new LineMaterial());
23
24
  const [geometry] = React.useState(() => new LineSegmentsGeometry());
24
25
  const [resolution] = React.useState(() => new THREE.Vector2(512, 512));
25
- const [positions] = React.useState(() => Array(limit).fill(0));
26
- const [colors] = React.useState(() => Array(limit).fill(1));
26
+ const [positions] = React.useState(() => Array(limit * 6).fill(0));
27
+ const [colors] = React.useState(() => Array(limit * 6).fill(0));
27
28
  const api = React.useMemo(() => ({
28
29
  subscribe: ref => {
29
30
  setSegments(segments => [...segments, ref]);
@@ -31,24 +32,22 @@ const Segments = /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
31
32
  }
32
33
  }), []);
33
34
  useFrame(() => {
34
- positions.length = segments.length * 6;
35
- colors.length = segments.length * 6;
36
- segments.forEach((segmentRef, i) => {
37
- const segment = segmentRef.current;
35
+ for (let i = 0; i < limit; i++) {
36
+ var _segments$i;
38
37
 
39
- if (segment) {
40
- const segmentStart = arrPos(segment.start);
41
- const segmentEnd = arrPos(segment.end);
42
- const segmentColor = arrColor(segment.color);
38
+ const segment = (_segments$i = segments[i]) == null ? void 0 : _segments$i.current;
39
+ const segmentStart = segment ? arrPos(segment.start) : [0, 0, 0];
40
+ const segmentEnd = segment ? arrPos(segment.end) : [0, 0, 0];
41
+ const segmentColor = segment ? arrColor(segment.color) : [1, 1, 1]; //console.log(segmentStart, segmentEnd, segmentColor)
43
42
 
44
- for (var j = 0; j < 3; j++) {
45
- positions[i * 6 + j] = segmentStart[j];
46
- positions[i * 6 + j + 3] = segmentEnd[j];
47
- colors[i * 6 + j] = segmentColor[j];
48
- colors[i * 6 + j + 3] = segmentColor[j];
49
- }
43
+ for (var j = 0; j < 3; j++) {
44
+ positions[i * 6 + j] = segmentStart[j];
45
+ positions[i * 6 + j + 3] = segmentEnd[j];
46
+ colors[i * 6 + j] = segmentColor[j];
47
+ colors[i * 6 + j + 3] = segmentColor[j];
50
48
  }
51
- });
49
+ }
50
+
52
51
  geometry.setColors(colors);
53
52
  geometry.setPositions(positions);
54
53
  line.computeLineDistances();
@@ -69,33 +68,27 @@ const Segments = /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
69
68
  value: api
70
69
  }, children));
71
70
  });
71
+
72
+ class SegmentObject {
73
+ constructor() {
74
+ this.color = new THREE.Color('white');
75
+ this.start = new THREE.Vector3(0, 0, 0);
76
+ this.end = new THREE.Vector3(0, 0, 0);
77
+ }
78
+
79
+ }
80
+
72
81
  const Segment = /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
73
- const {
74
- start,
75
- end,
76
- color
77
- } = props;
78
82
  const api = React.useContext(context);
79
83
  if (!api) throw 'Segment must used inside Segments component.';
80
- const ref = React.useRef({
81
- start: [0, 0, 0],
82
- end: [0, 0, 0],
83
- color: [1, 1, 1]
84
- });
85
- React.useLayoutEffect(() => api.subscribe(forwardedRef || ref), []);
86
- React.useLayoutEffect(() => {
87
- var currRef = forwardedRef || ref;
88
- start && Object.assign(currRef.current, {
89
- start
90
- });
91
- end && Object.assign(currRef.current, {
92
- end
93
- });
94
- color && Object.assign(currRef.current, {
95
- color
96
- });
97
- }, [start, end, color]);
98
- return null;
84
+ const ref = React.useRef();
85
+ React.useMemo(() => extend({
86
+ SegmentObject
87
+ }), []);
88
+ React.useLayoutEffect(() => api.subscribe(ref), []);
89
+ return /*#__PURE__*/React.createElement("segmentObject", _extends({
90
+ ref: mergeRefs([ref, forwardedRef])
91
+ }, props));
99
92
  });
100
93
 
101
94
  export { Segment, Segments };