@react-three/postprocessing 2.9.1 → 2.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,12 @@
4
4
  [![Downloads](https://img.shields.io/npm/dt/@react-three/postprocessing.svg?style=flat&colorA=000000&colorB=000000)](https://www.npmjs.com/package/@react-three/postprocessing)
5
5
  [![Discord Shield](https://img.shields.io/discord/740090768164651008?style=flat&colorA=000000&colorB=000000&label=discord&logo=discord&logoColor=ffffff)](https://discord.gg/ZZjjNvJ)
6
6
 
7
- `react-postprocessing` is a [postprocessing](https://github.com/pmndrs/postprocessing) wrapper for [@react-three/fiber](https://github.com/pmndrs/react-three-fiber). This is not (yet) meant for complex orchestration of effects, but can save you [hundreds of LOC](https://twitter.com/0xca0a/status/1289501594698960897) for a straight forward effects-chain.
7
+ `react-postprocessing` is a
8
+ [postprocessing](https://github.com/pmndrs/postprocessing) wrapper for
9
+ [@react-three/fiber](https://github.com/pmndrs/react-three-fiber). This is not
10
+ (yet) meant for complex orchestration of effects, but can save you
11
+ [hundreds of LOC](https://twitter.com/0xca0a/status/1289501594698960897) for a
12
+ straight forward effects-chain.
8
13
 
9
14
  ```bash
10
15
  npm install @react-three/postprocessing
@@ -20,17 +25,29 @@ npm install @react-three/postprocessing
20
25
 
21
26
  #### Why postprocessing and not three/examples/jsm/postprocessing?
22
27
 
23
- From [https://github.com/pmndrs/postprocessing](https://github.com/pmndrs/postprocessing#performance)
28
+ From
29
+ [https://github.com/pmndrs/postprocessing](https://github.com/pmndrs/postprocessing#performance)
24
30
 
25
- > This library provides an EffectPass which automatically organizes and merges any given combination of effects. This minimizes the amount of render operations and makes it possible to combine many effects without the performance penalties of traditional pass chaining. Additionally, every effect can choose its own blend function.
31
+ > This library provides an EffectPass which automatically organizes and merges
32
+ > any given combination of effects. This minimizes the amount of render
33
+ > operations and makes it possible to combine many effects without the
34
+ > performance penalties of traditional pass chaining. Additionally, every effect
35
+ > can choose its own blend function.
26
36
  >
27
- > All fullscreen render operations also use a single triangle that fills the screen. Compared to using a quad, this approach harmonizes with modern GPU rasterization patterns and eliminates unnecessary fragment calculations along the screen diagonal. This is especially beneficial for GPGPU passes and effects that use complex fragment shaders.
37
+ > All fullscreen render operations also use a single triangle that fills the
38
+ > screen. Compared to using a quad, this approach harmonizes with modern GPU
39
+ > rasterization patterns and eliminates unnecessary fragment calculations along
40
+ > the screen diagonal. This is especially beneficial for GPGPU passes and
41
+ > effects that use complex fragment shaders.
28
42
 
29
- Postprocessing also supports srgb-encoding out of the box, as well as WebGL2 MSAA (multi sample anti aliasing), which is react-postprocessing's default, you get high performance crisp results w/o jagged edges.
43
+ Postprocessing also supports srgb-encoding out of the box, as well as WebGL2
44
+ MSAA (multi sample anti aliasing), which is react-postprocessing's default, you
45
+ get high performance crisp results w/o jagged edges.
30
46
 
31
47
  #### What does it look like?
32
48
 
33
- Here's an example combining a couple of effects ([live demo](https://codesandbox.io/s/react-postprocessing-dof-blob-pqrpl?)).
49
+ Here's an example combining a couple of effects
50
+ ([live demo](https://codesandbox.io/s/react-postprocessing-dof-blob-pqrpl?)).
34
51
 
35
52
  <a href="https://codesandbox.io/s/react-postprocessing-dof-blob-pqrpl?" target="_blank" rel="noopener">
36
53
  <img src="bubbles.jpg" alt="Bubbles Demo" />
@@ -38,7 +55,7 @@ Here's an example combining a couple of effects ([live demo](https://codesandbox
38
55
 
39
56
  ```jsx
40
57
  import React from 'react'
41
- import { EffectComposer, DepthOfField, Bloom, Noise, Vignette } from '@react-three/postprocessing'
58
+ import { Bloom, DepthOfField, EffectComposer, Noise, Vignette } from '@react-three/postprocessing'
42
59
  import { Canvas } from '@react-three/fiber'
43
60
 
44
61
  function App() {
@@ -58,93 +75,5 @@ function App() {
58
75
 
59
76
  ## Documentation
60
77
 
61
- #### EffectComposer
62
-
63
- The EffectComposer must wrap all your effects. It will manage them for you.
64
-
65
- ```jsx
66
- <EffectComposer
67
- enabled?: boolean
68
- children: JSX.Element | JSX.Element[]
69
- depthBuffer?: boolean
70
- disableNormalPass?: boolean
71
- stencilBuffer?: boolean
72
- autoClear?: boolean
73
- multisampling?: number
74
- frameBufferType?: TextureDataType
75
- /** For effects that support DepthDownsamplingPass */
76
- resolutionScale?: number
77
- renderPriority?: number
78
- camera?: THREE.Camera
79
- scene?: THREE.Scene
80
- >
81
- ```
82
-
83
- #### Selection/Select
84
-
85
- Some effects, like Outline or SelectiveBloom can select specific objects. To manage this in a declarative scene with just references can be messy, especially when things have to be grouped. These two components take care of it:
86
-
87
- ```jsx
88
- <Selection
89
- children: JSX.Element | JSX.Element[]
90
- enabled?: boolean
91
- >
92
-
93
- <Select
94
- children: JSX.Element | JSX.Element[]
95
- enabled?: boolean
96
- >
97
- ```
98
-
99
- You wrap everything into a selection, this one holds all the selections. Now you can individually select objects or groups. Effects that support selections (for instance `Outline`) will acknowledge it.
100
-
101
- ```jsx
102
- <Selection>
103
- <EffectComposer autoclear={false}>
104
- <Outline blur edgeStrength={100} />
105
- </EffectComposer>
106
- <Select enabled>
107
- <mesh />
108
- </Select>
109
- </Selection>
110
- ```
111
-
112
- Selection can be nested and group multiple object, higher up selection take precence over lower ones. The following for instance will select everything. Remove the outmost `enabled` and only the two mesh group is selected. You can flip the selections or bind them to interactions and state.
113
-
114
- ```jsx
115
- <Select enabled>
116
- <Select enabled>
117
- <mesh />
118
- <mesh />
119
- </Select>
120
- <Select>
121
- <mesh />
122
- </Select>
123
- </Select>
124
- ```
125
-
126
- #### Selective bloom
127
-
128
- Bloom is selective by default, you control it not on the effect pass but on the materials by lifting their colors out of 0-1 range. a `luminanceThreshold` of 1 ensures that ootb nothing will glow, only the materials you pick. For this to work `toneMapped` has to be false on the materials, because it would otherwise clamp colors between 0 and 1 again.
129
-
130
- ```jsx
131
- <Bloom mipmapBlur luminanceThreshold={1} />
132
-
133
- // ❌ will not glow, same as RGB [1,0,0]
134
- <meshStandardMaterial color="red"/>
135
-
136
- // ✅ will glow, same as RGB [2,0,0]
137
- <meshStandardMaterial emissive="red" emissiveIntensity={2} toneMapped={false} />
138
-
139
- // ❌ will not glow, same as RGB [1,0,0]
140
- <meshBasicMaterial color="red" />
141
-
142
- // ❌ will not glow, same as RGB [1,0,0], tone-mapping will clamp colors between 0 and 1
143
- <meshBasicMaterial color={[2,0,0]} />
144
-
145
- // ✅ will glow, same as RGB [2,0,0]
146
- <meshBasicMaterial color={[2,0,0]} toneMapped={false} />
147
- ```
148
-
149
- - [react-postprocessing exports](https://github.com/pmndrs/react-postprocessing/blob/master/api.md)
78
+ - [react-postprocessing docs](https://docs.pmnd.rs/react-postprocessing)
150
79
  - [postprocessing docs](https://pmndrs.github.io/postprocessing/public/docs/)
@@ -2,4 +2,5 @@
2
2
  import { ScanlineEffect, BlendFunction } from 'postprocessing';
3
3
  export declare const Scanline: import("react").ForwardRefExoticComponent<{
4
4
  blendFunction: BlendFunction;
5
+ density: number;
5
6
  } & import("react").RefAttributes<typeof ScanlineEffect>>;
package/dist/index.cjs CHANGED
@@ -56,7 +56,9 @@ const useVector2 = (props, key) => {
56
56
  }, [value]);
57
57
  };
58
58
 
59
- const Bloom = wrapEffect(postprocessing.BloomEffect, { blendFunction: postprocessing.BlendFunction.ADD });
59
+ const Bloom = wrapEffect(postprocessing.BloomEffect, {
60
+ blendFunction: postprocessing.BlendFunction.ADD,
61
+ });
60
62
 
61
63
  const BrightnessContrast = wrapEffect(postprocessing.BrightnessContrastEffect);
62
64
 
@@ -156,7 +158,13 @@ const EffectComposer = React.memo(React.forwardRef(({ children, camera: _camera,
156
158
  const DepthOfField = React.forwardRef(function DepthOfField({ target, depthTexture, ...props }, ref) {
157
159
  const invalidate = fiber.useThree((state) => state.invalidate);
158
160
  const { camera } = React.useContext(EffectComposerContext);
159
- const effect = React.useMemo(() => new postprocessing.DepthOfFieldEffect(camera, props), [camera, props]);
161
+ const effect = React.useMemo(() => {
162
+ const effect = new postprocessing.DepthOfFieldEffect(camera, props);
163
+ // Temporary fix that restores DOF 6.21.3 behavior, everything since then lets shapes leak through the blur
164
+ const maskMaterial = effect.maskPass.getFullscreenMaterial();
165
+ maskMaterial.maskFunction = postprocessing.MaskFunction.MULTIPLY_RGB_SET_ALPHA;
166
+ return effect;
167
+ }, [camera, props]);
160
168
  React.useLayoutEffect(() => {
161
169
  if (target && typeof target !== 'number') {
162
170
  const vec = target instanceof THREE.Vector3
@@ -308,7 +316,7 @@ const Pixelation = React.forwardRef(function Pixelation({ granularity = 5 }, ref
308
316
  return jsxRuntime.jsx("primitive", { ref: ref, object: effect, dispose: null });
309
317
  });
310
318
 
311
- const Scanline = wrapEffect(postprocessing.ScanlineEffect, { blendFunction: postprocessing.BlendFunction.OVERLAY });
319
+ const Scanline = wrapEffect(postprocessing.ScanlineEffect, { blendFunction: postprocessing.BlendFunction.OVERLAY, density: 1.25 });
312
320
 
313
321
  const addLight = (light, effect) => light.layers.enable(effect.selection.layer);
314
322
  const removeLight = (light, effect) => light.layers.disable(effect.selection.layer);
@@ -356,7 +364,6 @@ const SelectiveBloom = React.forwardRef(function SelectiveBloom({ selection = []
356
364
  };
357
365
  }
358
366
  }, [effect, invalidate, lights, selectionLayer]);
359
- React.useRef();
360
367
  React.useEffect(() => {
361
368
  var _a;
362
369
  if (api && api.enabled) {
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
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, SMAAEffect, TextureEffect, ToneMappingEffect, VignetteEffect, ShockWaveEffect, LUT3DEffect, TiltShiftEffect as TiltShiftEffect$1, Effect, EffectAttribute } from 'postprocessing';
1
+ import { BlendFunction, BloomEffect, BrightnessContrastEffect, ChromaticAberrationEffect, ColorAverageEffect, ColorDepthEffect, DepthEffect, EffectComposer as EffectComposer$1, RenderPass, NormalPass, DepthDownsamplingPass, EffectPass, DepthOfFieldEffect, MaskFunction, DotScreenEffect, GlitchEffect, GlitchMode, GodRaysEffect, GridEffect, HueSaturationEffect, NoiseEffect, OutlineEffect, PixelationEffect, ScanlineEffect, SelectiveBloomEffect, SepiaEffect, SSAOEffect, SMAAEffect, TextureEffect, ToneMappingEffect, VignetteEffect, ShockWaveEffect, LUT3DEffect, TiltShiftEffect as TiltShiftEffect$1, Effect, EffectAttribute } from 'postprocessing';
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
  import React, { forwardRef, useMemo, createContext, useEffect, useRef, useLayoutEffect, useImperativeHandle, useContext, useState } from 'react';
4
4
  import * as THREE from 'three';
@@ -36,7 +36,9 @@ const useVector2 = (props, key) => {
36
36
  }, [value]);
37
37
  };
38
38
 
39
- const Bloom = wrapEffect(BloomEffect, { blendFunction: BlendFunction.ADD });
39
+ const Bloom = wrapEffect(BloomEffect, {
40
+ blendFunction: BlendFunction.ADD,
41
+ });
40
42
 
41
43
  const BrightnessContrast = wrapEffect(BrightnessContrastEffect);
42
44
 
@@ -136,7 +138,13 @@ const EffectComposer = React.memo(forwardRef(({ children, camera: _camera, scene
136
138
  const DepthOfField = forwardRef(function DepthOfField({ target, depthTexture, ...props }, ref) {
137
139
  const invalidate = useThree((state) => state.invalidate);
138
140
  const { camera } = useContext(EffectComposerContext);
139
- const effect = useMemo(() => new DepthOfFieldEffect(camera, props), [camera, props]);
141
+ const effect = useMemo(() => {
142
+ const effect = new DepthOfFieldEffect(camera, props);
143
+ // Temporary fix that restores DOF 6.21.3 behavior, everything since then lets shapes leak through the blur
144
+ const maskMaterial = effect.maskPass.getFullscreenMaterial();
145
+ maskMaterial.maskFunction = MaskFunction.MULTIPLY_RGB_SET_ALPHA;
146
+ return effect;
147
+ }, [camera, props]);
140
148
  useLayoutEffect(() => {
141
149
  if (target && typeof target !== 'number') {
142
150
  const vec = target instanceof Vector3
@@ -288,7 +296,7 @@ const Pixelation = forwardRef(function Pixelation({ granularity = 5 }, ref) {
288
296
  return jsx("primitive", { ref: ref, object: effect, dispose: null });
289
297
  });
290
298
 
291
- const Scanline = wrapEffect(ScanlineEffect, { blendFunction: BlendFunction.OVERLAY });
299
+ const Scanline = wrapEffect(ScanlineEffect, { blendFunction: BlendFunction.OVERLAY, density: 1.25 });
292
300
 
293
301
  const addLight = (light, effect) => light.layers.enable(effect.selection.layer);
294
302
  const removeLight = (light, effect) => light.layers.disable(effect.selection.layer);
@@ -336,7 +344,6 @@ const SelectiveBloom = forwardRef(function SelectiveBloom({ selection = [], sele
336
344
  };
337
345
  }
338
346
  }, [effect, invalidate, lights, selectionLayer]);
339
- useRef();
340
347
  useEffect(() => {
341
348
  var _a;
342
349
  if (api && api.enabled) {
package/dist/util.d.ts CHANGED
@@ -9,5 +9,5 @@ export type EffectProps<T extends EffectConstructor> = ReactThreeFiber.Node<T ex
9
9
  blendFunction?: BlendFunction;
10
10
  opacity?: number;
11
11
  };
12
- export declare const wrapEffect: <T extends EffectConstructor, P extends EffectProps<T>>(effect: T, defaults?: P | undefined) => React.ForwardRefExoticComponent<React.PropsWithoutRef<P> & React.RefAttributes<T>>;
12
+ export declare const wrapEffect: <T extends EffectConstructor, P extends EffectProps<T> = EffectProps<T>>(effect: T, defaults?: P | undefined) => React.ForwardRefExoticComponent<React.PropsWithoutRef<P> & React.RefAttributes<T>>;
13
13
  export declare const useVector2: (props: Record<string, unknown>, key: string) => THREE.Vector2;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-three/postprocessing",
3
- "version": "2.9.1",
3
+ "version": "2.9.2",
4
4
  "description": "postprocessing wrapper for React and @react-three/fiber",
5
5
  "keywords": [
6
6
  "postprocessing",
@@ -33,6 +33,17 @@
33
33
  "eslint --fix"
34
34
  ]
35
35
  },
36
+ "scripts": {
37
+ "prebuild": "rimraf dist && yarn typegen",
38
+ "build": "rollup -c",
39
+ "prepare": "yarn build",
40
+ "eslint": "eslint . --fix --ext=js,ts,jsx,tsx",
41
+ "eslint:ci": "eslint . --ext=js,ts,jsx,tsx",
42
+ "test": "echo no tests yet",
43
+ "typecheck": "tsc --noEmit --emitDeclarationOnly false --strict --jsx react",
44
+ "typegen": "tsc --emitDeclarationOnly || true",
45
+ "release": "semantic-release"
46
+ },
36
47
  "dependencies": {
37
48
  "postprocessing": "^6.30.2",
38
49
  "screen-space-reflections": "2.5.0",
@@ -63,6 +74,7 @@
63
74
  "rimraf": "^5.0.0",
64
75
  "rollup": "^3.21.0",
65
76
  "rollup-plugin-filesize": "^10.0.0",
77
+ "semantic-release": "^21.0.2",
66
78
  "three": "^0.151.3",
67
79
  "typescript": "^5.0.4"
68
80
  },
@@ -70,14 +82,5 @@
70
82
  "@react-three/fiber": ">=8.0",
71
83
  "react": ">=18.0",
72
84
  "three": ">= 0.138.0 < 0.152.0"
73
- },
74
- "scripts": {
75
- "prebuild": "rimraf dist && yarn typegen",
76
- "build": "rollup -c",
77
- "eslint": "eslint . --fix --ext=js,ts,jsx,tsx",
78
- "eslint:ci": "eslint . --ext=js,ts,jsx,tsx",
79
- "test": "echo no tests yet",
80
- "typecheck": "tsc --noEmit --emitDeclarationOnly false --strict --jsx react",
81
- "typegen": "tsc --emitDeclarationOnly || true"
82
85
  }
83
- }
86
+ }