@react-three/drei 8.10.6 → 8.11.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 +27 -17
- package/core/Instances.cjs.js +1 -1
- package/core/Instances.js +5 -11
- package/core/PointMaterial.cjs.js +1 -1
- package/core/PointMaterial.d.ts +3 -7
- package/core/PointMaterial.js +14 -32
- package/core/Points.cjs.js +1 -1
- package/core/Points.d.ts +3 -3
- package/core/Points.js +11 -30
- package/core/index.cjs.js +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.js +1 -0
- package/core/useBoxProjectedEnv.cjs.js +1 -0
- package/core/useBoxProjectedEnv.d.ts +8 -0
- package/core/useBoxProjectedEnv.js +98 -0
- package/index.cjs.js +1 -1
- package/index.js +1 -0
- package/native/index.cjs.js +1 -1
- package/native/index.js +1 -0
- package/package.json +1 -1
- package/web/index.cjs.js +1 -1
- package/web/index.js +1 -0
package/README.md
CHANGED
|
@@ -99,6 +99,7 @@ The `native` route of the library **does not** export `Html` or `Loader`. The de
|
|
|
99
99
|
<li><a href="#useaspect">useAspect</a></li>
|
|
100
100
|
<li><a href="#usecursor">useCursor</a></li>
|
|
101
101
|
<li><a href="#useintersect">useIntersect</a></li>
|
|
102
|
+
<li><a href="#useboxprojectedenv">useBoxProjectedEnv</a></li>
|
|
102
103
|
</ul>
|
|
103
104
|
<li><a href="#loading">Loaders</a></li>
|
|
104
105
|
<ul>
|
|
@@ -732,7 +733,7 @@ This material makes your geometry distort following simplex noise.
|
|
|
732
733
|
|
|
733
734
|
#### PointMaterial
|
|
734
735
|
|
|
735
|
-
|
|
736
|
+
Antialiased round dots. It takes the same props as regular THREE.PointsMaterial
|
|
736
737
|
|
|
737
738
|
```jsx
|
|
738
739
|
<points>
|
|
@@ -1103,6 +1104,30 @@ const ref = useIntersect((visible) => console.log('object is visible', visible))
|
|
|
1103
1104
|
return <mesh ref={ref} />
|
|
1104
1105
|
```
|
|
1105
1106
|
|
|
1107
|
+
#### useBoxProjectedEnv
|
|
1108
|
+
|
|
1109
|
+
<p>
|
|
1110
|
+
<a href="https://codesandbox.io/s/s006f"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/s006f/screenshot.png" alt="Demo"/></a>
|
|
1111
|
+
</p>
|
|
1112
|
+
|
|
1113
|
+
The cheapest possible way of getting reflections in threejs. This will box-project the current environment map onto a plane. It returns an object that you need to spread over its material. The spread object contains a ref, onBeforeCompile and customProgramCacheKey. If you combine it with drei/CubeCamera you can "film" a single frame of the environment and feed it to the material, thereby getting realistic reflections at no cost. Align it with the position and scale properties.
|
|
1114
|
+
|
|
1115
|
+
```jsx
|
|
1116
|
+
const projection = useBoxProjectedEnv(
|
|
1117
|
+
[0, 0, 0], // Position
|
|
1118
|
+
[1, 1, 1] // Scale
|
|
1119
|
+
)
|
|
1120
|
+
|
|
1121
|
+
<CubeCamera frames={1}>
|
|
1122
|
+
{(texture) => (
|
|
1123
|
+
<mesh>
|
|
1124
|
+
<planeGeometry />
|
|
1125
|
+
<meshStandardMaterial envMap={texture} {...projection} />
|
|
1126
|
+
</mesh>
|
|
1127
|
+
)}
|
|
1128
|
+
</CubeCamera>
|
|
1129
|
+
```
|
|
1130
|
+
|
|
1106
1131
|
# Loading
|
|
1107
1132
|
|
|
1108
1133
|
#### Loader
|
|
@@ -1338,27 +1363,12 @@ A wrapper around [THREE.Points](https://threejs.org/docs/index.html?q=points#api
|
|
|
1338
1363
|
limit={1000} // Optional: max amount of items (for calculating buffer size)
|
|
1339
1364
|
range={1000} // Optional: draw-range
|
|
1340
1365
|
>
|
|
1341
|
-
<pointsMaterial />
|
|
1366
|
+
<pointsMaterial vertexColors />
|
|
1342
1367
|
<Point position={[1, 2, 3]} color="red" onClick={onClick} onPointerOver={onPointerOver} ... />
|
|
1343
1368
|
// As many as you want, make them conditional, mount/unmount them, lazy load them, etc ...
|
|
1344
1369
|
</Points>
|
|
1345
1370
|
```
|
|
1346
1371
|
|
|
1347
|
-
If you have a material that supports vertex colors (like drei/PointMaterial) you can have individual colors!
|
|
1348
|
-
|
|
1349
|
-
```jsx
|
|
1350
|
-
<Points>
|
|
1351
|
-
<PointMaterial />
|
|
1352
|
-
<Point color="hotpink" />
|
|
1353
|
-
```
|
|
1354
|
-
|
|
1355
|
-
Otherwise use any material you like:
|
|
1356
|
-
|
|
1357
|
-
```jsx
|
|
1358
|
-
<Points>
|
|
1359
|
-
<pointsMaterial vertexColors size={10} />
|
|
1360
|
-
```
|
|
1361
|
-
|
|
1362
1372
|
If you just want to use buffers for position, color and size, you can use the alternative API:
|
|
1363
1373
|
|
|
1364
1374
|
```jsx
|
package/core/Instances.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),n=require("@react-three/fiber"),a=require("react-merge-refs"),c=require("react-composer"),u=require("../helpers/Position.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),l=i(t),f=i(r),d=o(a),m=o(c);let y
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),n=require("@react-three/fiber"),a=require("react-merge-refs"),c=require("react-composer"),u=require("../helpers/Position.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),l=i(t),f=i(r),d=o(a),m=o(c);let p,y;const x=f.createContext(null),g=new l.Matrix4,b=new l.Matrix4,h=new l.Matrix4;new l.Color;const M=new l.Vector3,w=new l.Quaternion,E=new l.Vector3,j=f.forwardRef((({context:e,children:t,...r},a)=>{f.useMemo((()=>n.extend({Position:u.Position})),[]);const c=f.useRef(),{subscribe:o,getParent:i}=f.useContext(e||x);return f.useLayoutEffect((()=>o(c)),[]),f.createElement("position",s.default({instance:i(),instanceKey:c,ref:d.default([a,c])},r),t)})),v=f.forwardRef((({children:e,range:t,limit:r=1e3,frames:a=1/0,...c},u)=>{const[{context:o,instance:i}]=f.useState((()=>{const e=f.createContext(null);return{context:e,instance:f.forwardRef(((t,r)=>f.createElement(j,s.default({context:e},t,{ref:r}))))}})),m=f.useRef(null),[v,A]=f.useState([]),[[O,P]]=f.useState((()=>{const e=new Float32Array(16*r);for(p=0;p<r;p++)h.identity().toArray(e,16*p);return[e,new Float32Array([...new Array(3*r)].map((()=>1)))]}));f.useLayoutEffect((()=>{m.current.count=m.current.instanceMatrix.updateRange.count=m.current.instanceColor.updateRange.count=Math.min(r,void 0!==t?t:r,v.length)}),[v,t]),f.useEffect((()=>{m.current.instanceMatrix.needsUpdate=!0}));let q=0;n.useFrame((()=>{if(a===1/0||q<a){for(m.current.updateMatrix(),m.current.updateMatrixWorld(),g.copy(m.current.matrixWorld).invert(),p=0;p<v.length;p++)y=v[p].current,y.matrixWorld.decompose(M,w,E),b.compose(M,w,E).premultiply(g),b.toArray(O,16*p),m.current.instanceMatrix.needsUpdate=!0,y.color.toArray(P,3*p),m.current.instanceColor.needsUpdate=!0;q++}}));const C=f.useMemo((()=>({getParent:()=>m,subscribe:e=>(A((t=>[...t,e])),()=>A((t=>t.filter((t=>t.current!==e.current)))))})),[]);return f.createElement("instancedMesh",s.default({userData:{instances:v},matrixAutoUpdate:!1,ref:d.default([u,m]),args:[null,null,0],raycast:()=>null},c),f.createElement("instancedBufferAttribute",{attach:"instanceMatrix",count:O.length/16,array:O,itemSize:16,usage:l.DynamicDrawUsage}),f.createElement("instancedBufferAttribute",{attach:"instanceColor",count:P.length/3,array:P,itemSize:3,usage:l.DynamicDrawUsage}),"function"==typeof e?f.createElement(o.Provider,{value:C},e(i)):f.createElement(x.Provider,{value:C},e))}));exports.Instance=j,exports.Instances=v,exports.Merged=function({meshes:e,children:t,...r}){const n=Array.isArray(e);if(!n)for(const t of Object.keys(e))e[t].isMesh||delete e[t];return f.createElement(m.default,{components:(n?e:Object.values(e)).map((({geometry:e,material:t})=>f.createElement(v,s.default({key:e.uuid,geometry:e,material:t},r))))},(r=>n?t(...r):t(Object.keys(e).filter((t=>e[t].isMesh)).reduce(((e,t,n)=>({...e,[t]:r[n]})),{}))))};
|
package/core/Instances.js
CHANGED
|
@@ -11,7 +11,7 @@ const globalContext = /*#__PURE__*/React.createContext(null);
|
|
|
11
11
|
const parentMatrix = new THREE.Matrix4();
|
|
12
12
|
const instanceMatrix = new THREE.Matrix4();
|
|
13
13
|
const tempMatrix = new THREE.Matrix4();
|
|
14
|
-
|
|
14
|
+
new THREE.Color();
|
|
15
15
|
const translation = new THREE.Vector3();
|
|
16
16
|
const rotation = new THREE.Quaternion();
|
|
17
17
|
const scale = new THREE.Vector3();
|
|
@@ -85,16 +85,10 @@ const Instances = /*#__PURE__*/React.forwardRef(({
|
|
|
85
85
|
|
|
86
86
|
instanceRef.matrixWorld.decompose(translation, rotation, scale);
|
|
87
87
|
instanceMatrix.compose(translation, rotation, scale).premultiply(parentMatrix);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (!instanceRef.color.equals(color.fromArray(colors, i * 3))) {
|
|
95
|
-
instanceRef.color.toArray(colors, i * 3);
|
|
96
|
-
parentRef.current.instanceColor.needsUpdate = true;
|
|
97
|
-
}
|
|
88
|
+
instanceMatrix.toArray(matrices, i * 16);
|
|
89
|
+
parentRef.current.instanceMatrix.needsUpdate = true;
|
|
90
|
+
instanceRef.color.toArray(colors, i * 3);
|
|
91
|
+
parentRef.current.instanceColor.needsUpdate = true;
|
|
98
92
|
}
|
|
99
93
|
|
|
100
94
|
count++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react");function
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function n(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var o=a(e),l=n(t),u=n(r);class c extends l.PointsMaterial{constructor(e){super(e),this.onBeforeCompile=e=>{e.fragmentShader=e.fragmentShader.replace("#include <output_fragment>","\n #include <output_fragment>\n vec2 cxy = 2.0 * gl_PointCoord - 1.0;\n float r = dot(cxy, cxy);\n float delta = fwidth(r); \n float mask = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);\n gl_FragColor = vec4(gl_FragColor.rgb, mask * gl_FragColor.a );\n ")}}}const i=u.forwardRef(((e,t)=>{const[r]=u.useState((()=>new c(null)));return u.createElement("primitive",o.default({object:r,ref:t,attach:"material"},e))}));exports.PointMaterial=i,exports.PointMaterialImpl=c;
|
package/core/PointMaterial.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
declare type PointMaterialType = JSX.IntrinsicElements['
|
|
4
|
-
scale?: number;
|
|
5
|
-
};
|
|
3
|
+
declare type PointMaterialType = JSX.IntrinsicElements['pointsMaterial'];
|
|
6
4
|
declare global {
|
|
7
5
|
namespace JSX {
|
|
8
6
|
interface IntrinsicElements {
|
|
@@ -10,10 +8,8 @@ declare global {
|
|
|
10
8
|
}
|
|
11
9
|
}
|
|
12
10
|
}
|
|
13
|
-
export declare class PointMaterialImpl extends THREE.
|
|
14
|
-
constructor();
|
|
15
|
-
get scale(): any;
|
|
16
|
-
set scale(v: any);
|
|
11
|
+
export declare class PointMaterialImpl extends THREE.PointsMaterial {
|
|
12
|
+
constructor(props: any);
|
|
17
13
|
}
|
|
18
14
|
export declare const PointMaterial: React.ForwardRefExoticComponent<React.RefAttributes<unknown>>;
|
|
19
15
|
export {};
|
package/core/PointMaterial.js
CHANGED
|
@@ -2,43 +2,25 @@ import _extends from '@babel/runtime/helpers/esm/extends';
|
|
|
2
2
|
import * as THREE from 'three';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
|
|
5
|
-
class PointMaterialImpl extends THREE.
|
|
6
|
-
constructor() {
|
|
7
|
-
super(
|
|
8
|
-
transparent: true,
|
|
9
|
-
uniforms: {
|
|
10
|
-
size: {
|
|
11
|
-
value: 1
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
vertexShader: THREE.ShaderLib.points.vertexShader,
|
|
15
|
-
fragmentShader: `
|
|
16
|
-
varying vec3 vColor;
|
|
17
|
-
void main() {
|
|
18
|
-
vec2 cxy = 2.0 * gl_PointCoord - 1.0;
|
|
19
|
-
float r = dot(cxy, cxy);
|
|
20
|
-
float delta = fwidth(r);
|
|
21
|
-
vec3 color = vColor;
|
|
22
|
-
gl_FragColor = vec4(color, 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r));
|
|
5
|
+
class PointMaterialImpl extends THREE.PointsMaterial {
|
|
6
|
+
constructor(props) {
|
|
7
|
+
super(props);
|
|
23
8
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
set scale(v) {
|
|
36
|
-
this.uniforms.size.value = v;
|
|
9
|
+
this.onBeforeCompile = shader => {
|
|
10
|
+
shader.fragmentShader = shader.fragmentShader.replace('#include <output_fragment>', `
|
|
11
|
+
#include <output_fragment>
|
|
12
|
+
vec2 cxy = 2.0 * gl_PointCoord - 1.0;
|
|
13
|
+
float r = dot(cxy, cxy);
|
|
14
|
+
float delta = fwidth(r);
|
|
15
|
+
float mask = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);
|
|
16
|
+
gl_FragColor = vec4(gl_FragColor.rgb, mask * gl_FragColor.a );
|
|
17
|
+
`);
|
|
18
|
+
};
|
|
37
19
|
}
|
|
38
20
|
|
|
39
21
|
}
|
|
40
22
|
const PointMaterial = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
41
|
-
const [material] = React.useState(() => new PointMaterialImpl());
|
|
23
|
+
const [material] = React.useState(() => new PointMaterialImpl(null));
|
|
42
24
|
return /*#__PURE__*/React.createElement("primitive", _extends({
|
|
43
25
|
object: material,
|
|
44
26
|
ref: ref,
|
package/core/Points.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),a=require("@react-three/fiber"),n=require("react-merge-refs"),u=require("../helpers/Position.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),c=i(t),l=i(r),f=o(n);let d,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("three"),r=require("react"),a=require("@react-three/fiber"),n=require("react-merge-refs"),u=require("../helpers/Position.cjs.js");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),c=i(t),l=i(r),f=o(n);let d,b;const m=l.createContext(null),g=new c.Matrix4,y=new c.Vector3;new c.Color;const p=l.forwardRef((({children:e,range:t,limit:r=1e3,...n},u)=>{const o=l.useRef(null),[i,p]=l.useState([]),[[h,j,E]]=l.useState((()=>[new Float32Array(3*r),Float32Array.from({length:3*r},(()=>1)),Float32Array.from({length:r},(()=>1))]));l.useLayoutEffect((()=>{o.current.geometry.drawRange.count=Math.min(r,void 0!==t?t:r,i.length)}),[i,t]),l.useEffect((()=>{o.current.geometry.attributes.position.needsUpdate=!0})),a.useFrame((()=>{for(o.current.updateMatrix(),o.current.updateMatrixWorld(),g.copy(o.current.matrixWorld).invert(),d=0;d<i.length;d++)b=i[d].current,y.toArray(h,3*d),o.current.geometry.attributes.position.needsUpdate=!0,b.matrixWorldNeedsUpdate=!0,b.color.toArray(j,3*d),o.current.geometry.attributes.color.needsUpdate=!0,E.set([b.size],d),o.current.geometry.attributes.size.needsUpdate=!0}));const w=l.useMemo((()=>{const e={};for(d=0;d<i.length;d++){var t;Object.assign(e,null==(t=i[d].current)?void 0:t.__r3f.handlers)}return Object.keys(e).reduce(((e,t)=>({...e,[t]:e=>{var r,a,n;const u=null==(r=i[e.index])?void 0:r.current;return null==u||null==(a=u.__r3f)||null==(n=a.handlers)?void 0:n[t]({...e,object:u})}})),{})}),[e,i]),x=l.useMemo((()=>({subscribe:e=>(p((t=>[...t,e])),()=>p((t=>t.filter((t=>t.current!==e.current)))))})),[]);return l.createElement("points",s.default({matrixAutoUpdate:!1,ref:f.default([u,o])},w,n),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attachObject:["attributes","position"],count:h.length/3,array:h,itemSize:3,usage:c.DynamicDrawUsage}),l.createElement("bufferAttribute",{attachObject:["attributes","color"],count:j.length/3,array:j,itemSize:3,usage:c.DynamicDrawUsage}),l.createElement("bufferAttribute",{attachObject:["attributes","size"],count:E.length,array:E,itemSize:1,usage:c.DynamicDrawUsage})),l.createElement(m.Provider,{value:x},e))})),h=l.forwardRef((({children:e,...t},r)=>{l.useMemo((()=>a.extend({Position:u.Position})),[]);const n=l.useRef(),{subscribe:o}=l.useContext(m);return l.useLayoutEffect((()=>o(n)),[]),l.createElement("position",s.default({ref:f.default([r,n])},t),e)})),j=l.forwardRef((({children:e,positions:t,colors:r,sizes:n,stride:u=3,...o},i)=>{const d=l.useRef(null);return a.useFrame((()=>{const e=d.current.geometry.attributes;e.position.needsUpdate=!0,r&&(e.color.needsUpdate=!0),n&&(e.size.needsUpdate=!0)})),l.createElement("points",s.default({ref:f.default([i,d])},o),l.createElement("bufferGeometry",null,l.createElement("bufferAttribute",{attachObject:["attributes","position"],count:t.length/u,array:t,itemSize:u,usage:c.DynamicDrawUsage}),r&&l.createElement("bufferAttribute",{attachObject:["attributes","color"],count:r.length/u,array:r,itemSize:3,usage:c.DynamicDrawUsage}),n&&l.createElement("bufferAttribute",{attachObject:["attributes","size"],count:n.length/u,array:n,itemSize:1,usage:c.DynamicDrawUsage})),e)})),E=l.forwardRef(((e,t)=>e.positions instanceof Float32Array?l.createElement(j,s.default({},e,{ref:t})):l.createElement(p,s.default({},e,{ref:t}))));exports.Point=h,exports.Points=E,exports.PointsBuffer=j;
|
package/core/Points.d.ts
CHANGED
|
@@ -5,12 +5,12 @@ declare type PointsInstancesProps = JSX.IntrinsicElements['points'] & {
|
|
|
5
5
|
limit?: number;
|
|
6
6
|
};
|
|
7
7
|
export declare const Point: React.ForwardRefExoticComponent<React.RefAttributes<unknown>>;
|
|
8
|
-
declare type PointsBuffersProps =
|
|
8
|
+
declare type PointsBuffersProps = JSX.IntrinsicElements['points'] & {
|
|
9
9
|
positions: Float32Array;
|
|
10
10
|
colors?: Float32Array;
|
|
11
11
|
sizes?: Float32Array;
|
|
12
12
|
stride?: 2 | 3;
|
|
13
13
|
};
|
|
14
|
-
export declare const PointsBuffer: React.ForwardRefExoticComponent<Pick<PointsBuffersProps, "visible" | "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "updateMorphTargets" | "colors" | "isPoints" | "positions" | "sizes" | "stride"> & React.RefAttributes<THREE.Points<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
|
|
15
|
-
export declare const Points: React.ForwardRefExoticComponent<Pick<PointsInstancesProps | PointsBuffersProps, "visible" | "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "onClick" | "onContextMenu" | "onDoubleClick" | "onPointerDown" | "onPointerMove" | "onPointerUp" | "onPointerCancel" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOut" | "onWheel" | "onPointerMissed" | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "updateMorphTargets" | "isPoints"> & React.RefAttributes<THREE.Points<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
|
|
14
|
+
export declare const PointsBuffer: React.ForwardRefExoticComponent<Pick<PointsBuffersProps, "visible" | "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "updateMorphTargets" | "colors" | "isPoints" | "positions" | "sizes" | "stride"> & React.RefAttributes<THREE.Points<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
|
|
15
|
+
export declare const Points: React.ForwardRefExoticComponent<Pick<PointsInstancesProps | PointsBuffersProps, "visible" | "attach" | "attachArray" | "attachObject" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "onClick" | "onContextMenu" | "onDoubleClick" | "onPointerDown" | "onPointerMove" | "onPointerUp" | "onPointerCancel" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOut" | "onWheel" | "onPointerMissed" | "material" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "updateMorphTargets" | "isPoints"> & React.RefAttributes<THREE.Points<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>>;
|
|
16
16
|
export {};
|
package/core/Points.js
CHANGED
|
@@ -9,7 +9,7 @@ let i, positionRef;
|
|
|
9
9
|
const context = /*#__PURE__*/React.createContext(null);
|
|
10
10
|
const parentMatrix = new THREE.Matrix4();
|
|
11
11
|
const position = new THREE.Vector3();
|
|
12
|
-
|
|
12
|
+
new THREE.Color();
|
|
13
13
|
/**
|
|
14
14
|
* Instance implementation, relies on react + context to update the attributes based on the children of this component
|
|
15
15
|
*/
|
|
@@ -41,23 +41,13 @@ const PointsInstances = /*#__PURE__*/React.forwardRef(({
|
|
|
41
41
|
|
|
42
42
|
for (i = 0; i < refs.length; i++) {
|
|
43
43
|
positionRef = refs[i].current;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (!positionRef.color.equals(color.fromArray(colors, i * 3))) {
|
|
53
|
-
positionRef.color.toArray(colors, i * 3);
|
|
54
|
-
parentRef.current.geometry.attributes.color.needsUpdate = true;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (positionRef.size !== sizes[i]) {
|
|
58
|
-
sizes.set([positionRef.size], i);
|
|
59
|
-
parentRef.current.geometry.attributes.size.needsUpdate = true;
|
|
60
|
-
}
|
|
44
|
+
position.toArray(positions, i * 3);
|
|
45
|
+
parentRef.current.geometry.attributes.position.needsUpdate = true;
|
|
46
|
+
positionRef.matrixWorldNeedsUpdate = true;
|
|
47
|
+
positionRef.color.toArray(colors, i * 3);
|
|
48
|
+
parentRef.current.geometry.attributes.color.needsUpdate = true;
|
|
49
|
+
sizes.set([positionRef.size], i);
|
|
50
|
+
parentRef.current.geometry.attributes.size.needsUpdate = true;
|
|
61
51
|
}
|
|
62
52
|
});
|
|
63
53
|
const events = React.useMemo(() => {
|
|
@@ -143,17 +133,10 @@ const PointsBuffer = /*#__PURE__*/React.forwardRef(({
|
|
|
143
133
|
useFrame(() => {
|
|
144
134
|
const attr = pointsRef.current.geometry.attributes;
|
|
145
135
|
attr.position.needsUpdate = true;
|
|
146
|
-
|
|
147
|
-
if (
|
|
148
|
-
attr.color.needsUpdate = true;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (sizes) {
|
|
152
|
-
attr.size.needsUpdate = true;
|
|
153
|
-
}
|
|
136
|
+
if (colors) attr.color.needsUpdate = true;
|
|
137
|
+
if (sizes) attr.size.needsUpdate = true;
|
|
154
138
|
});
|
|
155
139
|
return /*#__PURE__*/React.createElement("points", _extends({
|
|
156
|
-
matrixAutoUpdate: false,
|
|
157
140
|
ref: mergeRefs([forwardedRef, pointsRef])
|
|
158
141
|
}, props), /*#__PURE__*/React.createElement("bufferGeometry", null, /*#__PURE__*/React.createElement("bufferAttribute", {
|
|
159
142
|
attachObject: ['attributes', 'position'],
|
|
@@ -180,9 +163,7 @@ const Points = /*#__PURE__*/React.forwardRef((props, forwardedRef) => {
|
|
|
180
163
|
return /*#__PURE__*/React.createElement(PointsBuffer, _extends({}, props, {
|
|
181
164
|
ref: forwardedRef
|
|
182
165
|
}));
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return /*#__PURE__*/React.createElement(PointsInstances, _extends({}, props, {
|
|
166
|
+
} else return /*#__PURE__*/React.createElement(PointsInstances, _extends({}, props, {
|
|
186
167
|
ref: forwardedRef
|
|
187
168
|
}));
|
|
188
169
|
});
|
package/core/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./Billboard.cjs.js"),r=require("./QuadraticBezierLine.cjs.js"),s=require("./CubicBezierLine.cjs.js"),t=require("./Line.cjs.js"),o=require("./PositionalAudio.cjs.js"),i=require("./Text.cjs.js"),u=require("./Effects.cjs.js"),a=require("./GradientTexture.cjs.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./Billboard.cjs.js"),r=require("./QuadraticBezierLine.cjs.js"),s=require("./CubicBezierLine.cjs.js"),t=require("./Line.cjs.js"),o=require("./PositionalAudio.cjs.js"),i=require("./Text.cjs.js"),u=require("./Effects.cjs.js"),a=require("./GradientTexture.cjs.js"),j=require("./Image.cjs.js"),c=require("./Edges.cjs.js"),n=require("./OrthographicCamera.cjs.js"),p=require("./PerspectiveCamera.cjs.js"),x=require("./CubeCamera.cjs.js"),l=require("./DeviceOrientationControls.cjs.js"),d=require("./FlyControls.cjs.js"),q=require("./MapControls.cjs.js"),C=require("./OrbitControls.cjs.js"),h=require("./TrackballControls.cjs.js"),m=require("./ArcballControls.cjs.js"),B=require("./TransformControls.cjs.js"),P=require("./PointerLockControls.cjs.js"),b=require("./FirstPersonControls.cjs.js"),M=require("./GizmoHelper.cjs.js"),S=require("./GizmoViewcube.cjs.js"),f=require("./GizmoViewport.cjs.js"),T=require("./useCubeTexture.cjs.js"),g=require("./useFBX.cjs.js"),v=require("./useGLTF.cjs.js"),L=require("./useProgress.cjs.js"),A=require("./useTexture.cjs.js"),G=require("./useKTX2.cjs.js"),k=require("./Stats.cjs.js"),D=require("./useDepthBuffer.cjs.js"),F=require("./useAspect.cjs.js"),w=require("./useCamera.cjs.js"),z=require("./useDetectGPU.cjs.js"),E=require("./useHelper.cjs.js"),I=require("./useBVH.cjs.js"),O=require("./useContextBridge.cjs.js"),R=require("./useAnimations.cjs.js"),y=require("./useFBO.cjs.js"),H=require("./useIntersect.cjs.js"),V=require("./useBoxProjectedEnv.cjs.js"),Q=require("./CurveModifier.cjs.js"),X=require("./MeshDistortMaterial.cjs.js"),K=require("./MeshWobbleMaterial.cjs.js"),W=require("./MeshReflectorMaterial.cjs.js"),N=require("./PointMaterial.cjs.js"),U=require("./shaderMaterial.cjs.js"),_=require("./softShadows.cjs.js"),J=require("./shapes.cjs.js"),Y=require("./RoundedBox.cjs.js"),Z=require("./ScreenQuad.cjs.js"),$=require("./Center.cjs.js"),ee=require("./Bounds.cjs.js"),re=require("./CameraShake.cjs.js"),se=require("./Float.cjs.js"),te=require("./Stage.cjs.js"),oe=require("./Backdrop.cjs.js"),ie=require("./Shadow.cjs.js"),ue=require("./ContactShadows.cjs.js"),ae=require("./Reflector.cjs.js"),je=require("./SpotLight.cjs.js"),ce=require("./Environment.cjs.js"),ne=require("./Sky.cjs.js"),pe=require("./Stars.cjs.js"),xe=require("./Cloud.cjs.js"),le=require("./useMatcapTexture.cjs.js"),de=require("./useNormalTexture.cjs.js"),qe=require("./Points.cjs.js"),Ce=require("./Instances.cjs.js"),he=require("./Segments.cjs.js"),me=require("./Detailed.cjs.js"),Be=require("./Preload.cjs.js"),Pe=require("./BakeShadows.cjs.js"),be=require("./meshBounds.cjs.js"),Me=require("./AdaptiveDpr.cjs.js"),Se=require("./AdaptiveEvents.cjs.js");require("@babel/runtime/helpers/extends"),require("react"),require("@react-three/fiber"),require("react-merge-refs"),require("three"),require("three-stdlib"),require("troika-three-text"),require("suspend-react"),require("lodash.omit"),require("lodash.pick"),require("zustand"),require("stats.js"),require("../helpers/useEffectfulState.cjs.js"),require("detect-gpu"),require("three-mesh-bvh"),require("../materials/BlurPass.cjs.js"),require("../materials/ConvolutionMaterial.cjs.js"),require("../materials/MeshReflectorMaterial.cjs.js"),require("../helpers/environment-assets.cjs.js"),require("../materials/SpotLightMaterial.cjs.js"),require("../helpers/Position.cjs.js"),require("react-composer"),exports.Billboard=e.Billboard,exports.QuadraticBezierLine=r.QuadraticBezierLine,exports.CubicBezierLine=s.CubicBezierLine,exports.Line=t.Line,exports.PositionalAudio=o.PositionalAudio,exports.Text=i.Text,exports.Effects=u.Effects,exports.isWebGL2Available=u.isWebGL2Available,exports.GradientTexture=a.GradientTexture,exports.Image=j.Image,exports.Edges=c.Edges,exports.OrthographicCamera=n.OrthographicCamera,exports.PerspectiveCamera=p.PerspectiveCamera,exports.CubeCamera=x.CubeCamera,exports.DeviceOrientationControls=l.DeviceOrientationControls,exports.FlyControls=d.FlyControls,exports.MapControls=q.MapControls,exports.OrbitControls=C.OrbitControls,exports.TrackballControls=h.TrackballControls,exports.ArcballControls=m.ArcballControls,exports.TransformControls=B.TransformControls,exports.PointerLockControls=P.PointerLockControls,exports.FirstPersonControls=b.FirstPersonControls,exports.GizmoHelper=M.GizmoHelper,exports.useGizmoContext=M.useGizmoContext,exports.GizmoViewcube=S.GizmoViewcube,exports.GizmoViewport=f.GizmoViewport,exports.useCubeTexture=T.useCubeTexture,exports.useFBX=g.useFBX,exports.useGLTF=v.useGLTF,exports.useProgress=L.useProgress,exports.IsObject=A.IsObject,exports.useTexture=A.useTexture,exports.useKTX2=G.useKTX2,exports.Stats=k.Stats,exports.useDepthBuffer=D.useDepthBuffer,exports.useAspect=F.useAspect,exports.useCamera=w.useCamera,exports.useDetectGPU=z.useDetectGPU,exports.useHelper=E.useHelper,exports.useBVH=I.useBVH,exports.useContextBridge=O.useContextBridge,exports.useAnimations=R.useAnimations,exports.useFBO=y.useFBO,exports.useIntersect=H.useIntersect,exports.useBoxProjectedEnv=V.useBoxProjectedEnv,exports.CurveModifier=Q.CurveModifier,exports.MeshDistortMaterial=X.MeshDistortMaterial,exports.MeshWobbleMaterial=K.MeshWobbleMaterial,exports.MeshReflectorMaterial=W.MeshReflectorMaterial,exports.PointMaterial=N.PointMaterial,exports.PointMaterialImpl=N.PointMaterialImpl,exports.shaderMaterial=U.shaderMaterial,exports.softShadows=_.softShadows,exports.Box=J.Box,exports.Circle=J.Circle,exports.Cone=J.Cone,exports.Cylinder=J.Cylinder,exports.Dodecahedron=J.Dodecahedron,exports.Extrude=J.Extrude,exports.Icosahedron=J.Icosahedron,exports.Lathe=J.Lathe,exports.Octahedron=J.Octahedron,exports.Plane=J.Plane,exports.Polyhedron=J.Polyhedron,exports.Ring=J.Ring,exports.Sphere=J.Sphere,exports.Tetrahedron=J.Tetrahedron,exports.Torus=J.Torus,exports.TorusKnot=J.TorusKnot,exports.Tube=J.Tube,exports.RoundedBox=Y.RoundedBox,exports.ScreenQuad=Z.ScreenQuad,exports.Center=$.Center,exports.Bounds=ee.Bounds,exports.useBounds=ee.useBounds,exports.CameraShake=re.CameraShake,exports.Float=se.Float,exports.Stage=te.Stage,exports.Backdrop=oe.Backdrop,exports.Shadow=ie.Shadow,exports.ContactShadows=ue.ContactShadows,exports.Reflector=ae.Reflector,exports.SpotLight=je.SpotLight,exports.Environment=ce.Environment,exports.Sky=ne.Sky,exports.calcPosFromAngles=ne.calcPosFromAngles,exports.Stars=pe.Stars,exports.Cloud=xe.Cloud,exports.useMatcapTexture=le.useMatcapTexture,exports.useNormalTexture=de.useNormalTexture,exports.Point=qe.Point,exports.Points=qe.Points,exports.PointsBuffer=qe.PointsBuffer,exports.Instance=Ce.Instance,exports.Instances=Ce.Instances,exports.Merged=Ce.Merged,exports.Segment=he.Segment,exports.Segments=he.Segments,exports.Detailed=me.Detailed,exports.Preload=Be.Preload,exports.BakeShadows=Pe.BakeShadows,exports.meshBounds=be.meshBounds,exports.AdaptiveDpr=Me.AdaptiveDpr,exports.AdaptiveEvents=Se.AdaptiveEvents;
|
package/core/index.d.ts
CHANGED
|
@@ -40,6 +40,7 @@ export * from './useContextBridge';
|
|
|
40
40
|
export * from './useAnimations';
|
|
41
41
|
export * from './useFBO';
|
|
42
42
|
export * from './useIntersect';
|
|
43
|
+
export * from './useBoxProjectedEnv';
|
|
43
44
|
export * from './CurveModifier';
|
|
44
45
|
export * from './MeshDistortMaterial';
|
|
45
46
|
export * from './MeshWobbleMaterial';
|
package/core/index.js
CHANGED
|
@@ -40,6 +40,7 @@ export { useContextBridge } from './useContextBridge.js';
|
|
|
40
40
|
export { useAnimations } from './useAnimations.js';
|
|
41
41
|
export { useFBO } from './useFBO.js';
|
|
42
42
|
export { useIntersect } from './useIntersect.js';
|
|
43
|
+
export { useBoxProjectedEnv } from './useBoxProjectedEnv.js';
|
|
43
44
|
export { CurveModifier } from './CurveModifier.js';
|
|
44
45
|
export { MeshDistortMaterial } from './MeshDistortMaterial.js';
|
|
45
46
|
export { MeshWobbleMaterial } from './MeshWobbleMaterial.js';
|
|
@@ -0,0 +1 @@
|
|
|
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};
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
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 };
|