@react-three/drei 9.0.0-beta.3 → 9.0.0-beta.4

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.
Files changed (107) hide show
  1. package/README.md +293 -26
  2. package/core/ArcballControls.cjs.js +1 -1
  3. package/core/ArcballControls.js +13 -25
  4. package/core/Bounds.cjs.js +1 -1
  5. package/core/Bounds.d.ts +2 -1
  6. package/core/Bounds.js +25 -14
  7. package/core/Clone.cjs.js +1 -0
  8. package/core/Clone.d.ts +11 -0
  9. package/core/Clone.js +92 -0
  10. package/core/Cloud.cjs.js +1 -1
  11. package/core/Cloud.d.ts +3 -1
  12. package/core/Cloud.js +4 -1
  13. package/core/ComputedAttribute.cjs.js +1 -0
  14. package/core/ComputedAttribute.d.ts +9 -0
  15. package/core/ComputedAttribute.js +34 -0
  16. package/core/ContactShadows.cjs.js +1 -1
  17. package/core/ContactShadows.d.ts +3 -1
  18. package/core/ContactShadows.js +15 -2
  19. package/core/CubeCamera.cjs.js +1 -1
  20. package/core/CubeCamera.js +6 -6
  21. package/core/DeviceOrientationControls.cjs.js +1 -1
  22. package/core/DeviceOrientationControls.js +2 -6
  23. package/core/Effects.cjs.js +1 -1
  24. package/core/Effects.d.ts +3 -2
  25. package/core/Effects.js +2 -2
  26. package/core/Environment.cjs.js +1 -1
  27. package/core/Environment.d.ts +13 -3
  28. package/core/Environment.js +96 -33
  29. package/core/FirstPersonControls.cjs.js +1 -1
  30. package/core/FirstPersonControls.js +2 -6
  31. package/core/Float.cjs.js +1 -1
  32. package/core/Float.d.ts +1 -1
  33. package/core/Float.js +5 -4
  34. package/core/GizmoHelper.cjs.js +1 -1
  35. package/core/GizmoHelper.d.ts +2 -1
  36. package/core/GizmoHelper.js +31 -41
  37. package/core/Image.cjs.js +1 -1
  38. package/core/Image.d.ts +5 -3
  39. package/core/Image.js +6 -1
  40. package/core/Instances.cjs.js +1 -1
  41. package/core/Instances.d.ts +1 -1
  42. package/core/Instances.js +5 -11
  43. package/core/Lightformer.cjs.js +1 -0
  44. package/core/Lightformer.d.ts +41 -0
  45. package/core/Lightformer.js +51 -0
  46. package/core/MeshReflectorMaterial.cjs.js +1 -1
  47. package/core/MeshReflectorMaterial.d.ts +1 -2
  48. package/core/MeshReflectorMaterial.js +4 -5
  49. package/core/OrbitControls.cjs.js +1 -1
  50. package/core/OrbitControls.js +18 -31
  51. package/core/PointMaterial.cjs.js +1 -1
  52. package/core/PointMaterial.d.ts +5 -8
  53. package/core/PointMaterial.js +16 -34
  54. package/core/PointerLockControls.cjs.js +1 -1
  55. package/core/PointerLockControls.d.ts +3 -1
  56. package/core/PointerLockControls.js +36 -22
  57. package/core/Points.cjs.js +1 -1
  58. package/core/Points.d.ts +3 -3
  59. package/core/Points.js +11 -30
  60. package/core/Reflector.d.ts +1 -1
  61. package/core/Sampler.cjs.js +1 -0
  62. package/core/Sampler.d.ts +21 -0
  63. package/core/Sampler.js +65 -0
  64. package/core/SpotLight.d.ts +1 -1
  65. package/core/Stage.cjs.js +1 -1
  66. package/core/Stage.js +1 -2
  67. package/core/Stars.cjs.js +1 -1
  68. package/core/Stars.js +3 -0
  69. package/core/Stats.cjs.js +1 -1
  70. package/core/Stats.js +1 -1
  71. package/core/Text.cjs.js +1 -1
  72. package/core/Text.d.ts +2 -1
  73. package/core/Text.js +3 -2
  74. package/core/TrackballControls.cjs.js +1 -1
  75. package/core/TrackballControls.js +7 -5
  76. package/core/Trail.cjs.js +1 -0
  77. package/core/Trail.d.ts +21 -0
  78. package/core/Trail.js +160 -0
  79. package/core/TransformControls.cjs.js +1 -1
  80. package/core/TransformControls.js +7 -13
  81. package/core/index.cjs.js +1 -1
  82. package/core/index.d.ts +6 -0
  83. package/core/index.js +9 -2
  84. package/core/useBoxProjectedEnv.cjs.js +1 -0
  85. package/core/useBoxProjectedEnv.d.ts +8 -0
  86. package/core/useBoxProjectedEnv.js +98 -0
  87. package/core/useFBO.cjs.js +1 -1
  88. package/core/useFBO.d.ts +1 -1
  89. package/core/useFBO.js +22 -24
  90. package/core/useGLTF.d.ts +1 -1
  91. package/core/useHelper.d.ts +3 -1
  92. package/index.cjs.js +1 -1
  93. package/index.js +7 -1
  94. package/materials/ConvolutionMaterial.cjs.js +1 -1
  95. package/materials/ConvolutionMaterial.js +2 -0
  96. package/materials/MeshReflectorMaterial.cjs.js +1 -1
  97. package/materials/MeshReflectorMaterial.d.ts +0 -3
  98. package/materials/MeshReflectorMaterial.js +8 -34
  99. package/materials/SpotLightMaterial.cjs.js +1 -1
  100. package/materials/SpotLightMaterial.js +3 -0
  101. package/native/index.cjs.js +1 -1
  102. package/native/index.js +9 -2
  103. package/package.json +6 -5
  104. package/web/ScrollControls.cjs.js +1 -1
  105. package/web/ScrollControls.js +2 -2
  106. package/web/index.cjs.js +1 -1
  107. package/web/index.js +9 -2
@@ -1,10 +1,9 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import { useThree, useFrame } from '@react-three/fiber';
3
3
  import * as React from 'react';
4
- import { forwardRef, useMemo, useEffect } from 'react';
5
4
  import { OrbitControls as OrbitControls$1 } from 'three-stdlib';
6
5
 
7
- const OrbitControls = /*#__PURE__*/forwardRef(({
6
+ const OrbitControls = /*#__PURE__*/React.forwardRef(({
8
7
  makeDefault,
9
8
  camera,
10
9
  regress,
@@ -15,52 +14,40 @@ const OrbitControls = /*#__PURE__*/forwardRef(({
15
14
  onEnd,
16
15
  ...restProps
17
16
  }, ref) => {
18
- const invalidate = useThree(({
19
- invalidate
20
- }) => invalidate);
21
- const defaultCamera = useThree(({
22
- camera
23
- }) => camera);
24
- const gl = useThree(({
25
- gl
26
- }) => gl);
27
- const events = useThree(({
28
- events
29
- }) => events);
30
- const set = useThree(({
31
- set
32
- }) => set);
33
- const get = useThree(({
34
- get
35
- }) => get);
36
- const performance = useThree(({
37
- performance
38
- }) => performance);
17
+ const invalidate = useThree(state => state.invalidate);
18
+ const defaultCamera = useThree(state => state.camera);
19
+ const gl = useThree(state => state.gl);
20
+ const events = useThree(state => state.events);
21
+ const set = useThree(state => state.set);
22
+ const get = useThree(state => state.get);
23
+ const performance = useThree(state => state.performance);
39
24
  const explCamera = camera || defaultCamera;
40
- const explDomElement = domElement || (typeof events.connected !== 'boolean' ? events.connected : gl.domElement);
41
- const controls = useMemo(() => new OrbitControls$1(explCamera), [explCamera]);
25
+ const explDomElement = domElement || events.connected || gl.domElement;
26
+ const controls = React.useMemo(() => new OrbitControls$1(explCamera), [explCamera]);
42
27
  useFrame(() => {
43
28
  if (controls.enabled) controls.update();
44
29
  });
45
- useEffect(() => {
30
+ React.useEffect(() => {
31
+ controls.connect(explDomElement);
32
+ return () => void controls.dispose();
33
+ }, [explDomElement, regress, controls, invalidate]);
34
+ React.useEffect(() => {
46
35
  const callback = e => {
47
36
  invalidate();
48
37
  if (regress) performance.regress();
49
38
  if (onChange) onChange(e);
50
39
  };
51
40
 
52
- controls.connect(explDomElement);
53
41
  controls.addEventListener('change', callback);
54
42
  if (onStart) controls.addEventListener('start', onStart);
55
43
  if (onEnd) controls.addEventListener('end', onEnd);
56
44
  return () => {
57
- controls.removeEventListener('change', callback);
58
45
  if (onStart) controls.removeEventListener('start', onStart);
59
46
  if (onEnd) controls.removeEventListener('end', onEnd);
60
- controls.dispose();
47
+ controls.removeEventListener('change', callback);
61
48
  };
62
- }, [explDomElement, onChange, onStart, onEnd, regress, controls, invalidate]);
63
- useEffect(() => {
49
+ }, [onChange, onStart, onEnd]);
50
+ React.useEffect(() => {
64
51
  if (makeDefault) {
65
52
  const old = get().controls;
66
53
  set({
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),t=require("react");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(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 a=n(e),i=o(r),l=o(t);class c extends i.ShaderMaterial{constructor(){super({transparent:!0,uniforms:{size:{value:1}},vertexShader:i.ShaderLib.points.vertexShader,fragmentShader:"\n varying vec3 vColor;\n void main() {\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\n float r = dot(cxy, cxy);\n float delta = fwidth(r);\n vec3 color = vColor;\n #ifdef TONE_MAPPING\n color = toneMapping(color);\n #endif\n gl_FragColor = linearToOutputTexel(vec4(color, 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r)));\n }",vertexColors:!0})}get scale(){return this.uniforms.size.value}set scale(e){this.uniforms.size.value=e}}const u=l.forwardRef(((e,r)=>{const[t]=l.useState((()=>new c));return l.createElement("primitive",a.default({object:t,ref:r,attach:"material"},e))}));exports.PointMaterial=u,exports.PointMaterialImpl=c;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react");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 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),l=n(t),u=n(r);class c extends l.PointsMaterial{constructor(e){super(e),this.onBeforeCompile=e=>{e.fragmentShader=e.fragmentShader.replace("#include <output_fragment>","\n #include <output_fragment>\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\n float r = dot(cxy, cxy);\n float delta = fwidth(r); \n float mask = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\n gl_FragColor = vec4(gl_FragColor.rgb, mask * gl_FragColor.a );\n ")}}}const i=u.forwardRef(((e,t)=>{const[r]=u.useState((()=>new c(null)));return u.createElement("primitive",o.default({},e,{object:r,ref:t,attach:"material"}))}));exports.PointMaterial=i,exports.PointMaterialImpl=c;
@@ -1,8 +1,7 @@
1
1
  import * as THREE from 'three';
2
2
  import * as React from 'react';
3
- declare type PointMaterialType = JSX.IntrinsicElements['shaderMaterial'] & {
4
- scale?: number;
5
- };
3
+ import { PrimitiveProps } from '@react-three/fiber';
4
+ declare type PointMaterialType = JSX.IntrinsicElements['pointsMaterial'];
6
5
  declare global {
7
6
  namespace JSX {
8
7
  interface IntrinsicElements {
@@ -10,10 +9,8 @@ declare global {
10
9
  }
11
10
  }
12
11
  }
13
- export declare class PointMaterialImpl extends THREE.ShaderMaterial {
14
- constructor();
15
- get scale(): any;
16
- set scale(v: any);
12
+ export declare class PointMaterialImpl extends THREE.PointsMaterial {
13
+ constructor(props: any);
17
14
  }
18
- export declare const PointMaterial: React.ForwardRefExoticComponent<React.RefAttributes<unknown>>;
15
+ export declare const PointMaterial: React.ForwardRefExoticComponent<Pick<Omit<PrimitiveProps, "object" | "attach">, string | number> & React.RefAttributes<PointMaterialImpl>>;
19
16
  export {};
@@ -2,48 +2,30 @@ import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import * as THREE from 'three';
3
3
  import * as React from 'react';
4
4
 
5
- class PointMaterialImpl extends THREE.ShaderMaterial {
6
- constructor() {
7
- super({
8
- transparent: true,
9
- uniforms: {
10
- size: {
11
- value: 1
12
- }
13
- },
14
- vertexShader: THREE.ShaderLib.points.vertexShader,
15
- fragmentShader: `
16
- varying vec3 vColor;
17
- void main() {
18
- vec2 cxy = 2.0 * gl_PointCoord - 1.0;
19
- float r = dot(cxy, cxy);
20
- float delta = fwidth(r);
21
- vec3 color = vColor;
22
- #ifdef TONE_MAPPING
23
- color = toneMapping(color);
24
- #endif
25
- gl_FragColor = linearToOutputTexel(vec4(color, 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r)));
26
- }`,
27
- vertexColors: true
28
- });
29
- }
30
-
31
- get scale() {
32
- return this.uniforms.size.value;
33
- }
5
+ class PointMaterialImpl extends THREE.PointsMaterial {
6
+ constructor(props) {
7
+ super(props);
34
8
 
35
- set scale(v) {
36
- this.uniforms.size.value = v;
9
+ this.onBeforeCompile = shader => {
10
+ shader.fragmentShader = shader.fragmentShader.replace('#include <output_fragment>', `
11
+ #include <output_fragment>
12
+ vec2 cxy = 2.0 * gl_PointCoord - 1.0;
13
+ float r = dot(cxy, cxy);
14
+ float delta = fwidth(r);
15
+ float mask = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);
16
+ gl_FragColor = vec4(gl_FragColor.rgb, mask * gl_FragColor.a );
17
+ `);
18
+ };
37
19
  }
38
20
 
39
21
  }
40
22
  const PointMaterial = /*#__PURE__*/React.forwardRef((props, ref) => {
41
- const [material] = React.useState(() => new PointMaterialImpl());
42
- return /*#__PURE__*/React.createElement("primitive", _extends({
23
+ const [material] = React.useState(() => new PointMaterialImpl(null));
24
+ return /*#__PURE__*/React.createElement("primitive", _extends({}, props, {
43
25
  object: material,
44
26
  ref: ref,
45
27
  attach: "material"
46
- }, props));
28
+ }));
47
29
  });
48
30
 
49
31
  export { PointMaterial, PointMaterialImpl };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("@react-three/fiber"),n=require("react"),r=require("three-stdlib");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var u=l(e),c=o(n);const i=c.forwardRef((({selector:e,onChange:n,onLock:l,onUnlock:o,...i},a)=>{const{camera:d,...s}=i,f=t.useThree((({gl:e})=>e)),v=t.useThree((({camera:e})=>e)),E=t.useThree((({invalidate:e})=>e)),L=d||v,[m]=c.useState((()=>new r.PointerLockControls(L,f.domElement)));return c.useEffect((()=>{const e=e=>{E(),n&&n(e)};return null==m||null==m.addEventListener||m.addEventListener("change",e),l&&(null==m||null==m.addEventListener||m.addEventListener("lock",l)),o&&(null==m||null==m.addEventListener||m.addEventListener("unlock",o)),()=>{null==m||null==m.removeEventListener||m.removeEventListener("change",e),l&&(null==m||null==m.addEventListener||m.addEventListener("lock",l)),o&&(null==m||null==m.addEventListener||m.addEventListener("unlock",o))}}),[n,l,o,m,E]),c.useEffect((()=>{const t=()=>null==m?void 0:m.lock(),n=e?Array.from(document.querySelectorAll(e)):[document];return n.forEach((e=>e&&e.addEventListener("click",t))),()=>{n.forEach((e=>e?e.removeEventListener("click",t):void 0))}}),[m,e]),m?c.createElement("primitive",u.default({ref:a,dispose:void 0,object:m},s)):null}));exports.PointerLockControls=i;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("@react-three/fiber"),r=require("react"),n=require("three-stdlib");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(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 s=o(e),u=c(r);const a=u.forwardRef((({domElement:e,selector:r,onChange:o,onLock:c,onUnlock:a,enabled:i=!0,...f},d)=>{const{camera:l,...v}=f,m=t.useThree((({gl:e})=>e)),h=t.useThree((e=>e.camera)),E=t.useThree((e=>e.invalidate)),b=t.useThree((e=>e.raycaster)),k=t.useThree((e=>e.events)),p=l||h,L=e||k.connected||m.domElement,[g]=u.useState((()=>new n.PointerLockControls(p)));return u.useEffect((()=>{if(i){g.connect(L);const e=b.computeOffsets;return b.computeOffsets=e=>({offsetX:e.target.width/2,offsetY:e.target.height/2}),()=>{g.disconnect(),b.computeOffsets=e}}}),[i,g]),u.useEffect((()=>{const e=e=>{E(),o&&o(e)};g.addEventListener("change",e),c&&g.addEventListener("lock",c),a&&g.addEventListener("unlock",a);const t=()=>g.lock(),n=r?Array.from(document.querySelectorAll(r)):[document];return n.forEach((e=>e&&e.addEventListener("click",t))),()=>{g.removeEventListener("change",e),c&&g.addEventListener("lock",c),a&&g.addEventListener("unlock",a),n.forEach((e=>e?e.removeEventListener("click",t):void 0))}}),[o,c,a,r]),u.createElement("primitive",s.default({ref:d,object:g},v))}));exports.PointerLockControls=a;
@@ -3,10 +3,12 @@ import * as React from 'react';
3
3
  import * as THREE from 'three';
4
4
  import { PointerLockControls as PointerLockControlsImpl } from 'three-stdlib';
5
5
  export declare type PointerLockControlsProps = ReactThreeFiber.Object3DNode<PointerLockControlsImpl, typeof PointerLockControlsImpl> & {
6
+ domElement?: HTMLElement;
6
7
  selector?: string;
8
+ enabled?: boolean;
7
9
  camera?: THREE.Camera;
8
10
  onChange?: (e?: THREE.Event) => void;
9
11
  onLock?: (e?: THREE.Event) => void;
10
12
  onUnlock?: (e?: THREE.Event) => void;
11
13
  };
12
- export declare const PointerLockControls: React.ForwardRefExoticComponent<Pick<PointerLockControlsProps, "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "onChange" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "camera" | "connect" | "disconnect" | "domElement" | "minPolarAngle" | "maxPolarAngle" | "isLocked" | "getDirection" | "moveForward" | "moveRight" | "lock" | "unlock" | "selector" | "onLock" | "onUnlock"> & React.RefAttributes<PointerLockControlsImpl>>;
14
+ export declare const PointerLockControls: React.ForwardRefExoticComponent<Pick<PointerLockControlsProps, "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "onChange" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "camera" | "enabled" | "connect" | "disconnect" | "domElement" | "minPolarAngle" | "maxPolarAngle" | "isLocked" | "getDirection" | "moveForward" | "moveRight" | "lock" | "unlock" | "selector" | "onLock" | "onUnlock"> & React.RefAttributes<PointerLockControlsImpl>>;
@@ -4,10 +4,12 @@ import * as React from 'react';
4
4
  import { PointerLockControls as PointerLockControls$1 } from 'three-stdlib';
5
5
 
6
6
  const PointerLockControls = /*#__PURE__*/React.forwardRef(({
7
+ domElement,
7
8
  selector,
8
9
  onChange,
9
10
  onLock,
10
11
  onUnlock,
12
+ enabled = true,
11
13
  ...props
12
14
  }, ref) => {
13
15
  const {
@@ -17,43 +19,55 @@ const PointerLockControls = /*#__PURE__*/React.forwardRef(({
17
19
  const gl = useThree(({
18
20
  gl
19
21
  }) => gl);
20
- const defaultCamera = useThree(({
21
- camera
22
- }) => camera);
23
- const invalidate = useThree(({
24
- invalidate
25
- }) => invalidate);
22
+ const defaultCamera = useThree(state => state.camera);
23
+ const invalidate = useThree(state => state.invalidate);
24
+ const raycaster = useThree(state => state.raycaster);
25
+ const events = useThree(state => state.events);
26
26
  const explCamera = camera || defaultCamera;
27
- const [controls] = React.useState(() => new PointerLockControls$1(explCamera, gl.domElement));
27
+ const explDomElement = domElement || events.connected || gl.domElement;
28
+ const [controls] = React.useState(() => new PointerLockControls$1(explCamera));
29
+ React.useEffect(() => {
30
+ if (enabled) {
31
+ controls.connect(explDomElement); // Force events to be centered while PLC is active
32
+
33
+ const oldComputeOffsets = raycaster.computeOffsets;
34
+
35
+ raycaster.computeOffsets = e => ({
36
+ offsetX: e.target.width / 2,
37
+ offsetY: e.target.height / 2
38
+ });
39
+
40
+ return () => {
41
+ controls.disconnect();
42
+ raycaster.computeOffsets = oldComputeOffsets;
43
+ };
44
+ }
45
+ }, [enabled, controls]);
28
46
  React.useEffect(() => {
29
47
  const callback = e => {
30
48
  invalidate();
31
49
  if (onChange) onChange(e);
32
50
  };
33
51
 
34
- controls == null ? void 0 : controls.addEventListener == null ? void 0 : controls.addEventListener('change', callback);
35
- if (onLock) controls == null ? void 0 : controls.addEventListener == null ? void 0 : controls.addEventListener('lock', onLock);
36
- if (onUnlock) controls == null ? void 0 : controls.addEventListener == null ? void 0 : controls.addEventListener('unlock', onUnlock);
37
- return () => {
38
- controls == null ? void 0 : controls.removeEventListener == null ? void 0 : controls.removeEventListener('change', callback);
39
- if (onLock) controls == null ? void 0 : controls.addEventListener == null ? void 0 : controls.addEventListener('lock', onLock);
40
- if (onUnlock) controls == null ? void 0 : controls.addEventListener == null ? void 0 : controls.addEventListener('unlock', onUnlock);
41
- };
42
- }, [onChange, onLock, onUnlock, controls, invalidate]);
43
- React.useEffect(() => {
44
- const handler = () => controls == null ? void 0 : controls.lock();
52
+ controls.addEventListener('change', callback);
53
+ if (onLock) controls.addEventListener('lock', onLock);
54
+ if (onUnlock) controls.addEventListener('unlock', onUnlock); // Enforce previous interaction
55
+
56
+ const handler = () => controls.lock();
45
57
 
46
58
  const elements = selector ? Array.from(document.querySelectorAll(selector)) : [document];
47
59
  elements.forEach(element => element && element.addEventListener('click', handler));
48
60
  return () => {
61
+ controls.removeEventListener('change', callback);
62
+ if (onLock) controls.addEventListener('lock', onLock);
63
+ if (onUnlock) controls.addEventListener('unlock', onUnlock);
49
64
  elements.forEach(element => element ? element.removeEventListener('click', handler) : undefined);
50
65
  };
51
- }, [controls, selector]);
52
- return controls ? /*#__PURE__*/React.createElement("primitive", _extends({
66
+ }, [onChange, onLock, onUnlock, selector]);
67
+ return /*#__PURE__*/React.createElement("primitive", _extends({
53
68
  ref: ref,
54
- dispose: undefined,
55
69
  object: controls
56
- }, rest)) : null;
70
+ }, rest));
57
71
  });
58
72
 
59
73
  export { PointerLockControls };
@@ -1 +1 @@
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([]),[[x,E,w]]=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===x[3*d]&&g.y===x[3*d+1]&&g.z===x[3*d+2]||(g.toArray(x,3*d),o.current.geometry.attributes.position.needsUpdate=!0,m.matrixWorldNeedsUpdate=!0),m.color.equals(p.fromArray(E,3*d))||(m.color.toArray(E,3*d),o.current.geometry.attributes.color.needsUpdate=!0),m.size!==w[d]&&(w.set([m.size],d),o.current.geometry.attributes.size.needsUpdate=!0)}));const U=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]),z=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])},U,n),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attach:"attributes-position",count:x.length/3,array:x,itemSize:3,usage:c.DynamicDrawUsage}),l.createElement("bufferAttribute",{attach:"attributes-color",count:E.length/3,array:E,itemSize:3,usage:c.DynamicDrawUsage}),l.createElement("bufferAttribute",{attach:"attributes-size",count:w.length,array:w,itemSize:1,usage:c.DynamicDrawUsage})),l.createElement(b.Provider,{value:z},e))})),x=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)})),E=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",{attach:"attributes-position",count:t.length/u,array:t,itemSize:u,usage:c.DynamicDrawUsage}),r&&l.createElement("bufferAttribute",{attach:"attributes-color",count:r.length/u,array:r,itemSize:3,usage:c.DynamicDrawUsage}),n&&l.createElement("bufferAttribute",{attach:"attributes-size",count:n.length/u,array:n,itemSize:1,usage:c.DynamicDrawUsage})),e)})),w=l.forwardRef(((e,t)=>e.positions instanceof Float32Array?l.createElement(E,s.default({},e,{ref:t})):l.createElement(h,s.default({},e,{ref:t}))));exports.Point=x,exports.Points=w,exports.PointsBuffer=E;
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),g=new c.Matrix4,y=new c.Vector3;new c.Color;const p=l.forwardRef((({children:e,range:t,limit:r=1e3,...n},u)=>{const o=l.useRef(null),[i,p]=l.useState([]),[[h,E,w]]=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(),g.copy(o.current.matrixWorld).invert(),d=0;d<i.length;d++)m=i[d].current,y.toArray(h,3*d),o.current.geometry.attributes.position.needsUpdate=!0,m.matrixWorldNeedsUpdate=!0,m.color.toArray(E,3*d),o.current.geometry.attributes.color.needsUpdate=!0,w.set([m.size],d),o.current.geometry.attributes.size.needsUpdate=!0}));const x=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=>(p((t=>[...t,e])),()=>p((t=>t.filter((t=>t.current!==e.current)))))})),[]);return l.createElement("points",s.default({matrixAutoUpdate:!1,ref:f.default([u,o])},x,n),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attach:"attributes-position",count:h.length/3,array:h,itemSize:3,usage:c.DynamicDrawUsage}),l.createElement("bufferAttribute",{attach:"attributes-color",count:E.length/3,array:E,itemSize:3,usage:c.DynamicDrawUsage}),l.createElement("bufferAttribute",{attach:"attributes-size",count:w.length,array:w,itemSize:1,usage:c.DynamicDrawUsage})),l.createElement(b.Provider,{value:U},e))})),h=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)})),E=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({ref:f.default([i,d])},o),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attach:"attributes-position",count:t.length/u,array:t,itemSize:u,usage:c.DynamicDrawUsage}),r&&l.createElement("bufferAttribute",{attach:"attributes-color",count:r.length/u,array:r,itemSize:3,usage:c.DynamicDrawUsage}),n&&l.createElement("bufferAttribute",{attach:"attributes-size",count:n.length/u,array:n,itemSize:1,usage:c.DynamicDrawUsage})),e)})),w=l.forwardRef(((e,t)=>e.positions instanceof Float32Array?l.createElement(E,s.default({},e,{ref:t})):l.createElement(p,s.default({},e,{ref:t}))));exports.Point=h,exports.Points=w,exports.PointsBuffer=E;
package/core/Points.d.ts CHANGED
@@ -5,12 +5,12 @@ declare type PointsInstancesProps = JSX.IntrinsicElements['points'] & {
5
5
  limit?: number;
6
6
  };
7
7
  export declare const Point: React.ForwardRefExoticComponent<React.RefAttributes<unknown>>;
8
- declare type PointsBuffersProps = Omit<JSX.IntrinsicElements['points'], 'position'> & {
8
+ declare type PointsBuffersProps = JSX.IntrinsicElements['points'] & {
9
9
  positions: Float32Array;
10
10
  colors?: Float32Array;
11
11
  sizes?: Float32Array;
12
12
  stride?: 2 | 3;
13
13
  };
14
- export declare const PointsBuffer: React.ForwardRefExoticComponent<Pick<PointsBuffersProps, "visible" | "attach" | "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" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "material" | "geometry" | "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" | "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" | "removeFromParent" | "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[]>>>;
14
+ export declare const PointsBuffer: React.ForwardRefExoticComponent<Pick<PointsBuffersProps, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "updateMorphTargets" | "colors" | "stride" | "isPoints" | "positions" | "sizes"> & React.RefAttributes<THREE.Points<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
15
+ export declare const Points: React.ForwardRefExoticComponent<Pick<PointsInstancesProps | PointsBuffersProps, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "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
16
  export {};
package/core/Points.js CHANGED
@@ -9,7 +9,7 @@ let i, positionRef;
9
9
  const context = /*#__PURE__*/React.createContext(null);
10
10
  const parentMatrix = new THREE.Matrix4();
11
11
  const position = new THREE.Vector3();
12
- const color = new THREE.Color();
12
+ new THREE.Color();
13
13
  /**
14
14
  * Instance implementation, relies on react + context to update the attributes based on the children of this component
15
15
  */
@@ -41,23 +41,13 @@ const PointsInstances = /*#__PURE__*/React.forwardRef(({
41
41
 
42
42
  for (i = 0; i < refs.length; i++) {
43
43
  positionRef = refs[i].current;
44
- positionRef.getWorldPosition(position).applyMatrix4(parentMatrix);
45
-
46
- if (position.x !== positions[i * 3] || position.y !== positions[i * 3 + 1] || position.z !== positions[i * 3 + 2]) {
47
- position.toArray(positions, i * 3);
48
- parentRef.current.geometry.attributes.position.needsUpdate = true;
49
- positionRef.matrixWorldNeedsUpdate = true;
50
- }
51
-
52
- if (!positionRef.color.equals(color.fromArray(colors, i * 3))) {
53
- positionRef.color.toArray(colors, i * 3);
54
- parentRef.current.geometry.attributes.color.needsUpdate = true;
55
- }
56
-
57
- if (positionRef.size !== sizes[i]) {
58
- sizes.set([positionRef.size], i);
59
- parentRef.current.geometry.attributes.size.needsUpdate = true;
60
- }
44
+ position.toArray(positions, i * 3);
45
+ parentRef.current.geometry.attributes.position.needsUpdate = true;
46
+ positionRef.matrixWorldNeedsUpdate = true;
47
+ positionRef.color.toArray(colors, i * 3);
48
+ parentRef.current.geometry.attributes.color.needsUpdate = true;
49
+ sizes.set([positionRef.size], i);
50
+ parentRef.current.geometry.attributes.size.needsUpdate = true;
61
51
  }
62
52
  });
63
53
  const events = React.useMemo(() => {
@@ -143,17 +133,10 @@ const PointsBuffer = /*#__PURE__*/React.forwardRef(({
143
133
  useFrame(() => {
144
134
  const attr = pointsRef.current.geometry.attributes;
145
135
  attr.position.needsUpdate = true;
146
-
147
- if (colors) {
148
- attr.color.needsUpdate = true;
149
- }
150
-
151
- if (sizes) {
152
- attr.size.needsUpdate = true;
153
- }
136
+ if (colors) attr.color.needsUpdate = true;
137
+ if (sizes) attr.size.needsUpdate = true;
154
138
  });
155
139
  return /*#__PURE__*/React.createElement("points", _extends({
156
- matrixAutoUpdate: false,
157
140
  ref: mergeRefs([forwardedRef, pointsRef])
158
141
  }, props), /*#__PURE__*/React.createElement("bufferGeometry", null, /*#__PURE__*/React.createElement("bufferAttribute", {
159
142
  attach: "attributes-position",
@@ -180,9 +163,7 @@ const Points = /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
180
163
  return /*#__PURE__*/React.createElement(PointsBuffer, _extends({}, props, {
181
164
  ref: forwardedRef
182
165
  }));
183
- }
184
-
185
- return /*#__PURE__*/React.createElement(PointsInstances, _extends({}, props, {
166
+ } else return /*#__PURE__*/React.createElement(PointsInstances, _extends({}, props, {
186
167
  ref: forwardedRef
187
168
  }));
188
169
  });
@@ -26,4 +26,4 @@ declare global {
26
26
  }
27
27
  }
28
28
  }
29
- export declare const Reflector: React.ForwardRefExoticComponent<Pick<ReflectorProps, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "material" | "blur" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "resolution" | "minDepthThreshold" | "maxDepthThreshold" | "depthScale" | "depthToBlurRatioBias" | "mixBlur" | "mixStrength" | "mirror" | "debug" | "distortion" | "mixContrast" | "distortionMap"> & React.RefAttributes<Mesh<import("three").BufferGeometry, import("three").Material | import("three").Material[]>>>;
29
+ export declare const Reflector: React.ForwardRefExoticComponent<Pick<ReflectorProps, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "material" | "blur" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "resolution" | "minDepthThreshold" | "maxDepthThreshold" | "depthScale" | "depthToBlurRatioBias" | "mixBlur" | "mixStrength" | "mirror" | "distortion" | "mixContrast" | "distortionMap" | "debug"> & React.RefAttributes<Mesh<import("three").BufferGeometry, import("three").Material | import("three").Material[]>>>;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three-stdlib"),n=require("three");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var i=u(e),l=c(r);exports.Sampler=({children:e,weight:r,transform:u,instances:c,mesh:o,...a})=>{const s=l.useRef(null),d=l.useRef(null),f=l.useRef(null);return l.useEffect((()=>{var e,r;d.current=null!==(e=null==c?void 0:c.current)&&void 0!==e?e:s.current.children.find((e=>e.hasOwnProperty("instanceMatrix"))),f.current=null!==(r=null==o?void 0:o.current)&&void 0!==r?r:s.current.children.find((e=>"Mesh"===e.type))}),[e,null==o?void 0:o.current,null==c?void 0:c.current]),l.useEffect((()=>{if(void 0===f.current)return;if(void 0===d.current)return;const e=new t.MeshSurfaceSampler(f.current);r&&e.setWeightAttribute(r),e.build();const c=new n.Vector3,i=new n.Vector3,l=new n.Color,o=new n.Object3D;f.current.updateMatrixWorld(!0);for(let r=0;r<d.current.count;r++)e.sample(c,i,l),"function"==typeof u?u({dummy:o,sampledMesh:f.current,position:c,normal:i,color:l},r):o.position.copy(c),o.updateMatrix(),d.current.setMatrixAt(r,o.matrix);d.current.instanceMatrix.needsUpdate=!0}),[e,null==o?void 0:o.current,null==c?void 0:c.current]),l.createElement("group",i.default({ref:s},a),e)};
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+ import { Color, InstancedMesh, Mesh, Object3D, Vector3 } from 'three';
3
+ import { GroupProps } from '@react-three/fiber';
4
+ declare type SamplePayload = {
5
+ position: Vector3;
6
+ normal: Vector3;
7
+ color: Color;
8
+ };
9
+ export declare type TransformFn = (payload: TransformPayload, i: number) => void;
10
+ declare type TransformPayload = SamplePayload & {
11
+ dummy: Object3D;
12
+ sampledMesh: Mesh;
13
+ };
14
+ declare type Props = {
15
+ mesh?: React.RefObject<Mesh>;
16
+ instances?: React.RefObject<InstancedMesh>;
17
+ weight?: string;
18
+ transform?: TransformFn;
19
+ };
20
+ export declare const Sampler: ({ children, weight, transform, instances, mesh, ...props }: React.PropsWithChildren<Props & GroupProps>) => JSX.Element;
21
+ export {};
@@ -0,0 +1,65 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as React from 'react';
3
+ import { MeshSurfaceSampler } from 'three-stdlib';
4
+ import { Vector3, Color, Object3D } from 'three';
5
+
6
+ const Sampler = ({
7
+ children,
8
+ weight,
9
+ transform,
10
+ instances,
11
+ mesh,
12
+ ...props
13
+ }) => {
14
+ const group = React.useRef(null);
15
+ const instancedRef = React.useRef(null);
16
+ const meshToSampleRef = React.useRef(null);
17
+ React.useEffect(() => {
18
+ var _instances$current, _mesh$current;
19
+
20
+ instancedRef.current = (_instances$current = instances == null ? void 0 : instances.current) !== null && _instances$current !== void 0 ? _instances$current : group.current.children.find(c => c.hasOwnProperty('instanceMatrix'));
21
+ meshToSampleRef.current = (_mesh$current = mesh == null ? void 0 : mesh.current) !== null && _mesh$current !== void 0 ? _mesh$current : group.current.children.find(c => c.type === 'Mesh');
22
+ }, [children, mesh == null ? void 0 : mesh.current, instances == null ? void 0 : instances.current]);
23
+ React.useEffect(() => {
24
+ if (typeof meshToSampleRef.current === 'undefined') return;
25
+ if (typeof instancedRef.current === 'undefined') return;
26
+ const sampler = new MeshSurfaceSampler(meshToSampleRef.current);
27
+
28
+ if (weight) {
29
+ sampler.setWeightAttribute(weight);
30
+ }
31
+
32
+ sampler.build();
33
+ const position = new Vector3();
34
+ const normal = new Vector3();
35
+ const color = new Color();
36
+ const dummy = new Object3D();
37
+ meshToSampleRef.current.updateMatrixWorld(true);
38
+
39
+ for (let i = 0; i < instancedRef.current.count; i++) {
40
+ sampler.sample(position, normal, color);
41
+
42
+ if (typeof transform === 'function') {
43
+ transform({
44
+ dummy,
45
+ sampledMesh: meshToSampleRef.current,
46
+ position,
47
+ normal,
48
+ color
49
+ }, i);
50
+ } else {
51
+ dummy.position.copy(position);
52
+ }
53
+
54
+ dummy.updateMatrix();
55
+ instancedRef.current.setMatrixAt(i, dummy.matrix);
56
+ }
57
+
58
+ instancedRef.current.instanceMatrix.needsUpdate = true;
59
+ }, [children, mesh == null ? void 0 : mesh.current, instances == null ? void 0 : instances.current]);
60
+ return /*#__PURE__*/React.createElement("group", _extends({
61
+ ref: group
62
+ }, props), children);
63
+ };
64
+
65
+ export { Sampler };
@@ -26,5 +26,5 @@ declare const SpotLight: React.ForwardRefExoticComponent<Pick<Omit<import("@reac
26
26
  radiusBottom?: number | undefined;
27
27
  opacity?: number | undefined;
28
28
  color?: string | number | undefined;
29
- }, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "color" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "distance" | "opacity" | "decay" | "target" | "angle" | "intensity" | "isLight" | "shadow" | "shadowCameraFov" | "shadowCameraLeft" | "shadowCameraRight" | "shadowCameraTop" | "shadowCameraBottom" | "shadowCameraNear" | "shadowCameraFar" | "shadowBias" | "shadowMapWidth" | "shadowMapHeight" | "power" | "depthBuffer" | "penumbra" | "isSpotLight" | "attenuation" | "anglePower" | "radiusTop" | "radiusBottom"> & React.RefAttributes<SpotLightImpl>>;
29
+ }, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "color" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "distance" | "opacity" | "decay" | "target" | "angle" | "attenuation" | "penumbra" | "intensity" | "isLight" | "shadow" | "shadowCameraFov" | "shadowCameraLeft" | "shadowCameraRight" | "shadowCameraTop" | "shadowCameraBottom" | "shadowCameraNear" | "shadowCameraFar" | "shadowBias" | "shadowMapWidth" | "shadowMapHeight" | "power" | "depthBuffer" | "isSpotLight" | "anglePower" | "radiusTop" | "radiusBottom"> & React.RefAttributes<SpotLightImpl>>;
30
30
  export { SpotLight };
package/core/Stage.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"),n=require("@react-three/fiber"),i=require("./Environment.cjs.js"),a=require("./ContactShadows.cjs.js");function o(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)}require("three-stdlib"),require("../helpers/environment-assets.cjs.js");var u=o(e),c=s(t),l=s(r);const f={rembrandt:{main:[1,2,1],fill:[-2,-.5,-2]},portrait:{main:[-1,2,.5],fill:[-1,.5,-1.5]},upfront:{main:[0,2,1],fill:[-1,.5,-1.5]},soft:{main:[-2,4,4],fill:[-1,.5,-1.5]}};exports.Stage=function({children:e,controls:t,shadows:r=!0,adjustCamera:o=!0,environment:s="city",intensity:d=1,preset:h="rembrandt",shadowBias:m=0,contactShadow:p={blur:2,opacity:.5,position:[0,0,0]},...b}){const g=f[h],y=n.useThree((e=>e.camera)),j=n.useThree((e=>e.controls)),w=c.useRef(null),E=c.useRef(null),[{radius:x,width:v,height:q},O]=c.useState({radius:0,width:0,height:0});return c.useLayoutEffect((()=>{w.current.position.set(0,0,0),w.current.updateWorldMatrix(!0,!0);const e=(new l.Box3).setFromObject(E.current),t=new l.Vector3,r=new l.Sphere,n=e.max.y-e.min.y,i=e.max.x-e.min.x;e.getCenter(t),e.getBoundingSphere(r),O({radius:r.radius,width:i,height:n}),w.current.position.set(-t.x,-t.y+n/2,-t.z)}),[e]),c.useLayoutEffect((()=>{if(o){const e=x/(q>v?1.5:2.5);y.position.set(0,.5*x,2.5*x),y.near=.1,y.far=Math.max(5e3,4*x),y.lookAt(0,e,0);const r=j||(null==t?void 0:t.current);r&&(r.target.set(0,e,0),r.update())}}),[j,x,q,v,o]),c.createElement("group",b,c.createElement("group",{ref:w},c.createElement("group",{ref:E},e)),p&&c.createElement(a.ContactShadows,u.default({width:2*x,height:2*x,far:x/2},p)),s&&c.createElement(i.Environment,{preset:s}),c.createElement("ambientLight",{intensity:d/3}),c.createElement("spotLight",{penumbra:1,position:[g.main[0]*x,g.main[1]*x,g.main[2]*x],intensity:2*d,castShadow:r,"shadow-bias":m}),c.createElement("pointLight",{position:[g.fill[0]*x,g.fill[1]*x,g.fill[2]*x],intensity:d}))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),n=require("@react-three/fiber"),i=require("./Environment.cjs.js"),a=require("./ContactShadows.cjs.js");function o(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)}require("three-stdlib"),require("../helpers/environment-assets.cjs.js");var u=o(e),c=s(t),l=s(r);const f={rembrandt:{main:[1,2,1],fill:[-2,-.5,-2]},portrait:{main:[-1,2,.5],fill:[-1,.5,-1.5]},upfront:{main:[0,2,1],fill:[-1,.5,-1.5]},soft:{main:[-2,4,4],fill:[-1,.5,-1.5]}};exports.Stage=function({children:e,controls:t,shadows:r=!0,adjustCamera:o=!0,environment:s="city",intensity:d=1,preset:m="rembrandt",shadowBias:h=0,contactShadow:p={blur:2,opacity:.5,position:[0,0,0]},...b}){const g=f[m],y=n.useThree((e=>e.camera)),j=n.useThree((e=>e.controls)),w=c.useRef(null),E=c.useRef(null),[{radius:x,width:v,height:q},O]=c.useState({radius:0,width:0,height:0});return c.useLayoutEffect((()=>{w.current.position.set(0,0,0),w.current.updateWorldMatrix(!0,!0);const e=(new l.Box3).setFromObject(E.current),t=new l.Vector3,r=new l.Sphere,n=e.max.y-e.min.y,i=e.max.x-e.min.x;e.getCenter(t),e.getBoundingSphere(r),O({radius:r.radius,width:i,height:n}),w.current.position.set(-t.x,-t.y+n/2,-t.z)}),[e]),c.useLayoutEffect((()=>{if(o){const e=x/(q>v?1.5:2.5);y.position.set(0,.5*x,2.5*x),y.near=.1,y.far=Math.max(5e3,4*x),y.lookAt(0,e,0);const r=j||(null==t?void 0:t.current);r&&(r.target.set(0,e,0),r.update())}}),[j,x,q,v,o]),c.createElement("group",b,c.createElement("group",{ref:w},c.createElement("group",{ref:E},e)),p&&c.createElement(a.ContactShadows,u.default({scale:2*x,far:x/2},p)),s&&c.createElement(i.Environment,{preset:s}),c.createElement("ambientLight",{intensity:d/3}),c.createElement("spotLight",{penumbra:1,position:[g.main[0]*x,g.main[1]*x,g.main[2]*x],intensity:2*d,castShadow:r,"shadow-bias":h}),c.createElement("pointLight",{position:[g.fill[0]*x,g.fill[1]*x,g.fill[2]*x],intensity:d}))};
package/core/Stage.js CHANGED
@@ -91,8 +91,7 @@ function Stage({
91
91
  }, /*#__PURE__*/React.createElement("group", {
92
92
  ref: inner
93
93
  }, children)), contactShadow && /*#__PURE__*/React.createElement(ContactShadows, _extends({
94
- width: radius * 2,
95
- height: radius * 2,
94
+ scale: radius * 2,
96
95
  far: radius / 2
97
96
  }, contactShadow)), environment && /*#__PURE__*/React.createElement(Environment, {
98
97
  preset: environment
package/core/Stars.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@react-three/fiber"),r=require("three");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);class n extends r.ShaderMaterial{constructor(){super({uniforms:{time:{value:0},fade:{value:1}},vertexShader:"\n uniform float time;\n attribute float size;\n varying vec3 vColor;\n void main() {\n vColor = color;\n vec4 mvPosition = modelViewMatrix * vec4(position, 0.5);\n gl_PointSize = size * (30.0 / -mvPosition.z) * (3.0 + sin(mvPosition.x + 2.0 * time + 100.0));\n gl_Position = projectionMatrix * mvPosition;\n }",fragmentShader:"\n uniform sampler2D pointTexture;\n uniform float fade;\n varying vec3 vColor;\n void main() {\n float opacity = 1.0;\n if (fade == 1.0) {\n float d = distance(gl_PointCoord, vec2(0.5, 0.5));\n opacity = 1.0 / (1.0 + exp(16.0 * (d - 0.25)));\n }\n gl_FragColor = vec4(vColor, opacity);\n }"})}}const i=e=>(new r.Vector3).setFromSpherical(new r.Spherical(e,Math.acos(1-2*Math.random()),2*Math.random()*Math.PI)),c=o.forwardRef((({radius:e=100,depth:a=50,count:c=5e3,saturation:s=0,factor:u=4,fade:l=!1},f)=>{const m=o.useRef(),[d,v,p]=o.useMemo((()=>{const t=[],o=[],n=Array.from({length:c},(()=>(.5+.5*Math.random())*u)),l=new r.Color;let f=e+a;const m=a/c;for(let e=0;e<c;e++)f-=m*Math.random(),t.push(...i(f).toArray()),l.setHSL(e/c,s,.9),o.push(l.r,l.g,l.b);return[new Float32Array(t),new Float32Array(o),new Float32Array(n)]}),[c,a,u,e,s]);t.useFrame((e=>m.current&&(m.current.uniforms.time.value=e.clock.getElapsedTime())));const[h]=o.useState((()=>new n));return o.createElement("points",{ref:f},o.createElement("bufferGeometry",{attach:"geometry"},o.createElement("bufferAttribute",{attach:"attributes-position",args:[d,3]}),o.createElement("bufferAttribute",{attach:"attributes-color",args:[v,3]}),o.createElement("bufferAttribute",{attach:"attributes-size",args:[p,1]})),o.createElement("primitive",{dispose:void 0,ref:m,object:h,attach:"material",blending:r.AdditiveBlending,"uniforms-fade-value":l,transparent:!0,vertexColors:!0}))}));exports.Stars=c;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@react-three/fiber"),r=require("three");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 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 a=n(e);class o extends r.ShaderMaterial{constructor(){super({uniforms:{time:{value:0},fade:{value:1}},vertexShader:"\n uniform float time;\n attribute float size;\n varying vec3 vColor;\n void main() {\n vColor = color;\n vec4 mvPosition = modelViewMatrix * vec4(position, 0.5);\n gl_PointSize = size * (30.0 / -mvPosition.z) * (3.0 + sin(mvPosition.x + 2.0 * time + 100.0));\n gl_Position = projectionMatrix * mvPosition;\n }",fragmentShader:"\n uniform sampler2D pointTexture;\n uniform float fade;\n varying vec3 vColor;\n void main() {\n float opacity = 1.0;\n if (fade == 1.0) {\n float d = distance(gl_PointCoord, vec2(0.5, 0.5));\n opacity = 1.0 / (1.0 + exp(16.0 * (d - 0.25)));\n }\n gl_FragColor = vec4(vColor, opacity);\n\n #include <tonemapping_fragment>\n\t #include <encodings_fragment>\n }"})}}const i=e=>(new r.Vector3).setFromSpherical(new r.Spherical(e,Math.acos(1-2*Math.random()),2*Math.random()*Math.PI)),c=a.forwardRef((({radius:e=100,depth:n=50,count:c=5e3,saturation:s=0,factor:u=4,fade:l=!1},f)=>{const m=a.useRef(),[d,v,p]=a.useMemo((()=>{const t=[],a=[],o=Array.from({length:c},(()=>(.5+.5*Math.random())*u)),l=new r.Color;let f=e+n;const m=n/c;for(let e=0;e<c;e++)f-=m*Math.random(),t.push(...i(f).toArray()),l.setHSL(e/c,s,.9),a.push(l.r,l.g,l.b);return[new Float32Array(t),new Float32Array(a),new Float32Array(o)]}),[c,n,u,e,s]);t.useFrame((e=>m.current&&(m.current.uniforms.time.value=e.clock.getElapsedTime())));const[g]=a.useState((()=>new o));return a.createElement("points",{ref:f},a.createElement("bufferGeometry",{attach:"geometry"},a.createElement("bufferAttribute",{attach:"attributes-position",args:[d,3]}),a.createElement("bufferAttribute",{attach:"attributes-color",args:[v,3]}),a.createElement("bufferAttribute",{attach:"attributes-size",args:[p,1]})),a.createElement("primitive",{dispose:void 0,ref:m,object:g,attach:"material",blending:r.AdditiveBlending,"uniforms-fade-value":l,transparent:!0,vertexColors:!0}))}));exports.Stars=c;
package/core/Stars.js CHANGED
@@ -38,6 +38,9 @@ class StarfieldMaterial extends ShaderMaterial {
38
38
  opacity = 1.0 / (1.0 + exp(16.0 * (d - 0.25)));
39
39
  }
40
40
  gl_FragColor = vec4(vColor, opacity);
41
+
42
+ #include <tonemapping_fragment>
43
+ #include <encodings_fragment>
41
44
  }`
42
45
  });
43
46
  }