@react-three/drei 9.74.11 → 9.74.13

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 (189) hide show
  1. package/core/CatmullRomLine.js +2 -0
  2. package/core/Cloud.js +3 -0
  3. package/core/CubeCamera.js +1 -0
  4. package/core/CubicBezierLine.js +2 -0
  5. package/core/Environment.js +1 -0
  6. package/core/Example.js +6 -0
  7. package/core/FaceControls.cjs.js +1 -1
  8. package/core/FaceControls.js +2 -0
  9. package/core/FaceLandmarker.cjs.js +1 -1
  10. package/core/FaceLandmarker.js +3 -2
  11. package/core/Facemesh.js +2 -0
  12. package/core/GizmoHelper.js +3 -0
  13. package/core/GizmoViewcube.js +4 -0
  14. package/core/GizmoViewport.js +4 -0
  15. package/core/Gltf.js +4 -0
  16. package/core/MeshDiscardMaterial.js +2 -0
  17. package/core/MeshDistortMaterial.js +2 -1
  18. package/core/MeshReflectorMaterial.js +1 -0
  19. package/core/MeshRefractionMaterial.js +2 -0
  20. package/core/MeshTransmissionMaterial.js +1 -0
  21. package/core/OrthographicCamera.js +1 -0
  22. package/core/PerspectiveCamera.js +1 -0
  23. package/core/QuadraticBezierLine.js +2 -0
  24. package/core/Reflector.js +1 -0
  25. package/core/SpotLight.js +2 -1
  26. package/core/Stage.js +7 -0
  27. package/core/Text3D.js +1 -0
  28. package/core/Wireframe.js +1 -0
  29. package/core/index.cjs.js +1 -1
  30. package/core/index.js +0 -1
  31. package/core/useKTX2.js +1 -0
  32. package/core/useMatcapTexture.js +2 -0
  33. package/core/useNormalTexture.js +1 -0
  34. package/index.cjs.js +1 -1
  35. package/materials/DiscardMaterial.js +1 -0
  36. package/materials/MeshRefractionMaterial.js +1 -1
  37. package/native/index.cjs.js +1 -1
  38. package/native/index.js +0 -1
  39. package/package.json +9 -9
  40. package/src/core/AccumulativeShadows.js +311 -0
  41. package/src/core/AdaptiveDpr.js +28 -0
  42. package/src/core/AdaptiveEvents.js +20 -0
  43. package/src/core/ArcballControls.js +67 -0
  44. package/src/core/AsciiRenderer.js +60 -0
  45. package/src/core/BBAnchor.js +37 -0
  46. package/src/core/Backdrop.js +36 -0
  47. package/src/core/BakeShadows.js +16 -0
  48. package/src/core/Billboard.js +41 -0
  49. package/src/core/Bounds.js +245 -0
  50. package/src/core/CameraControls.js +92 -0
  51. package/src/core/CameraShake.js +61 -0
  52. package/src/core/CatmullRomLine.js +44 -0
  53. package/src/core/Caustics.js +375 -0
  54. package/src/core/Center.js +66 -0
  55. package/src/core/Clone.js +102 -0
  56. package/src/core/Cloud.js +59 -0
  57. package/src/core/ComputedAttribute.js +34 -0
  58. package/src/core/ContactShadows.js +114 -0
  59. package/src/core/CubeCamera.js +43 -0
  60. package/src/core/CubicBezierLine.js +28 -0
  61. package/src/core/CurveModifier.js +34 -0
  62. package/src/core/Decal.js +92 -0
  63. package/src/core/Detailed.js +34 -0
  64. package/src/core/DeviceOrientationControls.js +51 -0
  65. package/src/core/Edges.js +36 -0
  66. package/src/core/Effects.js +93 -0
  67. package/src/core/Environment.js +132 -0
  68. package/src/core/Example.js +42 -0
  69. package/src/core/FaceControls.js +315 -0
  70. package/src/core/FaceLandmarker.js +43 -0
  71. package/src/core/Facemesh.js +4545 -0
  72. package/src/core/FirstPersonControls.js +38 -0
  73. package/src/core/Float.js +36 -0
  74. package/src/core/FlyControls.js +55 -0
  75. package/src/core/GizmoHelper.js +111 -0
  76. package/src/core/GizmoViewcube.js +152 -0
  77. package/src/core/GizmoViewport.js +152 -0
  78. package/src/core/Gltf.js +20 -0
  79. package/src/core/GradientTexture.js +33 -0
  80. package/src/core/Grid.js +112 -0
  81. package/src/core/Hud.js +58 -0
  82. package/src/core/Image.js +119 -0
  83. package/src/core/Instances.js +215 -0
  84. package/src/core/Lightformer.js +51 -0
  85. package/src/core/Line.js +68 -0
  86. package/src/core/MapControls.js +64 -0
  87. package/src/core/MarchingCubes.js +76 -0
  88. package/src/core/Mask.js +42 -0
  89. package/src/core/MeshDiscardMaterial.js +15 -0
  90. package/src/core/MeshDistortMaterial.js +79 -0
  91. package/src/core/MeshPortalMaterial.js +381 -0
  92. package/src/core/MeshReflectorMaterial.js +182 -0
  93. package/src/core/MeshRefractionMaterial.js +79 -0
  94. package/src/core/MeshTransmissionMaterial.js +395 -0
  95. package/src/core/MeshWobbleMaterial.js +65 -0
  96. package/src/core/OrbitControls.js +82 -0
  97. package/src/core/OrthographicCamera.js +77 -0
  98. package/src/core/PerformanceMonitor.js +121 -0
  99. package/src/core/PerspectiveCamera.js +73 -0
  100. package/src/core/PointMaterial.js +36 -0
  101. package/src/core/PointerLockControls.js +90 -0
  102. package/src/core/Points.js +227 -0
  103. package/src/core/PositionalAudio.js +51 -0
  104. package/src/core/Preload.js +45 -0
  105. package/src/core/QuadraticBezierLine.js +44 -0
  106. package/src/core/Reflector.js +182 -0
  107. package/src/core/RenderTexture.js +96 -0
  108. package/src/core/Resize.js +39 -0
  109. package/src/core/RoundedBox.js +52 -0
  110. package/src/core/Sampler.js +85 -0
  111. package/src/core/ScreenQuad.js +24 -0
  112. package/src/core/ScreenSpace.js +25 -0
  113. package/src/core/Segments.js +102 -0
  114. package/src/core/Shadow.js +42 -0
  115. package/src/core/Sky.js +39 -0
  116. package/src/core/Sparkles.js +139 -0
  117. package/src/core/SpotLight.js +231 -0
  118. package/src/core/SpriteAnimator.js +342 -0
  119. package/src/core/Stage.js +135 -0
  120. package/src/core/Stars.js +108 -0
  121. package/src/core/Stats.js +30 -0
  122. package/src/core/Svg.js +59 -0
  123. package/src/core/Text.js +58 -0
  124. package/src/core/Text3D.js +76 -0
  125. package/src/core/TrackballControls.js +72 -0
  126. package/src/core/Trail.js +161 -0
  127. package/src/core/TransformControls.js +106 -0
  128. package/src/core/Wireframe.js +185 -0
  129. package/src/core/meshBounds.js +38 -0
  130. package/src/core/shaderMaterial.js +39 -0
  131. package/src/core/shapes.js +68 -0
  132. package/src/core/softShadows.js +161 -0
  133. package/src/core/useAnimations.js +56 -0
  134. package/src/core/useAspect.js +10 -0
  135. package/src/core/useBVH.js +90 -0
  136. package/src/core/useBoxProjectedEnv.js +98 -0
  137. package/src/core/useCamera.js +27 -0
  138. package/src/core/useContextBridge.js +21 -0
  139. package/src/core/useCubeCamera.js +49 -0
  140. package/src/core/useCubeTexture.js +18 -0
  141. package/src/core/useDepthBuffer.js +38 -0
  142. package/src/core/useDetectGPU.js +6 -0
  143. package/src/core/useEnvironment.js +48 -0
  144. package/src/core/useFBO.js +53 -0
  145. package/src/core/useFBX.js +12 -0
  146. package/src/core/useFont.js +20 -0
  147. package/src/core/useGLTF.js +37 -0
  148. package/src/core/useHelper.js +31 -0
  149. package/src/core/useIntersect.js +39 -0
  150. package/src/core/useKTX2.js +38 -0
  151. package/src/core/useMatcapTexture.js +45 -0
  152. package/src/core/useNormalTexture.js +30 -0
  153. package/src/core/useProgress.js +50 -0
  154. package/src/core/useTexture.js +35 -0
  155. package/src/core/useTrailTexture.js +164 -0
  156. package/src/core/useVideoTexture.js +41 -0
  157. package/src/helpers/environment-assets.js +14 -0
  158. package/src/helpers/useEffectfulState.js +18 -0
  159. package/src/materials/BlurPass.js +75 -0
  160. package/src/materials/ConvolutionMaterial.js +99 -0
  161. package/src/materials/DiscardMaterial.js +5 -0
  162. package/src/materials/MeshReflectorMaterial.js +290 -0
  163. package/src/materials/MeshRefractionMaterial.js +171 -0
  164. package/src/materials/SpotLightMaterial.js +111 -0
  165. package/src/materials/WireframeMaterial.js +235 -0
  166. package/src/web/CycleRaycast.js +97 -0
  167. package/src/web/Html.js +417 -0
  168. package/src/web/KeyboardControls.js +101 -0
  169. package/src/web/Loader.js +98 -0
  170. package/src/web/PresentationControls.js +86 -0
  171. package/src/web/ScrollControls.js +246 -0
  172. package/src/web/Select.js +175 -0
  173. package/src/web/View.js +206 -0
  174. package/src/web/pivotControls/AxisArrow.js +202 -0
  175. package/src/web/pivotControls/AxisRotator.js +235 -0
  176. package/src/web/pivotControls/PlaneSlider.js +211 -0
  177. package/src/web/pivotControls/context.js +5 -0
  178. package/src/web/pivotControls/index.js +223 -0
  179. package/src/web/useCursor.js +12 -0
  180. package/web/Loader.js +2 -0
  181. package/web/index.cjs.js +1 -1
  182. package/web/index.js +0 -1
  183. package/web/pivotControls/AxisArrow.js +3 -0
  184. package/web/pivotControls/AxisRotator.js +3 -0
  185. package/web/pivotControls/PlaneSlider.js +3 -0
  186. package/web/pivotControls/index.js +5 -0
  187. /package/{helpers → src/helpers}/glsl/DefaultSpotlightShadowShadows.glsl.js +0 -0
  188. /package/{helpers → src/helpers}/glsl/distort.vert.glsl.js +0 -0
  189. /package/{index.js → src/index.js} +0 -0
@@ -0,0 +1,76 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as THREE from 'three';
3
+ import * as React from 'react';
4
+ import mergeRefs from 'react-merge-refs';
5
+ import { MarchingCubes as MarchingCubes$1 } from 'three-stdlib';
6
+ import { useFrame } from '@react-three/fiber';
7
+
8
+ const globalContext = /*#__PURE__*/React.createContext(null);
9
+ const MarchingCubes = /*#__PURE__*/React.forwardRef(({
10
+ resolution = 28,
11
+ maxPolyCount = 10000,
12
+ enableUvs = false,
13
+ enableColors = false,
14
+ children,
15
+ ...props
16
+ }, ref) => {
17
+ const marchingCubesRef = React.useRef(null);
18
+ const marchingCubes = React.useMemo(() => new MarchingCubes$1(resolution, null, enableUvs, enableColors, maxPolyCount), [resolution, maxPolyCount, enableUvs, enableColors]);
19
+ const api = React.useMemo(() => ({
20
+ getParent: () => marchingCubesRef
21
+ }), []);
22
+ useFrame(() => {
23
+ marchingCubes.update();
24
+ marchingCubes.reset();
25
+ }, -1); // To make sure the reset runs before the balls or planes are added
26
+
27
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("primitive", _extends({
28
+ object: marchingCubes,
29
+ ref: mergeRefs([marchingCubesRef, ref])
30
+ }, props), /*#__PURE__*/React.createElement(globalContext.Provider, {
31
+ value: api
32
+ }, children)));
33
+ });
34
+ const MarchingCube = /*#__PURE__*/React.forwardRef(({
35
+ strength = 0.5,
36
+ subtract = 12,
37
+ color,
38
+ ...props
39
+ }, ref) => {
40
+ const {
41
+ getParent
42
+ } = React.useContext(globalContext);
43
+ const parentRef = React.useMemo(() => getParent(), [getParent]);
44
+ const cubeRef = React.useRef();
45
+ const vec = new THREE.Vector3();
46
+ useFrame(state => {
47
+ if (!parentRef.current || !cubeRef.current) return;
48
+ cubeRef.current.getWorldPosition(vec);
49
+ parentRef.current.addBall(0.5 + vec.x * 0.5, 0.5 + vec.y * 0.5, 0.5 + vec.z * 0.5, strength, subtract, color);
50
+ });
51
+ return /*#__PURE__*/React.createElement("group", _extends({
52
+ ref: mergeRefs([ref, cubeRef])
53
+ }, props));
54
+ });
55
+ const MarchingPlane = /*#__PURE__*/React.forwardRef(({
56
+ planeType: _planeType = 'x',
57
+ strength = 0.5,
58
+ subtract = 12,
59
+ ...props
60
+ }, ref) => {
61
+ const {
62
+ getParent
63
+ } = React.useContext(globalContext);
64
+ const parentRef = React.useMemo(() => getParent(), [getParent]);
65
+ const wallRef = React.useRef();
66
+ const planeType = React.useMemo(() => _planeType === 'x' ? 'addPlaneX' : _planeType === 'y' ? 'addPlaneY' : 'addPlaneZ', [_planeType]);
67
+ useFrame(() => {
68
+ if (!parentRef.current || !wallRef.current) return;
69
+ parentRef.current[planeType](strength, subtract);
70
+ });
71
+ return /*#__PURE__*/React.createElement("group", _extends({
72
+ ref: mergeRefs([ref, wallRef])
73
+ }, props));
74
+ });
75
+
76
+ export { MarchingCube, MarchingCubes, MarchingPlane };
@@ -0,0 +1,42 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as THREE from 'three';
3
+ import * as React from 'react';
4
+
5
+ const Mask = /*#__PURE__*/React.forwardRef(({
6
+ id = 1,
7
+ colorWrite = false,
8
+ depthWrite = false,
9
+ ...props
10
+ }, fref) => {
11
+ const ref = React.useRef(null);
12
+ const spread = React.useMemo(() => ({
13
+ colorWrite,
14
+ depthWrite,
15
+ stencilWrite: true,
16
+ stencilRef: id,
17
+ stencilFunc: THREE.AlwaysStencilFunc,
18
+ stencilFail: THREE.ReplaceStencilOp,
19
+ stencilZFail: THREE.ReplaceStencilOp,
20
+ stencilZPass: THREE.ReplaceStencilOp
21
+ }), [id, colorWrite, depthWrite]);
22
+ React.useLayoutEffect(() => {
23
+ Object.assign(ref.current.material, spread);
24
+ });
25
+ React.useImperativeHandle(fref, () => ref.current, []);
26
+ return /*#__PURE__*/React.createElement("mesh", _extends({
27
+ ref: ref,
28
+ renderOrder: -id
29
+ }, props));
30
+ });
31
+ function useMask(id, inverse = false) {
32
+ return {
33
+ stencilWrite: true,
34
+ stencilRef: id,
35
+ stencilFunc: inverse ? THREE.NotEqualStencilFunc : THREE.EqualStencilFunc,
36
+ stencilFail: THREE.KeepStencilOp,
37
+ stencilZFail: THREE.KeepStencilOp,
38
+ stencilZPass: THREE.KeepStencilOp
39
+ };
40
+ }
41
+
42
+ export { Mask, useMask };
@@ -0,0 +1,15 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as React from 'react';
3
+ import { extend } from '@react-three/fiber';
4
+ import { DiscardMaterial } from '../materials/DiscardMaterial.js';
5
+
6
+ const MeshDiscardMaterial = /*#__PURE__*/React.forwardRef((props, fref) => {
7
+ extend({
8
+ DiscardMaterialImpl: DiscardMaterial
9
+ });
10
+ return /*#__PURE__*/React.createElement("discardMaterialImpl", _extends({
11
+ ref: fref
12
+ }, props));
13
+ });
14
+
15
+ export { MeshDiscardMaterial };
@@ -0,0 +1,79 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as React from 'react';
3
+ import { MeshPhysicalMaterial } from 'three';
4
+ import { useFrame } from '@react-three/fiber';
5
+ import distort from '../helpers/glsl/distort.vert.glsl.js';
6
+
7
+ class DistortMaterialImpl extends MeshPhysicalMaterial {
8
+ constructor(parameters = {}) {
9
+ super(parameters);
10
+ this.setValues(parameters);
11
+ this._time = {
12
+ value: 0
13
+ };
14
+ this._distort = {
15
+ value: 0.4
16
+ };
17
+ this._radius = {
18
+ value: 1
19
+ };
20
+ }
21
+
22
+ onBeforeCompile(shader) {
23
+ shader.uniforms.time = this._time;
24
+ shader.uniforms.radius = this._radius;
25
+ shader.uniforms.distort = this._distort;
26
+ shader.vertexShader = `
27
+ uniform float time;
28
+ uniform float radius;
29
+ uniform float distort;
30
+ ${distort}
31
+ ${shader.vertexShader}
32
+ `;
33
+ shader.vertexShader = shader.vertexShader.replace('#include <begin_vertex>', `
34
+ float updateTime = time / 50.0;
35
+ float noise = snoise(vec3(position / 2.0 + updateTime * 5.0));
36
+ vec3 transformed = vec3(position * (noise * pow(distort, 2.0) + radius));
37
+ `);
38
+ }
39
+
40
+ get time() {
41
+ return this._time.value;
42
+ }
43
+
44
+ set time(v) {
45
+ this._time.value = v;
46
+ }
47
+
48
+ get distort() {
49
+ return this._distort.value;
50
+ }
51
+
52
+ set distort(v) {
53
+ this._distort.value = v;
54
+ }
55
+
56
+ get radius() {
57
+ return this._radius.value;
58
+ }
59
+
60
+ set radius(v) {
61
+ this._radius.value = v;
62
+ }
63
+
64
+ }
65
+
66
+ const MeshDistortMaterial = /*#__PURE__*/React.forwardRef(({
67
+ speed = 1,
68
+ ...props
69
+ }, ref) => {
70
+ const [material] = React.useState(() => new DistortMaterialImpl());
71
+ useFrame(state => material && (material.time = state.clock.getElapsedTime() * speed));
72
+ return /*#__PURE__*/React.createElement("primitive", _extends({
73
+ object: material,
74
+ ref: ref,
75
+ attach: "material"
76
+ }, props));
77
+ });
78
+
79
+ export { MeshDistortMaterial };
@@ -0,0 +1,381 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as THREE from 'three';
3
+ import * as React from 'react';
4
+ import { extend, useThree, useFrame } from '@react-three/fiber';
5
+ import { useFBO } from './useFBO.js';
6
+ import { RenderTexture } from './RenderTexture.js';
7
+ import { shaderMaterial } from './shaderMaterial.js';
8
+ import { FullScreenQuad } from 'three-stdlib';
9
+
10
+ const PortalMaterialImpl = shaderMaterial({
11
+ blur: 0,
12
+ map: null,
13
+ sdf: null,
14
+ size: 0,
15
+ resolution: new THREE.Vector2()
16
+ }, `varying vec2 vUv;
17
+ void main() {
18
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
19
+ vUv = uv;
20
+ }`, `uniform sampler2D sdf;
21
+ uniform sampler2D map;
22
+ uniform float blur;
23
+ uniform float size;
24
+ uniform float time;
25
+ uniform vec2 resolution;
26
+ varying vec2 vUv;
27
+ #include <packing>
28
+ void main() {
29
+ vec2 uv = gl_FragCoord.xy / resolution.xy;
30
+ vec4 t = texture2D(map, uv);
31
+ float k = blur;
32
+ float d = texture2D(sdf, vUv).r/size;
33
+ float alpha = 1.0 - smoothstep(0.0, 1.0, clamp(d/k + 1.0, 0.0, 1.0));
34
+ gl_FragColor = vec4(t.rgb, blur == 0.0 ? t.a : t.a * alpha);
35
+ #include <tonemapping_fragment>
36
+ #include <encodings_fragment>
37
+ }`);
38
+ const MeshPortalMaterial = /*#__PURE__*/React.forwardRef(({
39
+ children,
40
+ blur = 0,
41
+ eventPriority,
42
+ renderPriority,
43
+ worldUnits = false,
44
+ resolution = 512,
45
+ ...props
46
+ }, fref) => {
47
+ extend({
48
+ PortalMaterialImpl
49
+ });
50
+ const ref = React.useRef(null);
51
+ const {
52
+ gl,
53
+ size,
54
+ events,
55
+ viewport
56
+ } = useThree();
57
+ const maskRenderTarget = useFBO(resolution, resolution);
58
+ React.useLayoutEffect(() => {
59
+ var _ref$current;
60
+
61
+ let mask = (_ref$current = ref.current) == null ? void 0 : _ref$current.__r3f.parent;
62
+ if (!mask) return; // Apply the SDF mask only once
63
+
64
+ if (blur && ref.current.sdf === null) {
65
+ const tempMesh = new THREE.Mesh(mask.geometry, new THREE.MeshBasicMaterial());
66
+ const boundingBox = new THREE.Box3().setFromBufferAttribute(tempMesh.geometry.attributes.position);
67
+ const orthoCam = new THREE.OrthographicCamera(boundingBox.min.x * (1 + 2 / resolution), boundingBox.max.x * (1 + 2 / resolution), boundingBox.max.y * (1 + 2 / resolution), boundingBox.min.y * (1 + 2 / resolution), 0.1, 1000);
68
+ orthoCam.position.set(0, 0, 1);
69
+ orthoCam.lookAt(0, 0, 0);
70
+ gl.setRenderTarget(maskRenderTarget);
71
+ gl.render(tempMesh, orthoCam);
72
+ const sg = makeSDFGenerator(resolution, resolution, gl);
73
+ const sdf = sg(maskRenderTarget.texture);
74
+ const readSdf = new Float32Array(resolution * resolution);
75
+ gl.readRenderTargetPixels(sdf, 0, 0, resolution, resolution, readSdf); // Get smallest value in sdf
76
+
77
+ let min = Infinity;
78
+
79
+ for (let i = 0; i < readSdf.length; i++) {
80
+ if (readSdf[i] < min) min = readSdf[i];
81
+ }
82
+
83
+ min = -min;
84
+ ref.current.size = min;
85
+ ref.current.sdf = sdf.texture;
86
+ gl.setRenderTarget(null);
87
+ }
88
+ }, [resolution, blur]);
89
+ React.useImperativeHandle(fref, () => ref.current);
90
+ return /*#__PURE__*/React.createElement("portalMaterialImpl", _extends({
91
+ ref: ref,
92
+ blur: blur,
93
+ resolution: [size.width * viewport.dpr, size.height * viewport.dpr],
94
+ toneMapped: false,
95
+ attach: "material"
96
+ }, props), /*#__PURE__*/React.createElement(RenderTexture, {
97
+ attach: "map",
98
+ eventPriority: eventPriority,
99
+ renderPriority: renderPriority,
100
+ compute: events.compute
101
+ }, children, /*#__PURE__*/React.createElement(CopyMatrix, {
102
+ material: ref,
103
+ worldUnits: worldUnits
104
+ })));
105
+ });
106
+
107
+ function CopyMatrix({
108
+ material,
109
+ worldUnits
110
+ }) {
111
+ const scene = useThree(state => state.scene);
112
+ React.useLayoutEffect(() => {
113
+ scene.matrixAutoUpdate = false;
114
+ }, []);
115
+ useFrame(() => {
116
+ var _material$current;
117
+
118
+ let parent = material == null ? void 0 : (_material$current = material.current) == null ? void 0 : _material$current.__r3f.parent;
119
+
120
+ if (parent) {
121
+ if (!worldUnits) scene.matrixWorld.copy(parent.matrixWorld);else scene.matrixWorld.identity();
122
+ }
123
+ });
124
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
125
+ }
126
+
127
+ const makeSDFGenerator = (clientWidth, clientHeight, renderer) => {
128
+ let finalTarget = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
129
+ minFilter: THREE.LinearMipmapLinearFilter,
130
+ magFilter: THREE.LinearFilter,
131
+ type: THREE.FloatType,
132
+ format: THREE.RedFormat,
133
+ generateMipmaps: true
134
+ });
135
+ let outsideRenderTarget = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
136
+ minFilter: THREE.NearestFilter,
137
+ magFilter: THREE.NearestFilter
138
+ });
139
+ let insideRenderTarget = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
140
+ minFilter: THREE.NearestFilter,
141
+ magFilter: THREE.NearestFilter
142
+ });
143
+ let outsideRenderTarget2 = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
144
+ minFilter: THREE.NearestFilter,
145
+ magFilter: THREE.NearestFilter
146
+ });
147
+ let insideRenderTarget2 = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
148
+ minFilter: THREE.NearestFilter,
149
+ magFilter: THREE.NearestFilter
150
+ });
151
+ let outsideRenderTargetFinal = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
152
+ minFilter: THREE.NearestFilter,
153
+ magFilter: THREE.NearestFilter,
154
+ type: THREE.FloatType,
155
+ format: THREE.RedFormat
156
+ });
157
+ let insideRenderTargetFinal = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
158
+ minFilter: THREE.NearestFilter,
159
+ magFilter: THREE.NearestFilter,
160
+ type: THREE.FloatType,
161
+ format: THREE.RedFormat
162
+ });
163
+ const uvRender = new FullScreenQuad(new THREE.ShaderMaterial({
164
+ uniforms: {
165
+ tex: {
166
+ value: null
167
+ }
168
+ },
169
+ vertexShader:
170
+ /*glsl*/
171
+ `
172
+ varying vec2 vUv;
173
+ void main() {
174
+ vUv = uv;
175
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
176
+ }`,
177
+ fragmentShader:
178
+ /*glsl*/
179
+ `
180
+ uniform sampler2D tex;
181
+ varying vec2 vUv;
182
+ #include <packing>
183
+ void main() {
184
+ gl_FragColor = pack2HalfToRGBA(vUv * (round(texture2D(tex, vUv).x)));
185
+ }`
186
+ }));
187
+ const uvRenderInside = new FullScreenQuad(new THREE.ShaderMaterial({
188
+ uniforms: {
189
+ tex: {
190
+ value: null
191
+ }
192
+ },
193
+ vertexShader:
194
+ /*glsl*/
195
+ `
196
+ varying vec2 vUv;
197
+ void main() {
198
+ vUv = uv;
199
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
200
+ }`,
201
+ fragmentShader:
202
+ /*glsl*/
203
+ `
204
+ uniform sampler2D tex;
205
+ varying vec2 vUv;
206
+ #include <packing>
207
+ void main() {
208
+ gl_FragColor = pack2HalfToRGBA(vUv * (1.0 - round(texture2D(tex, vUv).x)));
209
+ }`
210
+ }));
211
+ const jumpFloodRender = new FullScreenQuad(new THREE.ShaderMaterial({
212
+ uniforms: {
213
+ tex: {
214
+ value: null
215
+ },
216
+ offset: {
217
+ value: 0.0
218
+ },
219
+ level: {
220
+ value: 0.0
221
+ },
222
+ maxSteps: {
223
+ value: 0.0
224
+ }
225
+ },
226
+ vertexShader:
227
+ /*glsl*/
228
+ `
229
+ varying vec2 vUv;
230
+ void main() {
231
+ vUv = uv;
232
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
233
+ }`,
234
+ fragmentShader:
235
+ /*glsl*/
236
+ `
237
+ varying vec2 vUv;
238
+ uniform sampler2D tex;
239
+ uniform float offset;
240
+ uniform float level;
241
+ uniform float maxSteps;
242
+ #include <packing>
243
+ void main() {
244
+ float closestDist = 9999999.9;
245
+ vec2 closestPos = vec2(0.0);
246
+ for (float x = -1.0; x <= 1.0; x += 1.0) {
247
+ for (float y = -1.0; y <= 1.0; y += 1.0) {
248
+ vec2 voffset = vUv;
249
+ voffset += vec2(x, y) * vec2(${1 / clientWidth}, ${1 / clientHeight}) * offset;
250
+ vec2 pos = unpackRGBATo2Half(texture2D(tex, voffset));
251
+ float dist = distance(pos.xy, vUv);
252
+ if(pos.x != 0.0 && pos.y != 0.0 && dist < closestDist) {
253
+ closestDist = dist;
254
+ closestPos = pos;
255
+ }
256
+ }
257
+ }
258
+ gl_FragColor = pack2HalfToRGBA(closestPos);
259
+ }`
260
+ }));
261
+ const distanceFieldRender = new FullScreenQuad(new THREE.ShaderMaterial({
262
+ uniforms: {
263
+ tex: {
264
+ value: null
265
+ },
266
+ size: {
267
+ value: new THREE.Vector2(clientWidth, clientHeight)
268
+ }
269
+ },
270
+ vertexShader:
271
+ /*glsl*/
272
+ `
273
+ varying vec2 vUv;
274
+ void main() {
275
+ vUv = uv;
276
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
277
+ }`,
278
+ fragmentShader:
279
+ /*glsl*/
280
+ `
281
+ varying vec2 vUv;
282
+ uniform sampler2D tex;
283
+ uniform vec2 size;
284
+ #include <packing>
285
+ void main() {
286
+ gl_FragColor = vec4(distance(size * unpackRGBATo2Half(texture2D(tex, vUv)), size * vUv), 0.0, 0.0, 0.0);
287
+ }`
288
+ }));
289
+ const compositeRender = new FullScreenQuad(new THREE.ShaderMaterial({
290
+ uniforms: {
291
+ inside: {
292
+ value: insideRenderTargetFinal.texture
293
+ },
294
+ outside: {
295
+ value: outsideRenderTargetFinal.texture
296
+ },
297
+ tex: {
298
+ value: null
299
+ }
300
+ },
301
+ vertexShader:
302
+ /*glsl*/
303
+ `
304
+ varying vec2 vUv;
305
+ void main() {
306
+ vUv = uv;
307
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
308
+ }`,
309
+ fragmentShader:
310
+ /*glsl*/
311
+ `
312
+ varying vec2 vUv;
313
+ uniform sampler2D inside;
314
+ uniform sampler2D outside;
315
+ uniform sampler2D tex;
316
+ #include <packing>
317
+ void main() {
318
+ float i = texture2D(inside, vUv).x;
319
+ float o =texture2D(outside, vUv).x;
320
+ if (texture2D(tex, vUv).x == 0.0) {
321
+ gl_FragColor = vec4(o, 0.0, 0.0, 0.0);
322
+ } else {
323
+ gl_FragColor = vec4(-i, 0.0, 0.0, 0.0);
324
+ }
325
+ }`
326
+ }));
327
+ return image => {
328
+ let ft = finalTarget;
329
+ image.minFilter = THREE.NearestFilter;
330
+ image.magFilter = THREE.NearestFilter;
331
+ uvRender.material.uniforms.tex.value = image;
332
+ renderer.setRenderTarget(outsideRenderTarget);
333
+ uvRender.render(renderer);
334
+ const passes = Math.ceil(Math.log(Math.max(clientWidth, clientHeight)) / Math.log(2.0));
335
+ let lastTarget = outsideRenderTarget;
336
+ let target = null;
337
+
338
+ for (let i = 0; i < passes; i++) {
339
+ const offset = Math.pow(2, passes - i - 1);
340
+ target = lastTarget === outsideRenderTarget ? outsideRenderTarget2 : outsideRenderTarget;
341
+ jumpFloodRender.material.uniforms.level.value = i;
342
+ jumpFloodRender.material.uniforms.maxSteps.value = passes;
343
+ jumpFloodRender.material.uniforms.offset.value = offset;
344
+ jumpFloodRender.material.uniforms.tex.value = lastTarget.texture;
345
+ renderer.setRenderTarget(target);
346
+ jumpFloodRender.render(renderer);
347
+ lastTarget = target;
348
+ }
349
+
350
+ renderer.setRenderTarget(outsideRenderTargetFinal);
351
+ distanceFieldRender.material.uniforms.tex.value = target.texture;
352
+ distanceFieldRender.render(renderer);
353
+ uvRenderInside.material.uniforms.tex.value = image;
354
+ renderer.setRenderTarget(insideRenderTarget);
355
+ uvRenderInside.render(renderer);
356
+ lastTarget = insideRenderTarget;
357
+
358
+ for (let i = 0; i < passes; i++) {
359
+ const offset = Math.pow(2, passes - i - 1);
360
+ target = lastTarget === insideRenderTarget ? insideRenderTarget2 : insideRenderTarget;
361
+ jumpFloodRender.material.uniforms.level.value = i;
362
+ jumpFloodRender.material.uniforms.maxSteps.value = passes;
363
+ jumpFloodRender.material.uniforms.offset.value = offset;
364
+ jumpFloodRender.material.uniforms.tex.value = lastTarget.texture;
365
+ renderer.setRenderTarget(target);
366
+ jumpFloodRender.render(renderer);
367
+ lastTarget = target;
368
+ }
369
+
370
+ renderer.setRenderTarget(insideRenderTargetFinal);
371
+ distanceFieldRender.material.uniforms.tex.value = target.texture;
372
+ distanceFieldRender.render(renderer);
373
+ renderer.setRenderTarget(ft);
374
+ compositeRender.material.uniforms.tex.value = image;
375
+ compositeRender.render(renderer);
376
+ renderer.setRenderTarget(null);
377
+ return ft;
378
+ };
379
+ };
380
+
381
+ export { MeshPortalMaterial };