@shapediver/viewer.rendering-engine.rendering-engine-threejs 3.3.3 → 3.3.6

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 (71) hide show
  1. package/package.json +19 -20
  2. package/src/RenderingEngine.ts +0 -1336
  3. package/src/index.ts +0 -81
  4. package/src/injectors/Tag3dGeometryCreationInjector.ts +0 -154
  5. package/src/injectors/TextureUnifierInjector.ts +0 -214
  6. package/src/interfaces/ILoader.ts +0 -3
  7. package/src/interfaces/IPostProcessingEffectDefinitions.ts +0 -402
  8. package/src/interfaces/IRenderingEngine.ts +0 -48
  9. package/src/loaders/EnvironmentMapLoader.ts +0 -357
  10. package/src/loaders/GeometryLoader.ts +0 -585
  11. package/src/loaders/HTMLElementAnchorLoader.ts +0 -107
  12. package/src/loaders/LightLoader.ts +0 -171
  13. package/src/loaders/MaterialLoader.ts +0 -1413
  14. package/src/managers/CameraManager.ts +0 -178
  15. package/src/managers/EnvironmentGeometryManager.ts +0 -224
  16. package/src/managers/PostProcessingManager.ts +0 -1181
  17. package/src/managers/RenderingManager.ts +0 -657
  18. package/src/managers/SceneTracingManager.ts +0 -127
  19. package/src/managers/SceneTreeManager.ts +0 -576
  20. package/src/managers/postprocessing/GodRaysManager.ts +0 -52
  21. package/src/managers/postprocessing/OutlineManager.ts +0 -58
  22. package/src/managers/postprocessing/SSAARenderPass.ts +0 -339
  23. package/src/managers/postprocessing/SelectiveBloomManager.ts +0 -58
  24. package/src/managers/postprocessing/ao/ao/AOEffect.ts +0 -180
  25. package/src/managers/postprocessing/ao/ao/AOPass.ts +0 -128
  26. package/src/managers/postprocessing/ao/ao/shader/ao_compose.glsl +0 -17
  27. package/src/managers/postprocessing/ao/ao/shader/ao_compose.ts +0 -19
  28. package/src/managers/postprocessing/ao/hbao/HBAOEffect.ts +0 -41
  29. package/src/managers/postprocessing/ao/hbao/shader/hbao.glsl +0 -96
  30. package/src/managers/postprocessing/ao/hbao/shader/hbao.ts +0 -98
  31. package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.glsl +0 -92
  32. package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.ts +0 -95
  33. package/src/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.ts +0 -259
  34. package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.glsl +0 -125
  35. package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.ts +0 -127
  36. package/src/managers/postprocessing/ao/ssao/SSAOEffect.ts +0 -106
  37. package/src/managers/postprocessing/ao/ssao/shader/ssao.glsl +0 -128
  38. package/src/managers/postprocessing/ao/ssao/shader/ssao.ts +0 -130
  39. package/src/managers/postprocessing/ao/utils/shader/basic.glsl +0 -6
  40. package/src/managers/postprocessing/ao/utils/shader/basic.ts +0 -8
  41. package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.glsl +0 -36
  42. package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.ts +0 -38
  43. package/src/managers/postprocessing/utils/CopyMaterial.ts +0 -130
  44. package/src/managers/postprocessing/utils/CopyShader.ts +0 -39
  45. package/src/managers/postprocessing/utils/FullScreenQuad.ts +0 -47
  46. package/src/managers/postprocessing/utils/NormalPass.ts +0 -222
  47. package/src/managers/postprocessing/utils/RenderPass.ts +0 -366
  48. package/src/materials/GemMaterial.ts +0 -268
  49. package/src/materials/MeshUnlitMaterialParameters.ts +0 -4
  50. package/src/materials/MultiPointsMaterial.ts +0 -646
  51. package/src/materials/SpecularGlossinessMaterial.ts +0 -182
  52. package/src/objects/SDBone.ts +0 -51
  53. package/src/objects/SDColor.ts +0 -54
  54. package/src/objects/SDData.ts +0 -44
  55. package/src/objects/SDObject.ts +0 -58
  56. package/src/shaders/PCSS.ts +0 -124
  57. package/src/shaders/gem.ts +0 -579
  58. package/src/shaders/gem_frag.glsl +0 -522
  59. package/src/shaders/gem_vert.glsl +0 -53
  60. package/src/shaders/multi_points.ts +0 -291
  61. package/src/shaders/multi_points_frag.glsl +0 -166
  62. package/src/shaders/multi_points_vert.glsl +0 -120
  63. package/src/styling/viewport-css.ts +0 -113
  64. package/src/styling/viewport.css +0 -111
  65. package/src/three/font.ts +0 -2
  66. package/src/three/geometries/TextGeometry.ts +0 -58
  67. package/src/three/loaders/FontLoader.ts +0 -205
  68. package/src/three/loaders/RGBELoader.ts +0 -496
  69. package/src/types/IThreejsData.ts +0 -16
  70. package/src/types/ThreejsData.ts +0 -43
  71. package/tsconfig.json +0 -20
@@ -1,339 +0,0 @@
1
- import { ClearPass, Pass } from 'postprocessing';
2
- import {
3
- AddEquation,
4
- BufferAttribute,
5
- BufferGeometry,
6
- Camera,
7
- Color,
8
- CustomBlending,
9
- HalfFloatType,
10
- Mesh,
11
- OneFactor,
12
- OrthographicCamera,
13
- PerspectiveCamera,
14
- Scene,
15
- ShaderMaterial,
16
- SrcAlphaFactor,
17
- SRGBColorSpace,
18
- UniformsUtils,
19
- WebGLRenderer,
20
- WebGLRenderTarget
21
- } from 'three';
22
- import { CopyShader } from './utils/CopyShader';
23
- import { FullScreenQuad } from './utils/FullScreenQuad';
24
- import { CopyMaterial } from './utils/CopyMaterial';
25
-
26
- let geometry: BufferGeometry | null = null;
27
-
28
- /**
29
- * Returns a shared fullscreen triangle.
30
- *
31
- * The screen size is 2x2 units (NDC). A triangle needs to be 4x4 units to fill the screen.
32
- *
33
- * @private
34
- * @return {BufferGeometry} The fullscreen geometry.
35
- */
36
-
37
- const getFullscreenTriangle = () => {
38
-
39
- if(geometry === null) {
40
-
41
- const vertices = new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]);
42
- const uvs = new Float32Array([0, 0, 2, 0, 0, 2]);
43
- geometry = new BufferGeometry();
44
-
45
- geometry.setAttribute("position", new BufferAttribute(vertices, 3));
46
- geometry.setAttribute("uv", new BufferAttribute(uvs, 2));
47
-
48
-
49
- }
50
-
51
- return geometry;
52
-
53
- }
54
-
55
- /**
56
- *
57
- * Supersample Anti-Aliasing Render Pass
58
- *
59
- * This manual approach to SSAA re-renders the scene once for each sample with camera jitter and accumulates the results.
60
- *
61
- * References: https://en.wikipedia.org/wiki/Supersampling
62
- *
63
- * original implementation from three.js@0.152.2 was modified to work with the postprocessing library
64
- *
65
- */
66
- export class SSAARenderPass extends Pass {
67
- // #region Properties (9)
68
-
69
- private readonly _clearPass: ClearPass;
70
- private readonly _copyUniforms: any;
71
- private readonly _fsQuad: FullScreenQuad;
72
- private readonly _fullScreen: Mesh;
73
- private readonly _sampleRenderTarget: WebGLRenderTarget;
74
- private readonly _ssaaCopyMaterial: ShaderMaterial;
75
-
76
- private _clearAlpha: number | undefined;
77
- private _clearColor: Color = new Color();
78
- private _oldClearColor: Color = new Color();
79
- private _sampleLevel: number = 2;
80
- private _unbiased: boolean = true;
81
- private _copyMaterial: CopyMaterial;
82
-
83
- // #endregion Properties (9)
84
-
85
- // #region Constructors (1)
86
-
87
- constructor(scene: Scene, camera: Camera) {
88
- super("SSAARenderPass", scene, camera);
89
-
90
- this.needsSwap = false;
91
-
92
- this._sampleRenderTarget = new WebGLRenderTarget(1, 1, {
93
- type: HalfFloatType,
94
- });
95
- this._sampleRenderTarget.texture.name = "SSAARender.Target";
96
- this._sampleRenderTarget.texture.colorSpace = SRGBColorSpace;
97
-
98
- const copyShader = CopyShader;
99
- this._copyUniforms = UniformsUtils.clone(copyShader.uniforms);
100
-
101
- // Create a copy material to render the ssaa sample render target to.
102
- this._ssaaCopyMaterial = new ShaderMaterial({
103
- uniforms: this._copyUniforms,
104
- vertexShader: copyShader.vertexShader,
105
- fragmentShader: copyShader.fragmentShader,
106
- transparent: true,
107
- depthTest: false,
108
- depthWrite: false,
109
-
110
- // do not use AdditiveBlending because it mixes the alpha channel instead of adding
111
- blending: CustomBlending,
112
- blendEquation: AddEquation,
113
- blendDst: OneFactor,
114
- blendDstAlpha: OneFactor,
115
- blendSrc: SrcAlphaFactor,
116
- blendSrcAlpha: OneFactor,
117
- });
118
- this._fsQuad = new FullScreenQuad(this._ssaaCopyMaterial);
119
-
120
- // create a second copy material to render the final results to
121
- this._copyMaterial = new CopyMaterial();
122
- this._fullScreen = new Mesh(getFullscreenTriangle(), this._copyMaterial);
123
- this._fullScreen.frustumCulled = false;
124
-
125
- // clear pass for color and depth
126
- this._clearPass = new ClearPass(true, true, false);
127
- }
128
-
129
- // #endregion Constructors (1)
130
-
131
- // #region Public Accessors (6)
132
-
133
- public set mainCamera(value: Camera) {
134
- this.camera = value;
135
- }
136
-
137
- public set mainScene(value: Scene) {
138
- this.scene = value;
139
- }
140
-
141
- public get renderToScreen() {
142
- return super.renderToScreen;
143
- }
144
-
145
- public set renderToScreen(value) {
146
- super.renderToScreen = value;
147
- }
148
-
149
- public get sampleLevel() {
150
- return this._sampleLevel;
151
- }
152
-
153
- /**
154
- * specified as n, where the number of samples is 2^n, so sampleLevel = 4, is 2^4 samples, 16.
155
- */
156
- public set sampleLevel(value: number) {
157
- this._sampleLevel = value;
158
- }
159
-
160
- /**
161
- * to cancel out rounding errors
162
- */
163
- public set unbiased(value: boolean) {
164
- this._unbiased = value;
165
- }
166
-
167
- // #endregion Public Accessors (6)
168
-
169
- // #region Public Methods (3)
170
-
171
- public dispose() {
172
- this._sampleRenderTarget.dispose();
173
- this._ssaaCopyMaterial.dispose();
174
- this._fsQuad.dispose();
175
- }
176
-
177
- /**
178
- * Renders the scene.
179
- *
180
- * @param {WebGLRenderer} renderer - The renderer.
181
- * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
182
- * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
183
- * @param {Number} [deltaTime] - The time between the last frame and the current one in seconds.
184
- * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
185
- */
186
- public render(renderer: WebGLRenderer, inputBuffer: WebGLRenderTarget, outputBuffer: WebGLRenderTarget, deltaTime: undefined, stencilTest: undefined) {
187
- // set clear color / clear alpha / color space from the current renderer
188
- this._clearColor = renderer.getClearColor(new Color());
189
- this._clearAlpha = renderer.getClearAlpha();
190
- this._sampleRenderTarget.texture.colorSpace = renderer.outputColorSpace;
191
-
192
- const jitterOffsets = _JitterVectors[Math.max(0, Math.min(this._sampleLevel, 5))];
193
-
194
- // save the original auto clear and set to false
195
- const autoClear = renderer.autoClear;
196
- renderer.autoClear = false;
197
-
198
- // save the original clear color and alpha
199
- renderer.getClearColor(this._oldClearColor);
200
- const oldClearAlpha = renderer.getClearAlpha();
201
-
202
- const baseSampleWeight = 1.0 / jitterOffsets.length;
203
- const roundingRange = 1 / 32;
204
- this._copyUniforms["tDiffuse"].value = this._sampleRenderTarget.texture;
205
-
206
- const viewOffset = {
207
- fullWidth: inputBuffer.width,
208
- fullHeight: inputBuffer.height,
209
- offsetX: 0,
210
- offsetY: 0,
211
- width: inputBuffer.width,
212
- height: inputBuffer.height,
213
- };
214
-
215
- const originalViewOffset = Object.assign(
216
- {},
217
- (<PerspectiveCamera | OrthographicCamera>this.camera).view
218
- );
219
-
220
- if (originalViewOffset.enabled)
221
- Object.assign(viewOffset, originalViewOffset);
222
-
223
- // render the scene multiple times, each slightly jitter offset from the last and accumulate the results.
224
- for (let i = 0; i < jitterOffsets.length; i++) {
225
- const jitterOffset = jitterOffsets[i];
226
-
227
- if ((<PerspectiveCamera | OrthographicCamera>this.camera).setViewOffset) {
228
- (<PerspectiveCamera | OrthographicCamera>this.camera).setViewOffset(
229
- viewOffset.fullWidth,
230
- viewOffset.fullHeight,
231
-
232
- viewOffset.offsetX + jitterOffset[0] * 0.0625,
233
- viewOffset.offsetY + jitterOffset[1] * 0.0625, // 0.0625 = 1 / 16
234
-
235
- viewOffset.width,
236
- viewOffset.height
237
- );
238
- }
239
-
240
- let sampleWeight = baseSampleWeight;
241
-
242
- if (this._unbiased) {
243
- // the theory is that equal weights for each sample lead to an accumulation of rounding errors.
244
- // The following equation varies the sampleWeight per sample so that it is uniformly distributed
245
- // across a range of values whose rounding errors cancel each other out.
246
-
247
- const uniformCenteredDistribution =
248
- -0.5 + (i + 0.5) / jitterOffsets.length;
249
- sampleWeight += roundingRange * uniformCenteredDistribution;
250
- }
251
-
252
- renderer.setClearColor(this._clearColor, this._clearAlpha);
253
- renderer.setRenderTarget(this._sampleRenderTarget);
254
- renderer.clear();
255
- renderer.render(this.scene, this.camera);
256
-
257
- renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);
258
-
259
- if (i === 0) {
260
- renderer.setClearColor(0x000000, 0.0);
261
- renderer.clear();
262
- }
263
-
264
- // set the weight of the current samples in the ssaaCopyMaterial
265
- this._copyUniforms["opacity"].value = sampleWeight;
266
-
267
- // render the sampleRenderTarget to fullscreen
268
- this._fsQuad.render(renderer);
269
- }
270
-
271
- // clear color and depth
272
- this._clearPass.render(renderer, inputBuffer, inputBuffer);
273
-
274
- // render to the final result to fullscreen
275
- this._copyMaterial.uniforms.inputBuffer.value = outputBuffer.texture;
276
- this._copyMaterial.uniforms.opacity.value = 1;
277
- renderer.setRenderTarget(this.renderToScreen ? null : inputBuffer);
278
-
279
- this.scene.add(this._fullScreen);
280
- renderer.render(this.scene, this.camera);
281
- this.scene.remove(this._fullScreen);
282
-
283
- if ((<PerspectiveCamera | OrthographicCamera>this.camera).setViewOffset && originalViewOffset.enabled) {
284
- (<PerspectiveCamera | OrthographicCamera>this.camera).setViewOffset(
285
- originalViewOffset.fullWidth,
286
- originalViewOffset.fullHeight,
287
-
288
- originalViewOffset.offsetX,
289
- originalViewOffset.offsetY,
290
-
291
- originalViewOffset.width,
292
- originalViewOffset.height
293
- );
294
- } else if ((<PerspectiveCamera | OrthographicCamera>this.camera).clearViewOffset) {
295
- (<PerspectiveCamera | OrthographicCamera>this.camera).clearViewOffset();
296
- }
297
-
298
- renderer.autoClear = autoClear;
299
- renderer.setClearColor(this._oldClearColor, oldClearAlpha);
300
- }
301
-
302
- public setSize(width: number, height: number) {
303
- this._sampleRenderTarget.setSize(width, height);
304
- }
305
-
306
- // #endregion Public Methods (3)
307
- }
308
-
309
- const _JitterVectors = [
310
- [
311
- [0, 0]
312
- ],
313
- [
314
- [4, 4], [- 4, - 4]
315
- ],
316
- [
317
- [- 2, - 6], [6, - 2], [- 6, 2], [2, 6]
318
- ],
319
- [
320
- [1, - 3], [- 1, 3], [5, 1], [- 3, - 5],
321
- [- 5, 5], [- 7, - 1], [3, 7], [7, - 7]
322
- ],
323
- [
324
- [1, 1], [- 1, - 3], [- 3, 2], [4, - 1],
325
- [- 5, - 2], [2, 5], [5, 3], [3, - 5],
326
- [- 2, 6], [0, - 7], [- 4, - 6], [- 6, 4],
327
- [- 8, 0], [7, - 4], [6, 7], [- 7, - 8]
328
- ],
329
- [
330
- [- 4, - 7], [- 7, - 5], [- 3, - 5], [- 5, - 4],
331
- [- 1, - 4], [- 2, - 2], [- 6, - 1], [- 4, 0],
332
- [- 7, 1], [- 1, 2], [- 6, 3], [- 3, 3],
333
- [- 7, 6], [- 3, 6], [- 5, 7], [- 1, 7],
334
- [5, - 7], [1, - 6], [6, - 5], [4, - 4],
335
- [2, - 3], [7, - 2], [1, - 1], [4, - 1],
336
- [2, 1], [6, 2], [0, 4], [4, 4],
337
- [2, 5], [7, 5], [5, 6], [3, 7]
338
- ]
339
- ];
@@ -1,58 +0,0 @@
1
- import * as THREE from 'three';
2
- import { ITreeNode } from '@shapediver/viewer.shared.node-tree';
3
- import { RenderingEngine } from '../../RenderingEngine';
4
- import { SelectiveBloomEffect } from 'postprocessing';
5
-
6
- export class SelectiveBloomManager {
7
- // #region Properties (2)
8
-
9
- private _selectiveBloomEffect!: SelectiveBloomEffect;
10
- private _selectiveBloomNodes: ITreeNode[] = [];
11
-
12
- // #endregion Properties (2)
13
-
14
- // #region Constructors (1)
15
-
16
- constructor(private readonly _renderingEngine: RenderingEngine) { }
17
-
18
- // #endregion Constructors (1)
19
-
20
- // #region Public Methods (5)
21
-
22
- public addSelection(node: ITreeNode): void {
23
- this._selectiveBloomNodes.push(node);
24
- this.updateSelectiveBloomEffectObjects();
25
- }
26
-
27
- public clearSelection(): void {
28
- this._selectiveBloomNodes = [];
29
- this.updateSelectiveBloomEffectObjects();
30
- }
31
-
32
- public removeSelection(node: ITreeNode): boolean {
33
- const index = this._selectiveBloomNodes.indexOf(node);
34
- if (index !== -1)
35
- this._selectiveBloomNodes.splice(index, 1);
36
-
37
- this.updateSelectiveBloomEffectObjects();
38
- return index !== -1;
39
- }
40
-
41
- public setEffect(selectiveBloomEffect: SelectiveBloomEffect) {
42
- this._selectiveBloomEffect = selectiveBloomEffect;
43
- this.updateSelectiveBloomEffectObjects();
44
- }
45
-
46
- public updateSelectiveBloomEffectObjects() {
47
- this._selectiveBloomEffect.selection.clear();
48
-
49
- for (let i = 0; i < this._selectiveBloomNodes.length; i++) {
50
- (this._selectiveBloomNodes[i].convertedObject[this._renderingEngine.id] as THREE.Object3D).traverse(o => {
51
- if (o instanceof THREE.Mesh)
52
- this._selectiveBloomEffect.selection.add(o);
53
- });
54
- }
55
- }
56
-
57
- // #endregion Public Methods (5)
58
- }
@@ -1,180 +0,0 @@
1
- import { Effect, EffectComposer } from 'postprocessing';
2
- import { Camera, Color, Scene, ShaderMaterial, Uniform, WebGLRenderer } from 'three';
3
- import { PoissionDenoisePass } from '../poissionDenoise/PoissionDenoisePass';
4
- import { AOPass } from './AOPass';
5
- import { ao_compose } from './shader/ao_compose';
6
- import { NormalPass } from '../../utils/NormalPass';
7
-
8
- const defaultAOOptions = {
9
- resolutionScale: 1,
10
- spp: 8,
11
- distancePower: 1,
12
- power: 2,
13
- bias: 40,
14
- thickness: 0.075,
15
- color: new Color('black'),
16
- useNormalPass: false,
17
- velocityDepthNormalPass: null,
18
- ...PoissionDenoisePass.DefaultOptions
19
- };
20
-
21
- class AOEffect extends Effect {
22
- // #region Properties (7)
23
-
24
- public static DefaultOptions = defaultAOOptions;
25
-
26
- public aoPass: AOPass;
27
- public composer: EffectComposer;
28
- public lastSize = { width: 0, height: 0, resolutionScale: 0 };
29
- normalPass?: NormalPass;
30
- public poissionDenoisePass: PoissionDenoisePass;
31
- public resolutionScale = 1;
32
-
33
- // #endregion Properties (7)
34
-
35
- // #region Constructors (1)
36
-
37
- constructor(composer: EffectComposer, camera: Camera, scene: Scene, aoPass: AOPass, options: { [key: string]: unknown } = defaultAOOptions) {
38
- super('AOEffect', ao_compose, {
39
- uniforms: new Map([
40
- ['inputTexture', new Uniform(null)],
41
- ['depthTexture', new Uniform(null)],
42
- ['power', (new Uniform(0) as Uniform)],
43
- ['color', new Uniform(new Color('black'))]
44
- ])
45
- });
46
-
47
- this.composer = composer;
48
- this.aoPass = aoPass;
49
- options = { ...defaultAOOptions, ...options };
50
-
51
- this.normalPass = new NormalPass(scene, camera);
52
- const normalTexture = options.normalTexture ?? this.normalPass?.texture;
53
-
54
- (this.aoPass.fullscreenMaterial as ShaderMaterial).uniforms.normalTexture.value = normalTexture;
55
- (this.aoPass.fullscreenMaterial as ShaderMaterial).defines.useNormalTexture = '';
56
-
57
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
- (this.aoPass.fullscreenMaterial as ShaderMaterial).uniforms.depthTexture.value = this.normalPass.depthTexture;
59
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
- this.uniforms.get('depthTexture')!.value = this.normalPass.depthTexture;
61
-
62
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
- this.poissionDenoisePass = new PoissionDenoisePass(camera, this.aoPass.texture, this.normalPass.depthTexture!);
64
-
65
- this.makeOptionsReactive(options);
66
- }
67
-
68
- // #endregion Constructors (1)
69
-
70
- // #region Public Methods (3)
71
-
72
- public makeOptionsReactive(options: { [key: string]: unknown }) {
73
- for (const key of Object.keys(options)) {
74
- Object.defineProperty(this, key, {
75
- get() {
76
- return options[key];
77
- },
78
- set(value) {
79
- if (value === null || value === undefined) return;
80
-
81
- options[key] = value;
82
-
83
- switch (key) {
84
- case 'spp':
85
- (this.aoPass.fullscreenMaterial as ShaderMaterial).defines.spp = value.toFixed(0);
86
-
87
- (this.aoPass.fullscreenMaterial as ShaderMaterial).needsUpdate = true;
88
- break;
89
-
90
- case 'distance':
91
- (this.aoPass.fullscreenMaterial as ShaderMaterial).uniforms.aoDistance.value = value;
92
- this.poissionDenoisePass.fullscreenMaterial.uniforms['distance'].value = Math.max(value, 0.0001);
93
- break;
94
-
95
- case 'resolutionScale':
96
- this.setSize(this.lastSize.width, this.lastSize.height);
97
- break;
98
-
99
- case 'power':
100
- this.uniforms.get('power').value = value;
101
- break;
102
-
103
- case 'color':
104
- this.uniforms.get('color').value.copy(new Color(value));
105
- break;
106
-
107
- // denoiser
108
- case 'iterations':
109
- case 'radius':
110
- case 'rings':
111
- case 'samples':
112
- this.poissionDenoisePass[key] = value;
113
- break;
114
-
115
- case 'lumaPhi':
116
- case 'depthPhi':
117
- case 'normalPhi':
118
- this.poissionDenoisePass.fullscreenMaterial.uniforms[key].value = Math.max(value, 0.0001);
119
- break;
120
-
121
- default:
122
- if (key in (this.aoPass.fullscreenMaterial as ShaderMaterial).uniforms) {
123
- (this.aoPass.fullscreenMaterial as ShaderMaterial).uniforms[key].value = value;
124
- }
125
- }
126
- },
127
- configurable: true
128
- });
129
-
130
- // apply all uniforms and defines
131
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
- (this as any)[key] = options[key];
133
- }
134
- }
135
-
136
- public setSize(width: number, height: number) {
137
- if (width === undefined || height === undefined) return;
138
- if (
139
- width === this.lastSize.width &&
140
- height === this.lastSize.height &&
141
- this.resolutionScale === this.lastSize.resolutionScale
142
- ) {
143
- return;
144
- }
145
-
146
- this.normalPass?.setSize(width, height);
147
- this.aoPass.setSize(width * this.resolutionScale, height * this.resolutionScale);
148
-
149
- this.poissionDenoisePass.setSize(width, height);
150
-
151
- this.lastSize = {
152
- width,
153
- height,
154
- resolutionScale: this.resolutionScale
155
- };
156
- }
157
-
158
- public update(renderer: WebGLRenderer) {
159
- if ('animatedNoise' in (this.aoPass.fullscreenMaterial as ShaderMaterial).defines) {
160
- delete (this.aoPass.fullscreenMaterial as ShaderMaterial).defines.animatedNoise;
161
- (this.aoPass.fullscreenMaterial as ShaderMaterial).needsUpdate = true;
162
- }
163
-
164
- // set input texture
165
- if (this.poissionDenoisePass.iterations > 0) {
166
- this.uniforms.get('inputTexture')!.value = this.poissionDenoisePass.texture;
167
- } else {
168
- this.uniforms.get('inputTexture')!.value = this.aoPass.texture;
169
- }
170
-
171
- this.normalPass?.render(renderer);
172
- this.aoPass.render(renderer);
173
-
174
- this.poissionDenoisePass.render(renderer);
175
- }
176
-
177
- // #endregion Public Methods (3)
178
- }
179
-
180
- export { AOEffect };
@@ -1,128 +0,0 @@
1
- import { Pass } from 'postprocessing';
2
- import {
3
- Camera,
4
- HalfFloatType,
5
- Matrix4,
6
- NearestFilter,
7
- NoBlending,
8
- NoColorSpace,
9
- PerspectiveCamera,
10
- RepeatWrapping,
11
- Scene,
12
- ShaderMaterial,
13
- TextureLoader,
14
- Vector2,
15
- WebGLRenderTarget,
16
- WebGLRenderer
17
- } from 'three';
18
- import { basic as vertexShader } from '../utils/shader/basic';
19
- import { sampleBlueNoise } from '../utils/shader/sampleBlueNoise';
20
- import { PoissionDenoisePass } from '../poissionDenoise/PoissionDenoisePass';
21
-
22
- // a general AO pass that can be used for any AO algorithm
23
- class AOPass extends Pass {
24
- // #region Properties (3)
25
-
26
- private _camera: PerspectiveCamera;
27
- private _scene: Scene;
28
-
29
- public renderTarget: WebGLRenderTarget;
30
-
31
- // #endregion Properties (3)
32
-
33
- // #region Constructors (1)
34
-
35
- constructor(camera: Camera, scene: Scene, fragmentShader: string) {
36
- super();
37
- this._camera = camera as PerspectiveCamera;
38
- this._scene = scene;
39
-
40
- this.renderTarget = new WebGLRenderTarget(1, 1, {
41
- type: HalfFloatType,
42
- depthBuffer: false
43
- });
44
-
45
- const finalFragmentShader = fragmentShader.replace('#include <sampleBlueNoise>', sampleBlueNoise);
46
-
47
- this.fullscreenMaterial = new ShaderMaterial({
48
- fragmentShader: finalFragmentShader,
49
- vertexShader,
50
-
51
- uniforms: {
52
- depthTexture: { value: null },
53
- normalTexture: { value: null },
54
- cameraNear: { value: 0 },
55
- cameraFar: { value: 0 },
56
- viewMatrix: { value: this._camera.matrixWorldInverse },
57
- projectionViewMatrix: { value: new Matrix4() },
58
- projectionMatrixInverse: { value: this._camera.projectionMatrixInverse },
59
- cameraMatrixWorld: { value: this._camera.matrixWorld },
60
- texSize: { value: new Vector2() },
61
- blueNoiseTexture: { value: null },
62
- blueNoiseRepeat: { value: new Vector2() },
63
- aoDistance: { value: 0 },
64
- distancePower: { value: 0 },
65
- bias: { value: 0 },
66
- thickness: { value: 0 },
67
- power: { value: 0 },
68
- frame: { value: 0 }
69
- },
70
-
71
- blending: NoBlending,
72
- depthWrite: false,
73
- depthTest: false,
74
- toneMapped: false
75
- });
76
-
77
- (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseTexture.value = PoissionDenoisePass.blueNoiseTexture;
78
- }
79
-
80
- // #endregion Constructors (1)
81
-
82
- // #region Public Accessors (1)
83
-
84
- public get texture() {
85
- return this.renderTarget.texture;
86
- }
87
-
88
- // #endregion Public Accessors (1)
89
-
90
- // #region Public Methods (2)
91
-
92
- public render(renderer: WebGLRenderer) {
93
- const spp = +(this.fullscreenMaterial as ShaderMaterial).defines.spp;
94
-
95
- (this.fullscreenMaterial as ShaderMaterial).uniforms.frame.value = ((this.fullscreenMaterial as ShaderMaterial).uniforms.frame.value + spp) % 65536;
96
-
97
- (this.fullscreenMaterial as ShaderMaterial).uniforms.cameraNear.value = this._camera.near;
98
- (this.fullscreenMaterial as ShaderMaterial).uniforms.cameraFar.value = this._camera.far;
99
-
100
- (this.fullscreenMaterial as ShaderMaterial).uniforms.projectionViewMatrix.value.multiplyMatrices(
101
- this._camera.projectionMatrix,
102
- this._camera.matrixWorldInverse
103
- );
104
-
105
- const noiseTexture = (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseTexture.value;
106
- if (noiseTexture) {
107
- const { width, height } = noiseTexture.source.data;
108
-
109
- (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseRepeat.value.set(
110
- this.renderTarget.width / width,
111
- this.renderTarget.height / height
112
- );
113
- }
114
-
115
- renderer.setRenderTarget(this.renderTarget);
116
- renderer.render(this.scene, this.camera);
117
- }
118
-
119
- public setSize(width: number, height: number) {
120
- this.renderTarget.setSize(width, height);
121
-
122
- (this.fullscreenMaterial as ShaderMaterial).uniforms.texSize.value.set(this.renderTarget.width, this.renderTarget.height);
123
- }
124
-
125
- // #endregion Public Methods (2)
126
- }
127
-
128
- export { AOPass };