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

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 (126) hide show
  1. package/README.md +293 -26
  2. package/core/AdaptiveEvents.cjs.js +1 -1
  3. package/core/AdaptiveEvents.js +8 -3
  4. package/core/ArcballControls.cjs.js +1 -1
  5. package/core/ArcballControls.js +13 -25
  6. package/core/Bounds.cjs.js +1 -1
  7. package/core/Bounds.d.ts +2 -1
  8. package/core/Bounds.js +25 -14
  9. package/core/Clone.cjs.js +1 -0
  10. package/core/Clone.d.ts +11 -0
  11. package/core/Clone.js +92 -0
  12. package/core/Cloud.cjs.js +1 -1
  13. package/core/Cloud.d.ts +3 -1
  14. package/core/Cloud.js +4 -1
  15. package/core/ComputedAttribute.cjs.js +1 -0
  16. package/core/ComputedAttribute.d.ts +9 -0
  17. package/core/ComputedAttribute.js +34 -0
  18. package/core/ContactShadows.cjs.js +1 -1
  19. package/core/ContactShadows.d.ts +3 -1
  20. package/core/ContactShadows.js +15 -2
  21. package/core/CubeCamera.cjs.js +1 -1
  22. package/core/CubeCamera.js +6 -6
  23. package/core/DeviceOrientationControls.cjs.js +1 -1
  24. package/core/DeviceOrientationControls.d.ts +1 -1
  25. package/core/DeviceOrientationControls.js +2 -6
  26. package/core/Effects.cjs.js +1 -1
  27. package/core/Effects.d.ts +3 -2
  28. package/core/Effects.js +2 -2
  29. package/core/Environment.cjs.js +1 -1
  30. package/core/Environment.d.ts +13 -3
  31. package/core/Environment.js +96 -33
  32. package/core/FirstPersonControls.cjs.js +1 -1
  33. package/core/FirstPersonControls.d.ts +4 -2
  34. package/core/FirstPersonControls.js +9 -8
  35. package/core/Float.cjs.js +1 -1
  36. package/core/Float.d.ts +1 -1
  37. package/core/Float.js +5 -4
  38. package/core/FlyControls.cjs.js +1 -1
  39. package/core/FlyControls.d.ts +1 -0
  40. package/core/FlyControls.js +10 -11
  41. package/core/GizmoHelper.cjs.js +1 -1
  42. package/core/GizmoHelper.d.ts +2 -1
  43. package/core/GizmoHelper.js +31 -41
  44. package/core/Image.cjs.js +1 -1
  45. package/core/Image.d.ts +5 -3
  46. package/core/Image.js +6 -1
  47. package/core/Instances.cjs.js +1 -1
  48. package/core/Instances.d.ts +1 -1
  49. package/core/Instances.js +5 -11
  50. package/core/Lightformer.cjs.js +1 -0
  51. package/core/Lightformer.d.ts +41 -0
  52. package/core/Lightformer.js +51 -0
  53. package/core/MapControls.cjs.js +1 -1
  54. package/core/MapControls.d.ts +2 -1
  55. package/core/MapControls.js +8 -11
  56. package/core/MeshReflectorMaterial.cjs.js +1 -1
  57. package/core/MeshReflectorMaterial.d.ts +1 -2
  58. package/core/MeshReflectorMaterial.js +4 -5
  59. package/core/OrbitControls.cjs.js +1 -1
  60. package/core/OrbitControls.js +18 -31
  61. package/core/PointMaterial.cjs.js +1 -1
  62. package/core/PointMaterial.d.ts +5 -8
  63. package/core/PointMaterial.js +16 -34
  64. package/core/PointerLockControls.cjs.js +1 -1
  65. package/core/PointerLockControls.d.ts +3 -1
  66. package/core/PointerLockControls.js +43 -25
  67. package/core/Points.cjs.js +1 -1
  68. package/core/Points.d.ts +3 -3
  69. package/core/Points.js +11 -30
  70. package/core/PositionalAudio.d.ts +1 -1
  71. package/core/Reflector.d.ts +1 -1
  72. package/core/Sampler.cjs.js +1 -0
  73. package/core/Sampler.d.ts +21 -0
  74. package/core/Sampler.js +65 -0
  75. package/core/SpotLight.d.ts +1 -1
  76. package/core/Stage.cjs.js +1 -1
  77. package/core/Stage.js +1 -2
  78. package/core/Stars.cjs.js +1 -1
  79. package/core/Stars.js +3 -0
  80. package/core/Stats.cjs.js +1 -1
  81. package/core/Stats.js +1 -1
  82. package/core/Text.cjs.js +1 -1
  83. package/core/Text.d.ts +2 -1
  84. package/core/Text.js +3 -2
  85. package/core/TrackballControls.cjs.js +1 -1
  86. package/core/TrackballControls.d.ts +1 -1
  87. package/core/TrackballControls.js +7 -5
  88. package/core/Trail.cjs.js +1 -0
  89. package/core/Trail.d.ts +21 -0
  90. package/core/Trail.js +160 -0
  91. package/core/TransformControls.cjs.js +1 -1
  92. package/core/TransformControls.d.ts +1 -1
  93. package/core/TransformControls.js +7 -13
  94. package/core/index.cjs.js +1 -1
  95. package/core/index.d.ts +6 -0
  96. package/core/index.js +9 -2
  97. package/core/useBoxProjectedEnv.cjs.js +1 -0
  98. package/core/useBoxProjectedEnv.d.ts +8 -0
  99. package/core/useBoxProjectedEnv.js +98 -0
  100. package/core/useFBO.cjs.js +1 -1
  101. package/core/useFBO.d.ts +1 -1
  102. package/core/useFBO.js +22 -24
  103. package/core/useGLTF.d.ts +1 -1
  104. package/core/useHelper.d.ts +3 -1
  105. package/core/useMatcapTexture.cjs.js +1 -1
  106. package/core/useProgress.d.ts +1 -1
  107. package/index.cjs.js +1 -1
  108. package/index.js +7 -1
  109. package/materials/ConvolutionMaterial.cjs.js +1 -1
  110. package/materials/ConvolutionMaterial.js +2 -0
  111. package/materials/MeshReflectorMaterial.cjs.js +1 -1
  112. package/materials/MeshReflectorMaterial.d.ts +0 -3
  113. package/materials/MeshReflectorMaterial.js +8 -34
  114. package/materials/SpotLightMaterial.cjs.js +1 -1
  115. package/materials/SpotLightMaterial.js +3 -0
  116. package/native/index.cjs.js +1 -1
  117. package/native/index.js +9 -2
  118. package/package.json +6 -5
  119. package/web/CycleRaycast.cjs.js +1 -1
  120. package/web/CycleRaycast.js +23 -20
  121. package/web/ScrollControls.cjs.js +1 -1
  122. package/web/ScrollControls.js +16 -12
  123. package/web/Select.cjs.js +1 -1
  124. package/web/Select.js +9 -8
  125. package/web/index.cjs.js +1 -1
  126. package/web/index.js +9 -2
@@ -1,11 +1,93 @@
1
1
  import * as React from 'react';
2
- import { useThree, useLoader } from '@react-three/fiber';
3
- import { FloatType, EquirectangularReflectionMapping, CubeTextureLoader } from 'three';
2
+ import { useThree, useFrame, createPortal, useLoader } from '@react-three/fiber';
3
+ import { Scene, WebGLCubeRenderTarget, HalfFloatType, FloatType, CubeReflectionMapping, EquirectangularReflectionMapping, CubeTextureLoader } from 'three';
4
4
  import { RGBELoader } from 'three-stdlib';
5
5
  import { presetsObj } from '../helpers/environment-assets.js';
6
6
 
7
7
  const CUBEMAP_ROOT = 'https://market-assets.fra1.cdn.digitaloceanspaces.com/market-assets/hdris/';
8
- function Environment({
8
+
9
+ const isRef = obj => obj.current && obj.current.isScene;
10
+
11
+ const resolveScene = scene => isRef(scene) ? scene.current : scene;
12
+
13
+ function Environment(props) {
14
+ return props.map ? /*#__PURE__*/React.createElement(EnvironmentMap, props) : props.children ? /*#__PURE__*/React.createElement(EnvironmentPortal, props) : /*#__PURE__*/React.createElement(EnvironmentCube, props);
15
+ }
16
+ function EnvironmentMap({
17
+ scene,
18
+ background = false,
19
+ map
20
+ }) {
21
+ const defaultScene = useThree(state => state.scene);
22
+ React.useLayoutEffect(() => {
23
+ if (map) {
24
+ const target = resolveScene(scene || defaultScene);
25
+ const oldbg = target.background;
26
+ const oldenv = target.environment;
27
+ if (background !== 'only') target.environment = map;
28
+ if (background) target.background = map;
29
+ return () => {
30
+ if (background !== 'only') target.environment = oldenv;
31
+ if (background) target.background = oldbg;
32
+ };
33
+ }
34
+ }, [scene, map]);
35
+ return null;
36
+ }
37
+ function EnvironmentPortal({
38
+ children,
39
+ near = 1,
40
+ far = 1000,
41
+ resolution = 256,
42
+ frames = 1,
43
+ background = false,
44
+ scene,
45
+ files,
46
+ path,
47
+ preset = undefined,
48
+ extensions
49
+ }) {
50
+ const gl = useThree(state => state.gl);
51
+ const defaultScene = useThree(state => state.scene);
52
+ const camera = React.useRef(null);
53
+ const [virtualScene] = React.useState(() => new Scene());
54
+ const fbo = React.useMemo(() => {
55
+ const fbo = new WebGLCubeRenderTarget(resolution);
56
+ fbo.texture.type = HalfFloatType;
57
+ return fbo;
58
+ }, [resolution]);
59
+ React.useLayoutEffect(() => {
60
+ if (frames === 1) camera.current.update(gl, virtualScene);
61
+ const target = resolveScene(scene || defaultScene);
62
+ const oldbg = target.background;
63
+ const oldenv = target.environment;
64
+ if (background !== 'only') target.environment = fbo.texture;
65
+ if (background) target.background = fbo.texture;
66
+ return () => {
67
+ if (background !== 'only') target.environment = oldenv;
68
+ if (background) target.background = oldbg;
69
+ };
70
+ }, [children, scene]);
71
+ let count = 1;
72
+ useFrame(() => {
73
+ if (frames === Infinity || count < frames) {
74
+ camera.current.update(gl, virtualScene);
75
+ count++;
76
+ }
77
+ });
78
+ return /*#__PURE__*/React.createElement(React.Fragment, null, createPortal( /*#__PURE__*/React.createElement(React.Fragment, null, children, /*#__PURE__*/React.createElement("cubeCamera", {
79
+ ref: camera,
80
+ args: [near, far, fbo]
81
+ }), (files || preset) && /*#__PURE__*/React.createElement(EnvironmentMap, {
82
+ background: true,
83
+ files: files,
84
+ preset: preset,
85
+ path: path,
86
+ extensions: extensions,
87
+ scene: virtualScene
88
+ })), virtualScene));
89
+ }
90
+ function EnvironmentCube({
9
91
  background = false,
10
92
  files = ['/px.png', '/nx.png', '/py.png', '/ny.png', '/pz.png', '/nz.png'],
11
93
  path = '',
@@ -14,17 +96,12 @@ function Environment({
14
96
  extensions
15
97
  }) {
16
98
  if (preset) {
17
- if (!(preset in presetsObj)) {
18
- throw new Error('Preset must be one of: ' + Object.keys(presetsObj).join(', '));
19
- }
20
-
99
+ if (!(preset in presetsObj)) throw new Error('Preset must be one of: ' + Object.keys(presetsObj).join(', '));
21
100
  files = presetsObj[preset];
22
101
  path = CUBEMAP_ROOT;
23
102
  }
24
103
 
25
- const defaultScene = useThree(({
26
- scene
27
- }) => scene);
104
+ const defaultScene = useThree(state => state.scene);
28
105
  const isCubeMap = Array.isArray(files);
29
106
  const loader = isCubeMap ? CubeTextureLoader : RGBELoader; // @ts-expect-error
30
107
 
@@ -35,33 +112,19 @@ function Environment({
35
112
  if (extensions) extensions(loader);
36
113
  });
37
114
  const texture = isCubeMap ? loaderResult[0] : loaderResult;
38
- texture.mapping = EquirectangularReflectionMapping;
115
+ texture.mapping = isCubeMap ? CubeReflectionMapping : EquirectangularReflectionMapping;
39
116
  React.useLayoutEffect(() => {
40
- const oldbg = scene ? scene.background : defaultScene.background;
41
- const oldenv = scene ? scene.environment : defaultScene.environment;
42
-
43
- if (scene) {
44
- scene.environment = texture;
45
- if (background) scene.background = texture;
46
- } else {
47
- defaultScene.environment = texture;
48
- if (background) defaultScene.background = texture;
49
- }
50
-
117
+ const target = resolveScene(scene || defaultScene);
118
+ const oldbg = target.background;
119
+ const oldenv = target.environment;
120
+ if (background !== 'only') target.environment = texture;
121
+ if (background) target.background = texture;
51
122
  return () => {
52
- if (scene) {
53
- scene.environment = oldenv;
54
- scene.background = oldbg;
55
- } else {
56
- defaultScene.environment = oldenv;
57
- defaultScene.background = oldbg;
58
- } // Environment textures are volatile, better dispose and uncache them
59
-
60
-
61
- texture.dispose();
123
+ if (background !== 'only') target.environment = oldenv;
124
+ if (background) target.background = oldbg;
62
125
  };
63
126
  }, [texture, background, scene]);
64
127
  return null;
65
128
  }
66
129
 
67
- export { Environment };
130
+ export { Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=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 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=u(e),i=o(r);const s=i.forwardRef(((e,r)=>{const u=t.useThree((({camera:e})=>e)),o=t.useThree((({gl:e})=>e)),[s]=i.useState((()=>new n.FirstPersonControls(u,o.domElement)));return t.useFrame(((e,r)=>{s.update(r)})),s?i.createElement("primitive",a.default({ref:r,object:s},e)):null}));exports.FirstPersonControls=s;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=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 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 s=u(e),c=o(r);const a=c.forwardRef((({domElement:e,...r},u)=>{const o=t.useThree((e=>e.camera)),a=t.useThree((e=>e.gl)),i=t.useThree((e=>e.events)),l=e||i.connected||a.domElement,[f]=c.useState((()=>new n.FirstPersonControls(o,l)));return t.useFrame(((e,r)=>{f.update(r)})),f?c.createElement("primitive",s.default({ref:u,object:f},r)):null}));exports.FirstPersonControls=a;
@@ -1,5 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { Object3DNode } from '@react-three/fiber';
3
3
  import { FirstPersonControls as FirstPersonControlImpl } from 'three-stdlib';
4
- export declare type FirstPersonControlsProps = Object3DNode<FirstPersonControlImpl, typeof FirstPersonControlImpl>;
5
- export declare const FirstPersonControls: React.ForwardRefExoticComponent<Pick<FirstPersonControlsProps, "object" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "lookAt" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "enabled" | "update" | "connect" | "domElement" | "movementSpeed" | "autoForward" | "handleResize" | "lookSpeed" | "lookVertical" | "activeLook" | "heightSpeed" | "heightCoef" | "heightMin" | "heightMax" | "constrainVertical" | "verticalMin" | "verticalMax" | "mouseDragOn"> & React.RefAttributes<FirstPersonControlImpl>>;
4
+ export declare type FirstPersonControlsProps = Object3DNode<FirstPersonControlImpl, typeof FirstPersonControlImpl> & {
5
+ domElement?: HTMLElement;
6
+ };
7
+ export declare const FirstPersonControls: React.ForwardRefExoticComponent<Pick<FirstPersonControlsProps, "object" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "lookAt" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "enabled" | "connect" | "update" | "domElement" | "movementSpeed" | "autoForward" | "handleResize" | "lookSpeed" | "lookVertical" | "activeLook" | "heightSpeed" | "heightCoef" | "heightMin" | "heightMax" | "constrainVertical" | "verticalMin" | "verticalMax" | "mouseDragOn"> & React.RefAttributes<FirstPersonControlImpl>>;
@@ -3,14 +3,15 @@ import * as React from 'react';
3
3
  import { useThree, useFrame } from '@react-three/fiber';
4
4
  import { FirstPersonControls as FirstPersonControls$1 } from 'three-stdlib';
5
5
 
6
- const FirstPersonControls = /*#__PURE__*/React.forwardRef((props, ref) => {
7
- const camera = useThree(({
8
- camera
9
- }) => camera);
10
- const gl = useThree(({
11
- gl
12
- }) => gl);
13
- const [controls] = React.useState(() => new FirstPersonControls$1(camera, gl.domElement));
6
+ const FirstPersonControls = /*#__PURE__*/React.forwardRef(({
7
+ domElement,
8
+ ...props
9
+ }, ref) => {
10
+ const camera = useThree(state => state.camera);
11
+ const gl = useThree(state => state.gl);
12
+ const events = useThree(state => state.events);
13
+ const explDomElement = domElement || events.connected || gl.domElement;
14
+ const [controls] = React.useState(() => new FirstPersonControls$1(camera, explDomElement));
14
15
  useFrame((_, delta) => {
15
16
  controls.update(delta);
16
17
  });
package/core/Float.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@react-three/fiber");function r(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 n=r(e);exports.Float=function({children:e,speed:r=1,rotationIntensity:o=1,floatIntensity:c=1,...u}){const a=n.useRef(null),i=n.useRef(1e4*Math.random());return t.useFrame((e=>{const t=i.current+e.clock.getElapsedTime();a.current.rotation.x=Math.cos(t/4*r)/8*o,a.current.rotation.y=Math.sin(t/4*r)/8*o,a.current.rotation.z=Math.sin(t/4*r)/20*o,a.current.position.y=Math.sin(t/4*r)/10*c})),n.createElement("group",u,n.createElement("group",{ref:a},e))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@react-three/fiber"),r=require("react-merge-refs");function n(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)}var u=o(e),a=n(r);const c=u.forwardRef((({children:e,speed:r=1,rotationIntensity:n=1,floatIntensity:o=1,...c},i)=>{const f=u.useRef(null),s=u.useRef(1e4*Math.random());return t.useFrame((e=>{const t=s.current+e.clock.getElapsedTime();f.current.rotation.x=Math.cos(t/4*r)/8*n,f.current.rotation.y=Math.sin(t/4*r)/8*n,f.current.rotation.z=Math.sin(t/4*r)/20*n,f.current.position.y=Math.sin(t/4*r)/10*o})),u.createElement("group",c,u.createElement("group",{ref:a.default([f,i])},e))}));exports.Float=c;
package/core/Float.d.ts CHANGED
@@ -5,4 +5,4 @@ export declare type FloatProps = JSX.IntrinsicElements['group'] & {
5
5
  floatIntensity?: number;
6
6
  children?: React.ReactNode;
7
7
  };
8
- export declare function Float({ children, speed, rotationIntensity, floatIntensity, ...props }: FloatProps): JSX.Element;
8
+ export declare const Float: React.ForwardRefExoticComponent<Pick<FloatProps, "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 | "speed" | "rotationIntensity" | "floatIntensity"> & React.RefAttributes<import("three").Group>>;
package/core/Float.js CHANGED
@@ -1,13 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import { useFrame } from '@react-three/fiber';
3
+ import mergeRefs from 'react-merge-refs';
3
4
 
4
- function Float({
5
+ const Float = /*#__PURE__*/React.forwardRef(({
5
6
  children,
6
7
  speed = 1,
7
8
  rotationIntensity = 1,
8
9
  floatIntensity = 1,
9
10
  ...props
10
- }) {
11
+ }, forwardRef) => {
11
12
  const ref = React.useRef(null);
12
13
  const offset = React.useRef(Math.random() * 10000);
13
14
  useFrame(state => {
@@ -18,8 +19,8 @@ function Float({
18
19
  ref.current.position.y = Math.sin(t / 4 * speed) / 10 * floatIntensity;
19
20
  });
20
21
  return /*#__PURE__*/React.createElement("group", props, /*#__PURE__*/React.createElement("group", {
21
- ref: ref
22
+ ref: mergeRefs([ref, forwardRef])
22
23
  }, children));
23
- }
24
+ });
24
25
 
25
26
  export { Float };
@@ -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 u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function l(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),i=l(r);const a=i.forwardRef(((e,r)=>{const{onChange:u,...l}=e,a=t.useThree((({invalidate:e})=>e)),s=t.useThree((({camera:e})=>e)),c=t.useThree((({gl:e})=>e)),[d]=i.useState((()=>new n.FlyControls(s,c.domElement)));return i.useEffect((()=>{const e=e=>{a(),u&&u(e)};return null==d||null==d.addEventListener||d.addEventListener("change",e),()=>null==d||null==d.removeEventListener?void 0:d.removeEventListener("change",e)}),[u,d,a]),t.useFrame(((e,t)=>null==d?void 0:d.update(t))),d?i.createElement("primitive",o.default({ref:r,dispose:void 0,object:d},l)):null}));exports.FlyControls=a;
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 u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function l(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),i=l(r);const a=i.forwardRef((({domElement:e,...r},u)=>{const{onChange:l,...a}=r,s=t.useThree((e=>e.invalidate)),c=t.useThree((e=>e.camera)),d=t.useThree((e=>e.gl)),f=t.useThree((e=>e.events)),v=e||f.connected||d.domElement,[b]=i.useState((()=>new n.FlyControls(c,v)));return i.useEffect((()=>{const e=e=>{s(),l&&l(e)};return null==b||null==b.addEventListener||b.addEventListener("change",e),()=>null==b||null==b.removeEventListener?void 0:b.removeEventListener("change",e)}),[l,b,s]),t.useFrame(((e,t)=>null==b?void 0:b.update(t))),b?i.createElement("primitive",o.default({ref:u,dispose:void 0,object:b},a)):null}));exports.FlyControls=a;
@@ -4,5 +4,6 @@ import * as THREE from 'three';
4
4
  import { FlyControls as FlyControlsImpl } from 'three-stdlib';
5
5
  export declare type FlyControlsProps = ReactThreeFiber.Object3DNode<FlyControlsImpl, typeof FlyControlsImpl> & {
6
6
  onChange?: (e?: THREE.Event) => void;
7
+ domElement?: HTMLElement;
7
8
  };
8
9
  export declare const FlyControls: React.ForwardRefExoticComponent<Pick<FlyControlsProps, "object" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "onChange" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "update" | "domElement" | "movementSpeed" | "rollSpeed" | "dragToLook" | "autoForward"> & React.RefAttributes<FlyControlsImpl>>;
@@ -3,21 +3,20 @@ import { useThree, useFrame } from '@react-three/fiber';
3
3
  import * as React from 'react';
4
4
  import { FlyControls as FlyControls$1 } from 'three-stdlib';
5
5
 
6
- const FlyControls = /*#__PURE__*/React.forwardRef((props, ref) => {
6
+ const FlyControls = /*#__PURE__*/React.forwardRef(({
7
+ domElement,
8
+ ...props
9
+ }, ref) => {
7
10
  const {
8
11
  onChange,
9
12
  ...rest
10
13
  } = props;
11
- const invalidate = useThree(({
12
- invalidate
13
- }) => invalidate);
14
- const camera = useThree(({
15
- camera
16
- }) => camera);
17
- const gl = useThree(({
18
- gl
19
- }) => gl);
20
- const [controls] = React.useState(() => new FlyControls$1(camera, gl.domElement));
14
+ const invalidate = useThree(state => state.invalidate);
15
+ const camera = useThree(state => state.camera);
16
+ const gl = useThree(state => state.gl);
17
+ const events = useThree(state => state.events);
18
+ const explDomElement = domElement || events.connected || gl.domElement;
19
+ const [controls] = React.useState(() => new FlyControls$1(camera, explDomElement));
21
20
  React.useEffect(() => {
22
21
  const callback = e => {
23
22
  invalidate();
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("three"),n=require("./OrthographicCamera.cjs.js"),u=require("./useCamera.cjs.js");function a(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var 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)}require("@babel/runtime/helpers/extends"),require("react-merge-refs");var o=a(e);const c=o.createContext({}),i=2*Math.PI,s=new t.Object3D,l=new t.Matrix4,[p,d]=[new t.Quaternion,new t.Quaternion],f=new t.Vector3,h=new t.Vector3;exports.GizmoHelper=({alignment:e="bottom-right",margin:a=[80,80],renderPriority:m=0,onUpdate:g,onTarget:b,children:y})=>{const v=r.useThree((({size:e})=>e)),w=r.useThree((({camera:e})=>e)),j=r.useThree((({controls:e})=>e)),q=r.useThree((({gl:e})=>e)),x=r.useThree((({scene:e})=>e)),O=r.useThree((({invalidate:e})=>e)),T=o.useRef(),C=o.useRef(),k=o.useRef(null),[P]=o.useState((()=>new t.Scene)),R=o.useRef(!1),z=o.useRef(0),E=o.useRef(new t.Vector3(0,0,0));o.useEffect((()=>(x.background&&(T.current=x.background,x.background=null,P.background=T.current),()=>{T.current&&(x.background=T.current)})),[]);r.useFrame(((e,r)=>{var t;k.current&&C.current&&((e=>{if(!R.current)return;if(p.angleTo(d)<.01)return void(R.current=!1);const r=e*i;p.rotateTowards(d,r),w.position.set(0,0,1).applyQuaternion(p).multiplyScalar(z.current).add(E.current),w.up.set(0,1,0).applyQuaternion(p).normalize(),w.quaternion.copy(p),g?g():j&&j.update(),O()})(r),l.copy(w.matrix).invert(),null==(t=C.current)||t.quaternion.setFromRotationMatrix(l),q.autoClear=!1,q.clearDepth(),q.render(P,k.current))}),m);const M={tweenCamera:e=>{R.current=!0,(j||b)&&(E.current=(null==j?void 0:j.target)||(null==b?void 0:b())),z.current=w.position.distanceTo(f),p.copy(w.quaternion),h.copy(e).multiplyScalar(z.current).add(f),s.lookAt(h),d.copy(s.quaternion),O()},raycast:u.useCamera(k)},[D,Q]=a,S=e.endsWith("-left")?-v.width/2+D:v.width/2-D,_=e.startsWith("top-")?v.height/2-Q:-v.height/2+Q;return r.createPortal(o.createElement(c.Provider,{value:M},o.createElement(n.OrthographicCamera,{ref:k,makeDefault:!1,position:[0,0,200]}),o.createElement("group",{ref:C,position:[S,_,0]},y)),P)},exports.useGizmoContext=()=>o.useContext(c);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("three"),n=require("./OrthographicCamera.cjs.js"),a=require("./useCamera.cjs.js");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 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)}require("@babel/runtime/helpers/extends"),require("react-merge-refs");var o=u(e);const c=o.createContext({}),i=2*Math.PI,s=new t.Object3D,l=new t.Matrix4,[p,d]=[new t.Quaternion,new t.Quaternion],f=new t.Vector3,h=new t.Vector3;exports.GizmoHelper=({alignment:e="bottom-right",margin:u=[80,80],renderPriority:m=0,autoClear:g=!0,onUpdate:b,onTarget:y,children:w})=>{const v=r.useThree((({size:e})=>e)),j=r.useThree((({camera:e})=>e)),q=r.useThree((({controls:e})=>e)),C=r.useThree((({gl:e})=>e)),x=r.useThree((({scene:e})=>e)),O=r.useThree((({invalidate:e})=>e)),T=o.useRef(),k=o.useRef(),P=o.useRef(null),[R]=o.useState((()=>new t.Scene)),M=o.useRef(!1),z=o.useRef(0),E=o.useRef(new t.Vector3(0,0,0)),Q=o.useCallback((e=>{M.current=!0,(q||y)&&(E.current=(null==q?void 0:q.target)||(null==y?void 0:y())),z.current=j.position.distanceTo(f),p.copy(j.quaternion),h.copy(e).multiplyScalar(z.current).add(f),s.lookAt(h),d.copy(s.quaternion),O()}),[q,j,y,O]);o.useEffect((()=>(x.background&&(T.current=x.background,x.background=null,R.background=T.current),()=>{T.current&&(x.background=T.current)})),[]),r.useFrame(((e,r)=>{if(P.current&&k.current){var t;if(M.current)if(p.angleTo(d)<.01)M.current=!1;else{const e=r*i;p.rotateTowards(d,e),j.position.set(0,0,1).applyQuaternion(p).multiplyScalar(z.current).add(E.current),j.up.set(0,1,0).applyQuaternion(p).normalize(),j.quaternion.copy(p),b?b():q&&q.update(),O()}l.copy(j.matrix).invert(),null==(t=k.current)||t.quaternion.setFromRotationMatrix(l),g&&(C.autoClear=!1),C.clearDepth(),C.render(R,P.current)}}),m);const S=a.useCamera(P),_=o.useMemo((()=>({tweenCamera:Q,raycast:S})),[Q]),[D,V]=u,F=e.endsWith("-left")?-v.width/2+D:v.width/2-D,G=e.startsWith("top-")?v.height/2-V:-v.height/2+V;return r.createPortal(o.createElement(c.Provider,{value:_},o.createElement(n.OrthographicCamera,{ref:P,position:[0,0,200]}),o.createElement("group",{ref:k,position:[F,G,0]},w)),R)},exports.useGizmoContext=()=>o.useContext(c);
@@ -8,8 +8,9 @@ export declare type GizmoHelperProps = JSX.IntrinsicElements['group'] & {
8
8
  alignment?: 'top-left' | 'top-right' | 'bottom-right' | 'bottom-left';
9
9
  margin?: [number, number];
10
10
  renderPriority?: number;
11
+ autoClear?: boolean;
11
12
  onUpdate?: () => void;
12
13
  onTarget?: () => Vector3;
13
14
  };
14
- export declare const GizmoHelper: ({ alignment, margin, renderPriority, onUpdate, onTarget, children: GizmoHelperComponent, }: GizmoHelperProps) => any;
15
+ export declare const GizmoHelper: ({ alignment, margin, renderPriority, autoClear, onUpdate, onTarget, children: GizmoHelperComponent, }: GizmoHelperProps) => any;
15
16
  export {};
@@ -19,6 +19,7 @@ const GizmoHelper = ({
19
19
  alignment = 'bottom-right',
20
20
  margin = [80, 80],
21
21
  renderPriority = 0,
22
+ autoClear = true,
22
23
  onUpdate,
23
24
  onTarget,
24
25
  children: GizmoHelperComponent
@@ -49,8 +50,7 @@ const GizmoHelper = ({
49
50
  const animating = React.useRef(false);
50
51
  const radius = React.useRef(0);
51
52
  const focusPoint = React.useRef(new Vector3(0, 0, 0));
52
-
53
- const tweenCamera = direction => {
53
+ const tweenCamera = React.useCallback(direction => {
54
54
  animating.current = true;
55
55
  if (defaultControls || onTarget) focusPoint.current = (defaultControls == null ? void 0 : defaultControls.target) || (onTarget == null ? void 0 : onTarget());
56
56
  radius.current = mainCamera.position.distanceTo(target); // Rotate from current camera orientation
@@ -61,27 +61,7 @@ const GizmoHelper = ({
61
61
  dummy.lookAt(targetPosition);
62
62
  q2.copy(dummy.quaternion);
63
63
  invalidate();
64
- };
65
-
66
- const animateStep = delta => {
67
- if (!animating.current) return;
68
-
69
- if (q1.angleTo(q2) < 0.01) {
70
- animating.current = false;
71
- return;
72
- }
73
-
74
- const step = delta * turnRate; // animate position by doing a slerp and then scaling the position on the unit sphere
75
-
76
- q1.rotateTowards(q2, step); // animate orientation
77
-
78
- mainCamera.position.set(0, 0, 1).applyQuaternion(q1).multiplyScalar(radius.current).add(focusPoint.current);
79
- mainCamera.up.set(0, 1, 0).applyQuaternion(q1).normalize();
80
- mainCamera.quaternion.copy(q1);
81
- if (onUpdate) onUpdate();else if (defaultControls) defaultControls.update();
82
- invalidate();
83
- };
84
-
64
+ }, [defaultControls, mainCamera, onTarget, invalidate]);
85
65
  React.useEffect(() => {
86
66
  if (scene.background) {
87
67
  //Interchange the actual scene background with the virtual scene
@@ -92,33 +72,44 @@ const GizmoHelper = ({
92
72
 
93
73
  return () => {
94
74
  // reset on unmount
95
- if (backgroundRef.current) {
96
- scene.background = backgroundRef.current;
97
- }
75
+ if (backgroundRef.current) scene.background = backgroundRef.current;
98
76
  };
99
77
  }, []);
78
+ useFrame((_, delta) => {
79
+ if (virtualCam.current && gizmoRef.current) {
80
+ var _gizmoRef$current;
100
81
 
101
- const beforeRender = () => {
102
- var _gizmoRef$current;
82
+ // Animate step
83
+ if (animating.current) {
84
+ if (q1.angleTo(q2) < 0.01) {
85
+ animating.current = false;
86
+ } else {
87
+ const step = delta * turnRate; // animate position by doing a slerp and then scaling the position on the unit sphere
103
88
 
104
- // Sync gizmo with main camera orientation
105
- matrix.copy(mainCamera.matrix).invert();
106
- (_gizmoRef$current = gizmoRef.current) == null ? void 0 : _gizmoRef$current.quaternion.setFromRotationMatrix(matrix);
107
- };
89
+ q1.rotateTowards(q2, step); // animate orientation
108
90
 
109
- useFrame((_, delta) => {
110
- if (virtualCam.current && gizmoRef.current) {
111
- animateStep(delta);
112
- beforeRender();
113
- gl.autoClear = false;
91
+ mainCamera.position.set(0, 0, 1).applyQuaternion(q1).multiplyScalar(radius.current).add(focusPoint.current);
92
+ mainCamera.up.set(0, 1, 0).applyQuaternion(q1).normalize();
93
+ mainCamera.quaternion.copy(q1);
94
+ if (onUpdate) onUpdate();else if (defaultControls) defaultControls.update();
95
+ invalidate();
96
+ }
97
+ } // Sync Gizmo with main camera orientation
98
+
99
+
100
+ matrix.copy(mainCamera.matrix).invert();
101
+ (_gizmoRef$current = gizmoRef.current) == null ? void 0 : _gizmoRef$current.quaternion.setFromRotationMatrix(matrix); // Render virtual camera
102
+
103
+ if (autoClear) gl.autoClear = false;
114
104
  gl.clearDepth();
115
105
  gl.render(virtualScene, virtualCam.current);
116
106
  }
117
107
  }, renderPriority);
118
- const gizmoHelperContext = {
108
+ const raycast = useCamera(virtualCam);
109
+ const gizmoHelperContext = React.useMemo(() => ({
119
110
  tweenCamera,
120
- raycast: useCamera(virtualCam)
121
- }; // Position gizmo component within scene
111
+ raycast
112
+ }), [tweenCamera]); // Position gizmo component within scene
122
113
 
123
114
  const [marginX, marginY] = margin;
124
115
  const x = alignment.endsWith('-left') ? -size.width / 2 + marginX : size.width / 2 - marginX;
@@ -127,7 +118,6 @@ const GizmoHelper = ({
127
118
  value: gizmoHelperContext
128
119
  }, /*#__PURE__*/React.createElement(OrthographicCamera, {
129
120
  ref: virtualCam,
130
- makeDefault: false,
131
121
  position: [0, 0, 200]
132
122
  }), /*#__PURE__*/React.createElement("group", {
133
123
  ref: gizmoRef,
package/core/Image.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),n=require("three"),t=require("@react-three/fiber"),a=require("./shaderMaterial.cjs.js"),o=require("./useTexture.cjs.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var t=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,t.get?t:{enumerable:!0,get:function(){return e[n]}})}})),r.default=e,Object.freeze(r)}var s=c(e),l=i(r),u=i(n);const v=a.shaderMaterial({color:new u.Color("white"),scale:[1,1],imageBounds:[1,1],map:null,zoom:1,grayscale:0},"\n varying vec2 vUv;\n void main() {\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);\n vUv = uv;\n }\n","\n // mostly from https://gist.github.com/statico/df64c5d167362ecf7b34fca0b1459a44\n varying vec2 vUv;\n uniform vec2 scale;\n uniform vec2 imageBounds;\n uniform vec3 color;\n uniform sampler2D map;\n uniform float zoom;\n uniform float grayscale;\n const vec3 luma = vec3(.299, 0.587, 0.114);\n vec4 toGrayscale(vec4 color, float intensity) {\n return vec4(mix(color.rgb, vec3(dot(color.rgb, luma)), intensity), color.a);\n }\n vec2 aspect(vec2 size) {\n return size / min(size.x, size.y);\n }\n void main() {\n vec2 s = aspect(scale);\n vec2 i = aspect(imageBounds);\n float rs = s.x / s.y;\n float ri = i.x / i.y;\n vec2 new = rs < ri ? vec2(i.x * s.y / i.y, s.y) : vec2(s.x, i.y * s.x / i.x);\n vec2 offset = (rs < ri ? vec2((new.x - s.x) / 2.0, 0.0) : vec2(0.0, (new.y - s.y) / 2.0)) / new;\n vec2 uv = vUv * s / new + offset;\n vec2 zUv = (uv - vec2(0.5, 0.5)) / zoom + vec2(0.5, 0.5);\n gl_FragColor = toGrayscale(texture2D(map, zUv) * vec4(color, 1.0), grayscale);\n }\n"),m=l.forwardRef((({children:e,color:r,segments:n=1,scale:a=1,zoom:c=1,grayscale:i=0,url:u,...m},f)=>{t.extend({ImageMaterial:v});const g=o.useTexture(u),y=Array.isArray(a)?[a[0],a[1]]:[a,a],d=[g.image.width,g.image.height];return l.createElement("mesh",s.default({ref:f,scale:a},m),l.createElement("planeGeometry",{args:[1,1,n,n]}),l.createElement("imageMaterial",{color:r,map:g,zoom:c,grayscale:i,scale:y,imageBounds:d}),e)}));exports.Image=m;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),n=require("three"),t=require("@react-three/fiber"),a=require("./shaderMaterial.cjs.js"),o=require("./useTexture.cjs.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var t=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,t.get?t:{enumerable:!0,get:function(){return e[n]}})}})),r.default=e,Object.freeze(r)}var s=c(e),l=i(r),u=i(n);const v=a.shaderMaterial({color:new u.Color("white"),scale:[1,1],imageBounds:[1,1],map:null,zoom:1,grayscale:0},"\n varying vec2 vUv;\n void main() {\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);\n vUv = uv;\n }\n","\n // mostly from https://gist.github.com/statico/df64c5d167362ecf7b34fca0b1459a44\n varying vec2 vUv;\n uniform vec2 scale;\n uniform vec2 imageBounds;\n uniform vec3 color;\n uniform sampler2D map;\n uniform float zoom;\n uniform float grayscale;\n const vec3 luma = vec3(.299, 0.587, 0.114);\n vec4 toGrayscale(vec4 color, float intensity) {\n return vec4(mix(color.rgb, vec3(dot(color.rgb, luma)), intensity), color.a);\n }\n vec2 aspect(vec2 size) {\n return size / min(size.x, size.y);\n }\n void main() {\n vec2 s = aspect(scale);\n vec2 i = aspect(imageBounds);\n float rs = s.x / s.y;\n float ri = i.x / i.y;\n vec2 new = rs < ri ? vec2(i.x * s.y / i.y, s.y) : vec2(s.x, i.y * s.x / i.x);\n vec2 offset = (rs < ri ? vec2((new.x - s.x) / 2.0, 0.0) : vec2(0.0, (new.y - s.y) / 2.0)) / new;\n vec2 uv = vUv * s / new + offset;\n vec2 zUv = (uv - vec2(0.5, 0.5)) / zoom + vec2(0.5, 0.5);\n gl_FragColor = toGrayscale(texture2D(map, zUv) * vec4(color, 1.0), grayscale);\n \n #include <tonemapping_fragment>\n #include <encodings_fragment>\n }\n"),m=l.forwardRef((({children:e,color:r,segments:n=1,scale:a=1,zoom:c=1,grayscale:i=0,url:u,toneMapped:m,...f},g)=>{t.extend({ImageMaterial:v});const d=o.useTexture(u),y=Array.isArray(a)?[a[0],a[1]]:[a,a],p=[d.image.width,d.image.height];return l.createElement("mesh",s.default({ref:g,scale:a},f),l.createElement("planeGeometry",{args:[1,1,n,n]}),l.createElement("imageMaterial",{color:r,map:d,zoom:c,grayscale:i,scale:y,imageBounds:p,toneMapped:m}),e)}));exports.Image=m;
package/core/Image.d.ts CHANGED
@@ -3,10 +3,11 @@ import * as THREE from 'three';
3
3
  import { Color } from '@react-three/fiber';
4
4
  export declare type ImageProps = JSX.IntrinsicElements['mesh'] & {
5
5
  segments?: number;
6
- scale?: number;
6
+ scale?: number | [number, number];
7
7
  color?: Color;
8
8
  zoom?: number;
9
9
  grayscale?: number;
10
+ toneMapped?: boolean;
10
11
  url: string;
11
12
  };
12
13
  declare type ImageMaterialType = JSX.IntrinsicElements['shaderMaterial'] & {
@@ -44,10 +45,11 @@ export declare const Image: React.ForwardRefExoticComponent<Pick<Omit<import("@r
44
45
  dispose?: (() => void) | null | undefined;
45
46
  } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
46
47
  segments?: number | undefined;
47
- scale?: number | undefined;
48
+ scale?: number | [number, number] | undefined;
48
49
  color?: Color | undefined;
49
50
  zoom?: number | undefined;
50
51
  grayscale?: number | undefined;
52
+ toneMapped?: boolean | undefined;
51
53
  url: string;
52
- }, "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 | "zoom" | "material" | "url" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "segments" | "grayscale"> & React.RefAttributes<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
54
+ }, "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 | "zoom" | "material" | "url" | "toneMapped" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "segments" | "grayscale"> & React.RefAttributes<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
53
55
  export {};
package/core/Image.js CHANGED
@@ -48,6 +48,9 @@ const ImageMaterialImpl = shaderMaterial({
48
48
  vec2 uv = vUv * s / new + offset;
49
49
  vec2 zUv = (uv - vec2(0.5, 0.5)) / zoom + vec2(0.5, 0.5);
50
50
  gl_FragColor = toGrayscale(texture2D(map, zUv) * vec4(color, 1.0), grayscale);
51
+
52
+ #include <tonemapping_fragment>
53
+ #include <encodings_fragment>
51
54
  }
52
55
  `);
53
56
  const Image = /*#__PURE__*/React.forwardRef(({
@@ -58,6 +61,7 @@ const Image = /*#__PURE__*/React.forwardRef(({
58
61
  zoom = 1,
59
62
  grayscale = 0,
60
63
  url,
64
+ toneMapped,
61
65
  ...props
62
66
  }, ref) => {
63
67
  extend({
@@ -77,7 +81,8 @@ const Image = /*#__PURE__*/React.forwardRef(({
77
81
  zoom: zoom,
78
82
  grayscale: grayscale,
79
83
  scale: planeBounds,
80
- imageBounds: imageBounds
84
+ imageBounds: imageBounds,
85
+ toneMapped: toneMapped
81
86
  }), children);
82
87
  });
83
88
 
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),n=require("@react-three/fiber"),a=require("react-merge-refs"),c=require("react-composer"),u=require("../helpers/Position.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),l=i(t),f=i(r),d=o(a),m=o(c);let y,p;const x=f.createContext(null),g=new l.Matrix4,b=new l.Matrix4,h=new l.Matrix4,M=new l.Color,w=new l.Vector3,A=new l.Quaternion,E=new l.Vector3,j=f.forwardRef((({context:e,children:t,...r},a)=>{f.useMemo((()=>n.extend({Position:u.Position})),[]);const c=f.useRef(),{subscribe:o,getParent:i}=f.useContext(e||x);return f.useLayoutEffect((()=>o(c)),[]),f.createElement("position",s.default({instance:i(),instanceKey:c,ref:d.default([a,c])},r),t)})),v=f.forwardRef((({children:e,range:t,limit:r=1e3,frames:a=1/0,...c},u)=>{const[{context:o,instance:i}]=f.useState((()=>{const e=f.createContext(null);return{context:e,instance:f.forwardRef(((t,r)=>f.createElement(j,s.default({context:e},t,{ref:r}))))}})),m=f.useRef(null),[v,O]=f.useState([]),[[P,q]]=f.useState((()=>{const e=new Float32Array(16*r);for(y=0;y<r;y++)h.identity().toArray(e,16*y);return[e,new Float32Array([...new Array(3*r)].map((()=>1)))]}));f.useLayoutEffect((()=>{m.current.count=m.current.instanceMatrix.updateRange.count=m.current.instanceColor.updateRange.count=Math.min(r,void 0!==t?t:r,v.length)}),[v,t]),f.useEffect((()=>{m.current.instanceMatrix.needsUpdate=!0}));let C=0;n.useFrame((()=>{if(a===1/0||C<a){for(m.current.updateMatrix(),m.current.updateMatrixWorld(),g.copy(m.current.matrixWorld).invert(),y=0;y<v.length;y++)p=v[y].current,p.matrixWorld.decompose(w,A,E),b.compose(w,A,E).premultiply(g),b.equals(h.fromArray(P,16*y))||(b.toArray(P,16*y),m.current.instanceMatrix.needsUpdate=!0),p.color.equals(M.fromArray(q,3*y))||(p.color.toArray(q,3*y),m.current.instanceColor.needsUpdate=!0);C++}}));const R=f.useMemo((()=>({getParent:()=>m,subscribe:e=>(O((t=>[...t,e])),()=>O((t=>t.filter((t=>t.current!==e.current)))))})),[]);return f.createElement("instancedMesh",s.default({userData:{instances:v},matrixAutoUpdate:!1,ref:d.default([u,m]),args:[null,null,0],raycast:()=>null},c),f.createElement("instancedBufferAttribute",{attach:"instanceMatrix",count:P.length/16,array:P,itemSize:16,usage:l.DynamicDrawUsage}),f.createElement("instancedBufferAttribute",{attach:"instanceColor",count:q.length/3,array:q,itemSize:3,usage:l.DynamicDrawUsage}),"function"==typeof e?f.createElement(o.Provider,{value:R},e(i)):f.createElement(x.Provider,{value:R},e))}));exports.Instance=j,exports.Instances=v,exports.Merged=function({meshes:e,children:t,...r}){const n=Array.isArray(e);if(!n)for(const t of Object.keys(e))e[t].isMesh||delete e[t];return f.createElement(m.default,{components:(n?e:Object.values(e)).map((({geometry:e,material:t})=>f.createElement(v,s.default({key:e.uuid,geometry:e,material:t},r))))},(r=>n?t(...r):t(Object.keys(e).filter((t=>e[t].isMesh)).reduce(((e,t,n)=>({...e,[t]:r[n]})),{}))))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),n=require("@react-three/fiber"),a=require("react-merge-refs"),c=require("react-composer"),u=require("../helpers/Position.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),l=i(t),f=i(r),d=o(a),m=o(c);let p,y;const x=f.createContext(null),g=new l.Matrix4,b=new l.Matrix4,h=new l.Matrix4;new l.Color;const M=new l.Vector3,w=new l.Quaternion,E=new l.Vector3,j=f.forwardRef((({context:e,children:t,...r},a)=>{f.useMemo((()=>n.extend({Position:u.Position})),[]);const c=f.useRef(),{subscribe:o,getParent:i}=f.useContext(e||x);return f.useLayoutEffect((()=>o(c)),[]),f.createElement("position",s.default({instance:i(),instanceKey:c,ref:d.default([a,c])},r),t)})),v=f.forwardRef((({children:e,range:t,limit:r=1e3,frames:a=1/0,...c},u)=>{const[{context:o,instance:i}]=f.useState((()=>{const e=f.createContext(null);return{context:e,instance:f.forwardRef(((t,r)=>f.createElement(j,s.default({context:e},t,{ref:r}))))}})),m=f.useRef(null),[v,A]=f.useState([]),[[O,P]]=f.useState((()=>{const e=new Float32Array(16*r);for(p=0;p<r;p++)h.identity().toArray(e,16*p);return[e,new Float32Array([...new Array(3*r)].map((()=>1)))]}));f.useLayoutEffect((()=>{m.current.count=m.current.instanceMatrix.updateRange.count=m.current.instanceColor.updateRange.count=Math.min(r,void 0!==t?t:r,v.length)}),[v,t]),f.useEffect((()=>{m.current.instanceMatrix.needsUpdate=!0}));let q=0;n.useFrame((()=>{if(a===1/0||q<a){for(m.current.updateMatrix(),m.current.updateMatrixWorld(),g.copy(m.current.matrixWorld).invert(),p=0;p<v.length;p++)y=v[p].current,y.matrixWorld.decompose(M,w,E),b.compose(M,w,E).premultiply(g),b.toArray(O,16*p),m.current.instanceMatrix.needsUpdate=!0,y.color.toArray(P,3*p),m.current.instanceColor.needsUpdate=!0;q++}}));const C=f.useMemo((()=>({getParent:()=>m,subscribe:e=>(A((t=>[...t,e])),()=>A((t=>t.filter((t=>t.current!==e.current)))))})),[]);return f.createElement("instancedMesh",s.default({userData:{instances:v},matrixAutoUpdate:!1,ref:d.default([u,m]),args:[null,null,0],raycast:()=>null},c),f.createElement("instancedBufferAttribute",{attach:"instanceMatrix",count:O.length/16,array:O,itemSize:16,usage:l.DynamicDrawUsage}),f.createElement("instancedBufferAttribute",{attach:"instanceColor",count:P.length/3,array:P,itemSize:3,usage:l.DynamicDrawUsage}),"function"==typeof e?f.createElement(o.Provider,{value:C},e(i)):f.createElement(x.Provider,{value:C},e))}));exports.Instance=j,exports.Instances=v,exports.Merged=function({meshes:e,children:t,...r}){const n=Array.isArray(e);if(!n)for(const t of Object.keys(e))e[t].isMesh||delete e[t];return f.createElement(m.default,{components:(n?e:Object.values(e)).map((({geometry:e,material:t})=>f.createElement(v,s.default({key:e.uuid,geometry:e,material:t},r))))},(r=>n?t(...r):t(Object.keys(e).filter((t=>e[t].isMesh)).reduce(((e,t,n)=>({...e,[t]:r[n]})),{}))))};
@@ -35,7 +35,7 @@ declare const Instance: React.ForwardRefExoticComponent<Pick<Omit<import("@react
35
35
  } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
36
36
  context?: React.Context<Api> | undefined;
37
37
  }, "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 | "geometry" | "context" | "instance" | "instanceKey"> & React.RefAttributes<unknown>>;
38
- declare const Instances: React.ForwardRefExoticComponent<Pick<InstancesProps, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "range" | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "instanceMatrix" | "frames" | "count" | "instanceColor" | "isInstancedMesh" | "getColorAt" | "getMatrixAt" | "setColorAt" | "setMatrixAt" | "limit"> & React.RefAttributes<InstancedMesh>>;
38
+ declare const Instances: React.ForwardRefExoticComponent<Pick<InstancesProps, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "range" | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "instanceMatrix" | "count" | "frames" | "instanceColor" | "isInstancedMesh" | "getColorAt" | "getMatrixAt" | "setColorAt" | "setMatrixAt" | "limit"> & React.RefAttributes<InstancedMesh>>;
39
39
  declare function Merged({ meshes, children, ...props }: {
40
40
  [x: string]: any;
41
41
  meshes: any;
package/core/Instances.js CHANGED
@@ -11,7 +11,7 @@ const globalContext = /*#__PURE__*/React.createContext(null);
11
11
  const parentMatrix = new THREE.Matrix4();
12
12
  const instanceMatrix = new THREE.Matrix4();
13
13
  const tempMatrix = new THREE.Matrix4();
14
- const color = new THREE.Color();
14
+ new THREE.Color();
15
15
  const translation = new THREE.Vector3();
16
16
  const rotation = new THREE.Quaternion();
17
17
  const scale = new THREE.Vector3();
@@ -85,16 +85,10 @@ const Instances = /*#__PURE__*/React.forwardRef(({
85
85
 
86
86
  instanceRef.matrixWorld.decompose(translation, rotation, scale);
87
87
  instanceMatrix.compose(translation, rotation, scale).premultiply(parentMatrix);
88
-
89
- if (!instanceMatrix.equals(tempMatrix.fromArray(matrices, i * 16))) {
90
- instanceMatrix.toArray(matrices, i * 16);
91
- parentRef.current.instanceMatrix.needsUpdate = true;
92
- }
93
-
94
- if (!instanceRef.color.equals(color.fromArray(colors, i * 3))) {
95
- instanceRef.color.toArray(colors, i * 3);
96
- parentRef.current.instanceColor.needsUpdate = true;
97
- }
88
+ instanceMatrix.toArray(matrices, i * 16);
89
+ parentRef.current.instanceMatrix.needsUpdate = true;
90
+ instanceRef.color.toArray(colors, i * 3);
91
+ parentRef.current.instanceColor.needsUpdate = true;
98
92
  }
99
93
 
100
94
  count++;
@@ -0,0 +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"),a=require("three"),l=require("react-merge-refs");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var 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 u=n(e),i=c(t),o=c(a),s=n(l);const f=i.forwardRef((({args:e,map:t,toneMapped:a=!1,color:l="white",form:n="rect",intensity:c=1,scale:f=1,target:m,children:p,...d},y)=>{const g=i.useRef(null);return i.useLayoutEffect((()=>{p||d.material||(r.applyProps(g.current.material,{color:l}),g.current.material.color.multiplyScalar(c))}),[l,c,p,d.material]),i.useLayoutEffect((()=>{m&&g.current.lookAt(Array.isArray(m)?new o.Vector3(...m):m)}),[m]),f=Array.isArray(f)&&2===f.length?[f[0],f[1],1]:f,i.createElement("mesh",u.default({ref:s.default([g,y]),scale:f},d),"circle"===n?i.createElement("ringGeometry",{args:[0,1,64]}):"ring"===n?i.createElement("ringGeometry",{args:[.5,1,64]}):"rect"===n?i.createElement("planeGeometry",null):i.createElement(n,{args:e}),p||(d.material?null:i.createElement("meshBasicMaterial",{toneMapped:a,map:t,side:o.DoubleSide})))}));exports.Lightformer=f;