MaskedGeoJsonLayer = {
const MASK_LAYER_DEFAULT_PROPS = _.cloneDeep(deck.SolidPolygonLayer.defaultProps);
delete MASK_LAYER_DEFAULT_PROPS.getLineColor;
const MASK_LAYER_MAPPING = {
type: deck.SolidPolygonLayer,
props: {
extruded: 'extruded',
filled: 'filled',
wireframe: 'wireframe',
elevationScale: 'elevationScale',
material: 'material',
_full3d: '_full3d',
getElevation: 'getElevation',
}
};
function forwardProps(layer, mapping) {
const {transitions, updateTriggers} = layer.props;
const result = {
updateTriggers: {},
transitions: transitions && {
getPosition: transitions.geometry
}
};
for (const sourceKey in mapping) {
const targetKey = mapping[sourceKey];
let value = layer.props[sourceKey];
if (sourceKey.startsWith('get')) {
value = layer.getSubLayerAccessor(value);
result.updateTriggers[targetKey] = updateTriggers[sourceKey];
if (transitions) {
result.transitions[targetKey] = transitions[sourceKey];
}
}
result[targetKey] = value;
}
return result;
}
class MaskedGeoJsonLayer extends deck.GeoJsonLayer {
static {
MaskedGeoJsonLayer.layerName = 'MaskedGeoJsonLayer';
MaskedGeoJsonLayer.defaultProps = _.cloneDeep(deck.GeoJsonLayer.defaultProps);;
MaskedGeoJsonLayer.defaultProps._subLayerProps = {
"polygons-stroke": {
extensions: [ new deck.MaskExtension() ],
maskByInstance: false,
maskId: "polygons-mask"
},
"polygons-mask": {
operation: 'mask',
}
}
}
_renderMaskLayer() {
const {extruded, wireframe} = this.props;
const {layerProps} = this.state;
const id = 'polygons-mask';
const PolygonMaskLayer =
this.shouldRenderSubLayer(id, layerProps.polygons?.data) &&
this.getSubLayerClass(id, MASK_LAYER_MAPPING.type);
if (PolygonMaskLayer) {
const forwardedProps = forwardProps(this, MASK_LAYER_MAPPING.props);
return new PolygonMaskLayer(
forwardedProps,
this.getSubLayerProps({
id,
updateTriggers: forwardedProps.updateTriggers
}),
layerProps.polygons
);
}
return null;
}
renderLayers() {
debugger;
const {extruded} = this.props;
const polygonFillLayer = this._renderPolygonLayer();
const lineLayers = this._renderLineLayers();
const pointLayers = this._renderPointLayers();
const maskLayer = (lineLayers || pointLayers) ? this._renderMaskLayer() : null;
/*
const nonFillLayers = [lineLayers, pointLayers].filter(a => a).flat();
nonFillLayers.forEach(l => {
if (l.extensions?.length) {
debugger;
}
else {
const extension = new deck.MaskExtension();
extension.initializeState.call(l, l.context, extension);
l.extensions.push(extension);
l.setChangeFlags({ extensionsChanged: true });
l.maskId = 'polygons-mask';
}
});*/
return [
// If not extruded: flat fill layer is drawn below outlines
!extruded && polygonFillLayer,
maskLayer,
lineLayers,
pointLayers,
// If extruded: draw fill layer last for correct blending behavior
extruded && polygonFillLayer
];
}
}
return MaskedGeoJsonLayer;
}