@react-three/postprocessing 2.19.0 → 3.0.0-rc.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.
Files changed (270) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +81 -81
  3. package/dist/index.d.ts +1 -38
  4. package/dist/index.js +554 -88
  5. package/dist/index.js.map +1 -1
  6. package/package.json +69 -96
  7. package/src/EffectComposer.test.tsx +126 -0
  8. package/src/EffectComposer.tsx +202 -0
  9. package/src/Selection.tsx +46 -0
  10. package/src/effects/ASCII.tsx +135 -0
  11. package/src/effects/Autofocus.tsx +153 -0
  12. package/src/effects/Bloom.tsx +6 -0
  13. package/src/effects/BrightnessContrast.tsx +4 -0
  14. package/src/effects/ChromaticAberration.tsx +5 -0
  15. package/src/effects/ColorAverage.tsx +15 -0
  16. package/src/effects/ColorDepth.tsx +4 -0
  17. package/src/effects/Depth.tsx +4 -0
  18. package/src/effects/DepthOfField.tsx +89 -0
  19. package/src/effects/DotScreen.tsx +4 -0
  20. package/src/effects/FXAA.tsx +4 -0
  21. package/src/effects/Glitch.tsx +40 -0
  22. package/src/effects/GodRays.tsx +16 -0
  23. package/src/effects/Grid.tsx +21 -0
  24. package/src/effects/HueSaturation.tsx +4 -0
  25. package/src/effects/LUT.tsx +26 -0
  26. package/{dist/effects/LensFlare.js → src/effects/LensFlare.tsx} +611 -556
  27. package/src/effects/N8AO.tsx +81 -0
  28. package/src/effects/Noise.tsx +4 -0
  29. package/src/effects/Outline.tsx +117 -0
  30. package/src/effects/Pixelation.tsx +15 -0
  31. package/{dist/effects/Ramp.js → src/effects/Ramp.tsx} +150 -156
  32. package/src/effects/SMAA.tsx +4 -0
  33. package/src/effects/SSAO.tsx +41 -0
  34. package/src/effects/ScanlineEffect.tsx +7 -0
  35. package/src/effects/SelectiveBloom.tsx +126 -0
  36. package/src/effects/Sepia.tsx +4 -0
  37. package/src/effects/ShockWave.tsx +4 -0
  38. package/src/effects/Texture.tsx +23 -0
  39. package/src/effects/TiltShift.tsx +4 -0
  40. package/{dist/effects/TiltShift2.js → src/effects/TiltShift2.tsx} +90 -98
  41. package/src/effects/ToneMapping.tsx +6 -0
  42. package/src/effects/Vignette.tsx +4 -0
  43. package/{dist/effects/Water.js → src/effects/Water.tsx} +35 -38
  44. package/src/index.ts +40 -0
  45. package/src/util.tsx +55 -0
  46. package/dist/EffectComposer.cjs +0 -137
  47. package/dist/EffectComposer.cjs.map +0 -1
  48. package/dist/EffectComposer.d.ts +0 -27
  49. package/dist/EffectComposer.js +0 -137
  50. package/dist/EffectComposer.js.map +0 -1
  51. package/dist/EffectComposer.test.d.ts +0 -4
  52. package/dist/Selection.cjs +0 -36
  53. package/dist/Selection.cjs.map +0 -1
  54. package/dist/Selection.d.ts +0 -16
  55. package/dist/Selection.js +0 -36
  56. package/dist/Selection.js.map +0 -1
  57. package/dist/compat.cjs +0 -77
  58. package/dist/compat.cjs.map +0 -1
  59. package/dist/compat.js +0 -60
  60. package/dist/compat.js.map +0 -1
  61. package/dist/effects/ASCII.cjs +0 -113
  62. package/dist/effects/ASCII.cjs.map +0 -1
  63. package/dist/effects/ASCII.d.ts +0 -17
  64. package/dist/effects/ASCII.js +0 -113
  65. package/dist/effects/ASCII.js.map +0 -1
  66. package/dist/effects/Autofocus.cjs +0 -126
  67. package/dist/effects/Autofocus.cjs.map +0 -1
  68. package/dist/effects/Autofocus.d.ts +0 -22
  69. package/dist/effects/Autofocus.js +0 -109
  70. package/dist/effects/Autofocus.js.map +0 -1
  71. package/dist/effects/Bloom.cjs +0 -9
  72. package/dist/effects/Bloom.cjs.map +0 -1
  73. package/dist/effects/Bloom.d.ts +0 -6
  74. package/dist/effects/Bloom.js +0 -9
  75. package/dist/effects/Bloom.js.map +0 -1
  76. package/dist/effects/BrightnessContrast.cjs +0 -7
  77. package/dist/effects/BrightnessContrast.cjs.map +0 -1
  78. package/dist/effects/BrightnessContrast.d.ts +0 -10
  79. package/dist/effects/BrightnessContrast.js +0 -7
  80. package/dist/effects/BrightnessContrast.js.map +0 -1
  81. package/dist/effects/ChromaticAberration.cjs +0 -7
  82. package/dist/effects/ChromaticAberration.cjs.map +0 -1
  83. package/dist/effects/ChromaticAberration.d.ts +0 -13
  84. package/dist/effects/ChromaticAberration.js +0 -7
  85. package/dist/effects/ChromaticAberration.js.map +0 -1
  86. package/dist/effects/ColorAverage.cjs +0 -11
  87. package/dist/effects/ColorAverage.cjs.map +0 -1
  88. package/dist/effects/ColorAverage.d.ts +0 -8
  89. package/dist/effects/ColorAverage.js +0 -11
  90. package/dist/effects/ColorAverage.js.map +0 -1
  91. package/dist/effects/ColorDepth.cjs +0 -7
  92. package/dist/effects/ColorDepth.cjs.map +0 -1
  93. package/dist/effects/ColorDepth.d.ts +0 -9
  94. package/dist/effects/ColorDepth.js +0 -7
  95. package/dist/effects/ColorDepth.js.map +0 -1
  96. package/dist/effects/Depth.cjs +0 -7
  97. package/dist/effects/Depth.cjs.map +0 -1
  98. package/dist/effects/Depth.d.ts +0 -9
  99. package/dist/effects/Depth.js +0 -7
  100. package/dist/effects/Depth.js.map +0 -1
  101. package/dist/effects/DepthOfField.cjs +0 -74
  102. package/dist/effects/DepthOfField.cjs.map +0 -1
  103. package/dist/effects/DepthOfField.d.ts +0 -25
  104. package/dist/effects/DepthOfField.js +0 -74
  105. package/dist/effects/DepthOfField.js.map +0 -1
  106. package/dist/effects/DotScreen.cjs +0 -7
  107. package/dist/effects/DotScreen.cjs.map +0 -1
  108. package/dist/effects/DotScreen.d.ts +0 -10
  109. package/dist/effects/DotScreen.js +0 -7
  110. package/dist/effects/DotScreen.js.map +0 -1
  111. package/dist/effects/FXAA.cjs +0 -7
  112. package/dist/effects/FXAA.cjs.map +0 -1
  113. package/dist/effects/FXAA.d.ts +0 -8
  114. package/dist/effects/FXAA.js +0 -7
  115. package/dist/effects/FXAA.js.map +0 -1
  116. package/dist/effects/Glitch.cjs +0 -31
  117. package/dist/effects/Glitch.cjs.map +0 -1
  118. package/dist/effects/Glitch.d.ts +0 -30
  119. package/dist/effects/Glitch.js +0 -31
  120. package/dist/effects/Glitch.js.map +0 -1
  121. package/dist/effects/GodRays.cjs +0 -15
  122. package/dist/effects/GodRays.cjs.map +0 -1
  123. package/dist/effects/GodRays.d.ts +0 -21
  124. package/dist/effects/GodRays.js +0 -15
  125. package/dist/effects/GodRays.js.map +0 -1
  126. package/dist/effects/Grid.cjs +0 -18
  127. package/dist/effects/Grid.cjs.map +0 -1
  128. package/dist/effects/Grid.d.ts +0 -12
  129. package/dist/effects/Grid.js +0 -18
  130. package/dist/effects/Grid.js.map +0 -1
  131. package/dist/effects/HueSaturation.cjs +0 -7
  132. package/dist/effects/HueSaturation.cjs.map +0 -1
  133. package/dist/effects/HueSaturation.d.ts +0 -10
  134. package/dist/effects/HueSaturation.js +0 -7
  135. package/dist/effects/HueSaturation.js.map +0 -1
  136. package/dist/effects/LUT.cjs +0 -20
  137. package/dist/effects/LUT.cjs.map +0 -1
  138. package/dist/effects/LUT.d.ts +0 -9
  139. package/dist/effects/LUT.js +0 -20
  140. package/dist/effects/LUT.js.map +0 -1
  141. package/dist/effects/LensFlare.cjs +0 -573
  142. package/dist/effects/LensFlare.cjs.map +0 -1
  143. package/dist/effects/LensFlare.d.ts +0 -55
  144. package/dist/effects/LensFlare.js.map +0 -1
  145. package/dist/effects/N8AO/BlueNoise.cjs +0 -4
  146. package/dist/effects/N8AO/BlueNoise.cjs.map +0 -1
  147. package/dist/effects/N8AO/BlueNoise.js +0 -5
  148. package/dist/effects/N8AO/BlueNoise.js.map +0 -1
  149. package/dist/effects/N8AO/DepthDownSample.cjs +0 -183
  150. package/dist/effects/N8AO/DepthDownSample.cjs.map +0 -1
  151. package/dist/effects/N8AO/DepthDownSample.js +0 -166
  152. package/dist/effects/N8AO/DepthDownSample.js.map +0 -1
  153. package/dist/effects/N8AO/EffectCompositer.cjs +0 -278
  154. package/dist/effects/N8AO/EffectCompositer.cjs.map +0 -1
  155. package/dist/effects/N8AO/EffectCompositer.js +0 -261
  156. package/dist/effects/N8AO/EffectCompositer.js.map +0 -1
  157. package/dist/effects/N8AO/EffectShader.cjs +0 -236
  158. package/dist/effects/N8AO/EffectShader.cjs.map +0 -1
  159. package/dist/effects/N8AO/EffectShader.js +0 -219
  160. package/dist/effects/N8AO/EffectShader.js.map +0 -1
  161. package/dist/effects/N8AO/FullScreenTriangle.cjs +0 -59
  162. package/dist/effects/N8AO/FullScreenTriangle.cjs.map +0 -1
  163. package/dist/effects/N8AO/FullScreenTriangle.js +0 -42
  164. package/dist/effects/N8AO/FullScreenTriangle.js.map +0 -1
  165. package/dist/effects/N8AO/N8AOPostPass.cjs +0 -502
  166. package/dist/effects/N8AO/N8AOPostPass.cjs.map +0 -1
  167. package/dist/effects/N8AO/N8AOPostPass.js +0 -485
  168. package/dist/effects/N8AO/N8AOPostPass.js.map +0 -1
  169. package/dist/effects/N8AO/PoissionBlur.cjs +0 -186
  170. package/dist/effects/N8AO/PoissionBlur.cjs.map +0 -1
  171. package/dist/effects/N8AO/PoissionBlur.js +0 -169
  172. package/dist/effects/N8AO/PoissionBlur.js.map +0 -1
  173. package/dist/effects/N8AO/index.cjs +0 -60
  174. package/dist/effects/N8AO/index.cjs.map +0 -1
  175. package/dist/effects/N8AO/index.d.ts +0 -18
  176. package/dist/effects/N8AO/index.js +0 -60
  177. package/dist/effects/N8AO/index.js.map +0 -1
  178. package/dist/effects/Noise.cjs +0 -7
  179. package/dist/effects/Noise.cjs.map +0 -1
  180. package/dist/effects/Noise.d.ts +0 -9
  181. package/dist/effects/Noise.js +0 -7
  182. package/dist/effects/Noise.js.map +0 -1
  183. package/dist/effects/Outline.cjs +0 -100
  184. package/dist/effects/Outline.cjs.map +0 -1
  185. package/dist/effects/Outline.d.ts +0 -30
  186. package/dist/effects/Outline.js +0 -100
  187. package/dist/effects/Outline.js.map +0 -1
  188. package/dist/effects/Pixelation.cjs +0 -11
  189. package/dist/effects/Pixelation.cjs.map +0 -1
  190. package/dist/effects/Pixelation.d.ts +0 -6
  191. package/dist/effects/Pixelation.js +0 -11
  192. package/dist/effects/Pixelation.js.map +0 -1
  193. package/dist/effects/Ramp.cjs +0 -156
  194. package/dist/effects/Ramp.cjs.map +0 -1
  195. package/dist/effects/Ramp.d.ts +0 -88
  196. package/dist/effects/Ramp.js.map +0 -1
  197. package/dist/effects/SMAA.cjs +0 -7
  198. package/dist/effects/SMAA.cjs.map +0 -1
  199. package/dist/effects/SMAA.d.ts +0 -10
  200. package/dist/effects/SMAA.js +0 -7
  201. package/dist/effects/SMAA.js.map +0 -1
  202. package/dist/effects/SSAO.cjs +0 -37
  203. package/dist/effects/SSAO.cjs.map +0 -1
  204. package/dist/effects/SSAO.d.ts +0 -30
  205. package/dist/effects/SSAO.js +0 -37
  206. package/dist/effects/SSAO.js.map +0 -1
  207. package/dist/effects/SSR/index.cjs +0 -33
  208. package/dist/effects/SSR/index.cjs.map +0 -1
  209. package/dist/effects/SSR/index.d.ts +0 -55
  210. package/dist/effects/SSR/index.js +0 -33
  211. package/dist/effects/SSR/index.js.map +0 -1
  212. package/dist/effects/SSR/screen-space-reflections.cjs +0 -1699
  213. package/dist/effects/SSR/screen-space-reflections.cjs.map +0 -1
  214. package/dist/effects/SSR/screen-space-reflections.js +0 -1699
  215. package/dist/effects/SSR/screen-space-reflections.js.map +0 -1
  216. package/dist/effects/ScanlineEffect.cjs +0 -7
  217. package/dist/effects/ScanlineEffect.cjs.map +0 -1
  218. package/dist/effects/ScanlineEffect.d.ts +0 -9
  219. package/dist/effects/ScanlineEffect.js +0 -7
  220. package/dist/effects/ScanlineEffect.js.map +0 -1
  221. package/dist/effects/SelectiveBloom.cjs +0 -94
  222. package/dist/effects/SelectiveBloom.cjs.map +0 -1
  223. package/dist/effects/SelectiveBloom.d.ts +0 -20
  224. package/dist/effects/SelectiveBloom.js +0 -94
  225. package/dist/effects/SelectiveBloom.js.map +0 -1
  226. package/dist/effects/Sepia.cjs +0 -7
  227. package/dist/effects/Sepia.cjs.map +0 -1
  228. package/dist/effects/Sepia.d.ts +0 -9
  229. package/dist/effects/Sepia.js +0 -7
  230. package/dist/effects/Sepia.js.map +0 -1
  231. package/dist/effects/ShockWave.cjs +0 -7
  232. package/dist/effects/ShockWave.cjs.map +0 -1
  233. package/dist/effects/ShockWave.d.ts +0 -6
  234. package/dist/effects/ShockWave.js +0 -7
  235. package/dist/effects/ShockWave.js.map +0 -1
  236. package/dist/effects/Texture.cjs +0 -21
  237. package/dist/effects/Texture.cjs.map +0 -1
  238. package/dist/effects/Texture.d.ts +0 -11
  239. package/dist/effects/Texture.js +0 -21
  240. package/dist/effects/Texture.js.map +0 -1
  241. package/dist/effects/TiltShift.cjs +0 -7
  242. package/dist/effects/TiltShift.cjs.map +0 -1
  243. package/dist/effects/TiltShift.d.ts +0 -17
  244. package/dist/effects/TiltShift.js +0 -7
  245. package/dist/effects/TiltShift.js.map +0 -1
  246. package/dist/effects/TiltShift2.cjs +0 -98
  247. package/dist/effects/TiltShift2.cjs.map +0 -1
  248. package/dist/effects/TiltShift2.d.ts +0 -30
  249. package/dist/effects/TiltShift2.js.map +0 -1
  250. package/dist/effects/ToneMapping.cjs +0 -7
  251. package/dist/effects/ToneMapping.cjs.map +0 -1
  252. package/dist/effects/ToneMapping.d.ts +0 -19
  253. package/dist/effects/ToneMapping.js +0 -7
  254. package/dist/effects/ToneMapping.js.map +0 -1
  255. package/dist/effects/Vignette.cjs +0 -7
  256. package/dist/effects/Vignette.cjs.map +0 -1
  257. package/dist/effects/Vignette.d.ts +0 -12
  258. package/dist/effects/Vignette.js +0 -7
  259. package/dist/effects/Vignette.js.map +0 -1
  260. package/dist/effects/Water.cjs +0 -38
  261. package/dist/effects/Water.cjs.map +0 -1
  262. package/dist/effects/Water.d.ts +0 -15
  263. package/dist/effects/Water.js.map +0 -1
  264. package/dist/index.cjs +0 -89
  265. package/dist/index.cjs.map +0 -1
  266. package/dist/util.cjs +0 -69
  267. package/dist/util.cjs.map +0 -1
  268. package/dist/util.d.ts +0 -13
  269. package/dist/util.js +0 -52
  270. package/dist/util.js.map +0 -1
@@ -0,0 +1,126 @@
1
+ import { SelectiveBloomEffect, BlendFunction } from 'postprocessing'
2
+ import type { BloomEffectOptions } from 'postprocessing'
3
+ import React, { Ref, RefObject, forwardRef, useMemo, useEffect, useContext, useRef } from 'react'
4
+ import { Object3D } from 'three'
5
+ import { useThree } from '@react-three/fiber'
6
+ import { EffectComposerContext } from '../EffectComposer.tsx'
7
+ import { selectionContext } from '../Selection.tsx'
8
+ import { resolveRef } from '../util.tsx'
9
+
10
+ type ObjectRef = RefObject<Object3D>
11
+
12
+ export type SelectiveBloomProps = BloomEffectOptions &
13
+ Partial<{
14
+ lights: Object3D[] | ObjectRef[]
15
+ selection: Object3D | Object3D[] | ObjectRef | ObjectRef[]
16
+ selectionLayer: number
17
+ inverted: boolean
18
+ ignoreBackground: boolean
19
+ }>
20
+
21
+ const addLight = (light: Object3D, effect: SelectiveBloomEffect) => light.layers.enable(effect.selection.layer)
22
+ const removeLight = (light: Object3D, effect: SelectiveBloomEffect) => light.layers.disable(effect.selection.layer)
23
+
24
+ export const SelectiveBloom = /* @__PURE__ */ forwardRef(function SelectiveBloom(
25
+ {
26
+ selection = [],
27
+ selectionLayer = 10,
28
+ lights = [],
29
+ inverted = false,
30
+ ignoreBackground = false,
31
+ luminanceThreshold,
32
+ luminanceSmoothing,
33
+ intensity,
34
+ width,
35
+ height,
36
+ kernelSize,
37
+ mipmapBlur,
38
+
39
+ ...props
40
+ }: SelectiveBloomProps,
41
+ forwardRef: Ref<SelectiveBloomEffect>
42
+ ) {
43
+ if (lights.length === 0) {
44
+ console.warn('SelectiveBloom requires lights to work.')
45
+ }
46
+
47
+ const invalidate = useThree((state) => state.invalidate)
48
+ const { scene, camera } = useContext(EffectComposerContext)
49
+ const effect = useMemo(() => {
50
+ const effect = new SelectiveBloomEffect(scene, camera, {
51
+ blendFunction: BlendFunction.ADD,
52
+ luminanceThreshold,
53
+ luminanceSmoothing,
54
+ intensity,
55
+ width,
56
+ height,
57
+ kernelSize,
58
+ mipmapBlur,
59
+ ...props,
60
+ })
61
+ effect.inverted = inverted
62
+ effect.ignoreBackground = ignoreBackground
63
+ return effect
64
+ }, [
65
+ scene,
66
+ camera,
67
+ luminanceThreshold,
68
+ luminanceSmoothing,
69
+ intensity,
70
+ width,
71
+ height,
72
+ kernelSize,
73
+ mipmapBlur,
74
+ inverted,
75
+ ignoreBackground,
76
+ props,
77
+ ])
78
+
79
+ const api = useContext(selectionContext)
80
+
81
+ useEffect(() => {
82
+ // Do not allow array selection if declarative selection is active
83
+ // TODO: array selection should probably be deprecated altogether
84
+ if (!api && selection) {
85
+ effect.selection.set(
86
+ Array.isArray(selection) ? (selection as Object3D[]).map(resolveRef) : [resolveRef(selection) as Object3D]
87
+ )
88
+ invalidate()
89
+ return () => {
90
+ effect.selection.clear()
91
+ invalidate()
92
+ }
93
+ }
94
+ }, [effect, selection, api, invalidate])
95
+
96
+ useEffect(() => {
97
+ effect.selection.layer = selectionLayer
98
+ invalidate()
99
+ }, [effect, invalidate, selectionLayer])
100
+
101
+ useEffect(() => {
102
+ if (lights && lights.length > 0) {
103
+ lights.forEach((light) => addLight(resolveRef(light), effect))
104
+ invalidate()
105
+ return () => {
106
+ lights.forEach((light) => removeLight(resolveRef(light), effect))
107
+ invalidate()
108
+ }
109
+ }
110
+ }, [effect, invalidate, lights, selectionLayer])
111
+
112
+ useEffect(() => {
113
+ if (api && api.enabled) {
114
+ if (api.selected?.length) {
115
+ effect.selection.set(api.selected)
116
+ invalidate()
117
+ return () => {
118
+ effect.selection.clear()
119
+ invalidate()
120
+ }
121
+ }
122
+ }
123
+ }, [api, effect.selection, invalidate])
124
+
125
+ return <primitive ref={forwardRef} object={effect} dispose={null} />
126
+ })
@@ -0,0 +1,4 @@
1
+ import { SepiaEffect } from 'postprocessing'
2
+ import { wrapEffect } from '../util.tsx'
3
+
4
+ export const Sepia = /* @__PURE__ */ wrapEffect(SepiaEffect)
@@ -0,0 +1,4 @@
1
+ import { ShockWaveEffect } from 'postprocessing'
2
+ import { wrapEffect } from '../util.tsx'
3
+
4
+ export const ShockWave = /* @__PURE__ */ wrapEffect(ShockWaveEffect)
@@ -0,0 +1,23 @@
1
+ import { TextureEffect } from 'postprocessing'
2
+ import { Ref, forwardRef, useMemo, useLayoutEffect } from 'react'
3
+ import { useLoader } from '@react-three/fiber'
4
+ import { TextureLoader, SRGBColorSpace, RepeatWrapping } from 'three'
5
+
6
+ type TextureProps = ConstructorParameters<typeof TextureEffect>[0] & {
7
+ textureSrc: string
8
+ /** opacity of provided texture */
9
+ opacity?: number
10
+ }
11
+
12
+ export const Texture = /* @__PURE__ */ forwardRef<TextureEffect, TextureProps>(function Texture(
13
+ { textureSrc, texture, opacity = 1, ...props }: TextureProps,
14
+ ref: Ref<TextureEffect>
15
+ ) {
16
+ const t = useLoader(TextureLoader, textureSrc)
17
+ useLayoutEffect(() => {
18
+ t.colorSpace = SRGBColorSpace
19
+ t.wrapS = t.wrapT = RepeatWrapping
20
+ }, [t])
21
+ const effect = useMemo(() => new TextureEffect({ ...props, texture: t || texture }), [props, t, texture])
22
+ return <primitive ref={ref} object={effect} blendMode-opacity-value={opacity} dispose={null} />
23
+ })
@@ -0,0 +1,4 @@
1
+ import { TiltShiftEffect, BlendFunction } from 'postprocessing'
2
+ import { wrapEffect } from '../util.tsx'
3
+
4
+ export const TiltShift = /* @__PURE__ */ wrapEffect(TiltShiftEffect, { blendFunction: BlendFunction.ADD })
@@ -1,98 +1,90 @@
1
- import { Uniform } from "three";
2
- import { Effect, EffectAttribute, BlendFunction } from "postprocessing";
3
- import { wrapEffect } from "../util.js";
4
- const TiltShiftShader = {
5
- fragmentShader: `
6
-
7
- // original shader by Evan Wallace
8
-
9
- #define MAX_ITERATIONS 100
10
-
11
- uniform float blur;
12
- uniform float taper;
13
- uniform vec2 start;
14
- uniform vec2 end;
15
- uniform vec2 direction;
16
- uniform int samples;
17
-
18
- float random(vec3 scale, float seed) {
19
- /* use the fragment position for a different seed per-pixel */
20
- return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);
21
- }
22
-
23
- void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
24
- vec4 color = vec4(0.0);
25
- float total = 0.0;
26
- vec2 startPixel = vec2(start.x * resolution.x, start.y * resolution.y);
27
- vec2 endPixel = vec2(end.x * resolution.x, end.y * resolution.y);
28
- float f_samples = float(samples);
29
- float half_samples = f_samples / 2.0;
30
-
31
- // use screen diagonal to normalize blur radii
32
- float maxScreenDistance = distance(vec2(0.0), resolution); // diagonal distance
33
- float gradientRadius = taper * (maxScreenDistance);
34
- float blurRadius = blur * (maxScreenDistance / 16.0);
35
-
36
- /* randomize the lookup values to hide the fixed number of samples */
37
- float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);
38
- vec2 normal = normalize(vec2(startPixel.y - endPixel.y, endPixel.x - startPixel.x));
39
- float radius = smoothstep(0.0, 1.0, abs(dot(uv * resolution - startPixel, normal)) / gradientRadius) * blurRadius;
40
-
41
- #pragma unroll_loop_start
42
- for (int i = 0; i <= MAX_ITERATIONS; i++) {
43
- if (i >= samples) { break; } // return early if over sample count
44
- float f_i = float(i);
45
- float s_i = -half_samples + f_i;
46
- float percent = (s_i + offset - 0.5) / half_samples;
47
- float weight = 1.0 - abs(percent);
48
- vec4 sample_i = texture2D(inputBuffer, uv + normalize(direction) / resolution * percent * radius);
49
- /* switch to pre-multiplied alpha to correctly blur transparent images */
50
- sample_i.rgb *= sample_i.a;
51
- color += sample_i * weight;
52
- total += weight;
53
- }
54
- #pragma unroll_loop_end
55
-
56
- outputColor = color / total;
57
-
58
- /* switch back from pre-multiplied alpha */
59
- outputColor.rgb /= outputColor.a + 0.00001;
60
- }
61
- `
62
- };
63
- class TiltShiftEffect extends Effect {
64
- constructor({
65
- blendFunction = BlendFunction.NORMAL,
66
- blur = 0.15,
67
- // [0, 1], can go beyond 1 for extra
68
- taper = 0.5,
69
- // [0, 1], can go beyond 1 for extra
70
- start = [0.5, 0],
71
- // [0,1] percentage x,y of screenspace
72
- end = [0.5, 1],
73
- // [0,1] percentage x,y of screenspace
74
- samples = 10,
75
- // number of blur samples
76
- direction = [1, 1]
77
- // direction of blur
78
- } = {}) {
79
- super("TiltShiftEffect", TiltShiftShader.fragmentShader, {
80
- blendFunction,
81
- attributes: EffectAttribute.CONVOLUTION,
82
- uniforms: /* @__PURE__ */ new Map([
83
- ["blur", new Uniform(blur)],
84
- ["taper", new Uniform(taper)],
85
- ["start", new Uniform(start)],
86
- ["end", new Uniform(end)],
87
- ["samples", new Uniform(samples)],
88
- ["direction", new Uniform(direction)]
89
- ])
90
- });
91
- }
92
- }
93
- const TiltShift2 = wrapEffect(TiltShiftEffect, { blendFunction: BlendFunction.NORMAL });
94
- export {
95
- TiltShift2,
96
- TiltShiftEffect
97
- };
98
- //# sourceMappingURL=TiltShift2.js.map
1
+ import { Uniform } from 'three'
2
+ import { BlendFunction, Effect, EffectAttribute } from 'postprocessing'
3
+ import { wrapEffect } from '../util.tsx'
4
+
5
+ const TiltShiftShader = {
6
+ fragmentShader: `
7
+
8
+ // original shader by Evan Wallace
9
+
10
+ #define MAX_ITERATIONS 100
11
+
12
+ uniform float blur;
13
+ uniform float taper;
14
+ uniform vec2 start;
15
+ uniform vec2 end;
16
+ uniform vec2 direction;
17
+ uniform int samples;
18
+
19
+ float random(vec3 scale, float seed) {
20
+ /* use the fragment position for a different seed per-pixel */
21
+ return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);
22
+ }
23
+
24
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
25
+ vec4 color = vec4(0.0);
26
+ float total = 0.0;
27
+ vec2 startPixel = vec2(start.x * resolution.x, start.y * resolution.y);
28
+ vec2 endPixel = vec2(end.x * resolution.x, end.y * resolution.y);
29
+ float f_samples = float(samples);
30
+ float half_samples = f_samples / 2.0;
31
+
32
+ // use screen diagonal to normalize blur radii
33
+ float maxScreenDistance = distance(vec2(0.0), resolution); // diagonal distance
34
+ float gradientRadius = taper * (maxScreenDistance);
35
+ float blurRadius = blur * (maxScreenDistance / 16.0);
36
+
37
+ /* randomize the lookup values to hide the fixed number of samples */
38
+ float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);
39
+ vec2 normal = normalize(vec2(startPixel.y - endPixel.y, endPixel.x - startPixel.x));
40
+ float radius = smoothstep(0.0, 1.0, abs(dot(uv * resolution - startPixel, normal)) / gradientRadius) * blurRadius;
41
+
42
+ #pragma unroll_loop_start
43
+ for (int i = 0; i <= MAX_ITERATIONS; i++) {
44
+ if (i >= samples) { break; } // return early if over sample count
45
+ float f_i = float(i);
46
+ float s_i = -half_samples + f_i;
47
+ float percent = (s_i + offset - 0.5) / half_samples;
48
+ float weight = 1.0 - abs(percent);
49
+ vec4 sample_i = texture2D(inputBuffer, uv + normalize(direction) / resolution * percent * radius);
50
+ /* switch to pre-multiplied alpha to correctly blur transparent images */
51
+ sample_i.rgb *= sample_i.a;
52
+ color += sample_i * weight;
53
+ total += weight;
54
+ }
55
+ #pragma unroll_loop_end
56
+
57
+ outputColor = color / total;
58
+
59
+ /* switch back from pre-multiplied alpha */
60
+ outputColor.rgb /= outputColor.a + 0.00001;
61
+ }
62
+ `,
63
+ }
64
+
65
+ export class TiltShiftEffect extends Effect {
66
+ constructor({
67
+ blendFunction = BlendFunction.NORMAL,
68
+ blur = 0.15, // [0, 1], can go beyond 1 for extra
69
+ taper = 0.5, // [0, 1], can go beyond 1 for extra
70
+ start = [0.5, 0.0], // [0,1] percentage x,y of screenspace
71
+ end = [0.5, 1.0], // [0,1] percentage x,y of screenspace
72
+ samples = 10.0, // number of blur samples
73
+ direction = [1, 1], // direction of blur
74
+ } = {}) {
75
+ super('TiltShiftEffect', TiltShiftShader.fragmentShader, {
76
+ blendFunction,
77
+ attributes: EffectAttribute.CONVOLUTION,
78
+ uniforms: new Map<string, Uniform<number | number[]>>([
79
+ ['blur', new Uniform(blur)],
80
+ ['taper', new Uniform(taper)],
81
+ ['start', new Uniform(start)],
82
+ ['end', new Uniform(end)],
83
+ ['samples', new Uniform(samples)],
84
+ ['direction', new Uniform(direction)],
85
+ ]),
86
+ })
87
+ }
88
+ }
89
+
90
+ export const TiltShift2 = /* @__PURE__ */ wrapEffect(TiltShiftEffect, { blendFunction: BlendFunction.NORMAL })
@@ -0,0 +1,6 @@
1
+ import { ToneMappingEffect } from 'postprocessing'
2
+ import { type EffectProps, wrapEffect } from '../util.tsx'
3
+
4
+ export type ToneMappingProps = EffectProps<typeof ToneMappingEffect>
5
+
6
+ export const ToneMapping = /* @__PURE__ */ wrapEffect(ToneMappingEffect)
@@ -0,0 +1,4 @@
1
+ import { VignetteEffect } from 'postprocessing'
2
+ import { wrapEffect } from '../util.tsx'
3
+
4
+ export const Vignette = /* @__PURE__ */ wrapEffect(VignetteEffect)
@@ -1,38 +1,35 @@
1
- import { Uniform } from "three";
2
- import { Effect, EffectAttribute, BlendFunction } from "postprocessing";
3
- import { wrapEffect } from "../util.js";
4
- const WaterShader = {
5
- fragmentShader: (
6
- /* glsl */
7
- `
8
- uniform float factor;
9
-
10
- void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
11
- vec2 vUv = uv;
12
- float frequency = 6.0 * factor;
13
- float amplitude = 0.015 * factor;
14
- float x = vUv.y * frequency + time * 0.7;
15
- float y = vUv.x * frequency + time * 0.3;
16
- vUv.x += cos(x + y) * amplitude * cos(y);
17
- vUv.y += sin(x - y) * amplitude * cos(y);
18
- vec4 rgba = texture(inputBuffer, vUv);
19
- outputColor = rgba;
20
- }
21
- `
22
- )
23
- };
24
- class WaterEffectImpl extends Effect {
25
- constructor({ blendFunction = BlendFunction.NORMAL, factor = 0 } = {}) {
26
- super("WaterEffect", WaterShader.fragmentShader, {
27
- blendFunction,
28
- attributes: EffectAttribute.CONVOLUTION,
29
- uniforms: /* @__PURE__ */ new Map([["factor", new Uniform(factor)]])
30
- });
31
- }
32
- }
33
- const WaterEffect = wrapEffect(WaterEffectImpl, { blendFunction: BlendFunction.NORMAL });
34
- export {
35
- WaterEffect,
36
- WaterEffectImpl
37
- };
38
- //# sourceMappingURL=Water.js.map
1
+ import { Uniform } from 'three'
2
+ import { BlendFunction, Effect, EffectAttribute } from 'postprocessing'
3
+ import { wrapEffect } from '../util.tsx'
4
+
5
+ const WaterShader = {
6
+ fragmentShader: /* glsl */ `
7
+ uniform float factor;
8
+
9
+ void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
10
+ vec2 vUv = uv;
11
+ float frequency = 6.0 * factor;
12
+ float amplitude = 0.015 * factor;
13
+ float x = vUv.y * frequency + time * 0.7;
14
+ float y = vUv.x * frequency + time * 0.3;
15
+ vUv.x += cos(x + y) * amplitude * cos(y);
16
+ vUv.y += sin(x - y) * amplitude * cos(y);
17
+ vec4 rgba = texture(inputBuffer, vUv);
18
+ outputColor = rgba;
19
+ }
20
+ `,
21
+ }
22
+
23
+ export class WaterEffectImpl extends Effect {
24
+ constructor({ blendFunction = BlendFunction.NORMAL, factor = 0 } = {}) {
25
+ super('WaterEffect', WaterShader.fragmentShader, {
26
+ blendFunction,
27
+ attributes: EffectAttribute.CONVOLUTION,
28
+ uniforms: new Map<string, Uniform<number | number[]>>([['factor', new Uniform(factor)]]),
29
+ })
30
+ }
31
+ }
32
+
33
+ export const WaterEffect = /* @__PURE__ */ wrapEffect(WaterEffectImpl, {
34
+ blendFunction: BlendFunction.NORMAL,
35
+ })
package/src/index.ts ADDED
@@ -0,0 +1,40 @@
1
+ export * from './Selection.tsx'
2
+ export * from './EffectComposer.tsx'
3
+ export * from './util.tsx'
4
+
5
+ export * from './effects/Autofocus.tsx'
6
+ export * from './effects/LensFlare.tsx'
7
+ export * from './effects/Bloom.tsx'
8
+ export * from './effects/BrightnessContrast.tsx'
9
+ export * from './effects/ChromaticAberration.tsx'
10
+ export * from './effects/ColorAverage.tsx'
11
+ export * from './effects/ColorDepth.tsx'
12
+ export * from './effects/Depth.tsx'
13
+ export * from './effects/DepthOfField.tsx'
14
+ export * from './effects/DotScreen.tsx'
15
+ export * from './effects/Glitch.tsx'
16
+ export * from './effects/GodRays.tsx'
17
+ export * from './effects/Grid.tsx'
18
+ export * from './effects/HueSaturation.tsx'
19
+ export * from './effects/Noise.tsx'
20
+ export * from './effects/Outline.tsx'
21
+ export * from './effects/Pixelation.tsx'
22
+ export * from './effects/ScanlineEffect.tsx'
23
+ export * from './effects/SelectiveBloom.tsx'
24
+ export * from './effects/Sepia.tsx'
25
+ export * from './effects/SSAO.tsx'
26
+ export * from './effects/SMAA.tsx'
27
+ export * from './effects/FXAA.tsx'
28
+ export * from './effects/Ramp.tsx'
29
+ export * from './effects/Texture.tsx'
30
+ export * from './effects/ToneMapping.tsx'
31
+ export * from './effects/Vignette.tsx'
32
+ export * from './effects/ShockWave.tsx'
33
+ export * from './effects/LUT.tsx'
34
+ export * from './effects/TiltShift.tsx'
35
+ export * from './effects/TiltShift2.tsx'
36
+ export * from './effects/ASCII.tsx'
37
+ export * from './effects/Water.tsx'
38
+
39
+ // These are not effect passes
40
+ export * from './effects/N8AO.tsx'
package/src/util.tsx ADDED
@@ -0,0 +1,55 @@
1
+ import React, { RefObject } from 'react'
2
+ import { Vector2 } from 'three'
3
+ import * as THREE from 'three'
4
+ import { type ReactThreeFiber, type ThreeElement, extend, useThree } from '@react-three/fiber'
5
+ import type { Effect, Pass, BlendFunction } from 'postprocessing'
6
+
7
+ export const resolveRef = <T,>(ref: T | React.RefObject<T>) =>
8
+ typeof ref === 'object' && ref != null && 'current' in ref ? ref.current : ref
9
+
10
+ export type EffectConstructor = new (...args: any[]) => Effect | Pass
11
+
12
+ export type EffectProps<T extends EffectConstructor> = ThreeElement<T> &
13
+ ConstructorParameters<T>[0] & {
14
+ blendFunction?: BlendFunction
15
+ opacity?: number
16
+ }
17
+
18
+ let i = 0
19
+ const components = new WeakMap<EffectConstructor, React.ExoticComponent<any> | string>()
20
+
21
+ export const wrapEffect = <T extends EffectConstructor>(effect: T, defaults?: EffectProps<T>) =>
22
+ /* @__PURE__ */ function Effect({ blendFunction = defaults?.blendFunction, opacity = defaults?.opacity, ...props }) {
23
+ let Component = components.get(effect)
24
+ if (!Component) {
25
+ const key = `@react-three/postprocessing/${effect.name}-${i++}`
26
+ extend({ [key]: effect })
27
+ components.set(effect, (Component = key))
28
+ }
29
+
30
+ const camera = useThree((state) => state.camera)
31
+ const args = React.useMemo(
32
+ () => [...(defaults?.args ?? []), ...(props.args ?? [{ ...defaults, ...props }])],
33
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34
+ [JSON.stringify(props)]
35
+ )
36
+
37
+ return (
38
+ <Component
39
+ camera={camera}
40
+ blendMode-blendFunction={blendFunction}
41
+ blendMode-opacity-value={opacity}
42
+ {...props}
43
+ args={args}
44
+ />
45
+ )
46
+ }
47
+
48
+ export const useVector2 = (props: Record<string, unknown>, key: string): THREE.Vector2 => {
49
+ const value = props[key] as ReactThreeFiber.Vector2 | undefined
50
+ return React.useMemo(() => {
51
+ if (typeof value === 'number') return new THREE.Vector2(value, value)
52
+ else if (value) return new THREE.Vector2(...(value as THREE.Vector2Tuple))
53
+ else return new THREE.Vector2()
54
+ }, [value])
55
+ }