From c63e917a0e1cd57ee3403b9c0d9e4add83241204 Mon Sep 17 00:00:00 2001 From: dev7355608 Date: Fri, 29 Apr 2022 23:24:09 +0200 Subject: [PATCH] Render to an empty filter texture if the filter source frame does not intersect the current source frame (#8091) --- packages/core/src/filters/FilterSystem.ts | 29 ++++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/core/src/filters/FilterSystem.ts b/packages/core/src/filters/FilterSystem.ts index b46564b5a8..f068459731 100644 --- a/packages/core/src/filters/FilterSystem.ts +++ b/packages/core/src/filters/FilterSystem.ts @@ -188,20 +188,31 @@ export class FilterSystem implements ISystem state.sourceFrame.pad(padding); + const sourceFrameProjected = this.tempRect.copyFrom(renderTextureSystem.sourceFrame); + + // Project source frame into world space (if projection is applied) + if (renderer.projection.transform) + { + this.transformAABB( + tempMatrix.copyFrom(renderer.projection.transform).invert(), + sourceFrameProjected + ); + } + if (autoFit) { - const sourceFrameProjected = this.tempRect.copyFrom(renderTextureSystem.sourceFrame); + state.sourceFrame.fit(sourceFrameProjected); - // Project source frame into world space (if projection is applied) - if (renderer.projection.transform) + if (state.sourceFrame.width <= 0 || state.sourceFrame.height <= 0) { - this.transformAABB( - tempMatrix.copyFrom(renderer.projection.transform).invert(), - sourceFrameProjected - ); + state.sourceFrame.width = 0; + state.sourceFrame.height = 0; } - - state.sourceFrame.fit(sourceFrameProjected); + } + else if (!state.sourceFrame.intersects(sourceFrameProjected)) + { + state.sourceFrame.width = 0; + state.sourceFrame.height = 0; } // Round sourceFrame in screen space based on render-texture.