@react-three/drei 9.36.0 → 9.37.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 CHANGED
@@ -209,6 +209,23 @@ The `native` route of the library **does not** export `Html` or `Loader`. The de
209
209
 
210
210
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/camera-perspectivecamera--perspective-camera-scene-st)
211
211
 
212
+ ```tsx
213
+ type Props = Omit<JSX.IntrinsicElements['perspectiveCamera'], 'children'> & {
214
+ /** Registers the camera as the system default, fiber will start rendering with it */
215
+ makeDefault?: boolean
216
+ /** Making it manual will stop responsiveness and you have to calculate aspect ratio yourself. */
217
+ manual?: boolean
218
+ /** The contents will either follow the camera, or be hidden when filming if you pass a function */
219
+ children?: React.ReactNode | ((texture: THREE.Texture) => React.ReactNode)
220
+ /** Number of frames to render, 0 */
221
+ frames?: number
222
+ /** Resolution of the FBO, 256 */
223
+ resolution?: number
224
+ /** Optional environment map for functional use */
225
+ envMap?: THREE.Texture
226
+ }
227
+ ```
228
+
212
229
  A responsive [THREE.PerspectiveCamera](https://threejs.org/docs/#api/en/cameras/PerspectiveCamera) that can set itself as the default.
213
230
 
214
231
  ```jsx
@@ -230,6 +247,18 @@ You can also drive it manually, it won't be responsive and you have to calculate
230
247
  <PerspectiveCamera manual aspect={...} onUpdate={(c) => c.updateProjectionMatrix()}>
231
248
  ```
232
249
 
250
+ You can use the PerspectiveCamera to film contents into a RenderTarget, similar to CubeCamera. As a child you must provide a render-function which receives the texture as its first argument. The result of that function will _not follow the camera_, instead it will be set invisible while the the FBO renders so as to avoid issues where the meshes that receive the texture are interrering.
251
+
252
+ ```jsx
253
+ <PerspectiveCamera position={[0, 0, 10]}>
254
+ {(texture) => (
255
+ <mesh geometry={plane}>
256
+ <meshBasicMaterial map={texture} />
257
+ </mesh>
258
+ )}
259
+ </PerspectiveCamera>
260
+ ```
261
+
233
262
  #### OrthographicCamera
234
263
 
235
264
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.vercel.app/?path=/story/camera-orthographiccamera--orthographic-camera-scene-st)
@@ -242,6 +271,18 @@ A responsive [THREE.OrthographicCamera](https://threejs.org/docs/#api/en/cameras
242
271
  </OrthographicCamera>
243
272
  ```
244
273
 
274
+ You can use the OrthographicCamera to film contents into a RenderTarget, it has the same API as OrthographicCamera.
275
+
276
+ ```jsx
277
+ <OrthographicCamera position={[0, 0, 10]}>
278
+ {(texture) => (
279
+ <mesh geometry={plane}>
280
+ <meshBasicMaterial map={texture} />
281
+ </mesh>
282
+ )}
283
+ </OrthographicCamera>
284
+ ```
285
+
245
286
  #### CubeCamera
246
287
 
247
288
  [![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/camera-cubecamera--default-story)
@@ -2339,7 +2380,7 @@ Masks use the stencil buffer to cut out areas of the screen. This is usually che
2339
2380
  /** If depth of the masks own material will leak through, default: false */
2340
2381
  depthWrite?: boolean
2341
2382
  /** children must define a geometry, a render-prop function is allowed which may override the default material */
2342
- children: (spread: MaskSpread) => React.ReactNode | React.ReactNode
2383
+ children: ((spread: MaskSpread) => React.ReactNode) | React.ReactNode
2343
2384
  />
2344
2385
  ```
2345
2386
 
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("three"),n=require("./OrthographicCamera.cjs.js"),u=require("./useCamera.cjs.js");function a(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("@babel/runtime/helpers/extends"),require("react-merge-refs");var o=a(e);const c=o.createContext({}),i=2*Math.PI,s=new t.Object3D,l=new t.Matrix4,[p,d]=[new t.Quaternion,new t.Quaternion],f=new t.Vector3,h=new t.Vector3;exports.GizmoHelper=({alignment:e="bottom-right",margin:a=[80,80],renderPriority:m=0,autoClear:g=!0,onUpdate:b,onTarget:y,children:w})=>{const v=r.useThree((({size:e})=>e)),j=r.useThree((({camera:e})=>e)),q=r.useThree((({controls:e})=>e)),C=r.useThree((({gl:e})=>e)),x=r.useThree((({scene:e})=>e)),O=r.useThree((({invalidate:e})=>e)),T=o.useRef(),k=o.useRef(),P=o.useRef(null),[R]=o.useState((()=>new t.Scene)),E=o.useRef(!1),M=o.useRef(0),z=o.useRef(new t.Vector3(0,0,0)),Q=o.useRef(new t.Vector3(0,0,0));o.useEffect((()=>{Q.current.copy(j.up)}),[j]);const S=o.useCallback((e=>{E.current=!0,(q||y)&&(z.current=(null==q?void 0:q.target)||(null==y?void 0:y())),M.current=j.position.distanceTo(f),p.copy(j.quaternion),h.copy(e).multiplyScalar(M.current).add(f),s.lookAt(h),d.copy(s.quaternion),O()}),[q,j,y,O]);o.useEffect((()=>(x.background&&(T.current=x.background,x.background=null,R.background=T.current),()=>{T.current&&(x.background=T.current)})),[]),r.useFrame(((e,r)=>{if(P.current&&k.current){var t;if(E.current)if(p.angleTo(d)<.01)E.current=!1,"minPolarAngle"in q&&j.up.copy(Q.current);else{const e=r*i;p.rotateTowards(d,e),j.position.set(0,0,1).applyQuaternion(p).multiplyScalar(M.current).add(z.current),j.up.set(0,1,0).applyQuaternion(p).normalize(),j.quaternion.copy(p),b?b():q&&q.update(),O()}l.copy(j.matrix).invert(),null==(t=k.current)||t.quaternion.setFromRotationMatrix(l),g&&(C.autoClear=!1),C.clearDepth(),C.render(R,P.current)}}),m);const V=u.useCamera(P),W=o.useMemo((()=>({tweenCamera:S,raycast:V})),[S]),[_,D]=a,A=e.endsWith("-center")?0:e.endsWith("-left")?-v.width/2+_:v.width/2-_,F=e.startsWith("center-")?0:e.startsWith("top-")?v.height/2-D:-v.height/2+D;return r.createPortal(o.createElement(c.Provider,{value:W},o.createElement(n.OrthographicCamera,{ref:P,position:[0,0,200]}),o.createElement("group",{ref:k,position:[A,F,0]},w)),R)},exports.useGizmoContext=()=>o.useContext(c);
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("three"),n=require("./OrthographicCamera.cjs.js"),u=require("./useCamera.cjs.js");function a(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("@babel/runtime/helpers/extends"),require("react-merge-refs"),require("./useFBO.cjs.js");var o=a(e);const c=o.createContext({}),i=2*Math.PI,s=new t.Object3D,l=new t.Matrix4,[p,d]=[new t.Quaternion,new t.Quaternion],f=new t.Vector3,h=new t.Vector3;exports.GizmoHelper=({alignment:e="bottom-right",margin:a=[80,80],renderPriority:m=0,autoClear:g=!0,onUpdate:b,onTarget:y,children:w})=>{const j=r.useThree((({size:e})=>e)),q=r.useThree((({camera:e})=>e)),v=r.useThree((({controls:e})=>e)),C=r.useThree((({gl:e})=>e)),O=r.useThree((({scene:e})=>e)),x=r.useThree((({invalidate:e})=>e)),T=o.useRef(),k=o.useRef(),P=o.useRef(null),[R]=o.useState((()=>new t.Scene)),E=o.useRef(!1),M=o.useRef(0),z=o.useRef(new t.Vector3(0,0,0)),Q=o.useRef(new t.Vector3(0,0,0));o.useEffect((()=>{Q.current.copy(q.up)}),[q]);const S=o.useCallback((e=>{E.current=!0,(v||y)&&(z.current=(null==v?void 0:v.target)||(null==y?void 0:y())),M.current=q.position.distanceTo(f),p.copy(q.quaternion),h.copy(e).multiplyScalar(M.current).add(f),s.lookAt(h),d.copy(s.quaternion),x()}),[v,q,y,x]);o.useEffect((()=>(O.background&&(T.current=O.background,O.background=null,R.background=T.current),()=>{T.current&&(O.background=T.current)})),[]),r.useFrame(((e,r)=>{if(P.current&&k.current){var t;if(E.current)if(p.angleTo(d)<.01)E.current=!1,"minPolarAngle"in v&&q.up.copy(Q.current);else{const e=r*i;p.rotateTowards(d,e),q.position.set(0,0,1).applyQuaternion(p).multiplyScalar(M.current).add(z.current),q.up.set(0,1,0).applyQuaternion(p).normalize(),q.quaternion.copy(p),b?b():v&&v.update(),x()}l.copy(q.matrix).invert(),null==(t=k.current)||t.quaternion.setFromRotationMatrix(l),g&&(C.autoClear=!1),C.clearDepth(),C.render(R,P.current)}}),m);const V=u.useCamera(P),W=o.useMemo((()=>({tweenCamera:S,raycast:V})),[S]),[_,D]=a,F=e.endsWith("-center")?0:e.endsWith("-left")?-j.width/2+_:j.width/2-_,A=e.startsWith("center-")?0:e.startsWith("top-")?j.height/2-D:-j.height/2+D;return r.createPortal(o.createElement(c.Provider,{value:W},o.createElement(n.OrthographicCamera,{ref:P,position:[0,0,200]}),o.createElement("group",{ref:k,position:[F,A,0]},w)),R)},exports.useGizmoContext=()=>o.useContext(c);
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("@react-three/fiber"),o=require("./GizmoHelper.cjs.js"),a=require("three");function n(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 o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("./OrthographicCamera.cjs.js"),require("react-merge-refs"),require("./useCamera.cjs.js");var c=n(e),s=i(t);const l="#f0f0f0",p="#999",u="black",m="black",f=["Right","Left","Top","Bottom","Front","Back"],h=e=>new a.Vector3(...e).multiplyScalar(.38),y=[[1,1,1],[1,1,-1],[1,-1,1],[1,-1,-1],[-1,1,1],[-1,1,-1],[-1,-1,1],[-1,-1,-1]].map(h),d=[.25,.25,.25],g=[[1,1,0],[1,0,1],[1,0,-1],[1,-1,0],[0,1,1],[0,1,-1],[0,-1,1],[0,-1,-1],[-1,1,0],[-1,0,1],[-1,0,-1],[-1,-1,0]].map(h),b=g.map((e=>e.toArray().map((e=>0==e?.5:.25)))),x=({hover:e,index:t,font:o="20px Inter var, Arial, sans-serif",faces:n=f,color:i=l,hoverColor:c=p,textColor:h=u,strokeColor:y=m,opacity:d=1})=>{const g=r.useThree((e=>e.gl)),b=s.useMemo((()=>{const e=document.createElement("canvas");e.width=128,e.height=128;const r=e.getContext("2d");return r.fillStyle=i,r.fillRect(0,0,e.width,e.height),r.strokeStyle=y,r.strokeRect(0,0,e.width,e.height),r.font=o,r.textAlign="center",r.fillStyle=h,r.fillText(n[t].toUpperCase(),64,76),new a.CanvasTexture(e)}),[t,n,o,i,h,y]);return s.createElement("meshLambertMaterial",{map:b,"map-encoding":g.outputEncoding,"map-anisotropy":g.capabilities.getMaxAnisotropy()||1,attach:`material-${t}`,color:e?c:"white",transparent:!0,opacity:d})},C=e=>{const{tweenCamera:t,raycast:r}=o.useGizmoContext(),[a,n]=s.useState(null);return s.createElement("mesh",{raycast:r,onPointerOut:e=>{e.stopPropagation(),n(null)},onPointerMove:e=>{e.stopPropagation(),n(Math.floor(e.faceIndex/2))},onClick:e.onClick||(e=>{e.stopPropagation(),t(e.face.normal)})},[...Array(6)].map(((t,r)=>s.createElement(x,c.default({key:r,index:r,hover:a===r},e)))),s.createElement("boxGeometry",null))},E=({onClick:e,dimensions:t,position:r,hoverColor:a=p})=>{const{tweenCamera:n,raycast:i}=o.useGizmoContext(),[c,l]=s.useState(!1);return s.createElement("mesh",{scale:1.01,position:r,raycast:i,onPointerOver:e=>{e.stopPropagation(),l(!0)},onPointerOut:e=>{e.stopPropagation(),l(!1)},onClick:e||(e=>{e.stopPropagation(),n(r)})},s.createElement("meshBasicMaterial",{color:c?a:"white",transparent:!0,opacity:.6,visible:c}),s.createElement("boxGeometry",{args:t}))};exports.GizmoViewcube=e=>s.createElement("group",{scale:[60,60,60]},s.createElement(C,e),g.map(((t,r)=>s.createElement(E,c.default({key:r,position:t,dimensions:b[r]},e)))),y.map(((t,r)=>s.createElement(E,c.default({key:r,position:t,dimensions:d},e)))),s.createElement("ambientLight",{intensity:.5}),s.createElement("pointLight",{position:[10,10,10],intensity:.5}));
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("@react-three/fiber"),o=require("./GizmoHelper.cjs.js"),a=require("three");function n(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 o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("./OrthographicCamera.cjs.js"),require("react-merge-refs"),require("./useFBO.cjs.js"),require("./useCamera.cjs.js");var s=n(e),c=i(t);const l="#f0f0f0",u="#999",p="black",m="black",f=["Right","Left","Top","Bottom","Front","Back"],h=e=>new a.Vector3(...e).multiplyScalar(.38),y=[[1,1,1],[1,1,-1],[1,-1,1],[1,-1,-1],[-1,1,1],[-1,1,-1],[-1,-1,1],[-1,-1,-1]].map(h),d=[.25,.25,.25],g=[[1,1,0],[1,0,1],[1,0,-1],[1,-1,0],[0,1,1],[0,1,-1],[0,-1,1],[0,-1,-1],[-1,1,0],[-1,0,1],[-1,0,-1],[-1,-1,0]].map(h),b=g.map((e=>e.toArray().map((e=>0==e?.5:.25)))),x=({hover:e,index:t,font:o="20px Inter var, Arial, sans-serif",faces:n=f,color:i=l,hoverColor:s=u,textColor:h=p,strokeColor:y=m,opacity:d=1})=>{const g=r.useThree((e=>e.gl)),b=c.useMemo((()=>{const e=document.createElement("canvas");e.width=128,e.height=128;const r=e.getContext("2d");return r.fillStyle=i,r.fillRect(0,0,e.width,e.height),r.strokeStyle=y,r.strokeRect(0,0,e.width,e.height),r.font=o,r.textAlign="center",r.fillStyle=h,r.fillText(n[t].toUpperCase(),64,76),new a.CanvasTexture(e)}),[t,n,o,i,h,y]);return c.createElement("meshLambertMaterial",{map:b,"map-encoding":g.outputEncoding,"map-anisotropy":g.capabilities.getMaxAnisotropy()||1,attach:`material-${t}`,color:e?s:"white",transparent:!0,opacity:d})},C=e=>{const{tweenCamera:t,raycast:r}=o.useGizmoContext(),[a,n]=c.useState(null);return c.createElement("mesh",{raycast:r,onPointerOut:e=>{e.stopPropagation(),n(null)},onPointerMove:e=>{e.stopPropagation(),n(Math.floor(e.faceIndex/2))},onClick:e.onClick||(e=>{e.stopPropagation(),t(e.face.normal)})},[...Array(6)].map(((t,r)=>c.createElement(x,s.default({key:r,index:r,hover:a===r},e)))),c.createElement("boxGeometry",null))},E=({onClick:e,dimensions:t,position:r,hoverColor:a=u})=>{const{tweenCamera:n,raycast:i}=o.useGizmoContext(),[s,l]=c.useState(!1);return c.createElement("mesh",{scale:1.01,position:r,raycast:i,onPointerOver:e=>{e.stopPropagation(),l(!0)},onPointerOut:e=>{e.stopPropagation(),l(!1)},onClick:e||(e=>{e.stopPropagation(),n(r)})},c.createElement("meshBasicMaterial",{color:s?a:"white",transparent:!0,opacity:.6,visible:s}),c.createElement("boxGeometry",{args:t}))};exports.GizmoViewcube=e=>c.createElement("group",{scale:[60,60,60]},c.createElement(C,e),g.map(((t,r)=>c.createElement(E,s.default({key:r,position:t,dimensions:b[r]},e)))),y.map(((t,r)=>c.createElement(E,s.default({key:r,position:t,dimensions:d},e)))),c.createElement("ambientLight",{intensity:.5}),c.createElement("pointLight",{position:[10,10,10],intensity:.5}));
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),a=require("@react-three/fiber"),r=require("three"),o=require("./GizmoHelper.cjs.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function l(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(a){if("default"!==a){var r=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,r.get?r:{enumerable:!0,get:function(){return e[a]}})}})),t.default=e,Object.freeze(t)}require("./OrthographicCamera.cjs.js"),require("react-merge-refs"),require("./useCamera.cjs.js");var i=n(e),c=l(t);function s({scale:e=[.8,.05,.05],color:t,rotation:a}){return c.createElement("group",{rotation:a},c.createElement("mesh",{position:[.4,0,0]},c.createElement("boxGeometry",{args:e}),c.createElement("meshBasicMaterial",{color:t,toneMapped:!1})))}function u({onClick:e,font:t,disabled:o,arcStyle:n,label:l,labelColor:s,axisHeadScale:u=1,...p}){const f=a.useThree((e=>e.gl)),m=c.useMemo((()=>{const e=document.createElement("canvas");e.width=64,e.height=64;const a=e.getContext("2d");return a.beginPath(),a.arc(32,32,16,0,2*Math.PI),a.closePath(),a.fillStyle=n,a.fill(),l&&(a.font=t,a.textAlign="center",a.fillStyle=s,a.fillText(l,32,41)),new r.CanvasTexture(e)}),[n,l,s,t]),[d,b]=c.useState(!1),g=(l?1:.75)*(d?1.2:1)*u;return c.createElement("sprite",i.default({scale:g,onPointerOver:o?void 0:e=>{e.stopPropagation(),b(!0)},onPointerOut:o?void 0:e||(e=>{e.stopPropagation(),b(!1)})},p),c.createElement("spriteMaterial",{map:m,"map-encoding":f.outputEncoding,"map-anisotropy":f.capabilities.getMaxAnisotropy()||1,alphaTest:.3,opacity:l?1:.75,toneMapped:!1}))}exports.GizmoViewport=({hideNegativeAxes:e,hideAxisHeads:t,disabled:a,font:r="18px Inter var, Arial, sans-serif",axisColors:n=["#ff2060","#20df80","#2080ff"],axisHeadScale:l=1,axisScale:p,labels:f=["X","Y","Z"],labelColor:m="#000",onClick:d,...b})=>{const[g,E,h]=n,{tweenCamera:y,raycast:x}=o.useGizmoContext(),j={font:r,disabled:a,labelColor:m,raycast:x,onClick:d,axisHeadScale:l,onPointerDown:a?void 0:e=>{y(e.object.position),e.stopPropagation()}};return c.createElement("group",i.default({scale:40},b),c.createElement(s,{color:g,rotation:[0,0,0],scale:p}),c.createElement(s,{color:E,rotation:[0,0,Math.PI/2],scale:p}),c.createElement(s,{color:h,rotation:[0,-Math.PI/2,0],scale:p}),!t&&c.createElement(c.Fragment,null,c.createElement(u,i.default({arcStyle:g,position:[1,0,0],label:f[0]},j)),c.createElement(u,i.default({arcStyle:E,position:[0,1,0],label:f[1]},j)),c.createElement(u,i.default({arcStyle:h,position:[0,0,1],label:f[2]},j)),!e&&c.createElement(c.Fragment,null,c.createElement(u,i.default({arcStyle:g,position:[-1,0,0]},j)),c.createElement(u,i.default({arcStyle:E,position:[0,-1,0]},j)),c.createElement(u,i.default({arcStyle:h,position:[0,0,-1]},j)))),c.createElement("ambientLight",{intensity:.5}),c.createElement("pointLight",{position:[10,10,10],intensity:.5}))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("@react-three/fiber"),a=require("three"),o=require("./GizmoHelper.cjs.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function l(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)}require("./OrthographicCamera.cjs.js"),require("react-merge-refs"),require("./useFBO.cjs.js"),require("./useCamera.cjs.js");var i=n(e),c=l(t);function s({scale:e=[.8,.05,.05],color:t,rotation:r}){return c.createElement("group",{rotation:r},c.createElement("mesh",{position:[.4,0,0]},c.createElement("boxGeometry",{args:e}),c.createElement("meshBasicMaterial",{color:t,toneMapped:!1})))}function u({onClick:e,font:t,disabled:o,arcStyle:n,label:l,labelColor:s,axisHeadScale:u=1,...p}){const f=r.useThree((e=>e.gl)),m=c.useMemo((()=>{const e=document.createElement("canvas");e.width=64,e.height=64;const r=e.getContext("2d");return r.beginPath(),r.arc(32,32,16,0,2*Math.PI),r.closePath(),r.fillStyle=n,r.fill(),l&&(r.font=t,r.textAlign="center",r.fillStyle=s,r.fillText(l,32,41)),new a.CanvasTexture(e)}),[n,l,s,t]),[d,b]=c.useState(!1),g=(l?1:.75)*(d?1.2:1)*u;return c.createElement("sprite",i.default({scale:g,onPointerOver:o?void 0:e=>{e.stopPropagation(),b(!0)},onPointerOut:o?void 0:e||(e=>{e.stopPropagation(),b(!1)})},p),c.createElement("spriteMaterial",{map:m,"map-encoding":f.outputEncoding,"map-anisotropy":f.capabilities.getMaxAnisotropy()||1,alphaTest:.3,opacity:l?1:.75,toneMapped:!1}))}exports.GizmoViewport=({hideNegativeAxes:e,hideAxisHeads:t,disabled:r,font:a="18px Inter var, Arial, sans-serif",axisColors:n=["#ff2060","#20df80","#2080ff"],axisHeadScale:l=1,axisScale:p,labels:f=["X","Y","Z"],labelColor:m="#000",onClick:d,...b})=>{const[g,E,h]=n,{tweenCamera:y,raycast:x}=o.useGizmoContext(),j={font:a,disabled:r,labelColor:m,raycast:x,onClick:d,axisHeadScale:l,onPointerDown:r?void 0:e=>{y(e.object.position),e.stopPropagation()}};return c.createElement("group",i.default({scale:40},b),c.createElement(s,{color:g,rotation:[0,0,0],scale:p}),c.createElement(s,{color:E,rotation:[0,0,Math.PI/2],scale:p}),c.createElement(s,{color:h,rotation:[0,-Math.PI/2,0],scale:p}),!t&&c.createElement(c.Fragment,null,c.createElement(u,i.default({arcStyle:g,position:[1,0,0],label:f[0]},j)),c.createElement(u,i.default({arcStyle:E,position:[0,1,0],label:f[1]},j)),c.createElement(u,i.default({arcStyle:h,position:[0,0,1],label:f[2]},j)),!e&&c.createElement(c.Fragment,null,c.createElement(u,i.default({arcStyle:g,position:[-1,0,0]},j)),c.createElement(u,i.default({arcStyle:E,position:[0,-1,0]},j)),c.createElement(u,i.default({arcStyle:h,position:[0,0,-1]},j)))),c.createElement("ambientLight",{intensity:.5}),c.createElement("pointLight",{position:[10,10,10],intensity:.5}))};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("@react-three/fiber"),u=require("react-merge-refs");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var u=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,u.get?u:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var n=a(e),f=c(r),o=a(u);const i=f.forwardRef((({makeDefault:e,...r},u)=>{const a=t.useThree((({set:e})=>e)),c=t.useThree((({camera:e})=>e)),i=t.useThree((({size:e})=>e)),s=f.useRef(null);return f.useLayoutEffect((()=>{r.manual||s.current.updateProjectionMatrix()}),[i,r]),f.useLayoutEffect((()=>{s.current.updateProjectionMatrix()})),f.useLayoutEffect((()=>{if(e){const e=c;return a((()=>({camera:s.current}))),()=>a((()=>({camera:e})))}}),[s,e,a]),f.createElement("orthographicCamera",n.default({left:i.width/-2,right:i.width/2,top:i.height/2,bottom:i.height/-2,ref:o.default([s,u])},r))}));exports.OrthographicCamera=i;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("@react-three/fiber"),u=require("react-merge-refs"),n=require("./useFBO.cjs.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var u=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,u.get?u:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("three");var o=a(e),s=c(r),i=a(u);const l=s.forwardRef((({envMap:e,resolution:r=256,frames:u=1/0,children:a,makeDefault:c,...l},f)=>{const d=t.useThree((({set:e})=>e)),g=t.useThree((({camera:e})=>e)),h=t.useThree((({size:e})=>e)),b=s.useRef(null),m=s.useRef(null),p=n.useFBO(r);s.useLayoutEffect((()=>{l.manual||b.current.updateProjectionMatrix()}),[h,l]),s.useLayoutEffect((()=>{b.current.updateProjectionMatrix()})),s.useLayoutEffect((()=>{if(c){const e=g;return d((()=>({camera:b.current}))),()=>d((()=>({camera:e})))}}),[b,c,d]);let j=0,O=null;const y="function"==typeof a;return t.useFrame((r=>{y&&(u===1/0||j<u)&&(m.current.visible=!1,r.gl.setRenderTarget(p),O=r.scene.background,e&&(r.scene.background=e),r.gl.render(r.scene,b.current),r.scene.background=O,r.gl.setRenderTarget(null),m.current.visible=!0,j++)})),s.createElement(s.Fragment,null,s.createElement("orthographicCamera",o.default({left:h.width/-2,right:h.width/2,top:h.height/2,bottom:h.height/-2,ref:i.default([b,f])},l),!y&&a),s.createElement("group",{ref:m},y&&a(p.texture)))}));exports.OrthographicCamera=l;
@@ -1,25 +1,10 @@
1
+ import * as THREE from 'three';
1
2
  import * as React from 'react';
2
- import { OrthographicCamera as OrthographicCameraImpl } from 'three';
3
- export declare const OrthographicCamera: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").ExtendedColors<import("@react-three/fiber").Overwrite<Partial<OrthographicCameraImpl>, import("@react-three/fiber").NodeProps<OrthographicCameraImpl, typeof OrthographicCameraImpl>>>, import("@react-three/fiber").NonFunctionKeys<{
4
- position?: import("@react-three/fiber").Vector3 | undefined;
5
- up?: import("@react-three/fiber").Vector3 | undefined;
6
- scale?: import("@react-three/fiber").Vector3 | undefined;
7
- rotation?: import("@react-three/fiber").Euler | undefined;
8
- matrix?: import("@react-three/fiber").Matrix4 | undefined;
9
- quaternion?: import("@react-three/fiber").Quaternion | undefined;
10
- layers?: import("@react-three/fiber").Layers | undefined;
11
- dispose?: (() => void) | null | undefined;
12
- }>> & {
13
- position?: import("@react-three/fiber").Vector3 | undefined;
14
- up?: import("@react-three/fiber").Vector3 | undefined;
15
- scale?: import("@react-three/fiber").Vector3 | undefined;
16
- rotation?: import("@react-three/fiber").Euler | undefined;
17
- matrix?: import("@react-three/fiber").Matrix4 | undefined;
18
- quaternion?: import("@react-three/fiber").Quaternion | undefined;
19
- layers?: import("@react-three/fiber").Layers | undefined;
20
- dispose?: (() => void) | null | undefined;
21
- } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
3
+ export declare const OrthographicCamera: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").OrthographicCameraProps, "children"> & {
22
4
  makeDefault?: boolean | undefined;
23
5
  manual?: boolean | undefined;
24
- children?: React.ReactNode;
25
- }, "visible" | "attach" | "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 | "left" | "right" | "bottom" | "top" | "manual" | "zoom" | "view" | "matrixWorldInverse" | "projectionMatrix" | "projectionMatrixInverse" | "isCamera" | "near" | "far" | "setViewOffset" | "clearViewOffset" | "updateProjectionMatrix" | "isOrthographicCamera" | "makeDefault"> & React.RefAttributes<unknown>>;
6
+ children?: React.ReactNode | ((texture: THREE.Texture) => React.ReactNode);
7
+ frames?: number | undefined;
8
+ resolution?: number | undefined;
9
+ envMap?: THREE.Texture | undefined;
10
+ }, "visible" | "attach" | "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 | "left" | "right" | "bottom" | "top" | "manual" | "zoom" | "view" | "matrixWorldInverse" | "projectionMatrix" | "projectionMatrixInverse" | "isCamera" | "near" | "far" | "setViewOffset" | "clearViewOffset" | "updateProjectionMatrix" | "isOrthographicCamera" | "envMap" | "resolution" | "frames" | "makeDefault"> & React.RefAttributes<unknown>>;
@@ -1,9 +1,16 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import * as React from 'react';
3
- import { useThree } from '@react-three/fiber';
3
+ import { useThree, useFrame } from '@react-three/fiber';
4
4
  import mergeRefs from 'react-merge-refs';
5
+ import { useFBO } from './useFBO.js';
6
+
7
+ const isFunction = node => typeof node === 'function';
5
8
 
6
9
  const OrthographicCamera = /*#__PURE__*/React.forwardRef(({
10
+ envMap,
11
+ resolution = 256,
12
+ frames = Infinity,
13
+ children,
7
14
  makeDefault,
8
15
  ...props
9
16
  }, ref) => {
@@ -17,6 +24,8 @@ const OrthographicCamera = /*#__PURE__*/React.forwardRef(({
17
24
  size
18
25
  }) => size);
19
26
  const cameraRef = React.useRef(null);
27
+ const groupRef = React.useRef(null);
28
+ const fbo = useFBO(resolution);
20
29
  React.useLayoutEffect(() => {
21
30
  if (!props.manual) {
22
31
  cameraRef.current.updateProjectionMatrix();
@@ -38,13 +47,31 @@ const OrthographicCamera = /*#__PURE__*/React.forwardRef(({
38
47
  // that must exchange the default, and clean up after itself on unmount.
39
48
 
40
49
  }, [cameraRef, makeDefault, set]);
41
- return /*#__PURE__*/React.createElement("orthographicCamera", _extends({
50
+ let count = 0;
51
+ let oldEnvMap = null;
52
+ const functional = isFunction(children);
53
+ useFrame(state => {
54
+ if (functional && (frames === Infinity || count < frames)) {
55
+ groupRef.current.visible = false;
56
+ state.gl.setRenderTarget(fbo);
57
+ oldEnvMap = state.scene.background;
58
+ if (envMap) state.scene.background = envMap;
59
+ state.gl.render(state.scene, cameraRef.current);
60
+ state.scene.background = oldEnvMap;
61
+ state.gl.setRenderTarget(null);
62
+ groupRef.current.visible = true;
63
+ count++;
64
+ }
65
+ });
66
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("orthographicCamera", _extends({
42
67
  left: size.width / -2,
43
68
  right: size.width / 2,
44
69
  top: size.height / 2,
45
70
  bottom: size.height / -2,
46
71
  ref: mergeRefs([cameraRef, ref])
47
- }, props));
72
+ }, props), !functional && children), /*#__PURE__*/React.createElement("group", {
73
+ ref: groupRef
74
+ }, functional && children(fbo.texture)));
48
75
  });
49
76
 
50
77
  export { OrthographicCamera };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("@react-three/fiber"),u=require("react-merge-refs");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var u=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,u.get?u:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var n=a(e),f=c(r),s=a(u);const i=f.forwardRef((({makeDefault:e,...r},u)=>{const a=t.useThree((({set:e})=>e)),c=t.useThree((({camera:e})=>e)),i=t.useThree((({size:e})=>e)),o=f.useRef(null);return f.useLayoutEffect((()=>{r.manual||(o.current.aspect=i.width/i.height)}),[i,r]),f.useLayoutEffect((()=>{o.current.updateProjectionMatrix()})),f.useLayoutEffect((()=>{if(e){const e=c;return a((()=>({camera:o.current}))),()=>a((()=>({camera:e})))}}),[o,e,a]),f.createElement("perspectiveCamera",n.default({ref:s.default([o,u])},r))}));exports.PerspectiveCamera=i;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("@react-three/fiber"),u=require("react-merge-refs"),n=require("./useFBO.cjs.js");function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var u=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,u.get?u:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("three");var s=a(e),l=c(r),f=a(u);const i=l.forwardRef((({envMap:e,resolution:r=256,frames:u=1/0,makeDefault:a,children:c,...i},o)=>{const d=t.useThree((({set:e})=>e)),b=t.useThree((({camera:e})=>e)),m=t.useThree((({size:e})=>e)),p=l.useRef(null),g=l.useRef(null),h=n.useFBO(r);l.useLayoutEffect((()=>{i.manual||(p.current.aspect=m.width/m.height)}),[m,i]),l.useLayoutEffect((()=>{p.current.updateProjectionMatrix()}));let j=0,v=null;const y="function"==typeof c;return t.useFrame((r=>{y&&(u===1/0||j<u)&&(g.current.visible=!1,r.gl.setRenderTarget(h),v=r.scene.background,e&&(r.scene.background=e),r.gl.render(r.scene,p.current),r.scene.background=v,r.gl.setRenderTarget(null),g.current.visible=!0,j++)})),l.useLayoutEffect((()=>{if(a){const e=b;return d((()=>({camera:p.current}))),()=>d((()=>({camera:e})))}}),[p,a,d]),l.createElement(l.Fragment,null,l.createElement("perspectiveCamera",s.default({ref:f.default([p,o])},i),!y&&c),l.createElement("group",{ref:g},y&&c(h.texture)))}));exports.PerspectiveCamera=i;
@@ -1,25 +1,10 @@
1
+ import * as THREE from 'three';
1
2
  import * as React from 'react';
2
- import { PerspectiveCamera as PerspectiveCameraImpl } from 'three';
3
- export declare const PerspectiveCamera: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").ExtendedColors<import("@react-three/fiber").Overwrite<Partial<PerspectiveCameraImpl>, import("@react-three/fiber").NodeProps<PerspectiveCameraImpl, typeof PerspectiveCameraImpl>>>, import("@react-three/fiber").NonFunctionKeys<{
4
- position?: import("@react-three/fiber").Vector3 | undefined;
5
- up?: import("@react-three/fiber").Vector3 | undefined;
6
- scale?: import("@react-three/fiber").Vector3 | undefined;
7
- rotation?: import("@react-three/fiber").Euler | undefined;
8
- matrix?: import("@react-three/fiber").Matrix4 | undefined;
9
- quaternion?: import("@react-three/fiber").Quaternion | undefined;
10
- layers?: import("@react-three/fiber").Layers | undefined;
11
- dispose?: (() => void) | null | undefined;
12
- }>> & {
13
- position?: import("@react-three/fiber").Vector3 | undefined;
14
- up?: import("@react-three/fiber").Vector3 | undefined;
15
- scale?: import("@react-three/fiber").Vector3 | undefined;
16
- rotation?: import("@react-three/fiber").Euler | undefined;
17
- matrix?: import("@react-three/fiber").Matrix4 | undefined;
18
- quaternion?: import("@react-three/fiber").Quaternion | undefined;
19
- layers?: import("@react-three/fiber").Layers | undefined;
20
- dispose?: (() => void) | null | undefined;
21
- } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers & {
3
+ export declare const PerspectiveCamera: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").PerspectiveCameraProps, "children"> & {
22
4
  makeDefault?: boolean | undefined;
23
5
  manual?: boolean | undefined;
24
- children?: React.ReactNode;
25
- }, "visible" | "attach" | "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 | "manual" | "zoom" | "view" | "matrixWorldInverse" | "projectionMatrix" | "projectionMatrixInverse" | "isCamera" | "near" | "far" | "isPerspectiveCamera" | "fov" | "aspect" | "focus" | "filmGauge" | "filmOffset" | "setFocalLength" | "getFocalLength" | "getEffectiveFOV" | "getFilmWidth" | "getFilmHeight" | "setViewOffset" | "clearViewOffset" | "updateProjectionMatrix" | "setLens" | "makeDefault"> & React.RefAttributes<unknown>>;
6
+ children?: React.ReactNode | ((texture: THREE.Texture) => React.ReactNode);
7
+ frames?: number | undefined;
8
+ resolution?: number | undefined;
9
+ envMap?: THREE.Texture | undefined;
10
+ }, "visible" | "attach" | "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 | "manual" | "zoom" | "view" | "matrixWorldInverse" | "projectionMatrix" | "projectionMatrixInverse" | "isCamera" | "near" | "far" | "isPerspectiveCamera" | "fov" | "aspect" | "focus" | "filmGauge" | "filmOffset" | "setFocalLength" | "getFocalLength" | "getEffectiveFOV" | "getFilmWidth" | "getFilmHeight" | "setViewOffset" | "clearViewOffset" | "updateProjectionMatrix" | "setLens" | "envMap" | "resolution" | "frames" | "makeDefault"> & React.RefAttributes<unknown>>;
@@ -1,10 +1,17 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import * as React from 'react';
3
- import { useThree } from '@react-three/fiber';
3
+ import { useThree, useFrame } from '@react-three/fiber';
4
4
  import mergeRefs from 'react-merge-refs';
5
+ import { useFBO } from './useFBO.js';
6
+
7
+ const isFunction = node => typeof node === 'function';
5
8
 
6
9
  const PerspectiveCamera = /*#__PURE__*/React.forwardRef(({
10
+ envMap,
11
+ resolution = 256,
12
+ frames = Infinity,
7
13
  makeDefault,
14
+ children,
8
15
  ...props
9
16
  }, ref) => {
10
17
  const set = useThree(({
@@ -17,6 +24,8 @@ const PerspectiveCamera = /*#__PURE__*/React.forwardRef(({
17
24
  size
18
25
  }) => size);
19
26
  const cameraRef = React.useRef(null);
27
+ const groupRef = React.useRef(null);
28
+ const fbo = useFBO(resolution);
20
29
  React.useLayoutEffect(() => {
21
30
  if (!props.manual) {
22
31
  cameraRef.current.aspect = size.width / size.height;
@@ -25,6 +34,22 @@ const PerspectiveCamera = /*#__PURE__*/React.forwardRef(({
25
34
  React.useLayoutEffect(() => {
26
35
  cameraRef.current.updateProjectionMatrix();
27
36
  });
37
+ let count = 0;
38
+ let oldEnvMap = null;
39
+ const functional = isFunction(children);
40
+ useFrame(state => {
41
+ if (functional && (frames === Infinity || count < frames)) {
42
+ groupRef.current.visible = false;
43
+ state.gl.setRenderTarget(fbo);
44
+ oldEnvMap = state.scene.background;
45
+ if (envMap) state.scene.background = envMap;
46
+ state.gl.render(state.scene, cameraRef.current);
47
+ state.scene.background = oldEnvMap;
48
+ state.gl.setRenderTarget(null);
49
+ groupRef.current.visible = true;
50
+ count++;
51
+ }
52
+ });
28
53
  React.useLayoutEffect(() => {
29
54
  if (makeDefault) {
30
55
  const oldCam = camera;
@@ -38,9 +63,11 @@ const PerspectiveCamera = /*#__PURE__*/React.forwardRef(({
38
63
  // that must exchange the default, and clean up after itself on unmount.
39
64
 
40
65
  }, [cameraRef, makeDefault, set]);
41
- return /*#__PURE__*/React.createElement("perspectiveCamera", _extends({
66
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("perspectiveCamera", _extends({
42
67
  ref: mergeRefs([cameraRef, ref])
43
- }, props));
68
+ }, props), !functional && children), /*#__PURE__*/React.createElement("group", {
69
+ ref: groupRef
70
+ }, functional && children(fbo.texture)));
44
71
  });
45
72
 
46
73
  export { PerspectiveCamera };
@@ -8,4 +8,4 @@ export declare const RenderTexture: React.ForwardRefExoticComponent<Pick<import(
8
8
  eventPriority?: number | undefined;
9
9
  frames?: number | undefined;
10
10
  children: React.ReactNode;
11
- }, "attach" | "args" | "children" | "key" | "onUpdate" | "rotation" | "matrix" | "dispose" | "type" | "id" | "uuid" | "name" | "matrixAutoUpdate" | "userData" | "updateMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "center" | "source" | "repeat" | "image" | "offset" | "needsUpdate" | "version" | "width" | "height" | "sourceFile" | "mipmaps" | "mapping" | "wrapS" | "wrapT" | "magFilter" | "minFilter" | "anisotropy" | "format" | "internalFormat" | "generateMipmaps" | "premultiplyAlpha" | "flipY" | "unpackAlignment" | "encoding" | "isRenderTargetTexture" | "needsPMREMUpdate" | "isTexture" | "transformUv" | "frames" | "renderPriority" | "samples" | "eventPriority"> & React.RefAttributes<unknown>>;
11
+ }, "attach" | "args" | "children" | "key" | "onUpdate" | "rotation" | "matrix" | "dispose" | "type" | "id" | "uuid" | "name" | "matrixAutoUpdate" | "userData" | "updateMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "center" | "source" | "repeat" | "image" | "offset" | "needsUpdate" | "version" | "width" | "height" | "sourceFile" | "mipmaps" | "mapping" | "wrapS" | "wrapT" | "magFilter" | "minFilter" | "anisotropy" | "format" | "internalFormat" | "generateMipmaps" | "premultiplyAlpha" | "flipY" | "unpackAlignment" | "encoding" | "isRenderTargetTexture" | "needsPMREMUpdate" | "isTexture" | "transformUv" | "samples" | "frames" | "renderPriority" | "eventPriority"> & React.RefAttributes<unknown>>;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("@react-three/fiber"),n=require("suspend-react"),s=require("three-stdlib");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(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 l=i(e),a=u(t);const c=["string","number"],o=a.forwardRef((({font:e,letterSpacing:i=0,lineHeight:u=1,size:o=1,height:f=.2,bevelThickness:b=.1,bevelSize:d=.01,bevelEnabled:m=!1,bevelOffset:h=0,bevelSegments:v=4,curveSegments:g=8,children:p,...y},O)=>{a.useMemo((()=>r.extend({RenamedTextGeometry:s.TextGeometry})),[]);const j=n.suspend((async()=>{let t="string"==typeof e?await(await fetch(e)).json():e;return(new s.FontLoader).parse(t)}),[e]),x=t.useMemo((()=>({font:j,size:o,height:f,bevelThickness:b,bevelSize:d,bevelEnabled:m,bevelSegments:v,bevelOffset:h,curveSegments:g,letterSpacing:i,lineHeight:u})),[j,o,f,b,d,m,h,g,i,u]),[S,...E]=t.useMemo((()=>(e=>{let t="";const r=[];return a.Children.forEach(e,(e=>{c.includes(typeof e)?t+=e+"":r.push(e)})),[t,...r]})(p)),[p]),M=a.useMemo((()=>[S,x]),[S,x]);return a.createElement("mesh",l.default({},y,{ref:O}),a.createElement("renamedTextGeometry",{args:M}),E)}));exports.Text3D=o;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("@react-three/fiber"),n=require("suspend-react"),s=require("three-stdlib");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(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 l=i(e),a=u(t);const c=["string","number"],o=a.forwardRef((({font:e,letterSpacing:i=0,lineHeight:u=1,size:o=1,height:f=.2,bevelThickness:b=.1,bevelSize:d=.01,bevelEnabled:m=!1,bevelOffset:h=0,bevelSegments:v=4,curveSegments:g=8,children:p,...y},O)=>{a.useMemo((()=>r.extend({RenamedTextGeometry:s.TextGeometry})),[]);const j=n.suspend((async()=>{let t="string"==typeof e?await(await fetch(e)).json():e;return(new s.FontLoader).parse(t)}),[e]),x=t.useMemo((()=>({font:j,size:o,height:f,bevelThickness:b,bevelSize:d,bevelEnabled:m,bevelSegments:v,bevelOffset:h,curveSegments:g,letterSpacing:i,lineHeight:u})),[j,o,f,b,d,m,v,h,g,i,u]),[S,...E]=t.useMemo((()=>(e=>{let t="";const r=[];return a.Children.forEach(e,(e=>{c.includes(typeof e)?t+=e+"":r.push(e)})),[t,...r]})(p)),[p]),M=a.useMemo((()=>[S,x]),[S,x]);return a.createElement("mesh",l.default({},y,{ref:O}),a.createElement("renamedTextGeometry",{args:M}),E)}));exports.Text3D=o;
package/core/Text3D.js CHANGED
@@ -53,7 +53,7 @@ const Text3D = /*#__PURE__*/React.forwardRef(({
53
53
  letterSpacing,
54
54
  lineHeight
55
55
  };
56
- }, [font, size, height, bevelThickness, bevelSize, bevelEnabled, bevelOffset, curveSegments, letterSpacing, lineHeight]);
56
+ }, [font, size, height, bevelThickness, bevelSize, bevelEnabled, bevelSegments, bevelOffset, curveSegments, letterSpacing, lineHeight]);
57
57
  /**
58
58
  * We need the `children` in the deps because we
59
59
  * need to be able to do `<Text3d>{state}</Text3d>`.