@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.
- package/README.md +116 -5
- package/core/AccumulativeShadows.d.ts +3 -3
- package/core/AccumulativeShadows.js +30 -36
- package/core/AdaptiveDpr.js +4 -4
- package/core/ArcballControls.d.ts +1 -1
- package/core/ArcballControls.js +0 -1
- package/core/AsciiRenderer.d.ts +3 -3
- package/core/AsciiRenderer.js +12 -6
- package/core/BBAnchor.cjs.js +1 -1
- package/core/BBAnchor.d.ts +2 -2
- package/core/BBAnchor.js +5 -5
- package/core/Backdrop.d.ts +2 -2
- package/core/Backdrop.js +0 -3
- package/core/Billboard.d.ts +1 -1
- package/core/Billboard.js +6 -3
- package/core/Bounds.d.ts +5 -5
- package/core/Bounds.js +5 -32
- package/core/CameraControls.d.ts +2 -2
- package/core/CameraControls.js +0 -3
- package/core/CameraShake.js +0 -4
- package/core/CatmullRomLine.d.ts +1 -1
- package/core/CatmullRomLine.js +0 -2
- package/core/Caustics.d.ts +1 -1
- package/core/Caustics.js +31 -32
- package/core/Center.d.ts +2 -2
- package/core/Center.js +2 -1
- package/core/Clone.d.ts +1 -1
- package/core/Clone.js +10 -13
- package/core/Cloud.cjs.js +1 -1
- package/core/Cloud.d.ts +2 -2
- package/core/Cloud.js +1 -2
- package/core/ComputedAttribute.d.ts +2 -2
- package/core/ComputedAttribute.js +0 -1
- package/core/ContactShadows.d.ts +1 -1
- package/core/ContactShadows.js +6 -7
- package/core/CubeCamera.cjs.js +1 -1
- package/core/CubeCamera.d.ts +2 -2
- package/core/CubeCamera.js +1 -1
- package/core/CubicBezierLine.d.ts +1 -1
- package/core/CurveModifier.d.ts +1 -1
- package/core/CurveModifier.js +2 -4
- package/core/Decal.d.ts +1 -1
- package/core/Decal.js +8 -15
- package/core/Detailed.d.ts +1 -1
- package/core/Detailed.js +0 -1
- package/core/DeviceOrientationControls.d.ts +1 -1
- package/core/DeviceOrientationControls.js +3 -4
- package/core/Edges.d.ts +1 -1
- package/core/Edges.js +0 -2
- package/core/Effects.d.ts +1 -1
- package/core/Effects.js +5 -7
- package/core/Environment.d.ts +3 -3
- package/core/Environment.js +6 -12
- package/core/Example.d.ts +3 -3
- package/core/Example.js +2 -1
- package/core/FaceControls.cjs.js +1 -1
- package/core/FaceControls.d.ts +5 -5
- package/core/FaceControls.js +42 -39
- package/core/FaceLandmarker.d.ts +3 -2
- package/core/FaceLandmarker.js +1 -1
- package/core/Facemesh.d.ts +6 -6
- package/core/Facemesh.js +47 -53
- package/core/FirstPersonControls.d.ts +1 -1
- package/core/Float.d.ts +1 -1
- package/core/Float.js +0 -1
- package/core/FlyControls.d.ts +1 -1
- package/core/FlyControls.js +1 -2
- package/core/GizmoHelper.cjs.js +1 -1
- package/core/GizmoHelper.d.ts +2 -2
- package/core/GizmoHelper.js +18 -19
- package/core/GizmoViewcube.d.ts +3 -3
- package/core/GizmoViewcube.js +0 -14
- package/core/GizmoViewport.d.ts +3 -3
- package/core/GizmoViewport.js +0 -7
- package/core/Gltf.d.ts +1 -1
- package/core/GradientTexture.d.ts +3 -3
- package/core/GradientTexture.js +2 -5
- package/core/Grid.d.ts +2 -2
- package/core/Grid.js +2 -6
- package/core/Hud.d.ts +2 -2
- package/core/Hud.js +6 -9
- package/core/Image.d.ts +2 -2
- package/core/Image.js +4 -6
- package/core/Instances.d.ts +6 -6
- package/core/Instances.js +20 -35
- package/core/Lightformer.d.ts +1 -1
- package/core/Lightformer.js +4 -2
- package/core/Line.d.ts +1 -1
- package/core/Line.js +0 -3
- package/core/MapControls.d.ts +1 -1
- package/core/MapControls.js +0 -2
- package/core/MarchingCubes.d.ts +3 -3
- package/core/Mask.d.ts +1 -1
- package/core/MeshDistortMaterial.d.ts +2 -2
- package/core/MeshDistortMaterial.js +0 -9
- package/core/MeshPortalMaterial.d.ts +4 -4
- package/core/MeshPortalMaterial.js +22 -61
- package/core/MeshReflectorMaterial.d.ts +1 -1
- package/core/MeshReflectorMaterial.js +12 -14
- package/core/MeshRefractionMaterial.cjs.js +1 -1
- package/core/MeshRefractionMaterial.d.ts +3 -3
- package/core/MeshRefractionMaterial.js +9 -14
- package/core/MeshTransmissionMaterial.d.ts +2 -2
- package/core/MeshTransmissionMaterial.js +32 -33
- package/core/MeshWobbleMaterial.d.ts +2 -2
- package/core/MeshWobbleMaterial.js +0 -7
- package/core/MotionPathControls.cjs.js +1 -0
- package/core/MotionPathControls.d.ts +15 -0
- package/core/MotionPathControls.js +113 -0
- package/core/OrbitControls.d.ts +2 -2
- package/core/OrbitControls.js +0 -4
- package/core/OrthographicCamera.d.ts +1 -1
- package/core/OrthographicCamera.js +2 -3
- package/core/Outlines.cjs.js +1 -1
- package/core/Outlines.d.ts +3 -3
- package/core/Outlines.js +2 -7
- package/core/PerformanceMonitor.d.ts +4 -4
- package/core/PerformanceMonitor.js +8 -12
- package/core/PerspectiveCamera.d.ts +1 -1
- package/core/PerspectiveCamera.js +2 -3
- package/core/PointMaterial.d.ts +1 -1
- package/core/PointMaterial.js +0 -2
- package/core/PointerLockControls.d.ts +1 -1
- package/core/PointerLockControls.js +4 -6
- package/core/Points.d.ts +2 -2
- package/core/Points.js +6 -23
- package/core/PositionalAudio.d.ts +1 -1
- package/core/PositionalAudio.js +0 -5
- package/core/Preload.d.ts +1 -1
- package/core/Preload.js +8 -9
- package/core/QuadraticBezierLine.d.ts +2 -2
- package/core/QuadraticBezierLine.js +0 -2
- package/core/Reflector.d.ts +1 -1
- package/core/Reflector.js +11 -12
- package/core/RenderTexture.d.ts +1 -1
- package/core/RenderTexture.js +9 -11
- package/core/Resize.d.ts +2 -2
- package/core/RoundedBox.cjs.js +1 -1
- package/core/RoundedBox.d.ts +1 -1
- package/core/RoundedBox.js +1 -3
- package/core/Sampler.d.ts +5 -5
- package/core/Sampler.js +0 -10
- package/core/ScreenQuad.d.ts +1 -1
- package/core/ScreenQuad.js +0 -1
- package/core/ScreenSpace.d.ts +1 -1
- package/core/Segments.d.ts +2 -2
- package/core/Segments.js +0 -6
- package/core/Shadow.d.ts +1 -1
- package/core/Sky.d.ts +1 -1
- package/core/Sparkles.js +0 -10
- package/core/SpotLight.d.ts +2 -2
- package/core/SpotLight.js +3 -10
- package/core/SpriteAnimator.d.ts +1 -1
- package/core/SpriteAnimator.js +16 -34
- package/core/Stage.d.ts +4 -4
- package/core/Stage.js +2 -4
- package/core/Stars.d.ts +1 -1
- package/core/Stars.js +2 -11
- package/core/Stats.d.ts +1 -1
- package/core/Stats.js +2 -2
- package/core/StatsGl.d.ts +1 -1
- package/core/StatsGl.js +4 -3
- package/core/Svg.js +0 -2
- package/core/Text.d.ts +1 -1
- package/core/Text3D.d.ts +1 -1
- package/core/Text3D.js +1 -3
- package/core/TrackballControls.d.ts +1 -1
- package/core/TrackballControls.js +0 -1
- package/core/Trail.d.ts +3 -3
- package/core/Trail.js +6 -17
- package/core/TransformControls.d.ts +1 -1
- package/core/TransformControls.js +3 -9
- package/core/Wireframe.d.ts +1 -1
- package/core/Wireframe.js +0 -28
- package/core/index.cjs.js +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.js +1 -0
- package/core/meshBounds.js +4 -14
- package/core/shaderMaterial.js +10 -9
- package/core/shapes.d.ts +2 -2
- package/core/shapes.js +3 -6
- package/core/softShadows.d.ts +1 -1
- package/core/softShadows.js +1 -4
- package/core/useAnimations.d.ts +1 -1
- package/core/useAnimations.js +2 -4
- package/core/useBVH.d.ts +1 -1
- package/core/useBVH.js +3 -4
- package/core/useBoxProjectedEnv.js +15 -22
- package/core/useCamera.js +0 -1
- package/core/useContextBridge.js +1 -2
- package/core/useCubeCamera.d.ts +1 -1
- package/core/useCubeTexture.d.ts +1 -1
- package/core/useCubeTexture.js +4 -3
- package/core/useEnvironment.cjs.js +1 -1
- package/core/useEnvironment.d.ts +2 -2
- package/core/useEnvironment.js +9 -11
- package/core/useFBO.d.ts +1 -1
- package/core/useFBO.js +3 -12
- package/core/useFBX.js +0 -2
- package/core/useFont.d.ts +2 -2
- package/core/useFont.js +0 -4
- package/core/useGLTF.d.ts +2 -2
- package/core/useGLTF.js +0 -8
- package/core/useHelper.d.ts +3 -3
- package/core/useHelper.js +2 -5
- package/core/useIntersect.js +5 -8
- package/core/useKTX2.js +3 -5
- package/core/useMatcapTexture.js +0 -6
- package/core/useNormalTexture.d.ts +1 -1
- package/core/useProgress.d.ts +1 -1
- package/core/useProgress.js +0 -5
- package/core/useTexture.js +4 -6
- package/core/useTrailTexture.d.ts +1 -1
- package/core/useTrailTexture.js +10 -21
- package/helpers/environment-assets.d.ts +1 -1
- package/helpers/ts-utils.d.ts +2 -2
- package/helpers/useEffectfulState.d.ts +1 -1
- package/helpers/useEffectfulState.js +0 -1
- package/index.cjs.js +1 -1
- package/index.js +1 -0
- package/materials/BlurPass.js +2 -5
- package/materials/ConvolutionMaterial.js +0 -3
- package/materials/MeshReflectorMaterial.d.ts +1 -1
- package/materials/MeshReflectorMaterial.js +0 -34
- package/materials/MeshRefractionMaterial.js +2 -6
- package/materials/SpotLightMaterial.js +2 -7
- package/materials/WireframeMaterial.js +7 -25
- package/native/index.cjs.js +1 -1
- package/native/index.js +1 -0
- package/package.json +2 -2
- package/react-three-drei-0.0.0-semantic-release.tgz +0 -0
- package/web/CycleRaycast.d.ts +1 -1
- package/web/CycleRaycast.js +20 -24
- package/web/Html.d.ts +2 -2
- package/web/Html.js +6 -50
- package/web/KeyboardControls.d.ts +10 -10
- package/web/KeyboardControls.js +9 -6
- package/web/Loader.d.ts +2 -2
- package/web/Loader.js +8 -5
- package/web/PresentationControls.d.ts +2 -2
- package/web/PresentationControls.js +2 -1
- package/web/ScrollControls.d.ts +4 -4
- package/web/ScrollControls.js +5 -16
- package/web/Select.d.ts +3 -3
- package/web/Select.js +6 -17
- package/web/View.d.ts +5 -5
- package/web/View.js +7 -20
- package/web/index.cjs.js +1 -1
- package/web/index.js +1 -0
- package/web/pivotControls/AxisArrow.js +6 -15
- package/web/pivotControls/AxisRotator.js +8 -23
- package/web/pivotControls/PlaneSlider.js +6 -16
- package/web/pivotControls/context.d.ts +2 -2
- package/web/pivotControls/index.d.ts +1 -1
- 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 = {
|
|
62
|
+
shader.uniforms = {
|
|
63
|
+
...shader.uniforms,
|
|
64
64
|
...this.uniforms
|
|
65
|
-
};
|
|
65
|
+
};
|
|
66
66
|
|
|
67
|
-
|
|
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 = '';
|
|
71
|
+
else shader.defines.USE_TRANSMISSION = '';
|
|
70
72
|
|
|
71
|
-
|
|
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;
|
|
165
|
+
}\n` + shader.fragmentShader;
|
|
165
166
|
|
|
166
|
-
|
|
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`);
|
|
244
|
+
#endif\n`);
|
|
245
245
|
|
|
246
|
-
|
|
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();
|
|
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;
|
|
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);
|
|
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
|
-
}
|
|
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;
|
|
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
|
-
});
|
|
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
|
|
379
|
+
buffer: buffer || fboMain.texture
|
|
380
|
+
// @ts-ignore
|
|
383
381
|
,
|
|
384
|
-
_transmission: transmission
|
|
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
|
-
|
|
3
|
+
type WobbleMaterialType = JSX.IntrinsicElements['meshStandardMaterial'] & {
|
|
4
4
|
time?: number;
|
|
5
5
|
factor?: number;
|
|
6
6
|
speed?: number;
|
|
7
7
|
};
|
|
8
|
-
|
|
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 };
|
package/core/OrbitControls.d.ts
CHANGED
|
@@ -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
|
|
5
|
+
export type OrbitControlsChangeEvent = Event & {
|
|
6
6
|
target: EventTarget & {
|
|
7
7
|
object: Camera;
|
|
8
8
|
};
|
|
9
9
|
};
|
|
10
|
-
export
|
|
10
|
+
export type OrbitControlsProps = Omit<ReactThreeFiber.Overwrite<ReactThreeFiber.Object3DNode<OrbitControlsImpl, typeof OrbitControlsImpl>, {
|
|
11
11
|
camera?: Camera;
|
|
12
12
|
domElement?: HTMLElement;
|
|
13
13
|
enableDamping?: boolean;
|
package/core/OrbitControls.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
}
|
|
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;
|
package/core/Outlines.cjs.js
CHANGED
|
@@ -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
|
|
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))};
|
package/core/Outlines.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
import { ReactThreeFiber } from '@react-three/fiber';
|
|
3
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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;
|
|
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);
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
}
|
|
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])
|
package/core/PointMaterial.d.ts
CHANGED
|
@@ -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
|
-
|
|
4
|
+
type PointMaterialType = JSX.IntrinsicElements['pointsMaterial'];
|
|
5
5
|
declare global {
|
|
6
6
|
namespace JSX {
|
|
7
7
|
interface IntrinsicElements {
|
package/core/PointMaterial.js
CHANGED
|
@@ -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
|
|
5
|
+
export type PointerLockControlsProps = ReactThreeFiber.Object3DNode<PointerLockControlsImpl, typeof PointerLockControlsImpl> & {
|
|
6
6
|
domElement?: HTMLElement;
|
|
7
7
|
selector?: string;
|
|
8
8
|
enabled?: boolean;
|