Skip to content

Commit 4a8b816

Browse files
committed
fix postprocessing effects
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
1 parent 4befa17 commit 4a8b816

File tree

6 files changed

+64
-8
lines changed

6 files changed

+64
-8
lines changed

src/components/src/effects/effect-configurator.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ export default function EffectConfiguratorFactory(
283283
effect,
284284
updateEffectConfig
285285
}) => {
286-
const uniforms = effect.deckEffect?.module.uniforms || defaultUniforms;
286+
const uniforms = effect.deckEffect?.module.propTypes || defaultUniforms;
287287
const parameterDescriptions = effect.getParameterDescriptions();
288288
const {parameters, id} = effect;
289289
const flatParameterDescriptions = useMemo(() => {

src/components/src/map-container.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ import {
5959
computeDeckEffects,
6060
getApplicationConfig,
6161
GetMapRef,
62-
getLayerBlendingParameters
62+
getLayerBlendingParameters,
63+
patchDeckRendererForPostProcessing
6364
} from '@kepler.gl/utils';
6465
import {breakPointValues} from '@kepler.gl/styles';
6566

@@ -94,6 +95,8 @@ import {VisState} from '@kepler.gl/schemas';
9495

9596
import LoadingIndicator from './loading-indicator';
9697

98+
patchDeckRendererForPostProcessing();
99+
97100
// Debounce the propagation of viewport change and mouse moves to redux store.
98101
// This is to avoid too many renders of other components when the map is
99102
// being panned/zoomed (leading to laggy basemap/deck syncing).

src/deckgl-augmentations.d.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ declare module '@deck.gl/core' {
4444
export type Color = [number, number, number] | [number, number, number, number];
4545
export type RGBAColor = [number, number, number, number];
4646
export type RGBColor = [number, number, number];
47+
48+
export class DeckRenderer {
49+
device: any;
50+
renderBuffers: any[];
51+
lastPostProcessEffect: string | null;
52+
constructor(device: any);
53+
renderLayers(opts: any): void;
54+
needsRedraw(opts?: any): string | false;
55+
finalize(): void;
56+
}
4757
}
4858

4959
declare module '@deck.gl/geo-layers' {

src/effects/src/post-processing-effect.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,12 @@ class PostProcessingEffect extends Effect {
117117
if (effectDesc) {
118118
this.deckEffect = new DeckPostProcessEffect(effectDesc.class, this.parameters);
119119

120-
const uniforms = this.deckEffect?.module?.uniforms;
121-
if (uniforms) {
122-
// get default parameters
123-
const keys = Object.keys(uniforms);
120+
const propTypes = this.deckEffect?.module?.propTypes;
121+
if (propTypes) {
122+
const keys = Object.keys(propTypes);
124123
const defaultParameters = {};
125124
keys.forEach(key => {
126-
defaultParameters[key] = getDefaultValueForParameter(key, this._uiConfig, uniforms);
125+
defaultParameters[key] = getDefaultValueForParameter(key, this._uiConfig, propTypes);
127126
});
128127
this.parameters = {...defaultParameters, ...this.parameters};
129128
this.deckEffect?.setProps(this.parameters);

src/utils/src/gl-utils.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Copyright contributors to the kepler.gl project
33

44
import {LAYER_BLENDINGS} from '@kepler.gl/constants';
5+
import {DeckRenderer} from '@deck.gl/core';
56

67
const GL_BLEND_FUNC_TO_WEBGPU: Record<string, string> = {
78
SRC_ALPHA: 'src-alpha',
@@ -66,3 +67,42 @@ export function getLayerBlendingParameters(layerBlending: string): Record<string
6667
export function setLayerBlending(_gl: unknown, _layerBlending: string): void {
6768
// no-op in deck.gl 9.x - blending is handled via parameters prop
6869
}
70+
71+
/**
72+
* Patch DeckRenderer to include depth-stencil attachments on post-processing
73+
* framebuffers. In deck.gl 9, _resizeRenderBuffers creates FBOs with only color
74+
* attachments, which breaks depth testing when post-processing effects are active.
75+
* This was not an issue in deck.gl 8 where Framebuffer() auto-created a depth buffer.
76+
*/
77+
let _deckRendererPatched = false;
78+
export function patchDeckRendererForPostProcessing(): void {
79+
if (_deckRendererPatched) return;
80+
_deckRendererPatched = true;
81+
82+
const proto = DeckRenderer.prototype as any;
83+
84+
proto._resizeRenderBuffers = function _resizeRenderBufferPatched() {
85+
const {renderBuffers} = this;
86+
const size = this.device.canvasContext!.getDrawingBufferSize();
87+
const [width, height] = size;
88+
if (renderBuffers.length === 0) {
89+
[0, 1].map((i: number) => {
90+
const texture = this.device.createTexture({
91+
sampler: {minFilter: 'linear', magFilter: 'linear'},
92+
width,
93+
height
94+
});
95+
renderBuffers.push(
96+
this.device.createFramebuffer({
97+
id: `deck-renderbuffer-${i}`,
98+
colorAttachments: [texture],
99+
depthStencilAttachment: 'depth24plus'
100+
})
101+
);
102+
});
103+
}
104+
for (const buffer of renderBuffers) {
105+
buffer.resize(size);
106+
}
107+
};
108+
}

src/utils/src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@ export {
8282
isMSEdge
8383
} from './export-utils';
8484
export {getFormatValue, getDefaultTimeFormat} from './format';
85-
export {setLayerBlending, getLayerBlendingParameters} from './gl-utils';
85+
export {
86+
setLayerBlending,
87+
getLayerBlendingParameters,
88+
patchDeckRendererForPostProcessing
89+
} from './gl-utils';
8690
export {flattenMessages, mergeMessages} from './locale-utils';
8791
export {isValidMapInfo} from './map-info-utils';
8892
export {

0 commit comments

Comments
 (0)