Skip to content

Commit 71499af

Browse files
authored
[Fix] Improved compatibility with older projects that use render target on a layer (playcanvas#2991)
1 parent 44ce4b1 commit 71499af

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

src/scene/layer-composition.js

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -401,24 +401,35 @@ class LayerComposition extends EventHandler {
401401
addRenderAction(renderActions, renderActionIndex, layer, layerIndex, cameraIndex, cameraFirstRenderAction, postProcessMarked) {
402402

403403
// try and reuse object, otherwise allocate new
404-
var renderAction = renderActions[renderActionIndex];
404+
let renderAction = renderActions[renderActionIndex];
405405
if (!renderAction) {
406406
renderAction = renderActions[renderActionIndex] = new RenderAction();
407407
}
408408

409409
// render target from the camera takes precedence over the render target from the layer
410-
var rt = layer.renderTarget;
411-
var camera = layer.cameras[cameraIndex];
410+
let rt = layer.renderTarget;
411+
const camera = layer.cameras[cameraIndex];
412412
if (camera && camera.renderTarget) {
413413
if (layer.id !== LAYERID_DEPTH) { // ignore depth layer
414414
rt = camera.renderTarget;
415415
}
416416
}
417417

418-
// clear flags - use camera clear flags in the first render action for each camera, other render actions don't clear
419-
let clearColor = cameraFirstRenderAction ? camera.clearColorBuffer : false;
420-
let clearDepth = cameraFirstRenderAction ? camera.clearDepthBuffer : false;
421-
let clearStencil = cameraFirstRenderAction ? camera.clearStencilBuffer : false;
418+
// was camera and render target combo used already
419+
let used = false;
420+
for (let i = renderActionIndex - 1; i >= 0; i--) {
421+
if (renderActions[i].camera === camera && renderActions[i].renderTarget === rt) {
422+
used = true;
423+
break;
424+
}
425+
}
426+
427+
// clear flags - use camera clear flags in the first render action for each camera,
428+
// or when render target (from layer) was not yet cleared by this camera
429+
let needsClear = cameraFirstRenderAction || !used;
430+
let clearColor = needsClear ? camera.clearColorBuffer : false;
431+
let clearDepth = needsClear ? camera.clearDepthBuffer : false;
432+
let clearStencil = needsClear ? camera.clearStencilBuffer : false;
422433

423434
// clear buffers if requested by the layer
424435
clearColor |= layer.clearColorBuffer;

0 commit comments

Comments
 (0)