@react-three/postprocessing 2.19.1 → 3.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +68 -96
  7. package/src/EffectComposer.test.tsx +126 -0
  8. package/src/EffectComposer.tsx +200 -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 -18
  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 -104
  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 -104
  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
@@ -1,556 +1,611 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import * as THREE from "three";
3
- import { useContext, useState, useRef, useEffect } from "react";
4
- import { useThree, useFrame } from "@react-three/fiber";
5
- import { Effect, BlendFunction } from "postprocessing";
6
- import { easing } from "maath";
7
- import { EffectComposerContext } from "../EffectComposer.js";
8
- import { wrapEffect } from "../util.js";
9
- const LensFlareShader = {
10
- fragmentShader: (
11
- /* glsl */
12
- `
13
- uniform float time;
14
- uniform vec2 lensPosition;
15
- uniform vec2 screenRes;
16
- uniform vec3 colorGain;
17
- uniform float starPoints;
18
- uniform float glareSize;
19
- uniform float flareSize;
20
- uniform float flareSpeed;
21
- uniform float flareShape;
22
- uniform float haloScale;
23
- uniform float opacity;
24
- uniform bool animated;
25
- uniform bool anamorphic;
26
- uniform bool enabled;
27
- uniform bool secondaryGhosts;
28
- uniform bool starBurst;
29
- uniform float ghostScale;
30
- uniform bool aditionalStreaks;
31
- uniform sampler2D lensDirtTexture;
32
- vec2 vTexCoord;
33
-
34
- float rand(float n){return fract(sin(n) * 43758.5453123);}
35
-
36
- float noise(float p){
37
- float fl = floor(p);
38
- float fc = fract(p);
39
- return mix(rand(fl),rand(fl + 1.0), fc);
40
- }
41
-
42
- vec3 hsv2rgb(vec3 c)
43
- {
44
- vec4 k = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
45
- vec3 p = abs(fract(c.xxx + k.xyz) * 6.0 - k.www);
46
- return c.z * mix(k.xxx, clamp(p - k.xxx, 0.0, 1.0), c.y);
47
- }
48
-
49
- float saturate(float x)
50
- {
51
- return clamp(x, 0.,1.);
52
- }
53
-
54
- vec2 rotateUV(vec2 uv, float rotation)
55
- {
56
- return vec2(
57
- cos(rotation) * uv.x + sin(rotation) * uv.y,
58
- cos(rotation) * uv.y - sin(rotation) * uv.x
59
- );
60
- }
61
-
62
- // Based on https://www.shadertoy.com/view/XtKfRV
63
- vec3 drawflare(vec2 p, float intensity, float rnd, float speed, int id)
64
- {
65
- float flarehueoffset = (1. / 32.) * float(id) * 0.1;
66
- float lingrad = distance(vec2(0.), p);
67
- float expgrad = 1. / exp(lingrad * (fract(rnd) * 0.66 + 0.33));
68
- vec3 colgrad = hsv2rgb(vec3( fract( (expgrad * 8.) + speed * flareSpeed + flarehueoffset), pow(1.-abs(expgrad*2.-1.), 0.45), 20.0 * expgrad * intensity)); //rainbow spectrum effect
69
-
70
- float internalStarPoints;
71
-
72
- if(anamorphic){
73
- internalStarPoints = 1.0;
74
- } else{
75
- internalStarPoints = starPoints;
76
- }
77
-
78
- float blades = length(p * flareShape * sin(internalStarPoints * atan(p.x, p.y)));
79
-
80
- float comp = pow(1.-saturate(blades), ( anamorphic ? 100. : 12.));
81
- comp += saturate(expgrad-0.9) * 3.;
82
- comp = pow(comp * expgrad, 8. + (1.-intensity) * 5.);
83
-
84
- if(flareSpeed > 0.0){
85
- return vec3(comp) * colgrad;
86
- } else{
87
- return vec3(comp) * flareSize * 15.;
88
- }
89
- }
90
-
91
- float dist(vec3 a, vec3 b) { return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z); }
92
-
93
- vec3 saturate(vec3 x)
94
- {
95
- return clamp(x, vec3(0.0), vec3(1.0));
96
- }
97
-
98
- // Based on https://www.shadertoy.com/view/XtKfRV
99
- float glare(vec2 uv, vec2 pos, float size)
100
- {
101
- vec2 main;
102
-
103
- if(animated){
104
- main = rotateUV(uv-pos, time * 0.1);
105
- } else{
106
- main = uv-pos;
107
- }
108
-
109
- float ang = atan(main.y, main.x) * (anamorphic ? 1.0 : starPoints);
110
- float dist = length(main);
111
- dist = pow(dist, .9);
112
-
113
- float f0 = 1.0/(length(uv-pos)*(1.0/size*16.0)+.2);
114
-
115
- return f0+f0*(sin((ang))*.2 +.3);
116
- }
117
-
118
- float sdHex(vec2 p){
119
- p = abs(p);
120
- vec2 q = vec2(p.x*2.0*0.5773503, p.y + p.x*0.5773503);
121
- return dot(step(q.xy,q.yx), 1.0-q.yx);
122
- }
123
-
124
- //Based on https://www.shadertoy.com/view/dllSRX
125
- float fpow(float x, float k){
126
- return x > k ? pow((x-k)/(1.0-k),2.0) : 0.0;
127
- }
128
-
129
- vec3 renderhex(vec2 uv, vec2 p, float s, vec3 col){
130
- uv -= p;
131
- if (abs(uv.x) < 0.2*s && abs(uv.y) < 0.2*s){
132
- return mix(vec3(0),mix(vec3(0),col,0.1 + fpow(length(uv/s),0.1)*10.0),smoothstep(0.0,0.1,sdHex(uv*20.0/s)));
133
- }
134
- return vec3(0);
135
- }
136
-
137
- // Based on https://www.shadertoy.com/view/4sX3Rs
138
- vec3 LensFlare(vec2 uv, vec2 pos)
139
- {
140
- vec2 main = uv-pos;
141
- vec2 uvd = uv*(length(uv));
142
-
143
- float ang = atan(main.x,main.y);
144
-
145
- float f0 = .3/(length(uv-pos)*16.0+1.0);
146
-
147
- f0 = f0*(sin(noise(sin(ang*3.9-(animated ? time : 0.0) * 0.3) * starPoints))*.2 );
148
-
149
- float f1 = max(0.01-pow(length(uv+1.2*pos),1.9),.0)*7.0;
150
-
151
- float f2 = max(.9/(10.0+32.0*pow(length(uvd+0.99*pos),2.0)),.0)*0.35;
152
- float f22 = max(.9/(11.0+32.0*pow(length(uvd+0.85*pos),2.0)),.0)*0.23;
153
- float f23 = max(.9/(12.0+32.0*pow(length(uvd+0.95*pos),2.0)),.0)*0.6;
154
-
155
- vec2 uvx = mix(uv,uvd, 0.1);
156
-
157
- float f4 = max(0.01-pow(length(uvx+0.4*pos),2.9),.0)*4.02;
158
- float f42 = max(0.0-pow(length(uvx+0.45*pos),2.9),.0)*4.1;
159
- float f43 = max(0.01-pow(length(uvx+0.5*pos),2.9),.0)*4.6;
160
-
161
- uvx = mix(uv,uvd,-.4);
162
-
163
- float f5 = max(0.01-pow(length(uvx+0.1*pos),5.5),.0)*2.0;
164
- float f52 = max(0.01-pow(length(uvx+0.2*pos),5.5),.0)*2.0;
165
- float f53 = max(0.01-pow(length(uvx+0.1*pos),5.5),.0)*2.0;
166
-
167
- uvx = mix(uv,uvd, 2.1);
168
-
169
- float f6 = max(0.01-pow(length(uvx-0.3*pos),1.61),.0)*3.159;
170
- float f62 = max(0.01-pow(length(uvx-0.325*pos),1.614),.0)*3.14;
171
- float f63 = max(0.01-pow(length(uvx-0.389*pos),1.623),.0)*3.12;
172
-
173
- vec3 c = vec3(glare(uv,pos, glareSize));
174
-
175
- vec2 prot;
176
-
177
- if(animated){
178
- prot = rotateUV(uv - pos, (time * 0.1));
179
- } else if(anamorphic){
180
- prot = rotateUV(uv - pos, 1.570796);
181
- } else {
182
- prot = uv - pos;
183
- }
184
-
185
- c += drawflare(prot, (anamorphic ? flareSize * 10. : flareSize), 0.1, time, 1);
186
-
187
- c.r+=f1+f2+f4+f5+f6; c.g+=f1+f22+f42+f52+f62; c.b+=f1+f23+f43+f53+f63;
188
- c = c*1.3 * vec3(length(uvd)+.09);
189
- c+=vec3(f0);
190
-
191
- return c;
192
- }
193
-
194
- vec3 cc(vec3 color, float factor,float factor2)
195
- {
196
- float w = color.x+color.y+color.z;
197
- return mix(color,vec3(w)*factor,w*factor2);
198
- }
199
-
200
- float rnd(vec2 p)
201
- {
202
- float f = fract(sin(dot(p, vec2(12.1234, 72.8392) )*45123.2));
203
- return f;
204
- }
205
-
206
- float rnd(float w)
207
- {
208
- float f = fract(sin(w)*1000.);
209
- return f;
210
- }
211
-
212
- float regShape(vec2 p, int N)
213
- {
214
- float f;
215
-
216
- float a=atan(p.x,p.y)+.2;
217
- float b=6.28319/float(N);
218
- f=smoothstep(.5,.51, cos(floor(.5+a/b)*b-a)*length(p.xy)* 2.0 -ghostScale);
219
-
220
- return f;
221
- }
222
-
223
- // Based on https://www.shadertoy.com/view/Xlc3D2
224
- vec3 circle(vec2 p, float size, float decay, vec3 color, vec3 color2, float dist, vec2 position)
225
- {
226
- float l = length(p + position*(dist*2.))+size/2.;
227
- float l2 = length(p + position*(dist*4.))+size/3.;
228
-
229
- float c = max(0.01-pow(length(p + position*dist), size*ghostScale), 0.0)*10.;
230
- float c1 = max(0.001-pow(l-0.3, 1./40.)+sin(l*20.), 0.0)*3.;
231
- float c2 = max(0.09/pow(length(p-position*dist/.5)*1., .95), 0.0)/20.;
232
- float s = max(0.02-pow(regShape(p*5. + position*dist*5. + decay, 6) , 1.), 0.0)*1.5;
233
-
234
- color = cos(vec3(0.44, .24, .2)*16. + dist/8.)*0.5+.5;
235
- vec3 f = c*color;
236
- f += c1*color;
237
- f += c2*color;
238
- f += s*color;
239
- return f;
240
- }
241
-
242
- vec4 getLensColor(float x){
243
- return vec4(vec3(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(vec3(0., 0., 0.),
244
- vec3(0., 0., 0.), smoothstep(0.0, 0.063, x)),
245
- vec3(0., 0., 0.), smoothstep(0.063, 0.125, x)),
246
- vec3(0.0, 0., 0.), smoothstep(0.125, 0.188, x)),
247
- vec3(0.188, 0.131, 0.116), smoothstep(0.188, 0.227, x)),
248
- vec3(0.31, 0.204, 0.537), smoothstep(0.227, 0.251, x)),
249
- vec3(0.192, 0.106, 0.286), smoothstep(0.251, 0.314, x)),
250
- vec3(0.102, 0.008, 0.341), smoothstep(0.314, 0.392, x)),
251
- vec3(0.086, 0.0, 0.141), smoothstep(0.392, 0.502, x)),
252
- vec3(1.0, 0.31, 0.0), smoothstep(0.502, 0.604, x)),
253
- vec3(.1, 0.1, 0.1), smoothstep(0.604, 0.643, x)),
254
- vec3(1.0, 0.929, 0.0), smoothstep(0.643, 0.761, x)),
255
- vec3(1.0, 0.086, 0.424), smoothstep(0.761, 0.847, x)),
256
- vec3(1.0, 0.49, 0.0), smoothstep(0.847, 0.89, x)),
257
- vec3(0.945, 0.275, 0.475), smoothstep(0.89, 0.941, x)),
258
- vec3(0.251, 0.275, 0.796), smoothstep(0.941, 1.0, x))),
259
- 1.0);
260
- }
261
-
262
- float dirtNoise(vec2 p){
263
- vec2 f = fract(p);
264
- f = (f * f) * (3.0 - (2.0 * f));
265
- float n = dot(floor(p), vec2(1.0, 157.0));
266
- vec4 a = fract(sin(vec4(n + 0.0, n + 1.0, n + 157.0, n + 158.0)) * 43758.5453123);
267
- return mix(mix(a.x, a.y, f.x), mix(a.z, a.w, f.x), f.y);
268
- }
269
-
270
- float fbm(vec2 p){
271
- const mat2 m = mat2(0.80, -0.60, 0.60, 0.80);
272
- float f = 0.0;
273
- f += 0.5000*dirtNoise(p); p = m*p*2.02;
274
- f += 0.2500*dirtNoise(p); p = m*p*2.03;
275
- f += 0.1250*dirtNoise(p); p = m*p*2.01;
276
- f += 0.0625*dirtNoise(p);
277
- return f/0.9375;
278
- }
279
-
280
- vec4 getLensStar(vec2 p){
281
- vec2 pp = (p - vec2(0.5)) * 2.0;
282
- float a = atan(pp.y, pp.x);
283
- vec4 cp = vec4(sin(a * 1.0), length(pp), sin(a * 13.0), sin(a * 53.0));
284
- float d = sin(clamp(pow(length(vec2(0.5) - p) * 0.5 + haloScale /2., 5.0), 0.0, 1.0) * 3.14159);
285
- vec3 c = vec3(d) * vec3(fbm(cp.xy * 16.0) * fbm(cp.zw * 9.0) * max(max(max(max(0.5, sin(a * 1.0)), sin(a * 3.0) * 0.8), sin(a * 7.0) * 0.8), sin(a * 9.0) * 10.6));
286
- c *= vec3(mix(2.0, (sin(length(pp.xy) * 256.0) * 0.5) + 0.5, sin((clamp((length(pp.xy) - 0.875) / 0.1, 0.0, 1.0) + 0.0) * 2.0 * 3.14159) * 1.5) + 0.5) * 0.3275;
287
- return vec4(vec3(c * 1.0), d);
288
- }
289
-
290
- vec4 getLensDirt(vec2 p){
291
- p.xy += vec2(fbm(p.yx * 3.0), fbm(p.yx * 2.0)) * 0.0825;
292
- vec3 o = vec3(mix(0.125, 0.25, max(max(smoothstep(0.1, 0.0, length(p - vec2(0.25))),
293
- smoothstep(0.4, 0.0, length(p - vec2(0.75)))),
294
- smoothstep(0.8, 0.0, length(p - vec2(0.875, 0.125))))));
295
- o += vec3(max(fbm(p * 1.0) - 0.5, 0.0)) * 0.5;
296
- o += vec3(max(fbm(p * 2.0) - 0.5, 0.0)) * 0.5;
297
- o += vec3(max(fbm(p * 4.0) - 0.5, 0.0)) * 0.25;
298
- o += vec3(max(fbm(p * 8.0) - 0.75, 0.0)) * 1.0;
299
- o += vec3(max(fbm(p * 16.0) - 0.75, 0.0)) * 0.75;
300
- o += vec3(max(fbm(p * 64.0) - 0.75, 0.0)) * 0.5;
301
- return vec4(clamp(o, vec3(0.15), vec3(1.0)), 1.0);
302
- }
303
-
304
- vec4 textureLimited(sampler2D tex, vec2 texCoord){
305
- if(((texCoord.x < 0.) || (texCoord.y < 0.)) || ((texCoord.x > 1.) || (texCoord.y > 1.))){
306
- return vec4(0.0);
307
- }else{
308
- return texture(tex, texCoord);
309
- }
310
- }
311
-
312
- vec4 textureDistorted(sampler2D tex, vec2 texCoord, vec2 direction, vec3 distortion) {
313
- return vec4(textureLimited(tex, (texCoord + (direction * distortion.r))).r,
314
- textureLimited(tex, (texCoord + (direction * distortion.g))).g,
315
- textureLimited(tex, (texCoord + (direction * distortion.b))).b,
316
- 1.0);
317
- }
318
-
319
- // Based on https://www.shadertoy.com/view/4sK3W3
320
- vec4 getStartBurst(){
321
- vec2 aspectTexCoord = vec2(1.0) - (((vTexCoord - vec2(0.5)) * vec2(1.0)) + vec2(0.5));
322
- vec2 texCoord = vec2(1.0) - vTexCoord;
323
- vec2 ghostVec = (vec2(0.5) - texCoord) * 0.3 - lensPosition;
324
- vec2 ghostVecAspectNormalized = normalize(ghostVec * vec2(1.0)) * vec2(1.0);
325
- vec2 haloVec = normalize(ghostVec) * 0.6;
326
- vec2 haloVecAspectNormalized = ghostVecAspectNormalized * 0.6;
327
- vec2 texelSize = vec2(1.0) / vec2(screenRes.xy);
328
- vec3 distortion = vec3(-(texelSize.x * 1.5), 0.2, texelSize.x * 1.5);
329
- vec4 c = vec4(0.0);
330
- for (int i = 0; i < 8; i++) {
331
- vec2 offset = texCoord + (ghostVec * float(i));
332
- c += textureDistorted(lensDirtTexture, offset, ghostVecAspectNormalized, distortion) * pow(max(0.0, 1.0 - (length(vec2(0.5) - offset) / length(vec2(0.5)))), 10.0);
333
- }
334
- vec2 haloOffset = texCoord + haloVecAspectNormalized;
335
- return (c * getLensColor((length(vec2(0.5) - aspectTexCoord) / length(vec2(haloScale))))) +
336
- (textureDistorted(lensDirtTexture, haloOffset, ghostVecAspectNormalized, distortion) * pow(max(0.0, 1.0 - (length(vec2(0.5) - haloOffset) / length(vec2(0.5)))), 10.0));
337
- }
338
-
339
- void mainImage(vec4 inputColor, vec2 uv, out vec4 outputColor)
340
- {
341
- vec2 myUV = uv -0.5;
342
- myUV.y *= screenRes.y/screenRes.x;
343
- vec2 finalLensPosition = lensPosition * 0.5;
344
- finalLensPosition.y *= screenRes.y/screenRes.x;
345
-
346
- //First Lens flare pass
347
- vec3 finalColor = LensFlare(myUV, finalLensPosition) * 20.0 * colorGain / 256.;
348
-
349
- //Aditional streaks
350
- if(aditionalStreaks){
351
- vec3 circColor = vec3(0.9, 0.2, 0.1);
352
- vec3 circColor2 = vec3(0.3, 0.1, 0.9);
353
-
354
- for(float i=0.;i<10.;i++){
355
- finalColor += circle(myUV, pow(rnd(i*2000.)*2.8, .1)+1.41, 0.0, circColor+i , circColor2+i, rnd(i*20.)*3.+0.2-.5, lensPosition);
356
- }
357
- }
358
-
359
- //Alternative ghosts
360
- if(secondaryGhosts){
361
- vec3 altGhosts = vec3(0);
362
- altGhosts += renderhex(myUV, -lensPosition*0.25, ghostScale * 1.4, vec3(0.25,0.35,0));
363
- altGhosts += renderhex(myUV, lensPosition*0.25, ghostScale * 0.5, vec3(1,0.5,0.5));
364
- altGhosts += renderhex(myUV, lensPosition*0.1, ghostScale * 1.6, vec3(1,1,1));
365
- altGhosts += renderhex(myUV, lensPosition*1.8, ghostScale * 2.0, vec3(0,0.5,0.75));
366
- altGhosts += renderhex(myUV, lensPosition*1.25, ghostScale * 0.8, vec3(1,1,0.5));
367
- altGhosts += renderhex(myUV, -lensPosition*1.25, ghostScale * 5.0, vec3(0.5,0.5,0.25));
368
-
369
- //Circular ghosts
370
- altGhosts += fpow(1.0 - abs(distance(lensPosition*0.8,myUV) - 0.7),0.985)*colorGain / 2100.;
371
- finalColor += altGhosts;
372
- }
373
-
374
-
375
- //Starburst
376
- if(starBurst){
377
- vTexCoord = myUV + 0.5;
378
- vec4 lensMod = getLensDirt(myUV);
379
- float tooBright = 1.0 - (clamp(0.5, 0.0, 0.5) * 2.0);
380
- float tooDark = clamp(0.5 - 0.5, 0.0, 0.5) * 2.0;
381
- lensMod += mix(lensMod, pow(lensMod * 2.0, vec4(2.0)) * 0.5, tooBright);
382
- float lensStarRotationAngle = ((myUV.x + myUV.y)) * (1.0 / 6.0);
383
- vec2 lensStarTexCoord = (mat2(cos(lensStarRotationAngle), -sin(lensStarRotationAngle), sin(lensStarRotationAngle), cos(lensStarRotationAngle)) * vTexCoord);
384
- lensMod += getLensStar(lensStarTexCoord) * 2.;
385
-
386
- finalColor += clamp((lensMod.rgb * getStartBurst().rgb ), 0.01, 1.0);
387
- }
388
-
389
- //Final composed output
390
- if(enabled){
391
- outputColor = vec4(mix(finalColor, vec3(.0), opacity) + inputColor.rgb, inputColor.a);
392
- } else {
393
- outputColor = vec4(inputColor);
394
- }
395
- }
396
- `
397
- )
398
- };
399
- class LensFlareEffect extends Effect {
400
- constructor({
401
- blendFunction,
402
- enabled,
403
- glareSize,
404
- lensPosition,
405
- screenRes,
406
- starPoints,
407
- flareSize,
408
- flareSpeed,
409
- flareShape,
410
- animated,
411
- anamorphic,
412
- colorGain,
413
- lensDirtTexture,
414
- haloScale,
415
- secondaryGhosts,
416
- aditionalStreaks,
417
- ghostScale,
418
- opacity,
419
- starBurst
420
- }) {
421
- super("LensFlareEffect", LensFlareShader.fragmentShader, {
422
- blendFunction,
423
- uniforms: /* @__PURE__ */ new Map([
424
- ["enabled", new THREE.Uniform(enabled)],
425
- ["glareSize", new THREE.Uniform(glareSize)],
426
- ["lensPosition", new THREE.Uniform(lensPosition)],
427
- ["time", new THREE.Uniform(0)],
428
- ["screenRes", new THREE.Uniform(screenRes)],
429
- ["starPoints", new THREE.Uniform(starPoints)],
430
- ["flareSize", new THREE.Uniform(flareSize)],
431
- ["flareSpeed", new THREE.Uniform(flareSpeed)],
432
- ["flareShape", new THREE.Uniform(flareShape)],
433
- ["animated", new THREE.Uniform(animated)],
434
- ["anamorphic", new THREE.Uniform(anamorphic)],
435
- ["colorGain", new THREE.Uniform(colorGain)],
436
- ["lensDirtTexture", new THREE.Uniform(lensDirtTexture)],
437
- ["haloScale", new THREE.Uniform(haloScale)],
438
- ["secondaryGhosts", new THREE.Uniform(secondaryGhosts)],
439
- ["aditionalStreaks", new THREE.Uniform(aditionalStreaks)],
440
- ["ghostScale", new THREE.Uniform(ghostScale)],
441
- ["starBurst", new THREE.Uniform(starBurst)],
442
- ["opacity", new THREE.Uniform(opacity)]
443
- ])
444
- });
445
- }
446
- update(_renderer, _inputBuffer, deltaTime) {
447
- const time = this.uniforms.get("time");
448
- if (time) {
449
- time.value += deltaTime;
450
- }
451
- }
452
- }
453
- const LensFlareWrapped = /* @__PURE__ */ wrapEffect(LensFlareEffect);
454
- const LensFlare = ({
455
- smoothTime = 0.07,
456
- //
457
- blendFunction = BlendFunction.NORMAL,
458
- enabled = true,
459
- glareSize = 0.2,
460
- lensPosition = new THREE.Vector3(-25, 6, -60),
461
- screenRes = new THREE.Vector2(0, 0),
462
- starPoints = 6,
463
- flareSize = 0.01,
464
- flareSpeed = 0.01,
465
- flareShape = 0.01,
466
- animated = true,
467
- anamorphic = false,
468
- colorGain = new THREE.Color(20, 20, 20),
469
- lensDirtTexture = null,
470
- haloScale = 0.5,
471
- secondaryGhosts = true,
472
- aditionalStreaks = true,
473
- ghostScale = 0,
474
- opacity = 1,
475
- starBurst = false
476
- }) => {
477
- const viewport = useThree(({ viewport: viewport2 }) => viewport2);
478
- const raycaster = useThree(({ raycaster: raycaster2 }) => raycaster2);
479
- const { scene, camera } = useContext(EffectComposerContext);
480
- const [raycasterPos] = useState(() => new THREE.Vector2());
481
- const [projectedPosition] = useState(() => new THREE.Vector3());
482
- const ref = useRef(null);
483
- useFrame((_, delta) => {
484
- var _a, _b, _c;
485
- if (!(ref == null ? void 0 : ref.current))
486
- return;
487
- const uLensPosition = ref.current.uniforms.get("lensPosition");
488
- const uOpacity = ref.current.uniforms.get("opacity");
489
- if (!uLensPosition || !uOpacity)
490
- return;
491
- let target = 1;
492
- projectedPosition.copy(lensPosition).project(camera);
493
- if (projectedPosition.z > 1)
494
- return;
495
- uLensPosition.value.x = projectedPosition.x;
496
- uLensPosition.value.y = projectedPosition.y;
497
- raycasterPos.x = projectedPosition.x;
498
- raycasterPos.y = projectedPosition.y;
499
- raycaster.setFromCamera(raycasterPos, camera);
500
- const intersects = raycaster.intersectObjects(scene.children, true);
501
- const { object } = intersects[0] || {};
502
- if (object) {
503
- if (((_a = object.userData) == null ? void 0 : _a.lensflare) === "no-occlusion") {
504
- target = 0;
505
- } else if (object instanceof THREE.Mesh) {
506
- if (((_c = (_b = object.material.uniforms) == null ? void 0 : _b._transmission) == null ? void 0 : _c.value) > 0.2) {
507
- target = 0.2;
508
- } else if (object.material._transmission && object.material._transmission > 0.2) {
509
- target = 0.2;
510
- } else if (object.material.transparent) {
511
- target = object.material.opacity;
512
- }
513
- }
514
- }
515
- easing.damp(uOpacity, "value", target, smoothTime, delta);
516
- });
517
- useEffect(() => {
518
- if (!(ref == null ? void 0 : ref.current))
519
- return;
520
- const screenRes2 = ref.current.uniforms.get("screenRes");
521
- if (screenRes2) {
522
- screenRes2.value.x = viewport.width;
523
- screenRes2.value.y = viewport.height;
524
- }
525
- }, [viewport]);
526
- return /* @__PURE__ */ jsx(
527
- LensFlareWrapped,
528
- {
529
- ref,
530
- blendFunction,
531
- enabled,
532
- glareSize,
533
- lensPosition,
534
- screenRes,
535
- starPoints,
536
- flareSize,
537
- flareSpeed,
538
- flareShape,
539
- animated,
540
- anamorphic,
541
- colorGain,
542
- lensDirtTexture,
543
- haloScale,
544
- secondaryGhosts,
545
- aditionalStreaks,
546
- ghostScale,
547
- opacity,
548
- starBurst
549
- }
550
- );
551
- };
552
- export {
553
- LensFlare,
554
- LensFlareEffect
555
- };
556
- //# sourceMappingURL=LensFlare.js.map
1
+ // Created by Anderson Mancini 2023
2
+ // From https://github.com/ektogamat/R3F-Ultimate-Lens-Flare
3
+
4
+ import * as THREE from 'three'
5
+ import React, { useEffect, useState, useContext, useRef } from 'react'
6
+ import { useFrame, useThree } from '@react-three/fiber'
7
+ import { BlendFunction, Effect } from 'postprocessing'
8
+ import { easing } from 'maath'
9
+
10
+ import { EffectComposerContext } from '../EffectComposer.tsx'
11
+ import { wrapEffect } from '../util.tsx'
12
+
13
+ const LensFlareShader = {
14
+ fragmentShader: /* glsl */ `
15
+ uniform float time;
16
+ uniform vec2 lensPosition;
17
+ uniform vec2 screenRes;
18
+ uniform vec3 colorGain;
19
+ uniform float starPoints;
20
+ uniform float glareSize;
21
+ uniform float flareSize;
22
+ uniform float flareSpeed;
23
+ uniform float flareShape;
24
+ uniform float haloScale;
25
+ uniform float opacity;
26
+ uniform bool animated;
27
+ uniform bool anamorphic;
28
+ uniform bool enabled;
29
+ uniform bool secondaryGhosts;
30
+ uniform bool starBurst;
31
+ uniform float ghostScale;
32
+ uniform bool aditionalStreaks;
33
+ uniform sampler2D lensDirtTexture;
34
+ vec2 vTexCoord;
35
+
36
+ float rand(float n){return fract(sin(n) * 43758.5453123);}
37
+
38
+ float noise(float p){
39
+ float fl = floor(p);
40
+ float fc = fract(p);
41
+ return mix(rand(fl),rand(fl + 1.0), fc);
42
+ }
43
+
44
+ vec3 hsv2rgb(vec3 c)
45
+ {
46
+ vec4 k = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
47
+ vec3 p = abs(fract(c.xxx + k.xyz) * 6.0 - k.www);
48
+ return c.z * mix(k.xxx, clamp(p - k.xxx, 0.0, 1.0), c.y);
49
+ }
50
+
51
+ float saturate(float x)
52
+ {
53
+ return clamp(x, 0.,1.);
54
+ }
55
+
56
+ vec2 rotateUV(vec2 uv, float rotation)
57
+ {
58
+ return vec2(
59
+ cos(rotation) * uv.x + sin(rotation) * uv.y,
60
+ cos(rotation) * uv.y - sin(rotation) * uv.x
61
+ );
62
+ }
63
+
64
+ // Based on https://www.shadertoy.com/view/XtKfRV
65
+ vec3 drawflare(vec2 p, float intensity, float rnd, float speed, int id)
66
+ {
67
+ float flarehueoffset = (1. / 32.) * float(id) * 0.1;
68
+ float lingrad = distance(vec2(0.), p);
69
+ float expgrad = 1. / exp(lingrad * (fract(rnd) * 0.66 + 0.33));
70
+ vec3 colgrad = hsv2rgb(vec3( fract( (expgrad * 8.) + speed * flareSpeed + flarehueoffset), pow(1.-abs(expgrad*2.-1.), 0.45), 20.0 * expgrad * intensity)); //rainbow spectrum effect
71
+
72
+ float internalStarPoints;
73
+
74
+ if(anamorphic){
75
+ internalStarPoints = 1.0;
76
+ } else{
77
+ internalStarPoints = starPoints;
78
+ }
79
+
80
+ float blades = length(p * flareShape * sin(internalStarPoints * atan(p.x, p.y)));
81
+
82
+ float comp = pow(1.-saturate(blades), ( anamorphic ? 100. : 12.));
83
+ comp += saturate(expgrad-0.9) * 3.;
84
+ comp = pow(comp * expgrad, 8. + (1.-intensity) * 5.);
85
+
86
+ if(flareSpeed > 0.0){
87
+ return vec3(comp) * colgrad;
88
+ } else{
89
+ return vec3(comp) * flareSize * 15.;
90
+ }
91
+ }
92
+
93
+ float dist(vec3 a, vec3 b) { return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z); }
94
+
95
+ vec3 saturate(vec3 x)
96
+ {
97
+ return clamp(x, vec3(0.0), vec3(1.0));
98
+ }
99
+
100
+ // Based on https://www.shadertoy.com/view/XtKfRV
101
+ float glare(vec2 uv, vec2 pos, float size)
102
+ {
103
+ vec2 main;
104
+
105
+ if(animated){
106
+ main = rotateUV(uv-pos, time * 0.1);
107
+ } else{
108
+ main = uv-pos;
109
+ }
110
+
111
+ float ang = atan(main.y, main.x) * (anamorphic ? 1.0 : starPoints);
112
+ float dist = length(main);
113
+ dist = pow(dist, .9);
114
+
115
+ float f0 = 1.0/(length(uv-pos)*(1.0/size*16.0)+.2);
116
+
117
+ return f0+f0*(sin((ang))*.2 +.3);
118
+ }
119
+
120
+ float sdHex(vec2 p){
121
+ p = abs(p);
122
+ vec2 q = vec2(p.x*2.0*0.5773503, p.y + p.x*0.5773503);
123
+ return dot(step(q.xy,q.yx), 1.0-q.yx);
124
+ }
125
+
126
+ //Based on https://www.shadertoy.com/view/dllSRX
127
+ float fpow(float x, float k){
128
+ return x > k ? pow((x-k)/(1.0-k),2.0) : 0.0;
129
+ }
130
+
131
+ vec3 renderhex(vec2 uv, vec2 p, float s, vec3 col){
132
+ uv -= p;
133
+ if (abs(uv.x) < 0.2*s && abs(uv.y) < 0.2*s){
134
+ return mix(vec3(0),mix(vec3(0),col,0.1 + fpow(length(uv/s),0.1)*10.0),smoothstep(0.0,0.1,sdHex(uv*20.0/s)));
135
+ }
136
+ return vec3(0);
137
+ }
138
+
139
+ // Based on https://www.shadertoy.com/view/4sX3Rs
140
+ vec3 LensFlare(vec2 uv, vec2 pos)
141
+ {
142
+ vec2 main = uv-pos;
143
+ vec2 uvd = uv*(length(uv));
144
+
145
+ float ang = atan(main.x,main.y);
146
+
147
+ float f0 = .3/(length(uv-pos)*16.0+1.0);
148
+
149
+ f0 = f0*(sin(noise(sin(ang*3.9-(animated ? time : 0.0) * 0.3) * starPoints))*.2 );
150
+
151
+ float f1 = max(0.01-pow(length(uv+1.2*pos),1.9),.0)*7.0;
152
+
153
+ float f2 = max(.9/(10.0+32.0*pow(length(uvd+0.99*pos),2.0)),.0)*0.35;
154
+ float f22 = max(.9/(11.0+32.0*pow(length(uvd+0.85*pos),2.0)),.0)*0.23;
155
+ float f23 = max(.9/(12.0+32.0*pow(length(uvd+0.95*pos),2.0)),.0)*0.6;
156
+
157
+ vec2 uvx = mix(uv,uvd, 0.1);
158
+
159
+ float f4 = max(0.01-pow(length(uvx+0.4*pos),2.9),.0)*4.02;
160
+ float f42 = max(0.0-pow(length(uvx+0.45*pos),2.9),.0)*4.1;
161
+ float f43 = max(0.01-pow(length(uvx+0.5*pos),2.9),.0)*4.6;
162
+
163
+ uvx = mix(uv,uvd,-.4);
164
+
165
+ float f5 = max(0.01-pow(length(uvx+0.1*pos),5.5),.0)*2.0;
166
+ float f52 = max(0.01-pow(length(uvx+0.2*pos),5.5),.0)*2.0;
167
+ float f53 = max(0.01-pow(length(uvx+0.1*pos),5.5),.0)*2.0;
168
+
169
+ uvx = mix(uv,uvd, 2.1);
170
+
171
+ float f6 = max(0.01-pow(length(uvx-0.3*pos),1.61),.0)*3.159;
172
+ float f62 = max(0.01-pow(length(uvx-0.325*pos),1.614),.0)*3.14;
173
+ float f63 = max(0.01-pow(length(uvx-0.389*pos),1.623),.0)*3.12;
174
+
175
+ vec3 c = vec3(glare(uv,pos, glareSize));
176
+
177
+ vec2 prot;
178
+
179
+ if(animated){
180
+ prot = rotateUV(uv - pos, (time * 0.1));
181
+ } else if(anamorphic){
182
+ prot = rotateUV(uv - pos, 1.570796);
183
+ } else {
184
+ prot = uv - pos;
185
+ }
186
+
187
+ c += drawflare(prot, (anamorphic ? flareSize * 10. : flareSize), 0.1, time, 1);
188
+
189
+ c.r+=f1+f2+f4+f5+f6; c.g+=f1+f22+f42+f52+f62; c.b+=f1+f23+f43+f53+f63;
190
+ c = c*1.3 * vec3(length(uvd)+.09);
191
+ c+=vec3(f0);
192
+
193
+ return c;
194
+ }
195
+
196
+ vec3 cc(vec3 color, float factor,float factor2)
197
+ {
198
+ float w = color.x+color.y+color.z;
199
+ return mix(color,vec3(w)*factor,w*factor2);
200
+ }
201
+
202
+ float rnd(vec2 p)
203
+ {
204
+ float f = fract(sin(dot(p, vec2(12.1234, 72.8392) )*45123.2));
205
+ return f;
206
+ }
207
+
208
+ float rnd(float w)
209
+ {
210
+ float f = fract(sin(w)*1000.);
211
+ return f;
212
+ }
213
+
214
+ float regShape(vec2 p, int N)
215
+ {
216
+ float f;
217
+
218
+ float a=atan(p.x,p.y)+.2;
219
+ float b=6.28319/float(N);
220
+ f=smoothstep(.5,.51, cos(floor(.5+a/b)*b-a)*length(p.xy)* 2.0 -ghostScale);
221
+
222
+ return f;
223
+ }
224
+
225
+ // Based on https://www.shadertoy.com/view/Xlc3D2
226
+ vec3 circle(vec2 p, float size, float decay, vec3 color, vec3 color2, float dist, vec2 position)
227
+ {
228
+ float l = length(p + position*(dist*2.))+size/2.;
229
+ float l2 = length(p + position*(dist*4.))+size/3.;
230
+
231
+ float c = max(0.01-pow(length(p + position*dist), size*ghostScale), 0.0)*10.;
232
+ float c1 = max(0.001-pow(l-0.3, 1./40.)+sin(l*20.), 0.0)*3.;
233
+ float c2 = max(0.09/pow(length(p-position*dist/.5)*1., .95), 0.0)/20.;
234
+ float s = max(0.02-pow(regShape(p*5. + position*dist*5. + decay, 6) , 1.), 0.0)*1.5;
235
+
236
+ color = cos(vec3(0.44, .24, .2)*16. + dist/8.)*0.5+.5;
237
+ vec3 f = c*color;
238
+ f += c1*color;
239
+ f += c2*color;
240
+ f += s*color;
241
+ return f;
242
+ }
243
+
244
+ vec4 getLensColor(float x){
245
+ return vec4(vec3(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(mix(vec3(0., 0., 0.),
246
+ vec3(0., 0., 0.), smoothstep(0.0, 0.063, x)),
247
+ vec3(0., 0., 0.), smoothstep(0.063, 0.125, x)),
248
+ vec3(0.0, 0., 0.), smoothstep(0.125, 0.188, x)),
249
+ vec3(0.188, 0.131, 0.116), smoothstep(0.188, 0.227, x)),
250
+ vec3(0.31, 0.204, 0.537), smoothstep(0.227, 0.251, x)),
251
+ vec3(0.192, 0.106, 0.286), smoothstep(0.251, 0.314, x)),
252
+ vec3(0.102, 0.008, 0.341), smoothstep(0.314, 0.392, x)),
253
+ vec3(0.086, 0.0, 0.141), smoothstep(0.392, 0.502, x)),
254
+ vec3(1.0, 0.31, 0.0), smoothstep(0.502, 0.604, x)),
255
+ vec3(.1, 0.1, 0.1), smoothstep(0.604, 0.643, x)),
256
+ vec3(1.0, 0.929, 0.0), smoothstep(0.643, 0.761, x)),
257
+ vec3(1.0, 0.086, 0.424), smoothstep(0.761, 0.847, x)),
258
+ vec3(1.0, 0.49, 0.0), smoothstep(0.847, 0.89, x)),
259
+ vec3(0.945, 0.275, 0.475), smoothstep(0.89, 0.941, x)),
260
+ vec3(0.251, 0.275, 0.796), smoothstep(0.941, 1.0, x))),
261
+ 1.0);
262
+ }
263
+
264
+ float dirtNoise(vec2 p){
265
+ vec2 f = fract(p);
266
+ f = (f * f) * (3.0 - (2.0 * f));
267
+ float n = dot(floor(p), vec2(1.0, 157.0));
268
+ vec4 a = fract(sin(vec4(n + 0.0, n + 1.0, n + 157.0, n + 158.0)) * 43758.5453123);
269
+ return mix(mix(a.x, a.y, f.x), mix(a.z, a.w, f.x), f.y);
270
+ }
271
+
272
+ float fbm(vec2 p){
273
+ const mat2 m = mat2(0.80, -0.60, 0.60, 0.80);
274
+ float f = 0.0;
275
+ f += 0.5000*dirtNoise(p); p = m*p*2.02;
276
+ f += 0.2500*dirtNoise(p); p = m*p*2.03;
277
+ f += 0.1250*dirtNoise(p); p = m*p*2.01;
278
+ f += 0.0625*dirtNoise(p);
279
+ return f/0.9375;
280
+ }
281
+
282
+ vec4 getLensStar(vec2 p){
283
+ vec2 pp = (p - vec2(0.5)) * 2.0;
284
+ float a = atan(pp.y, pp.x);
285
+ vec4 cp = vec4(sin(a * 1.0), length(pp), sin(a * 13.0), sin(a * 53.0));
286
+ float d = sin(clamp(pow(length(vec2(0.5) - p) * 0.5 + haloScale /2., 5.0), 0.0, 1.0) * 3.14159);
287
+ vec3 c = vec3(d) * vec3(fbm(cp.xy * 16.0) * fbm(cp.zw * 9.0) * max(max(max(max(0.5, sin(a * 1.0)), sin(a * 3.0) * 0.8), sin(a * 7.0) * 0.8), sin(a * 9.0) * 10.6));
288
+ c *= vec3(mix(2.0, (sin(length(pp.xy) * 256.0) * 0.5) + 0.5, sin((clamp((length(pp.xy) - 0.875) / 0.1, 0.0, 1.0) + 0.0) * 2.0 * 3.14159) * 1.5) + 0.5) * 0.3275;
289
+ return vec4(vec3(c * 1.0), d);
290
+ }
291
+
292
+ vec4 getLensDirt(vec2 p){
293
+ p.xy += vec2(fbm(p.yx * 3.0), fbm(p.yx * 2.0)) * 0.0825;
294
+ vec3 o = vec3(mix(0.125, 0.25, max(max(smoothstep(0.1, 0.0, length(p - vec2(0.25))),
295
+ smoothstep(0.4, 0.0, length(p - vec2(0.75)))),
296
+ smoothstep(0.8, 0.0, length(p - vec2(0.875, 0.125))))));
297
+ o += vec3(max(fbm(p * 1.0) - 0.5, 0.0)) * 0.5;
298
+ o += vec3(max(fbm(p * 2.0) - 0.5, 0.0)) * 0.5;
299
+ o += vec3(max(fbm(p * 4.0) - 0.5, 0.0)) * 0.25;
300
+ o += vec3(max(fbm(p * 8.0) - 0.75, 0.0)) * 1.0;
301
+ o += vec3(max(fbm(p * 16.0) - 0.75, 0.0)) * 0.75;
302
+ o += vec3(max(fbm(p * 64.0) - 0.75, 0.0)) * 0.5;
303
+ return vec4(clamp(o, vec3(0.15), vec3(1.0)), 1.0);
304
+ }
305
+
306
+ vec4 textureLimited(sampler2D tex, vec2 texCoord){
307
+ if(((texCoord.x < 0.) || (texCoord.y < 0.)) || ((texCoord.x > 1.) || (texCoord.y > 1.))){
308
+ return vec4(0.0);
309
+ }else{
310
+ return texture(tex, texCoord);
311
+ }
312
+ }
313
+
314
+ vec4 textureDistorted(sampler2D tex, vec2 texCoord, vec2 direction, vec3 distortion) {
315
+ return vec4(textureLimited(tex, (texCoord + (direction * distortion.r))).r,
316
+ textureLimited(tex, (texCoord + (direction * distortion.g))).g,
317
+ textureLimited(tex, (texCoord + (direction * distortion.b))).b,
318
+ 1.0);
319
+ }
320
+
321
+ // Based on https://www.shadertoy.com/view/4sK3W3
322
+ vec4 getStartBurst(){
323
+ vec2 aspectTexCoord = vec2(1.0) - (((vTexCoord - vec2(0.5)) * vec2(1.0)) + vec2(0.5));
324
+ vec2 texCoord = vec2(1.0) - vTexCoord;
325
+ vec2 ghostVec = (vec2(0.5) - texCoord) * 0.3 - lensPosition;
326
+ vec2 ghostVecAspectNormalized = normalize(ghostVec * vec2(1.0)) * vec2(1.0);
327
+ vec2 haloVec = normalize(ghostVec) * 0.6;
328
+ vec2 haloVecAspectNormalized = ghostVecAspectNormalized * 0.6;
329
+ vec2 texelSize = vec2(1.0) / vec2(screenRes.xy);
330
+ vec3 distortion = vec3(-(texelSize.x * 1.5), 0.2, texelSize.x * 1.5);
331
+ vec4 c = vec4(0.0);
332
+ for (int i = 0; i < 8; i++) {
333
+ vec2 offset = texCoord + (ghostVec * float(i));
334
+ c += textureDistorted(lensDirtTexture, offset, ghostVecAspectNormalized, distortion) * pow(max(0.0, 1.0 - (length(vec2(0.5) - offset) / length(vec2(0.5)))), 10.0);
335
+ }
336
+ vec2 haloOffset = texCoord + haloVecAspectNormalized;
337
+ return (c * getLensColor((length(vec2(0.5) - aspectTexCoord) / length(vec2(haloScale))))) +
338
+ (textureDistorted(lensDirtTexture, haloOffset, ghostVecAspectNormalized, distortion) * pow(max(0.0, 1.0 - (length(vec2(0.5) - haloOffset) / length(vec2(0.5)))), 10.0));
339
+ }
340
+
341
+ void mainImage(vec4 inputColor, vec2 uv, out vec4 outputColor)
342
+ {
343
+ vec2 myUV = uv -0.5;
344
+ myUV.y *= screenRes.y/screenRes.x;
345
+ vec2 finalLensPosition = lensPosition * 0.5;
346
+ finalLensPosition.y *= screenRes.y/screenRes.x;
347
+
348
+ //First Lens flare pass
349
+ vec3 finalColor = LensFlare(myUV, finalLensPosition) * 20.0 * colorGain / 256.;
350
+
351
+ //Aditional streaks
352
+ if(aditionalStreaks){
353
+ vec3 circColor = vec3(0.9, 0.2, 0.1);
354
+ vec3 circColor2 = vec3(0.3, 0.1, 0.9);
355
+
356
+ for(float i=0.;i<10.;i++){
357
+ finalColor += circle(myUV, pow(rnd(i*2000.)*2.8, .1)+1.41, 0.0, circColor+i , circColor2+i, rnd(i*20.)*3.+0.2-.5, lensPosition);
358
+ }
359
+ }
360
+
361
+ //Alternative ghosts
362
+ if(secondaryGhosts){
363
+ vec3 altGhosts = vec3(0);
364
+ altGhosts += renderhex(myUV, -lensPosition*0.25, ghostScale * 1.4, vec3(0.25,0.35,0));
365
+ altGhosts += renderhex(myUV, lensPosition*0.25, ghostScale * 0.5, vec3(1,0.5,0.5));
366
+ altGhosts += renderhex(myUV, lensPosition*0.1, ghostScale * 1.6, vec3(1,1,1));
367
+ altGhosts += renderhex(myUV, lensPosition*1.8, ghostScale * 2.0, vec3(0,0.5,0.75));
368
+ altGhosts += renderhex(myUV, lensPosition*1.25, ghostScale * 0.8, vec3(1,1,0.5));
369
+ altGhosts += renderhex(myUV, -lensPosition*1.25, ghostScale * 5.0, vec3(0.5,0.5,0.25));
370
+
371
+ //Circular ghosts
372
+ altGhosts += fpow(1.0 - abs(distance(lensPosition*0.8,myUV) - 0.7),0.985)*colorGain / 2100.;
373
+ finalColor += altGhosts;
374
+ }
375
+
376
+
377
+ //Starburst
378
+ if(starBurst){
379
+ vTexCoord = myUV + 0.5;
380
+ vec4 lensMod = getLensDirt(myUV);
381
+ float tooBright = 1.0 - (clamp(0.5, 0.0, 0.5) * 2.0);
382
+ float tooDark = clamp(0.5 - 0.5, 0.0, 0.5) * 2.0;
383
+ lensMod += mix(lensMod, pow(lensMod * 2.0, vec4(2.0)) * 0.5, tooBright);
384
+ float lensStarRotationAngle = ((myUV.x + myUV.y)) * (1.0 / 6.0);
385
+ vec2 lensStarTexCoord = (mat2(cos(lensStarRotationAngle), -sin(lensStarRotationAngle), sin(lensStarRotationAngle), cos(lensStarRotationAngle)) * vTexCoord);
386
+ lensMod += getLensStar(lensStarTexCoord) * 2.;
387
+
388
+ finalColor += clamp((lensMod.rgb * getStartBurst().rgb ), 0.01, 1.0);
389
+ }
390
+
391
+ //Final composed output
392
+ if(enabled){
393
+ outputColor = vec4(mix(finalColor, vec3(.0), opacity) + inputColor.rgb, inputColor.a);
394
+ } else {
395
+ outputColor = vec4(inputColor);
396
+ }
397
+ }
398
+ `,
399
+ }
400
+
401
+ type LensFlareEffectOptions = {
402
+ /** The blend function of this effect */
403
+ blendFunction: BlendFunction
404
+ /** Boolean to enable/disable the effect */
405
+ enabled: boolean
406
+ /** The glare size */
407
+ glareSize: number
408
+ /** The position of the lens flare in 3d space */
409
+ lensPosition: THREE.Vector3
410
+ /** Effect resolution */
411
+ screenRes: THREE.Vector2
412
+ /** The number of points for the star */
413
+ starPoints: number
414
+ /** The flare side */
415
+ flareSize: number
416
+ /** The flare animation speed */
417
+ flareSpeed: number
418
+ /** Changes the appearance to anamorphic */
419
+ flareShape: number
420
+ /** Animated flare */
421
+ animated: boolean
422
+ /** Set the appearance to full anamorphic */
423
+ anamorphic: boolean
424
+ /** Set the color gain for the lens flare. Must be a THREE.Color in RBG format */
425
+ colorGain: THREE.Color
426
+ /** Texture to be used as color dirt for starburst effect */
427
+ lensDirtTexture: THREE.Texture | null
428
+ /** The halo scale */
429
+ haloScale: number
430
+ /** Option to enable/disable secondary ghosts */
431
+ secondaryGhosts: boolean
432
+ /** Option to enable/disable aditional streaks */
433
+ aditionalStreaks: boolean
434
+ /** Option to enable/disable secondary ghosts */
435
+ ghostScale: number
436
+ /** TODO The opacity for this effect */
437
+ opacity: number
438
+ /** Boolean to enable/disable the start burst effect. Can be disabled to improve performance */
439
+ starBurst: boolean
440
+ }
441
+
442
+ export class LensFlareEffect extends Effect {
443
+ constructor({
444
+ blendFunction,
445
+ enabled,
446
+ glareSize,
447
+ lensPosition,
448
+ screenRes,
449
+ starPoints,
450
+ flareSize,
451
+ flareSpeed,
452
+ flareShape,
453
+ animated,
454
+ anamorphic,
455
+ colorGain,
456
+ lensDirtTexture,
457
+ haloScale,
458
+ secondaryGhosts,
459
+ aditionalStreaks,
460
+ ghostScale,
461
+ opacity,
462
+ starBurst,
463
+ }: LensFlareEffectOptions) {
464
+ super('LensFlareEffect', LensFlareShader.fragmentShader, {
465
+ blendFunction,
466
+ uniforms: new Map<string, THREE.Uniform>([
467
+ ['enabled', new THREE.Uniform(enabled)],
468
+ ['glareSize', new THREE.Uniform(glareSize)],
469
+ ['lensPosition', new THREE.Uniform(lensPosition)],
470
+ ['time', new THREE.Uniform(0)],
471
+ ['screenRes', new THREE.Uniform(screenRes)],
472
+ ['starPoints', new THREE.Uniform(starPoints)],
473
+ ['flareSize', new THREE.Uniform(flareSize)],
474
+ ['flareSpeed', new THREE.Uniform(flareSpeed)],
475
+ ['flareShape', new THREE.Uniform(flareShape)],
476
+ ['animated', new THREE.Uniform(animated)],
477
+ ['anamorphic', new THREE.Uniform(anamorphic)],
478
+ ['colorGain', new THREE.Uniform(colorGain)],
479
+ ['lensDirtTexture', new THREE.Uniform(lensDirtTexture)],
480
+ ['haloScale', new THREE.Uniform(haloScale)],
481
+ ['secondaryGhosts', new THREE.Uniform(secondaryGhosts)],
482
+ ['aditionalStreaks', new THREE.Uniform(aditionalStreaks)],
483
+ ['ghostScale', new THREE.Uniform(ghostScale)],
484
+ ['starBurst', new THREE.Uniform(starBurst)],
485
+ ['opacity', new THREE.Uniform(opacity)],
486
+ ]),
487
+ })
488
+ }
489
+
490
+ update(_renderer: any, _inputBuffer: any, deltaTime: number) {
491
+ const time = this.uniforms.get('time')
492
+ if (time) {
493
+ time.value += deltaTime
494
+ }
495
+ }
496
+ }
497
+
498
+ type LensFlareProps = {
499
+ /** Position of the effect */
500
+ lensPosition?: THREE.Vector3
501
+ /** The time that it takes to fade the occlusion */
502
+ smoothTime?: number
503
+ } & Partial<LensFlareEffectOptions>
504
+
505
+ const LensFlareWrapped = /* @__PURE__ */ wrapEffect(LensFlareEffect)
506
+
507
+ export const LensFlare = ({
508
+ smoothTime = 0.07,
509
+ //
510
+ blendFunction = BlendFunction.NORMAL,
511
+ enabled = true,
512
+ glareSize = 0.2,
513
+ lensPosition = new THREE.Vector3(-25, 6, -60),
514
+ screenRes = new THREE.Vector2(0, 0),
515
+ starPoints = 6,
516
+ flareSize = 0.01,
517
+ flareSpeed = 0.01,
518
+ flareShape = 0.01,
519
+ animated = true,
520
+ anamorphic = false,
521
+ colorGain = new THREE.Color(20, 20, 20),
522
+ lensDirtTexture = null,
523
+ haloScale = 0.5,
524
+ secondaryGhosts = true,
525
+ aditionalStreaks = true,
526
+ ghostScale = 0.0,
527
+ opacity = 1.0,
528
+ starBurst = false,
529
+ }: LensFlareProps) => {
530
+ const viewport = useThree(({ viewport }) => viewport)
531
+ const raycaster = useThree(({ raycaster }) => raycaster)
532
+ const { scene, camera } = useContext(EffectComposerContext)
533
+ const [raycasterPos] = useState(() => new THREE.Vector2())
534
+ const [projectedPosition] = useState(() => new THREE.Vector3())
535
+
536
+ const ref = useRef<LensFlareEffect>(null)
537
+
538
+ useFrame((_, delta) => {
539
+ if (!ref?.current) return
540
+ const uLensPosition = ref.current.uniforms.get('lensPosition')
541
+ const uOpacity = ref.current.uniforms.get('opacity')
542
+ if (!uLensPosition || !uOpacity) return
543
+
544
+ let target = 1
545
+
546
+ projectedPosition.copy(lensPosition).project(camera)
547
+ if (projectedPosition.z > 1) return
548
+
549
+ uLensPosition.value.x = projectedPosition.x
550
+ uLensPosition.value.y = projectedPosition.y
551
+ raycasterPos.x = projectedPosition.x
552
+ raycasterPos.y = projectedPosition.y
553
+ raycaster.setFromCamera(raycasterPos, camera)
554
+
555
+ const intersects = raycaster.intersectObjects(scene.children, true)
556
+ const { object } = intersects[0] || {}
557
+ if (object) {
558
+ if (object.userData?.lensflare === 'no-occlusion') {
559
+ target = 0
560
+ } else if (object instanceof THREE.Mesh) {
561
+ if (object.material.uniforms?._transmission?.value > 0.2) {
562
+ //Check for MeshTransmissionMaterial
563
+ target = 0.2
564
+ } else if (object.material._transmission && object.material._transmission > 0.2) {
565
+ //Check for MeshPhysicalMaterial with transmission setting
566
+ target = 0.2
567
+ } else if (object.material.transparent) {
568
+ // Check for OtherMaterials with transparent parameter
569
+ target = object.material.opacity
570
+ }
571
+ }
572
+ }
573
+
574
+ easing.damp(uOpacity, 'value', target, smoothTime, delta)
575
+ })
576
+
577
+ useEffect(() => {
578
+ if (!ref?.current) return
579
+
580
+ const screenRes = ref.current.uniforms.get('screenRes')
581
+ if (screenRes) {
582
+ screenRes.value.x = viewport.width
583
+ screenRes.value.y = viewport.height
584
+ }
585
+ }, [viewport])
586
+
587
+ return (
588
+ <LensFlareWrapped
589
+ ref={ref}
590
+ blendFunction={blendFunction}
591
+ enabled={enabled}
592
+ glareSize={glareSize}
593
+ lensPosition={lensPosition}
594
+ screenRes={screenRes}
595
+ starPoints={starPoints}
596
+ flareSize={flareSize}
597
+ flareSpeed={flareSpeed}
598
+ flareShape={flareShape}
599
+ animated={animated}
600
+ anamorphic={anamorphic}
601
+ colorGain={colorGain}
602
+ lensDirtTexture={lensDirtTexture}
603
+ haloScale={haloScale}
604
+ secondaryGhosts={secondaryGhosts}
605
+ aditionalStreaks={aditionalStreaks}
606
+ ghostScale={ghostScale}
607
+ opacity={opacity}
608
+ starBurst={starBurst}
609
+ />
610
+ )
611
+ }