@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.
- package/package.json +19 -20
- package/src/RenderingEngine.ts +0 -1336
- package/src/index.ts +0 -81
- package/src/injectors/Tag3dGeometryCreationInjector.ts +0 -154
- package/src/injectors/TextureUnifierInjector.ts +0 -214
- package/src/interfaces/ILoader.ts +0 -3
- package/src/interfaces/IPostProcessingEffectDefinitions.ts +0 -402
- package/src/interfaces/IRenderingEngine.ts +0 -48
- package/src/loaders/EnvironmentMapLoader.ts +0 -357
- package/src/loaders/GeometryLoader.ts +0 -585
- package/src/loaders/HTMLElementAnchorLoader.ts +0 -107
- package/src/loaders/LightLoader.ts +0 -171
- package/src/loaders/MaterialLoader.ts +0 -1413
- package/src/managers/CameraManager.ts +0 -178
- package/src/managers/EnvironmentGeometryManager.ts +0 -224
- package/src/managers/PostProcessingManager.ts +0 -1181
- package/src/managers/RenderingManager.ts +0 -657
- package/src/managers/SceneTracingManager.ts +0 -127
- package/src/managers/SceneTreeManager.ts +0 -576
- package/src/managers/postprocessing/GodRaysManager.ts +0 -52
- package/src/managers/postprocessing/OutlineManager.ts +0 -58
- package/src/managers/postprocessing/SSAARenderPass.ts +0 -339
- package/src/managers/postprocessing/SelectiveBloomManager.ts +0 -58
- package/src/managers/postprocessing/ao/ao/AOEffect.ts +0 -180
- package/src/managers/postprocessing/ao/ao/AOPass.ts +0 -128
- package/src/managers/postprocessing/ao/ao/shader/ao_compose.glsl +0 -17
- package/src/managers/postprocessing/ao/ao/shader/ao_compose.ts +0 -19
- package/src/managers/postprocessing/ao/hbao/HBAOEffect.ts +0 -41
- package/src/managers/postprocessing/ao/hbao/shader/hbao.glsl +0 -96
- package/src/managers/postprocessing/ao/hbao/shader/hbao.ts +0 -98
- package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.glsl +0 -92
- package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.ts +0 -95
- package/src/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.ts +0 -259
- package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.glsl +0 -125
- package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.ts +0 -127
- package/src/managers/postprocessing/ao/ssao/SSAOEffect.ts +0 -106
- package/src/managers/postprocessing/ao/ssao/shader/ssao.glsl +0 -128
- package/src/managers/postprocessing/ao/ssao/shader/ssao.ts +0 -130
- package/src/managers/postprocessing/ao/utils/shader/basic.glsl +0 -6
- package/src/managers/postprocessing/ao/utils/shader/basic.ts +0 -8
- package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.glsl +0 -36
- package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.ts +0 -38
- package/src/managers/postprocessing/utils/CopyMaterial.ts +0 -130
- package/src/managers/postprocessing/utils/CopyShader.ts +0 -39
- package/src/managers/postprocessing/utils/FullScreenQuad.ts +0 -47
- package/src/managers/postprocessing/utils/NormalPass.ts +0 -222
- package/src/managers/postprocessing/utils/RenderPass.ts +0 -366
- package/src/materials/GemMaterial.ts +0 -268
- package/src/materials/MeshUnlitMaterialParameters.ts +0 -4
- package/src/materials/MultiPointsMaterial.ts +0 -646
- package/src/materials/SpecularGlossinessMaterial.ts +0 -182
- package/src/objects/SDBone.ts +0 -51
- package/src/objects/SDColor.ts +0 -54
- package/src/objects/SDData.ts +0 -44
- package/src/objects/SDObject.ts +0 -58
- package/src/shaders/PCSS.ts +0 -124
- package/src/shaders/gem.ts +0 -579
- package/src/shaders/gem_frag.glsl +0 -522
- package/src/shaders/gem_vert.glsl +0 -53
- package/src/shaders/multi_points.ts +0 -291
- package/src/shaders/multi_points_frag.glsl +0 -166
- package/src/shaders/multi_points_vert.glsl +0 -120
- package/src/styling/viewport-css.ts +0 -113
- package/src/styling/viewport.css +0 -111
- package/src/three/font.ts +0 -2
- package/src/three/geometries/TextGeometry.ts +0 -58
- package/src/three/loaders/FontLoader.ts +0 -205
- package/src/three/loaders/RGBELoader.ts +0 -496
- package/src/types/IThreejsData.ts +0 -16
- package/src/types/ThreejsData.ts +0 -43
- 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 };
|