@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
@@ -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 };
package/core/Shadow.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { Mesh, Color } from 'three';
3
- export declare const Shadow: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").Node<Mesh<import("three").BufferGeometry, import("three").Material | import("three").Material[]>, typeof Mesh>, import("@react-three/fiber").NonFunctionKeys<{
3
+ export declare const Shadow: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").ExtendedColors<import("@react-three/fiber").Overwrite<Partial<Mesh<import("three").BufferGeometry, import("three").Material | import("three").Material[]>>, import("@react-three/fiber").NodeProps<Mesh<import("three").BufferGeometry, import("three").Material | import("three").Material[]>, typeof Mesh>>>, import("@react-three/fiber").NonFunctionKeys<{
4
4
  position?: import("@react-three/fiber").Vector3 | undefined;
5
5
  up?: import("@react-three/fiber").Vector3 | undefined;
6
6
  scale?: import("@react-three/fiber").Vector3 | undefined;
@@ -1,8 +1,24 @@
1
1
  import * as React from 'react';
2
2
  import { DepthTexture, SpotLight as SpotLightImpl } from 'three';
3
- declare const SpotLight: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").Object3DNode<SpotLightImpl, typeof SpotLightImpl>, "color" | undefined> & {
4
- color?: import("@react-three/fiber").Color | undefined;
5
- } & {
3
+ declare const SpotLight: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").ExtendedColors<import("@react-three/fiber").Overwrite<Partial<SpotLightImpl>, import("@react-three/fiber").NodeProps<SpotLightImpl, typeof SpotLightImpl>>>, import("@react-three/fiber").NonFunctionKeys<{
4
+ position?: import("@react-three/fiber").Vector3 | undefined;
5
+ up?: import("@react-three/fiber").Vector3 | undefined;
6
+ scale?: import("@react-three/fiber").Vector3 | undefined;
7
+ rotation?: import("@react-three/fiber").Euler | undefined;
8
+ matrix?: import("@react-three/fiber").Matrix4 | undefined;
9
+ quaternion?: import("@react-three/fiber").Quaternion | undefined;
10
+ layers?: import("@react-three/fiber").Layers | undefined;
11
+ dispose?: (() => void) | null | undefined;
12
+ }>> & {
13
+ position?: import("@react-three/fiber").Vector3 | undefined;
14
+ up?: import("@react-three/fiber").Vector3 | undefined;
15
+ scale?: import("@react-three/fiber").Vector3 | undefined;
16
+ rotation?: import("@react-three/fiber").Euler | undefined;
17
+ matrix?: import("@react-three/fiber").Matrix4 | undefined;
18
+ quaternion?: import("@react-three/fiber").Quaternion | undefined;
19
+ layers?: import("@react-three/fiber").Layers | undefined;
20
+ dispose?: (() => void) | null | undefined;
21
+ } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
6
22
  depthBuffer?: DepthTexture | undefined;
7
23
  attenuation?: number | undefined;
8
24
  anglePower?: number | undefined;
@@ -10,5 +26,5 @@ declare const SpotLight: React.ForwardRefExoticComponent<Pick<Omit<import("@reac
10
26
  radiusBottom?: number | undefined;
11
27
  opacity?: number | undefined;
12
28
  color?: string | number | undefined;
13
- }, "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>>;
14
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 s(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(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("use-asset"),require("../helpers/environment-assets.cjs.js");var u=s(e),c=o(t),l=o(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:s=!0,environment:o="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(s){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,s]),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)),o&&c.createElement(i.Environment,{preset:o}),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.d.ts CHANGED
@@ -26,7 +26,7 @@ declare type ControlsProto = {
26
26
  declare type Props = JSX.IntrinsicElements['group'] & {
27
27
  shadows?: boolean;
28
28
  adjustCamera?: boolean;
29
- environment?: PresetsType;
29
+ environment?: PresetsType | null;
30
30
  intensity?: number;
31
31
  ambience?: number;
32
32
  controls?: React.MutableRefObject<ControlsProto>;
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
  }
package/core/Stats.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/examples/js/libs/stats.min"),n=require("../helpers/useEffectfulState.cjs.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function f(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var c=f(e),a=u(r);exports.Stats=function({showPanel:e=0,className:r,parent:u}){const f=n.useEffectfulState((()=>new a.default),[]);return c.useEffect((()=>{if(f){const n=u&&u.current||document.body;f.showPanel(e),null==n||n.appendChild(f.dom),r&&f.dom.classList.add(r);const c=t.addEffect((()=>f.begin())),a=t.addAfterEffect((()=>f.end()));return()=>{null==n||n.removeChild(f.dom),c(),a()}}}),[u,f,r,e]),null};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@react-three/fiber"),r=require("stats.js"),n=require("../helpers/useEffectfulState.cjs.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function f(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var c=f(e),a=u(r);exports.Stats=function({showPanel:e=0,className:r,parent:u}){const f=n.useEffectfulState((()=>new a.default),[]);return c.useEffect((()=>{if(f){const n=u&&u.current||document.body;f.showPanel(e),null==n||n.appendChild(f.dom),r&&f.dom.classList.add(...r.split(" ").filter((e=>e)));const c=t.addEffect((()=>f.begin())),a=t.addAfterEffect((()=>f.end()));return()=>{null==n||n.removeChild(f.dom),c(),a()}}}),[u,f,r,e]),null};
package/core/Stats.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { addEffect, addAfterEffect } from '@react-three/fiber';
3
- import StatsImpl from 'three/examples/js/libs/stats.min';
3
+ import StatsImpl from 'stats.js';
4
4
  import { useEffectfulState } from '../helpers/useEffectfulState.js';
5
5
 
6
6
  function Stats({
@@ -14,7 +14,7 @@ function Stats({
14
14
  const node = parent && parent.current || document.body;
15
15
  stats.showPanel(showPanel);
16
16
  node == null ? void 0 : node.appendChild(stats.dom);
17
- if (className) stats.dom.classList.add(className);
17
+ if (className) stats.dom.classList.add(...className.split(' ').filter(cls => cls));
18
18
  const begin = addEffect(() => stats.begin());
19
19
  const end = addAfterEffect(() => stats.end());
20
20
  return () => {
package/core/Text.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("troika-three-text"),n=require("@react-three/fiber");function u(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 o=u(e),a=c(t);const i=a.forwardRef((({anchorX:e="center",anchorY:t="middle",children:u,onSync:c,...i},f)=>{const s=n.useThree((({invalidate:e})=>e)),[l]=a.useState((()=>new r.Text)),[d,b]=a.useMemo((()=>{const e=[];let t="";return a.Children.forEach(u,(r=>{"string"==typeof r||"number"==typeof r?t+=r:e.push(r)})),[e,t]}),[u]);return a.useLayoutEffect((()=>{l.sync((()=>{s(),c&&c(l)}))})),a.useEffect((()=>()=>l.dispose()),[l]),a.createElement("primitive",o.default({object:l,ref:f,text:b,anchorX:e,anchorY:t},i),d)}));exports.Text=i;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("troika-three-text"),n=require("@react-three/fiber"),o=require("suspend-react");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(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=c(e),i=u(t);const f=i.forwardRef((({anchorX:e="center",anchorY:t="middle",font:c,children:u,characters:f,onSync:s,...d},l)=>{const p=n.useThree((({invalidate:e})=>e)),[h]=i.useState((()=>new r.Text)),[b,y]=i.useMemo((()=>{const e=[];let t="";return i.Children.forEach(u,(r=>{"string"==typeof r||"number"==typeof r?t+=r:e.push(r)})),[e,t]}),[u]);return o.suspend((()=>new Promise((e=>r.preloadFont({font:c,characters:f},e)))),["troika-text",c,f]),i.useLayoutEffect((()=>{h.sync((()=>{p(),s&&s(h)}))})),i.useEffect((()=>()=>h.dispose()),[h]),i.createElement("primitive",a.default({object:h,ref:l,font:c,text:y,anchorX:e,anchorY:t},d),b)}));exports.Text=f;
package/core/Text.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { ReactThreeFiber } from '@react-three/fiber';
3
- export declare const Text: React.ForwardRefExoticComponent<Pick<Omit<ReactThreeFiber.Node<import("three").Mesh<import("three").BufferGeometry, import("three").Material | import("three").Material[]>, typeof import("three").Mesh>, ReactThreeFiber.NonFunctionKeys<{
3
+ export declare const Text: React.ForwardRefExoticComponent<Pick<Omit<ReactThreeFiber.ExtendedColors<ReactThreeFiber.Overwrite<Partial<import("three").Mesh<import("three").BufferGeometry, import("three").Material | import("three").Material[]>>, ReactThreeFiber.NodeProps<import("three").Mesh<import("three").BufferGeometry, import("three").Material | import("three").Material[]>, typeof import("three").Mesh>>>, ReactThreeFiber.NonFunctionKeys<{
4
4
  position?: ReactThreeFiber.Vector3 | undefined;
5
5
  up?: ReactThreeFiber.Vector3 | undefined;
6
6
  scale?: ReactThreeFiber.Vector3 | undefined;
@@ -20,6 +20,7 @@ export declare const Text: React.ForwardRefExoticComponent<Pick<Omit<ReactThreeF
20
20
  dispose?: (() => void) | null | undefined;
21
21
  } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
22
22
  children: React.ReactNode;
23
+ characters?: string | undefined;
23
24
  color?: ReactThreeFiber.Color | undefined;
24
25
  fontSize?: number | undefined;
25
26
  maxWidth?: number | undefined;
@@ -46,4 +47,4 @@ export declare const Text: React.ForwardRefExoticComponent<Pick<Omit<ReactThreeF
46
47
  fillOpacity?: number | undefined;
47
48
  debugSDF?: boolean | undefined;
48
49
  onSync?: ((troika: TextMeshImpl) => void) | undefined;
49
- }, "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 | "font" | "material" | "direction" | "fontSize" | "letterSpacing" | "lineHeight" | "maxWidth" | "outlineColor" | "outlineWidth" | "overflowWrap" | "textAlign" | "whiteSpace" | "fillOpacity" | "strokeOpacity" | "strokeWidth" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "anchorX" | "anchorY" | "onSync" | "clipRect" | "depthOffset" | "outlineOffsetX" | "outlineOffsetY" | "outlineBlur" | "outlineOpacity" | "strokeColor" | "debugSDF"> & React.RefAttributes<unknown>>;
50
+ }, "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 | "font" | "material" | "direction" | "fontSize" | "letterSpacing" | "lineHeight" | "maxWidth" | "outlineColor" | "outlineWidth" | "overflowWrap" | "textAlign" | "whiteSpace" | "fillOpacity" | "strokeOpacity" | "strokeWidth" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "anchorX" | "anchorY" | "characters" | "onSync" | "clipRect" | "depthOffset" | "outlineOffsetX" | "outlineOffsetY" | "outlineBlur" | "outlineOpacity" | "strokeColor" | "debugSDF"> & React.RefAttributes<unknown>>;
package/core/Text.js CHANGED
@@ -1,13 +1,16 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import * as React from 'react';
3
- import { Text as Text$1 } from 'troika-three-text';
3
+ import { Text as Text$1, preloadFont } from 'troika-three-text';
4
4
  import { useThree } from '@react-three/fiber';
5
+ import { suspend } from 'suspend-react';
5
6
 
6
7
  // eslint-disable-next-line prettier/prettier
7
8
  const Text = /*#__PURE__*/React.forwardRef(({
8
9
  anchorX = 'center',
9
10
  anchorY = 'middle',
11
+ font,
10
12
  children,
13
+ characters,
11
14
  onSync,
12
15
  ...props
13
16
  }, ref) => {
@@ -27,6 +30,10 @@ const Text = /*#__PURE__*/React.forwardRef(({
27
30
  });
28
31
  return [n, t];
29
32
  }, [children]);
33
+ suspend(() => new Promise(res => preloadFont({
34
+ font,
35
+ characters
36
+ }, res)), ['troika-text', font, characters]);
30
37
  React.useLayoutEffect(() => void troikaMesh.sync(() => {
31
38
  invalidate();
32
39
  if (onSync) onSync(troikaMesh);
@@ -37,6 +44,7 @@ const Text = /*#__PURE__*/React.forwardRef(({
37
44
  return /*#__PURE__*/React.createElement("primitive", _extends({
38
45
  object: troikaMesh,
39
46
  ref: ref,
47
+ font: font,
40
48
  text: text,
41
49
  anchorX: anchorX,
42
50
  anchorY: anchorY
@@ -1 +1 @@
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 a(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),c=a(r);const u=c.forwardRef((({makeDefault:e,camera:r,domElement:o,regress:a,onChange:u,onStart:i,onEnd:l,...d},f)=>{const{invalidate:v,camera:b,gl:m,events:p,set:E,get:g,performance:h,viewport:j}=t.useThree(),O=r||b,y=o||("boolean"!=typeof p.connected?p.connected:m.domElement),L=c.useMemo((()=>new n.TrackballControls(O)),[O]);return t.useFrame((()=>{L.enabled&&L.update()})),c.useEffect((()=>{const e=e=>{v(),a&&h.regress(),u&&u(e)};return L.connect(y),L.addEventListener("change",e),i&&L.addEventListener("start",i),l&&L.addEventListener("end",l),()=>{L.removeEventListener("change",e),i&&L.removeEventListener("start",i),l&&L.removeEventListener("end",l),L.dispose()}}),[y,u,i,l,a,L,v]),c.useEffect((()=>{L.handleResize()}),[j]),c.useEffect((()=>{if(e){const e=g().controls;return E({controls:L}),()=>E({controls:e})}}),[e,L]),c.createElement("primitive",s.default({ref:f,object:L},d))}));exports.TrackballControls=u;
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 a(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),c=a(r);const u=c.forwardRef((({makeDefault:e,camera:r,domElement:o,regress:a,onChange:u,onStart:i,onEnd:f,...l},d)=>{const{invalidate:v,camera:m,gl:b,events:E,set:p,get:g,performance:h,viewport:j}=t.useThree(),O=r||m,L=o||E.connected||b.domElement,y=c.useMemo((()=>new n.TrackballControls(O)),[O]);return t.useFrame((()=>{y.enabled&&y.update()})),c.useEffect((()=>(y.connect(L),()=>{y.dispose()})),[L,a,y,v]),c.useEffect((()=>{const e=e=>{v(),a&&h.regress(),u&&u(e)};return y.addEventListener("change",e),i&&y.addEventListener("start",i),f&&y.addEventListener("end",f),()=>{i&&y.removeEventListener("start",i),f&&y.removeEventListener("end",f),y.removeEventListener("change",e)}}),[u,i,f]),c.useEffect((()=>{y.handleResize()}),[j]),c.useEffect((()=>{if(e){const e=g().controls;return p({controls:y}),()=>p({controls:e})}}),[e,y]),c.createElement("primitive",s.default({ref:d,object:y},l))}));exports.TrackballControls=u;
@@ -24,11 +24,15 @@ const TrackballControls = /*#__PURE__*/React.forwardRef(({
24
24
  viewport
25
25
  } = useThree();
26
26
  const explCamera = camera || defaultCamera;
27
- const explDomElement = domElement || (typeof events.connected !== 'boolean' ? events.connected : gl.domElement);
27
+ const explDomElement = domElement || events.connected || gl.domElement;
28
28
  const controls = React.useMemo(() => new TrackballControls$1(explCamera), [explCamera]);
29
29
  useFrame(() => {
30
30
  if (controls.enabled) controls.update();
31
31
  });
32
+ React.useEffect(() => {
33
+ controls.connect(explDomElement);
34
+ return () => void controls.dispose();
35
+ }, [explDomElement, regress, controls, invalidate]);
32
36
  React.useEffect(() => {
33
37
  const callback = e => {
34
38
  invalidate();
@@ -36,17 +40,15 @@ const TrackballControls = /*#__PURE__*/React.forwardRef(({
36
40
  if (onChange) onChange(e);
37
41
  };
38
42
 
39
- controls.connect(explDomElement);
40
43
  controls.addEventListener('change', callback);
41
44
  if (onStart) controls.addEventListener('start', onStart);
42
45
  if (onEnd) controls.addEventListener('end', onEnd);
43
46
  return () => {
44
- controls.removeEventListener('change', callback);
45
47
  if (onStart) controls.removeEventListener('start', onStart);
46
48
  if (onEnd) controls.removeEventListener('end', onEnd);
47
- controls.dispose();
49
+ controls.removeEventListener('change', callback);
48
50
  };
49
- }, [explDomElement, onChange, onStart, onEnd, regress, controls, invalidate]);
51
+ }, [onChange, onStart, onEnd]);
50
52
  React.useEffect(() => {
51
53
  controls.handleResize();
52
54
  }, [viewport]);
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@react-three/fiber"),t=require("react"),r=require("three"),n=require("meshline");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 n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var i=o(t);const s={width:.2,length:1,decay:1,local:!1,stride:0,interval:1},u=(e,t=1)=>(e.set(e.subarray(t)),e.fill(-1/0,-t),e);function c(t,n){const{length:o,local:c,decay:l,interval:a,stride:f}={...s,...n},d=i.useRef(),[h]=i.useState((()=>new r.Vector3));i.useLayoutEffect((()=>{t&&(d.current=Float32Array.from({length:10*o*3},((e,r)=>t.position.getComponent(r%3))))}),[o,t]);const p=i.useRef(new r.Vector3),y=i.useRef(0);return e.useFrame((()=>{if(t&&d.current){if(0===y.current){let e;c?e=t.position:(t.getWorldPosition(h),e=h);const r=1*l;for(let t=0;t<r;t++)e.distanceTo(p.current)<f||(u(d.current,3),d.current.set(e.toArray(),d.current.length-3));p.current.copy(e)}y.current++,y.current=y.current%a}})),d}const l=i.forwardRef(((t,o)=>{const{children:u}=t,{width:l,length:a,decay:f,local:d,stride:h,interval:p}={...s,...t},{color:y="hotpink",attenuation:g,target:m}=t,v=e.useThree((e=>e.size)),b=i.useRef(null),[w,M]=i.useState(null),j=c(w,{length:a,decay:f,local:d,stride:h,interval:p});i.useEffect((()=>{const e=(null==m?void 0:m.current)||b.current.children.find((e=>e instanceof r.Object3D));e&&M(e)}),[j,m]);const O=i.useMemo((()=>new n.MeshLine),[]),E=i.useMemo((()=>{var e;const t=new n.MeshLineMaterial({lineWidth:.1*l,color:y,sizeAttenuation:1,resolution:new r.Vector2(v.width,v.height)});let o;if(u)if(Array.isArray(u))o=u.find((e=>{const t=e;return"string"==typeof t.type&&"meshLineMaterial"===t.type}));else{const e=u;"string"==typeof e.type&&"meshLineMaterial"===e.type&&(o=e)}return"object"==typeof(null==(e=o)?void 0:e.props)&&t.setValues(o.props),t}),[l,y,v,u]);return i.useEffect((()=>{E.uniforms.resolution.value.set(v.width,v.height)}),[v]),e.useFrame((()=>{j.current&&O.setPoints(j.current,g)})),i.createElement("group",null,i.createElement("mesh",{ref:o,geometry:O,material:E}),i.createElement("group",{ref:b},u))}));exports.Trail=l,exports.useTrail=c;
@@ -0,0 +1,21 @@
1
+ import * as React from 'react';
2
+ import { ColorRepresentation, Object3D } from 'three';
3
+ import { MeshLine as MeshLineImpl } from 'meshline';
4
+ declare type Settings = {
5
+ width: number;
6
+ length: number;
7
+ decay: number;
8
+ local: boolean;
9
+ stride: number;
10
+ interval: number;
11
+ };
12
+ export declare function useTrail(target: Object3D, settings: Partial<Settings>): React.MutableRefObject<Float32Array | undefined>;
13
+ export declare type MeshLine = THREE.Mesh & MeshLineImpl;
14
+ export declare const Trail: React.ForwardRefExoticComponent<{
15
+ color?: ColorRepresentation | undefined;
16
+ attenuation?: ((width: number) => number) | undefined;
17
+ target?: React.MutableRefObject<Object3D<import("three").Event>> | undefined;
18
+ } & Partial<Settings> & {
19
+ children?: React.ReactNode;
20
+ } & React.RefAttributes<MeshLine>>;
21
+ export {};
package/core/Trail.js ADDED
@@ -0,0 +1,160 @@
1
+ import { useFrame, useThree } from '@react-three/fiber';
2
+ import * as React from 'react';
3
+ import { Vector3, Object3D, Vector2 } from 'three';
4
+ import { MeshLine, MeshLineMaterial } from 'meshline';
5
+
6
+ const defaults = {
7
+ width: 0.2,
8
+ length: 1,
9
+ decay: 1,
10
+ local: false,
11
+ stride: 0,
12
+ interval: 1
13
+ };
14
+
15
+ const shiftLeft = (collection, steps = 1) => {
16
+ collection.set(collection.subarray(steps));
17
+ collection.fill(-Infinity, -steps);
18
+ return collection;
19
+ };
20
+
21
+ function useTrail(target, settings) {
22
+ const {
23
+ length,
24
+ local,
25
+ decay,
26
+ interval,
27
+ stride
28
+ } = { ...defaults,
29
+ ...settings
30
+ };
31
+ const points = React.useRef();
32
+ const [worldPosition] = React.useState(() => new Vector3());
33
+ React.useLayoutEffect(() => {
34
+ if (target) {
35
+ points.current = Float32Array.from({
36
+ length: length * 10 * 3
37
+ }, (_, i) => target.position.getComponent(i % 3));
38
+ }
39
+ }, [length, target]);
40
+ const prevPosition = React.useRef(new Vector3());
41
+ const frameCount = React.useRef(0);
42
+ useFrame(() => {
43
+ if (!target) return;
44
+ if (!points.current) return;
45
+
46
+ if (frameCount.current === 0) {
47
+ let newPosition;
48
+
49
+ if (local) {
50
+ newPosition = target.position;
51
+ } else {
52
+ target.getWorldPosition(worldPosition);
53
+ newPosition = worldPosition;
54
+ }
55
+
56
+ const steps = 1 * decay;
57
+
58
+ for (let i = 0; i < steps; i++) {
59
+ if (newPosition.distanceTo(prevPosition.current) < stride) continue;
60
+ shiftLeft(points.current, 3);
61
+ points.current.set(newPosition.toArray(), points.current.length - 3);
62
+ }
63
+
64
+ prevPosition.current.copy(newPosition);
65
+ }
66
+
67
+ frameCount.current++;
68
+ frameCount.current = frameCount.current % interval;
69
+ });
70
+ return points;
71
+ }
72
+ const Trail = /*#__PURE__*/React.forwardRef((props, forwardRef) => {
73
+ const {
74
+ children
75
+ } = props;
76
+ const {
77
+ width,
78
+ length,
79
+ decay,
80
+ local,
81
+ stride,
82
+ interval
83
+ } = { ...defaults,
84
+ ...props
85
+ };
86
+ const {
87
+ color = 'hotpink',
88
+ attenuation,
89
+ target
90
+ } = props;
91
+ const size = useThree(s => s.size);
92
+ const ref = React.useRef(null);
93
+ const [anchor, setAnchor] = React.useState(null);
94
+ const points = useTrail(anchor, {
95
+ length,
96
+ decay,
97
+ local,
98
+ stride,
99
+ interval
100
+ });
101
+ React.useEffect(() => {
102
+ const t = (target == null ? void 0 : target.current) || ref.current.children.find(o => {
103
+ return o instanceof Object3D;
104
+ });
105
+
106
+ if (t) {
107
+ setAnchor(t);
108
+ }
109
+ }, [points, target]);
110
+ const geo = React.useMemo(() => new MeshLine(), []);
111
+ const mat = React.useMemo(() => {
112
+ var _matOverride;
113
+
114
+ const m = new MeshLineMaterial({
115
+ lineWidth: 0.1 * width,
116
+ color: color,
117
+ sizeAttenuation: 1,
118
+ resolution: new Vector2(size.width, size.height)
119
+ }); // Get and apply first <meshLineMaterial /> from children
120
+
121
+ let matOverride;
122
+
123
+ if (children) {
124
+ if (Array.isArray(children)) {
125
+ matOverride = children.find(child => {
126
+ const c = child;
127
+ return typeof c.type === 'string' && c.type === 'meshLineMaterial';
128
+ });
129
+ } else {
130
+ const c = children;
131
+
132
+ if (typeof c.type === 'string' && c.type === 'meshLineMaterial') {
133
+ matOverride = c;
134
+ }
135
+ }
136
+ }
137
+
138
+ if (typeof ((_matOverride = matOverride) == null ? void 0 : _matOverride.props) === 'object') {
139
+ m.setValues(matOverride.props);
140
+ }
141
+
142
+ return m;
143
+ }, [width, color, size, children]);
144
+ React.useEffect(() => {
145
+ mat.uniforms.resolution.value.set(size.width, size.height);
146
+ }, [size]);
147
+ useFrame(() => {
148
+ if (!points.current) return;
149
+ geo.setPoints(points.current, attenuation);
150
+ });
151
+ return /*#__PURE__*/React.createElement("group", null, /*#__PURE__*/React.createElement("mesh", {
152
+ ref: forwardRef,
153
+ geometry: geo,
154
+ material: mat
155
+ }), /*#__PURE__*/React.createElement("group", {
156
+ ref: ref
157
+ }, children));
158
+ });
159
+
160
+ export { Trail, useTrail };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),n=require("@react-three/fiber"),t=require("lodash.omit"),r=require("lodash.pick"),l=require("react"),o=require("three"),u=require("three-stdlib");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(e){if(e&&e.__esModule)return e;var n=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,r.get?r:{enumerable:!0,get:function(){return e[t]}})}})),n.default=e,Object.freeze(n)}var i=a(e),c=a(t),d=a(r),v=s(l),f=s(o);const m=v.forwardRef((({children:e,domElement:t,onChange:r,onMouseDown:l,onMouseUp:o,onObjectChange:a,object:s,...m},E)=>{const h=["enabled","axis","mode","translationSnap","rotationSnap","scaleSnap","space","size","showX","showY","showZ"],{camera:b,...g}=m,p=d.default(g,h),L=c.default(g,h),j=n.useThree((e=>e.controls)),w=n.useThree((({gl:e})=>e)),O=n.useThree((({camera:e})=>e)),q=n.useThree((({invalidate:e})=>e)),y=b||O,C=v.useMemo((()=>new u.TransformControls(y,t||w.domElement)),[y,t,w.domElement]),T=v.useRef();return v.useLayoutEffect((()=>{s?null==C||C.attach(s instanceof f.Object3D?s:s.current):null==C||C.attach(T.current)}),[s,e,C]),v.useEffect((()=>{if(j){const e=e=>j.enabled=!e.value;return C.addEventListener("dragging-changed",e),()=>C.removeEventListener("dragging-changed",e)}}),[C,j]),v.useEffect((()=>{const e=e=>{q(),r&&r(e)};return null==C||null==C.addEventListener||C.addEventListener("change",e),l&&(null==C||null==C.addEventListener||C.addEventListener("mouseDown",l)),o&&(null==C||null==C.addEventListener||C.addEventListener("mouseUp",o)),a&&(null==C||null==C.addEventListener||C.addEventListener("objectChange",a)),()=>{null==C||null==C.removeEventListener||C.removeEventListener("change",e),l&&(null==C||null==C.removeEventListener||C.removeEventListener("mouseDown",l)),o&&(null==C||null==C.removeEventListener||C.removeEventListener("mouseUp",o)),a&&(null==C||null==C.removeEventListener||C.removeEventListener("objectChange",a))}}),[r,l,o,a,C,q]),C?v.createElement(v.Fragment,null,v.createElement("primitive",i.default({ref:E,dispose:void 0,object:C},p)),v.createElement("group",i.default({ref:T},L),e)):null}));exports.TransformControls=m;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),n=require("@react-three/fiber"),t=require("lodash.omit"),r=require("lodash.pick"),o=require("react"),a=require("three"),u=require("three-stdlib");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(e){if(e&&e.__esModule)return e;var n=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,r.get?r:{enumerable:!0,get:function(){return e[t]}})}})),n.default=e,Object.freeze(n)}var i=l(e),c=l(t),d=l(r),v=s(o),f=s(a);const m=v.forwardRef((({children:e,domElement:t,onChange:r,onMouseDown:o,onMouseUp:a,onObjectChange:l,object:s,...m},h)=>{const E=["enabled","axis","mode","translationSnap","rotationSnap","scaleSnap","space","size","showX","showY","showZ"],{camera:b,...g}=m,p=d.default(g,E),L=c.default(g,E),j=n.useThree((e=>e.controls)),O=n.useThree((e=>e.gl)),w=n.useThree((e=>e.events)),q=n.useThree((e=>e.camera)),T=n.useThree((e=>e.invalidate)),y=b||q,C=t||w.connected||O.domElement,D=v.useMemo((()=>new u.TransformControls(y,C)),[y,C]),M=v.useRef();return v.useLayoutEffect((()=>(s?D.attach(s instanceof f.Object3D?s:s.current):M.current instanceof f.Object3D&&D.attach(M.current),()=>{D.detach()})),[s,e,D]),v.useEffect((()=>{if(j){const e=e=>j.enabled=!e.value;return D.addEventListener("dragging-changed",e),()=>D.removeEventListener("dragging-changed",e)}}),[D,j]),v.useEffect((()=>{const e=e=>{T(),r&&r(e)};return null==D||null==D.addEventListener||D.addEventListener("change",e),o&&(null==D||null==D.addEventListener||D.addEventListener("mouseDown",o)),a&&(null==D||null==D.addEventListener||D.addEventListener("mouseUp",a)),l&&(null==D||null==D.addEventListener||D.addEventListener("objectChange",l)),()=>{null==D||null==D.removeEventListener||D.removeEventListener("change",e),o&&(null==D||null==D.removeEventListener||D.removeEventListener("mouseDown",o)),a&&(null==D||null==D.removeEventListener||D.removeEventListener("mouseUp",a)),l&&(null==D||null==D.removeEventListener||D.removeEventListener("objectChange",l))}}),[r,o,a,l,D,T]),D?v.createElement(v.Fragment,null,v.createElement("primitive",i.default({ref:h,dispose:void 0,object:D},p)),v.createElement("group",i.default({ref:M},L),e)):null}));exports.TransformControls=m;
@@ -23,4 +23,4 @@ export declare type TransformControlsProps = ReactThreeFiber.Object3DNode<Transf
23
23
  onMouseUp?: (e?: THREE.Event) => void;
24
24
  onObjectChange?: (e?: THREE.Event) => void;
25
25
  };
26
- export declare const TransformControls: React.ForwardRefExoticComponent<Pick<TransformControlsProps, "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" | "onChange" | "onMouseDown" | "onMouseUp" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "camera" | "size" | "space" | "enabled" | "update" | "axis" | "setSize" | "domElement" | "isTransformControls" | "detach" | "getMode" | "setMode" | "setTranslationSnap" | "setRotationSnap" | "setScaleSnap" | "setSpace" | "onObjectChange" | "mode" | "translationSnap" | "rotationSnap" | "scaleSnap" | "showX" | "showY" | "showZ"> & React.RefAttributes<TransformControlsImpl<THREE.Camera>>>;
26
+ export declare const TransformControls: React.ForwardRefExoticComponent<Pick<TransformControlsProps, "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" | "onChange" | "onMouseDown" | "onMouseUp" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "camera" | "size" | "space" | "enabled" | "update" | "axis" | "connect" | "setSize" | "domElement" | "isTransformControls" | "detach" | "getMode" | "setMode" | "setTranslationSnap" | "setRotationSnap" | "setScaleSnap" | "setSpace" | "onObjectChange" | "mode" | "translationSnap" | "rotationSnap" | "scaleSnap" | "showX" | "showY" | "showZ"> & React.RefAttributes<TransformControlsImpl<THREE.Camera>>>;
@@ -25,20 +25,22 @@ const TransformControls = /*#__PURE__*/React.forwardRef(({
25
25
  const objectProps = omit(rest, transformOnlyPropNames); // @ts-expect-error new in @react-three/fiber@7.0.5
26
26
 
27
27
  const defaultControls = useThree(state => state.controls);
28
- const gl = useThree(({
29
- gl
30
- }) => gl);
31
- const defaultCamera = useThree(({
32
- camera
33
- }) => camera);
34
- const invalidate = useThree(({
35
- invalidate
36
- }) => invalidate);
28
+ const gl = useThree(state => state.gl);
29
+ const events = useThree(state => state.events);
30
+ const defaultCamera = useThree(state => state.camera);
31
+ const invalidate = useThree(state => state.invalidate);
37
32
  const explCamera = camera || defaultCamera;
38
- const controls = React.useMemo(() => new TransformControls$1(explCamera, domElement || gl.domElement), [explCamera, domElement, gl.domElement]);
33
+ const explDomElement = domElement || events.connected || gl.domElement;
34
+ const controls = React.useMemo(() => new TransformControls$1(explCamera, explDomElement), [explCamera, explDomElement]);
39
35
  const group = React.useRef();
40
36
  React.useLayoutEffect(() => {
41
- if (object) controls == null ? void 0 : controls.attach(object instanceof THREE.Object3D ? object : object.current);else controls == null ? void 0 : controls.attach(group.current);
37
+ if (object) {
38
+ controls.attach(object instanceof THREE.Object3D ? object : object.current);
39
+ } else if (group.current instanceof THREE.Object3D) {
40
+ controls.attach(group.current);
41
+ }
42
+
43
+ return () => void controls.detach();
42
44
  }, [object, children, controls]);
43
45
  React.useEffect(() => {
44
46
  if (defaultControls) {