Skip to content

Commit 1927497

Browse files
committed
Fix rendering bug using terrain (#1841)
1 parent 2e56787 commit 1927497

File tree

4 files changed

+20
-6
lines changed

4 files changed

+20
-6
lines changed

src/mapbox/mapbox.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {transformToViewState, applyViewStateToTransform} from '../utils/transform';
1+
import {transformToViewState, applyViewStateToTransform, cloneTransform} from '../utils/transform';
22
import {normalizeStyle} from '../utils/style-utils';
33
import {deepEqual} from '../utils/deep-equal';
44

@@ -451,7 +451,7 @@ export default class Mapbox {
451451

452452
const settingsChanged = this._updateSettings(props, oldProps);
453453
if (settingsChanged) {
454-
this._renderTransform = this._map.transform.clone();
454+
this._renderTransform = cloneTransform(this._map.transform);
455455
}
456456
const sizeChanged = this._updateSize(props);
457457
const viewStateChanged = this._updateViewState(props, true);
@@ -542,7 +542,7 @@ export default class Mapbox {
542542
if (props.cursor) {
543543
map.getCanvas().style.cursor = props.cursor;
544544
}
545-
this._renderTransform = map.transform.clone();
545+
this._renderTransform = cloneTransform(map.transform);
546546

547547
// Hack
548548
// Insert code into map's render cycle
@@ -723,11 +723,10 @@ export default class Mapbox {
723723
if (!nextProps.terrain || map.getSource(nextProps.terrain.source)) {
724724
changed = true;
725725
map.setTerrain(nextProps.terrain);
726-
// Copy changes to the transform
727-
// @ts-ignore
728-
this._renderTransform.elevation = map.transform.elevation;
729726
}
730727
}
728+
// Copy changes to the transform
729+
this._renderTransform.elevation = map.transform.elevation;
731730
}
732731
return changed;
733732
}
@@ -878,6 +877,7 @@ export default class Mapbox {
878877
const tr = this._map.transform;
879878
// Make sure camera matches the current props
880879
this._map.transform = this._renderTransform;
880+
this._map.painter.transform = this._renderTransform;
881881

882882
this._onAfterRepaint = () => {
883883
// Restores camera state before render/load events are fired

src/types/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ export type Transform = {
2929
bearing: number;
3030
pitch: number;
3131
padding: PaddingOptions;
32+
elevation: any;
33+
pixelsToGLUnits: [number, number];
3234

3335
clone: () => Transform;
3436
resize: (width: number, height: number) => void;

src/utils/transform.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
import type {MapboxProps} from '../mapbox/mapbox';
22
import type {Transform, ViewState} from '../types';
33

4+
/**
5+
* Make a copy of a transform
6+
* @param tr
7+
*/
8+
export function cloneTransform(tr: Transform): Transform {
9+
const newTransform = tr.clone();
10+
// Work around mapbox bug - this value is not assigned in clone(), only in resize()
11+
newTransform.pixelsToGLUnits = tr.pixelsToGLUnits;
12+
return newTransform;
13+
}
14+
415
/**
516
* Capture a transform's current state
617
* @param transform

test/src/utils/mapbox-gl-mock/map.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export default class Map extends Evented {
3535
this.transform.zoom = this.options.zoom || 0;
3636
this.transform.pitch = this.options.pitch || 0;
3737
this.transform.bearing = this.options.bearing || 0;
38+
this.painter = {transform: this.transform};
3839

3940
setTimeout(() => {
4041
this.style._loaded = true;

0 commit comments

Comments
 (0)