@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 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
- ````jsx
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(u.Fragment,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}}))};
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
- return /*#__PURE__*/React.createElement(React.Fragment, null);
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"),u=require("./shaderMaterial.cjs.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(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)}require("./useFBO.cjs.js");var l=i(e),c=o(r),s=o(t);const d=u.shaderMaterial({map:null,resolution:new c.Vector2},"void main() {\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }","uniform sampler2D map;\n uniform vec2 resolution;\n void main() {\n vec2 uv = gl_FragCoord.xy / resolution.xy;\n vec4 t = texture2D(map, uv);\n gl_FragColor = texture2D(map, uv);\n #include <tonemapping_fragment>\n #include <encodings_fragment>\n }"),p=s.forwardRef((({children:e,...r},t)=>{n.extend({PortalMaterial:d});const u=s.useRef(null),i=s.useRef(null),{size:o,events:c,viewport:p}=n.useThree();return n.useFrame((()=>{var e;let r=null==(e=u.current)?void 0:e.__r3f.parent;r&&i.current.matrix.copy(r.matrixWorld)})),s.useImperativeHandle(t,(()=>u.current)),s.createElement("portalMaterial",l.default({ref:u,resolution:[o.width*p.dpr,o.height*p.dpr],toneMapped:!1},r),s.createElement(a.RenderTexture,{attach:"map",compute:c.compute},s.createElement("group",{onPointerOver:()=>null,matrixAutoUpdate:!1,ref:i},e)))}));exports.MeshPortalMaterial=p;
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
- portalMaterial: ReactThreeFiber.ShaderMaterialProps & {
8
- resolution: ReactThreeFiber.Vector2;
9
- };
14
+ portalMaterialImpl: PortalMaterialType;
10
15
  }
11
16
  }
12
17
  }
13
- export declare type PortalProps = JSX.IntrinsicElements['mesh'];
14
- export declare const MeshPortalMaterial: React.ForwardRefExoticComponent<Pick<Omit<ReactThreeFiber.ExtendedColors<ReactThreeFiber.Overwrite<Partial<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>>, ReactThreeFiber.NodeProps<THREE.Mesh<THREE.BufferGeometry, THREE.Material | THREE.Material[]>, typeof THREE.Mesh>>>, ReactThreeFiber.NonFunctionKeys<{
15
- position?: ReactThreeFiber.Vector3 | undefined;
16
- up?: ReactThreeFiber.Vector3 | undefined;
17
- scale?: ReactThreeFiber.Vector3 | undefined;
18
- rotation?: ReactThreeFiber.Euler | undefined;
19
- matrix?: ReactThreeFiber.Matrix4 | undefined;
20
- quaternion?: ReactThreeFiber.Quaternion | undefined;
21
- layers?: ReactThreeFiber.Layers | undefined;
22
- dispose?: (() => void) | null | undefined;
23
- }>> & {
24
- position?: ReactThreeFiber.Vector3 | undefined;
25
- up?: ReactThreeFiber.Vector3 | undefined;
26
- scale?: ReactThreeFiber.Vector3 | undefined;
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 PortalMaterial = shaderMaterial({
10
+ const PortalMaterialImpl = shaderMaterial({
11
+ blur: 0,
9
12
  map: null,
13
+ sdf: null,
14
+ size: 0,
10
15
  resolution: new THREE.Vector2()
11
- }, `void main() {
16
+ }, `varying vec2 vUv;
17
+ void main() {
12
18
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
13
- }`, `uniform sampler2D map;
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
- gl_FragColor = texture2D(map, uv);
31
+ float k = blur;
32
+ float d = texture2D(sdf, vUv).r/size;
33
+ float alpha = 1.0 - smoothstep(0.0, 1.0, clamp(d/k + 1.0, 0.0, 1.0));
34
+ gl_FragColor = vec4(t.rgb, blur == 0.0 ? t.a : t.a * alpha);
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
- PortalMaterial
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
- useFrame(() => {
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 parent = (_ref$current = ref.current) == null ? void 0 : _ref$current.__r3f.parent;
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("portalMaterial", _extends({
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:d=0,frames:p=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}),[x]=o.useState((()=>new s.Scene)),P=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:p,fbo:O},e),x,{events:{compute:r||P,priority:d}}),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;
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;
@@ -57,7 +57,9 @@ const RenderTexture = /*#__PURE__*/React.forwardRef(({
57
57
  renderPriority: renderPriority,
58
58
  frames: frames,
59
59
  fbo: fbo
60
- }, children), vScene, {
60
+ }, children, /*#__PURE__*/React.createElement("group", {
61
+ onPointerOver: () => null
62
+ })), vScene, {
61
63
  events: {
62
64
  compute: compute || uvCompute,
63
65
  priority: eventPriority