Skip to content

Commit 6d51fab

Browse files
mvaligurskyMartin Valigursky
and
Martin Valigursky
committed
Fix some issues with CameraFrame.enabled not working correctly (#7311)
Co-authored-by: Martin Valigursky <[email protected]>
1 parent 2bc650e commit 6d51fab

File tree

5 files changed

+62
-28
lines changed

5 files changed

+62
-28
lines changed

examples/src/examples/graphics/ambient-occlusion.controls.mjs

+9
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ import * as pc from 'playcanvas';
77
export const controls = ({ observer, ReactPCUI, React, jsx, fragment }) => {
88
const { BindingTwoWay, BooleanInput, LabelGroup, Panel, SelectInput, SliderInput } = ReactPCUI;
99
return fragment(
10+
jsx(
11+
LabelGroup,
12+
{ text: 'enabled' },
13+
jsx(BooleanInput, {
14+
type: 'toggle',
15+
binding: new BindingTwoWay(),
16+
link: { observer, path: 'data.enabled' }
17+
})
18+
),
1019
jsx(
1120
Panel,
1221
{ headerText: 'Ambient Occlusion' },

examples/src/examples/graphics/ambient-occlusion.example.mjs

+6-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ assetListLoader.load(() => {
146146
cameraEntity.addComponent('camera', {
147147
clearColor: new pc.Color(0.4, 0.45, 0.5),
148148
nearClip: 1,
149-
farClip: 600
149+
farClip: 600,
150+
toneMapping: pc.TONEMAP_NEUTRAL
150151
});
151152

152153
// add orbit camera script
@@ -175,6 +176,9 @@ assetListLoader.load(() => {
175176

176177
const applySettings = () => {
177178

179+
// enabled
180+
cameraFrame.enabled = data.get('data.enabled');
181+
178182
cameraFrame.ssao.type = data.get('data.ssao.type');
179183
cameraFrame.ssao.blurEnabled = data.get('data.ssao.blurEnabled');
180184
cameraFrame.ssao.intensity = data.get('data.ssao.intensity');
@@ -215,6 +219,7 @@ assetListLoader.load(() => {
215219

216220
// initial settings
217221
data.set('data', {
222+
enabled: true,
218223
ssao: {
219224
type: pc.SSAOTYPE_LIGHTING,
220225
blurEnabled: true,

examples/src/examples/graphics/post-processing.controls.mjs

+9
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ import * as pc from 'playcanvas';
77
export const controls = ({ observer, ReactPCUI, React, jsx, fragment }) => {
88
const { BindingTwoWay, BooleanInput, LabelGroup, Panel, SelectInput, SliderInput } = ReactPCUI;
99
return fragment(
10+
jsx(
11+
LabelGroup,
12+
{ text: 'enabled' },
13+
jsx(BooleanInput, {
14+
type: 'toggle',
15+
binding: new BindingTwoWay(),
16+
link: { observer, path: 'data.enabled' }
17+
})
18+
),
1019
jsx(
1120
Panel,
1221
{ headerText: 'Scene Rendering' },

examples/src/examples/graphics/post-processing.example.mjs

+4
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ assetListLoader.load(() => {
237237
material.update();
238238
});
239239

240+
// enabled
241+
cameraFrame.enabled = data.get('data.enabled');
242+
240243
// Scene
241244
cameraFrame.rendering.renderTargetScale = data.get('data.scene.scale');
242245
cameraFrame.rendering.toneMapping = data.get('data.scene.tonemapping');
@@ -283,6 +286,7 @@ assetListLoader.load(() => {
283286

284287
// set initial values
285288
data.set('data', {
289+
enabled: true,
286290
scene: {
287291
scale: 1.8,
288292
background: 6,

src/extras/render-passes/camera-frame.js

+34-27
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,9 @@ import { CameraFrameOptions, RenderPassCameraFrame } from './render-pass-camera-
173173
* @category Render Pass
174174
*/
175175
class CameraFrame {
176+
/** @private */
177+
_enabled = true;
178+
176179
/**
177180
* Rendering settings.
178181
*
@@ -303,7 +306,7 @@ class CameraFrame {
303306
Debug.assert(cameraComponent, 'CameraFrame: cameraComponent must be defined');
304307

305308
this.updateOptions();
306-
this.enabled = true;
309+
this.enable();
307310
}
308311

309312
/**
@@ -314,40 +317,44 @@ class CameraFrame {
314317
}
315318

316319
enable() {
317-
if (!this.renderPassCamera) {
318-
const cameraComponent = this.cameraComponent;
319-
this.renderPassCamera = new RenderPassCameraFrame(this.app, cameraComponent, this.options);
320-
cameraComponent.renderPasses = [this.renderPassCamera];
321-
}
320+
Debug.assert(!this.renderPassCamera);
321+
322+
const cameraComponent = this.cameraComponent;
323+
this.renderPassCamera = new RenderPassCameraFrame(this.app, cameraComponent, this.options);
324+
cameraComponent.renderPasses = [this.renderPassCamera];
322325
}
323326

324327
disable() {
325-
if (this.renderPassCamera) {
326-
const cameraComponent = this.cameraComponent;
327-
cameraComponent.renderPasses?.forEach((renderPass) => {
328-
renderPass.destroy();
329-
});
330-
cameraComponent.renderPasses = [];
331-
cameraComponent.rendering = null;
332-
333-
cameraComponent.jitter = 0;
334-
335-
// no longer HDR rendering
336-
cameraComponent.gammaCorrection = GAMMA_SRGB;
337-
}
328+
Debug.assert(this.renderPassCamera);
329+
330+
const cameraComponent = this.cameraComponent;
331+
cameraComponent.renderPasses?.forEach((renderPass) => {
332+
renderPass.destroy();
333+
});
334+
cameraComponent.renderPasses = [];
335+
cameraComponent.rendering = null;
336+
337+
cameraComponent.jitter = 0;
338+
339+
// no longer HDR rendering
340+
cameraComponent.gammaCorrection = GAMMA_SRGB;
341+
342+
this.renderPassCamera = null;
338343
}
339344

340345
/**
341-
* Sets the enabled state of the camera frame. This disabled the render passes, and releases
342-
* any resources.
346+
* Sets the enabled state of the camera frame. Passing false will release associated resources.
343347
*
344348
* @type {boolean}
345349
*/
346350
set enabled(value) {
347-
if (value) {
348-
this.enable();
349-
} else {
350-
this.disable();
351+
if (this._enabled !== value) {
352+
if (value) {
353+
this.enable();
354+
} else {
355+
this.disable();
356+
}
357+
this._enabled = value;
351358
}
352359
}
353360

@@ -357,7 +364,7 @@ class CameraFrame {
357364
* @type {boolean}
358365
*/
359366
get enabled() {
360-
return this.renderPassCamera !== null;
367+
return this._enabled;
361368
}
362369

363370
updateOptions() {
@@ -382,7 +389,7 @@ class CameraFrame {
382389
*/
383390
update() {
384391

385-
if (!this.enabled) return;
392+
if (!this._enabled) return;
386393

387394
const cameraComponent = this.cameraComponent;
388395
const { options, renderPassCamera, rendering, bloom, grading, vignette, fringing, taa, ssao } = this;

0 commit comments

Comments
 (0)