@react-three/drei 9.0.0-beta.3 → 9.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +293 -26
  2. package/core/ArcballControls.cjs.js +1 -1
  3. package/core/ArcballControls.js +13 -25
  4. package/core/Bounds.cjs.js +1 -1
  5. package/core/Bounds.d.ts +2 -1
  6. package/core/Bounds.js +25 -14
  7. package/core/Clone.cjs.js +1 -0
  8. package/core/Clone.d.ts +11 -0
  9. package/core/Clone.js +92 -0
  10. package/core/Cloud.cjs.js +1 -1
  11. package/core/Cloud.d.ts +3 -1
  12. package/core/Cloud.js +4 -1
  13. package/core/ComputedAttribute.cjs.js +1 -0
  14. package/core/ComputedAttribute.d.ts +9 -0
  15. package/core/ComputedAttribute.js +34 -0
  16. package/core/ContactShadows.cjs.js +1 -1
  17. package/core/ContactShadows.d.ts +3 -1
  18. package/core/ContactShadows.js +15 -2
  19. package/core/CubeCamera.cjs.js +1 -1
  20. package/core/CubeCamera.js +6 -6
  21. package/core/DeviceOrientationControls.cjs.js +1 -1
  22. package/core/DeviceOrientationControls.js +2 -6
  23. package/core/Effects.cjs.js +1 -1
  24. package/core/Effects.d.ts +3 -2
  25. package/core/Effects.js +2 -2
  26. package/core/Environment.cjs.js +1 -1
  27. package/core/Environment.d.ts +13 -3
  28. package/core/Environment.js +96 -33
  29. package/core/FirstPersonControls.cjs.js +1 -1
  30. package/core/FirstPersonControls.js +2 -6
  31. package/core/Float.cjs.js +1 -1
  32. package/core/Float.d.ts +1 -1
  33. package/core/Float.js +5 -4
  34. package/core/GizmoHelper.cjs.js +1 -1
  35. package/core/GizmoHelper.d.ts +2 -1
  36. package/core/GizmoHelper.js +31 -41
  37. package/core/Image.cjs.js +1 -1
  38. package/core/Image.d.ts +5 -3
  39. package/core/Image.js +6 -1
  40. package/core/Instances.cjs.js +1 -1
  41. package/core/Instances.d.ts +1 -1
  42. package/core/Instances.js +5 -11
  43. package/core/Lightformer.cjs.js +1 -0
  44. package/core/Lightformer.d.ts +41 -0
  45. package/core/Lightformer.js +51 -0
  46. package/core/MeshReflectorMaterial.cjs.js +1 -1
  47. package/core/MeshReflectorMaterial.d.ts +1 -2
  48. package/core/MeshReflectorMaterial.js +4 -5
  49. package/core/OrbitControls.cjs.js +1 -1
  50. package/core/OrbitControls.js +18 -31
  51. package/core/PointMaterial.cjs.js +1 -1
  52. package/core/PointMaterial.d.ts +5 -8
  53. package/core/PointMaterial.js +16 -34
  54. package/core/PointerLockControls.cjs.js +1 -1
  55. package/core/PointerLockControls.d.ts +3 -1
  56. package/core/PointerLockControls.js +36 -22
  57. package/core/Points.cjs.js +1 -1
  58. package/core/Points.d.ts +3 -3
  59. package/core/Points.js +11 -30
  60. package/core/Reflector.d.ts +1 -1
  61. package/core/Sampler.cjs.js +1 -0
  62. package/core/Sampler.d.ts +21 -0
  63. package/core/Sampler.js +65 -0
  64. package/core/SpotLight.d.ts +1 -1
  65. package/core/Stage.cjs.js +1 -1
  66. package/core/Stage.js +1 -2
  67. package/core/Stars.cjs.js +1 -1
  68. package/core/Stars.js +3 -0
  69. package/core/Stats.cjs.js +1 -1
  70. package/core/Stats.js +1 -1
  71. package/core/Text.cjs.js +1 -1
  72. package/core/Text.d.ts +2 -1
  73. package/core/Text.js +3 -2
  74. package/core/TrackballControls.cjs.js +1 -1
  75. package/core/TrackballControls.js +7 -5
  76. package/core/Trail.cjs.js +1 -0
  77. package/core/Trail.d.ts +21 -0
  78. package/core/Trail.js +160 -0
  79. package/core/TransformControls.cjs.js +1 -1
  80. package/core/TransformControls.js +7 -13
  81. package/core/index.cjs.js +1 -1
  82. package/core/index.d.ts +6 -0
  83. package/core/index.js +9 -2
  84. package/core/useBoxProjectedEnv.cjs.js +1 -0
  85. package/core/useBoxProjectedEnv.d.ts +8 -0
  86. package/core/useBoxProjectedEnv.js +98 -0
  87. package/core/useFBO.cjs.js +1 -1
  88. package/core/useFBO.d.ts +1 -1
  89. package/core/useFBO.js +22 -24
  90. package/core/useGLTF.d.ts +1 -1
  91. package/core/useHelper.d.ts +3 -1
  92. package/index.cjs.js +1 -1
  93. package/index.js +7 -1
  94. package/materials/ConvolutionMaterial.cjs.js +1 -1
  95. package/materials/ConvolutionMaterial.js +2 -0
  96. package/materials/MeshReflectorMaterial.cjs.js +1 -1
  97. package/materials/MeshReflectorMaterial.d.ts +0 -3
  98. package/materials/MeshReflectorMaterial.js +8 -34
  99. package/materials/SpotLightMaterial.cjs.js +1 -1
  100. package/materials/SpotLightMaterial.js +3 -0
  101. package/native/index.cjs.js +1 -1
  102. package/native/index.js +9 -2
  103. package/package.json +6 -5
  104. package/web/ScrollControls.cjs.js +1 -1
  105. package/web/ScrollControls.js +2 -2
  106. package/web/index.cjs.js +1 -1
  107. package/web/index.js +9 -2
@@ -0,0 +1,11 @@
1
+ import * as React from 'react';
2
+ import { MeshProps } from '@react-three/fiber';
3
+ export declare const Clone: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").GroupProps, "children"> & {
4
+ object: THREE.Object3D | THREE.Object3D[];
5
+ children?: React.ReactNode;
6
+ deep?: boolean | "materialsOnly" | "geometriesOnly" | undefined;
7
+ keys?: string[] | undefined;
8
+ inject?: React.ReactNode | MeshProps | ((object: THREE.Object3D) => React.ReactNode);
9
+ castShadow?: boolean | undefined;
10
+ receiveShadow?: boolean | undefined;
11
+ }, "object" | "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "isGroup" | "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 | "keys" | "deep" | "inject"> & React.RefAttributes<import("three").Group>>;
package/core/Clone.js ADDED
@@ -0,0 +1,92 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as React from 'react';
3
+ import pick from 'lodash.pick';
4
+
5
+ function createSpread(child, {
6
+ keys = ['near', 'far', 'color', 'distance', 'decay', 'penumbra', 'angle', 'intensity', 'skeleton', 'visible', 'castShadow', 'receiveShadow', 'morphTargetDictionary', 'morphTargetInfluences', 'name', 'geometry', 'material', 'position', 'rotation', 'scale', 'up', 'userData'],
7
+ deep,
8
+ inject,
9
+ castShadow,
10
+ receiveShadow
11
+ }) {
12
+ let spread = pick(child, keys);
13
+
14
+ if (deep) {
15
+ if (spread.geometry && deep !== 'materialsOnly') spread.geometry = spread.geometry.clone();
16
+ if (spread.material && deep !== 'geometriesOnly') spread.material = spread.material.clone();
17
+ }
18
+
19
+ if (inject) {
20
+ if (typeof inject === 'function') spread = { ...spread,
21
+ children: inject(child)
22
+ };else if ( /*#__PURE__*/React.isValidElement(inject)) spread = { ...spread,
23
+ children: inject
24
+ };else spread = { ...spread,
25
+ ...inject
26
+ };
27
+ }
28
+
29
+ if (child.type === 'Mesh') {
30
+ if (castShadow) spread.castShadow = true;
31
+ if (receiveShadow) spread.receiveShadow = true;
32
+ }
33
+
34
+ return spread;
35
+ }
36
+
37
+ const Clone = /*#__PURE__*/React.forwardRef(({
38
+ object,
39
+ children,
40
+ deep,
41
+ castShadow,
42
+ receiveShadow,
43
+ inject,
44
+ keys,
45
+ ...props
46
+ }, forwardRef) => {
47
+ const config = {
48
+ keys,
49
+ deep,
50
+ inject,
51
+ castShadow,
52
+ receiveShadow
53
+ }; // Deal with arrayed clones
54
+
55
+ if (Array.isArray(object)) {
56
+ return /*#__PURE__*/React.createElement("group", _extends({}, props, {
57
+ ref: forwardRef
58
+ }), object.map(o => /*#__PURE__*/React.createElement(Clone, _extends({
59
+ key: o.uuid,
60
+ object: o
61
+ }, config))), children);
62
+ } // Singleton clones
63
+
64
+
65
+ const {
66
+ children: injectChildren,
67
+ ...spread
68
+ } = createSpread(object, config);
69
+ const Element = object.type[0].toLowerCase() + object.type.slice(1);
70
+ return /*#__PURE__*/React.createElement(Element, _extends({}, spread, props, {
71
+ ref: forwardRef
72
+ }), (object == null ? void 0 : object.children).map(child => {
73
+ let spread = {};
74
+ let Element = child.type[0].toLowerCase() + child.type.slice(1);
75
+
76
+ if (Element === 'group' || Element === 'object3D') {
77
+ Element = Clone;
78
+ spread = {
79
+ object: child,
80
+ ...config
81
+ };
82
+ } else {
83
+ spread = createSpread(child, config);
84
+ }
85
+
86
+ return /*#__PURE__*/React.createElement(Element, _extends({
87
+ key: child.uuid
88
+ }, spread));
89
+ }), children, injectChildren);
90
+ });
91
+
92
+ export { Clone };
package/core/Cloud.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("./Billboard.cjs.js"),a=require("./shapes.cjs.js"),n=require("./useTexture.cjs.js");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 a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("@babel/runtime/helpers/extends"),require("react-merge-refs"),require("three");var c=s(e);exports.Cloud=function({opacity:e=.5,speed:s=.4,width:i=10,depth:o=1.5,segments:u=20,texture:l="https://rawcdn.githack.com/pmndrs/drei-assets/9225a9f1fbd449d9411125c2f419b843d0308c9f/cloud.png",...d}){const h=c.useRef(),m=n.useTexture(l),p=c.useMemo((()=>[...new Array(u)].map(((e,r)=>({x:i/2-Math.random()*i,y:i/2-Math.random()*i,scale:.4+Math.sin((r+1)/u*Math.PI)*(10*(.2+Math.random())),density:Math.max(.2,Math.random()),rotation:Math.max(.002,.005*Math.random())*s})))),[i,u,s]);return r.useFrame((e=>{var r;return null==(r=h.current)?void 0:r.children.forEach(((r,t)=>{r.children[0].rotation.z+=p[t].rotation,r.children[0].scale.setScalar(p[t].scale+(1+Math.sin(e.clock.getElapsedTime()/10))/2*t/10)}))})),c.createElement("group",d,c.createElement("group",{position:[0,0,u/2*o],ref:h},p.map((({x:r,y:n,scale:s,density:i},u)=>c.createElement(t.Billboard,{key:u,position:[r,n,-u*o]},c.createElement(a.Plane,{scale:s,rotation:[0,0,0]},c.createElement("meshStandardMaterial",{map:m,transparent:!0,opacity:s/6*i*e,depthTest:!1})))))))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),t=require("./Billboard.cjs.js"),a=require("./shapes.cjs.js"),n=require("./useTexture.cjs.js");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 a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("@babel/runtime/helpers/extends"),require("react-merge-refs"),require("three");var c=s(e);exports.Cloud=function({opacity:e=.5,speed:s=.4,width:o=10,depth:i=1.5,segments:u=20,texture:l="https://rawcdn.githack.com/pmndrs/drei-assets/9225a9f1fbd449d9411125c2f419b843d0308c9f/cloud.png",color:d="#ffffff",depthTest:f=!0,...h}){const p=c.useRef(),m=n.useTexture(l),b=c.useMemo((()=>[...new Array(u)].map(((e,r)=>({x:o/2-Math.random()*o,y:o/2-Math.random()*o,scale:.4+Math.sin((r+1)/u*Math.PI)*(10*(.2+Math.random())),density:Math.max(.2,Math.random()),rotation:Math.max(.002,.005*Math.random())*s})))),[o,u,s]);return r.useFrame((e=>{var r;return null==(r=p.current)?void 0:r.children.forEach(((r,t)=>{r.children[0].rotation.z+=b[t].rotation,r.children[0].scale.setScalar(b[t].scale+(1+Math.sin(e.clock.getElapsedTime()/10))/2*t/10)}))})),c.createElement("group",h,c.createElement("group",{position:[0,0,u/2*i],ref:p},b.map((({x:r,y:n,scale:s,density:o},u)=>c.createElement(t.Billboard,{key:u,position:[r,n,-u*i]},c.createElement(a.Plane,{scale:s,rotation:[0,0,0]},c.createElement("meshStandardMaterial",{map:m,transparent:!0,opacity:s/6*o*e,depthTest:f,color:d})))))))};
package/core/Cloud.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- export declare function Cloud({ opacity, speed, width, depth, segments, texture, ...props }: {
2
+ export declare function Cloud({ opacity, speed, width, depth, segments, texture, color, depthTest, ...props }: {
3
3
  [x: string]: any;
4
4
  opacity?: number | undefined;
5
5
  speed?: number | undefined;
@@ -7,4 +7,6 @@ export declare function Cloud({ opacity, speed, width, depth, segments, texture,
7
7
  depth?: number | undefined;
8
8
  segments?: number | undefined;
9
9
  texture?: string | undefined;
10
+ color?: string | undefined;
11
+ depthTest?: boolean | undefined;
10
12
  }): JSX.Element;
package/core/Cloud.js CHANGED
@@ -12,6 +12,8 @@ function Cloud({
12
12
  depth = 1.5,
13
13
  segments = 20,
14
14
  texture = CLOUD_URL,
15
+ color = "#ffffff",
16
+ depthTest = true,
15
17
  ...props
16
18
  }) {
17
19
  const group = React.useRef();
@@ -49,7 +51,8 @@ function Cloud({
49
51
  map: cloudTexture,
50
52
  transparent: true,
51
53
  opacity: scale / 6 * density * opacity,
52
- depthTest: false
54
+ depthTest: depthTest,
55
+ color: color
53
56
  }))))));
54
57
  }
55
58
 
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function n(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var u=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,u.get?u:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var c=u(e),a=n(t);exports.ComputedAttribute=({compute:e,name:t,...u})=>{const[n]=a.useState((()=>new r.BufferAttribute(new Float32Array(0),1))),f=a.useRef(null);return a.useLayoutEffect((()=>{if(f.current){var t;const r=null!==(t=f.current.parent)&&void 0!==t?t:f.current.__r3f.parent,u=e(r);f.current.copy(u)}}),[e]),a.createElement("primitive",c.default({ref:f,object:n,attach:`attributes-${t}`},u))};
@@ -0,0 +1,9 @@
1
+ import { BufferAttributeProps } from '@react-three/fiber';
2
+ import * as React from 'react';
3
+ import { BufferAttribute, BufferGeometry } from 'three';
4
+ declare type Props = {
5
+ compute: (geometry: BufferGeometry) => BufferAttribute;
6
+ name: string;
7
+ };
8
+ export declare const ComputedAttribute: ({ compute, name, ...props }: React.PropsWithChildren<Props & BufferAttributeProps>) => JSX.Element;
9
+ export {};
@@ -0,0 +1,34 @@
1
+ import _extends from '@babel/runtime/helpers/esm/extends';
2
+ import * as React from 'react';
3
+ import { BufferAttribute } from 'three';
4
+
5
+ /**
6
+ * Used exclusively as a child of a BufferGeometry.
7
+ * Computes the BufferAttribute by calling the `compute` function
8
+ * and attaches the attribute to the geometry.
9
+ */
10
+ const ComputedAttribute = ({
11
+ compute,
12
+ name,
13
+ ...props
14
+ }) => {
15
+ const [bufferAttribute] = React.useState(() => new BufferAttribute(new Float32Array(0), 1));
16
+ const primitive = React.useRef(null);
17
+ React.useLayoutEffect(() => {
18
+ if (primitive.current) {
19
+ var _ref;
20
+
21
+ // @ts-expect-error brittle
22
+ const parent = (_ref = primitive.current.parent) !== null && _ref !== void 0 ? _ref : primitive.current.__r3f.parent;
23
+ const attr = compute(parent);
24
+ primitive.current.copy(attr);
25
+ }
26
+ }, [compute]);
27
+ return /*#__PURE__*/React.createElement("primitive", _extends({
28
+ ref: primitive,
29
+ object: bufferAttribute,
30
+ attach: `attributes-${name}`
31
+ }, props));
32
+ };
33
+
34
+ export { ComputedAttribute };
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),a=require("@react-three/fiber"),n=require("three-stdlib");function u(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 a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var i=u(e),s=o(r),l=o(t);const c=s.forwardRef((({scale:e,frames:r=1/0,opacity:t=1,width:u=1,height:o=1,blur:c=1,far:d=10,resolution:f=256,smooth:h=!0,...m},p)=>{const g=a.useThree((({scene:e})=>e)),b=a.useThree((({gl:e})=>e)),M=s.useRef(null);u*=Array.isArray(e)?e[0]:e||1,o*=Array.isArray(e)?e[1]:e||1;const[v,y,w,T,x,R,j]=s.useMemo((()=>{const e=new l.WebGLRenderTarget(f,f),r=new l.WebGLRenderTarget(f,f);r.texture.generateMipmaps=e.texture.generateMipmaps=!1;const t=new l.PlaneBufferGeometry(u,o).rotateX(Math.PI/2),a=new l.Mesh(t),i=new l.MeshDepthMaterial;i.depthTest=i.depthWrite=!1,i.onBeforeCompile=e=>e.fragmentShader=e.fragmentShader.replace("1.0 - fragCoordZ ), opacity );","0.0 ), ( 1.0 - fragCoordZ ) * 1.0 );");const s=new l.ShaderMaterial(n.HorizontalBlurShader),c=new l.ShaderMaterial(n.VerticalBlurShader);return c.depthTest=s.depthTest=!1,[e,t,i,a,s,c,r]}),[f,u,o,e]),O=s.useCallback((e=>{T.visible=!0,T.material=x,x.uniforms.tDiffuse.value=v.texture,x.uniforms.h.value=1*e/256,b.setRenderTarget(j),b.render(T,M.current),T.material=R,R.uniforms.tDiffuse.value=j.texture,R.uniforms.v.value=1*e/256,b.setRenderTarget(v),b.render(T,M.current),T.visible=!1}),[]);let P=0;return a.useFrame((()=>{if(M.current&&(r===1/0||P<r)){const e=g.background;g.background=null,g.overrideMaterial=w,b.setRenderTarget(v),b.render(g,M.current),g.overrideMaterial=null,O(c),h&&O(.4*c),b.setRenderTarget(null),g.background=e,P++}})),s.createElement("group",i.default({"rotation-x":Math.PI/2},m,{ref:p}),s.createElement("mesh",{geometry:y,scale:[1,-1,1],rotation:[-Math.PI/2,0,0]},s.createElement("meshBasicMaterial",{map:v.texture,transparent:!0,opacity:t})),s.createElement("orthographicCamera",{ref:M,args:[-u/2,u/2,o/2,-o/2,0,d]}))}));exports.ContactShadows=c;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),a=require("@react-three/fiber"),n=require("three-stdlib");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var i=o(e),l=u(r),s=u(t);const c=l.forwardRef((({scale:e,frames:r=1/0,opacity:t=1,width:o=1,height:u=1,blur:c=1,far:d=10,resolution:f=256,smooth:h=!0,color:m="#000000",...p},g)=>{const v=a.useThree((({scene:e})=>e)),b=a.useThree((({gl:e})=>e)),M=l.useRef(null);o*=Array.isArray(e)?e[0]:e||1,u*=Array.isArray(e)?e[1]:e||1;const[y,w,T,S,x,R,j]=l.useMemo((()=>{const e=new s.WebGLRenderTarget(f,f),r=new s.WebGLRenderTarget(f,f);r.texture.generateMipmaps=e.texture.generateMipmaps=!1;const t=new s.PlaneBufferGeometry(o,u).rotateX(Math.PI/2),a=new s.Mesh(t),i=new s.MeshDepthMaterial;i.depthTest=i.depthWrite=!1,i.onBeforeCompile=e=>{e.uniforms={...e.uniforms,ucolor:{value:new s.Color(m).convertSRGBToLinear()}},e.fragmentShader=e.fragmentShader.replace("void main() {","uniform vec3 ucolor;\n void main() {\n "),e.fragmentShader=e.fragmentShader.replace("vec4( vec3( 1.0 - fragCoordZ ), opacity );","vec4( ucolor, ( 1.0 - fragCoordZ ) * 1.0 );")};const l=new s.ShaderMaterial(n.HorizontalBlurShader),c=new s.ShaderMaterial(n.VerticalBlurShader);return c.depthTest=l.depthTest=!1,[e,t,i,a,l,c,r]}),[f,o,u,e]),C=l.useCallback((e=>{S.visible=!0,S.material=x,x.uniforms.tDiffuse.value=y.texture,x.uniforms.h.value=1*e/256,b.setRenderTarget(j),b.render(S,M.current),S.material=R,R.uniforms.tDiffuse.value=j.texture,R.uniforms.v.value=1*e/256,b.setRenderTarget(y),b.render(S,M.current),S.visible=!1}),[]);let O=0;return a.useFrame((()=>{if(M.current&&(r===1/0||O<r)){const e=v.background;v.background=null;const r=v.overrideMaterial;v.overrideMaterial=T,b.setRenderTarget(y),b.render(v,M.current),v.overrideMaterial=r,C(c),h&&C(.4*c),b.setRenderTarget(null),v.background=e,O++}})),l.createElement("group",i.default({"rotation-x":Math.PI/2},p,{ref:g}),l.createElement("mesh",{geometry:w,scale:[1,-1,1],rotation:[-Math.PI/2,0,0]},l.createElement("meshBasicMaterial",{map:y.texture,transparent:!0,opacity:t})),l.createElement("orthographicCamera",{ref:M,args:[-o/2,o/2,u/2,-u/2,0,d]}))}));exports.ContactShadows=c;
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import * as THREE from 'three';
2
3
  export declare const ContactShadows: React.ForwardRefExoticComponent<Pick<Omit<import("@react-three/fiber").GroupProps, "scale"> & {
3
4
  opacity?: number | undefined;
4
5
  width?: number | undefined;
@@ -9,4 +10,5 @@ export declare const ContactShadows: React.ForwardRefExoticComponent<Pick<Omit<i
9
10
  resolution?: number | undefined;
10
11
  frames?: number | undefined;
11
12
  scale?: number | [x: number, y: number] | undefined;
12
- }, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "isGroup" | "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 | "smooth" | "blur" | "height" | "opacity" | "width" | "resolution" | "far" | "frames"> & React.RefAttributes<unknown>>;
13
+ color?: THREE.ColorRepresentation | undefined;
14
+ }, "visible" | "attach" | "args" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "isGroup" | "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" | "color" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "smooth" | "blur" | "height" | "opacity" | "width" | "resolution" | "far" | "frames"> & React.RefAttributes<unknown>>;
@@ -14,6 +14,7 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
14
14
  far = 10,
15
15
  resolution = 256,
16
16
  smooth = true,
17
+ color = '#000000',
17
18
  ...props
18
19
  }, ref) => {
19
20
  const scene = useThree(({
@@ -34,7 +35,18 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
34
35
  const depthMaterial = new THREE.MeshDepthMaterial();
35
36
  depthMaterial.depthTest = depthMaterial.depthWrite = false;
36
37
 
37
- depthMaterial.onBeforeCompile = shader => shader.fragmentShader = shader.fragmentShader.replace('1.0 - fragCoordZ ), opacity );', '0.0 ), ( 1.0 - fragCoordZ ) * 1.0 );');
38
+ depthMaterial.onBeforeCompile = shader => {
39
+ shader.uniforms = { ...shader.uniforms,
40
+ ucolor: {
41
+ value: new THREE.Color(color).convertSRGBToLinear()
42
+ }
43
+ };
44
+ shader.fragmentShader = shader.fragmentShader.replace(`void main() {`, //
45
+ `uniform vec3 ucolor;
46
+ void main() {
47
+ `);
48
+ shader.fragmentShader = shader.fragmentShader.replace('vec4( vec3( 1.0 - fragCoordZ ), opacity );', 'vec4( ucolor, ( 1.0 - fragCoordZ ) * 1.0 );');
49
+ };
38
50
 
39
51
  const horizontalBlurMaterial = new THREE.ShaderMaterial(HorizontalBlurShader);
40
52
  const verticalBlurMaterial = new THREE.ShaderMaterial(VerticalBlurShader);
@@ -60,10 +72,11 @@ const ContactShadows = /*#__PURE__*/React.forwardRef(({
60
72
  if (shadowCamera.current && (frames === Infinity || count < frames)) {
61
73
  const initialBackground = scene.background;
62
74
  scene.background = null;
75
+ const initialOverrideMaterial = scene.overrideMaterial;
63
76
  scene.overrideMaterial = depthMaterial;
64
77
  gl.setRenderTarget(renderTarget);
65
78
  gl.render(scene, shadowCamera.current);
66
- scene.overrideMaterial = null;
79
+ scene.overrideMaterial = initialOverrideMaterial;
67
80
  blurShadows(blur);
68
81
  if (smooth) blurShadows(blur * 0.4);
69
82
  gl.setRenderTarget(null);
@@ -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 u=n(r);exports.CubeCamera=function({children:r,fog:n,frames:a=1/0,resolution:i=256,near:c=1,far:o=1e3,...s}){const f=u.useRef(),[l,g]=u.useState(null),b=t.useThree((({scene:e})=>e)),d=t.useThree((({gl:e})=>e)),m=u.useMemo((()=>new e.WebGLCubeRenderTarget(i,{minFilter:e.LinearFilter,magFilter:e.LinearFilter,encoding:d.outputEncoding})),[i]);let p=0;return t.useFrame((()=>{if(l&&f.current&&(a===1/0||p<a)){f.current.traverse((e=>e.visible=!1));const e=b.fog;b.fog=n||e,l.update(d,b),b.fog=e,f.current.traverse((e=>e.visible=!0)),p++}})),u.createElement("group",s,u.createElement("cubeCamera",{ref:g,args:[c,o,m]}),u.createElement("group",{ref:f},r(m.texture)))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three"),r=require("react"),t=require("@react-three/fiber");function u(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=u(r);exports.CubeCamera=function({children:r,fog:u,frames:a=1/0,resolution:c=256,near:o=1,far:s=1e3,...f}){const i=n.useRef(),[l,b]=n.useState(null),g=t.useThree((({scene:e})=>e)),p=t.useThree((({gl:e})=>e)),d=n.useMemo((()=>{const r=new e.WebGLCubeRenderTarget(c);return r.texture.type=e.HalfFloatType,r}),[c]);let m=0;return t.useFrame((()=>{if(l&&i.current&&(a===1/0||m<a)){i.current.traverse((e=>e.visible=!1));const e=g.fog;g.fog=u||e,l.update(p,g),g.fog=e,i.current.traverse((e=>e.visible=!0)),m++}})),n.createElement("group",f,n.createElement("cubeCamera",{ref:b,args:[o,s,d]}),n.createElement("group",{ref:i},r(d.texture)))};
@@ -1,4 +1,4 @@
1
- import { WebGLCubeRenderTarget, LinearFilter } from 'three';
1
+ import { WebGLCubeRenderTarget, HalfFloatType } from 'three';
2
2
  import * as React from 'react';
3
3
  import { useThree, useFrame } from '@react-three/fiber';
4
4
 
@@ -19,11 +19,11 @@ function CubeCamera({
19
19
  const gl = useThree(({
20
20
  gl
21
21
  }) => gl);
22
- const fbo = React.useMemo(() => new WebGLCubeRenderTarget(resolution, {
23
- minFilter: LinearFilter,
24
- magFilter: LinearFilter,
25
- encoding: gl.outputEncoding
26
- }), [resolution]);
22
+ const fbo = React.useMemo(() => {
23
+ const fbo = new WebGLCubeRenderTarget(resolution);
24
+ fbo.texture.type = HalfFloatType;
25
+ return fbo;
26
+ }, [resolution]);
27
27
  let count = 0;
28
28
  useFrame(() => {
29
29
  if (camera && ref.current && (frames === Infinity || count < frames)) {
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("@react-three/fiber"),r=require("react"),n=require("three-stdlib");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var o=u(e),a=i(r);const l=a.forwardRef(((e,r)=>{const{camera:u,onChange:i,...l}=e,c=t.useThree((({camera:e})=>e)),s=t.useThree((({invalidate:e})=>e)),d=u||c,[f]=a.useState((()=>new n.DeviceOrientationControls(d)));return a.useEffect((()=>{const e=e=>{s(),i&&i(e)};return null==f||null==f.addEventListener||f.addEventListener("change",e),()=>null==f||null==f.removeEventListener?void 0:f.removeEventListener("change",e)}),[i,f,s]),t.useFrame((()=>null==f?void 0:f.update())),a.useEffect((()=>{const e=f;return null==e||e.connect(),()=>null==e?void 0:e.dispose()}),[f]),f?a.createElement("primitive",o.default({ref:r,dispose:void 0,object:f},l)):null}));exports.DeviceOrientationControls=l;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("@react-three/fiber"),r=require("react"),n=require("three-stdlib");function u(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var o=u(e),a=i(r);const l=a.forwardRef(((e,r)=>{const{camera:u,onChange:i,...l}=e,c=t.useThree((e=>e.camera)),s=t.useThree((e=>e.invalidate)),d=u||c,[f]=a.useState((()=>new n.DeviceOrientationControls(d)));return a.useEffect((()=>{const e=e=>{s(),i&&i(e)};return null==f||null==f.addEventListener||f.addEventListener("change",e),()=>null==f||null==f.removeEventListener?void 0:f.removeEventListener("change",e)}),[i,f,s]),t.useFrame((()=>null==f?void 0:f.update())),a.useEffect((()=>{const e=f;return null==e||e.connect(),()=>null==e?void 0:e.dispose()}),[f]),f?a.createElement("primitive",o.default({ref:r,dispose:void 0,object:f},l)):null}));exports.DeviceOrientationControls=l;
@@ -9,12 +9,8 @@ const DeviceOrientationControls = /*#__PURE__*/React.forwardRef((props, ref) =>
9
9
  onChange,
10
10
  ...rest
11
11
  } = props;
12
- const defaultCamera = useThree(({
13
- camera
14
- }) => camera);
15
- const invalidate = useThree(({
16
- invalidate
17
- }) => invalidate);
12
+ const defaultCamera = useThree(state => state.camera);
13
+ const invalidate = useThree(state => state.invalidate);
18
14
  const explCamera = camera || defaultCamera;
19
15
  const [controls] = React.useState(() => new DeviceOrientationControls$1(explCamera));
20
16
  React.useEffect(() => {
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),a=require("@react-three/fiber"),s=require("three-stdlib"),n=require("react-merge-refs");function u(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 a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var i=u(e),o=c(r),l=u(n);a.extend({EffectComposer:s.EffectComposer,RenderPass:s.RenderPass,ShaderPass:s.ShaderPass});const d=()=>{try{var e=document.createElement("canvas");return!(!window.WebGL2RenderingContext||!e.getContext("webgl2"))}catch(e){return!1}},f=o.forwardRef((({children:e,multisamping:r=8,renderIndex:n=1,disableGamma:u=!1,disableRenderPass:c=!1,...f},h)=>{const m=o.useRef(),b=a.useThree((({scene:e})=>e)),g=a.useThree((({camera:e})=>e)),p=a.useThree((({gl:e})=>e)),P=a.useThree((({size:e})=>e)),[v]=o.useState((()=>{if(d()&&r>0){const e=new t.WebGLMultisampleRenderTarget(P.width,P.height,{format:t.RGBAFormat,encoding:t.sRGBEncoding});return e.samples=8,e}}));return o.useEffect((()=>{var e,r;null==(e=m.current)||e.setSize(P.width,P.height),null==(r=m.current)||r.setPixelRatio(p.getPixelRatio())}),[p,P]),a.useFrame((()=>{var e;return null==(e=m.current)?void 0:e.render()}),n),o.createElement("effectComposer",i.default({ref:l.default([h,m]),args:[p,v]},f),!c&&o.createElement("renderPass",{attach:"passes",args:[b,g]}),!u&&o.createElement("shaderPass",{attach:"passes",args:[s.GammaCorrectionShader]}),e)}));exports.Effects=f,exports.isWebGL2Available=d;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),a=require("@react-three/fiber"),s=require("three-stdlib"),n=require("react-merge-refs");function u(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 a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}var i=u(e),o=c(r),d=u(n);a.extend({EffectComposer:s.EffectComposer,RenderPass:s.RenderPass,ShaderPass:s.ShaderPass});const l=()=>{try{var e=document.createElement("canvas");return!(!window.WebGL2RenderingContext||!e.getContext("webgl2"))}catch(e){return!1}},f=o.forwardRef((({children:e,multisamping:r=8,renderIndex:n=1,disableGamma:u=!1,disableRenderPass:c=!1,...f},h)=>{const m=o.useRef(),b=a.useThree((({scene:e})=>e)),g=a.useThree((({camera:e})=>e)),p=a.useThree((({gl:e})=>e)),P=a.useThree((({size:e})=>e)),[v]=o.useState((()=>{if(l()&&r>0){const e=new t.WebGLRenderTarget(P.width,P.height,{format:t.RGBAFormat,encoding:t.sRGBEncoding});return e.samples=8,e}}));return o.useEffect((()=>{var e,r;null==(e=m.current)||e.setSize(P.width,P.height),null==(r=m.current)||r.setPixelRatio(p.getPixelRatio())}),[p,P]),a.useFrame((()=>{var e;return null==(e=m.current)?void 0:e.render()}),n),o.createElement("effectComposer",i.default({ref:d.default([h,m]),args:[p,v]},f),!c&&o.createElement("renderPass",{attach:"passes",args:[b,g]}),!u&&o.createElement("shaderPass",{attach:"passes",args:[s.GammaCorrectionShader]}),e)}));exports.Effects=f,exports.isWebGL2Available=l;
package/core/Effects.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { WebGLRenderTarget } from 'three';
2
3
  import { ReactThreeFiber } from '@react-three/fiber';
3
4
  import { EffectComposer, RenderPass, ShaderPass } from 'three-stdlib';
4
5
  declare global {
@@ -11,9 +12,9 @@ declare global {
11
12
  }
12
13
  }
13
14
  export declare const isWebGL2Available: () => boolean;
14
- export declare const Effects: React.ForwardRefExoticComponent<Pick<ReactThreeFiber.ExtendedColors<ReactThreeFiber.Overwrite<Partial<EffectComposer<import("three").WebGLRenderTarget>>, ReactThreeFiber.NodeProps<EffectComposer<import("three").WebGLRenderTarget>, typeof EffectComposer>>> & {
15
+ export declare const Effects: React.ForwardRefExoticComponent<Pick<ReactThreeFiber.ExtendedColors<ReactThreeFiber.Overwrite<Partial<EffectComposer<WebGLRenderTarget>>, ReactThreeFiber.NodeProps<EffectComposer<WebGLRenderTarget>, typeof EffectComposer>>> & {
15
16
  multisamping?: number | undefined;
16
17
  renderIndex?: number | undefined;
17
18
  disableGamma?: boolean | undefined;
18
19
  disableRenderPass?: boolean | undefined;
19
- }, "attach" | "args" | "children" | "key" | "onUpdate" | keyof EffectComposer<import("three").WebGLRenderTarget> | "multisamping" | "renderIndex" | "disableGamma" | "disableRenderPass"> & React.RefAttributes<unknown>>;
20
+ }, "attach" | "args" | "children" | "key" | "onUpdate" | keyof EffectComposer<WebGLRenderTarget> | "multisamping" | "renderIndex" | "disableGamma" | "disableRenderPass"> & React.RefAttributes<unknown>>;
package/core/Effects.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import _extends from '@babel/runtime/helpers/esm/extends';
2
2
  import * as React from 'react';
3
- import { WebGLMultisampleRenderTarget, RGBAFormat, sRGBEncoding } from 'three';
3
+ import { WebGLRenderTarget, RGBAFormat, sRGBEncoding } from 'three';
4
4
  import { extend, useThree, useFrame } from '@react-three/fiber';
5
5
  import { EffectComposer, RenderPass, ShaderPass, GammaCorrectionShader } from 'three-stdlib';
6
6
  import mergeRefs from 'react-merge-refs';
@@ -41,7 +41,7 @@ const Effects = /*#__PURE__*/React.forwardRef(({
41
41
  }) => size);
42
42
  const [target] = React.useState(() => {
43
43
  if (isWebGL2Available() && multisamping > 0) {
44
- const t = new WebGLMultisampleRenderTarget(size.width, size.height, {
44
+ const t = new WebGLRenderTarget(size.width, size.height, {
45
45
  format: RGBAFormat,
46
46
  encoding: sRGBEncoding
47
47
  });
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),r=require("@react-three/fiber"),n=require("three"),t=require("three-stdlib"),s=require("../helpers/environment-assets.cjs.js");function a(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var t=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,t.get?t:{enumerable:!0,get:function(){return e[n]}})}})),r.default=e,Object.freeze(r)}var o=a(e);exports.Environment=function({background:e=!1,files:a=["/px.png","/nx.png","/py.png","/ny.png","/pz.png","/nz.png"],path:i="",preset:u,scene:c,extensions:p}){if(u){if(!(u in s.presetsObj))throw new Error("Preset must be one of: "+Object.keys(s.presetsObj).join(", "));a=s.presetsObj[u],i="https://market-assets.fra1.cdn.digitaloceanspaces.com/market-assets/hdris/"}const b=r.useThree((({scene:e})=>e)),d=Array.isArray(a),f=d?n.CubeTextureLoader:t.RGBELoader,g=r.useLoader(f,d?[a]:a,(e=>{e.setPath(i),null==e.setDataType||e.setDataType(n.FloatType),p&&p(e)})),l=d?g[0]:g;return l.mapping=n.EquirectangularReflectionMapping,o.useLayoutEffect((()=>{const r=c?c.background:b.background,n=c?c.environment:b.environment;return c?(c.environment=l,e&&(c.background=l)):(b.environment=l,e&&(b.background=l)),()=>{c?(c.environment=n,c.background=r):(b.environment=n,b.background=r),l.dispose()}}),[l,e,c]),null};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),n=require("@react-three/fiber"),r=require("three"),t=require("three-stdlib"),u=require("../helpers/environment-assets.cjs.js");function a(e){if(e&&e.__esModule)return e;var n=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var t=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,t.get?t:{enumerable:!0,get:function(){return e[r]}})}})),n.default=e,Object.freeze(n)}var o=a(e);const s=e=>{return(n=e).current&&n.current.isScene?e.current:e;var n};function c({scene:e,background:r=!1,map:t}){const u=n.useThree((e=>e.scene));return o.useLayoutEffect((()=>{if(t){const n=s(e||u),a=n.background,o=n.environment;return"only"!==r&&(n.environment=t),r&&(n.background=t),()=>{"only"!==r&&(n.environment=o),r&&(n.background=a)}}}),[e,t]),null}function i({children:e,near:t=1,far:u=1e3,resolution:a=256,frames:i=1,background:l=!1,scene:p,files:f,path:m,preset:b,extensions:g}){const d=n.useThree((e=>e.gl)),y=n.useThree((e=>e.scene)),v=o.useRef(null),[h]=o.useState((()=>new r.Scene)),E=o.useMemo((()=>{const e=new r.WebGLCubeRenderTarget(a);return e.texture.type=r.HalfFloatType,e}),[a]);o.useLayoutEffect((()=>{1===i&&v.current.update(d,h);const e=s(p||y),n=e.background,r=e.environment;return"only"!==l&&(e.environment=E.texture),l&&(e.background=E.texture),()=>{"only"!==l&&(e.environment=r),l&&(e.background=n)}}),[e,p]);let k=1;return n.useFrame((()=>{(i===1/0||k<i)&&(v.current.update(d,h),k++)})),o.createElement(o.Fragment,null,n.createPortal(o.createElement(o.Fragment,null,e,o.createElement("cubeCamera",{ref:v,args:[t,u,E]}),(f||b)&&o.createElement(c,{background:!0,files:f,preset:b,path:m,extensions:g,scene:h})),h))}function l({background:e=!1,files:a=["/px.png","/nx.png","/py.png","/ny.png","/pz.png","/nz.png"],path:c="",preset:i,scene:l,extensions:p}){if(i){if(!(i in u.presetsObj))throw new Error("Preset must be one of: "+Object.keys(u.presetsObj).join(", "));a=u.presetsObj[i],c="https://market-assets.fra1.cdn.digitaloceanspaces.com/market-assets/hdris/"}const f=n.useThree((e=>e.scene)),m=Array.isArray(a),b=m?r.CubeTextureLoader:t.RGBELoader,g=n.useLoader(b,m?[a]:a,(e=>{e.setPath(c),null==e.setDataType||e.setDataType(r.FloatType),p&&p(e)})),d=m?g[0]:g;return d.mapping=m?r.CubeReflectionMapping:r.EquirectangularReflectionMapping,o.useLayoutEffect((()=>{const n=s(l||f),r=n.background,t=n.environment;return"only"!==e&&(n.environment=d),e&&(n.background=d),()=>{"only"!==e&&(n.environment=t),e&&(n.background=r)}}),[d,e,l]),null}exports.Environment=function(e){return e.map?o.createElement(c,e):e.children?o.createElement(i,e):o.createElement(l,e)},exports.EnvironmentCube=l,exports.EnvironmentMap=c,exports.EnvironmentPortal=i;
@@ -1,12 +1,22 @@
1
+ import * as React from 'react';
1
2
  import { Scene, Loader } from 'three';
2
3
  import { PresetsType } from '../helpers/environment-assets';
3
4
  declare type Props = {
4
- background?: boolean;
5
+ children?: React.ReactNode;
6
+ frames?: number;
7
+ near?: number;
8
+ far?: number;
9
+ resolution?: number;
10
+ background?: boolean | 'only';
11
+ map?: THREE.Texture;
5
12
  files?: string | string[];
6
13
  path?: string;
7
14
  preset?: PresetsType;
8
- scene?: Scene;
15
+ scene?: Scene | React.MutableRefObject<THREE.Scene>;
9
16
  extensions?: (loader: Loader) => void;
10
17
  };
11
- export declare function Environment({ background, files, path, preset, scene, extensions, }: Props): null;
18
+ export declare function Environment(props: Props): JSX.Element;
19
+ export declare function EnvironmentMap({ scene, background, map }: Props): null;
20
+ export declare function EnvironmentPortal({ children, near, far, resolution, frames, background, scene, files, path, preset, extensions, }: Props): JSX.Element;
21
+ export declare function EnvironmentCube({ background, files, path, preset, scene, extensions, }: Props): null;
12
22
  export {};
@@ -1,11 +1,93 @@
1
1
  import * as React from 'react';
2
- import { useThree, useLoader } from '@react-three/fiber';
3
- import { FloatType, EquirectangularReflectionMapping, CubeTextureLoader } from 'three';
2
+ import { useThree, useFrame, createPortal, useLoader } from '@react-three/fiber';
3
+ import { Scene, WebGLCubeRenderTarget, HalfFloatType, FloatType, CubeReflectionMapping, EquirectangularReflectionMapping, CubeTextureLoader } from 'three';
4
4
  import { RGBELoader } from 'three-stdlib';
5
5
  import { presetsObj } from '../helpers/environment-assets.js';
6
6
 
7
7
  const CUBEMAP_ROOT = 'https://market-assets.fra1.cdn.digitaloceanspaces.com/market-assets/hdris/';
8
- function Environment({
8
+
9
+ const isRef = obj => obj.current && obj.current.isScene;
10
+
11
+ const resolveScene = scene => isRef(scene) ? scene.current : scene;
12
+
13
+ function Environment(props) {
14
+ return props.map ? /*#__PURE__*/React.createElement(EnvironmentMap, props) : props.children ? /*#__PURE__*/React.createElement(EnvironmentPortal, props) : /*#__PURE__*/React.createElement(EnvironmentCube, props);
15
+ }
16
+ function EnvironmentMap({
17
+ scene,
18
+ background = false,
19
+ map
20
+ }) {
21
+ const defaultScene = useThree(state => state.scene);
22
+ React.useLayoutEffect(() => {
23
+ if (map) {
24
+ const target = resolveScene(scene || defaultScene);
25
+ const oldbg = target.background;
26
+ const oldenv = target.environment;
27
+ if (background !== 'only') target.environment = map;
28
+ if (background) target.background = map;
29
+ return () => {
30
+ if (background !== 'only') target.environment = oldenv;
31
+ if (background) target.background = oldbg;
32
+ };
33
+ }
34
+ }, [scene, map]);
35
+ return null;
36
+ }
37
+ function EnvironmentPortal({
38
+ children,
39
+ near = 1,
40
+ far = 1000,
41
+ resolution = 256,
42
+ frames = 1,
43
+ background = false,
44
+ scene,
45
+ files,
46
+ path,
47
+ preset = undefined,
48
+ extensions
49
+ }) {
50
+ const gl = useThree(state => state.gl);
51
+ const defaultScene = useThree(state => state.scene);
52
+ const camera = React.useRef(null);
53
+ const [virtualScene] = React.useState(() => new Scene());
54
+ const fbo = React.useMemo(() => {
55
+ const fbo = new WebGLCubeRenderTarget(resolution);
56
+ fbo.texture.type = HalfFloatType;
57
+ return fbo;
58
+ }, [resolution]);
59
+ React.useLayoutEffect(() => {
60
+ if (frames === 1) camera.current.update(gl, virtualScene);
61
+ const target = resolveScene(scene || defaultScene);
62
+ const oldbg = target.background;
63
+ const oldenv = target.environment;
64
+ if (background !== 'only') target.environment = fbo.texture;
65
+ if (background) target.background = fbo.texture;
66
+ return () => {
67
+ if (background !== 'only') target.environment = oldenv;
68
+ if (background) target.background = oldbg;
69
+ };
70
+ }, [children, scene]);
71
+ let count = 1;
72
+ useFrame(() => {
73
+ if (frames === Infinity || count < frames) {
74
+ camera.current.update(gl, virtualScene);
75
+ count++;
76
+ }
77
+ });
78
+ return /*#__PURE__*/React.createElement(React.Fragment, null, createPortal( /*#__PURE__*/React.createElement(React.Fragment, null, children, /*#__PURE__*/React.createElement("cubeCamera", {
79
+ ref: camera,
80
+ args: [near, far, fbo]
81
+ }), (files || preset) && /*#__PURE__*/React.createElement(EnvironmentMap, {
82
+ background: true,
83
+ files: files,
84
+ preset: preset,
85
+ path: path,
86
+ extensions: extensions,
87
+ scene: virtualScene
88
+ })), virtualScene));
89
+ }
90
+ function EnvironmentCube({
9
91
  background = false,
10
92
  files = ['/px.png', '/nx.png', '/py.png', '/ny.png', '/pz.png', '/nz.png'],
11
93
  path = '',
@@ -14,17 +96,12 @@ function Environment({
14
96
  extensions
15
97
  }) {
16
98
  if (preset) {
17
- if (!(preset in presetsObj)) {
18
- throw new Error('Preset must be one of: ' + Object.keys(presetsObj).join(', '));
19
- }
20
-
99
+ if (!(preset in presetsObj)) throw new Error('Preset must be one of: ' + Object.keys(presetsObj).join(', '));
21
100
  files = presetsObj[preset];
22
101
  path = CUBEMAP_ROOT;
23
102
  }
24
103
 
25
- const defaultScene = useThree(({
26
- scene
27
- }) => scene);
104
+ const defaultScene = useThree(state => state.scene);
28
105
  const isCubeMap = Array.isArray(files);
29
106
  const loader = isCubeMap ? CubeTextureLoader : RGBELoader; // @ts-expect-error
30
107
 
@@ -35,33 +112,19 @@ function Environment({
35
112
  if (extensions) extensions(loader);
36
113
  });
37
114
  const texture = isCubeMap ? loaderResult[0] : loaderResult;
38
- texture.mapping = EquirectangularReflectionMapping;
115
+ texture.mapping = isCubeMap ? CubeReflectionMapping : EquirectangularReflectionMapping;
39
116
  React.useLayoutEffect(() => {
40
- const oldbg = scene ? scene.background : defaultScene.background;
41
- const oldenv = scene ? scene.environment : defaultScene.environment;
42
-
43
- if (scene) {
44
- scene.environment = texture;
45
- if (background) scene.background = texture;
46
- } else {
47
- defaultScene.environment = texture;
48
- if (background) defaultScene.background = texture;
49
- }
50
-
117
+ const target = resolveScene(scene || defaultScene);
118
+ const oldbg = target.background;
119
+ const oldenv = target.environment;
120
+ if (background !== 'only') target.environment = texture;
121
+ if (background) target.background = texture;
51
122
  return () => {
52
- if (scene) {
53
- scene.environment = oldenv;
54
- scene.background = oldbg;
55
- } else {
56
- defaultScene.environment = oldenv;
57
- defaultScene.background = oldbg;
58
- } // Environment textures are volatile, better dispose and uncache them
59
-
60
-
61
- texture.dispose();
123
+ if (background !== 'only') target.environment = oldenv;
124
+ if (background) target.background = oldbg;
62
125
  };
63
126
  }, [texture, background, scene]);
64
127
  return null;
65
128
  }
66
129
 
67
- export { Environment };
130
+ export { Environment, EnvironmentCube, EnvironmentMap, EnvironmentPortal };
@@ -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"),n=require("three-stdlib");function u(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)}var a=u(e),i=o(r);const s=i.forwardRef(((e,r)=>{const u=t.useThree((({camera:e})=>e)),o=t.useThree((({gl:e})=>e)),[s]=i.useState((()=>new n.FirstPersonControls(u,o.domElement)));return t.useFrame(((e,r)=>{s.update(r)})),s?i.createElement("primitive",a.default({ref:r,object:s},e)):null}));exports.FirstPersonControls=s;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("@react-three/fiber"),n=require("three-stdlib");function u(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)}var a=u(e),i=o(r);const s=i.forwardRef(((e,r)=>{const u=t.useThree((e=>e.camera)),o=t.useThree((e=>e.gl)),[s]=i.useState((()=>new n.FirstPersonControls(u,o.domElement)));return t.useFrame(((e,r)=>{s.update(r)})),s?i.createElement("primitive",a.default({ref:r,object:s},e)):null}));exports.FirstPersonControls=s;
@@ -4,12 +4,8 @@ import { useThree, useFrame } from '@react-three/fiber';
4
4
  import { FirstPersonControls as FirstPersonControls$1 } from 'three-stdlib';
5
5
 
6
6
  const FirstPersonControls = /*#__PURE__*/React.forwardRef((props, ref) => {
7
- const camera = useThree(({
8
- camera
9
- }) => camera);
10
- const gl = useThree(({
11
- gl
12
- }) => gl);
7
+ const camera = useThree(state => state.camera);
8
+ const gl = useThree(state => state.gl);
13
9
  const [controls] = React.useState(() => new FirstPersonControls$1(camera, gl.domElement));
14
10
  useFrame((_, delta) => {
15
11
  controls.update(delta);
package/core/Float.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@react-three/fiber");function r(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 n=r(e);exports.Float=function({children:e,speed:r=1,rotationIntensity:o=1,floatIntensity:c=1,...u}){const a=n.useRef(null),i=n.useRef(1e4*Math.random());return t.useFrame((e=>{const t=i.current+e.clock.getElapsedTime();a.current.rotation.x=Math.cos(t/4*r)/8*o,a.current.rotation.y=Math.sin(t/4*r)/8*o,a.current.rotation.z=Math.sin(t/4*r)/20*o,a.current.position.y=Math.sin(t/4*r)/10*c})),n.createElement("group",u,n.createElement("group",{ref:a},e))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("@react-three/fiber"),r=require("react-merge-refs");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var u=o(e),a=n(r);const c=u.forwardRef((({children:e,speed:r=1,rotationIntensity:n=1,floatIntensity:o=1,...c},i)=>{const f=u.useRef(null),s=u.useRef(1e4*Math.random());return t.useFrame((e=>{const t=s.current+e.clock.getElapsedTime();f.current.rotation.x=Math.cos(t/4*r)/8*n,f.current.rotation.y=Math.sin(t/4*r)/8*n,f.current.rotation.z=Math.sin(t/4*r)/20*n,f.current.position.y=Math.sin(t/4*r)/10*o})),u.createElement("group",c,u.createElement("group",{ref:a.default([f,i])},e))}));exports.Float=c;