@deck.gl/extensions
Version:
Plug-and-play functionalities for deck.gl layers
64 lines • 2.68 kB
JavaScript
// deck.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import { COORDINATE_SYSTEM, LayerExtension, log } from '@deck.gl/core';
import mask from "./shader-module.js";
import MaskEffect from "./mask-effect.js";
const defaultProps = {
maskId: '',
maskByInstance: undefined,
maskInverted: false
};
/** Allows layers to show/hide objects by a geofence. */
class MaskExtension extends LayerExtension {
initializeState() {
this.context.deck?._addDefaultEffect(new MaskEffect());
}
getShaders() {
// Infer by geometry if 'maskByInstance' prop isn't explictly set
let maskByInstance = 'instancePositions' in this.getAttributeManager().attributes;
// Users can override by setting the `maskByInstance` prop
if (this.props.maskByInstance !== undefined) {
maskByInstance = Boolean(this.props.maskByInstance);
}
this.state.maskByInstance = maskByInstance;
return {
modules: [mask]
};
}
/* eslint-disable camelcase */
draw({ context, shaderModuleProps }) {
const maskProps = {};
maskProps.maskByInstance = Boolean(this.state.maskByInstance);
const { maskId, maskInverted } = this.props;
const { maskChannels } = shaderModuleProps.mask || {};
const { viewport } = context;
if (maskChannels && maskChannels[maskId]) {
const { index, bounds, coordinateOrigin: fromCoordinateOrigin } = maskChannels[maskId];
let { coordinateSystem: fromCoordinateSystem } = maskChannels[maskId];
maskProps.enabled = true;
maskProps.channel = index;
maskProps.inverted = maskInverted;
if (fromCoordinateSystem === COORDINATE_SYSTEM.DEFAULT) {
fromCoordinateSystem = viewport.isGeospatial
? COORDINATE_SYSTEM.LNGLAT
: COORDINATE_SYSTEM.CARTESIAN;
}
const opts = { modelMatrix: null, fromCoordinateOrigin, fromCoordinateSystem };
const bl = this.projectPosition([bounds[0], bounds[1], 0], opts);
const tr = this.projectPosition([bounds[2], bounds[3], 0], opts);
maskProps.bounds = [bl[0], bl[1], tr[0], tr[1]];
}
else {
if (maskId) {
log.warn(`Could not find a mask layer with id: ${maskId}`)();
}
maskProps.enabled = false;
}
this.setShaderModuleProps({ mask: maskProps });
}
}
MaskExtension.defaultProps = defaultProps;
MaskExtension.extensionName = 'MaskExtension';
export default MaskExtension;
//# sourceMappingURL=mask-extension.js.map