@react-three/drei 9.0.0-beta.1 → 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 (149) hide show
  1. package/README.md +461 -48
  2. package/core/ArcballControls.cjs.js +1 -1
  3. package/core/ArcballControls.d.ts +8 -8
  4. package/core/ArcballControls.js +19 -30
  5. package/core/Bounds.cjs.js +1 -1
  6. package/core/Bounds.d.ts +2 -1
  7. package/core/Bounds.js +25 -14
  8. package/core/Clone.cjs.js +1 -0
  9. package/core/Clone.d.ts +11 -0
  10. package/core/Clone.js +92 -0
  11. package/core/Cloud.cjs.js +1 -1
  12. package/core/Cloud.d.ts +4 -1
  13. package/core/Cloud.js +7 -3
  14. package/core/ComputedAttribute.cjs.js +1 -0
  15. package/core/ComputedAttribute.d.ts +9 -0
  16. package/core/ComputedAttribute.js +34 -0
  17. package/core/ContactShadows.cjs.js +1 -1
  18. package/core/ContactShadows.d.ts +4 -1
  19. package/core/ContactShadows.js +33 -13
  20. package/core/CubeCamera.cjs.js +1 -1
  21. package/core/CubeCamera.js +6 -7
  22. package/core/CurveModifier.cjs.js +1 -1
  23. package/core/CurveModifier.js +18 -22
  24. package/core/Detailed.d.ts +1 -1
  25. package/core/DeviceOrientationControls.cjs.js +1 -1
  26. package/core/DeviceOrientationControls.js +2 -6
  27. package/core/Effects.cjs.js +1 -1
  28. package/core/Effects.d.ts +3 -2
  29. package/core/Effects.js +2 -2
  30. package/core/Environment.cjs.js +1 -1
  31. package/core/Environment.d.ts +13 -3
  32. package/core/Environment.js +100 -56
  33. package/core/FirstPersonControls.cjs.js +1 -1
  34. package/core/FirstPersonControls.d.ts +1 -1
  35. package/core/FirstPersonControls.js +2 -6
  36. package/core/Float.cjs.js +1 -1
  37. package/core/Float.d.ts +1 -1
  38. package/core/Float.js +5 -4
  39. package/core/GizmoHelper.cjs.js +1 -1
  40. package/core/GizmoHelper.d.ts +2 -1
  41. package/core/GizmoHelper.js +31 -41
  42. package/core/GizmoViewcube.cjs.js +1 -1
  43. package/core/GizmoViewcube.js +1 -1
  44. package/core/GradientTexture.cjs.js +1 -1
  45. package/core/GradientTexture.js +5 -2
  46. package/core/Image.cjs.js +1 -1
  47. package/core/Image.d.ts +6 -4
  48. package/core/Image.js +6 -1
  49. package/core/Instances.cjs.js +1 -1
  50. package/core/Instances.d.ts +2 -2
  51. package/core/Instances.js +5 -11
  52. package/core/Lightformer.cjs.js +1 -0
  53. package/core/Lightformer.d.ts +41 -0
  54. package/core/Lightformer.js +51 -0
  55. package/core/Line.d.ts +1 -1
  56. package/core/MapControls.d.ts +1 -1
  57. package/core/MeshDistortMaterial.d.ts +2 -4
  58. package/core/MeshReflectorMaterial.cjs.js +1 -1
  59. package/core/MeshReflectorMaterial.d.ts +2 -2
  60. package/core/MeshReflectorMaterial.js +7 -7
  61. package/core/MeshWobbleMaterial.d.ts +2 -4
  62. package/core/OrbitControls.cjs.js +1 -1
  63. package/core/OrbitControls.d.ts +10 -10
  64. package/core/OrbitControls.js +14 -26
  65. package/core/OrthographicCamera.d.ts +1 -1
  66. package/core/PerspectiveCamera.d.ts +1 -1
  67. package/core/PointMaterial.cjs.js +1 -1
  68. package/core/PointMaterial.d.ts +5 -8
  69. package/core/PointMaterial.js +16 -34
  70. package/core/PointerLockControls.cjs.js +1 -1
  71. package/core/PointerLockControls.d.ts +3 -1
  72. package/core/PointerLockControls.js +36 -22
  73. package/core/Points.cjs.js +1 -1
  74. package/core/Points.d.ts +3 -3
  75. package/core/Points.js +11 -30
  76. package/core/PositionalAudio.d.ts +1 -1
  77. package/core/Reflector.cjs.js +1 -1
  78. package/core/Reflector.d.ts +1 -1
  79. package/core/Reflector.js +1 -2
  80. package/core/RoundedBox.cjs.js +1 -1
  81. package/core/RoundedBox.d.ts +2 -1
  82. package/core/RoundedBox.js +2 -1
  83. package/core/Sampler.cjs.js +1 -0
  84. package/core/Sampler.d.ts +21 -0
  85. package/core/Sampler.js +65 -0
  86. package/core/Shadow.d.ts +1 -1
  87. package/core/SpotLight.d.ts +20 -4
  88. package/core/Stage.cjs.js +1 -1
  89. package/core/Stage.d.ts +1 -1
  90. package/core/Stage.js +1 -2
  91. package/core/Stars.cjs.js +1 -1
  92. package/core/Stars.js +3 -0
  93. package/core/Stats.cjs.js +1 -1
  94. package/core/Stats.js +2 -2
  95. package/core/Text.cjs.js +1 -1
  96. package/core/Text.d.ts +3 -2
  97. package/core/Text.js +9 -1
  98. package/core/TrackballControls.cjs.js +1 -1
  99. package/core/TrackballControls.js +7 -5
  100. package/core/Trail.cjs.js +1 -0
  101. package/core/Trail.d.ts +21 -0
  102. package/core/Trail.js +160 -0
  103. package/core/TransformControls.cjs.js +1 -1
  104. package/core/TransformControls.d.ts +1 -1
  105. package/core/TransformControls.js +13 -11
  106. package/core/index.cjs.js +1 -1
  107. package/core/index.d.ts +6 -0
  108. package/core/index.js +11 -4
  109. package/core/shaderMaterial.d.ts +1 -1
  110. package/core/useBoxProjectedEnv.cjs.js +1 -0
  111. package/core/useBoxProjectedEnv.d.ts +8 -0
  112. package/core/useBoxProjectedEnv.js +98 -0
  113. package/core/useDetectGPU.cjs.js +1 -1
  114. package/core/useDetectGPU.js +2 -2
  115. package/core/useFBO.cjs.js +1 -1
  116. package/core/useFBO.d.ts +1 -1
  117. package/core/useFBO.js +22 -24
  118. package/core/useHelper.cjs.js +1 -1
  119. package/core/useHelper.d.ts +4 -1
  120. package/core/useHelper.js +16 -6
  121. package/core/useMatcapTexture.cjs.js +1 -1
  122. package/core/useMatcapTexture.js +2 -5
  123. package/core/useNormalTexture.cjs.js +1 -1
  124. package/core/useNormalTexture.js +2 -5
  125. package/helpers/Position.cjs.js +1 -1
  126. package/helpers/Position.js +3 -2
  127. package/helpers/environment-assets.cjs.js +1 -1
  128. package/helpers/environment-assets.js +10 -10
  129. package/index.cjs.js +1 -1
  130. package/index.js +7 -1
  131. package/materials/ConvolutionMaterial.cjs.js +1 -1
  132. package/materials/ConvolutionMaterial.js +2 -0
  133. package/materials/MeshReflectorMaterial.cjs.js +1 -1
  134. package/materials/MeshReflectorMaterial.d.ts +0 -3
  135. package/materials/MeshReflectorMaterial.js +8 -35
  136. package/materials/SpotLightMaterial.cjs.js +1 -1
  137. package/materials/SpotLightMaterial.js +3 -0
  138. package/native/index.cjs.js +1 -1
  139. package/native/index.js +11 -4
  140. package/package.json +8 -7
  141. package/web/Html.cjs.js +1 -1
  142. package/web/Html.js +4 -5
  143. package/web/ScrollControls.cjs.js +1 -1
  144. package/web/ScrollControls.js +6 -5
  145. package/web/Select.cjs.js +1 -1
  146. package/web/Select.d.ts +2 -1
  147. package/web/Select.js +3 -2
  148. package/web/index.cjs.js +1 -1
  149. package/web/index.js +12 -5
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("@react-three/fiber"),t=require("react"),n=require("three-stdlib");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(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=o(e),c=s(t);const u=c.forwardRef((({makeDefault:e,camera:t,regress:o,domElement:s,onChange:u,onStart:i,onEnd:l,...d},f)=>{const b=r.useThree((({invalidate:e})=>e)),m=r.useThree((({camera:e})=>e)),v=r.useThree((({gl:e})=>e)),h=r.useThree((({events:e})=>e)),p=r.useThree((({set:e})=>e)),E=r.useThree((({get:e})=>e)),g=r.useThree((({performance:e})=>e)),j=t||m,O=s||("boolean"!=typeof h.connected?h.connected:v.domElement),T=c.useMemo((()=>new n.ArcballControls(j)),[j]);return r.useFrame((()=>{T.enabled&&T.update()})),c.useEffect((()=>{const e=e=>{b(),o&&g.regress(),u&&u(e)};return T.connect(O),T.addEventListener("change",e),i&&T.addEventListener("start",i),l&&T.addEventListener("end",l),()=>{T.removeEventListener("change",e),i&&T.removeEventListener("start",i),l&&T.removeEventListener("end",l),T.dispose()}}),[O,u,i,l,o,T,b]),c.useEffect((()=>{if(e){const e=E().controls;return p({controls:T}),()=>p({controls:e})}}),[e,T]),c.createElement("primitive",a.default({ref:f,object:T},d))}));exports.ArcballControls=u;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("@react-three/fiber"),t=require("react"),n=require("three-stdlib");function s(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=s(e),u=o(t);const c=t.forwardRef((({camera:e,makeDefault:s,regress:o,domElement:c,onChange:i,onStart:l,onEnd:f,...d},m)=>{const v=r.useThree((e=>e.invalidate)),b=r.useThree((e=>e.camera)),h=r.useThree((e=>e.gl)),E=r.useThree((e=>e.events)),p=r.useThree((e=>e.set)),g=r.useThree((e=>e.get)),j=r.useThree((e=>e.performance)),O=e||b,T=c||E.connected||h.domElement,L=t.useMemo((()=>new n.ArcballControls(O)),[O]);return r.useFrame((()=>{L.enabled&&L.update()})),t.useEffect((()=>(L.connect(T),()=>{L.dispose()})),[T,o,L,v]),t.useEffect((()=>{const e=e=>{v(),o&&j.regress(),i&&i(e)};return L.addEventListener("change",e),l&&L.addEventListener("start",l),f&&L.addEventListener("end",f),()=>{L.removeEventListener("change",e),l&&L.removeEventListener("start",l),f&&L.removeEventListener("end",f)}}),[i,l,f]),t.useEffect((()=>{if(s){const e=g().controls;return p({controls:L}),()=>p({controls:e})}}),[s,L]),u.createElement("primitive",a.default({ref:m,object:L},d))}));exports.ArcballControls=c;
@@ -1,15 +1,15 @@
1
1
  import { ReactThreeFiber } from '@react-three/fiber';
2
2
  import * as React from 'react';
3
- import * as THREE from 'three';
4
3
  import { ArcballControls as ArcballControlsImpl } from 'three-stdlib';
5
- export declare type ArcballControlsProps = ReactThreeFiber.Overwrite<ReactThreeFiber.Object3DNode<ArcballControlsImpl, typeof ArcballControlsImpl>, {
4
+ import type { Event, OrthographicCamera, PerspectiveCamera } from 'three';
5
+ export declare type ArcballControlsProps = Omit<ReactThreeFiber.Overwrite<ReactThreeFiber.Object3DNode<ArcballControlsImpl, typeof ArcballControlsImpl>, {
6
6
  target?: ReactThreeFiber.Vector3;
7
- camera?: THREE.Camera;
7
+ camera?: OrthographicCamera | PerspectiveCamera;
8
8
  domElement?: HTMLElement;
9
9
  regress?: boolean;
10
10
  makeDefault?: boolean;
11
- onChange?: (e?: THREE.Event) => void;
12
- onStart?: (e?: THREE.Event) => void;
13
- onEnd?: (e?: THREE.Event) => void;
14
- }>;
15
- export declare const ArcballControls: React.ForwardRefExoticComponent<Pick<ArcballControlsProps, string | number | symbol> & React.RefAttributes<ArcballControlsImpl>>;
11
+ onChange?: (e?: Event) => void;
12
+ onStart?: (e?: Event) => void;
13
+ onEnd?: (e?: Event) => void;
14
+ }>, 'ref'>;
15
+ export declare const ArcballControls: React.ForwardRefExoticComponent<ArcballControlsProps & React.RefAttributes<ArcballControlsImpl>>;
@@ -1,11 +1,12 @@
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';
4
5
  import { ArcballControls as ArcballControls$1 } from 'three-stdlib';
5
6
 
6
- const ArcballControls = /*#__PURE__*/React.forwardRef(({
7
- makeDefault,
7
+ const ArcballControls = /*#__PURE__*/forwardRef(({
8
8
  camera,
9
+ makeDefault,
9
10
  regress,
10
11
  domElement,
11
12
  onChange,
@@ -13,41 +14,30 @@ const ArcballControls = /*#__PURE__*/React.forwardRef(({
13
14
  onEnd,
14
15
  ...restProps
15
16
  }, ref) => {
16
- const invalidate = useThree(({
17
- invalidate
18
- }) => invalidate);
19
- const defaultCamera = useThree(({
20
- camera
21
- }) => camera);
22
- const gl = useThree(({
23
- gl
24
- }) => gl);
25
- const events = useThree(({
26
- events
27
- }) => events);
28
- const set = useThree(({
29
- set
30
- }) => set);
31
- const get = useThree(({
32
- get
33
- }) => get);
34
- const performance = useThree(({
35
- performance
36
- }) => 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);
37
24
  const explCamera = camera || defaultCamera;
38
- const explDomElement = domElement || (typeof events.connected !== 'boolean' ? events.connected : gl.domElement);
39
- const controls = React.useMemo(() => new ArcballControls$1(explCamera), [explCamera]);
25
+ const explDomElement = domElement || events.connected || gl.domElement;
26
+ const controls = useMemo(() => new ArcballControls$1(explCamera), [explCamera]);
40
27
  useFrame(() => {
41
28
  if (controls.enabled) controls.update();
42
29
  });
43
- React.useEffect(() => {
30
+ useEffect(() => {
31
+ controls.connect(explDomElement);
32
+ return () => void controls.dispose();
33
+ }, [explDomElement, regress, controls, invalidate]);
34
+ useEffect(() => {
44
35
  const callback = e => {
45
36
  invalidate();
46
37
  if (regress) performance.regress();
47
38
  if (onChange) onChange(e);
48
39
  };
49
40
 
50
- controls.connect(explDomElement);
51
41
  controls.addEventListener('change', callback);
52
42
  if (onStart) controls.addEventListener('start', onStart);
53
43
  if (onEnd) controls.addEventListener('end', onEnd);
@@ -55,10 +45,9 @@ const ArcballControls = /*#__PURE__*/React.forwardRef(({
55
45
  controls.removeEventListener('change', callback);
56
46
  if (onStart) controls.removeEventListener('start', onStart);
57
47
  if (onEnd) controls.removeEventListener('end', onEnd);
58
- controls.dispose();
59
48
  };
60
- }, [explDomElement, onChange, onStart, onEnd, regress, controls, invalidate]);
61
- React.useEffect(() => {
49
+ }, [onChange, onStart, onEnd]);
50
+ useEffect(() => {
62
51
  if (makeDefault) {
63
52
  const old = get().controls;
64
53
  set({
@@ -1 +1 @@
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,onFit:f}){const p=a.useRef(null),l=r.useThree((e=>e.camera)),x=r.useThree((e=>e.controls)),h=r.useThree((e=>e.invalidate)),y=a.useRef(f);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 d(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)}y.current=f;const[M]=a.useState((()=>({animating:!1,focus:new n.Vector3,camera:new n.Vector3,zoom:1}))),[g]=a.useState((()=>({focus:new n.Vector3,camera:new n.Vector3,zoom:1}))),[b]=a.useState((()=>new n.Box3)),w=a.useMemo((()=>{function e(){const e=b.getSize(new n.Vector3),t=b.getCenter(new n.Vector3),r=Math.max(e.x,e.y,e.z),o=c(l)?4*r:r/(2*Math.atan(Math.PI*l.fov/360)),a=c(l)?4*r:o/l.aspect,i=m*Math.max(o,a);return{box:b,size:e,center:t,distance:i}}return{getSize:e,refresh(t){var r;if((r=t)&&r.isObject3D?b.setFromObject(t):(e=>e&&e.isBox3)(t)?b.copy(t):p.current&&b.setFromObject(p.current),b.isEmpty()){const e=l.position.length()||10;b.setFromCenterAndSize(new n.Vector3,new n.Vector3(e,e,e))}if("OrthographicTrackballControls"===(null==x?void 0:x.constructor.name)){const{distance:t}=e(),r=l.position.clone().sub(x.target).normalize().multiplyScalar(t),o=x.target.clone().add(r);l.position.copy(o)}return this},clip(){const{distance:t}=e();return x&&(x.maxDistance=10*t),l.near=t/100,l.far=100*t,l.updateProjectionMatrix(),x&&x.update(),this},fit(){M.camera.copy(l.position),x&&M.focus.copy(x.target);const{center:r,distance:o}=e(),a=r.clone().sub(l.position).normalize().multiplyScalar(o);if(g.camera.copy(r).sub(a),g.focus.copy(r),c(l)){M.zoom=l.zoom;let e=0,o=0;const a=[new n.Vector3(b.min.x,b.min.y,b.min.z),new n.Vector3(b.min.x,b.max.y,b.min.z),new n.Vector3(b.min.x,b.min.y,b.max.z),new n.Vector3(b.min.x,b.max.y,b.max.z),new n.Vector3(b.max.x,b.max.y,b.max.z),new n.Vector3(b.max.x,b.max.y,b.min.z),new n.Vector3(b.max.x,b.min.y,b.max.z),new n.Vector3(b.max.x,b.min.y,b.min.z)];r.applyMatrix4(l.matrixWorldInverse);for(const t of a)t.applyMatrix4(l.matrixWorldInverse),e=Math.max(e,Math.abs(t.y-r.y)),o=Math.max(o,Math.abs(t.x-r.x));e*=2,o*=2;const c=(l.top-l.bottom)/e,i=(l.right-l.left)/o;g.zoom=Math.min(c,i)/m,t||(l.zoom=g.zoom,l.updateProjectionMatrix())}return t?M.animating=!0:(l.position.copy(g.camera),l.lookAt(g.focus),x&&(x.target.copy(g.focus),x.update()),h()),y.current&&y.current(this.getSize()),this}}}),[b,l,x,m,t,h]);return a.useLayoutEffect((()=>{if(w.refresh(),o&&w.fit(),s&&w.clip(),x){const e=()=>M.animating=!1;return x.addEventListener("start",e),()=>x.removeEventListener("start",e)}}),[s,o,x]),r.useFrame(((e,r)=>{if(M.animating){if(d(M.focus,g.focus,t,r),d(M.camera,g.camera,t,r),M.zoom=n.MathUtils.damp(M.zoom,g.zoom,t,r),l.position.copy(M.camera),c(l)&&(l.zoom=M.zoom,l.updateProjectionMatrix()),x?(x.target.copy(M.focus),x.update()):l.lookAt(M.focus),h(),c(l)&&!(Math.abs(M.zoom-g.zoom)<u))return;if(!c(l)&&!z(M.camera,g.camera))return;if(x&&!z(M.focus,g.focus))return;M.animating=!1}})),a.createElement("group",{ref:p},a.createElement(i.Provider,{value:w},e))},exports.useBounds=function(){return a.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,observe:u,margin:m=1.2,eps:f=.01,onFit:l}){const p=a.useRef(null),{camera:x,invalidate:y,size:z,controls:d}=r.useThree(),h=d,M=a.useRef(l);function g(e,t){return Math.abs(e.x-t.x)<f&&Math.abs(e.y-t.y)<f&&Math.abs(e.z-t.z)<f}function b(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)}M.current=l;const[w]=a.useState((()=>({animating:!1,focus:new n.Vector3,camera:new n.Vector3,zoom:1}))),[v]=a.useState((()=>({focus:new n.Vector3,camera:new n.Vector3,zoom:1}))),[V]=a.useState((()=>new n.Box3)),j=a.useMemo((()=>{function e(){const e=V.getSize(new n.Vector3),t=V.getCenter(new n.Vector3),r=Math.max(e.x,e.y,e.z),o=c(x)?4*r:r/(2*Math.atan(Math.PI*x.fov/360)),a=c(x)?4*r:o/x.aspect,i=m*Math.max(o,a);return{box:V,size:e,center:t,distance:i}}return{getSize:e,refresh(t){if((r=t)&&r.isBox3)V.copy(t);else{const e=t||p.current;e.updateWorldMatrix(!0,!0),V.setFromObject(e)}var r;if(V.isEmpty()){const e=x.position.length()||10;V.setFromCenterAndSize(new n.Vector3,new n.Vector3(e,e,e))}if("OrthographicTrackballControls"===(null==h?void 0:h.constructor.name)){const{distance:t}=e(),r=x.position.clone().sub(h.target).normalize().multiplyScalar(t),o=h.target.clone().add(r);x.position.copy(o)}return this},clip(){const{distance:t}=e();return h&&(h.maxDistance=10*t),x.near=t/100,x.far=100*t,x.updateProjectionMatrix(),h&&h.update(),y(),this},fit(){w.camera.copy(x.position),h&&w.focus.copy(h.target);const{center:r,distance:o}=e(),a=r.clone().sub(x.position).normalize().multiplyScalar(o);if(v.camera.copy(r).sub(a),v.focus.copy(r),c(x)){w.zoom=x.zoom;let e=0,o=0;const a=[new n.Vector3(V.min.x,V.min.y,V.min.z),new n.Vector3(V.min.x,V.max.y,V.min.z),new n.Vector3(V.min.x,V.min.y,V.max.z),new n.Vector3(V.min.x,V.max.y,V.max.z),new n.Vector3(V.max.x,V.max.y,V.max.z),new n.Vector3(V.max.x,V.max.y,V.min.z),new n.Vector3(V.max.x,V.min.y,V.max.z),new n.Vector3(V.max.x,V.min.y,V.min.z)];r.applyMatrix4(x.matrixWorldInverse);for(const t of a)t.applyMatrix4(x.matrixWorldInverse),e=Math.max(e,Math.abs(t.y-r.y)),o=Math.max(o,Math.abs(t.x-r.x));e*=2,o*=2;const c=(x.top-x.bottom)/e,i=(x.right-x.left)/o;v.zoom=Math.min(c,i)/m,t||(x.zoom=v.zoom,x.updateProjectionMatrix())}return t?w.animating=!0:(x.position.copy(v.camera),x.lookAt(v.focus),h&&(h.target.copy(v.focus),h.update())),M.current&&M.current(this.getSize()),y(),this}}}),[V,x,h,m,t,y]);a.useLayoutEffect((()=>{if(h){const e=()=>w.animating=!1;return h.addEventListener("start",e),()=>h.removeEventListener("start",e)}}),[h]);const O=a.useRef(0);return a.useLayoutEffect((()=>{(u||0==O.current++)&&(j.refresh(),o&&j.fit(),s&&j.clip())}),[z,s,o,u]),r.useFrame(((e,r)=>{if(w.animating){if(b(w.focus,v.focus,t,r),b(w.camera,v.camera,t,r),w.zoom=n.MathUtils.damp(w.zoom,v.zoom,t,r),x.position.copy(w.camera),c(x)&&(x.zoom=w.zoom,x.updateProjectionMatrix()),h?(h.target.copy(w.focus),h.update()):x.lookAt(w.focus),y(),c(x)&&!(Math.abs(w.zoom-v.zoom)<f))return;if(!c(x)&&!g(w.camera,v.camera))return;if(h&&!g(w.focus,v.focus))return;w.animating=!1}})),a.createElement("group",{ref:p},a.createElement(i.Provider,{value:j},e))},exports.useBounds=function(){return a.useContext(i)};
package/core/Bounds.d.ts CHANGED
@@ -16,9 +16,10 @@ export declare type BoundsProps = JSX.IntrinsicElements['group'] & {
16
16
  damping?: number;
17
17
  fit?: boolean;
18
18
  clip?: boolean;
19
+ observe?: boolean;
19
20
  margin?: number;
20
21
  eps?: number;
21
22
  onFit?: (data: SizeProps) => void;
22
23
  };
23
- export declare function Bounds({ children, damping, fit, clip, margin, eps, onFit }: BoundsProps): JSX.Element;
24
+ export declare function Bounds({ children, damping, fit, clip, observe, margin, eps, onFit }: BoundsProps): JSX.Element;
24
25
  export declare function useBounds(): BoundsApi;
package/core/Bounds.js CHANGED
@@ -4,8 +4,6 @@ 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
7
  const isBox3 = def => def && def.isBox3;
10
8
 
11
9
  const context = /*#__PURE__*/React.createContext(null);
@@ -14,15 +12,19 @@ function Bounds({
14
12
  damping = 6,
15
13
  fit,
16
14
  clip,
15
+ observe,
17
16
  margin = 1.2,
18
17
  eps = 0.01,
19
18
  onFit
20
19
  }) {
21
20
  const ref = React.useRef(null);
22
- const camera = useThree(state => state.camera); // @ts-expect-error new in @react-three/fiber@7.0.5
23
-
24
- const controls = useThree(state => state.controls);
25
- const invalidate = useThree(state => state.invalidate);
21
+ const {
22
+ camera,
23
+ invalidate,
24
+ size,
25
+ controls: controlsImpl
26
+ } = useThree();
27
+ const controls = controlsImpl;
26
28
  const onFitRef = React.useRef(onFit);
27
29
  onFitRef.current = onFit;
28
30
 
@@ -68,7 +70,11 @@ function Bounds({
68
70
  getSize,
69
71
 
70
72
  refresh(object) {
71
- if (isObject3D(object)) box.setFromObject(object);else if (isBox3(object)) box.copy(object);else if (ref.current) box.setFromObject(ref.current);
73
+ if (isBox3(object)) box.copy(object);else {
74
+ const target = object || ref.current;
75
+ target.updateWorldMatrix(true, true);
76
+ box.setFromObject(target);
77
+ }
72
78
 
73
79
  if (box.isEmpty()) {
74
80
  const max = camera.position.length() || 10;
@@ -97,6 +103,7 @@ function Bounds({
97
103
  camera.far = distance * 100;
98
104
  camera.updateProjectionMatrix();
99
105
  if (controls) controls.update();
106
+ invalidate();
100
107
  return this;
101
108
  },
102
109
 
@@ -147,21 +154,16 @@ function Bounds({
147
154
  controls.target.copy(goal.focus);
148
155
  controls.update();
149
156
  }
150
-
151
- invalidate();
152
157
  }
153
158
 
154
159
  if (onFitRef.current) onFitRef.current(this.getSize());
160
+ invalidate();
155
161
  return this;
156
162
  }
157
163
 
158
164
  };
159
165
  }, [box, camera, controls, margin, damping, invalidate]);
160
166
  React.useLayoutEffect(() => {
161
- api.refresh();
162
- if (fit) api.fit();
163
- if (clip) api.clip();
164
-
165
167
  if (controls) {
166
168
  // Try to prevent drag hijacking
167
169
  const callback = () => current.animating = false;
@@ -169,7 +171,16 @@ function Bounds({
169
171
  controls.addEventListener('start', callback);
170
172
  return () => controls.removeEventListener('start', callback);
171
173
  }
172
- }, [clip, fit, controls]);
174
+ }, [controls]); // Scale pointer on window resize
175
+
176
+ const count = React.useRef(0);
177
+ React.useLayoutEffect(() => {
178
+ if (observe || count.current++ === 0) {
179
+ api.refresh();
180
+ if (fit) api.fit();
181
+ if (clip) api.clip();
182
+ }
183
+ }, [size, clip, fit, observe]);
173
184
  useFrame((state, delta) => {
174
185
  if (current.animating) {
175
186
  damp(current.focus, goal.focus, damping, delta);
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("lodash.pick");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),c=n(t),i=a(r);function l(e,{keys:t=["near","far","color","distance","decay","penumbra","angle","intensity","skeleton","visible","castShadow","receiveShadow","morphTargetDictionary","morphTargetInfluences","name","geometry","material","position","rotation","scale","up","userData"],deep:r,inject:a,castShadow:n,receiveShadow:o}){let l=i.default(e,t);return r&&(l.geometry&&"materialsOnly"!==r&&(l.geometry=l.geometry.clone()),l.material&&"geometriesOnly"!==r&&(l.material=l.material.clone())),a&&(l="function"==typeof a?{...l,children:a(e)}:c.isValidElement(a)?{...l,children:a}:{...l,...a}),"Mesh"===e.type&&(n&&(l.castShadow=!0),o&&(l.receiveShadow=!0)),l}const u=c.forwardRef((({object:e,children:t,deep:r,castShadow:a,receiveShadow:n,inject:i,keys:d,...s},f)=>{const p={keys:d,deep:r,inject:i,castShadow:a,receiveShadow:n};if(Array.isArray(e))return c.createElement("group",o.default({},s,{ref:f}),e.map((e=>c.createElement(u,o.default({key:e.uuid,object:e},p)))),t);const{children:y,...m}=l(e,p),h=e.type[0].toLowerCase()+e.type.slice(1);return c.createElement(h,o.default({},m,s,{ref:f}),(null==e?void 0:e.children).map((e=>{let t={},r=e.type[0].toLowerCase()+e.type.slice(1);return"group"===r||"object3D"===r?(r=u,t={object:e,...p}):t=l(e,p),c.createElement(r,o.default({key:e.uuid},t))})),t,y)}));exports.Clone=u;
@@ -0,0 +1,11 @@
1
+ import * as React from 'react';
2
+ import { MeshProps } from '@react-three/fiber';
3
+ export declare const Clone: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").GroupProps, "children"> & {
4
+ object: THREE.Object3D | THREE.Object3D[];
5
+ children?: React.ReactNode;
6
+ deep?: boolean | "materialsOnly" | "geometriesOnly" | undefined;
7
+ keys?: string[] | undefined;
8
+ inject?: React.ReactNode | MeshProps | ((object: THREE.Object3D) => React.ReactNode);
9
+ castShadow?: boolean | undefined;
10
+ receiveShadow?: boolean | undefined;
11
+ }, "object" | "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "isGroup" | "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 | "keys" | "deep" | "inject"> & React.RefAttributes<import("three").Group>>;
package/core/Clone.js ADDED
@@ -0,0 +1,92 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as React from 'react';
3
+ import pick from 'lodash.pick';
4
+
5
+ function createSpread(child, {
6
+ keys = ['near', 'far', 'color', 'distance', 'decay', 'penumbra', 'angle', 'intensity', 'skeleton', 'visible', 'castShadow', 'receiveShadow', 'morphTargetDictionary', 'morphTargetInfluences', 'name', 'geometry', 'material', 'position', 'rotation', 'scale', 'up', 'userData'],
7
+ deep,
8
+ inject,
9
+ castShadow,
10
+ receiveShadow
11
+ }) {
12
+ let spread = pick(child, keys);
13
+
14
+ if (deep) {
15
+ if (spread.geometry && deep !== 'materialsOnly') spread.geometry = spread.geometry.clone();
16
+ if (spread.material && deep !== 'geometriesOnly') spread.material = spread.material.clone();
17
+ }
18
+
19
+ if (inject) {
20
+ if (typeof inject === 'function') spread = { ...spread,
21
+ children: inject(child)
22
+ };else if ( /*#__PURE__*/React.isValidElement(inject)) spread = { ...spread,
23
+ children: inject
24
+ };else spread = { ...spread,
25
+ ...inject
26
+ };
27
+ }
28
+
29
+ if (child.type === 'Mesh') {
30
+ if (castShadow) spread.castShadow = true;
31
+ if (receiveShadow) spread.receiveShadow = true;
32
+ }
33
+
34
+ return spread;
35
+ }
36
+
37
+ const Clone = /*#__PURE__*/React.forwardRef(({
38
+ object,
39
+ children,
40
+ deep,
41
+ castShadow,
42
+ receiveShadow,
43
+ inject,
44
+ keys,
45
+ ...props
46
+ }, forwardRef) => {
47
+ const config = {
48
+ keys,
49
+ deep,
50
+ inject,
51
+ castShadow,
52
+ receiveShadow
53
+ }; // Deal with arrayed clones
54
+
55
+ if (Array.isArray(object)) {
56
+ return /*#__PURE__*/React.createElement("group", _extends({}, props, {
57
+ ref: forwardRef
58
+ }), object.map(o => /*#__PURE__*/React.createElement(Clone, _extends({
59
+ key: o.uuid,
60
+ object: o
61
+ }, config))), children);
62
+ } // Singleton clones
63
+
64
+
65
+ const {
66
+ children: injectChildren,
67
+ ...spread
68
+ } = createSpread(object, config);
69
+ const Element = object.type[0].toLowerCase() + object.type.slice(1);
70
+ return /*#__PURE__*/React.createElement(Element, _extends({}, spread, props, {
71
+ ref: forwardRef
72
+ }), (object == null ? void 0 : object.children).map(child => {
73
+ let spread = {};
74
+ let Element = child.type[0].toLowerCase() + child.type.slice(1);
75
+
76
+ if (Element === 'group' || Element === 'object3D') {
77
+ Element = Clone;
78
+ spread = {
79
+ object: child,
80
+ ...config
81
+ };
82
+ } else {
83
+ spread = createSpread(child, config);
84
+ }
85
+
86
+ return /*#__PURE__*/React.createElement(Element, _extends({
87
+ key: child.uuid
88
+ }, spread));
89
+ }), children, injectChildren);
90
+ });
91
+
92
+ export { Clone };
package/core/Cloud.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("./Billboard.cjs.js"),a=require("./shapes.cjs.js"),n=require("./useTexture.cjs.js");function s(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("@babel/runtime/helpers/extends"),require("react-merge-refs"),require("three");var c=s(e);exports.Cloud=function({opacity:e=.5,speed:s=.4,width:i=10,depth:o=1.5,segments:u=20,...l}){const d=c.useRef(),h=n.useTexture("https://rawcdn.githack.com/pmndrs/drei-assets/9225a9f1fbd449d9411125c2f419b843d0308c9f/cloud.png"),m=c.useMemo((()=>[...new Array(u)].map(((e,r)=>({x:i/2-Math.random()*i,y:i/2-Math.random()*i,scale:.4+Math.sin((r+1)/u*Math.PI)*(10*(.2+Math.random())),density:Math.max(.2,Math.random()),rotation:Math.max(.002,.005*Math.random())*s})))),[i,u,s]);return r.useFrame((e=>{var r;return null==(r=d.current)?void 0:r.children.forEach(((r,t)=>{r.children[0].rotation.z+=m[t].rotation,r.children[0].scale.setScalar(m[t].scale+(1+Math.sin(e.clock.getElapsedTime()/10))/2*t/10)}))})),c.createElement("group",l,c.createElement("group",{position:[0,0,u/2*o],ref:d},m.map((({x:r,y:n,scale:s,density:i},u)=>c.createElement(t.Billboard,{key:u,position:[r,n,-u*o]},c.createElement(a.Plane,{scale:s,rotation:[0,0,0]},c.createElement("meshStandardMaterial",{map:h,transparent:!0,opacity:s/6*i*e,depthTest:!1})))))))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("./Billboard.cjs.js"),a=require("./shapes.cjs.js"),n=require("./useTexture.cjs.js");function s(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("@babel/runtime/helpers/extends"),require("react-merge-refs"),require("three");var c=s(e);exports.Cloud=function({opacity:e=.5,speed:s=.4,width:o=10,depth:i=1.5,segments:u=20,texture:l="https://rawcdn.githack.com/pmndrs/drei-assets/9225a9f1fbd449d9411125c2f419b843d0308c9f/cloud.png",color:d="#ffffff",depthTest:f=!0,...h}){const p=c.useRef(),m=n.useTexture(l),b=c.useMemo((()=>[...new Array(u)].map(((e,r)=>({x:o/2-Math.random()*o,y:o/2-Math.random()*o,scale:.4+Math.sin((r+1)/u*Math.PI)*(10*(.2+Math.random())),density:Math.max(.2,Math.random()),rotation:Math.max(.002,.005*Math.random())*s})))),[o,u,s]);return r.useFrame((e=>{var r;return null==(r=p.current)?void 0:r.children.forEach(((r,t)=>{r.children[0].rotation.z+=b[t].rotation,r.children[0].scale.setScalar(b[t].scale+(1+Math.sin(e.clock.getElapsedTime()/10))/2*t/10)}))})),c.createElement("group",h,c.createElement("group",{position:[0,0,u/2*i],ref:p},b.map((({x:r,y:n,scale:s,density:o},u)=>c.createElement(t.Billboard,{key:u,position:[r,n,-u*i]},c.createElement(a.Plane,{scale:s,rotation:[0,0,0]},c.createElement("meshStandardMaterial",{map:m,transparent:!0,opacity:s/6*o*e,depthTest:f,color:d})))))))};
package/core/Cloud.d.ts CHANGED
@@ -1,9 +1,12 @@
1
1
  /// <reference types="react" />
2
- export declare function Cloud({ opacity, speed, width, depth, segments, ...props }: {
2
+ export declare function Cloud({ opacity, speed, width, depth, segments, texture, color, depthTest, ...props }: {
3
3
  [x: string]: any;
4
4
  opacity?: number | undefined;
5
5
  speed?: number | undefined;
6
6
  width?: number | undefined;
7
7
  depth?: number | undefined;
8
8
  segments?: number | undefined;
9
+ texture?: string | undefined;
10
+ color?: string | undefined;
11
+ depthTest?: boolean | undefined;
9
12
  }): JSX.Element;
package/core/Cloud.js CHANGED
@@ -11,10 +11,13 @@ function Cloud({
11
11
  width = 10,
12
12
  depth = 1.5,
13
13
  segments = 20,
14
+ texture = CLOUD_URL,
15
+ color = "#ffffff",
16
+ depthTest = true,
14
17
  ...props
15
18
  }) {
16
19
  const group = React.useRef();
17
- const texture = useTexture(CLOUD_URL);
20
+ const cloudTexture = useTexture(texture);
18
21
  const clouds = React.useMemo(() => [...new Array(segments)].map((_, index) => ({
19
22
  x: width / 2 - Math.random() * width,
20
23
  y: width / 2 - Math.random() * width,
@@ -45,10 +48,11 @@ function Cloud({
45
48
  scale: scale,
46
49
  rotation: [0, 0, 0]
47
50
  }, /*#__PURE__*/React.createElement("meshStandardMaterial", {
48
- map: texture,
51
+ map: cloudTexture,
49
52
  transparent: true,
50
53
  opacity: scale / 6 * density * opacity,
51
- depthTest: false
54
+ depthTest: depthTest,
55
+ color: color
52
56
  }))))));
53
57
  }
54
58
 
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three");function u(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 u=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,u.get?u:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var c=u(e),a=n(t);exports.ComputedAttribute=({compute:e,name:t,...u})=>{const[n]=a.useState((()=>new r.BufferAttribute(new Float32Array(0),1))),f=a.useRef(null);return a.useLayoutEffect((()=>{if(f.current){var t;const r=null!==(t=f.current.parent)&&void 0!==t?t:f.current.__r3f.parent,u=e(r);f.current.copy(u)}}),[e]),a.createElement("primitive",c.default({ref:f,object:n,attach:`attributes-${t}`},u))};
@@ -0,0 +1,9 @@
1
+ import { BufferAttributeProps } from '@react-three/fiber';
2
+ import * as React from 'react';
3
+ import { BufferAttribute, BufferGeometry } from 'three';
4
+ declare type Props = {
5
+ compute: (geometry: BufferGeometry) => BufferAttribute;
6
+ name: string;
7
+ };
8
+ export declare const ComputedAttribute: ({ compute, name, ...props }: React.PropsWithChildren<Props & BufferAttributeProps>) => JSX.Element;
9
+ export {};
@@ -0,0 +1,34 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as React from 'react';
3
+ import { BufferAttribute } from 'three';
4
+
5
+ /**
6
+ * Used exclusively as a child of a BufferGeometry.
7
+ * Computes the BufferAttribute by calling the `compute` function
8
+ * and attaches the attribute to the geometry.
9
+ */
10
+ const ComputedAttribute = ({
11
+ compute,
12
+ name,
13
+ ...props
14
+ }) => {
15
+ const [bufferAttribute] = React.useState(() => new BufferAttribute(new Float32Array(0), 1));
16
+ const primitive = React.useRef(null);
17
+ React.useLayoutEffect(() => {
18
+ if (primitive.current) {
19
+ var _ref;
20
+
21
+ // @ts-expect-error brittle
22
+ const parent = (_ref = primitive.current.parent) !== null && _ref !== void 0 ? _ref : primitive.current.__r3f.parent;
23
+ const attr = compute(parent);
24
+ primitive.current.copy(attr);
25
+ }
26
+ }, [compute]);
27
+ return /*#__PURE__*/React.createElement("primitive", _extends({
28
+ ref: primitive,
29
+ object: bufferAttribute,
30
+ attach: `attributes-${name}`
31
+ }, props));
32
+ };
33
+
34
+ export { ComputedAttribute };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),a=require("@react-three/fiber"),n=require("three-stdlib");function u(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 a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var i=u(e),s=o(r),l=o(t);const c=s.forwardRef((({scale:e,frames:r=1/0,opacity:t=1,width:u=1,height:o=1,blur:c=1,far:d=10,resolution:f=256,...h},m)=>{const p=a.useThree((({scene:e})=>e)),g=a.useThree((({gl:e})=>e)),b=s.useRef();u*=Array.isArray(e)?e[0]:e||1,o*=Array.isArray(e)?e[1]:e||1;const[M,y,v,w,T,x,R]=s.useMemo((()=>{const e=new l.WebGLRenderTarget(f,f),r=new l.WebGLRenderTarget(f,f);r.texture.generateMipmaps=e.texture.generateMipmaps=!1;const t=new l.PlaneBufferGeometry(u,o).rotateX(Math.PI/2),a=new l.Mesh(t),i=new l.MeshDepthMaterial;i.depthTest=i.depthWrite=!1,i.onBeforeCompile=e=>e.fragmentShader=e.fragmentShader.replace("1.0 - fragCoordZ ), opacity );","0.0 ), ( 1.0 - fragCoordZ ) * 1.0 );");const s=new l.ShaderMaterial(n.HorizontalBlurShader),c=new l.ShaderMaterial(n.VerticalBlurShader);return c.depthTest=s.depthTest=!1,[e,t,i,a,s,c,r]}),[f,u,o,e]);let j=0;return a.useFrame((()=>{if(b.current&&(r===1/0||j<r)){const e=p.background;p.background=null,p.overrideMaterial=v,g.setRenderTarget(M),g.render(p,b.current),p.overrideMaterial=null,w.material=T,w.material.uniforms.tDiffuse.value=M.texture,T.uniforms.h.value=c/256,g.setRenderTarget(R),g.render(w,b.current),w.material=x,w.material.uniforms.tDiffuse.value=R.texture,x.uniforms.v.value=c/256,g.setRenderTarget(M),g.render(w,b.current),g.setRenderTarget(null),p.background=e,j++}})),s.createElement("group",i.default({"rotation-x":Math.PI/2},h,{ref:m}),s.createElement("mesh",{geometry:y,scale:[1,-1,1],rotation:[-Math.PI/2,0,0]},s.createElement("meshBasicMaterial",{map:M.texture,transparent:!0,opacity:t})),s.createElement("orthographicCamera",{ref:b,args:[-u/2,u/2,o/2,-o/2,0,d]}))}));exports.ContactShadows=c;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),a=require("@react-three/fiber"),n=require("three-stdlib");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var i=o(e),l=u(r),s=u(t);const c=l.forwardRef((({scale:e,frames:r=1/0,opacity:t=1,width:o=1,height:u=1,blur:c=1,far:d=10,resolution:f=256,smooth:h=!0,color:m="#000000",...p},g)=>{const v=a.useThree((({scene:e})=>e)),b=a.useThree((({gl:e})=>e)),M=l.useRef(null);o*=Array.isArray(e)?e[0]:e||1,u*=Array.isArray(e)?e[1]:e||1;const[y,w,T,S,x,R,j]=l.useMemo((()=>{const e=new s.WebGLRenderTarget(f,f),r=new s.WebGLRenderTarget(f,f);r.texture.generateMipmaps=e.texture.generateMipmaps=!1;const t=new s.PlaneBufferGeometry(o,u).rotateX(Math.PI/2),a=new s.Mesh(t),i=new s.MeshDepthMaterial;i.depthTest=i.depthWrite=!1,i.onBeforeCompile=e=>{e.uniforms={...e.uniforms,ucolor:{value:new s.Color(m).convertSRGBToLinear()}},e.fragmentShader=e.fragmentShader.replace("void main() {","uniform vec3 ucolor;\n void main() {\n "),e.fragmentShader=e.fragmentShader.replace("vec4( vec3( 1.0 - fragCoordZ ), opacity );","vec4( ucolor, ( 1.0 - fragCoordZ ) * 1.0 );")};const l=new s.ShaderMaterial(n.HorizontalBlurShader),c=new s.ShaderMaterial(n.VerticalBlurShader);return c.depthTest=l.depthTest=!1,[e,t,i,a,l,c,r]}),[f,o,u,e]),C=l.useCallback((e=>{S.visible=!0,S.material=x,x.uniforms.tDiffuse.value=y.texture,x.uniforms.h.value=1*e/256,b.setRenderTarget(j),b.render(S,M.current),S.material=R,R.uniforms.tDiffuse.value=j.texture,R.uniforms.v.value=1*e/256,b.setRenderTarget(y),b.render(S,M.current),S.visible=!1}),[]);let O=0;return a.useFrame((()=>{if(M.current&&(r===1/0||O<r)){const e=v.background;v.background=null;const r=v.overrideMaterial;v.overrideMaterial=T,b.setRenderTarget(y),b.render(v,M.current),v.overrideMaterial=r,C(c),h&&C(.4*c),b.setRenderTarget(null),v.background=e,O++}})),l.createElement("group",i.default({"rotation-x":Math.PI/2},p,{ref:g}),l.createElement("mesh",{geometry:w,scale:[1,-1,1],rotation:[-Math.PI/2,0,0]},l.createElement("meshBasicMaterial",{map:y.texture,transparent:!0,opacity:t})),l.createElement("orthographicCamera",{ref:M,args:[-o/2,o/2,u/2,-u/2,0,d]}))}));exports.ContactShadows=c;
@@ -1,11 +1,14 @@
1
1
  import * as React from 'react';
2
+ import * as THREE from 'three';
2
3
  export declare const ContactShadows: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").GroupProps, "scale"> & {
3
4
  opacity?: number | undefined;
4
5
  width?: number | undefined;
5
6
  height?: number | undefined;
6
7
  blur?: number | undefined;
7
8
  far?: number | undefined;
9
+ smooth?: boolean | undefined;
8
10
  resolution?: number | undefined;
9
11
  frames?: number | undefined;
10
12
  scale?: number | [x: number, y: number] | undefined;
11
- }, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "isGroup" | "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 | "blur" | "height" | "opacity" | "width" | "resolution" | "far" | "frames"> & React.RefAttributes<unknown>>;
13
+ color?: THREE.ColorRepresentation | undefined;
14
+ }, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "isGroup" | "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 | "smooth" | "blur" | "height" | "opacity" | "width" | "resolution" | "far" | "frames"> & React.RefAttributes<unknown>>;
@@ -13,6 +13,8 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
13
13
  blur = 1,
14
14
  far = 10,
15
15
  resolution = 256,
16
+ smooth = true,
17
+ color = '#000000',
16
18
  ...props
17
19
  }, ref) => {
18
20
  const scene = useThree(({
@@ -21,7 +23,7 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
21
23
  const gl = useThree(({
22
24
  gl
23
25
  }) => gl);
24
- const shadowCamera = React.useRef();
26
+ const shadowCamera = React.useRef(null);
25
27
  width = width * (Array.isArray(scale) ? scale[0] : scale || 1);
26
28
  height = height * (Array.isArray(scale) ? scale[1] : scale || 1);
27
29
  const [renderTarget, planeGeometry, depthMaterial, blurPlane, horizontalBlurMaterial, verticalBlurMaterial, renderTargetBlur] = React.useMemo(() => {
@@ -33,32 +35,50 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
33
35
  const depthMaterial = new THREE.MeshDepthMaterial();
34
36
  depthMaterial.depthTest = depthMaterial.depthWrite = false;
35
37
 
36
- depthMaterial.onBeforeCompile = shader => shader.fragmentShader = shader.fragmentShader.replace('1.0 - fragCoordZ ), opacity );', '0.0 ), ( 1.0 - fragCoordZ ) * 1.0 );');
38
+ depthMaterial.onBeforeCompile = shader => {
39
+ shader.uniforms = { ...shader.uniforms,
40
+ ucolor: {
41
+ value: new THREE.Color(color).convertSRGBToLinear()
42
+ }
43
+ };
44
+ shader.fragmentShader = shader.fragmentShader.replace(`void main() {`, //
45
+ `uniform vec3 ucolor;
46
+ void main() {
47
+ `);
48
+ shader.fragmentShader = shader.fragmentShader.replace('vec4( vec3( 1.0 - fragCoordZ ), opacity );', 'vec4( ucolor, ( 1.0 - fragCoordZ ) * 1.0 );');
49
+ };
37
50
 
38
51
  const horizontalBlurMaterial = new THREE.ShaderMaterial(HorizontalBlurShader);
39
52
  const verticalBlurMaterial = new THREE.ShaderMaterial(VerticalBlurShader);
40
53
  verticalBlurMaterial.depthTest = horizontalBlurMaterial.depthTest = false;
41
54
  return [renderTarget, planeGeometry, depthMaterial, blurPlane, horizontalBlurMaterial, verticalBlurMaterial, renderTargetBlur];
42
55
  }, [resolution, width, height, scale]);
56
+ const blurShadows = React.useCallback(blur => {
57
+ blurPlane.visible = true;
58
+ blurPlane.material = horizontalBlurMaterial;
59
+ horizontalBlurMaterial.uniforms.tDiffuse.value = renderTarget.texture;
60
+ horizontalBlurMaterial.uniforms.h.value = blur * 1 / 256;
61
+ gl.setRenderTarget(renderTargetBlur);
62
+ gl.render(blurPlane, shadowCamera.current);
63
+ blurPlane.material = verticalBlurMaterial;
64
+ verticalBlurMaterial.uniforms.tDiffuse.value = renderTargetBlur.texture;
65
+ verticalBlurMaterial.uniforms.v.value = blur * 1 / 256;
66
+ gl.setRenderTarget(renderTarget);
67
+ gl.render(blurPlane, shadowCamera.current);
68
+ blurPlane.visible = false;
69
+ }, []);
43
70
  let count = 0;
44
71
  useFrame(() => {
45
72
  if (shadowCamera.current && (frames === Infinity || count < frames)) {
46
73
  const initialBackground = scene.background;
47
74
  scene.background = null;
75
+ const initialOverrideMaterial = scene.overrideMaterial;
48
76
  scene.overrideMaterial = depthMaterial;
49
77
  gl.setRenderTarget(renderTarget);
50
78
  gl.render(scene, shadowCamera.current);
51
- scene.overrideMaterial = null;
52
- blurPlane.material = horizontalBlurMaterial;
53
- blurPlane.material.uniforms.tDiffuse.value = renderTarget.texture;
54
- horizontalBlurMaterial.uniforms.h.value = blur / 256;
55
- gl.setRenderTarget(renderTargetBlur);
56
- gl.render(blurPlane, shadowCamera.current);
57
- blurPlane.material = verticalBlurMaterial;
58
- blurPlane.material.uniforms.tDiffuse.value = renderTargetBlur.texture;
59
- verticalBlurMaterial.uniforms.v.value = blur / 256;
60
- gl.setRenderTarget(renderTarget);
61
- gl.render(blurPlane, shadowCamera.current);
79
+ scene.overrideMaterial = initialOverrideMaterial;
80
+ blurShadows(blur);
81
+ if (smooth) blurShadows(blur * 0.4);
62
82
  gl.setRenderTarget(null);
63
83
  scene.background = initialBackground;
64
84
  count++;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber");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 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 u=n(r);exports.CubeCamera=function({children:r,fog:n,frames:a=1/0,resolution:i=256,near:c=1,far:o=1e3,...f}){const s=u.useRef(),[l,g]=u.useState(null),b=t.useThree((({scene:e})=>e)),m=t.useThree((({gl:e})=>e)),d=u.useMemo((()=>new e.WebGLCubeRenderTarget(i,{minFilter:e.LinearFilter,magFilter:e.LinearFilter,format:e.RGBFormat,encoding:m.outputEncoding})),[i]);let p=0;return t.useFrame((()=>{if(l&&s.current&&(a===1/0||p<a)){s.current.traverse((e=>e.visible=!1));const e=b.fog;b.fog=n||e,l.update(m,b),b.fog=e,s.current.traverse((e=>e.visible=!0)),p++}})),u.createElement("group",f,u.createElement("cubeCamera",{ref:g,args:[c,o,d]}),u.createElement("group",{ref:s},r(d.texture)))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber");function u(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 n=u(r);exports.CubeCamera=function({children:r,fog:u,frames:a=1/0,resolution:c=256,near:o=1,far:s=1e3,...f}){const i=n.useRef(),[l,b]=n.useState(null),g=t.useThree((({scene:e})=>e)),p=t.useThree((({gl:e})=>e)),d=n.useMemo((()=>{const r=new e.WebGLCubeRenderTarget(c);return r.texture.type=e.HalfFloatType,r}),[c]);let m=0;return t.useFrame((()=>{if(l&&i.current&&(a===1/0||m<a)){i.current.traverse((e=>e.visible=!1));const e=g.fog;g.fog=u||e,l.update(p,g),g.fog=e,i.current.traverse((e=>e.visible=!0)),m++}})),n.createElement("group",f,n.createElement("cubeCamera",{ref:b,args:[o,s,d]}),n.createElement("group",{ref:i},r(d.texture)))};
@@ -1,4 +1,4 @@
1
- import { WebGLCubeRenderTarget, LinearFilter, RGBFormat } from 'three';
1
+ import { WebGLCubeRenderTarget, HalfFloatType } from 'three';
2
2
  import * as React from 'react';
3
3
  import { useThree, useFrame } from '@react-three/fiber';
4
4
 
@@ -19,12 +19,11 @@ function CubeCamera({
19
19
  const gl = useThree(({
20
20
  gl
21
21
  }) => gl);
22
- const fbo = React.useMemo(() => new WebGLCubeRenderTarget(resolution, {
23
- minFilter: LinearFilter,
24
- magFilter: LinearFilter,
25
- format: RGBFormat,
26
- encoding: gl.outputEncoding
27
- }), [resolution]);
22
+ const fbo = React.useMemo(() => {
23
+ const fbo = new WebGLCubeRenderTarget(resolution);
24
+ fbo.texture.type = HalfFloatType;
25
+ return fbo;
26
+ }, [resolution]);
28
27
  let count = 0;
29
28
  useFrame(() => {
30
29
  if (camera && ref.current && (frames === Infinity || count < frames)) {