@react-three/postprocessing 2.2.6 → 2.3.0

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
@@ -72,6 +72,8 @@ The EffectComposer must wrap all your effects. It will manage them for you.
72
72
  autoClear?: boolean
73
73
  multisampling?: number
74
74
  frameBufferType?: TextureDataType
75
+ /** For effects that support DepthDownsamplingPass */
76
+ resolutionScale?: number
75
77
  renderPriority?: number
76
78
  camera?: THREE.Camera
77
79
  scene?: THREE.Scene
@@ -1,12 +1,14 @@
1
1
  import * as THREE from 'three';
2
2
  import React from 'react';
3
- import { EffectComposer as EffectComposerImpl, NormalPass } from 'postprocessing';
3
+ import { EffectComposer as EffectComposerImpl, NormalPass, DepthDownsamplingPass } from 'postprocessing';
4
4
  import { TextureDataType } from 'three';
5
5
  export declare const EffectComposerContext: React.Context<{
6
6
  composer: EffectComposerImpl;
7
7
  normalPass: NormalPass | null;
8
+ downSamplingPass: DepthDownsamplingPass | null;
8
9
  camera: THREE.Camera;
9
10
  scene: THREE.Scene;
11
+ resolutionScale?: number;
10
12
  }>;
11
13
  export declare type EffectComposerProps = {
12
14
  enabled?: boolean;
@@ -15,6 +17,7 @@ export declare type EffectComposerProps = {
15
17
  disableNormalPass?: boolean;
16
18
  stencilBuffer?: boolean;
17
19
  autoClear?: boolean;
20
+ resolutionScale?: number;
18
21
  multisampling?: number;
19
22
  frameBufferType?: TextureDataType;
20
23
  renderPriority?: number;
@@ -2,7 +2,7 @@ import { GlitchEffect, GlitchMode } from 'postprocessing';
2
2
  import React from 'react';
3
3
  import { ReactThreeFiber } from '@react-three/fiber';
4
4
  export declare type GlitchProps = ConstructorParameters<typeof GlitchEffect>[0] & Partial<{
5
- mode: typeof GlitchMode;
5
+ mode: typeof GlitchMode[keyof typeof GlitchMode];
6
6
  active: boolean;
7
7
  delay: ReactThreeFiber.Vector2;
8
8
  duration: ReactThreeFiber.Vector2;
@@ -20,7 +20,7 @@ export declare const Glitch: React.ForwardRefExoticComponent<{
20
20
  columns?: number;
21
21
  ratio?: number;
22
22
  } & Partial<{
23
- mode: typeof GlitchMode;
23
+ mode: typeof GlitchMode[keyof typeof GlitchMode];
24
24
  active: boolean;
25
25
  delay: ReactThreeFiber.Vector2;
26
26
  duration: ReactThreeFiber.Vector2;
package/dist/index.cjs.js CHANGED
@@ -131,6 +131,7 @@ var EffectComposer = /*#__PURE__*/React__default["default"].memo( /*#__PURE__*/R
131
131
  var children = _ref.children,
132
132
  camera = _ref.camera,
133
133
  scene = _ref.scene,
134
+ resolutionScale = _ref.resolutionScale,
134
135
  _ref$enabled = _ref.enabled,
135
136
  enabled = _ref$enabled === void 0 ? true : _ref$enabled,
136
137
  _ref$renderPriority = _ref.renderPriority,
@@ -155,11 +156,13 @@ var EffectComposer = /*#__PURE__*/React__default["default"].memo( /*#__PURE__*/R
155
156
  camera = camera || defaultCamera;
156
157
 
157
158
  var _useMemo = React.useMemo(function () {
159
+ var webGL2Available = threeStdlib.isWebGL2Available(); // Initialize composer
160
+
158
161
  // Initialize composer
159
162
  var effectComposer = new postprocessing.EffectComposer(gl, {
160
163
  depthBuffer: depthBuffer,
161
164
  stencilBuffer: stencilBuffer,
162
- multisampling: multisampling > 0 && threeStdlib.isWebGL2Available() ? multisampling : 0,
165
+ multisampling: multisampling > 0 && webGL2Available ? multisampling : 0,
163
166
  frameBufferType: frameBufferType
164
167
  }); // Add render pass
165
168
 
@@ -167,19 +170,31 @@ var EffectComposer = /*#__PURE__*/React__default["default"].memo( /*#__PURE__*/R
167
170
  effectComposer.addPass(new postprocessing.RenderPass(scene, camera)); // Create normal pass
168
171
 
169
172
  // Create normal pass
170
- var pass = disableNormalPass ? null : new postprocessing.NormalPass(scene, camera);
171
- if (pass) pass.enabled = false;
172
-
173
- if (pass) {
174
- effectComposer.addPass(pass);
173
+ var downSamplingPass = null;
174
+ var normalPass = null;
175
+
176
+ if (!disableNormalPass) {
177
+ normalPass = new postprocessing.NormalPass(scene, camera);
178
+ normalPass.enabled = false;
179
+ effectComposer.addPass(normalPass);
180
+
181
+ if (resolutionScale !== undefined && webGL2Available) {
182
+ downSamplingPass = new postprocessing.DepthDownsamplingPass({
183
+ normalBuffer: normalPass.texture,
184
+ resolutionScale: resolutionScale
185
+ });
186
+ downSamplingPass.enabled = false;
187
+ effectComposer.addPass(downSamplingPass);
188
+ }
175
189
  }
176
190
 
177
- return [effectComposer, pass];
178
- }, [camera, gl, depthBuffer, stencilBuffer, multisampling, frameBufferType, scene, disableNormalPass]),
191
+ return [effectComposer, normalPass, downSamplingPass];
192
+ }, [camera, gl, depthBuffer, stencilBuffer, multisampling, frameBufferType, scene, disableNormalPass, resolutionScale]),
179
193
  composer = _useMemo[0],
180
- normalPass = _useMemo[1];
194
+ normalPass = _useMemo[1],
195
+ downSamplingPass = _useMemo[2];
181
196
 
182
- React.useLayoutEffect(function () {
197
+ React.useEffect(function () {
183
198
  return composer == null ? void 0 : composer.setSize(size.width, size.height);
184
199
  }, [composer, size]);
185
200
  fiber.useFrame(function (_, delta) {
@@ -194,25 +209,29 @@ var EffectComposer = /*#__PURE__*/React__default["default"].memo( /*#__PURE__*/R
194
209
 
195
210
  if (group.current && group.current.__r3f && composer) {
196
211
  effectPass = _construct__default["default"](postprocessing.EffectPass, [camera].concat(group.current.__r3f.objects));
197
- composer.addPass(effectPass);
198
212
  effectPass.renderToScreen = true;
213
+ composer.addPass(effectPass);
199
214
  if (normalPass) normalPass.enabled = true;
215
+ if (downSamplingPass) downSamplingPass.enabled = true;
200
216
  }
201
217
 
202
218
  return function () {
203
219
  if (effectPass) composer == null ? void 0 : composer.removePass(effectPass);
204
220
  if (normalPass) normalPass.enabled = false;
221
+ if (downSamplingPass) downSamplingPass.enabled = false;
205
222
  };
206
- }, [composer, children, camera]); // Memoize state, otherwise it would trigger all consumers on every render
223
+ }, [composer, children, camera, normalPass, downSamplingPass]); // Memoize state, otherwise it would trigger all consumers on every render
207
224
 
208
225
  var state = React.useMemo(function () {
209
226
  return {
210
227
  composer: composer,
211
228
  normalPass: normalPass,
229
+ downSamplingPass: downSamplingPass,
230
+ resolutionScale: resolutionScale,
212
231
  camera: camera,
213
232
  scene: scene
214
233
  };
215
- }, [composer, normalPass, camera, scene]); // Expose the composer
234
+ }, [composer, normalPass, downSamplingPass, resolutionScale, camera, scene]); // Expose the composer
216
235
 
217
236
  React.useImperativeHandle(ref, function () {
218
237
  return composer;
@@ -594,15 +613,17 @@ var Sepia = wrapEffect(postprocessing.SepiaEffect);
594
613
  var SSAO = /*#__PURE__*/React.forwardRef(function SSAO(props, ref) {
595
614
  var _useContext = React.useContext(EffectComposerContext),
596
615
  camera = _useContext.camera,
597
- normalPass = _useContext.normalPass;
616
+ normalPass = _useContext.normalPass,
617
+ downSamplingPass = _useContext.downSamplingPass,
618
+ resolutionScale = _useContext.resolutionScale;
598
619
 
599
620
  var effect = React.useMemo(function () {
600
- if (normalPass === null) {
621
+ if (normalPass === null && downSamplingPass === null) {
601
622
  console.error('Please enable the NormalPass in the EffectComposer in order to use SSAO.');
602
623
  return null;
603
624
  }
604
625
 
605
- return new postprocessing.SSAOEffect(camera, normalPass.renderTarget.texture, _extends__default["default"]({
626
+ return new postprocessing.SSAOEffect(camera, normalPass ? normalPass.texture : null, _extends__default["default"]({
606
627
  blendFunction: postprocessing.BlendFunction.MULTIPLY,
607
628
  samples: 30,
608
629
  rings: 4,
@@ -615,7 +636,10 @@ var SSAO = /*#__PURE__*/React.forwardRef(function SSAO(props, ref) {
615
636
  scale: 0.5,
616
637
  bias: 0.5,
617
638
  intensity: 1.0,
618
- color: null
639
+ color: null,
640
+ // @ts-ignore
641
+ normalDepthBuffer: downSamplingPass ? downSamplingPass.texture : null,
642
+ resolutionScale: resolutionScale != null ? resolutionScale : 1
619
643
  }, props));
620
644
  }, [camera, normalPass, props]);
621
645
  return /*#__PURE__*/React__default["default"].createElement("primitive", {
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { BlendFunction, BloomEffect, BrightnessContrastEffect, ChromaticAberrationEffect, ColorAverageEffect, ColorDepthEffect, DepthEffect, EffectComposer as EffectComposer$1, RenderPass, NormalPass, EffectPass, DepthOfFieldEffect, DotScreenEffect, GlitchEffect, GlitchMode, GodRaysEffect, GridEffect, HueSaturationEffect, NoiseEffect, OutlineEffect, PixelationEffect, ScanlineEffect, SelectiveBloomEffect, SepiaEffect, SSAOEffect, SMAAPreset, EdgeDetectionMode, SMAAImageLoader, SMAAEffect, TextureEffect, ToneMappingEffect, VignetteEffect, ShockWaveEffect, LUTEffect } from 'postprocessing';
2
- import React, { forwardRef, useMemo, useLayoutEffect, createContext, useRef, useImperativeHandle, useContext, useState, useEffect } from 'react';
1
+ import { BlendFunction, BloomEffect, BrightnessContrastEffect, ChromaticAberrationEffect, ColorAverageEffect, ColorDepthEffect, DepthEffect, EffectComposer as EffectComposer$1, RenderPass, NormalPass, DepthDownsamplingPass, EffectPass, DepthOfFieldEffect, DotScreenEffect, GlitchEffect, GlitchMode, GodRaysEffect, GridEffect, HueSaturationEffect, NoiseEffect, OutlineEffect, PixelationEffect, ScanlineEffect, SelectiveBloomEffect, SepiaEffect, SSAOEffect, SMAAPreset, EdgeDetectionMode, SMAAImageLoader, SMAAEffect, TextureEffect, ToneMappingEffect, VignetteEffect, ShockWaveEffect, LUTEffect } from 'postprocessing';
2
+ import React, { forwardRef, useMemo, useLayoutEffect, createContext, useEffect, useRef, useImperativeHandle, useContext, useState } from 'react';
3
3
  import * as THREE from 'three';
4
4
  import { Vector2, Vector3, TextureLoader, sRGBEncoding, RepeatWrapping } from 'three';
5
5
  import { useThree, useFrame, useLoader } from '@react-three/fiber';
@@ -87,6 +87,7 @@ const EffectComposer = /*#__PURE__*/React.memo( /*#__PURE__*/forwardRef((_ref, r
87
87
  children,
88
88
  camera,
89
89
  scene,
90
+ resolutionScale,
90
91
  enabled = true,
91
92
  renderPriority = 1,
92
93
  autoClear = true,
@@ -104,27 +105,39 @@ const EffectComposer = /*#__PURE__*/React.memo( /*#__PURE__*/forwardRef((_ref, r
104
105
  } = useThree();
105
106
  scene = scene || defaultScene;
106
107
  camera = camera || defaultCamera;
107
- const [composer, normalPass] = useMemo(() => {
108
- // Initialize composer
108
+ const [composer, normalPass, downSamplingPass] = useMemo(() => {
109
+ const webGL2Available = isWebGL2Available(); // Initialize composer
110
+
109
111
  const effectComposer = new EffectComposer$1(gl, {
110
112
  depthBuffer,
111
113
  stencilBuffer,
112
- multisampling: multisampling > 0 && isWebGL2Available() ? multisampling : 0,
114
+ multisampling: multisampling > 0 && webGL2Available ? multisampling : 0,
113
115
  frameBufferType
114
116
  }); // Add render pass
115
117
 
116
118
  effectComposer.addPass(new RenderPass(scene, camera)); // Create normal pass
117
119
 
118
- const pass = disableNormalPass ? null : new NormalPass(scene, camera);
119
- if (pass) pass.enabled = false;
120
-
121
- if (pass) {
122
- effectComposer.addPass(pass);
120
+ let downSamplingPass = null;
121
+ let normalPass = null;
122
+
123
+ if (!disableNormalPass) {
124
+ normalPass = new NormalPass(scene, camera);
125
+ normalPass.enabled = false;
126
+ effectComposer.addPass(normalPass);
127
+
128
+ if (resolutionScale !== undefined && webGL2Available) {
129
+ downSamplingPass = new DepthDownsamplingPass({
130
+ normalBuffer: normalPass.texture,
131
+ resolutionScale
132
+ });
133
+ downSamplingPass.enabled = false;
134
+ effectComposer.addPass(downSamplingPass);
135
+ }
123
136
  }
124
137
 
125
- return [effectComposer, pass];
126
- }, [camera, gl, depthBuffer, stencilBuffer, multisampling, frameBufferType, scene, disableNormalPass]);
127
- useLayoutEffect(() => composer == null ? void 0 : composer.setSize(size.width, size.height), [composer, size]);
138
+ return [effectComposer, normalPass, downSamplingPass];
139
+ }, [camera, gl, depthBuffer, stencilBuffer, multisampling, frameBufferType, scene, disableNormalPass, resolutionScale]);
140
+ useEffect(() => composer == null ? void 0 : composer.setSize(size.width, size.height), [composer, size]);
128
141
  useFrame((_, delta) => {
129
142
  if (enabled) {
130
143
  gl.autoClear = autoClear;
@@ -137,23 +150,27 @@ const EffectComposer = /*#__PURE__*/React.memo( /*#__PURE__*/forwardRef((_ref, r
137
150
 
138
151
  if (group.current && group.current.__r3f && composer) {
139
152
  effectPass = new EffectPass(camera, ...group.current.__r3f.objects);
140
- composer.addPass(effectPass);
141
153
  effectPass.renderToScreen = true;
154
+ composer.addPass(effectPass);
142
155
  if (normalPass) normalPass.enabled = true;
156
+ if (downSamplingPass) downSamplingPass.enabled = true;
143
157
  }
144
158
 
145
159
  return () => {
146
160
  if (effectPass) composer == null ? void 0 : composer.removePass(effectPass);
147
161
  if (normalPass) normalPass.enabled = false;
162
+ if (downSamplingPass) downSamplingPass.enabled = false;
148
163
  };
149
- }, [composer, children, camera]); // Memoize state, otherwise it would trigger all consumers on every render
164
+ }, [composer, children, camera, normalPass, downSamplingPass]); // Memoize state, otherwise it would trigger all consumers on every render
150
165
 
151
166
  const state = useMemo(() => ({
152
167
  composer,
153
168
  normalPass,
169
+ downSamplingPass,
170
+ resolutionScale,
154
171
  camera,
155
172
  scene
156
- }), [composer, normalPass, camera, scene]); // Expose the composer
173
+ }), [composer, normalPass, downSamplingPass, resolutionScale, camera, scene]); // Expose the composer
157
174
 
158
175
  useImperativeHandle(ref, () => composer, [composer]);
159
176
  return /*#__PURE__*/React.createElement(EffectComposerContext.Provider, {
@@ -479,15 +496,17 @@ const Sepia = wrapEffect(SepiaEffect);
479
496
  const SSAO = /*#__PURE__*/forwardRef(function SSAO(props, ref) {
480
497
  const {
481
498
  camera,
482
- normalPass
499
+ normalPass,
500
+ downSamplingPass,
501
+ resolutionScale
483
502
  } = useContext(EffectComposerContext);
484
503
  const effect = useMemo(() => {
485
- if (normalPass === null) {
504
+ if (normalPass === null && downSamplingPass === null) {
486
505
  console.error('Please enable the NormalPass in the EffectComposer in order to use SSAO.');
487
506
  return null;
488
507
  }
489
508
 
490
- return new SSAOEffect(camera, normalPass.renderTarget.texture, {
509
+ return new SSAOEffect(camera, normalPass ? normalPass.texture : null, {
491
510
  blendFunction: BlendFunction.MULTIPLY,
492
511
  samples: 30,
493
512
  rings: 4,
@@ -501,6 +520,9 @@ const SSAO = /*#__PURE__*/forwardRef(function SSAO(props, ref) {
501
520
  bias: 0.5,
502
521
  intensity: 1.0,
503
522
  color: null,
523
+ // @ts-ignore
524
+ normalDepthBuffer: downSamplingPass ? downSamplingPass.texture : null,
525
+ resolutionScale: resolutionScale != null ? resolutionScale : 1,
504
526
  ...props
505
527
  });
506
528
  }, [camera, normalPass, props]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/postprocessing",
3
- "version": "2.2.6",
3
+ "version": "2.3.0",
4
4
  "description": "postprocessing wrapper for React and @react-three/fiber",
5
5
  "keywords": [
6
6
  "postprocessing",
@@ -38,48 +38,48 @@
38
38
  "typegen": "tsc --emitDeclarationOnly || true"
39
39
  },
40
40
  "dependencies": {
41
- "postprocessing": "6.24.1",
41
+ "postprocessing": "6.26.3",
42
42
  "react-merge-refs": "^1.1.0",
43
- "three-stdlib": "^2.8.6"
43
+ "three-stdlib": "^2.8.11"
44
44
  },
45
45
  "devDependencies": {
46
- "@babel/core": "^7.16.5",
47
- "@babel/plugin-transform-modules-commonjs": "7.16.5",
48
- "@babel/plugin-transform-parameters": "7.16.5",
49
- "@babel/plugin-transform-runtime": "7.16.5",
50
- "@babel/plugin-transform-template-literals": "7.16.5",
51
- "@babel/preset-env": "^7.16.5",
52
- "@babel/preset-react": "7.16.5",
53
- "@babel/preset-typescript": "^7.16.5",
54
- "@react-three/fiber": "^7.0.24",
55
- "@rollup/plugin-babel": "^5.3.0",
56
- "@rollup/plugin-commonjs": "^21.0.1",
46
+ "@babel/core": "^7.17.8",
47
+ "@babel/plugin-transform-modules-commonjs": "7.17.7",
48
+ "@babel/plugin-transform-parameters": "7.16.7",
49
+ "@babel/plugin-transform-runtime": "7.17.0",
50
+ "@babel/plugin-transform-template-literals": "7.16.7",
51
+ "@babel/preset-env": "^7.16.11",
52
+ "@babel/preset-react": "7.16.7",
53
+ "@babel/preset-typescript": "^7.16.7",
54
+ "@react-three/fiber": "^7.0.26",
55
+ "@rollup/plugin-babel": "^5.3.1",
56
+ "@rollup/plugin-commonjs": "^21.0.3",
57
57
  "@rollup/plugin-json": "^4.1.0",
58
- "@rollup/plugin-node-resolve": "^13.1.1",
59
- "@types/react": "^17.0.37",
60
- "@types/react-dom": "^17.0.11",
58
+ "@rollup/plugin-node-resolve": "^13.1.3",
59
+ "@types/react": "^17.0.43",
60
+ "@types/react-dom": "^17.0.14",
61
61
  "@types/react-test-renderer": "^17.0.1",
62
- "@types/three": "^0.135.0",
63
- "@typescript-eslint/eslint-plugin": "^5.8.0",
64
- "@typescript-eslint/parser": "^5.8.0",
65
- "eslint": "^8.5.0",
66
- "eslint-config-prettier": "^8.3.0",
62
+ "@types/three": "^0.139.0",
63
+ "@typescript-eslint/eslint-plugin": "^5.17.0",
64
+ "@typescript-eslint/parser": "^5.17.0",
65
+ "eslint": "^8.12.0",
66
+ "eslint-config-prettier": "^8.5.0",
67
67
  "eslint-import-resolver-alias": "^1.1.2",
68
- "eslint-plugin-import": "^2.25.3",
68
+ "eslint-plugin-import": "^2.25.4",
69
69
  "eslint-plugin-prettier": "^4.0.0",
70
- "eslint-plugin-react": "^7.27.1",
70
+ "eslint-plugin-react": "^7.29.4",
71
71
  "eslint-plugin-react-hooks": "^4.3.0",
72
72
  "husky": "^7.0.4",
73
73
  "husky-run": "^0.0.0",
74
- "lint-staged": "^12.1.3",
75
- "prettier": "^2.5.1",
74
+ "lint-staged": "^12.3.7",
75
+ "prettier": "^2.6.1",
76
76
  "react": "^17.0.2",
77
77
  "react-dom": "^17.0.2",
78
78
  "rimraf": "^3.0.2",
79
- "rollup": "^2.61.1",
80
- "rollup-plugin-filesize": "^9.1.1",
79
+ "rollup": "^2.70.1",
80
+ "rollup-plugin-filesize": "^9.1.2",
81
81
  "rollup-plugin-terser": "^7.0.2",
82
- "typescript": "^4.5.4"
82
+ "typescript": "^4.6.3"
83
83
  },
84
84
  "peerDependencies": {
85
85
  "@react-three/fiber": ">=7.0",