@react-three/drei 8.18.9 → 9.0.0-beta.2

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 (125) hide show
  1. package/README.md +61 -254
  2. package/core/ArcballControls.cjs.js +1 -1
  3. package/core/ArcballControls.js +26 -17
  4. package/core/Billboard.d.ts +2 -2
  5. package/core/Bounds.cjs.js +1 -1
  6. package/core/Bounds.d.ts +1 -2
  7. package/core/Bounds.js +15 -26
  8. package/core/Center.d.ts +1 -1
  9. package/core/ContactShadows.cjs.js +1 -1
  10. package/core/ContactShadows.d.ts +1 -1
  11. package/core/ContactShadows.js +1 -2
  12. package/core/CubeCamera.cjs.js +1 -1
  13. package/core/CubeCamera.js +7 -7
  14. package/core/Detailed.d.ts +2 -2
  15. package/core/DeviceOrientationControls.cjs.js +1 -1
  16. package/core/DeviceOrientationControls.d.ts +1 -1
  17. package/core/DeviceOrientationControls.js +6 -2
  18. package/core/Effects.cjs.js +1 -1
  19. package/core/Effects.d.ts +2 -2
  20. package/core/Effects.js +2 -2
  21. package/core/Environment.cjs.js +1 -1
  22. package/core/Environment.d.ts +3 -13
  23. package/core/Environment.js +30 -95
  24. package/core/FirstPersonControls.cjs.js +1 -1
  25. package/core/FirstPersonControls.d.ts +1 -1
  26. package/core/FirstPersonControls.js +6 -2
  27. package/core/Float.cjs.js +1 -1
  28. package/core/Float.d.ts +1 -1
  29. package/core/Float.js +4 -5
  30. package/core/FlyControls.d.ts +1 -1
  31. package/core/GizmoHelper.cjs.js +1 -1
  32. package/core/GizmoHelper.d.ts +1 -2
  33. package/core/GizmoHelper.js +41 -31
  34. package/core/GizmoViewcube.cjs.js +1 -1
  35. package/core/GizmoViewcube.d.ts +2 -2
  36. package/core/GizmoViewcube.js +1 -1
  37. package/core/GizmoViewport.d.ts +2 -2
  38. package/core/Image.cjs.js +1 -1
  39. package/core/Image.d.ts +2 -4
  40. package/core/Image.js +1 -6
  41. package/core/Instances.cjs.js +1 -1
  42. package/core/Instances.d.ts +3 -3
  43. package/core/Instances.js +11 -5
  44. package/core/Line.d.ts +1 -1
  45. package/core/MapControls.d.ts +1 -1
  46. package/core/MeshDistortMaterial.d.ts +2 -4
  47. package/core/MeshReflectorMaterial.cjs.js +1 -1
  48. package/core/MeshReflectorMaterial.d.ts +2 -1
  49. package/core/MeshReflectorMaterial.js +3 -1
  50. package/core/MeshWobbleMaterial.d.ts +2 -4
  51. package/core/OrbitControls.cjs.js +1 -1
  52. package/core/OrbitControls.js +32 -22
  53. package/core/OrthographicCamera.d.ts +2 -2
  54. package/core/PerspectiveCamera.d.ts +2 -2
  55. package/core/PointMaterial.cjs.js +1 -1
  56. package/core/PointMaterial.d.ts +7 -3
  57. package/core/PointMaterial.js +32 -14
  58. package/core/PointerLockControls.cjs.js +1 -1
  59. package/core/PointerLockControls.d.ts +1 -2
  60. package/core/PointerLockControls.js +22 -35
  61. package/core/Points.cjs.js +1 -1
  62. package/core/Points.d.ts +3 -3
  63. package/core/Points.js +36 -17
  64. package/core/PositionalAudio.d.ts +2 -2
  65. package/core/Reflector.d.ts +1 -1
  66. package/core/RoundedBox.d.ts +1 -1
  67. package/core/ScreenQuad.d.ts +1 -1
  68. package/core/Segments.d.ts +1 -1
  69. package/core/Shadow.d.ts +2 -2
  70. package/core/SpotLight.d.ts +20 -4
  71. package/core/Stage.cjs.js +1 -1
  72. package/core/Stage.js +2 -1
  73. package/core/Stars.cjs.js +1 -1
  74. package/core/Stars.js +3 -6
  75. package/core/Text.cjs.js +1 -1
  76. package/core/Text.d.ts +2 -3
  77. package/core/Text.js +2 -3
  78. package/core/TrackballControls.cjs.js +1 -1
  79. package/core/TrackballControls.d.ts +1 -1
  80. package/core/TrackballControls.js +6 -11
  81. package/core/TransformControls.cjs.js +1 -1
  82. package/core/TransformControls.d.ts +1 -1
  83. package/core/TransformControls.js +12 -4
  84. package/core/index.cjs.js +1 -1
  85. package/core/index.d.ts +0 -4
  86. package/core/index.js +2 -7
  87. package/core/shapes.d.ts +17 -17
  88. package/core/useFBX.d.ts +1 -1
  89. package/core/useFBX.js +1 -2
  90. package/core/useGLTF.d.ts +1 -1
  91. package/core/useGLTF.js +1 -2
  92. package/core/useHelper.d.ts +1 -3
  93. package/core/useKTX2.d.ts +1 -1
  94. package/core/useKTX2.js +1 -2
  95. package/core/useTexture.d.ts +1 -1
  96. package/core/useTexture.js +1 -2
  97. package/index.cjs.js +1 -1
  98. package/index.js +1 -5
  99. package/materials/ConvolutionMaterial.cjs.js +1 -1
  100. package/materials/ConvolutionMaterial.js +0 -2
  101. package/materials/MeshReflectorMaterial.cjs.js +1 -1
  102. package/materials/MeshReflectorMaterial.d.ts +3 -0
  103. package/materials/MeshReflectorMaterial.js +27 -1
  104. package/materials/SpotLightMaterial.cjs.js +1 -1
  105. package/materials/SpotLightMaterial.js +0 -3
  106. package/native/index.cjs.js +1 -1
  107. package/native/index.js +2 -7
  108. package/package.json +6 -7
  109. package/web/Html.cjs.js +1 -1
  110. package/web/Html.js +6 -4
  111. package/web/Select.js +0 -1
  112. package/web/index.cjs.js +1 -1
  113. package/web/index.js +2 -7
  114. package/core/Clone.cjs.js +0 -1
  115. package/core/Clone.d.ts +0 -11
  116. package/core/Clone.js +0 -89
  117. package/core/Lightformer.cjs.js +0 -1
  118. package/core/Lightformer.d.ts +0 -41
  119. package/core/Lightformer.js +0 -51
  120. package/core/Trail.cjs.js +0 -1
  121. package/core/Trail.d.ts +0 -20
  122. package/core/Trail.js +0 -160
  123. package/core/useBoxProjectedEnv.cjs.js +0 -1
  124. package/core/useBoxProjectedEnv.d.ts +0 -8
  125. package/core/useBoxProjectedEnv.js +0 -98
@@ -1,51 +0,0 @@
1
- import _extends from '@babel/runtime/helpers/esm/extends';
2
- import { applyProps } from '@react-three/fiber';
3
- import * as React from 'react';
4
- import * as THREE from 'three';
5
- import mergeRefs from 'react-merge-refs';
6
-
7
- const Lightformer = /*#__PURE__*/React.forwardRef(({
8
- args,
9
- map,
10
- toneMapped = false,
11
- color = 'white',
12
- form: Form = 'rect',
13
- intensity = 1,
14
- scale = 1,
15
- target,
16
- children,
17
- ...props
18
- }, forwardRef) => {
19
- // Apply emissive power
20
- const ref = React.useRef(null);
21
- React.useLayoutEffect(() => {
22
- if (!children && !props.material) {
23
- applyProps(ref.current.material, {
24
- color
25
- });
26
- ref.current.material.color.multiplyScalar(intensity);
27
- }
28
- }, [color, intensity, children, props.material]); // Target light
29
-
30
- React.useLayoutEffect(() => {
31
- if (target) ref.current.lookAt(Array.isArray(target) ? new THREE.Vector3(...target) : target);
32
- }, [target]); // Fix 2-dimensional scale
33
-
34
- scale = Array.isArray(scale) && scale.length === 2 ? [scale[0], scale[1], 1] : scale;
35
- return /*#__PURE__*/React.createElement("mesh", _extends({
36
- ref: mergeRefs([ref, forwardRef]),
37
- scale: scale
38
- }, props), Form === 'circle' ? /*#__PURE__*/React.createElement("ringGeometry", {
39
- args: [0, 1, 64]
40
- }) : Form === 'ring' ? /*#__PURE__*/React.createElement("ringGeometry", {
41
- args: [0.5, 1, 64]
42
- }) : Form === 'rect' ? /*#__PURE__*/React.createElement("planeGeometry", null) : /*#__PURE__*/React.createElement(Form, {
43
- args: args
44
- }), children ? children : !props.material ? /*#__PURE__*/React.createElement("meshBasicMaterial", {
45
- toneMapped: toneMapped,
46
- map: map,
47
- side: THREE.DoubleSide
48
- }) : null);
49
- });
50
-
51
- export { Lightformer };
package/core/Trail.cjs.js DELETED
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@react-three/fiber"),t=require("react"),r=require("three"),n=require("meshline");function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var i=o(t);const s={width:.2,length:1,decay:1,local:!1,stride:0,interval:1},u=(e,t=1)=>(e.set(e.subarray(t)),e.fill(-1/0,-t),e);function c(t,n){const{length:o,local:c,decay:l,interval:a,stride:f}={...s,...n},d=i.useRef(),[h]=i.useState((()=>new r.Vector3));i.useLayoutEffect((()=>{t&&(d.current=Float32Array.from({length:10*o*3},((e,r)=>t.position.getComponent(r%3))))}),[o,t]);const p=i.useRef(new r.Vector3),y=i.useRef(0);return e.useFrame((()=>{if(t&&d.current){if(0===y.current){let e;c?e=t.position:(t.getWorldPosition(h),e=h);const r=1*l;for(let t=0;t<r;t++)e.distanceTo(p.current)<f||(u(d.current,3),d.current.set(e.toArray(),d.current.length-3));p.current.copy(e)}y.current++,y.current=y.current%a}})),d}const l=i.forwardRef(((t,o)=>{const{children:u}=t,{width:l,length:a,decay:f,local:d,stride:h,interval:p}={...s,...t},{color:y="hotpink",attenuation:g,target:m}=t,v=e.useThree((e=>e.size)),b=i.useRef(null),[w,M]=i.useState(null),j=c(w,{length:a,decay:f,local:d,stride:h,interval:p});i.useEffect((()=>{const e=(null==m?void 0:m.current)||b.current.children.find((e=>e instanceof r.Object3D));e&&M(e)}),[j,m]);const O=i.useMemo((()=>new n.MeshLine),[]),E=i.useMemo((()=>{var e;const t=new n.MeshLineMaterial({lineWidth:.1*l,color:y,sizeAttenuation:1,resolution:new r.Vector2(v.width,v.height)});let o;if(u)if(Array.isArray(u))o=u.find((e=>{const t=e;return"string"==typeof t.type&&"meshLineMaterial"===t.type}));else{const e=u;"string"==typeof e.type&&"meshLineMaterial"===e.type&&(o=e)}return"object"==typeof(null==(e=o)?void 0:e.props)&&t.setValues(o.props),t}),[l,y,v,u]);return i.useEffect((()=>{E.uniforms.resolution.value.set(v.width,v.height)}),[v]),e.useFrame((()=>{j.current&&O.setPoints(j.current,g)})),i.createElement("group",null,i.createElement("mesh",{ref:o,geometry:O,material:E}),i.createElement("group",{ref:b},u))}));exports.Trail=l,exports.useTrail=c;
package/core/Trail.d.ts DELETED
@@ -1,20 +0,0 @@
1
- import * as React from 'react';
2
- import { ColorRepresentation, Object3D } from 'three';
3
- import { MeshLine } from 'meshline';
4
- declare type Settings = {
5
- width: number;
6
- length: number;
7
- decay: number;
8
- local: boolean;
9
- stride: number;
10
- interval: number;
11
- };
12
- export declare function useTrail(target: Object3D, settings: Partial<Settings>): React.MutableRefObject<Float32Array | undefined>;
13
- export declare const Trail: React.ForwardRefExoticComponent<{
14
- color?: ColorRepresentation | undefined;
15
- attenuation?: ((width: number) => number) | undefined;
16
- target?: React.MutableRefObject<Object3D<import("three").Event>> | undefined;
17
- } & Partial<Settings> & {
18
- children?: React.ReactNode;
19
- } & React.RefAttributes<MeshLine>>;
20
- export {};
package/core/Trail.js DELETED
@@ -1,160 +0,0 @@
1
- import { useFrame, useThree } from '@react-three/fiber';
2
- import * as React from 'react';
3
- import { Vector3, Object3D, Vector2 } from 'three';
4
- import { MeshLine, MeshLineMaterial } from 'meshline';
5
-
6
- const defaults = {
7
- width: 0.2,
8
- length: 1,
9
- decay: 1,
10
- local: false,
11
- stride: 0,
12
- interval: 1
13
- };
14
-
15
- const shiftLeft = (collection, steps = 1) => {
16
- collection.set(collection.subarray(steps));
17
- collection.fill(-Infinity, -steps);
18
- return collection;
19
- };
20
-
21
- function useTrail(target, settings) {
22
- const {
23
- length,
24
- local,
25
- decay,
26
- interval,
27
- stride
28
- } = { ...defaults,
29
- ...settings
30
- };
31
- const points = React.useRef();
32
- const [worldPosition] = React.useState(() => new Vector3());
33
- React.useLayoutEffect(() => {
34
- if (target) {
35
- points.current = Float32Array.from({
36
- length: length * 10 * 3
37
- }, (_, i) => target.position.getComponent(i % 3));
38
- }
39
- }, [length, target]);
40
- const prevPosition = React.useRef(new Vector3());
41
- const frameCount = React.useRef(0);
42
- useFrame(() => {
43
- if (!target) return;
44
- if (!points.current) return;
45
-
46
- if (frameCount.current === 0) {
47
- let newPosition;
48
-
49
- if (local) {
50
- newPosition = target.position;
51
- } else {
52
- target.getWorldPosition(worldPosition);
53
- newPosition = worldPosition;
54
- }
55
-
56
- const steps = 1 * decay;
57
-
58
- for (let i = 0; i < steps; i++) {
59
- if (newPosition.distanceTo(prevPosition.current) < stride) continue;
60
- shiftLeft(points.current, 3);
61
- points.current.set(newPosition.toArray(), points.current.length - 3);
62
- }
63
-
64
- prevPosition.current.copy(newPosition);
65
- }
66
-
67
- frameCount.current++;
68
- frameCount.current = frameCount.current % interval;
69
- });
70
- return points;
71
- }
72
- const Trail = /*#__PURE__*/React.forwardRef((props, forwardRef) => {
73
- const {
74
- children
75
- } = props;
76
- const {
77
- width,
78
- length,
79
- decay,
80
- local,
81
- stride,
82
- interval
83
- } = { ...defaults,
84
- ...props
85
- };
86
- const {
87
- color = 'hotpink',
88
- attenuation,
89
- target
90
- } = props;
91
- const size = useThree(s => s.size);
92
- const ref = React.useRef(null);
93
- const [anchor, setAnchor] = React.useState(null);
94
- const points = useTrail(anchor, {
95
- length,
96
- decay,
97
- local,
98
- stride,
99
- interval
100
- });
101
- React.useEffect(() => {
102
- const t = (target == null ? void 0 : target.current) || ref.current.children.find(o => {
103
- return o instanceof Object3D;
104
- });
105
-
106
- if (t) {
107
- setAnchor(t);
108
- }
109
- }, [points, target]);
110
- const geo = React.useMemo(() => new MeshLine(), []);
111
- const mat = React.useMemo(() => {
112
- var _matOverride;
113
-
114
- const m = new MeshLineMaterial({
115
- lineWidth: 0.1 * width,
116
- color: color,
117
- sizeAttenuation: 1,
118
- resolution: new Vector2(size.width, size.height)
119
- }); // Get and apply first <meshLineMaterial /> from children
120
-
121
- let matOverride;
122
-
123
- if (children) {
124
- if (Array.isArray(children)) {
125
- matOverride = children.find(child => {
126
- const c = child;
127
- return typeof c.type === 'string' && c.type === 'meshLineMaterial';
128
- });
129
- } else {
130
- const c = children;
131
-
132
- if (typeof c.type === 'string' && c.type === 'meshLineMaterial') {
133
- matOverride = c;
134
- }
135
- }
136
- }
137
-
138
- if (typeof ((_matOverride = matOverride) == null ? void 0 : _matOverride.props) === 'object') {
139
- m.setValues(matOverride.props);
140
- }
141
-
142
- return m;
143
- }, [width, color, size, children]);
144
- React.useEffect(() => {
145
- mat.uniforms.resolution.value.set(size.width, size.height);
146
- }, [size]);
147
- useFrame(() => {
148
- if (!points.current) return;
149
- geo.setPoints(points.current, attenuation);
150
- });
151
- return /*#__PURE__*/React.createElement("group", null, /*#__PURE__*/React.createElement("mesh", {
152
- ref: forwardRef,
153
- geometry: geo,
154
- material: mat
155
- }), /*#__PURE__*/React.createElement("group", {
156
- ref: ref
157
- }, children));
158
- });
159
-
160
- export { Trail, useTrail };
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),n=require("@react-three/fiber");function i(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}})),r.default=e,Object.freeze(r)}var o=i(e),t=i(r);exports.useBoxProjectedEnv=function(e=new o.Vector3,r=new o.Vector3){const[i]=t.useState((()=>({position:new o.Vector3,size:new o.Vector3})));n.applyProps(i,{position:e,size:r});const a=t.useRef(null),c=t.useMemo((()=>({ref:a,onBeforeCompile:e=>function(e,r,n){e.defines.BOX_PROJECTED_ENV_MAP=!0,e.uniforms.envMapPosition={value:r},e.uniforms.envMapSize={value:n},e.vertexShader=`\n varying vec3 vWorldPosition;\n ${e.vertexShader.replace("#include <worldpos_vertex>","\n#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n #ifdef BOX_PROJECTED_ENV_MAP\n vWorldPosition = worldPosition.xyz;\n #endif\n#endif\n")}`,e.fragmentShader=`\n \n#ifdef BOX_PROJECTED_ENV_MAP\n uniform vec3 envMapSize;\n uniform vec3 envMapPosition;\n varying vec3 vWorldPosition;\n \n vec3 parallaxCorrectNormal( vec3 v, vec3 cubeSize, vec3 cubePos ) {\n vec3 nDir = normalize( v );\n vec3 rbmax = ( .5 * cubeSize + cubePos - vWorldPosition ) / nDir;\n vec3 rbmin = ( -.5 * cubeSize + cubePos - vWorldPosition ) / nDir;\n vec3 rbminmax;\n rbminmax.x = ( nDir.x > 0. ) ? rbmax.x : rbmin.x;\n rbminmax.y = ( nDir.y > 0. ) ? rbmax.y : rbmin.y;\n rbminmax.z = ( nDir.z > 0. ) ? rbmax.z : rbmin.z;\n float correction = min( min( rbminmax.x, rbminmax.y ), rbminmax.z );\n vec3 boxIntersection = vWorldPosition + nDir * correction; \n return boxIntersection - cubePos;\n }\n#endif\n\n ${e.fragmentShader.replace("#include <envmap_physical_pars_fragment>",o.ShaderChunk.envmap_physical_pars_fragment).replace("vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );","vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n \n#ifdef BOX_PROJECTED_ENV_MAP\n worldNormal = parallaxCorrectNormal( worldNormal, envMapSize, envMapPosition );\n#endif\n\n ").replace("reflectVec = inverseTransformDirection( reflectVec, viewMatrix );","reflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n \n#ifdef BOX_PROJECTED_ENV_MAP\n reflectVec = parallaxCorrectNormal( reflectVec, envMapSize, envMapPosition );\n#endif\n\n ")}`}(e,i.position,i.size),customProgramCacheKey:()=>JSON.stringify(i.position.toArray())+JSON.stringify(i.size.toArray())})),[...i.position.toArray(),...i.size.toArray()]);return t.useLayoutEffect((()=>{a.current.needsUpdate=!0}),[i]),c};
@@ -1,8 +0,0 @@
1
- import * as THREE from 'three';
2
- import * as React from 'react';
3
- import { ReactThreeFiber } from '@react-three/fiber';
4
- export declare function useBoxProjectedEnv(position?: ReactThreeFiber.Vector3, size?: ReactThreeFiber.Vector3): {
5
- ref: React.MutableRefObject<THREE.Material>;
6
- onBeforeCompile: (shader: THREE.Shader) => void;
7
- customProgramCacheKey: () => string;
8
- };
@@ -1,98 +0,0 @@
1
- import * as THREE from 'three';
2
- import * as React from 'react';
3
- import { applyProps } from '@react-three/fiber';
4
-
5
- // and @0beqz https://gist.github.com/0beqz/8d51b4ae16d68021a09fb504af708fca
6
-
7
- const worldposReplace =
8
- /* glsl */
9
- `
10
- #if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )
11
- vec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );
12
- #ifdef BOX_PROJECTED_ENV_MAP
13
- vWorldPosition = worldPosition.xyz;
14
- #endif
15
- #endif
16
- `;
17
- const boxProjectDefinitions =
18
- /*glsl */
19
- `
20
- #ifdef BOX_PROJECTED_ENV_MAP
21
- uniform vec3 envMapSize;
22
- uniform vec3 envMapPosition;
23
- varying vec3 vWorldPosition;
24
-
25
- vec3 parallaxCorrectNormal( vec3 v, vec3 cubeSize, vec3 cubePos ) {
26
- vec3 nDir = normalize( v );
27
- vec3 rbmax = ( .5 * cubeSize + cubePos - vWorldPosition ) / nDir;
28
- vec3 rbmin = ( -.5 * cubeSize + cubePos - vWorldPosition ) / nDir;
29
- vec3 rbminmax;
30
- rbminmax.x = ( nDir.x > 0. ) ? rbmax.x : rbmin.x;
31
- rbminmax.y = ( nDir.y > 0. ) ? rbmax.y : rbmin.y;
32
- rbminmax.z = ( nDir.z > 0. ) ? rbmax.z : rbmin.z;
33
- float correction = min( min( rbminmax.x, rbminmax.y ), rbminmax.z );
34
- vec3 boxIntersection = vWorldPosition + nDir * correction;
35
- return boxIntersection - cubePos;
36
- }
37
- #endif
38
- `; // will be inserted after "vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );"
39
-
40
- const getIBLIrradiance_patch =
41
- /* glsl */
42
- `
43
- #ifdef BOX_PROJECTED_ENV_MAP
44
- worldNormal = parallaxCorrectNormal( worldNormal, envMapSize, envMapPosition );
45
- #endif
46
- `; // will be inserted after "reflectVec = inverseTransformDirection( reflectVec, viewMatrix );"
47
-
48
- const getIBLRadiance_patch =
49
- /* glsl */
50
- `
51
- #ifdef BOX_PROJECTED_ENV_MAP
52
- reflectVec = parallaxCorrectNormal( reflectVec, envMapSize, envMapPosition );
53
- #endif
54
- `;
55
-
56
- function boxProjectedEnvMap(shader, envMapPosition, envMapSize) {
57
- shader.defines.BOX_PROJECTED_ENV_MAP = true; // uniforms
58
-
59
- shader.uniforms.envMapPosition = {
60
- value: envMapPosition
61
- };
62
- shader.uniforms.envMapSize = {
63
- value: envMapSize
64
- }; // vertex shader
65
-
66
- shader.vertexShader = `
67
- varying vec3 vWorldPosition;
68
- ${shader.vertexShader.replace('#include <worldpos_vertex>', worldposReplace)}`; // fragment shader
69
-
70
- shader.fragmentShader = `
71
- ${boxProjectDefinitions}
72
- ${shader.fragmentShader.replace('#include <envmap_physical_pars_fragment>', THREE.ShaderChunk.envmap_physical_pars_fragment).replace('vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );', `vec3 worldNormal = inverseTransformDirection( normal, viewMatrix );
73
- ${getIBLIrradiance_patch}
74
- `).replace('reflectVec = inverseTransformDirection( reflectVec, viewMatrix );', `reflectVec = inverseTransformDirection( reflectVec, viewMatrix );
75
- ${getIBLRadiance_patch}
76
- `)}`;
77
- }
78
-
79
- function useBoxProjectedEnv(position = new THREE.Vector3(), size = new THREE.Vector3()) {
80
- const [config] = React.useState(() => ({
81
- position: new THREE.Vector3(),
82
- size: new THREE.Vector3()
83
- }));
84
- applyProps(config, {
85
- position,
86
- size
87
- });
88
- const ref = React.useRef(null);
89
- const spread = React.useMemo(() => ({
90
- ref,
91
- onBeforeCompile: shader => boxProjectedEnvMap(shader, config.position, config.size),
92
- customProgramCacheKey: () => JSON.stringify(config.position.toArray()) + JSON.stringify(config.size.toArray())
93
- }), [...config.position.toArray(), ...config.size.toArray()]);
94
- React.useLayoutEffect(() => void (ref.current.needsUpdate = true), [config]);
95
- return spread;
96
- }
97
-
98
- export { useBoxProjectedEnv };