@react-three/drei 9.83.9 → 9.84.1

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 (255) hide show
  1. package/README.md +116 -5
  2. package/core/AccumulativeShadows.d.ts +3 -3
  3. package/core/AccumulativeShadows.js +30 -36
  4. package/core/AdaptiveDpr.js +4 -4
  5. package/core/ArcballControls.d.ts +1 -1
  6. package/core/ArcballControls.js +0 -1
  7. package/core/AsciiRenderer.d.ts +3 -3
  8. package/core/AsciiRenderer.js +12 -6
  9. package/core/BBAnchor.cjs.js +1 -1
  10. package/core/BBAnchor.d.ts +2 -2
  11. package/core/BBAnchor.js +5 -5
  12. package/core/Backdrop.d.ts +2 -2
  13. package/core/Backdrop.js +0 -3
  14. package/core/Billboard.d.ts +1 -1
  15. package/core/Billboard.js +6 -3
  16. package/core/Bounds.d.ts +5 -5
  17. package/core/Bounds.js +5 -32
  18. package/core/CameraControls.d.ts +2 -2
  19. package/core/CameraControls.js +0 -3
  20. package/core/CameraShake.js +0 -4
  21. package/core/CatmullRomLine.d.ts +1 -1
  22. package/core/CatmullRomLine.js +0 -2
  23. package/core/Caustics.d.ts +1 -1
  24. package/core/Caustics.js +31 -32
  25. package/core/Center.d.ts +2 -2
  26. package/core/Center.js +2 -1
  27. package/core/Clone.d.ts +1 -1
  28. package/core/Clone.js +10 -13
  29. package/core/Cloud.cjs.js +1 -1
  30. package/core/Cloud.d.ts +2 -2
  31. package/core/Cloud.js +1 -2
  32. package/core/ComputedAttribute.d.ts +2 -2
  33. package/core/ComputedAttribute.js +0 -1
  34. package/core/ContactShadows.d.ts +1 -1
  35. package/core/ContactShadows.js +6 -7
  36. package/core/CubeCamera.cjs.js +1 -1
  37. package/core/CubeCamera.d.ts +2 -2
  38. package/core/CubeCamera.js +1 -1
  39. package/core/CubicBezierLine.d.ts +1 -1
  40. package/core/CurveModifier.d.ts +1 -1
  41. package/core/CurveModifier.js +2 -4
  42. package/core/Decal.d.ts +1 -1
  43. package/core/Decal.js +8 -15
  44. package/core/Detailed.d.ts +1 -1
  45. package/core/Detailed.js +0 -1
  46. package/core/DeviceOrientationControls.d.ts +1 -1
  47. package/core/DeviceOrientationControls.js +3 -4
  48. package/core/Edges.d.ts +1 -1
  49. package/core/Edges.js +0 -2
  50. package/core/Effects.d.ts +1 -1
  51. package/core/Effects.js +5 -7
  52. package/core/Environment.d.ts +3 -3
  53. package/core/Environment.js +6 -12
  54. package/core/Example.d.ts +3 -3
  55. package/core/Example.js +2 -1
  56. package/core/FaceControls.cjs.js +1 -1
  57. package/core/FaceControls.d.ts +5 -5
  58. package/core/FaceControls.js +42 -39
  59. package/core/FaceLandmarker.d.ts +3 -2
  60. package/core/FaceLandmarker.js +1 -1
  61. package/core/Facemesh.d.ts +6 -6
  62. package/core/Facemesh.js +47 -53
  63. package/core/FirstPersonControls.d.ts +1 -1
  64. package/core/Float.d.ts +1 -1
  65. package/core/Float.js +0 -1
  66. package/core/FlyControls.d.ts +1 -1
  67. package/core/FlyControls.js +1 -2
  68. package/core/GizmoHelper.cjs.js +1 -1
  69. package/core/GizmoHelper.d.ts +2 -2
  70. package/core/GizmoHelper.js +18 -19
  71. package/core/GizmoViewcube.d.ts +3 -3
  72. package/core/GizmoViewcube.js +0 -14
  73. package/core/GizmoViewport.d.ts +3 -3
  74. package/core/GizmoViewport.js +0 -7
  75. package/core/Gltf.d.ts +1 -1
  76. package/core/GradientTexture.d.ts +3 -3
  77. package/core/GradientTexture.js +2 -5
  78. package/core/Grid.d.ts +2 -2
  79. package/core/Grid.js +2 -6
  80. package/core/Hud.d.ts +2 -2
  81. package/core/Hud.js +6 -9
  82. package/core/Image.d.ts +2 -2
  83. package/core/Image.js +4 -6
  84. package/core/Instances.d.ts +6 -6
  85. package/core/Instances.js +20 -35
  86. package/core/Lightformer.d.ts +1 -1
  87. package/core/Lightformer.js +4 -2
  88. package/core/Line.d.ts +1 -1
  89. package/core/Line.js +0 -3
  90. package/core/MapControls.d.ts +1 -1
  91. package/core/MapControls.js +0 -2
  92. package/core/MarchingCubes.d.ts +3 -3
  93. package/core/Mask.d.ts +1 -1
  94. package/core/MeshDistortMaterial.d.ts +2 -2
  95. package/core/MeshDistortMaterial.js +0 -9
  96. package/core/MeshPortalMaterial.d.ts +4 -4
  97. package/core/MeshPortalMaterial.js +22 -61
  98. package/core/MeshReflectorMaterial.d.ts +1 -1
  99. package/core/MeshReflectorMaterial.js +12 -14
  100. package/core/MeshRefractionMaterial.cjs.js +1 -1
  101. package/core/MeshRefractionMaterial.d.ts +3 -3
  102. package/core/MeshRefractionMaterial.js +9 -14
  103. package/core/MeshTransmissionMaterial.d.ts +2 -2
  104. package/core/MeshTransmissionMaterial.js +32 -33
  105. package/core/MeshWobbleMaterial.d.ts +2 -2
  106. package/core/MeshWobbleMaterial.js +0 -7
  107. package/core/MotionPathControls.cjs.js +1 -0
  108. package/core/MotionPathControls.d.ts +15 -0
  109. package/core/MotionPathControls.js +113 -0
  110. package/core/OrbitControls.d.ts +2 -2
  111. package/core/OrbitControls.js +0 -4
  112. package/core/OrthographicCamera.d.ts +1 -1
  113. package/core/OrthographicCamera.js +2 -3
  114. package/core/Outlines.cjs.js +1 -1
  115. package/core/Outlines.d.ts +3 -3
  116. package/core/Outlines.js +2 -7
  117. package/core/PerformanceMonitor.d.ts +4 -4
  118. package/core/PerformanceMonitor.js +8 -12
  119. package/core/PerspectiveCamera.d.ts +1 -1
  120. package/core/PerspectiveCamera.js +2 -3
  121. package/core/PointMaterial.d.ts +1 -1
  122. package/core/PointMaterial.js +0 -2
  123. package/core/PointerLockControls.d.ts +1 -1
  124. package/core/PointerLockControls.js +4 -6
  125. package/core/Points.d.ts +2 -2
  126. package/core/Points.js +6 -23
  127. package/core/PositionalAudio.d.ts +1 -1
  128. package/core/PositionalAudio.js +0 -5
  129. package/core/Preload.d.ts +1 -1
  130. package/core/Preload.js +8 -9
  131. package/core/QuadraticBezierLine.d.ts +2 -2
  132. package/core/QuadraticBezierLine.js +0 -2
  133. package/core/Reflector.d.ts +1 -1
  134. package/core/Reflector.js +11 -12
  135. package/core/RenderTexture.d.ts +1 -1
  136. package/core/RenderTexture.js +9 -11
  137. package/core/Resize.d.ts +2 -2
  138. package/core/RoundedBox.cjs.js +1 -1
  139. package/core/RoundedBox.d.ts +1 -1
  140. package/core/RoundedBox.js +1 -3
  141. package/core/Sampler.d.ts +5 -5
  142. package/core/Sampler.js +0 -10
  143. package/core/ScreenQuad.d.ts +1 -1
  144. package/core/ScreenQuad.js +0 -1
  145. package/core/ScreenSpace.d.ts +1 -1
  146. package/core/Segments.d.ts +2 -2
  147. package/core/Segments.js +0 -6
  148. package/core/Shadow.d.ts +1 -1
  149. package/core/Sky.d.ts +1 -1
  150. package/core/Sparkles.js +0 -10
  151. package/core/SpotLight.d.ts +2 -2
  152. package/core/SpotLight.js +3 -10
  153. package/core/SpriteAnimator.d.ts +1 -1
  154. package/core/SpriteAnimator.js +16 -34
  155. package/core/Stage.d.ts +4 -4
  156. package/core/Stage.js +2 -4
  157. package/core/Stars.d.ts +1 -1
  158. package/core/Stars.js +2 -11
  159. package/core/Stats.d.ts +1 -1
  160. package/core/Stats.js +2 -2
  161. package/core/StatsGl.d.ts +1 -1
  162. package/core/StatsGl.js +4 -3
  163. package/core/Svg.js +0 -2
  164. package/core/Text.d.ts +1 -1
  165. package/core/Text3D.d.ts +1 -1
  166. package/core/Text3D.js +1 -3
  167. package/core/TrackballControls.d.ts +1 -1
  168. package/core/TrackballControls.js +0 -1
  169. package/core/Trail.d.ts +3 -3
  170. package/core/Trail.js +6 -17
  171. package/core/TransformControls.d.ts +1 -1
  172. package/core/TransformControls.js +3 -9
  173. package/core/Wireframe.d.ts +1 -1
  174. package/core/Wireframe.js +0 -28
  175. package/core/index.cjs.js +1 -1
  176. package/core/index.d.ts +1 -0
  177. package/core/index.js +1 -0
  178. package/core/meshBounds.js +4 -14
  179. package/core/shaderMaterial.js +10 -9
  180. package/core/shapes.d.ts +2 -2
  181. package/core/shapes.js +3 -6
  182. package/core/softShadows.d.ts +1 -1
  183. package/core/softShadows.js +1 -4
  184. package/core/useAnimations.d.ts +1 -1
  185. package/core/useAnimations.js +2 -4
  186. package/core/useBVH.d.ts +1 -1
  187. package/core/useBVH.js +3 -4
  188. package/core/useBoxProjectedEnv.js +15 -22
  189. package/core/useCamera.js +0 -1
  190. package/core/useContextBridge.js +1 -2
  191. package/core/useCubeCamera.d.ts +1 -1
  192. package/core/useCubeTexture.d.ts +1 -1
  193. package/core/useCubeTexture.js +4 -3
  194. package/core/useEnvironment.cjs.js +1 -1
  195. package/core/useEnvironment.d.ts +2 -2
  196. package/core/useEnvironment.js +9 -11
  197. package/core/useFBO.d.ts +1 -1
  198. package/core/useFBO.js +3 -12
  199. package/core/useFBX.js +0 -2
  200. package/core/useFont.d.ts +2 -2
  201. package/core/useFont.js +0 -4
  202. package/core/useGLTF.d.ts +2 -2
  203. package/core/useGLTF.js +0 -8
  204. package/core/useHelper.d.ts +3 -3
  205. package/core/useHelper.js +2 -5
  206. package/core/useIntersect.js +5 -8
  207. package/core/useKTX2.js +3 -5
  208. package/core/useMatcapTexture.js +0 -6
  209. package/core/useNormalTexture.d.ts +1 -1
  210. package/core/useProgress.d.ts +1 -1
  211. package/core/useProgress.js +0 -5
  212. package/core/useTexture.js +4 -6
  213. package/core/useTrailTexture.d.ts +1 -1
  214. package/core/useTrailTexture.js +10 -21
  215. package/helpers/environment-assets.d.ts +1 -1
  216. package/helpers/ts-utils.d.ts +2 -2
  217. package/helpers/useEffectfulState.d.ts +1 -1
  218. package/helpers/useEffectfulState.js +0 -1
  219. package/index.cjs.js +1 -1
  220. package/index.js +1 -0
  221. package/materials/BlurPass.js +2 -5
  222. package/materials/ConvolutionMaterial.js +0 -3
  223. package/materials/MeshReflectorMaterial.d.ts +1 -1
  224. package/materials/MeshReflectorMaterial.js +0 -34
  225. package/materials/MeshRefractionMaterial.js +2 -6
  226. package/materials/SpotLightMaterial.js +2 -7
  227. package/materials/WireframeMaterial.js +7 -25
  228. package/native/index.cjs.js +1 -1
  229. package/native/index.js +1 -0
  230. package/package.json +2 -2
  231. package/react-three-drei-0.0.0-semantic-release.tgz +0 -0
  232. package/web/CycleRaycast.d.ts +1 -1
  233. package/web/CycleRaycast.js +20 -24
  234. package/web/Html.d.ts +2 -2
  235. package/web/Html.js +6 -50
  236. package/web/KeyboardControls.d.ts +10 -10
  237. package/web/KeyboardControls.js +9 -6
  238. package/web/Loader.d.ts +2 -2
  239. package/web/Loader.js +8 -5
  240. package/web/PresentationControls.d.ts +2 -2
  241. package/web/PresentationControls.js +2 -1
  242. package/web/ScrollControls.d.ts +4 -4
  243. package/web/ScrollControls.js +5 -16
  244. package/web/Select.d.ts +3 -3
  245. package/web/Select.js +6 -17
  246. package/web/View.d.ts +5 -5
  247. package/web/View.js +7 -20
  248. package/web/index.cjs.js +1 -1
  249. package/web/index.js +1 -0
  250. package/web/pivotControls/AxisArrow.js +6 -15
  251. package/web/pivotControls/AxisRotator.js +8 -23
  252. package/web/pivotControls/PlaneSlider.js +6 -16
  253. package/web/pivotControls/context.d.ts +2 -2
  254. package/web/pivotControls/index.d.ts +1 -1
  255. package/web/pivotControls/index.js +2 -9
@@ -58,19 +58,20 @@ class MeshTransmissionMaterialImpl extends THREE.MeshPhysicalMaterial {
58
58
  value: null
59
59
  }
60
60
  };
61
-
62
61
  this.onBeforeCompile = shader => {
63
- shader.uniforms = { ...shader.uniforms,
62
+ shader.uniforms = {
63
+ ...shader.uniforms,
64
64
  ...this.uniforms
65
- }; // If the transmission sampler is active inject a flag
65
+ };
66
66
 
67
- if (transmissionSampler) shader.defines.USE_SAMPLER = ''; // Otherwise we do use use .transmission and must therefore force USE_TRANSMISSION
67
+ // If the transmission sampler is active inject a flag
68
+ if (transmissionSampler) shader.defines.USE_SAMPLER = '';
69
+ // Otherwise we do use use .transmission and must therefore force USE_TRANSMISSION
68
70
  // because threejs won't inject it for us
69
- else shader.defines.USE_TRANSMISSION = ''; // Head
71
+ else shader.defines.USE_TRANSMISSION = '';
70
72
 
71
- shader.fragmentShader =
72
- /*glsl*/
73
- `
73
+ // Head
74
+ shader.fragmentShader = /*glsl*/`
74
75
  uniform float chromaticAberration;
75
76
  uniform float anisotropicBlur;
76
77
  uniform float time;
@@ -161,11 +162,10 @@ class MeshTransmissionMaterialImpl extends THREE.MeshPhysicalMaterial {
161
162
  +0.2666667* snoise(2.0*m)
162
163
  +0.1333333* snoise(4.0*m)
163
164
  +0.0666667* snoise(8.0*m);
164
- }\n` + shader.fragmentShader; // Remove transmission
165
+ }\n` + shader.fragmentShader;
165
166
 
166
- shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_pars_fragment>',
167
- /*glsl*/
168
- `
167
+ // Remove transmission
168
+ shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_pars_fragment>', /*glsl*/`
169
169
  #ifdef USE_TRANSMISSION
170
170
  // Transmission code is based on glTF-Sampler-Viewer
171
171
  // https://github.com/KhronosGroup/glTF-Sample-Viewer
@@ -241,11 +241,10 @@ class MeshTransmissionMaterialImpl extends THREE.MeshPhysicalMaterial {
241
241
  vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );
242
242
  return vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );
243
243
  }
244
- #endif\n`); // Add refraction
244
+ #endif\n`);
245
245
 
246
- shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_fragment>',
247
- /*glsl*/
248
- `
246
+ // Add refraction
247
+ shader.fragmentShader = shader.fragmentShader.replace('#include <transmission_fragment>', /*glsl*/`
249
248
  // Improve the refraction to use the world pos
250
249
  material.transmission = _transmission;
251
250
  material.transmissionAlpha = 1.0;
@@ -295,15 +294,12 @@ class MeshTransmissionMaterialImpl extends THREE.MeshPhysicalMaterial {
295
294
  transmission /= ${samples}.0;
296
295
  totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\n`);
297
296
  };
298
-
299
297
  Object.keys(this.uniforms).forEach(name => Object.defineProperty(this, name, {
300
298
  get: () => this.uniforms[name].value,
301
299
  set: v => this.uniforms[name].value = v
302
300
  }));
303
301
  }
304
-
305
302
  }
306
-
307
303
  const MeshTransmissionMaterial = /*#__PURE__*/React.forwardRef(({
308
304
  buffer,
309
305
  transmissionSampler = false,
@@ -331,57 +327,60 @@ const MeshTransmissionMaterial = /*#__PURE__*/React.forwardRef(({
331
327
  let oldTone;
332
328
  let parent;
333
329
  useFrame(state => {
334
- ref.current.time = state.clock.getElapsedTime(); // Render only if the buffer matches the built-in and no transmission sampler is set
335
-
330
+ ref.current.time = state.clock.getElapsedTime();
331
+ // Render only if the buffer matches the built-in and no transmission sampler is set
336
332
  if (ref.current.buffer === fboMain.texture && !transmissionSampler) {
337
333
  parent = ref.current.__r3f.parent;
338
-
339
334
  if (parent) {
340
335
  // Save defaults
341
336
  oldTone = state.gl.toneMapping;
342
- oldBg = state.scene.background; // Switch off tonemapping lest it double tone maps
337
+ oldBg = state.scene.background;
338
+
339
+ // Switch off tonemapping lest it double tone maps
343
340
  // Save the current background and set the HDR as the new BG
344
341
  // Use discardmaterial, the parent will be invisible, but it's shadows will still be cast
345
-
346
342
  state.gl.toneMapping = THREE.NoToneMapping;
347
343
  if (background) state.scene.background = background;
348
344
  parent.material = discardMaterial;
349
-
350
345
  if (backside) {
351
346
  // Render into the backside buffer
352
347
  state.gl.setRenderTarget(fboBack);
353
- state.gl.render(state.scene, state.camera); // And now prepare the material for the main render using the backside buffer
354
-
348
+ state.gl.render(state.scene, state.camera);
349
+ // And now prepare the material for the main render using the backside buffer
355
350
  parent.material = ref.current;
356
351
  parent.material.buffer = fboBack.texture;
357
352
  parent.material.thickness = backsideThickness;
358
353
  parent.material.side = THREE.BackSide;
359
- } // Render into the main buffer
360
-
354
+ }
361
355
 
356
+ // Render into the main buffer
362
357
  state.gl.setRenderTarget(fboMain);
363
358
  state.gl.render(state.scene, state.camera);
364
359
  parent.material = ref.current;
365
360
  parent.material.thickness = thickness;
366
361
  parent.material.side = side;
367
- parent.material.buffer = fboMain.texture; // Set old state back
362
+ parent.material.buffer = fboMain.texture;
368
363
 
364
+ // Set old state back
369
365
  state.scene.background = oldBg;
370
366
  state.gl.setRenderTarget(null);
371
367
  state.gl.toneMapping = oldTone;
372
368
  }
373
369
  }
374
- }); // Forward ref
370
+ });
375
371
 
372
+ // Forward ref
376
373
  React.useImperativeHandle(fref, () => ref.current, []);
377
374
  return /*#__PURE__*/React.createElement("meshTransmissionMaterial", _extends({
378
375
  // Samples must re-compile the shader so we memoize it
379
376
  args: [samples, transmissionSampler],
380
377
  ref: ref
381
378
  }, props, {
382
- buffer: buffer || fboMain.texture // @ts-ignore
379
+ buffer: buffer || fboMain.texture
380
+ // @ts-ignore
383
381
  ,
384
- _transmission: transmission // In order for this to not incur extra cost "transmission" must be set to 0 and treated as a reserved prop.
382
+ _transmission: transmission
383
+ // In order for this to not incur extra cost "transmission" must be set to 0 and treated as a reserved prop.
385
384
  // This is because THREE.WebGLRenderer will check for transmission > 0 and execute extra renders.
386
385
  // The exception is when transmissionSampler is set, in which case we are using three's built in sampler.
387
386
  ,
@@ -1,11 +1,11 @@
1
1
  import { MeshStandardMaterial, MeshStandardMaterialParameters, Shader } from 'three';
2
2
  import { ForwardRefComponent } from '../helpers/ts-utils';
3
- declare type WobbleMaterialType = JSX.IntrinsicElements['meshStandardMaterial'] & {
3
+ type WobbleMaterialType = JSX.IntrinsicElements['meshStandardMaterial'] & {
4
4
  time?: number;
5
5
  factor?: number;
6
6
  speed?: number;
7
7
  };
8
- declare type Props = WobbleMaterialType & {
8
+ type Props = WobbleMaterialType & {
9
9
  speed?: number;
10
10
  factor?: number;
11
11
  };
@@ -14,7 +14,6 @@ class WobbleMaterialImpl extends MeshStandardMaterial {
14
14
  value: 1
15
15
  };
16
16
  }
17
-
18
17
  onBeforeCompile(shader) {
19
18
  shader.uniforms.time = this._time;
20
19
  shader.uniforms.factor = this._factor;
@@ -30,25 +29,19 @@ class WobbleMaterialImpl extends MeshStandardMaterial {
30
29
  vec3 transformed = vec3( position ) * m;
31
30
  vNormal = vNormal * m;`);
32
31
  }
33
-
34
32
  get time() {
35
33
  return this._time.value;
36
34
  }
37
-
38
35
  set time(v) {
39
36
  this._time.value = v;
40
37
  }
41
-
42
38
  get factor() {
43
39
  return this._factor.value;
44
40
  }
45
-
46
41
  set factor(v) {
47
42
  this._factor.value = v;
48
43
  }
49
-
50
44
  }
51
-
52
45
  const MeshWobbleMaterial = /*#__PURE__*/React.forwardRef(({
53
46
  speed = 1,
54
47
  ...props
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),n=require("@react-three/fiber"),o=require("maath");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 s=u(e),a=c(t),i=c(r);const f=i.createContext(null);function l(){return i.useContext(f)}function p({points:e=50}){const{path:t}=l(),[r,n]=i.useState([]),[o]=i.useState((()=>new a.MeshBasicMaterial({color:"black"}))),[u]=i.useState((()=>new a.SphereGeometry(.025,16,16))),c=i.useRef([]);return i.useEffect((()=>{t.curves!==c.current&&(n(t.getPoints(e)),c.current=t.curves)})),i.createElement(i.Fragment,null,r.map(((e,t)=>i.createElement("mesh",{key:t,material:o,geometry:u,position:[e.x,e.y,e.z]}))))}const m=i.forwardRef((({children:e,curves:t=[],object:r,debug:u=!1,smooth:c=!1,focus:l,offset:m,eps:d=1e-5,damping:g=.1,focusDamping:v=.1,maxSpeed:b=1/0,...h},j)=>{const{camera:y}=n.useThree(),P=i.useRef(),[w]=i.useState((()=>new a.CurvePath)),x=i.useRef(null!=m?m:0),O=i.useMemo((()=>({focus:l,object:(null==r?void 0:r.current)instanceof a.Object3D?r:{current:y},path:w,current:x.current,offset:x.current,point:new a.Vector3,tangent:new a.Vector3,next:new a.Vector3})),[l,r]);i.useLayoutEffect((()=>{var e;w.curves=[];const r=t.length>0?t:null==(e=P.current)?void 0:e.__r3f.objects;for(var n=0;n<r.length;n++)w.add(r[n]);if(c){const e=w.getPoints("number"==typeof c?c:1),t=new a.CatmullRomCurve3(e);w.curves=[t]}w.updateArcLengths()})),i.useImperativeHandle(j,(()=>P.current),[]),i.useLayoutEffect((()=>{x.current=o.misc.repeat(x.current,1)}),[m]);let E=0;const[C]=i.useState((()=>new a.Vector3));return n.useFrame(((e,t)=>{if(E=O.offset,o.easing.damp(x,"current",void 0!==m?m:O.current,g,t,b,void 0,d),O.offset=o.misc.repeat(x.current,1),w.getCurveLengths().length>0){w.getPointAt(O.offset,O.point),w.getTangentAt(O.offset,O.tangent).normalize(),w.getPointAt(o.misc.repeat(x.current-(E-O.offset),1),O.next);const e=(null==r?void 0:r.current)instanceof a.Object3D?r.current:y;e.position.copy(O.point),l&&o.easing.dampLookAt(e,(e=>(null==e?void 0:e.current)instanceof a.Object3D)(l)?l.current.getWorldPosition(C):l,v,t,b,void 0,d)}})),i.createElement("group",s.default({ref:P},h),i.createElement(f.Provider,{value:O},e,u&&i.createElement(p,null)))}));exports.MotionPathControls=m,exports.useMotion=l;
@@ -0,0 +1,15 @@
1
+ import * as THREE from 'three';
2
+ import * as React from 'react';
3
+ type MotionState = {
4
+ current: number;
5
+ path: THREE.CurvePath<THREE.Vector3>;
6
+ focus: React.MutableRefObject<THREE.Object3D<THREE.Event>> | [x: number, y: number, z: number] | undefined;
7
+ object: React.MutableRefObject<THREE.Object3D<THREE.Event>>;
8
+ offset: number;
9
+ point: THREE.Vector3;
10
+ tangent: THREE.Vector3;
11
+ next: THREE.Vector3;
12
+ };
13
+ export declare function useMotion(): MotionState;
14
+ export declare const MotionPathControls: React.ForwardRefExoticComponent<React.RefAttributes<THREE.Group>>;
15
+ export {};
@@ -0,0 +1,113 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as THREE from 'three';
3
+ import * as React from 'react';
4
+ import { useThree, useFrame } from '@react-three/fiber';
5
+ import { misc, easing } from 'maath';
6
+
7
+ const isObject3DRef = ref => (ref == null ? void 0 : ref.current) instanceof THREE.Object3D;
8
+ const context = /*#__PURE__*/React.createContext(null);
9
+ function useMotion() {
10
+ return React.useContext(context);
11
+ }
12
+ function Debug({
13
+ points = 50
14
+ }) {
15
+ const {
16
+ path
17
+ } = useMotion();
18
+ const [dots, setDots] = React.useState([]);
19
+ const [material] = React.useState(() => new THREE.MeshBasicMaterial({
20
+ color: 'black'
21
+ }));
22
+ const [geometry] = React.useState(() => new THREE.SphereGeometry(0.025, 16, 16));
23
+ const last = React.useRef([]);
24
+ React.useEffect(() => {
25
+ if (path.curves !== last.current) {
26
+ setDots(path.getPoints(points));
27
+ last.current = path.curves;
28
+ }
29
+ });
30
+ return /*#__PURE__*/React.createElement(React.Fragment, null, dots.map((item, index) => /*#__PURE__*/React.createElement("mesh", {
31
+ key: index,
32
+ material: material,
33
+ geometry: geometry,
34
+ position: [item.x, item.y, item.z]
35
+ })));
36
+ }
37
+ const MotionPathControls = /*#__PURE__*/React.forwardRef(({
38
+ children,
39
+ curves = [],
40
+ object,
41
+ debug = false,
42
+ smooth = false,
43
+ focus,
44
+ offset = undefined,
45
+ eps = 0.00001,
46
+ damping = 0.1,
47
+ focusDamping = 0.1,
48
+ maxSpeed = Infinity,
49
+ ...props
50
+ }, fref) => {
51
+ const {
52
+ camera
53
+ } = useThree();
54
+ const ref = React.useRef();
55
+ const [path] = React.useState(() => new THREE.CurvePath());
56
+ const pos = React.useRef(offset !== null && offset !== void 0 ? offset : 0);
57
+ const state = React.useMemo(() => ({
58
+ focus,
59
+ object: (object == null ? void 0 : object.current) instanceof THREE.Object3D ? object : {
60
+ current: camera
61
+ },
62
+ path,
63
+ current: pos.current,
64
+ offset: pos.current,
65
+ point: new THREE.Vector3(),
66
+ tangent: new THREE.Vector3(),
67
+ next: new THREE.Vector3()
68
+ }), [focus, object]);
69
+ React.useLayoutEffect(() => {
70
+ var _ref$current;
71
+ path.curves = [];
72
+ const _curves = curves.length > 0 ? curves : (_ref$current = ref.current) == null ? void 0 : _ref$current.__r3f.objects;
73
+ for (var i = 0; i < _curves.length; i++) path.add(_curves[i]);
74
+
75
+ //Smoothen curve
76
+ if (smooth) {
77
+ const points = path.getPoints(typeof smooth === 'number' ? smooth : 1);
78
+ const catmull = new THREE.CatmullRomCurve3(points);
79
+ path.curves = [catmull];
80
+ }
81
+ path.updateArcLengths();
82
+ });
83
+ React.useImperativeHandle(fref, () => ref.current, []);
84
+ React.useLayoutEffect(() => {
85
+ // When offset changes, normalise pos to avoid overshoot spinning
86
+ pos.current = misc.repeat(pos.current, 1);
87
+ }, [offset]);
88
+ let last = 0;
89
+ const [vec] = React.useState(() => new THREE.Vector3());
90
+ useFrame((_state, delta) => {
91
+ last = state.offset;
92
+ easing.damp(pos, 'current', offset !== undefined ? offset : state.current, damping, delta, maxSpeed, undefined, eps);
93
+ state.offset = misc.repeat(pos.current, 1);
94
+ if (path.getCurveLengths().length > 0) {
95
+ path.getPointAt(state.offset, state.point);
96
+ path.getTangentAt(state.offset, state.tangent).normalize();
97
+ path.getPointAt(misc.repeat(pos.current - (last - state.offset), 1), state.next);
98
+ const target = (object == null ? void 0 : object.current) instanceof THREE.Object3D ? object.current : camera;
99
+ target.position.copy(state.point);
100
+ //@ts-ignore
101
+ if (focus) {
102
+ easing.dampLookAt(target, isObject3DRef(focus) ? focus.current.getWorldPosition(vec) : focus, focusDamping, delta, maxSpeed, undefined, eps);
103
+ }
104
+ }
105
+ });
106
+ return /*#__PURE__*/React.createElement("group", _extends({
107
+ ref: ref
108
+ }, props), /*#__PURE__*/React.createElement(context.Provider, {
109
+ value: state
110
+ }, children, debug && /*#__PURE__*/React.createElement(Debug, null)));
111
+ });
112
+
113
+ export { MotionPathControls, useMotion };
@@ -2,12 +2,12 @@ import { ReactThreeFiber } from '@react-three/fiber';
2
2
  import type { Camera, Event } from 'three';
3
3
  import { OrbitControls as OrbitControlsImpl } from 'three-stdlib';
4
4
  import { ForwardRefComponent } from '../helpers/ts-utils';
5
- export declare type OrbitControlsChangeEvent = Event & {
5
+ export type OrbitControlsChangeEvent = Event & {
6
6
  target: EventTarget & {
7
7
  object: Camera;
8
8
  };
9
9
  };
10
- export declare type OrbitControlsProps = Omit<ReactThreeFiber.Overwrite<ReactThreeFiber.Object3DNode<OrbitControlsImpl, typeof OrbitControlsImpl>, {
10
+ export type OrbitControlsProps = Omit<ReactThreeFiber.Overwrite<ReactThreeFiber.Object3DNode<OrbitControlsImpl, typeof OrbitControlsImpl>, {
11
11
  camera?: Camera;
12
12
  domElement?: HTMLElement;
13
13
  enableDamping?: boolean;
@@ -33,7 +33,6 @@ const OrbitControls = /*#__PURE__*/React.forwardRef(({
33
33
  if (keyEvents) {
34
34
  controls.connect(keyEvents === true ? explDomElement : keyEvents);
35
35
  }
36
-
37
36
  controls.connect(explDomElement);
38
37
  return () => void controls.dispose();
39
38
  }, [keyEvents, explDomElement, regress, controls, invalidate]);
@@ -43,15 +42,12 @@ const OrbitControls = /*#__PURE__*/React.forwardRef(({
43
42
  if (regress) performance.regress();
44
43
  if (onChange) onChange(e);
45
44
  };
46
-
47
45
  const onStartCb = e => {
48
46
  if (onStart) onStart(e);
49
47
  };
50
-
51
48
  const onEndCb = e => {
52
49
  if (onEnd) onEnd(e);
53
50
  };
54
-
55
51
  controls.addEventListener('change', callback);
56
52
  controls.addEventListener('start', onStartCb);
57
53
  controls.addEventListener('end', onEndCb);
@@ -2,7 +2,7 @@ import * as THREE from 'three';
2
2
  import * as React from 'react';
3
3
  import { OrthographicCamera as OrthographicCameraImpl } from 'three';
4
4
  import { ForwardRefComponent } from '../helpers/ts-utils';
5
- declare type Props = Omit<JSX.IntrinsicElements['orthographicCamera'], 'children'> & {
5
+ type Props = Omit<JSX.IntrinsicElements['orthographicCamera'], 'children'> & {
6
6
  makeDefault?: boolean;
7
7
  manual?: boolean;
8
8
  children?: React.ReactNode | ((texture: THREE.Texture) => React.ReactNode);
@@ -5,7 +5,6 @@ import mergeRefs from 'react-merge-refs';
5
5
  import { useFBO } from './useFBO.js';
6
6
 
7
7
  const isFunction = node => typeof node === 'function';
8
-
9
8
  const OrthographicCamera = /*#__PURE__*/React.forwardRef(({
10
9
  envMap,
11
10
  resolution = 256,
@@ -43,9 +42,9 @@ const OrthographicCamera = /*#__PURE__*/React.forwardRef(({
43
42
  return () => set(() => ({
44
43
  camera: oldCam
45
44
  }));
46
- } // The camera should not be part of the dependency list because this components camera is a stable reference
45
+ }
46
+ // The camera should not be part of the dependency list because this components camera is a stable reference
47
47
  // that must exchange the default, and clean up after itself on unmount.
48
-
49
48
  }, [cameraRef, makeDefault, set]);
50
49
  let count = 0;
51
50
  let oldEnvMap = null;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),n=require("three"),t=require("react"),r=require("./shaderMaterial.cjs.js"),i=require("@react-three/fiber"),o=require("three-stdlib");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(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 s=a(e),l=c(n),u=c(t);const d=r.shaderMaterial({screenspace:!1,color:new l.Color("black"),opacity:1,thickness:.05,size:new l.Vector2},"#include <common>\n #include <morphtarget_pars_vertex>\n #include <skinning_pars_vertex>\n uniform float thickness;\n uniform float screenspace;\n uniform vec2 size;\n void main() {\n #if defined (USE_SKINNING)\n\t #include <beginnormal_vertex>\n #include <morphnormal_vertex>\n #include <skinbase_vertex>\n #include <skinnormal_vertex>\n #include <defaultnormal_vertex>\n #endif\n #include <begin_vertex>\n\t #include <morphtarget_vertex>\n\t #include <skinning_vertex>\n #include <project_vertex>\n vec4 tNormal = vec4(normal, 0.0);\n vec4 tPosition = vec4(transformed, 1.0);\n #ifdef USE_INSTANCING\n tNormal = instanceMatrix * tNormal;\n tPosition = instanceMatrix * tPosition;\n #endif\n if (screenspace == 0.0) {\n vec3 newPosition = tPosition.xyz + tNormal.xyz * thickness;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0); \n } else {\n vec4 clipPosition = projectionMatrix * modelViewMatrix * tPosition;\n vec4 clipNormal = projectionMatrix * modelViewMatrix * tNormal;\n vec2 offset = normalize(clipNormal.xy) * thickness / size * clipPosition.w * 2.0;\n clipPosition.xy += offset;\n gl_Position = clipPosition;\n }\n }",`uniform vec3 color;\n uniform float opacity;\n void main(){\n gl_FragColor = vec4(color, opacity);\n #include <tonemapping_fragment>\n #include <${parseInt(l.REVISION.replace(/\D+/g,""))>=154?"colorspace_fragment":"encodings_fragment"}>\n }`);exports.Outlines=function({color:e="black",opacity:n=1,transparent:t=!1,screenspace:r=!1,toneMapped:a=!0,polygonOffset:c=!1,polygonOffsetFactor:f=0,renderOrder:p=0,thickness:m=.05,angle:g=Math.PI,...v}){var x,y;const _=u.useRef(null),[M]=u.useState((()=>new d({side:l.BackSide}))),{gl:h}=i.useThree(),b=h.getDrawingBufferSize(new l.Vector2);return u.useMemo((()=>i.extend({OutlinesMaterial:d})),[]),u.useLayoutEffect((()=>{const e=_.current,n=e.parent;if(n&&n.geometry){let t;return n.skeleton?(t=new l.SkinnedMesh,t.material=M,t.bind(n.skeleton,n.bindMatrix),e.add(t)):n.isInstancedMesh?(t=new l.InstancedMesh(n.geometry,M,n.count),t.instanceMatrix=n.instanceMatrix,e.add(t)):(t=new l.Mesh,t.material=M,e.add(t)),t.geometry=g?o.toCreasedNormals(n.geometry,g):n.geometry,()=>{g&&t.geometry.dispose(),e.remove(t)}}}),[g,null==(x=_.current)||null==(y=x.parent)?void 0:y.geometry]),u.useLayoutEffect((()=>{const o=_.current.children[0];o&&(o.renderOrder=p,i.applyProps(o.material,{transparent:t,thickness:m,color:e,opacity:n,size:b,screenspace:r,toneMapped:a,polygonOffset:c,polygonOffsetFactor:f}))}),[g,t,m,e,n,r,a,c,f,b,p]),u.createElement("group",s.default({ref:_},v))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),n=require("three"),t=require("react"),r=require("./shaderMaterial.cjs.js"),i=require("@react-three/fiber"),o=require("three-stdlib");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(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 s=a(e),l=c(n),u=c(t);const d=r.shaderMaterial({screenspace:!1,color:new l.Color("black"),opacity:1,thickness:.05,size:new l.Vector2},"#include <common>\n #include <morphtarget_pars_vertex>\n #include <skinning_pars_vertex>\n uniform float thickness;\n uniform float screenspace;\n uniform vec2 size;\n void main() {\n #if defined (USE_SKINNING)\n\t #include <beginnormal_vertex>\n #include <morphnormal_vertex>\n #include <skinbase_vertex>\n #include <skinnormal_vertex>\n #include <defaultnormal_vertex>\n #endif\n #include <begin_vertex>\n\t #include <morphtarget_vertex>\n\t #include <skinning_vertex>\n #include <project_vertex>\n vec4 tNormal = vec4(normal, 0.0);\n vec4 tPosition = vec4(transformed, 1.0);\n #ifdef USE_INSTANCING\n tNormal = instanceMatrix * tNormal;\n tPosition = instanceMatrix * tPosition;\n #endif\n if (screenspace == 0.0) {\n vec3 newPosition = tPosition.xyz + tNormal.xyz * thickness;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0); \n } else {\n vec4 clipPosition = projectionMatrix * modelViewMatrix * tPosition;\n vec4 clipNormal = projectionMatrix * modelViewMatrix * tNormal;\n vec2 offset = normalize(clipNormal.xy) * thickness / size * clipPosition.w * 2.0;\n clipPosition.xy += offset;\n gl_Position = clipPosition;\n }\n }",`uniform vec3 color;\n uniform float opacity;\n void main(){\n gl_FragColor = vec4(color, opacity);\n #include <tonemapping_fragment>\n #include <${parseInt(l.REVISION.replace(/\D+/g,""))>=154?"colorspace_fragment":"encodings_fragment"}>\n }`);exports.Outlines=function({color:e="black",opacity:n=1,transparent:t=!1,screenspace:r=!1,toneMapped:a=!0,polygonOffset:c=!1,polygonOffsetFactor:f=0,renderOrder:p=0,thickness:m=.05,angle:g=Math.PI,...v}){var x;const y=u.useRef(null),[_]=u.useState((()=>new d({side:l.BackSide}))),{gl:M}=i.useThree(),h=M.getDrawingBufferSize(new l.Vector2);return u.useMemo((()=>i.extend({OutlinesMaterial:d})),[]),u.useLayoutEffect((()=>{const e=y.current,n=e.parent;if(n&&n.geometry){let t;return n.skeleton?(t=new l.SkinnedMesh,t.material=_,t.bind(n.skeleton,n.bindMatrix),e.add(t)):n.isInstancedMesh?(t=new l.InstancedMesh(n.geometry,_,n.count),t.instanceMatrix=n.instanceMatrix,e.add(t)):(t=new l.Mesh,t.material=_,e.add(t)),t.geometry=g?o.toCreasedNormals(n.geometry,g):n.geometry,()=>{g&&t.geometry.dispose(),e.remove(t)}}}),[g,null==(x=y.current)||null==(x=x.parent)?void 0:x.geometry]),u.useLayoutEffect((()=>{const o=y.current.children[0];o&&(o.renderOrder=p,i.applyProps(o.material,{transparent:t,thickness:m,color:e,opacity:n,size:h,screenspace:r,toneMapped:a,polygonOffset:c,polygonOffsetFactor:f}))}),[g,t,m,e,n,r,a,c,f,h,p]),u.createElement("group",s.default({ref:y},v))};
@@ -1,6 +1,6 @@
1
- /// <reference types="react" />
1
+ import * as React from 'react';
2
2
  import { ReactThreeFiber } from '@react-three/fiber';
3
- declare type OutlinesProps = JSX.IntrinsicElements['group'] & {
3
+ type OutlinesProps = JSX.IntrinsicElements['group'] & {
4
4
  color: ReactThreeFiber.Color;
5
5
  screenspace: boolean;
6
6
  opacity: number;
@@ -12,5 +12,5 @@ declare type OutlinesProps = JSX.IntrinsicElements['group'] & {
12
12
  polygonOffsetFactor?: number;
13
13
  renderOrder?: number;
14
14
  };
15
- export declare function Outlines({ color, opacity, transparent, screenspace, toneMapped, polygonOffset, polygonOffsetFactor, renderOrder, thickness, angle, ...props }: OutlinesProps): JSX.Element;
15
+ export declare function Outlines({ color, opacity, transparent, screenspace, toneMapped, polygonOffset, polygonOffsetFactor, renderOrder, thickness, angle, ...props }: OutlinesProps): React.JSX.Element;
16
16
  export {};
package/core/Outlines.js CHANGED
@@ -65,8 +65,7 @@ function Outlines({
65
65
  angle = Math.PI,
66
66
  ...props
67
67
  }) {
68
- var _ref$current, _ref$current$parent;
69
-
68
+ var _ref$current;
70
69
  const ref = React.useRef(null);
71
70
  const [material] = React.useState(() => new OutlinesMaterial({
72
71
  side: THREE.BackSide
@@ -81,10 +80,8 @@ function Outlines({
81
80
  React.useLayoutEffect(() => {
82
81
  const group = ref.current;
83
82
  const parent = group.parent;
84
-
85
83
  if (parent && parent.geometry) {
86
84
  let mesh;
87
-
88
85
  if (parent.skeleton) {
89
86
  mesh = new THREE.SkinnedMesh();
90
87
  mesh.material = material;
@@ -99,18 +96,16 @@ function Outlines({
99
96
  mesh.material = material;
100
97
  group.add(mesh);
101
98
  }
102
-
103
99
  mesh.geometry = angle ? toCreasedNormals(parent.geometry, angle) : parent.geometry;
104
100
  return () => {
105
101
  if (angle) mesh.geometry.dispose();
106
102
  group.remove(mesh);
107
103
  };
108
104
  }
109
- }, [angle, (_ref$current = ref.current) == null ? void 0 : (_ref$current$parent = _ref$current.parent) == null ? void 0 : _ref$current$parent.geometry]);
105
+ }, [angle, (_ref$current = ref.current) == null || (_ref$current = _ref$current.parent) == null ? void 0 : _ref$current.geometry]);
110
106
  React.useLayoutEffect(() => {
111
107
  const group = ref.current;
112
108
  const mesh = group.children[0];
113
-
114
109
  if (mesh) {
115
110
  mesh.renderOrder = renderOrder;
116
111
  applyProps(mesh.material, {
@@ -1,11 +1,11 @@
1
1
  import * as React from 'react';
2
- declare type PerformanceMonitorHookApi = {
2
+ type PerformanceMonitorHookApi = {
3
3
  onIncline: (api: PerformanceMonitorApi) => void;
4
4
  onDecline: (api: PerformanceMonitorApi) => void;
5
5
  onChange: (api: PerformanceMonitorApi) => void;
6
6
  onFallback: (api: PerformanceMonitorApi) => void;
7
7
  };
8
- export declare type PerformanceMonitorApi = {
8
+ export type PerformanceMonitorApi = {
9
9
  fps: number;
10
10
  factor: number;
11
11
  refreshrate: number;
@@ -17,7 +17,7 @@ export declare type PerformanceMonitorApi = {
17
17
  subscriptions: Map<Symbol, Partial<PerformanceMonitorHookApi>>;
18
18
  subscribe: (ref: React.MutableRefObject<Partial<PerformanceMonitorHookApi>>) => () => void;
19
19
  };
20
- declare type PerformanceMonitorProps = {
20
+ type PerformanceMonitorProps = {
21
21
  ms?: number;
22
22
  iterations?: number;
23
23
  threshold?: number;
@@ -31,6 +31,6 @@ declare type PerformanceMonitorProps = {
31
31
  onFallback?: (api: PerformanceMonitorApi) => void;
32
32
  children?: React.ReactNode;
33
33
  };
34
- export declare function PerformanceMonitor({ iterations, ms, threshold, step, factor: _factor, flipflops, bounds, onIncline, onDecline, onChange, onFallback, children, }: PerformanceMonitorProps): JSX.Element;
34
+ export declare function PerformanceMonitor({ iterations, ms, threshold, step, factor: _factor, flipflops, bounds, onIncline, onDecline, onChange, onFallback, children, }: PerformanceMonitorProps): React.JSX.Element;
35
35
  export declare function usePerformanceMonitor({ onIncline, onDecline, onChange, onFallback, }: Partial<PerformanceMonitorHookApi>): void;
36
36
  export {};
@@ -39,52 +39,48 @@ function PerformanceMonitor({
39
39
  const {
40
40
  frames,
41
41
  averages
42
- } = api; // If the fallback has been reached do not continue running samples
42
+ } = api;
43
43
 
44
+ // If the fallback has been reached do not continue running samples
44
45
  if (api.fallback) return;
45
-
46
46
  if (averages.length < iterations) {
47
47
  frames.push(performance.now());
48
48
  const msPassed = frames[frames.length - 1] - frames[0];
49
-
50
49
  if (msPassed >= ms) {
51
50
  api.fps = Math.round(frames.length / msPassed * 1000 * decimalPlacesRatio) / decimalPlacesRatio;
52
51
  api.refreshrate = Math.max(api.refreshrate, api.fps);
53
52
  averages[api.index++ % iterations] = api.fps;
54
-
55
53
  if (averages.length === iterations) {
56
54
  const [lower, upper] = bounds(api.refreshrate);
57
55
  const upperBounds = averages.filter(value => value >= upper);
58
- const lowerBounds = averages.filter(value => value < lower); // Trigger incline when more than -threshold- avgs exceed the upper bound
59
-
56
+ const lowerBounds = averages.filter(value => value < lower);
57
+ // Trigger incline when more than -threshold- avgs exceed the upper bound
60
58
  if (upperBounds.length > iterations * threshold) {
61
59
  api.factor = Math.min(1, api.factor + step);
62
60
  api.flipped++;
63
61
  if (onIncline) onIncline(api);
64
62
  api.subscriptions.forEach(value => value.onIncline && value.onIncline(api));
65
- } // Trigger decline when more than -threshold- avgs are below the lower bound
66
-
67
-
63
+ }
64
+ // Trigger decline when more than -threshold- avgs are below the lower bound
68
65
  if (lowerBounds.length > iterations * threshold) {
69
66
  api.factor = Math.max(0, api.factor - step);
70
67
  api.flipped++;
71
68
  if (onDecline) onDecline(api);
72
69
  api.subscriptions.forEach(value => value.onDecline && value.onDecline(api));
73
70
  }
74
-
75
71
  if (lastFactor !== api.factor) {
76
72
  lastFactor = api.factor;
77
73
  if (onChange) onChange(api);
78
74
  api.subscriptions.forEach(value => value.onChange && value.onChange(api));
79
75
  }
80
-
81
76
  if (api.flipped > flipflops && !api.fallback) {
82
77
  api.fallback = true;
83
78
  if (onFallback) onFallback(api);
84
79
  api.subscriptions.forEach(value => value.onFallback && value.onFallback(api));
85
80
  }
81
+ api.averages = [];
86
82
 
87
- api.averages = []; // Resetting the refreshrate creates more problems than it solves atm
83
+ // Resetting the refreshrate creates more problems than it solves atm
88
84
  // api.refreshrate = 0
89
85
  }
90
86
 
@@ -2,7 +2,7 @@ import * as THREE from 'three';
2
2
  import * as React from 'react';
3
3
  import { PerspectiveCamera as PerspectiveCameraImpl } from 'three';
4
4
  import { ForwardRefComponent } from '../helpers/ts-utils';
5
- declare type Props = Omit<JSX.IntrinsicElements['perspectiveCamera'], 'children'> & {
5
+ type Props = Omit<JSX.IntrinsicElements['perspectiveCamera'], 'children'> & {
6
6
  makeDefault?: boolean;
7
7
  manual?: boolean;
8
8
  children?: React.ReactNode | ((texture: THREE.Texture) => React.ReactNode);
@@ -5,7 +5,6 @@ import mergeRefs from 'react-merge-refs';
5
5
  import { useFBO } from './useFBO.js';
6
6
 
7
7
  const isFunction = node => typeof node === 'function';
8
-
9
8
  const PerspectiveCamera = /*#__PURE__*/React.forwardRef(({
10
9
  envMap,
11
10
  resolution = 256,
@@ -59,9 +58,9 @@ const PerspectiveCamera = /*#__PURE__*/React.forwardRef(({
59
58
  return () => set(() => ({
60
59
  camera: oldCam
61
60
  }));
62
- } // The camera should not be part of the dependency list because this components camera is a stable reference
61
+ }
62
+ // The camera should not be part of the dependency list because this components camera is a stable reference
63
63
  // that must exchange the default, and clean up after itself on unmount.
64
-
65
64
  }, [cameraRef, makeDefault, set]);
66
65
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("perspectiveCamera", _extends({
67
66
  ref: mergeRefs([cameraRef, ref])
@@ -1,7 +1,7 @@
1
1
  import * as THREE from 'three';
2
2
  import { PrimitiveProps } from '@react-three/fiber';
3
3
  import { ForwardRefComponent } from '../helpers/ts-utils';
4
- declare type PointMaterialType = JSX.IntrinsicElements['pointsMaterial'];
4
+ type PointMaterialType = JSX.IntrinsicElements['pointsMaterial'];
5
5
  declare global {
6
6
  namespace JSX {
7
7
  interface IntrinsicElements {
@@ -6,7 +6,6 @@ const opaque_fragment = parseInt(THREE.REVISION.replace(/\D+/g, '')) >= 154 ? 'o
6
6
  class PointMaterialImpl extends THREE.PointsMaterial {
7
7
  constructor(props) {
8
8
  super(props);
9
-
10
9
  this.onBeforeCompile = (shader, renderer) => {
11
10
  const {
12
11
  isWebGL2
@@ -23,7 +22,6 @@ class PointMaterialImpl extends THREE.PointsMaterial {
23
22
  `);
24
23
  };
25
24
  }
26
-
27
25
  }
28
26
  const PointMaterial = /*#__PURE__*/React.forwardRef((props, ref) => {
29
27
  const [material] = React.useState(() => new PointMaterialImpl(null));
@@ -2,7 +2,7 @@ import { ReactThreeFiber } from '@react-three/fiber';
2
2
  import * as THREE from 'three';
3
3
  import { PointerLockControls as PointerLockControlsImpl } from 'three-stdlib';
4
4
  import { ForwardRefComponent } from '../helpers/ts-utils';
5
- export declare type PointerLockControlsProps = ReactThreeFiber.Object3DNode<PointerLockControlsImpl, typeof PointerLockControlsImpl> & {
5
+ export type PointerLockControlsProps = ReactThreeFiber.Object3DNode<PointerLockControlsImpl, typeof PointerLockControlsImpl> & {
6
6
  domElement?: HTMLElement;
7
7
  selector?: string;
8
8
  enabled?: boolean;