@needle-tools/engine 2.67.5-pre → 2.67.6-pre
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/CHANGELOG.md +4 -0
- package/dist/needle-engine.js +5114 -5089
- package/dist/needle-engine.umd.cjs +225 -225
- package/lib/engine/engine_gizmos.js +7 -0
- package/lib/engine/engine_gizmos.js.map +1 -1
- package/lib/engine/engine_setup.js +1 -3
- package/lib/engine/engine_setup.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +1 -0
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +0 -1
- package/lib/engine-components/postprocessing/Effects/Pixelation.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +3 -3
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js.map +1 -1
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +3 -2
- package/lib/engine-components/postprocessing/PostProcessingEffect.js.map +1 -1
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +1 -0
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +69 -22
- package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
- package/lib/engine-components/postprocessing/Volume.js +5 -5
- package/lib/engine-components/postprocessing/Volume.js.map +1 -1
- package/lib/engine-components/postprocessing/VolumeParameter.js +1 -1
- package/lib/engine-components/postprocessing/VolumeParameter.js.map +1 -1
- package/package.json +1 -1
- package/src/engine/engine_gizmos.ts +7 -0
- package/src/engine/engine_setup.ts +0 -3
- package/src/engine-components/postprocessing/Effects/DepthOfField.ts +1 -0
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +0 -1
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +2 -2
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +3 -2
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +74 -29
- package/src/engine-components/postprocessing/Volume.ts +10 -10
- package/src/engine-components/postprocessing/VolumeParameter.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VolumeParameter.js","sourceRoot":"","sources":["../../../../src/engine-components/postprocessing/VolumeParameter.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAKjE,MAAM,OAAO,eAAe;IAGxB,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IACD,IAAI,aAAa,CAAC,GAAY;QAC1B,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;YAAE,OAAO;QACjC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;QAClE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACO,OAAO,GAAY,
|
|
1
|
+
{"version":3,"file":"VolumeParameter.js","sourceRoot":"","sources":["../../../../src/engine-components/postprocessing/VolumeParameter.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAKjE,MAAM,OAAO,eAAe;IAGxB,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IACD,IAAI,aAAa,CAAC,GAAY;QAC1B,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG;YAAE,OAAO;QACjC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;QAClE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACO,OAAO,GAAY,IAAI,CAAC;IAKhC,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,CAAC,GAAQ;QACd,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IACO,MAAM,CAAM;IACZ,mBAAmB,CAAO;IAGlC,IAAI,YAAY,CAAC,GAAQ;QACrB,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;IAC7B,CAAC;IACO,aAAa,GAAQ,SAAS,CAAC;IAGvC,8EAA8E;IAC9E,MAAM;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,2DAA2D;IAC3D,cAAc,CAA4C;IAC1D,6DAA6D;IAC7D,cAAc,CAA0C;IAGhD,YAAY,CAAC,GAAQ,EAAE,WAAoB;QAC/C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAE9C,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,KAAK;YACtD,OAAO;QAEX,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;QAE7B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;YACnD,6HAA6H;YAC7H,8EAA8E;YAC9E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;YACjC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;SAC5B;aACI;YACD,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC;YAC/B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc;gBACnC,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;SACrB;QAED,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;SAC5C;IACL,CAAC;IAEO,kBAAkB,CAAC,QAAa;QAEpC,IAAI,IAAI,CAAC,mBAAmB,KAAK,QAAQ;YACrC,OAAO,KAAK,CAAC;QAEjB,0IAA0I;QAE1I,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA5EG;IADC,YAAY,EAAE;oDAGd;AAYD;IADC,YAAY,EAAE;4CAGd"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@needle-tools/engine",
|
|
3
|
-
"version": "2.67.
|
|
3
|
+
"version": "2.67.6-pre",
|
|
4
4
|
"description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development, and can be deployed anywhere. It is flexible, extensible, and collaboration and XR come naturally.",
|
|
5
5
|
"main": "dist/needle-engine.umd.cjs",
|
|
6
6
|
"module": "lib/needle-engine.js",
|
|
@@ -21,6 +21,7 @@ export class Gizmos {
|
|
|
21
21
|
positions.needsUpdate = true;
|
|
22
22
|
obj.material["color"].set(color);
|
|
23
23
|
obj.material["depthTest"] = depthTest;
|
|
24
|
+
obj.material["depthWrite"] = false;
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
static DrawDirection(pt: Vec3, direction: Vec3 | Vec4, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true, lengthFactor: number = 1) {
|
|
@@ -40,6 +41,7 @@ export class Gizmos {
|
|
|
40
41
|
positions.needsUpdate = true;
|
|
41
42
|
obj.material["color"].set(color);
|
|
42
43
|
obj.material["depthTest"] = depthTest;
|
|
44
|
+
obj.material["depthWrite"] = false;
|
|
43
45
|
|
|
44
46
|
}
|
|
45
47
|
|
|
@@ -52,6 +54,7 @@ export class Gizmos {
|
|
|
52
54
|
positions.needsUpdate = true;
|
|
53
55
|
obj.material["color"].set(color);
|
|
54
56
|
obj.material["depthTest"] = depthTest;
|
|
57
|
+
obj.material["depthWrite"] = false;
|
|
55
58
|
}
|
|
56
59
|
|
|
57
60
|
static DrawWireSphere(center: Vec3, radius: number, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true) {
|
|
@@ -59,6 +62,7 @@ export class Gizmos {
|
|
|
59
62
|
setWorldPositionXYZ(obj, center.x, center.y, center.z);
|
|
60
63
|
obj.material["color"].set(color);
|
|
61
64
|
obj.material["depthTest"] = depthTest;
|
|
65
|
+
obj.material["depthWrite"] = false;
|
|
62
66
|
}
|
|
63
67
|
|
|
64
68
|
static DrawSphere(center: Vec3, radius: number, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true) {
|
|
@@ -66,6 +70,7 @@ export class Gizmos {
|
|
|
66
70
|
setWorldPositionXYZ(obj, center.x, center.y, center.z);
|
|
67
71
|
obj.material["color"].set(color);
|
|
68
72
|
obj.material["depthTest"] = depthTest;
|
|
73
|
+
obj.material["depthWrite"] = false;
|
|
69
74
|
}
|
|
70
75
|
|
|
71
76
|
static DrawBox(center: Vec3, size: Vec3, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true) {
|
|
@@ -75,6 +80,7 @@ export class Gizmos {
|
|
|
75
80
|
obj.material["color"].set(color);
|
|
76
81
|
obj.material["depthTest"] = depthTest;
|
|
77
82
|
obj.material["wireframe"] = true;
|
|
83
|
+
obj.material["depthWrite"] = false;
|
|
78
84
|
}
|
|
79
85
|
|
|
80
86
|
static DrawBox3(box: Box3, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true) {
|
|
@@ -84,6 +90,7 @@ export class Gizmos {
|
|
|
84
90
|
obj.material["color"].set(color);
|
|
85
91
|
obj.material["depthTest"] = depthTest;
|
|
86
92
|
obj.material["wireframe"] = true;
|
|
93
|
+
obj.material["depthWrite"] = false;
|
|
87
94
|
}
|
|
88
95
|
|
|
89
96
|
private static _up = new Vector3(0, 1, 0);
|
|
@@ -244,7 +244,6 @@ export class Context implements IContext {
|
|
|
244
244
|
this.isManagedExternally = true;
|
|
245
245
|
}
|
|
246
246
|
else {
|
|
247
|
-
const useComposer = utils.getParam("postfx");
|
|
248
247
|
this.renderer = new WebGLRenderer({
|
|
249
248
|
antialias: true
|
|
250
249
|
});
|
|
@@ -263,8 +262,6 @@ export class Context implements IContext {
|
|
|
263
262
|
this.renderer.setSize(this.domWidth, this.domHeight);
|
|
264
263
|
this.renderer.outputEncoding = THREE.sRGBEncoding;
|
|
265
264
|
this.renderer.physicallyCorrectLights = true;
|
|
266
|
-
|
|
267
|
-
this.composer = useComposer ? new EffectComposer(this.renderer) : null;
|
|
268
265
|
}
|
|
269
266
|
|
|
270
267
|
this.scene = new THREE.Scene();
|
|
@@ -37,7 +37,7 @@ export class ScreenSpaceAmbientOcclusion extends PostProcessingEffect {
|
|
|
37
37
|
const normalPass = new NormalPass(this.context.scene, cam);
|
|
38
38
|
const depthDownsamplingPass = new DepthDownsamplingPass({
|
|
39
39
|
normalBuffer: normalPass.texture,
|
|
40
|
-
resolutionScale:
|
|
40
|
+
resolutionScale: .5
|
|
41
41
|
});
|
|
42
42
|
|
|
43
43
|
const ssao = this._ssao = new SSAOEffect(cam!, normalPass.texture, {
|
|
@@ -47,7 +47,7 @@ export class ScreenSpaceAmbientOcclusion extends PostProcessingEffect {
|
|
|
47
47
|
worldProximityThreshold: .1,
|
|
48
48
|
worldProximityFalloff: 2,
|
|
49
49
|
intensity: 1,
|
|
50
|
-
|
|
50
|
+
blendFunction: BlendFunction.MULTIPLY,
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
this.intensity.onValueChanged = newValue => {
|
|
@@ -83,12 +83,13 @@ export abstract class PostProcessingEffect extends Component implements IEffectP
|
|
|
83
83
|
if (typeof data === "object") {
|
|
84
84
|
const types = this["$serializedTypes"];
|
|
85
85
|
if (types) {
|
|
86
|
-
for (const fieldName
|
|
86
|
+
for (const fieldName of Object.keys(types)) {
|
|
87
87
|
const type = types[fieldName];
|
|
88
88
|
if (type === VolumeParameter) {
|
|
89
89
|
const value = data[fieldName];
|
|
90
90
|
if (value !== undefined) {
|
|
91
|
-
this[fieldName]
|
|
91
|
+
const parameter = this[fieldName];
|
|
92
|
+
parameter.value = value;
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { HalfFloatType, sRGBEncoding, WebGLRenderTarget } from "three";
|
|
2
2
|
import { Context } from "../../engine/engine_setup";
|
|
3
|
-
import { getParam } from "../../engine/engine_utils";
|
|
4
|
-
import { Effect, EffectComposer, EffectPass, Pass, RenderPass } from "postprocessing";
|
|
3
|
+
import { getParam, isMobileDevice } from "../../engine/engine_utils";
|
|
4
|
+
import { BloomEffect, BrightnessContrastEffect, ChromaticAberrationEffect, DepthDownsamplingPass, DepthOfFieldEffect, Effect, EffectComposer, EffectPass, HueSaturationEffect, NormalPass, Pass, PixelationEffect, RenderPass, SelectiveBloomEffect, SSAOEffect, VignetteEffect } from "postprocessing";
|
|
5
5
|
import { showBalloonWarning } from "../../engine/debug/debug";
|
|
6
6
|
import { Camera } from "../Camera";
|
|
7
7
|
import { PostProcessingEffect } from "./PostProcessingEffect";
|
|
8
|
+
import { Constructor } from "../../engine/engine_serialization_core";
|
|
8
9
|
|
|
9
10
|
const debug = getParam("debugpost");
|
|
10
11
|
|
|
@@ -98,7 +99,6 @@ export class PostProcessingHandler {
|
|
|
98
99
|
}
|
|
99
100
|
|
|
100
101
|
this.applyEffects(context);
|
|
101
|
-
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
|
|
@@ -106,11 +106,11 @@ export class PostProcessingHandler {
|
|
|
106
106
|
private applyEffects(context: Context) {
|
|
107
107
|
|
|
108
108
|
const effectsOrPasses = this._effects;
|
|
109
|
-
const camera = context.mainCameraComponent as Camera;
|
|
110
|
-
const renderer = context.renderer;
|
|
111
|
-
|
|
112
109
|
if (effectsOrPasses.length <= 0) return;
|
|
113
110
|
|
|
111
|
+
const camera = context.mainCameraComponent as Camera;
|
|
112
|
+
const renderer = context.renderer;
|
|
113
|
+
const scene = context.scene;
|
|
114
114
|
const cam = camera.cam;
|
|
115
115
|
|
|
116
116
|
// create composer and set active on context
|
|
@@ -119,45 +119,90 @@ export class PostProcessingHandler {
|
|
|
119
119
|
this._composer = new EffectComposer(renderer, {
|
|
120
120
|
frameBufferType: HalfFloatType,
|
|
121
121
|
stencilBuffer: true,
|
|
122
|
-
|
|
122
|
+
multisampling: isMobileDevice() ? 0 : 8,
|
|
123
123
|
});
|
|
124
124
|
}
|
|
125
125
|
context.composer = this._composer;
|
|
126
126
|
const composer = context.composer;
|
|
127
127
|
composer.setMainCamera(cam);
|
|
128
128
|
composer.setRenderer(renderer);
|
|
129
|
+
composer.setMainScene(scene);
|
|
130
|
+
|
|
129
131
|
for (const prev of composer.passes)
|
|
130
132
|
prev.dispose();
|
|
131
133
|
composer.removeAllPasses();
|
|
132
|
-
composer.addPass(new RenderPass(context.scene, cam));
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
if (debug)
|
|
136
|
-
console.log("Set effects or passes", camera, effectsOrPasses, composer);
|
|
137
|
-
|
|
138
|
-
// TODO: enforce correct order of effects (e.g. DOF before Bloom)
|
|
139
134
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
135
|
+
// Render to screen pass
|
|
136
|
+
const screenpass = new RenderPass(scene, cam);
|
|
137
|
+
screenpass.mainScene = scene;
|
|
138
|
+
composer.addPass(screenpass);
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
this.orderEffects();
|
|
142
|
+
|
|
143
|
+
const effects: Array<Effect> = [];
|
|
144
|
+
|
|
145
|
+
for (const ef of effectsOrPasses) {
|
|
146
|
+
if (ef instanceof Effect)
|
|
147
|
+
effects.push(ef as Effect);
|
|
148
|
+
else if (ef instanceof Pass) {
|
|
149
|
+
const pass = new EffectPass(cam, ...effects);
|
|
150
|
+
pass.mainScene = scene;
|
|
151
|
+
pass.name = effects.map(e => e.constructor.name).join(", ");
|
|
152
|
+
pass.enabled = true;
|
|
153
|
+
// composer.addPass(pass);
|
|
154
|
+
effects.length = 0;
|
|
155
|
+
composer.addPass(ef as Pass);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// create and apply uber pass
|
|
160
|
+
if (effects.length > 0) {
|
|
146
161
|
const pass = new EffectPass(cam, ...effects);
|
|
147
|
-
pass.
|
|
162
|
+
pass.mainScene = scene;
|
|
148
163
|
pass.enabled = true;
|
|
149
164
|
composer.addPass(pass);
|
|
150
|
-
effects.length = 0;
|
|
151
|
-
composer.addPass(ef as Pass);
|
|
152
165
|
}
|
|
153
166
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
pass.enabled = true;
|
|
159
|
-
composer.addPass(pass);
|
|
167
|
+
catch(e) {
|
|
168
|
+
console.error("Error while applying postprocessing effects", e);
|
|
169
|
+
composer.removeAllPasses();
|
|
170
|
+
composer.addPass(screenpass);
|
|
160
171
|
}
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
if (debug)
|
|
175
|
+
console.log("PostProcessing Passes", effectsOrPasses, "->", composer.passes);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private orderEffects() {
|
|
179
|
+
if (debug) console.log("Before ordering effects", [...this._effects]);
|
|
180
|
+
// TODO: enforce correct order of effects (e.g. DOF before Bloom)
|
|
181
|
+
const effects = this._effects;
|
|
182
|
+
effects.sort((a, b) => {
|
|
183
|
+
const aidx = effectsOrder.indexOf(a.constructor as any);
|
|
184
|
+
const bidx = effectsOrder.indexOf(b.constructor as any);
|
|
185
|
+
// Unknown effects should be rendered first
|
|
186
|
+
if (aidx < 0 && bidx < 0) return -1;
|
|
187
|
+
if (aidx < 0) return 1;
|
|
188
|
+
if (bidx < 0) return -1;
|
|
189
|
+
return aidx - bidx;
|
|
190
|
+
});
|
|
191
|
+
if (debug) console.log("After ordering effects", [...this._effects]);
|
|
161
192
|
}
|
|
162
193
|
}
|
|
163
194
|
|
|
195
|
+
|
|
196
|
+
const effectsOrder: Array<Constructor<Effect | Pass>> = [
|
|
197
|
+
NormalPass,
|
|
198
|
+
DepthDownsamplingPass,
|
|
199
|
+
SSAOEffect,
|
|
200
|
+
DepthOfFieldEffect,
|
|
201
|
+
BloomEffect,
|
|
202
|
+
SelectiveBloomEffect,
|
|
203
|
+
VignetteEffect,
|
|
204
|
+
HueSaturationEffect,
|
|
205
|
+
ChromaticAberrationEffect,
|
|
206
|
+
BrightnessContrastEffect,
|
|
207
|
+
PixelationEffect,
|
|
208
|
+
];
|
|
@@ -42,15 +42,18 @@ export class Volume extends Behaviour implements IEditorModificationReceiver {
|
|
|
42
42
|
|
|
43
43
|
onBeforeRender(): void {
|
|
44
44
|
if (!this.context.isInXR) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
|
|
46
|
+
if (this.context.composer && (this.context.composer instanceof EffectComposer) === false) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
50
|
// Wait for the first frame to be rendered before creating because then we know we have a camera (issue 135)
|
|
51
51
|
if (this.context.mainCamera) {
|
|
52
|
-
if (!this._postprocessing || !this._postprocessing.isActive)
|
|
52
|
+
if (!this._postprocessing || !this._postprocessing.isActive) {
|
|
53
53
|
this.apply();
|
|
54
|
+
// TODO: remove this workaround for postprocessing rendering not working correctly when applied for the first time
|
|
55
|
+
this.apply();
|
|
56
|
+
}
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
if (this.context.composer) {
|
|
@@ -59,9 +62,6 @@ export class Volume extends Behaviour implements IEditorModificationReceiver {
|
|
|
59
62
|
if (this.context.mainCamera)
|
|
60
63
|
this.context.composer.setMainCamera(this.context.mainCamera);
|
|
61
64
|
}
|
|
62
|
-
if (this.context.renderer) {
|
|
63
|
-
this.context.renderer.autoClear = false;
|
|
64
|
-
}
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
@@ -106,9 +106,9 @@ export class Volume extends Behaviour implements IEditorModificationReceiver {
|
|
|
106
106
|
if (!this._postprocessing)
|
|
107
107
|
this._postprocessing = new PostProcessingHandler(this.context);
|
|
108
108
|
this._postprocessing.apply(this._effects);
|
|
109
|
+
this._applyPostQueue();
|
|
109
110
|
}
|
|
110
111
|
|
|
111
|
-
this._applyPostQueue();
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
private unapply() {
|