@react-three/drei 9.74.1 → 9.74.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.
- package/README.md +8 -2
- package/core/Hud.cjs.js +1 -1
- package/core/Hud.js +5 -2
- package/core/MeshPortalMaterial.cjs.js +1 -1
- package/core/MeshPortalMaterial.d.ts +22 -25
- package/core/MeshPortalMaterial.js +312 -10
- package/core/RenderTexture.cjs.js +1 -1
- package/core/RenderTexture.js +3 -1
- package/index.cjs.js +1 -1
- package/package.json +1 -1
- package/web/View.cjs.js +1 -1
- package/web/View.js +3 -1
package/README.md
CHANGED
|
@@ -3333,7 +3333,7 @@ export type PortalProps = JSX.IntrinsicElements['mesh'] & { blur?: number }
|
|
|
3333
3333
|
|
|
3334
3334
|
A material that creates a portal into another scene. It is drawn onto the geometry of the mesh that it is applied to.
|
|
3335
3335
|
|
|
3336
|
-
|
|
3336
|
+
```jsx
|
|
3337
3337
|
<mesh {...props}>
|
|
3338
3338
|
<planeGeometry />
|
|
3339
3339
|
<MeshPortalMaterial>
|
|
@@ -3344,6 +3344,12 @@ A material that creates a portal into another scene. It is drawn onto the geomet
|
|
|
3344
3344
|
</mesh>
|
|
3345
3345
|
```
|
|
3346
3346
|
|
|
3347
|
+
You can optionally fade or blur the edges of the portal by providing a `blur` prop, do not forget to make the material transparent in that case.
|
|
3348
|
+
|
|
3349
|
+
```jsx
|
|
3350
|
+
<MeshPortalMaterial transparent blur={0.5}>
|
|
3351
|
+
```
|
|
3352
|
+
|
|
3347
3353
|
# Staging
|
|
3348
3354
|
|
|
3349
3355
|
#### Center
|
|
@@ -3378,7 +3384,7 @@ export type Props = JSX.IntrinsicElements['group'] & {
|
|
|
3378
3384
|
/** Callback, fires in the useLayoutEffect phase, after measurement */
|
|
3379
3385
|
onCentered?: (props: OnCenterCallbackProps) => void
|
|
3380
3386
|
}
|
|
3381
|
-
|
|
3387
|
+
```
|
|
3382
3388
|
|
|
3383
3389
|
```tsx
|
|
3384
3390
|
type OnCenterCallbackProps = {
|
package/core/Hud.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber");function n(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var a=n(e),u=n(r);function c({defaultScene:e,defaultCamera:r,renderPriority:n=1}){const{gl:a,scene:c,camera:l}=t.useThree();let o;return t.useFrame((()=>{o=a.autoClear,1===n&&(a.autoClear=!0,a.render(e,r)),a.autoClear=!1,a.clearDepth(),a.render(c,l),a.autoClear=o}),n),u.createElement(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber");function n(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var a=n(e),u=n(r);function c({defaultScene:e,defaultCamera:r,renderPriority:n=1}){const{gl:a,scene:c,camera:l}=t.useThree();let o;return t.useFrame((()=>{o=a.autoClear,1===n&&(a.autoClear=!0,a.render(e,r)),a.autoClear=!1,a.clearDepth(),a.render(c,l),a.autoClear=o}),n),u.createElement("group",{onPointerOver:()=>null})}exports.Hud=function({children:e,renderPriority:r=1}){const{scene:n,camera:l}=t.useThree(),[o]=u.useState((()=>new a.Scene));return u.createElement(u.Fragment,null,t.createPortal(u.createElement(u.Fragment,null,e,u.createElement(c,{defaultScene:n,defaultCamera:l,renderPriority:r})),o,{events:{priority:r+1}}))};
|
package/core/Hud.js
CHANGED
|
@@ -28,8 +28,11 @@ function RenderHud({
|
|
|
28
28
|
gl.render(scene, camera); // Restore default
|
|
29
29
|
|
|
30
30
|
gl.autoClear = oldCLear;
|
|
31
|
-
}, renderPriority);
|
|
32
|
-
|
|
31
|
+
}, renderPriority); // Without an element that receives pointer events state.pointer will always be 0/0
|
|
32
|
+
|
|
33
|
+
return /*#__PURE__*/React.createElement("group", {
|
|
34
|
+
onPointerOver: () => null
|
|
35
|
+
});
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
function Hud({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),t=require("react"),n=require("@react-three/fiber"),a=require("./RenderTexture.cjs.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),t=require("react"),n=require("@react-three/fiber"),a=require("./useFBO.cjs.js"),i=require("./RenderTexture.cjs.js"),l=require("./shaderMaterial.cjs.js"),o=require("three-stdlib");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function s(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var v=u(e),m=s(r),d=s(t);const f=l.shaderMaterial({blur:0,map:null,sdf:null,size:0,resolution:new m.Vector2},"varying vec2 vUv;\n void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n vUv = uv;\n }","uniform sampler2D sdf;\n uniform sampler2D map;\n uniform float blur;\n uniform float size;\n uniform float time;\n uniform vec2 resolution;\n varying vec2 vUv;\n #include <packing>\n void main() {\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n vec4 t = texture2D(map, uv);\n float k = blur;\n float d = texture2D(sdf, vUv).r/size;\n float alpha = 1.0 - smoothstep(0.0, 1.0, clamp(d/k + 1.0, 0.0, 1.0));\n gl_FragColor = vec4(t.rgb, blur == 0.0 ? t.a : t.a * alpha);\n #include <tonemapping_fragment>\n #include <encodings_fragment>\n }"),c=d.forwardRef((({children:e,resolution:r=512,...t},l)=>{n.extend({PortalMaterialImpl:f});const o=d.useRef(null),u=d.useRef(null),{gl:s,size:c,events:x,viewport:g}=n.useThree(),F=a.useFBO(r,r),[h]=d.useState((()=>new m.MeshBasicMaterial));return d.useLayoutEffect((()=>{var e;let t=null==(e=o.current)?void 0:e.__r3f.parent;if(!t)return;const n=(new m.Box3).setFromBufferAttribute(t.geometry.attributes.position),a=new m.OrthographicCamera(n.min.x*(1+2/r),n.max.x*(1+2/r),n.max.y*(1+2/r),n.min.y*(1+2/r),.1,1e3);a.position.set(0,0,1),a.lookAt(0,0,0);const i=t.material;t.material=h,s.setRenderTarget(F),s.render(t,a);const l=p(r,r,s)(F.texture),u=new Float32Array(r*r);s.readRenderTargetPixels(l,0,0,r,r,u);let v=1/0;for(let e=0;e<u.length;e++)u[e]<v&&(v=u[e]);v=-v,o.current.size=v,o.current.sdf=l.texture,t.material=i,s.setRenderTarget(null)}),[r]),n.useFrame((()=>{var e;let r=null==(e=o.current)?void 0:e.__r3f.parent;r&&u.current.matrix.copy(r.matrixWorld)})),d.useImperativeHandle(l,(()=>o.current)),d.createElement("portalMaterialImpl",v.default({ref:o,resolution:[c.width*g.dpr,c.height*g.dpr],toneMapped:!1},t),d.createElement(i.RenderTexture,{attach:"map",compute:x.compute},d.createElement("group",{matrixAutoUpdate:!1,ref:u},e)))})),p=(e,r,t)=>{let n=new m.WebGLRenderTarget(e,r,{minFilter:m.LinearMipmapLinearFilter,magFilter:m.LinearFilter,type:m.FloatType,format:m.RedFormat,generateMipmaps:!0}),a=new m.WebGLRenderTarget(e,r,{minFilter:m.NearestFilter,magFilter:m.NearestFilter}),i=new m.WebGLRenderTarget(e,r,{minFilter:m.NearestFilter,magFilter:m.NearestFilter}),l=new m.WebGLRenderTarget(e,r,{minFilter:m.NearestFilter,magFilter:m.NearestFilter}),u=new m.WebGLRenderTarget(e,r,{minFilter:m.NearestFilter,magFilter:m.NearestFilter}),s=new m.WebGLRenderTarget(e,r,{minFilter:m.NearestFilter,magFilter:m.NearestFilter,type:m.FloatType,format:m.RedFormat}),v=new m.WebGLRenderTarget(e,r,{minFilter:m.NearestFilter,magFilter:m.NearestFilter,type:m.FloatType,format:m.RedFormat});const d=new o.FullScreenQuad(new m.ShaderMaterial({uniforms:{tex:{value:null}},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:"\n uniform sampler2D tex;\n varying vec2 vUv;\n #include <packing>\n void main() {\n gl_FragColor = pack2HalfToRGBA(vUv * (round(texture2D(tex, vUv).x)));\n }"})),f=new o.FullScreenQuad(new m.ShaderMaterial({uniforms:{tex:{value:null}},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:"\n uniform sampler2D tex;\n varying vec2 vUv;\n #include <packing>\n void main() {\n gl_FragColor = pack2HalfToRGBA(vUv * (1.0 - round(texture2D(tex, vUv).x)));\n }"})),c=new o.FullScreenQuad(new m.ShaderMaterial({uniforms:{tex:{value:null},offset:{value:0},level:{value:0},maxSteps:{value:0}},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:`\n varying vec2 vUv;\n uniform sampler2D tex;\n uniform float offset;\n uniform float level;\n uniform float maxSteps;\n #include <packing>\n void main() {\n float closestDist = 9999999.9;\n vec2 closestPos = vec2(0.0);\n for (float x = -1.0; x <= 1.0; x += 1.0) {\n for (float y = -1.0; y <= 1.0; y += 1.0) {\n vec2 voffset = vUv;\n voffset += vec2(x, y) * vec2(${1/e}, ${1/r}) * offset;\n vec2 pos = unpackRGBATo2Half(texture2D(tex, voffset));\n float dist = distance(pos.xy, vUv);\n if(pos.x != 0.0 && pos.y != 0.0 && dist < closestDist) {\n closestDist = dist;\n closestPos = pos;\n }\n }\n }\n gl_FragColor = pack2HalfToRGBA(closestPos);\n }`})),p=new o.FullScreenQuad(new m.ShaderMaterial({uniforms:{tex:{value:null},size:{value:new m.Vector2(e,r)}},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:"\n varying vec2 vUv;\n uniform sampler2D tex;\n uniform vec2 size;\n #include <packing>\n void main() {\n gl_FragColor = vec4(distance(size * unpackRGBATo2Half(texture2D(tex, vUv)), size * vUv), 0.0, 0.0, 0.0);\n }"})),x=new o.FullScreenQuad(new m.ShaderMaterial({uniforms:{inside:{value:v.texture},outside:{value:s.texture},tex:{value:null}},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:"\n varying vec2 vUv;\n uniform sampler2D inside;\n uniform sampler2D outside;\n uniform sampler2D tex;\n #include <packing>\n void main() {\n float i = texture2D(inside, vUv).x;\n float o =texture2D(outside, vUv).x;\n if (texture2D(tex, vUv).x == 0.0) {\n gl_FragColor = vec4(o, 0.0, 0.0, 0.0);\n } else {\n gl_FragColor = vec4(-i, 0.0, 0.0, 0.0);\n }\n }"}));return o=>{let g=n;o.minFilter=m.NearestFilter,o.magFilter=m.NearestFilter,d.material.uniforms.tex.value=o,t.setRenderTarget(a),d.render(t);const F=Math.ceil(Math.log(Math.max(e,r))/Math.log(2));let h=a,y=null;for(let e=0;e<F;e++){const r=Math.pow(2,F-e-1);y=h===a?l:a,c.material.uniforms.level.value=e,c.material.uniforms.maxSteps.value=F,c.material.uniforms.offset.value=r,c.material.uniforms.tex.value=h.texture,t.setRenderTarget(y),c.render(t),h=y}t.setRenderTarget(s),p.material.uniforms.tex.value=y.texture,p.render(t),f.material.uniforms.tex.value=o,t.setRenderTarget(i),f.render(t),h=i;for(let e=0;e<F;e++){const r=Math.pow(2,F-e-1);y=h===i?u:i,c.material.uniforms.level.value=e,c.material.uniforms.maxSteps.value=F,c.material.uniforms.offset.value=r,c.material.uniforms.tex.value=h.texture,t.setRenderTarget(y),c.render(t),h=y}return t.setRenderTarget(v),p.material.uniforms.tex.value=y.texture,p.render(t),t.setRenderTarget(g),x.material.uniforms.tex.value=o,x.render(t),t.setRenderTarget(null),g}};exports.MeshPortalMaterial=c;
|
|
@@ -1,34 +1,31 @@
|
|
|
1
1
|
import * as THREE from 'three';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { ReactThreeFiber } from '@react-three/fiber';
|
|
4
|
+
export declare type PortalMaterialType = ReactThreeFiber.ShaderMaterialProps & {
|
|
5
|
+
resolution: ReactThreeFiber.Vector2;
|
|
6
|
+
blur: number;
|
|
7
|
+
size: number;
|
|
8
|
+
sdf: THREE.Texture;
|
|
9
|
+
map: THREE.Texture;
|
|
10
|
+
};
|
|
4
11
|
declare global {
|
|
5
12
|
namespace JSX {
|
|
6
13
|
interface IntrinsicElements {
|
|
7
|
-
|
|
8
|
-
resolution: ReactThreeFiber.Vector2;
|
|
9
|
-
};
|
|
14
|
+
portalMaterialImpl: PortalMaterialType;
|
|
10
15
|
}
|
|
11
16
|
}
|
|
12
17
|
}
|
|
13
|
-
export declare type PortalProps = JSX.IntrinsicElements['
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
rotation?: ReactThreeFiber.Euler | undefined;
|
|
28
|
-
matrix?: ReactThreeFiber.Matrix4 | undefined;
|
|
29
|
-
quaternion?: ReactThreeFiber.Quaternion | undefined;
|
|
30
|
-
layers?: ReactThreeFiber.Layers | undefined;
|
|
31
|
-
dispose?: (() => void) | null | undefined;
|
|
32
|
-
} & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldAutoUpdate" | "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" | "getObjectsByProperty" | "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" | "isMesh" | "updateMorphTargets" | "getVertexPosition"> & React.RefAttributes<typeof THREE.ShaderMaterial & {
|
|
33
|
-
key: string;
|
|
34
|
-
}>>;
|
|
18
|
+
export declare type PortalProps = JSX.IntrinsicElements['portalMaterialImpl'] & {
|
|
19
|
+
blur?: number;
|
|
20
|
+
resolution?: number;
|
|
21
|
+
};
|
|
22
|
+
export declare const MeshPortalMaterial: React.ForwardRefExoticComponent<Pick<ReactThreeFiber.ExtendedColors<ReactThreeFiber.Overwrite<Partial<THREE.ShaderMaterial>, ReactThreeFiber.NodeProps<THREE.ShaderMaterial, [THREE.ShaderMaterialParameters]>>> & {
|
|
23
|
+
resolution: ReactThreeFiber.Vector2;
|
|
24
|
+
blur: number;
|
|
25
|
+
size: number;
|
|
26
|
+
sdf: THREE.Texture;
|
|
27
|
+
map: THREE.Texture;
|
|
28
|
+
} & {
|
|
29
|
+
blur?: number | undefined;
|
|
30
|
+
resolution?: number | undefined;
|
|
31
|
+
}, "attach" | "args" | "children" | "key" | "onUpdate" | "size" | "map" | keyof THREE.ShaderMaterial | "blur" | "resolution" | "sdf"> & React.RefAttributes<PortalMaterialType>>;
|
|
@@ -2,49 +2,98 @@ import _extends from '@babel/runtime/helpers/esm/extends';
|
|
|
2
2
|
import * as THREE from 'three';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import { extend, useThree, useFrame } from '@react-three/fiber';
|
|
5
|
+
import { useFBO } from './useFBO.js';
|
|
5
6
|
import { RenderTexture } from './RenderTexture.js';
|
|
6
7
|
import { shaderMaterial } from './shaderMaterial.js';
|
|
8
|
+
import { FullScreenQuad } from 'three-stdlib';
|
|
7
9
|
|
|
8
|
-
const
|
|
10
|
+
const PortalMaterialImpl = shaderMaterial({
|
|
11
|
+
blur: 0,
|
|
9
12
|
map: null,
|
|
13
|
+
sdf: null,
|
|
14
|
+
size: 0,
|
|
10
15
|
resolution: new THREE.Vector2()
|
|
11
|
-
}, `
|
|
16
|
+
}, `varying vec2 vUv;
|
|
17
|
+
void main() {
|
|
12
18
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
13
|
-
|
|
19
|
+
vUv = uv;
|
|
20
|
+
}`, `uniform sampler2D sdf;
|
|
21
|
+
uniform sampler2D map;
|
|
22
|
+
uniform float blur;
|
|
23
|
+
uniform float size;
|
|
24
|
+
uniform float time;
|
|
14
25
|
uniform vec2 resolution;
|
|
26
|
+
varying vec2 vUv;
|
|
27
|
+
#include <packing>
|
|
15
28
|
void main() {
|
|
16
29
|
vec2 uv = gl_FragCoord.xy / resolution.xy;
|
|
17
30
|
vec4 t = texture2D(map, uv);
|
|
18
|
-
|
|
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);
|
|
19
35
|
#include <tonemapping_fragment>
|
|
20
36
|
#include <encodings_fragment>
|
|
21
37
|
}`);
|
|
22
38
|
const MeshPortalMaterial = /*#__PURE__*/React.forwardRef(({
|
|
23
39
|
children,
|
|
40
|
+
resolution = 512,
|
|
24
41
|
...props
|
|
25
42
|
}, fref) => {
|
|
26
43
|
extend({
|
|
27
|
-
|
|
44
|
+
PortalMaterialImpl
|
|
28
45
|
});
|
|
29
46
|
const ref = React.useRef(null);
|
|
30
47
|
const group = React.useRef(null);
|
|
31
48
|
const {
|
|
49
|
+
gl,
|
|
32
50
|
size,
|
|
33
51
|
events,
|
|
34
52
|
viewport
|
|
35
53
|
} = useThree();
|
|
36
|
-
|
|
54
|
+
const maskRenderTarget = useFBO(resolution, resolution);
|
|
55
|
+
const [imageMaterial] = React.useState(() => new THREE.MeshBasicMaterial());
|
|
56
|
+
React.useLayoutEffect(() => {
|
|
37
57
|
var _ref$current;
|
|
38
58
|
|
|
39
|
-
let
|
|
59
|
+
let mask = (_ref$current = ref.current) == null ? void 0 : _ref$current.__r3f.parent;
|
|
60
|
+
if (!mask) return;
|
|
61
|
+
const boundingBox = new THREE.Box3().setFromBufferAttribute(mask.geometry.attributes.position);
|
|
62
|
+
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);
|
|
63
|
+
orthoCam.position.set(0, 0, 1);
|
|
64
|
+
orthoCam.lookAt(0, 0, 0);
|
|
65
|
+
const oldMaterial = mask.material;
|
|
66
|
+
mask.material = imageMaterial;
|
|
67
|
+
gl.setRenderTarget(maskRenderTarget);
|
|
68
|
+
gl.render(mask, orthoCam);
|
|
69
|
+
const sg = makeSDFGenerator(resolution, resolution, gl);
|
|
70
|
+
const sdf = sg(maskRenderTarget.texture);
|
|
71
|
+
const readSdf = new Float32Array(resolution * resolution);
|
|
72
|
+
gl.readRenderTargetPixels(sdf, 0, 0, resolution, resolution, readSdf); // Get smallest value in sdf
|
|
73
|
+
|
|
74
|
+
let min = Infinity;
|
|
75
|
+
|
|
76
|
+
for (let i = 0; i < readSdf.length; i++) {
|
|
77
|
+
if (readSdf[i] < min) min = readSdf[i];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
min = -min;
|
|
81
|
+
ref.current.size = min;
|
|
82
|
+
ref.current.sdf = sdf.texture;
|
|
83
|
+
mask.material = oldMaterial;
|
|
84
|
+
gl.setRenderTarget(null);
|
|
85
|
+
}, [resolution]);
|
|
86
|
+
useFrame(() => {
|
|
87
|
+
var _ref$current2;
|
|
88
|
+
|
|
89
|
+
let parent = (_ref$current2 = ref.current) == null ? void 0 : _ref$current2.__r3f.parent;
|
|
40
90
|
|
|
41
91
|
if (parent) {
|
|
42
92
|
group.current.matrix.copy(parent.matrixWorld);
|
|
43
93
|
}
|
|
44
94
|
});
|
|
45
95
|
React.useImperativeHandle(fref, () => ref.current);
|
|
46
|
-
return /*#__PURE__*/React.createElement("
|
|
47
|
-
// @ts-ignore
|
|
96
|
+
return /*#__PURE__*/React.createElement("portalMaterialImpl", _extends({
|
|
48
97
|
ref: ref,
|
|
49
98
|
resolution: [size.width * viewport.dpr, size.height * viewport.dpr],
|
|
50
99
|
toneMapped: false
|
|
@@ -52,10 +101,263 @@ const MeshPortalMaterial = /*#__PURE__*/React.forwardRef(({
|
|
|
52
101
|
attach: "map",
|
|
53
102
|
compute: events.compute
|
|
54
103
|
}, /*#__PURE__*/React.createElement("group", {
|
|
55
|
-
onPointerOver: () => null,
|
|
56
104
|
matrixAutoUpdate: false,
|
|
57
105
|
ref: group
|
|
58
106
|
}, children)));
|
|
59
107
|
});
|
|
60
108
|
|
|
109
|
+
const makeSDFGenerator = (clientWidth, clientHeight, renderer) => {
|
|
110
|
+
let finalTarget = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
|
|
111
|
+
minFilter: THREE.LinearMipmapLinearFilter,
|
|
112
|
+
magFilter: THREE.LinearFilter,
|
|
113
|
+
type: THREE.FloatType,
|
|
114
|
+
format: THREE.RedFormat,
|
|
115
|
+
generateMipmaps: true
|
|
116
|
+
});
|
|
117
|
+
let outsideRenderTarget = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
|
|
118
|
+
minFilter: THREE.NearestFilter,
|
|
119
|
+
magFilter: THREE.NearestFilter
|
|
120
|
+
});
|
|
121
|
+
let insideRenderTarget = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
|
|
122
|
+
minFilter: THREE.NearestFilter,
|
|
123
|
+
magFilter: THREE.NearestFilter
|
|
124
|
+
});
|
|
125
|
+
let outsideRenderTarget2 = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
|
|
126
|
+
minFilter: THREE.NearestFilter,
|
|
127
|
+
magFilter: THREE.NearestFilter
|
|
128
|
+
});
|
|
129
|
+
let insideRenderTarget2 = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
|
|
130
|
+
minFilter: THREE.NearestFilter,
|
|
131
|
+
magFilter: THREE.NearestFilter
|
|
132
|
+
});
|
|
133
|
+
let outsideRenderTargetFinal = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
|
|
134
|
+
minFilter: THREE.NearestFilter,
|
|
135
|
+
magFilter: THREE.NearestFilter,
|
|
136
|
+
type: THREE.FloatType,
|
|
137
|
+
format: THREE.RedFormat
|
|
138
|
+
});
|
|
139
|
+
let insideRenderTargetFinal = new THREE.WebGLRenderTarget(clientWidth, clientHeight, {
|
|
140
|
+
minFilter: THREE.NearestFilter,
|
|
141
|
+
magFilter: THREE.NearestFilter,
|
|
142
|
+
type: THREE.FloatType,
|
|
143
|
+
format: THREE.RedFormat
|
|
144
|
+
});
|
|
145
|
+
const uvRender = new FullScreenQuad(new THREE.ShaderMaterial({
|
|
146
|
+
uniforms: {
|
|
147
|
+
tex: {
|
|
148
|
+
value: null
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
vertexShader:
|
|
152
|
+
/*glsl*/
|
|
153
|
+
`
|
|
154
|
+
varying vec2 vUv;
|
|
155
|
+
void main() {
|
|
156
|
+
vUv = uv;
|
|
157
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
158
|
+
}`,
|
|
159
|
+
fragmentShader:
|
|
160
|
+
/*glsl*/
|
|
161
|
+
`
|
|
162
|
+
uniform sampler2D tex;
|
|
163
|
+
varying vec2 vUv;
|
|
164
|
+
#include <packing>
|
|
165
|
+
void main() {
|
|
166
|
+
gl_FragColor = pack2HalfToRGBA(vUv * (round(texture2D(tex, vUv).x)));
|
|
167
|
+
}`
|
|
168
|
+
}));
|
|
169
|
+
const uvRenderInside = new FullScreenQuad(new THREE.ShaderMaterial({
|
|
170
|
+
uniforms: {
|
|
171
|
+
tex: {
|
|
172
|
+
value: null
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
vertexShader:
|
|
176
|
+
/*glsl*/
|
|
177
|
+
`
|
|
178
|
+
varying vec2 vUv;
|
|
179
|
+
void main() {
|
|
180
|
+
vUv = uv;
|
|
181
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
182
|
+
}`,
|
|
183
|
+
fragmentShader:
|
|
184
|
+
/*glsl*/
|
|
185
|
+
`
|
|
186
|
+
uniform sampler2D tex;
|
|
187
|
+
varying vec2 vUv;
|
|
188
|
+
#include <packing>
|
|
189
|
+
void main() {
|
|
190
|
+
gl_FragColor = pack2HalfToRGBA(vUv * (1.0 - round(texture2D(tex, vUv).x)));
|
|
191
|
+
}`
|
|
192
|
+
}));
|
|
193
|
+
const jumpFloodRender = new FullScreenQuad(new THREE.ShaderMaterial({
|
|
194
|
+
uniforms: {
|
|
195
|
+
tex: {
|
|
196
|
+
value: null
|
|
197
|
+
},
|
|
198
|
+
offset: {
|
|
199
|
+
value: 0.0
|
|
200
|
+
},
|
|
201
|
+
level: {
|
|
202
|
+
value: 0.0
|
|
203
|
+
},
|
|
204
|
+
maxSteps: {
|
|
205
|
+
value: 0.0
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
vertexShader:
|
|
209
|
+
/*glsl*/
|
|
210
|
+
`
|
|
211
|
+
varying vec2 vUv;
|
|
212
|
+
void main() {
|
|
213
|
+
vUv = uv;
|
|
214
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
215
|
+
}`,
|
|
216
|
+
fragmentShader:
|
|
217
|
+
/*glsl*/
|
|
218
|
+
`
|
|
219
|
+
varying vec2 vUv;
|
|
220
|
+
uniform sampler2D tex;
|
|
221
|
+
uniform float offset;
|
|
222
|
+
uniform float level;
|
|
223
|
+
uniform float maxSteps;
|
|
224
|
+
#include <packing>
|
|
225
|
+
void main() {
|
|
226
|
+
float closestDist = 9999999.9;
|
|
227
|
+
vec2 closestPos = vec2(0.0);
|
|
228
|
+
for (float x = -1.0; x <= 1.0; x += 1.0) {
|
|
229
|
+
for (float y = -1.0; y <= 1.0; y += 1.0) {
|
|
230
|
+
vec2 voffset = vUv;
|
|
231
|
+
voffset += vec2(x, y) * vec2(${1 / clientWidth}, ${1 / clientHeight}) * offset;
|
|
232
|
+
vec2 pos = unpackRGBATo2Half(texture2D(tex, voffset));
|
|
233
|
+
float dist = distance(pos.xy, vUv);
|
|
234
|
+
if(pos.x != 0.0 && pos.y != 0.0 && dist < closestDist) {
|
|
235
|
+
closestDist = dist;
|
|
236
|
+
closestPos = pos;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
gl_FragColor = pack2HalfToRGBA(closestPos);
|
|
241
|
+
}`
|
|
242
|
+
}));
|
|
243
|
+
const distanceFieldRender = new FullScreenQuad(new THREE.ShaderMaterial({
|
|
244
|
+
uniforms: {
|
|
245
|
+
tex: {
|
|
246
|
+
value: null
|
|
247
|
+
},
|
|
248
|
+
size: {
|
|
249
|
+
value: new THREE.Vector2(clientWidth, clientHeight)
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
vertexShader:
|
|
253
|
+
/*glsl*/
|
|
254
|
+
`
|
|
255
|
+
varying vec2 vUv;
|
|
256
|
+
void main() {
|
|
257
|
+
vUv = uv;
|
|
258
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
259
|
+
}`,
|
|
260
|
+
fragmentShader:
|
|
261
|
+
/*glsl*/
|
|
262
|
+
`
|
|
263
|
+
varying vec2 vUv;
|
|
264
|
+
uniform sampler2D tex;
|
|
265
|
+
uniform vec2 size;
|
|
266
|
+
#include <packing>
|
|
267
|
+
void main() {
|
|
268
|
+
gl_FragColor = vec4(distance(size * unpackRGBATo2Half(texture2D(tex, vUv)), size * vUv), 0.0, 0.0, 0.0);
|
|
269
|
+
}`
|
|
270
|
+
}));
|
|
271
|
+
const compositeRender = new FullScreenQuad(new THREE.ShaderMaterial({
|
|
272
|
+
uniforms: {
|
|
273
|
+
inside: {
|
|
274
|
+
value: insideRenderTargetFinal.texture
|
|
275
|
+
},
|
|
276
|
+
outside: {
|
|
277
|
+
value: outsideRenderTargetFinal.texture
|
|
278
|
+
},
|
|
279
|
+
tex: {
|
|
280
|
+
value: null
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
vertexShader:
|
|
284
|
+
/*glsl*/
|
|
285
|
+
`
|
|
286
|
+
varying vec2 vUv;
|
|
287
|
+
void main() {
|
|
288
|
+
vUv = uv;
|
|
289
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
290
|
+
}`,
|
|
291
|
+
fragmentShader:
|
|
292
|
+
/*glsl*/
|
|
293
|
+
`
|
|
294
|
+
varying vec2 vUv;
|
|
295
|
+
uniform sampler2D inside;
|
|
296
|
+
uniform sampler2D outside;
|
|
297
|
+
uniform sampler2D tex;
|
|
298
|
+
#include <packing>
|
|
299
|
+
void main() {
|
|
300
|
+
float i = texture2D(inside, vUv).x;
|
|
301
|
+
float o =texture2D(outside, vUv).x;
|
|
302
|
+
if (texture2D(tex, vUv).x == 0.0) {
|
|
303
|
+
gl_FragColor = vec4(o, 0.0, 0.0, 0.0);
|
|
304
|
+
} else {
|
|
305
|
+
gl_FragColor = vec4(-i, 0.0, 0.0, 0.0);
|
|
306
|
+
}
|
|
307
|
+
}`
|
|
308
|
+
}));
|
|
309
|
+
return image => {
|
|
310
|
+
let ft = finalTarget;
|
|
311
|
+
image.minFilter = THREE.NearestFilter;
|
|
312
|
+
image.magFilter = THREE.NearestFilter;
|
|
313
|
+
uvRender.material.uniforms.tex.value = image;
|
|
314
|
+
renderer.setRenderTarget(outsideRenderTarget);
|
|
315
|
+
uvRender.render(renderer);
|
|
316
|
+
const passes = Math.ceil(Math.log(Math.max(clientWidth, clientHeight)) / Math.log(2.0));
|
|
317
|
+
let lastTarget = outsideRenderTarget;
|
|
318
|
+
let target = null;
|
|
319
|
+
|
|
320
|
+
for (let i = 0; i < passes; i++) {
|
|
321
|
+
const offset = Math.pow(2, passes - i - 1);
|
|
322
|
+
target = lastTarget === outsideRenderTarget ? outsideRenderTarget2 : outsideRenderTarget;
|
|
323
|
+
jumpFloodRender.material.uniforms.level.value = i;
|
|
324
|
+
jumpFloodRender.material.uniforms.maxSteps.value = passes;
|
|
325
|
+
jumpFloodRender.material.uniforms.offset.value = offset;
|
|
326
|
+
jumpFloodRender.material.uniforms.tex.value = lastTarget.texture;
|
|
327
|
+
renderer.setRenderTarget(target);
|
|
328
|
+
jumpFloodRender.render(renderer);
|
|
329
|
+
lastTarget = target;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
renderer.setRenderTarget(outsideRenderTargetFinal);
|
|
333
|
+
distanceFieldRender.material.uniforms.tex.value = target.texture;
|
|
334
|
+
distanceFieldRender.render(renderer);
|
|
335
|
+
uvRenderInside.material.uniforms.tex.value = image;
|
|
336
|
+
renderer.setRenderTarget(insideRenderTarget);
|
|
337
|
+
uvRenderInside.render(renderer);
|
|
338
|
+
lastTarget = insideRenderTarget;
|
|
339
|
+
|
|
340
|
+
for (let i = 0; i < passes; i++) {
|
|
341
|
+
const offset = Math.pow(2, passes - i - 1);
|
|
342
|
+
target = lastTarget === insideRenderTarget ? insideRenderTarget2 : insideRenderTarget;
|
|
343
|
+
jumpFloodRender.material.uniforms.level.value = i;
|
|
344
|
+
jumpFloodRender.material.uniforms.maxSteps.value = passes;
|
|
345
|
+
jumpFloodRender.material.uniforms.offset.value = offset;
|
|
346
|
+
jumpFloodRender.material.uniforms.tex.value = lastTarget.texture;
|
|
347
|
+
renderer.setRenderTarget(target);
|
|
348
|
+
jumpFloodRender.render(renderer);
|
|
349
|
+
lastTarget = target;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
renderer.setRenderTarget(insideRenderTargetFinal);
|
|
353
|
+
distanceFieldRender.material.uniforms.tex.value = target.texture;
|
|
354
|
+
distanceFieldRender.render(renderer);
|
|
355
|
+
renderer.setRenderTarget(ft);
|
|
356
|
+
compositeRender.material.uniforms.tex.value = image;
|
|
357
|
+
compositeRender.render(renderer);
|
|
358
|
+
renderer.setRenderTarget(null);
|
|
359
|
+
return ft;
|
|
360
|
+
};
|
|
361
|
+
};
|
|
362
|
+
|
|
61
363
|
export { MeshPortalMaterial };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),t=require("react"),n=require("@react-three/fiber"),a=require("./useFBO.cjs.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var c=u(e),s=i(r),o=i(t);const l=o.forwardRef((({children:e,compute:r,width:t,height:u,samples:i=8,renderPriority:l=0,eventPriority:
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("three"),t=require("react"),n=require("@react-three/fiber"),a=require("./useFBO.cjs.js");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var c=u(e),s=i(r),o=i(t);const l=o.forwardRef((({children:e,compute:r,width:t,height:u,samples:i=8,renderPriority:l=0,eventPriority:p=0,frames:d=1/0,stencilBuffer:m=!1,depthBuffer:b=!0,generateMipmaps:v=!1,...g},h)=>{const{size:y,viewport:j}=n.useThree(),O=a.useFBO((t||y.width)*j.dpr,(u||y.height)*j.dpr,{samples:i,stencilBuffer:m,depthBuffer:b,generateMipmaps:v}),[P]=o.useState((()=>new s.Scene)),x=o.useCallback(((e,r,t)=>{var n,a;let u=null==(n=O.texture)?void 0:n.__r3f.parent;for(;u&&!(u instanceof s.Object3D);)u=u.__r3f.parent;if(!u)return!1;t.raycaster.camera||t.events.compute(e,t,null==(a=t.previousRoot)?void 0:a.getState());const[i]=t.raycaster.intersectObject(u);if(!i)return!1;const c=i.uv;if(!c)return!1;r.raycaster.setFromCamera(r.pointer.set(2*c.x-1,2*c.y-1),r.camera)}),[]);return o.useImperativeHandle(h,(()=>O.texture),[O]),o.createElement(o.Fragment,null,n.createPortal(o.createElement(f,{renderPriority:l,frames:d,fbo:O},e,o.createElement("group",{onPointerOver:()=>null})),P,{events:{compute:r||x,priority:p}}),o.createElement("primitive",c.default({object:O.texture},g)))}));function f({frames:e,renderPriority:r,children:t,fbo:a}){let u=0;return n.useFrame((r=>{(e===1/0||u<e)&&(r.gl.setRenderTarget(a),r.gl.render(r.scene,r.camera),r.gl.setRenderTarget(null),u++)}),r),o.createElement(o.Fragment,null,t)}exports.RenderTexture=l;
|
package/core/RenderTexture.js
CHANGED
|
@@ -57,7 +57,9 @@ const RenderTexture = /*#__PURE__*/React.forwardRef(({
|
|
|
57
57
|
renderPriority: renderPriority,
|
|
58
58
|
frames: frames,
|
|
59
59
|
fbo: fbo
|
|
60
|
-
}, children
|
|
60
|
+
}, children, /*#__PURE__*/React.createElement("group", {
|
|
61
|
+
onPointerOver: () => null
|
|
62
|
+
})), vScene, {
|
|
61
63
|
events: {
|
|
62
64
|
compute: compute || uvCompute,
|
|
63
65
|
priority: eventPriority
|